@syncular/core 0.1.2 → 0.2.0

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 (231) hide show
  1. package/README.md +5 -19
  2. package/dist/blob-ref.d.ts +21 -0
  3. package/dist/blob-ref.js +97 -0
  4. package/dist/bytes.d.ts +45 -0
  5. package/dist/bytes.js +242 -0
  6. package/dist/canonical-json.d.ts +10 -0
  7. package/dist/canonical-json.js +18 -0
  8. package/dist/constants.d.ts +5 -0
  9. package/dist/constants.js +5 -0
  10. package/dist/crypto.d.ts +60 -0
  11. package/dist/crypto.js +251 -0
  12. package/dist/errors.d.ts +14 -0
  13. package/dist/errors.js +17 -0
  14. package/dist/frames.d.ts +24 -0
  15. package/dist/frames.js +42 -0
  16. package/dist/index.d.ts +18 -26
  17. package/dist/index.js +18 -43
  18. package/dist/message.d.ts +157 -0
  19. package/dist/message.js +786 -0
  20. package/dist/realtime.d.ts +92 -0
  21. package/dist/realtime.js +222 -0
  22. package/dist/render.d.ts +22 -0
  23. package/dist/render.js +273 -0
  24. package/dist/row-codec.d.ts +39 -0
  25. package/dist/row-codec.js +176 -0
  26. package/dist/segment.d.ts +18 -0
  27. package/dist/segment.js +105 -0
  28. package/dist/stream.d.ts +20 -0
  29. package/dist/stream.js +102 -0
  30. package/package.json +7 -59
  31. package/src/blob-ref.ts +135 -0
  32. package/src/bytes.ts +301 -0
  33. package/src/canonical-json.ts +20 -0
  34. package/src/constants.ts +7 -0
  35. package/src/crypto.ts +335 -0
  36. package/src/errors.ts +18 -0
  37. package/src/frames.ts +47 -0
  38. package/src/index.ts +18 -43
  39. package/src/message.ts +1024 -0
  40. package/src/realtime.ts +340 -0
  41. package/src/render.ts +325 -0
  42. package/src/row-codec.ts +265 -0
  43. package/src/segment.ts +150 -0
  44. package/src/stream.ts +128 -0
  45. package/dist/blobs.d.ts +0 -153
  46. package/dist/blobs.d.ts.map +0 -1
  47. package/dist/blobs.js +0 -47
  48. package/dist/blobs.js.map +0 -1
  49. package/dist/column-codecs.d.ts +0 -59
  50. package/dist/column-codecs.d.ts.map +0 -1
  51. package/dist/column-codecs.js +0 -159
  52. package/dist/column-codecs.js.map +0 -1
  53. package/dist/conflict.d.ts +0 -22
  54. package/dist/conflict.d.ts.map +0 -1
  55. package/dist/conflict.js +0 -81
  56. package/dist/conflict.js.map +0 -1
  57. package/dist/database.d.ts +0 -7
  58. package/dist/database.d.ts.map +0 -1
  59. package/dist/database.js +0 -14
  60. package/dist/database.js.map +0 -1
  61. package/dist/dialect.d.ts +0 -7
  62. package/dist/dialect.d.ts.map +0 -1
  63. package/dist/dialect.js +0 -2
  64. package/dist/dialect.js.map +0 -1
  65. package/dist/error-responses.d.ts +0 -393
  66. package/dist/error-responses.d.ts.map +0 -1
  67. package/dist/error-responses.js +0 -393
  68. package/dist/error-responses.js.map +0 -1
  69. package/dist/http/api-client.d.ts +0 -11
  70. package/dist/http/api-client.d.ts.map +0 -1
  71. package/dist/http/api-client.js +0 -30
  72. package/dist/http/api-client.js.map +0 -1
  73. package/dist/http/blob.d.ts +0 -6
  74. package/dist/http/blob.d.ts.map +0 -1
  75. package/dist/http/blob.js +0 -46
  76. package/dist/http/blob.js.map +0 -1
  77. package/dist/http/generated/api.d.ts +0 -5241
  78. package/dist/http/generated/api.d.ts.map +0 -1
  79. package/dist/http/generated/api.js +0 -6
  80. package/dist/http/generated/api.js.map +0 -1
  81. package/dist/http/index.d.ts +0 -18
  82. package/dist/http/index.d.ts.map +0 -1
  83. package/dist/http/index.js +0 -212
  84. package/dist/http/index.js.map +0 -1
  85. package/dist/http/shared.d.ts +0 -45
  86. package/dist/http/shared.d.ts.map +0 -1
  87. package/dist/http/shared.js +0 -122
  88. package/dist/http/shared.js.map +0 -1
  89. package/dist/http/transport-client.d.ts +0 -31
  90. package/dist/http/transport-client.d.ts.map +0 -1
  91. package/dist/http/transport-client.js +0 -193
  92. package/dist/http/transport-client.js.map +0 -1
  93. package/dist/index.d.ts.map +0 -1
  94. package/dist/index.js.map +0 -1
  95. package/dist/kysely-column-codecs.d.ts +0 -31
  96. package/dist/kysely-column-codecs.d.ts.map +0 -1
  97. package/dist/kysely-column-codecs.js +0 -452
  98. package/dist/kysely-column-codecs.js.map +0 -1
  99. package/dist/logger.d.ts +0 -29
  100. package/dist/logger.d.ts.map +0 -1
  101. package/dist/logger.js +0 -26
  102. package/dist/logger.js.map +0 -1
  103. package/dist/proxy/index.d.ts +0 -54
  104. package/dist/proxy/index.d.ts.map +0 -1
  105. package/dist/proxy/index.js +0 -7
  106. package/dist/proxy/index.js.map +0 -1
  107. package/dist/schemas/blobs.d.ts +0 -82
  108. package/dist/schemas/blobs.d.ts.map +0 -1
  109. package/dist/schemas/blobs.js +0 -64
  110. package/dist/schemas/blobs.js.map +0 -1
  111. package/dist/schemas/common.d.ts +0 -100
  112. package/dist/schemas/common.d.ts.map +0 -1
  113. package/dist/schemas/common.js +0 -64
  114. package/dist/schemas/common.js.map +0 -1
  115. package/dist/schemas/index.d.ts +0 -7
  116. package/dist/schemas/index.d.ts.map +0 -1
  117. package/dist/schemas/index.js +0 -7
  118. package/dist/schemas/index.js.map +0 -1
  119. package/dist/schemas/sync.d.ts +0 -1065
  120. package/dist/schemas/sync.d.ts.map +0 -1
  121. package/dist/schemas/sync.js +0 -361
  122. package/dist/schemas/sync.js.map +0 -1
  123. package/dist/scopes/index.d.ts +0 -113
  124. package/dist/scopes/index.d.ts.map +0 -1
  125. package/dist/scopes/index.js +0 -103
  126. package/dist/scopes/index.js.map +0 -1
  127. package/dist/sentry.d.ts +0 -31
  128. package/dist/sentry.d.ts.map +0 -1
  129. package/dist/sentry.js +0 -147
  130. package/dist/sentry.js.map +0 -1
  131. package/dist/snapshot-chunks.d.ts +0 -110
  132. package/dist/snapshot-chunks.d.ts.map +0 -1
  133. package/dist/snapshot-chunks.js +0 -682
  134. package/dist/snapshot-chunks.js.map +0 -1
  135. package/dist/sync-packs.d.ts +0 -33
  136. package/dist/sync-packs.d.ts.map +0 -1
  137. package/dist/sync-packs.js +0 -821
  138. package/dist/sync-packs.js.map +0 -1
  139. package/dist/telemetry.d.ts +0 -114
  140. package/dist/telemetry.d.ts.map +0 -1
  141. package/dist/telemetry.js +0 -114
  142. package/dist/telemetry.js.map +0 -1
  143. package/dist/transforms.d.ts +0 -146
  144. package/dist/transforms.d.ts.map +0 -1
  145. package/dist/transforms.js +0 -155
  146. package/dist/transforms.js.map +0 -1
  147. package/dist/types.d.ts +0 -210
  148. package/dist/types.d.ts.map +0 -1
  149. package/dist/types.js +0 -20
  150. package/dist/types.js.map +0 -1
  151. package/dist/utils/bytes.d.ts +0 -4
  152. package/dist/utils/bytes.d.ts.map +0 -1
  153. package/dist/utils/bytes.js +0 -66
  154. package/dist/utils/bytes.js.map +0 -1
  155. package/dist/utils/compression.d.ts +0 -22
  156. package/dist/utils/compression.d.ts.map +0 -1
  157. package/dist/utils/compression.js +0 -129
  158. package/dist/utils/compression.js.map +0 -1
  159. package/dist/utils/crypto.d.ts +0 -13
  160. package/dist/utils/crypto.d.ts.map +0 -1
  161. package/dist/utils/crypto.js +0 -107
  162. package/dist/utils/crypto.js.map +0 -1
  163. package/dist/utils/id.d.ts +0 -3
  164. package/dist/utils/id.d.ts.map +0 -1
  165. package/dist/utils/id.js +0 -25
  166. package/dist/utils/id.js.map +0 -1
  167. package/dist/utils/index.d.ts +0 -10
  168. package/dist/utils/index.d.ts.map +0 -1
  169. package/dist/utils/index.js +0 -10
  170. package/dist/utils/index.js.map +0 -1
  171. package/dist/utils/internal-runtime.d.ts +0 -16
  172. package/dist/utils/internal-runtime.d.ts.map +0 -1
  173. package/dist/utils/internal-runtime.js +0 -14
  174. package/dist/utils/internal-runtime.js.map +0 -1
  175. package/dist/utils/object.d.ts +0 -2
  176. package/dist/utils/object.d.ts.map +0 -1
  177. package/dist/utils/object.js +0 -4
  178. package/dist/utils/object.js.map +0 -1
  179. package/dist/utils/realtime-change-index.d.ts +0 -9
  180. package/dist/utils/realtime-change-index.d.ts.map +0 -1
  181. package/dist/utils/realtime-change-index.js +0 -36
  182. package/dist/utils/realtime-change-index.js.map +0 -1
  183. package/dist/utils/realtime-connection-registry.d.ts +0 -40
  184. package/dist/utils/realtime-connection-registry.d.ts.map +0 -1
  185. package/dist/utils/realtime-connection-registry.js +0 -237
  186. package/dist/utils/realtime-connection-registry.js.map +0 -1
  187. package/dist/utils/table-registry.d.ts +0 -10
  188. package/dist/utils/table-registry.d.ts.map +0 -1
  189. package/dist/utils/table-registry.js +0 -54
  190. package/dist/utils/table-registry.js.map +0 -1
  191. package/dist/utils/url.d.ts +0 -3
  192. package/dist/utils/url.d.ts.map +0 -1
  193. package/dist/utils/url.js +0 -20
  194. package/dist/utils/url.js.map +0 -1
  195. package/src/blobs.ts +0 -219
  196. package/src/column-codecs.ts +0 -262
  197. package/src/conflict.ts +0 -92
  198. package/src/database.ts +0 -21
  199. package/src/dialect.ts +0 -8
  200. package/src/error-responses.ts +0 -423
  201. package/src/http/api-client.ts +0 -39
  202. package/src/http/blob.ts +0 -95
  203. package/src/http/generated/api.ts +0 -5241
  204. package/src/http/index.ts +0 -365
  205. package/src/http/shared.ts +0 -220
  206. package/src/http/transport-client.ts +0 -314
  207. package/src/kysely-column-codecs.ts +0 -585
  208. package/src/logger.ts +0 -38
  209. package/src/proxy/index.ts +0 -57
  210. package/src/schemas/blobs.ts +0 -110
  211. package/src/schemas/common.ts +0 -89
  212. package/src/schemas/index.ts +0 -7
  213. package/src/schemas/sync.ts +0 -517
  214. package/src/scopes/index.ts +0 -237
  215. package/src/sentry.ts +0 -200
  216. package/src/snapshot-chunks.ts +0 -964
  217. package/src/sync-packs.ts +0 -1096
  218. package/src/telemetry.ts +0 -243
  219. package/src/transforms.ts +0 -256
  220. package/src/types.ts +0 -267
  221. package/src/utils/bytes.ts +0 -75
  222. package/src/utils/compression.ts +0 -187
  223. package/src/utils/crypto.ts +0 -146
  224. package/src/utils/id.ts +0 -34
  225. package/src/utils/index.ts +0 -9
  226. package/src/utils/internal-runtime.ts +0 -39
  227. package/src/utils/object.ts +0 -3
  228. package/src/utils/realtime-change-index.ts +0 -44
  229. package/src/utils/realtime-connection-registry.ts +0 -286
  230. package/src/utils/table-registry.ts +0 -67
  231. package/src/utils/url.ts +0 -29
@@ -1,517 +0,0 @@
1
- /**
2
- * @syncular/core - Sync protocol Zod schemas
3
- *
4
- * These schemas define the sync protocol types and can be used for:
5
- * - Runtime validation
6
- * - OpenAPI spec generation
7
- * - Type inference
8
- */
9
-
10
- import { z } from 'zod';
11
- import {
12
- SYNC_SCOPED_SNAPSHOT_ARTIFACT_KIND_SQLITE_V1,
13
- SYNC_SCOPED_SNAPSHOT_ARTIFACT_MANIFEST_VERSION,
14
- SYNC_SNAPSHOT_ARTIFACT_COMPRESSION_NONE,
15
- SYNC_SNAPSHOT_CHUNK_COMPRESSION,
16
- SYNC_SNAPSHOT_CHUNK_ENCODINGS,
17
- } from '../snapshot-chunks';
18
-
19
- // ============================================================================
20
- // Operation Types
21
- // ============================================================================
22
-
23
- export const SyncOpSchema = z.enum(['upsert', 'delete']);
24
- export type SyncOp = z.infer<typeof SyncOpSchema>;
25
-
26
- // ============================================================================
27
- // Scope Schemas
28
- // ============================================================================
29
-
30
- /**
31
- * Stored scopes on a change (single values only)
32
- */
33
- const StoredScopesSchema = z.record(z.string(), z.string());
34
-
35
- /**
36
- * Scope values in a subscription request (can be arrays)
37
- */
38
- export const ScopeValuesSchema = z.record(
39
- z.string(),
40
- z.union([z.string(), z.array(z.string())])
41
- );
42
-
43
- // ============================================================================
44
- // Auth Lease Schemas
45
- // ============================================================================
46
-
47
- export const SYNC_AUTH_LEASE_VERSION = 1;
48
- export const SYNC_AUTH_LEASE_PROTOCOL_VERSION = 1;
49
- export const SYNC_AUTH_LEASE_ALG_ES256 = 'ES256';
50
- export const SYNC_AUTH_LEASE_TYP = 'syncular-auth-lease+jws';
51
- export const SYNC_AUTH_LEASE_CODE_MISSING = 'sync.auth_lease_missing';
52
- export const SYNC_AUTH_LEASE_CODE_INVALID = 'sync.auth_lease_invalid';
53
- export const SYNC_AUTH_LEASE_CODE_EXPIRED = 'sync.auth_lease_expired';
54
- export const SYNC_AUTH_LEASE_CODE_SCHEMA_MISMATCH =
55
- 'sync.auth_lease_schema_mismatch';
56
- export const SYNC_AUTH_LEASE_CODE_SCOPE_MISMATCH =
57
- 'sync.auth_lease_scope_mismatch';
58
- export const SYNC_AUTH_LEASE_CODE_SCOPE_REVOKED =
59
- 'sync.auth_lease_scope_revoked';
60
- export const SYNC_AUTH_LEASE_CODE_BUSINESS_REJECTED =
61
- 'sync.auth_lease_business_rejected';
62
-
63
- export const SyncAuthLeaseProtectedHeaderSchema = z.object({
64
- alg: z.literal(SYNC_AUTH_LEASE_ALG_ES256),
65
- kid: z.string().min(1),
66
- typ: z.literal(SYNC_AUTH_LEASE_TYP),
67
- });
68
-
69
- export type SyncAuthLeaseProtectedHeader = z.infer<
70
- typeof SyncAuthLeaseProtectedHeaderSchema
71
- >;
72
-
73
- export const SyncAuthLeaseCapabilitiesSchema = z.object({
74
- allowBlobs: z.boolean(),
75
- allowCrdt: z.boolean(),
76
- allowEncryptedFields: z.boolean(),
77
- });
78
-
79
- export type SyncAuthLeaseCapabilities = z.infer<
80
- typeof SyncAuthLeaseCapabilitiesSchema
81
- >;
82
-
83
- export const SyncAuthLeaseScopeSchema = z.object({
84
- subscriptionId: z.string().min(1),
85
- table: z.string().min(1),
86
- values: ScopeValuesSchema,
87
- operations: z.array(SyncOpSchema).min(1),
88
- });
89
-
90
- export type SyncAuthLeaseScope = z.infer<typeof SyncAuthLeaseScopeSchema>;
91
-
92
- export const SyncAuthLeasePayloadSchema = z.object({
93
- version: z.literal(SYNC_AUTH_LEASE_VERSION),
94
- leaseId: z.string().min(1),
95
- issuer: z.string().min(1),
96
- audience: z.string().min(1),
97
- actorId: z.string().min(1),
98
- subject: z.record(z.string(), z.unknown()).default({}),
99
- schemaVersion: z.number().int().min(1),
100
- protocolVersion: z.literal(SYNC_AUTH_LEASE_PROTOCOL_VERSION),
101
- issuedAtMs: z.number().int(),
102
- notBeforeMs: z.number().int(),
103
- expiresAtMs: z.number().int(),
104
- maxClockSkewMs: z.number().int().min(0),
105
- scopes: z.array(SyncAuthLeaseScopeSchema).min(1),
106
- capabilities: SyncAuthLeaseCapabilitiesSchema,
107
- });
108
-
109
- export type SyncAuthLeasePayload = z.infer<typeof SyncAuthLeasePayloadSchema>;
110
-
111
- export const SyncAuthLeaseIssueRequestSchema = z.object({
112
- schemaVersion: z.number().int().min(1),
113
- ttlMs: z.number().int().positive().optional(),
114
- scopes: z.array(SyncAuthLeaseScopeSchema).min(1),
115
- });
116
-
117
- export type SyncAuthLeaseIssueRequest = z.infer<
118
- typeof SyncAuthLeaseIssueRequestSchema
119
- >;
120
-
121
- export const SyncAuthLeaseIssueResponseSchema = z.object({
122
- ok: z.literal(true),
123
- token: z.string().min(1),
124
- protectedHeader: SyncAuthLeaseProtectedHeaderSchema,
125
- payload: SyncAuthLeasePayloadSchema,
126
- });
127
-
128
- export type SyncAuthLeaseIssueResponse = z.infer<
129
- typeof SyncAuthLeaseIssueResponseSchema
130
- >;
131
-
132
- // ============================================================================
133
- // Sync Operation Schema
134
- // ============================================================================
135
-
136
- export const SyncOperationSchema = z.object({
137
- table: z.string(),
138
- row_id: z.string(),
139
- op: SyncOpSchema,
140
- payload: z.record(z.string(), z.unknown()).nullable(),
141
- base_version: z.number().int().nullable().optional(),
142
- });
143
-
144
- export type SyncOperation = z.infer<typeof SyncOperationSchema>;
145
-
146
- // ============================================================================
147
- // Push Request/Response Schemas
148
- // ============================================================================
149
-
150
- export const SyncAuthLeaseProvenanceSchema = z.object({
151
- leaseId: z.string().min(1),
152
- leaseExpiresAtMs: z.number().int(),
153
- leaseStatusAtEnqueue: z.string().min(1),
154
- leaseScopeSummaryJson: z.string().optional(),
155
- leaseToken: z.string().min(1).optional(),
156
- });
157
-
158
- export type SyncAuthLeaseProvenance = z.infer<
159
- typeof SyncAuthLeaseProvenanceSchema
160
- >;
161
-
162
- export const SyncPushRequestSchema = z.object({
163
- clientId: z.string().min(1),
164
- clientCommitId: z.string().min(1),
165
- operations: z.array(SyncOperationSchema).min(1),
166
- schemaVersion: z.number().int().min(1),
167
- authLease: SyncAuthLeaseProvenanceSchema.optional(),
168
- });
169
-
170
- export type SyncPushRequest = z.infer<typeof SyncPushRequestSchema>;
171
-
172
- export const SyncPushCommitRequestSchema = SyncPushRequestSchema.omit({
173
- clientId: true,
174
- });
175
-
176
- export type SyncPushCommitRequest = z.infer<typeof SyncPushCommitRequestSchema>;
177
-
178
- const SyncOperationResultAppliedSchema = z.object({
179
- opIndex: z.number().int(),
180
- status: z.literal('applied'),
181
- });
182
-
183
- const SyncOperationResultConflictSchema = z.object({
184
- opIndex: z.number().int(),
185
- status: z.literal('conflict'),
186
- message: z.string(),
187
- code: z.string().optional(),
188
- server_version: z.number().int(),
189
- server_row: z.unknown(),
190
- });
191
-
192
- const SyncOperationResultErrorSchema = z.object({
193
- opIndex: z.number().int(),
194
- status: z.literal('error'),
195
- error: z.string(),
196
- code: z.string().optional(),
197
- retriable: z.boolean().optional(),
198
- });
199
-
200
- export const SyncOperationResultSchema = z.union([
201
- SyncOperationResultAppliedSchema,
202
- SyncOperationResultConflictSchema,
203
- SyncOperationResultErrorSchema,
204
- ]);
205
-
206
- export type SyncOperationResult = z.infer<typeof SyncOperationResultSchema>;
207
-
208
- export const SyncPushResponseSchema = z.object({
209
- ok: z.literal(true),
210
- status: z.enum(['applied', 'cached', 'rejected']),
211
- commitSeq: z.number().int().optional(),
212
- results: z.array(SyncOperationResultSchema),
213
- });
214
-
215
- export type SyncPushResponse = z.infer<typeof SyncPushResponseSchema>;
216
-
217
- export const SyncPushBatchCommitResponseSchema = SyncPushResponseSchema.extend({
218
- clientCommitId: z.string().min(1),
219
- });
220
-
221
- export type SyncPushBatchCommitResponse = z.infer<
222
- typeof SyncPushBatchCommitResponseSchema
223
- >;
224
-
225
- export const SyncPushBatchRequestSchema = z.object({
226
- clientId: z.string().min(1),
227
- commits: z.array(SyncPushCommitRequestSchema).min(1),
228
- });
229
-
230
- export type SyncPushBatchRequest = z.infer<typeof SyncPushBatchRequestSchema>;
231
-
232
- export const SyncPushBatchResponseSchema = z.object({
233
- ok: z.literal(true),
234
- commits: z.array(SyncPushBatchCommitResponseSchema),
235
- });
236
-
237
- export type SyncPushBatchResponse = z.infer<typeof SyncPushBatchResponseSchema>;
238
-
239
- // ============================================================================
240
- // Bootstrap State Schema
241
- // ============================================================================
242
-
243
- export const SyncBootstrapStateSchema = z.object({
244
- asOfCommitSeq: z.number().int(),
245
- tables: z.array(z.string()),
246
- tableIndex: z.number().int(),
247
- rowCursor: z.string().nullable(),
248
- });
249
-
250
- export type SyncBootstrapState = z.infer<typeof SyncBootstrapStateSchema>;
251
-
252
- // ============================================================================
253
- // Pull Request/Response Schemas
254
- // ============================================================================
255
-
256
- export const SyncCrdtStateVectorHintSchema = z.object({
257
- rowId: z.string().min(1),
258
- field: z.string().min(1),
259
- stateColumn: z.string().min(1),
260
- stateVectorBase64: z.string().min(1),
261
- syncMode: z.string().min(1),
262
- updatedAt: z.number().int(),
263
- });
264
-
265
- export type SyncCrdtStateVectorHint = z.infer<
266
- typeof SyncCrdtStateVectorHintSchema
267
- >;
268
-
269
- export const SyncSubscriptionRequestSchema = z.object({
270
- id: z.string().min(1),
271
- table: z.string().min(1),
272
- scopes: ScopeValuesSchema,
273
- params: z.record(z.string(), z.unknown()).optional(),
274
- cursor: z.number().int(),
275
- bootstrapState: SyncBootstrapStateSchema.nullable().optional(),
276
- verifiedRoot: z.string().optional(),
277
- crdtStateVectors: z
278
- .array(SyncCrdtStateVectorHintSchema)
279
- .optional()
280
- .default([]),
281
- });
282
-
283
- export type SyncSubscriptionRequest = z.infer<
284
- typeof SyncSubscriptionRequestSchema
285
- >;
286
-
287
- export const SyncSnapshotChunkEncodingSchema = z.enum(
288
- SYNC_SNAPSHOT_CHUNK_ENCODINGS
289
- );
290
- export const SyncScopedSnapshotArtifactKindSchema = z.literal(
291
- SYNC_SCOPED_SNAPSHOT_ARTIFACT_KIND_SQLITE_V1
292
- );
293
- export const SyncSnapshotArtifactCompressionSchema = z.union([
294
- z.literal(SYNC_SNAPSHOT_ARTIFACT_COMPRESSION_NONE),
295
- z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
296
- ]);
297
-
298
- export const SyncSnapshotArtifactsRequestSchema = z.object({
299
- artifactKinds: z.array(SyncScopedSnapshotArtifactKindSchema).min(1),
300
- compressions: z.array(SyncSnapshotArtifactCompressionSchema).optional(),
301
- featureSet: z.array(z.string()).optional(),
302
- });
303
-
304
- export type SyncSnapshotArtifactsRequest = z.infer<
305
- typeof SyncSnapshotArtifactsRequestSchema
306
- >;
307
-
308
- export const SyncPullRequestSchema = z.object({
309
- clientId: z.string().min(1),
310
- schemaVersion: z.number().int().min(1),
311
- limitCommits: z.number().int().min(1),
312
- limitSnapshotRows: z.number().int().min(1).optional(),
313
- maxSnapshotPages: z.number().int().min(1).optional(),
314
- dedupeRows: z.boolean().optional(),
315
- snapshotArtifacts: SyncSnapshotArtifactsRequestSchema.optional(),
316
- subscriptions: z.array(SyncSubscriptionRequestSchema),
317
- });
318
-
319
- export type SyncPullRequest = z.infer<typeof SyncPullRequestSchema>;
320
-
321
- export const SyncChangeSchema = z.object({
322
- table: z.string(),
323
- row_id: z.string(),
324
- op: SyncOpSchema,
325
- row_json: z.unknown().nullable(),
326
- row_version: z.number().int().nullable(),
327
- scopes: StoredScopesSchema,
328
- });
329
-
330
- export type SyncChange = z.infer<typeof SyncChangeSchema>;
331
-
332
- export const SyncCommitSchema = z.object({
333
- commitSeq: z.number().int(),
334
- createdAt: z.string(),
335
- actorId: z.string(),
336
- changes: z.array(SyncChangeSchema),
337
- });
338
-
339
- export type SyncCommit = z.infer<typeof SyncCommitSchema>;
340
-
341
- export const SyncPullSubscriptionIntegritySchema = z.object({
342
- partitionId: z.string(),
343
- previousChainRoot: z.string(),
344
- commitChainRoot: z.string(),
345
- commitSeq: z.number().int(),
346
- });
347
-
348
- export type SyncPullSubscriptionIntegrity = z.infer<
349
- typeof SyncPullSubscriptionIntegritySchema
350
- >;
351
-
352
- export const SyncSnapshotChunkRefSchema = z.object({
353
- id: z.string(),
354
- byteLength: z.number().int(),
355
- sha256: z.string(),
356
- encoding: SyncSnapshotChunkEncodingSchema,
357
- compression: z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
358
- });
359
-
360
- export type SyncSnapshotChunkRef = z.infer<typeof SyncSnapshotChunkRefSchema>;
361
-
362
- export const SyncSnapshotManifestChunkSchema = z.object({
363
- id: z.string(),
364
- byteLength: z.number().int(),
365
- sha256: z.string(),
366
- encoding: SyncSnapshotChunkEncodingSchema,
367
- compression: z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
368
- });
369
-
370
- export const SyncSnapshotManifestSchema = z.object({
371
- version: z.literal(1),
372
- digest: z.string(),
373
- table: z.string(),
374
- asOfCommitSeq: z.number().int(),
375
- scopeDigest: z.string(),
376
- rowCursor: z.string().nullable(),
377
- rowLimit: z.number().int().min(1),
378
- nextRowCursor: z.string().nullable(),
379
- isFirstPage: z.boolean(),
380
- isLastPage: z.boolean(),
381
- chunks: z.array(SyncSnapshotManifestChunkSchema),
382
- });
383
-
384
- export type SyncSnapshotManifest = z.infer<typeof SyncSnapshotManifestSchema>;
385
-
386
- export const SyncScopedSnapshotArtifactManifestSchema = z.object({
387
- version: z.literal(SYNC_SCOPED_SNAPSHOT_ARTIFACT_MANIFEST_VERSION),
388
- artifactKind: z.literal(SYNC_SCOPED_SNAPSHOT_ARTIFACT_KIND_SQLITE_V1),
389
- digest: z.string(),
390
- partitionId: z.string(),
391
- subscriptionId: z.string(),
392
- table: z.string(),
393
- schemaVersion: z.string(),
394
- asOfCommitSeq: z.number().int(),
395
- scopeDigest: z.string(),
396
- rowCursor: z.string().nullable(),
397
- rowLimit: z.number().int().min(1),
398
- rowCount: z.number().int().min(0),
399
- nextRowCursor: z.string().nullable(),
400
- isFirstPage: z.boolean(),
401
- isLastPage: z.boolean(),
402
- compression: z.union([
403
- z.literal(SYNC_SNAPSHOT_ARTIFACT_COMPRESSION_NONE),
404
- z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
405
- ]),
406
- byteLength: z.number().int().min(0),
407
- sha256: z.string(),
408
- featureSet: z.array(z.string()),
409
- });
410
-
411
- export type SyncScopedSnapshotArtifactManifest = z.infer<
412
- typeof SyncScopedSnapshotArtifactManifestSchema
413
- >;
414
-
415
- export const SyncSnapshotArtifactRefSchema = z.object({
416
- id: z.string(),
417
- byteLength: z.number().int().min(0),
418
- sha256: z.string(),
419
- manifestDigest: z.string(),
420
- artifactKind: z.literal(SYNC_SCOPED_SNAPSHOT_ARTIFACT_KIND_SQLITE_V1),
421
- compression: z.union([
422
- z.literal(SYNC_SNAPSHOT_ARTIFACT_COMPRESSION_NONE),
423
- z.literal(SYNC_SNAPSHOT_CHUNK_COMPRESSION),
424
- ]),
425
- rowCount: z.number().int().min(0),
426
- nextRowCursor: z.string().nullable(),
427
- isFirstPage: z.boolean(),
428
- isLastPage: z.boolean(),
429
- manifest: SyncScopedSnapshotArtifactManifestSchema,
430
- });
431
-
432
- export type SyncSnapshotArtifactRef = z.infer<
433
- typeof SyncSnapshotArtifactRefSchema
434
- >;
435
-
436
- export const SyncSnapshotSchema = z
437
- .object({
438
- table: z.string(),
439
- rows: z.array(z.unknown()),
440
- chunks: z.array(SyncSnapshotChunkRefSchema).optional(),
441
- manifest: SyncSnapshotManifestSchema.optional(),
442
- artifacts: z.array(SyncSnapshotArtifactRefSchema).optional(),
443
- isFirstPage: z.boolean(),
444
- isLastPage: z.boolean(),
445
- bootstrapStateAfter: SyncBootstrapStateSchema.nullable().optional(),
446
- })
447
- .superRefine((snapshot, ctx) => {
448
- if (!snapshot.artifacts || snapshot.artifacts.length === 0) return;
449
- if (snapshot.rows.length > 0) {
450
- ctx.addIssue({
451
- code: z.ZodIssueCode.custom,
452
- path: ['rows'],
453
- message: 'Snapshot artifacts cannot be mixed with inline rows',
454
- });
455
- }
456
- if (snapshot.chunks && snapshot.chunks.length > 0) {
457
- ctx.addIssue({
458
- code: z.ZodIssueCode.custom,
459
- path: ['chunks'],
460
- message: 'Snapshot artifacts cannot be mixed with chunk refs',
461
- });
462
- }
463
- if (snapshot.manifest) {
464
- ctx.addIssue({
465
- code: z.ZodIssueCode.custom,
466
- path: ['manifest'],
467
- message: 'Snapshot artifacts cannot be mixed with chunk manifests',
468
- });
469
- }
470
- });
471
-
472
- export type SyncSnapshot = z.infer<typeof SyncSnapshotSchema>;
473
-
474
- export const SyncPullSubscriptionResponseSchema = z.object({
475
- id: z.string(),
476
- status: z.enum(['active', 'revoked']),
477
- scopes: ScopeValuesSchema,
478
- bootstrap: z.boolean(),
479
- bootstrapState: SyncBootstrapStateSchema.nullable().optional(),
480
- nextCursor: z.number().int(),
481
- integrity: SyncPullSubscriptionIntegritySchema.optional(),
482
- commits: z.array(SyncCommitSchema),
483
- snapshots: z.array(SyncSnapshotSchema).optional(),
484
- });
485
-
486
- export type SyncPullSubscriptionResponse = z.infer<
487
- typeof SyncPullSubscriptionResponseSchema
488
- >;
489
-
490
- export const SyncPullResponseSchema = z.object({
491
- ok: z.literal(true),
492
- subscriptions: z.array(SyncPullSubscriptionResponseSchema),
493
- });
494
-
495
- export type SyncPullResponse = z.infer<typeof SyncPullResponseSchema>;
496
-
497
- // ============================================================================
498
- // Combined Sync Request/Response Schemas
499
- // ============================================================================
500
-
501
- export const SyncCombinedRequestSchema = z.object({
502
- clientId: z.string().min(1),
503
- push: SyncPushBatchRequestSchema.omit({ clientId: true }).optional(),
504
- pull: SyncPullRequestSchema.omit({ clientId: true }).optional(),
505
- });
506
-
507
- export type SyncCombinedRequest = z.infer<typeof SyncCombinedRequestSchema>;
508
-
509
- export const SyncCombinedResponseSchema = z.object({
510
- ok: z.literal(true),
511
- requiredSchemaVersion: z.number().int().min(1).optional(),
512
- latestSchemaVersion: z.number().int().min(1).optional(),
513
- push: SyncPushBatchResponseSchema.optional(),
514
- pull: SyncPullResponseSchema.optional(),
515
- });
516
-
517
- export type SyncCombinedResponse = z.infer<typeof SyncCombinedResponseSchema>;