@syncular/server 0.0.1-100

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (225) hide show
  1. package/dist/blobs/adapters/database.d.ts +83 -0
  2. package/dist/blobs/adapters/database.d.ts.map +1 -0
  3. package/dist/blobs/adapters/database.js +202 -0
  4. package/dist/blobs/adapters/database.js.map +1 -0
  5. package/dist/blobs/adapters/s3.d.ts +82 -0
  6. package/dist/blobs/adapters/s3.d.ts.map +1 -0
  7. package/dist/blobs/adapters/s3.js +170 -0
  8. package/dist/blobs/adapters/s3.js.map +1 -0
  9. package/dist/blobs/index.d.ts +9 -0
  10. package/dist/blobs/index.d.ts.map +1 -0
  11. package/dist/blobs/index.js +9 -0
  12. package/dist/blobs/index.js.map +1 -0
  13. package/dist/blobs/manager.d.ts +195 -0
  14. package/dist/blobs/manager.d.ts.map +1 -0
  15. package/dist/blobs/manager.js +440 -0
  16. package/dist/blobs/manager.js.map +1 -0
  17. package/dist/blobs/migrate.d.ts +27 -0
  18. package/dist/blobs/migrate.d.ts.map +1 -0
  19. package/dist/blobs/migrate.js +119 -0
  20. package/dist/blobs/migrate.js.map +1 -0
  21. package/dist/blobs/types.d.ts +54 -0
  22. package/dist/blobs/types.d.ts.map +1 -0
  23. package/dist/blobs/types.js +5 -0
  24. package/dist/blobs/types.js.map +1 -0
  25. package/dist/clients.d.ts +14 -0
  26. package/dist/clients.d.ts.map +1 -0
  27. package/dist/clients.js +7 -0
  28. package/dist/clients.js.map +1 -0
  29. package/dist/compaction.d.ts +27 -0
  30. package/dist/compaction.d.ts.map +1 -0
  31. package/dist/compaction.js +49 -0
  32. package/dist/compaction.js.map +1 -0
  33. package/dist/dialect/base.d.ts +83 -0
  34. package/dist/dialect/base.d.ts.map +1 -0
  35. package/dist/dialect/base.js +144 -0
  36. package/dist/dialect/base.js.map +1 -0
  37. package/dist/dialect/helpers.d.ts +10 -0
  38. package/dist/dialect/helpers.d.ts.map +1 -0
  39. package/dist/dialect/helpers.js +59 -0
  40. package/dist/dialect/helpers.js.map +1 -0
  41. package/dist/dialect/index.d.ts +7 -0
  42. package/dist/dialect/index.d.ts.map +1 -0
  43. package/dist/dialect/index.js +7 -0
  44. package/dist/dialect/index.js.map +1 -0
  45. package/dist/dialect/types.d.ts +149 -0
  46. package/dist/dialect/types.d.ts.map +1 -0
  47. package/dist/dialect/types.js +8 -0
  48. package/dist/dialect/types.js.map +1 -0
  49. package/dist/helpers/conflict.d.ts +52 -0
  50. package/dist/helpers/conflict.d.ts.map +1 -0
  51. package/dist/helpers/conflict.js +49 -0
  52. package/dist/helpers/conflict.js.map +1 -0
  53. package/dist/helpers/emitted-change.d.ts +56 -0
  54. package/dist/helpers/emitted-change.d.ts.map +1 -0
  55. package/dist/helpers/emitted-change.js +46 -0
  56. package/dist/helpers/emitted-change.js.map +1 -0
  57. package/dist/helpers/index.d.ts +10 -0
  58. package/dist/helpers/index.d.ts.map +1 -0
  59. package/dist/helpers/index.js +10 -0
  60. package/dist/helpers/index.js.map +1 -0
  61. package/dist/helpers/paginate.d.ts +49 -0
  62. package/dist/helpers/paginate.d.ts.map +1 -0
  63. package/dist/helpers/paginate.js +54 -0
  64. package/dist/helpers/paginate.js.map +1 -0
  65. package/dist/helpers/scope-strings.d.ts +74 -0
  66. package/dist/helpers/scope-strings.d.ts.map +1 -0
  67. package/dist/helpers/scope-strings.js +82 -0
  68. package/dist/helpers/scope-strings.js.map +1 -0
  69. package/dist/index.d.ts +28 -0
  70. package/dist/index.d.ts.map +1 -0
  71. package/dist/index.js +27 -0
  72. package/dist/index.js.map +1 -0
  73. package/dist/migrate.d.ts +14 -0
  74. package/dist/migrate.d.ts.map +1 -0
  75. package/dist/migrate.js +13 -0
  76. package/dist/migrate.js.map +1 -0
  77. package/dist/proxy/handler.d.ts +42 -0
  78. package/dist/proxy/handler.d.ts.map +1 -0
  79. package/dist/proxy/handler.js +102 -0
  80. package/dist/proxy/handler.js.map +1 -0
  81. package/dist/proxy/index.d.ts +9 -0
  82. package/dist/proxy/index.d.ts.map +1 -0
  83. package/dist/proxy/index.js +14 -0
  84. package/dist/proxy/index.js.map +1 -0
  85. package/dist/proxy/mutation-detector.d.ts +35 -0
  86. package/dist/proxy/mutation-detector.d.ts.map +1 -0
  87. package/dist/proxy/mutation-detector.js +246 -0
  88. package/dist/proxy/mutation-detector.js.map +1 -0
  89. package/dist/proxy/oplog.d.ts +30 -0
  90. package/dist/proxy/oplog.d.ts.map +1 -0
  91. package/dist/proxy/oplog.js +110 -0
  92. package/dist/proxy/oplog.js.map +1 -0
  93. package/dist/proxy/registry.d.ts +35 -0
  94. package/dist/proxy/registry.d.ts.map +1 -0
  95. package/dist/proxy/registry.js +49 -0
  96. package/dist/proxy/registry.js.map +1 -0
  97. package/dist/proxy/types.d.ts +44 -0
  98. package/dist/proxy/types.d.ts.map +1 -0
  99. package/dist/proxy/types.js +7 -0
  100. package/dist/proxy/types.js.map +1 -0
  101. package/dist/prune.d.ts +37 -0
  102. package/dist/prune.d.ts.map +1 -0
  103. package/dist/prune.js +112 -0
  104. package/dist/prune.js.map +1 -0
  105. package/dist/pull.d.ts +31 -0
  106. package/dist/pull.d.ts.map +1 -0
  107. package/dist/pull.js +608 -0
  108. package/dist/pull.js.map +1 -0
  109. package/dist/push.d.ts +33 -0
  110. package/dist/push.d.ts.map +1 -0
  111. package/dist/push.js +412 -0
  112. package/dist/push.js.map +1 -0
  113. package/dist/realtime/in-memory.d.ts +13 -0
  114. package/dist/realtime/in-memory.d.ts.map +1 -0
  115. package/dist/realtime/in-memory.js +28 -0
  116. package/dist/realtime/in-memory.js.map +1 -0
  117. package/dist/realtime/index.d.ts +3 -0
  118. package/dist/realtime/index.d.ts.map +1 -0
  119. package/dist/realtime/index.js +2 -0
  120. package/dist/realtime/index.js.map +1 -0
  121. package/dist/realtime/types.d.ts +50 -0
  122. package/dist/realtime/types.d.ts.map +1 -0
  123. package/dist/realtime/types.js +7 -0
  124. package/dist/realtime/types.js.map +1 -0
  125. package/dist/schema.d.ts +164 -0
  126. package/dist/schema.d.ts.map +1 -0
  127. package/dist/schema.js +10 -0
  128. package/dist/schema.js.map +1 -0
  129. package/dist/shapes/create-handler.d.ts +119 -0
  130. package/dist/shapes/create-handler.d.ts.map +1 -0
  131. package/dist/shapes/create-handler.js +327 -0
  132. package/dist/shapes/create-handler.js.map +1 -0
  133. package/dist/shapes/index.d.ts +4 -0
  134. package/dist/shapes/index.d.ts.map +1 -0
  135. package/dist/shapes/index.js +4 -0
  136. package/dist/shapes/index.js.map +1 -0
  137. package/dist/shapes/registry.d.ts +20 -0
  138. package/dist/shapes/registry.d.ts.map +1 -0
  139. package/dist/shapes/registry.js +88 -0
  140. package/dist/shapes/registry.js.map +1 -0
  141. package/dist/shapes/types.d.ts +204 -0
  142. package/dist/shapes/types.d.ts.map +1 -0
  143. package/dist/shapes/types.js +2 -0
  144. package/dist/shapes/types.js.map +1 -0
  145. package/dist/snapshot-chunks/adapters/s3.d.ts +74 -0
  146. package/dist/snapshot-chunks/adapters/s3.d.ts.map +1 -0
  147. package/dist/snapshot-chunks/adapters/s3.js +50 -0
  148. package/dist/snapshot-chunks/adapters/s3.js.map +1 -0
  149. package/dist/snapshot-chunks/db-metadata.d.ts +38 -0
  150. package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -0
  151. package/dist/snapshot-chunks/db-metadata.js +324 -0
  152. package/dist/snapshot-chunks/db-metadata.js.map +1 -0
  153. package/dist/snapshot-chunks/index.d.ts +9 -0
  154. package/dist/snapshot-chunks/index.d.ts.map +1 -0
  155. package/dist/snapshot-chunks/index.js +9 -0
  156. package/dist/snapshot-chunks/index.js.map +1 -0
  157. package/dist/snapshot-chunks/types.d.ts +78 -0
  158. package/dist/snapshot-chunks/types.d.ts.map +1 -0
  159. package/dist/snapshot-chunks/types.js +8 -0
  160. package/dist/snapshot-chunks/types.js.map +1 -0
  161. package/dist/snapshot-chunks.d.ts +60 -0
  162. package/dist/snapshot-chunks.d.ts.map +1 -0
  163. package/dist/snapshot-chunks.js +223 -0
  164. package/dist/snapshot-chunks.js.map +1 -0
  165. package/dist/stats.d.ts +19 -0
  166. package/dist/stats.d.ts.map +1 -0
  167. package/dist/stats.js +57 -0
  168. package/dist/stats.js.map +1 -0
  169. package/dist/subscriptions/index.d.ts +2 -0
  170. package/dist/subscriptions/index.d.ts.map +1 -0
  171. package/dist/subscriptions/index.js +2 -0
  172. package/dist/subscriptions/index.js.map +1 -0
  173. package/dist/subscriptions/resolve.d.ts +35 -0
  174. package/dist/subscriptions/resolve.d.ts.map +1 -0
  175. package/dist/subscriptions/resolve.js +134 -0
  176. package/dist/subscriptions/resolve.js.map +1 -0
  177. package/package.json +80 -0
  178. package/src/blobs/adapters/database.test.ts +67 -0
  179. package/src/blobs/adapters/database.ts +315 -0
  180. package/src/blobs/adapters/s3.ts +271 -0
  181. package/src/blobs/index.ts +9 -0
  182. package/src/blobs/manager.ts +600 -0
  183. package/src/blobs/migrate.ts +150 -0
  184. package/src/blobs/types.ts +70 -0
  185. package/src/clients.ts +21 -0
  186. package/src/compaction.ts +77 -0
  187. package/src/dialect/base.ts +292 -0
  188. package/src/dialect/helpers.ts +61 -0
  189. package/src/dialect/index.ts +7 -0
  190. package/src/dialect/types.ts +197 -0
  191. package/src/helpers/conflict.ts +64 -0
  192. package/src/helpers/emitted-change.ts +69 -0
  193. package/src/helpers/index.ts +10 -0
  194. package/src/helpers/paginate.ts +82 -0
  195. package/src/helpers/scope-strings.ts +101 -0
  196. package/src/index.ts +28 -0
  197. package/src/migrate.ts +20 -0
  198. package/src/proxy/handler.test.ts +120 -0
  199. package/src/proxy/handler.ts +159 -0
  200. package/src/proxy/index.ts +18 -0
  201. package/src/proxy/mutation-detector.test.ts +71 -0
  202. package/src/proxy/mutation-detector.ts +281 -0
  203. package/src/proxy/oplog.ts +146 -0
  204. package/src/proxy/registry.ts +56 -0
  205. package/src/proxy/types.ts +46 -0
  206. package/src/prune.ts +200 -0
  207. package/src/pull.ts +858 -0
  208. package/src/push.ts +583 -0
  209. package/src/realtime/in-memory.ts +33 -0
  210. package/src/realtime/index.ts +5 -0
  211. package/src/realtime/types.ts +55 -0
  212. package/src/schema.ts +172 -0
  213. package/src/shapes/create-handler.ts +590 -0
  214. package/src/shapes/index.ts +3 -0
  215. package/src/shapes/registry.ts +109 -0
  216. package/src/shapes/types.ts +267 -0
  217. package/src/snapshot-chunks/adapters/s3.ts +68 -0
  218. package/src/snapshot-chunks/db-metadata.test.ts +100 -0
  219. package/src/snapshot-chunks/db-metadata.ts +466 -0
  220. package/src/snapshot-chunks/index.ts +9 -0
  221. package/src/snapshot-chunks/types.ts +103 -0
  222. package/src/snapshot-chunks.ts +329 -0
  223. package/src/stats.ts +104 -0
  224. package/src/subscriptions/index.ts +1 -0
  225. package/src/subscriptions/resolve.ts +185 -0
@@ -0,0 +1,164 @@
1
+ /**
2
+ * @syncular/server - database schema types
3
+ *
4
+ * Commit-log based sync tables:
5
+ * - sync_commits: one row per committed push
6
+ * - sync_changes: one row per emitted change, stamped with scopes
7
+ * - sync_table_commits: commit routing index for fast pull
8
+ */
9
+ import type { SyncOp } from '@syncular/core';
10
+ import type { Generated } from 'kysely';
11
+ /**
12
+ * Commit log.
13
+ */
14
+ export interface SyncCommitsTable {
15
+ /** Monotonic commit sequence (server-assigned) */
16
+ commit_seq: Generated<number>;
17
+ /** Logical partition key (tenant / demo / workspace) */
18
+ partition_id: string;
19
+ /** Actor who produced the commit */
20
+ actor_id: string;
21
+ /** Client/device identifier */
22
+ client_id: string;
23
+ /** Client-provided commit idempotency key (unique per client) */
24
+ client_commit_id: string;
25
+ /** Creation timestamp */
26
+ created_at: Generated<string>;
27
+ /** Optional metadata */
28
+ meta: unknown | null;
29
+ /** Cached push response for idempotency */
30
+ result_json: unknown | null;
31
+ /** Number of emitted changes (denormalized for observability) */
32
+ change_count: Generated<number>;
33
+ /**
34
+ * Tables affected by this commit (for realtime notifications).
35
+ * Array of table names that had changes.
36
+ */
37
+ affected_tables: Generated<string[]>;
38
+ }
39
+ /**
40
+ * Change log entries (filtered by scopes on pull).
41
+ */
42
+ export interface SyncChangesTable {
43
+ /** Monotonic change id */
44
+ change_id: Generated<number>;
45
+ /** Logical partition key (tenant / demo / workspace) */
46
+ partition_id: string;
47
+ /** Commit sequence this change belongs to */
48
+ commit_seq: number;
49
+ /** Table name being changed */
50
+ table: string;
51
+ /** Row primary key */
52
+ row_id: string;
53
+ /** Operation: 'upsert' or 'delete' */
54
+ op: SyncOp;
55
+ /** Row data as JSON (null for deletes) */
56
+ row_json: unknown | null;
57
+ /** Optional row version for optimistic concurrency */
58
+ row_version: number | null;
59
+ /**
60
+ * Scope values for routing/filtering (JSONB).
61
+ * Example: { "user_id": "U1", "project_id": "P1" }
62
+ */
63
+ scopes: unknown;
64
+ }
65
+ /**
66
+ * Per-client cursor tracking (for pruning + observability).
67
+ */
68
+ export interface SyncClientCursorsTable {
69
+ /** Logical partition key (tenant / demo / workspace) */
70
+ partition_id: string;
71
+ /** Client/device identifier */
72
+ client_id: string;
73
+ /** Actor currently associated with the client */
74
+ actor_id: string;
75
+ /** Last successfully pulled commit_seq */
76
+ cursor: number;
77
+ /**
78
+ * Effective scope values for the client's last pull (JSONB).
79
+ * This is the intersection of requested scopes and allowed scopes.
80
+ */
81
+ effective_scopes: unknown;
82
+ /** Last update timestamp */
83
+ updated_at: Generated<string>;
84
+ }
85
+ /**
86
+ * Cached bootstrap snapshot chunks (encoded, for large read-only bootstraps).
87
+ */
88
+ export interface SyncSnapshotChunksTable {
89
+ /** Opaque chunk id */
90
+ chunk_id: string;
91
+ /** Logical partition key (tenant / demo / workspace) */
92
+ partition_id: string;
93
+ /** Effective scope key this chunk belongs to */
94
+ scope_key: string;
95
+ /** Scope identifier */
96
+ scope: string;
97
+ /** Snapshot as-of commit sequence */
98
+ as_of_commit_seq: number;
99
+ /** Snapshot row cursor key (empty string represents null) */
100
+ row_cursor: string;
101
+ /** Snapshot row limit used to produce this chunk */
102
+ row_limit: number;
103
+ /** Row encoding (e.g. 'json-row-frame-v1') */
104
+ encoding: string;
105
+ /** Compression algorithm (e.g. 'gzip') */
106
+ compression: string;
107
+ /** Hex-encoded sha256 of content */
108
+ sha256: string;
109
+ /** Byte length of content */
110
+ byte_length: number;
111
+ /** Reference to blob storage (new field for external storage) */
112
+ blob_hash: string;
113
+ /** Encoded chunk bytes (deprecated: use blob storage via blob_hash) */
114
+ body?: Uint8Array | null;
115
+ /** Created timestamp */
116
+ created_at: Generated<string>;
117
+ /** Expiration timestamp (server may delete after this) */
118
+ expires_at: string;
119
+ }
120
+ /**
121
+ * Index table: which commits affect which tables.
122
+ *
123
+ * Used to efficiently find commit_seq values for a table without scanning
124
+ * the (much larger) change log.
125
+ */
126
+ export interface SyncTableCommitsTable {
127
+ /** Logical partition key (tenant / demo / workspace) */
128
+ partition_id: string;
129
+ table: string;
130
+ commit_seq: number;
131
+ }
132
+ /**
133
+ * Database interface for sync infrastructure tables
134
+ * Merge this with your app's database interface
135
+ */
136
+ export interface SyncCoreDb {
137
+ sync_commits: SyncCommitsTable;
138
+ sync_changes: SyncChangesTable;
139
+ sync_client_cursors: SyncClientCursorsTable;
140
+ sync_table_commits: SyncTableCommitsTable;
141
+ sync_snapshot_chunks: SyncSnapshotChunksTable;
142
+ }
143
+ /**
144
+ * Commit metadata row for pull responses
145
+ */
146
+ export interface SyncCommitRow {
147
+ commit_seq: number;
148
+ actor_id: string;
149
+ created_at: string;
150
+ result_json: unknown | null;
151
+ }
152
+ /**
153
+ * Change row for pull responses
154
+ */
155
+ export interface SyncChangeRow {
156
+ commit_seq: number;
157
+ table: string;
158
+ row_id: string;
159
+ op: SyncOp;
160
+ row_json: unknown | null;
161
+ row_version: number | null;
162
+ scopes: unknown;
163
+ }
164
+ //# sourceMappingURL=schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"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"}
package/dist/schema.js ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * @syncular/server - database schema types
3
+ *
4
+ * Commit-log based sync tables:
5
+ * - sync_commits: one row per committed push
6
+ * - sync_changes: one row per emitted change, stamped with scopes
7
+ * - sync_table_commits: commit routing index for fast pull
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @syncular/server - Declarative server handler helper
3
+ */
4
+ import type { ScopeValues, ScopeDefinition as SimpleScopeDefinition, StoredScopes, SyncOperation } from '@syncular/core';
5
+ import type { Selectable, Updateable } from 'kysely';
6
+ import type { SyncCoreDb } from '../schema';
7
+ import type { ServerApplyOperationContext, ServerContext, ServerTableHandler } from './types';
8
+ /**
9
+ * Authorization result from authorize callback.
10
+ */
11
+ type AuthorizeResult = true | {
12
+ error: string;
13
+ code: string;
14
+ retriable?: boolean;
15
+ };
16
+ /**
17
+ * Scope definition for a column - maps scope variable to column name.
18
+ */
19
+ export type ScopeColumnMap = Record<string, string>;
20
+ /**
21
+ * Options for creating a declarative server handler.
22
+ */
23
+ export interface CreateServerHandlerOptions<ServerDB extends SyncCoreDb, ClientDB, TableName extends keyof ServerDB & keyof ClientDB & string> {
24
+ /** Table name in the database */
25
+ table: TableName;
26
+ /**
27
+ * Scope definitions for this table.
28
+ * Can be simple strings (column auto-derived) or objects with explicit mapping.
29
+ *
30
+ * @example
31
+ * ```typescript
32
+ * // Simple: column auto-derived from placeholder
33
+ * scopes: ['user:{user_id}', 'org:{org_id}']
34
+ *
35
+ * // Explicit: when column differs from pattern variable
36
+ * scopes: [
37
+ * { pattern: 'user:{user_id}', column: 'owner_id' }
38
+ * ]
39
+ * ```
40
+ */
41
+ scopes: SimpleScopeDefinition[];
42
+ /** Primary key column name (default: 'id') */
43
+ primaryKey?: string;
44
+ /** Version column name (default: 'server_version') */
45
+ versionColumn?: string;
46
+ /** Tables this handler depends on (for bootstrap ordering) */
47
+ dependsOn?: string[];
48
+ /** TTL for cached snapshot chunks in ms */
49
+ snapshotChunkTtlMs?: number;
50
+ /**
51
+ * Resolve allowed scope values for the current actor.
52
+ * Called per request to determine what the actor can access.
53
+ *
54
+ * @example
55
+ * resolveScopes: async (ctx) => ({
56
+ * user_id: [ctx.actorId],
57
+ * project_id: await getProjectsForUser(ctx.db, ctx.actorId),
58
+ * })
59
+ */
60
+ resolveScopes: (ctx: ServerContext<ServerDB>) => Promise<ScopeValues>;
61
+ /**
62
+ * Transform inbound row from client to server format.
63
+ * Use ctx.schemaVersion to handle older client versions.
64
+ */
65
+ transformInbound?: (row: ClientDB[TableName], ctx: {
66
+ schemaVersion?: number;
67
+ }) => Updateable<ServerDB[TableName]>;
68
+ /**
69
+ * Transform outbound row from server to client format.
70
+ */
71
+ transformOutbound?: (row: Selectable<ServerDB[TableName]>) => ClientDB[TableName];
72
+ /**
73
+ * Authorize an operation before applying.
74
+ * Return true to allow, or an error object to reject.
75
+ */
76
+ authorize?: (ctx: ServerApplyOperationContext<ServerDB>, op: SyncOperation) => Promise<AuthorizeResult>;
77
+ /**
78
+ * Override: Build snapshot query.
79
+ */
80
+ snapshot?: ServerTableHandler<ServerDB>['snapshot'];
81
+ /**
82
+ * Override: Apply operation.
83
+ */
84
+ applyOperation?: ServerTableHandler<ServerDB>['applyOperation'];
85
+ /**
86
+ * Custom scope extraction from row (for complex scope logic).
87
+ */
88
+ extractScopes?: (row: Record<string, unknown>) => StoredScopes;
89
+ }
90
+ /**
91
+ * Create a declarative server table handler with sensible defaults.
92
+ *
93
+ * @example
94
+ * ```typescript
95
+ * import { createServerHandler } from '@syncular/server';
96
+ * import type { ServerDb } from '../db';
97
+ * import type { ClientDb } from '../../shared/client-db.generated';
98
+ *
99
+ * export const tasksHandler = createServerHandler<ServerDb, ClientDb, 'tasks'>({
100
+ * table: 'tasks',
101
+ * scopes: ['user:{user_id}'], // column auto-derived from placeholder
102
+ * resolveScopes: async (ctx) => ({
103
+ * user_id: [ctx.actorId],
104
+ * }),
105
+ * });
106
+ *
107
+ * // With custom column mapping:
108
+ * export const tasksHandler = createServerHandler<ServerDb, ClientDb, 'tasks'>({
109
+ * table: 'tasks',
110
+ * scopes: [{ pattern: 'user:{user_id}', column: 'owner_id' }],
111
+ * resolveScopes: async (ctx) => ({
112
+ * user_id: [ctx.actorId],
113
+ * }),
114
+ * });
115
+ * ```
116
+ */
117
+ export declare function createServerHandler<ServerDB extends SyncCoreDb, ClientDB, TableName extends keyof ServerDB & keyof ClientDB & string>(options: CreateServerHandlerOptions<ServerDB, ClientDB, TableName>): ServerTableHandler<ServerDB>;
118
+ export {};
119
+ //# sourceMappingURL=create-handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-handler.d.ts","sourceRoot":"","sources":["../../src/shapes/create-handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAEV,WAAW,EACX,eAAe,IAAI,qBAAqB,EACxC,YAAY,EACZ,aAAa,EACd,MAAM,gBAAgB,CAAC;AAExB,OAAO,KAAK,EAMV,UAAU,EAEV,UAAU,EAGX,MAAM,QAAQ,CAAC;AAChB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAGV,2BAA2B,EAC3B,aAAa,EAEb,kBAAkB,EACnB,MAAM,SAAS,CAAC;AAEjB;;GAEG;AACH,KAAK,eAAe,GAChB,IAAI,GACJ;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAoBzD;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,0BAA0B,CACzC,QAAQ,SAAS,UAAU,EAC3B,QAAQ,EACR,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,MAAM;IAE1D,iCAAiC;IACjC,KAAK,EAAE,SAAS,CAAC;IAEjB;;;;;;;;;;;;;;OAcG;IACH,MAAM,EAAE,qBAAqB,EAAE,CAAC;IAEhC,8CAA8C;IAC9C,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB,sDAAsD;IACtD,aAAa,CAAC,EAAE,MAAM,CAAC;IAEvB,8DAA8D;IAC9D,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,2CAA2C;IAC3C,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAE5B;;;;;;;;;OASG;IACH,aAAa,EAAE,CAAC,GAAG,EAAE,aAAa,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;IAEtE;;;OAGG;IACH,gBAAgB,CAAC,EAAE,CACjB,GAAG,EAAE,QAAQ,CAAC,SAAS,CAAC,EACxB,GAAG,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,KAC5B,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAErC;;OAEG;IACH,iBAAiB,CAAC,EAAE,CAClB,GAAG,EAAE,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KACjC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAEzB;;;OAGG;IACH,SAAS,CAAC,EAAE,CACV,GAAG,EAAE,2BAA2B,CAAC,QAAQ,CAAC,EAC1C,EAAE,EAAE,aAAa,KACd,OAAO,CAAC,eAAe,CAAC,CAAC;IAE9B;;OAEG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,UAAU,CAAC,CAAC;IAEpD;;OAEG;IACH,cAAc,CAAC,EAAE,kBAAkB,CAAC,QAAQ,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAEhE;;OAEG;IACH,aAAa,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,YAAY,CAAC;CAChE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,SAAS,UAAU,EAC3B,QAAQ,EACR,SAAS,SAAS,MAAM,QAAQ,GAAG,MAAM,QAAQ,GAAG,MAAM,EAE1D,OAAO,EAAE,0BAA0B,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAC,GACjE,kBAAkB,CAAC,QAAQ,CAAC,CA+Y9B"}
@@ -0,0 +1,327 @@
1
+ /**
2
+ * @syncular/server - Declarative server handler helper
3
+ */
4
+ import { extractScopeVars, normalizeScopes } from '@syncular/core';
5
+ function classifyConstraintViolationCode(message) {
6
+ const normalized = message.toLowerCase();
7
+ if (normalized.includes('not null'))
8
+ return 'NOT_NULL_CONSTRAINT';
9
+ if (normalized.includes('unique'))
10
+ return 'UNIQUE_CONSTRAINT';
11
+ if (normalized.includes('foreign key'))
12
+ return 'FOREIGN_KEY_CONSTRAINT';
13
+ return 'CONSTRAINT_VIOLATION';
14
+ }
15
+ function isConstraintViolationError(message) {
16
+ const normalized = message.toLowerCase();
17
+ return (normalized.includes('constraint') ||
18
+ normalized.includes('not null') ||
19
+ normalized.includes('foreign key') ||
20
+ normalized.includes('unique'));
21
+ }
22
+ /**
23
+ * Create a declarative server table handler with sensible defaults.
24
+ *
25
+ * @example
26
+ * ```typescript
27
+ * import { createServerHandler } from '@syncular/server';
28
+ * import type { ServerDb } from '../db';
29
+ * import type { ClientDb } from '../../shared/client-db.generated';
30
+ *
31
+ * export const tasksHandler = createServerHandler<ServerDb, ClientDb, 'tasks'>({
32
+ * table: 'tasks',
33
+ * scopes: ['user:{user_id}'], // column auto-derived from placeholder
34
+ * resolveScopes: async (ctx) => ({
35
+ * user_id: [ctx.actorId],
36
+ * }),
37
+ * });
38
+ *
39
+ * // With custom column mapping:
40
+ * export const tasksHandler = createServerHandler<ServerDb, ClientDb, 'tasks'>({
41
+ * table: 'tasks',
42
+ * scopes: [{ pattern: 'user:{user_id}', column: 'owner_id' }],
43
+ * resolveScopes: async (ctx) => ({
44
+ * user_id: [ctx.actorId],
45
+ * }),
46
+ * });
47
+ * ```
48
+ */
49
+ export function createServerHandler(options) {
50
+ const { table, scopes: scopeDefs, primaryKey = 'id', versionColumn = 'server_version', dependsOn, snapshotChunkTtlMs, resolveScopes, transformInbound, transformOutbound, authorize, extractScopes: customExtractScopes, } = options;
51
+ // Normalize scopes to pattern map and extract patterns/columns
52
+ const scopeColumnMap = normalizeScopes(scopeDefs);
53
+ const scopePatterns = Object.keys(scopeColumnMap);
54
+ const scopeColumns = {};
55
+ for (const [pattern, columnName] of Object.entries(scopeColumnMap)) {
56
+ const vars = extractScopeVars(pattern);
57
+ if (vars.length !== 1) {
58
+ throw new Error(`Scope pattern "${pattern}" must contain exactly one placeholder (got ${vars.length}).`);
59
+ }
60
+ const varName = vars[0];
61
+ const existing = scopeColumns[varName];
62
+ if (existing && existing !== columnName) {
63
+ throw new Error(`Scope variable "${varName}" is mapped to multiple columns: "${existing}" and "${columnName}".`);
64
+ }
65
+ scopeColumns[varName] = columnName;
66
+ }
67
+ // Default extractScopes from scope columns
68
+ const defaultExtractScopes = (row) => {
69
+ const scopes = {};
70
+ for (const [varName, columnName] of Object.entries(scopeColumns)) {
71
+ const raw = row[columnName];
72
+ if (raw === null || raw === undefined)
73
+ continue;
74
+ const value = String(raw);
75
+ if (value.length > 0) {
76
+ scopes[varName] = value;
77
+ }
78
+ }
79
+ return scopes;
80
+ };
81
+ const extractScopesImpl = customExtractScopes ?? defaultExtractScopes;
82
+ // Default snapshot implementation
83
+ const defaultSnapshot = async (ctx, _params) => {
84
+ const trx = ctx.db;
85
+ const { ref } = trx.dynamic;
86
+ const scopeValues = ctx.scopeValues;
87
+ const pageSize = Math.max(1, Math.min(10_000, ctx.limit));
88
+ // Build dynamic WHERE conditions
89
+ const whereConditions = [];
90
+ for (const [varName, columnName] of Object.entries(scopeColumns)) {
91
+ const values = scopeValues[varName];
92
+ if (values === undefined)
93
+ continue;
94
+ const normalized = Array.isArray(values) ? values : [values];
95
+ if (normalized.length === 0)
96
+ continue;
97
+ whereConditions.push({ column: columnName, values: normalized });
98
+ }
99
+ let q = trx.selectFrom(table).selectAll();
100
+ for (const cond of whereConditions) {
101
+ if (cond.values.length === 1) {
102
+ q = q.where(ref(cond.column), '=', cond.values[0]);
103
+ }
104
+ else {
105
+ q = q.where(ref(cond.column), 'in', cond.values);
106
+ }
107
+ }
108
+ if (ctx.cursor !== null) {
109
+ q = q.where(ref(primaryKey), '>', ctx.cursor);
110
+ }
111
+ const rows = await q
112
+ .orderBy(ref(primaryKey), 'asc')
113
+ .limit(pageSize + 1)
114
+ .execute();
115
+ const hasMore = rows.length > pageSize;
116
+ const pageRows = hasMore ? rows.slice(0, pageSize) : rows;
117
+ const lastRow = pageRows[pageRows.length - 1];
118
+ const nextCursor = hasMore
119
+ ? lastRow?.[primaryKey]
120
+ : null;
121
+ // Transform outbound if provided
122
+ const outputRows = transformOutbound
123
+ ? pageRows.map((r) => transformOutbound(r))
124
+ : pageRows;
125
+ return {
126
+ rows: outputRows,
127
+ nextCursor: typeof nextCursor === 'string' && nextCursor.length > 0
128
+ ? nextCursor
129
+ : null,
130
+ };
131
+ };
132
+ // Default applyOperation implementation
133
+ const defaultApplyOperation = async (ctx, op, opIndex) => {
134
+ const trx = ctx.trx;
135
+ const { ref } = trx.dynamic;
136
+ if (op.table !== table) {
137
+ return {
138
+ result: {
139
+ opIndex,
140
+ status: 'error',
141
+ error: `UNKNOWN_TABLE:${op.table}`,
142
+ code: 'UNKNOWN_TABLE',
143
+ retriable: false,
144
+ },
145
+ emittedChanges: [],
146
+ };
147
+ }
148
+ // Run authorization if provided
149
+ if (authorize) {
150
+ const authResult = await authorize(ctx, op);
151
+ if (authResult !== true) {
152
+ return {
153
+ result: {
154
+ opIndex,
155
+ status: 'error',
156
+ error: authResult.error,
157
+ code: authResult.code,
158
+ retriable: authResult.retriable ?? false,
159
+ },
160
+ emittedChanges: [],
161
+ };
162
+ }
163
+ }
164
+ // Handle delete
165
+ if (op.op === 'delete') {
166
+ const existing = await trx.selectFrom(table).selectAll()
167
+ .where(ref(primaryKey), '=', op.row_id)
168
+ .executeTakeFirst();
169
+ if (!existing) {
170
+ return { result: { opIndex, status: 'applied' }, emittedChanges: [] };
171
+ }
172
+ // Extract scopes from existing row for the delete emission
173
+ const scopes = extractScopesImpl(existing);
174
+ await trx.deleteFrom(table)
175
+ .where(ref(primaryKey), '=', op.row_id)
176
+ .execute();
177
+ const emitted = {
178
+ table,
179
+ row_id: op.row_id,
180
+ op: 'delete',
181
+ row_json: null,
182
+ row_version: null,
183
+ scopes,
184
+ };
185
+ return {
186
+ result: { opIndex, status: 'applied' },
187
+ emittedChanges: [emitted],
188
+ };
189
+ }
190
+ // Handle upsert
191
+ const rawPayload = op.payload ?? {};
192
+ const payload = transformInbound
193
+ ? transformInbound(rawPayload, {
194
+ schemaVersion: ctx.schemaVersion,
195
+ })
196
+ : rawPayload;
197
+ // Check for existing row
198
+ const existing = await trx.selectFrom(table).selectAll()
199
+ .where(ref(primaryKey), '=', op.row_id)
200
+ .executeTakeFirst();
201
+ const existingRow = existing;
202
+ const existingVersion = existingRow?.[versionColumn] ?? 0;
203
+ // Check version conflict
204
+ if (existing &&
205
+ op.base_version != null &&
206
+ existingVersion !== op.base_version) {
207
+ return {
208
+ result: {
209
+ opIndex,
210
+ status: 'conflict',
211
+ message: `Version conflict: server=${existingVersion}, base=${op.base_version}`,
212
+ server_version: existingVersion,
213
+ server_row: transformOutbound
214
+ ? transformOutbound(existing)
215
+ : existing,
216
+ },
217
+ emittedChanges: [],
218
+ };
219
+ }
220
+ // If the client provided a base version, they expected this row to exist.
221
+ // A missing row usually indicates stale local state after a server reset.
222
+ if (!existing && op.base_version != null) {
223
+ return {
224
+ result: {
225
+ opIndex,
226
+ status: 'error',
227
+ error: 'ROW_NOT_FOUND_FOR_BASE_VERSION',
228
+ code: 'ROW_MISSING',
229
+ retriable: false,
230
+ },
231
+ emittedChanges: [],
232
+ };
233
+ }
234
+ const nextVersion = existingVersion + 1;
235
+ let updated;
236
+ let constraintError = null;
237
+ try {
238
+ if (existing) {
239
+ // Update - merge payload with existing
240
+ const updateSet = {
241
+ ...payload,
242
+ [versionColumn]: nextVersion,
243
+ };
244
+ // Don't update primary key or scope columns
245
+ delete updateSet[primaryKey];
246
+ for (const col of Object.values(scopeColumns)) {
247
+ delete updateSet[col];
248
+ }
249
+ await trx.updateTable(table)
250
+ .set(updateSet)
251
+ .where(ref(primaryKey), '=', op.row_id)
252
+ .execute();
253
+ }
254
+ else {
255
+ // Insert
256
+ const insertValues = {
257
+ ...payload,
258
+ [primaryKey]: op.row_id,
259
+ [versionColumn]: 1,
260
+ };
261
+ await trx.insertInto(table)
262
+ .values(insertValues)
263
+ .execute();
264
+ }
265
+ // Read back the updated row
266
+ updated = await trx.selectFrom(table).selectAll()
267
+ .where(ref(primaryKey), '=', op.row_id)
268
+ .executeTakeFirstOrThrow();
269
+ }
270
+ catch (err) {
271
+ const message = err instanceof Error ? err.message : String(err);
272
+ if (!isConstraintViolationError(message)) {
273
+ throw err;
274
+ }
275
+ constraintError = {
276
+ message,
277
+ code: classifyConstraintViolationCode(message),
278
+ };
279
+ }
280
+ if (constraintError) {
281
+ return {
282
+ result: {
283
+ opIndex,
284
+ status: 'error',
285
+ error: constraintError.message,
286
+ code: constraintError.code,
287
+ retriable: false,
288
+ },
289
+ emittedChanges: [],
290
+ };
291
+ }
292
+ if (!updated) {
293
+ throw new Error('Updated row is missing after applyOperation');
294
+ }
295
+ const updatedRow = updated;
296
+ const rowVersion = updatedRow[versionColumn] ?? 1;
297
+ // Extract scopes from updated row
298
+ const scopes = extractScopesImpl(updatedRow);
299
+ // Transform outbound for emitted change
300
+ const rowJson = transformOutbound
301
+ ? transformOutbound(updated)
302
+ : updated;
303
+ const emitted = {
304
+ table,
305
+ row_id: op.row_id,
306
+ op: 'upsert',
307
+ row_json: rowJson,
308
+ row_version: rowVersion,
309
+ scopes,
310
+ };
311
+ return {
312
+ result: { opIndex, status: 'applied' },
313
+ emittedChanges: [emitted],
314
+ };
315
+ };
316
+ return {
317
+ table,
318
+ scopePatterns,
319
+ dependsOn,
320
+ snapshotChunkTtlMs,
321
+ resolveScopes,
322
+ extractScopes: extractScopesImpl,
323
+ snapshot: options.snapshot ?? defaultSnapshot,
324
+ applyOperation: options.applyOperation ?? defaultApplyOperation,
325
+ };
326
+ }
327
+ //# sourceMappingURL=create-handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-handler.js","sourceRoot":"","sources":["../../src/shapes/create-handler.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export * from './create-handler';
2
+ export * from './registry';
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
@@ -0,0 +1,4 @@
1
+ export * from './create-handler.js';
2
+ export * from './registry.js';
3
+ export * from './types.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/shapes/index.ts"],"names":[],"mappings":"AAAA,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}