diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-31 16:20:40 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-31 16:20:40 +0900 |
| commit | 26b6408c84bfcc46f3d470292688e4ffaf0265f2 (patch) | |
| tree | 52160cdfab669ec0a20886e9f5bd9151f3eeebd3 /src/server/routes/sync.ts | |
| parent | e4aeded6c105de6c8af6a931d5c24a659dcbd138 (diff) | |
| download | kioku-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.ts | 21 |
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({ |
