aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/routes/sync.ts
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2025-12-31 16:20:40 +0900
committernsfisis <nsfisis@gmail.com>2025-12-31 16:20:40 +0900
commit26b6408c84bfcc46f3d470292688e4ffaf0265f2 (patch)
tree52160cdfab669ec0a20886e9f5bd9151f3eeebd3 /src/server/routes/sync.ts
parente4aeded6c105de6c8af6a931d5c24a659dcbd138 (diff)
downloadkioku-26b6408c84bfcc46f3d470292688e4ffaf0265f2.tar.gz
kioku-26b6408c84bfcc46f3d470292688e4ffaf0265f2.tar.zst
kioku-26b6408c84bfcc46f3d470292688e4ffaf0265f2.zip
feat(crdt): add server-side CRDT sync API handling
Add crdtChanges field to sync push/pull endpoints for CRDT document synchronization. The server now stores and retrieves CRDT binaries from the crdt_documents table, enabling conflict-free sync between clients. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/server/routes/sync.ts')
-rw-r--r--src/server/routes/sync.ts21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/server/routes/sync.ts b/src/server/routes/sync.ts
index fca099b..c571f8a 100644
--- a/src/server/routes/sync.ts
+++ b/src/server/routes/sync.ts
@@ -1,6 +1,7 @@
import { zValidator } from "@hono/zod-validator";
import { Hono } from "hono";
import { z } from "zod";
+import { CrdtEntityType } from "../db/schema-crdt.js";
import { authMiddleware, getAuthUser } from "../middleware/index.js";
import {
type SyncPullQuery,
@@ -95,6 +96,25 @@ const syncNoteFieldValueSchema = z.object({
updatedAt: z.string().datetime(),
});
+/**
+ * Schema for CRDT sync payload
+ * Used for conflict-free synchronization of entity data
+ */
+const crdtSyncPayloadSchema = z.object({
+ documentId: z.string().min(1),
+ entityType: z.enum([
+ CrdtEntityType.Deck,
+ CrdtEntityType.NoteType,
+ CrdtEntityType.NoteFieldType,
+ CrdtEntityType.Note,
+ CrdtEntityType.NoteFieldValue,
+ CrdtEntityType.Card,
+ CrdtEntityType.ReviewLog,
+ ]),
+ entityId: z.uuid(),
+ binary: z.string().min(1), // Base64-encoded Automerge binary
+});
+
const syncPushSchema = z.object({
decks: z.array(syncDeckSchema).default([]),
cards: z.array(syncCardSchema).default([]),
@@ -103,6 +123,7 @@ const syncPushSchema = z.object({
noteFieldTypes: z.array(syncNoteFieldTypeSchema).default([]),
notes: z.array(syncNoteSchema).default([]),
noteFieldValues: z.array(syncNoteFieldValueSchema).default([]),
+ crdtChanges: z.array(crdtSyncPayloadSchema).default([]),
});
const syncPullQuerySchema = z.object({