@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
package/dist/pull.js ADDED
@@ -0,0 +1,608 @@
1
+ import { createHash, randomUUID } from 'node:crypto';
2
+ import { promisify } from 'node:util';
3
+ import { gzip, gzipSync } from 'node:zlib';
4
+ import { captureSyncException, countSyncMetric, distributionSyncMetric, encodeSnapshotRowFrames, encodeSnapshotRows, SYNC_SNAPSHOT_CHUNK_COMPRESSION, SYNC_SNAPSHOT_CHUNK_ENCODING, startSyncSpan, } from '@syncular/core';
5
+ import { insertSnapshotChunk, readSnapshotChunkRefByPageKey, } from './snapshot-chunks.js';
6
+ import { resolveEffectiveScopesForSubscriptions } from './subscriptions/resolve.js';
7
+ const gzipAsync = promisify(gzip);
8
+ const ASYNC_GZIP_MIN_BYTES = 64 * 1024;
9
+ function concatByteChunks(chunks) {
10
+ if (chunks.length === 1) {
11
+ return chunks[0] ?? new Uint8Array();
12
+ }
13
+ let total = 0;
14
+ for (const chunk of chunks) {
15
+ total += chunk.length;
16
+ }
17
+ const merged = new Uint8Array(total);
18
+ let offset = 0;
19
+ for (const chunk of chunks) {
20
+ merged.set(chunk, offset);
21
+ offset += chunk.length;
22
+ }
23
+ return merged;
24
+ }
25
+ function bytesToReadableStream(bytes) {
26
+ return new ReadableStream({
27
+ start(controller) {
28
+ controller.enqueue(bytes);
29
+ controller.close();
30
+ },
31
+ });
32
+ }
33
+ function chunksToReadableStream(chunks) {
34
+ return new ReadableStream({
35
+ start(controller) {
36
+ for (const chunk of chunks) {
37
+ controller.enqueue(chunk);
38
+ }
39
+ controller.close();
40
+ },
41
+ });
42
+ }
43
+ async function compressSnapshotPayload(payload) {
44
+ if (payload.byteLength < ASYNC_GZIP_MIN_BYTES) {
45
+ return new Uint8Array(gzipSync(payload));
46
+ }
47
+ const compressed = await gzipAsync(payload);
48
+ return new Uint8Array(compressed);
49
+ }
50
+ async function compressSnapshotPayloadStream(chunks) {
51
+ if (typeof CompressionStream !== 'undefined') {
52
+ const source = chunksToReadableStream(chunks);
53
+ const gzipStream = new CompressionStream('gzip');
54
+ return {
55
+ stream: source.pipeThrough(gzipStream),
56
+ };
57
+ }
58
+ const payload = concatByteChunks(chunks);
59
+ const compressed = await compressSnapshotPayload(payload);
60
+ return {
61
+ stream: bytesToReadableStream(compressed),
62
+ byteLength: compressed.length,
63
+ };
64
+ }
65
+ /**
66
+ * Generate a stable cache key for snapshot chunks.
67
+ */
68
+ function scopesToCacheKey(scopes) {
69
+ const sorted = Object.entries(scopes)
70
+ .sort(([a], [b]) => a.localeCompare(b))
71
+ .map(([k, v]) => {
72
+ const arr = Array.isArray(v) ? [...v].sort() : [v];
73
+ return `${k}:${arr.join(',')}`;
74
+ })
75
+ .join('|');
76
+ return createHash('sha256').update(sorted).digest('hex');
77
+ }
78
+ /**
79
+ * Sanitize a numeric limit parameter with bounds checking.
80
+ * Handles NaN, negative values, and undefined.
81
+ */
82
+ function sanitizeLimit(value, defaultValue, min, max) {
83
+ if (value === undefined || value === null)
84
+ return defaultValue;
85
+ if (Number.isNaN(value))
86
+ return defaultValue;
87
+ return Math.max(min, Math.min(max, value));
88
+ }
89
+ /**
90
+ * Merge all scope values into a flat ScopeValues for cursor tracking.
91
+ */
92
+ function mergeScopes(subscriptions) {
93
+ const result = {};
94
+ for (const sub of subscriptions) {
95
+ for (const [key, value] of Object.entries(sub.scopes)) {
96
+ if (!result[key])
97
+ result[key] = new Set();
98
+ const arr = Array.isArray(value) ? value : [value];
99
+ for (const v of arr)
100
+ result[key].add(v);
101
+ }
102
+ }
103
+ const merged = {};
104
+ for (const [key, set] of Object.entries(result)) {
105
+ const arr = Array.from(set);
106
+ if (arr.length === 0)
107
+ continue;
108
+ merged[key] = arr.length === 1 ? arr[0] : arr;
109
+ }
110
+ return merged;
111
+ }
112
+ function summarizePullResponse(response) {
113
+ const subscriptions = response.subscriptions ?? [];
114
+ let activeSubscriptionCount = 0;
115
+ let revokedSubscriptionCount = 0;
116
+ let bootstrapSubscriptionCount = 0;
117
+ let commitCount = 0;
118
+ let changeCount = 0;
119
+ let snapshotPageCount = 0;
120
+ for (const sub of subscriptions) {
121
+ if (sub.status === 'revoked') {
122
+ revokedSubscriptionCount += 1;
123
+ }
124
+ else {
125
+ activeSubscriptionCount += 1;
126
+ }
127
+ if (sub.bootstrap) {
128
+ bootstrapSubscriptionCount += 1;
129
+ }
130
+ const commits = sub.commits ?? [];
131
+ commitCount += commits.length;
132
+ for (const commit of commits) {
133
+ changeCount += commit.changes?.length ?? 0;
134
+ }
135
+ snapshotPageCount += sub.snapshots?.length ?? 0;
136
+ }
137
+ return {
138
+ subscriptionCount: subscriptions.length,
139
+ activeSubscriptionCount,
140
+ revokedSubscriptionCount,
141
+ bootstrapSubscriptionCount,
142
+ commitCount,
143
+ changeCount,
144
+ snapshotPageCount,
145
+ };
146
+ }
147
+ function recordPullMetrics(args) {
148
+ const { status, dedupeRows, durationMs, stats } = args;
149
+ const attributes = {
150
+ status,
151
+ dedupe_rows: dedupeRows,
152
+ };
153
+ countSyncMetric('sync.server.pull.requests', 1, { attributes });
154
+ distributionSyncMetric('sync.server.pull.duration_ms', durationMs, {
155
+ unit: 'millisecond',
156
+ attributes,
157
+ });
158
+ distributionSyncMetric('sync.server.pull.subscriptions', stats.subscriptionCount, { attributes });
159
+ distributionSyncMetric('sync.server.pull.active_subscriptions', stats.activeSubscriptionCount, { attributes });
160
+ distributionSyncMetric('sync.server.pull.revoked_subscriptions', stats.revokedSubscriptionCount, { attributes });
161
+ distributionSyncMetric('sync.server.pull.bootstrap_subscriptions', stats.bootstrapSubscriptionCount, { attributes });
162
+ distributionSyncMetric('sync.server.pull.commits', stats.commitCount, {
163
+ attributes,
164
+ });
165
+ distributionSyncMetric('sync.server.pull.changes', stats.changeCount, {
166
+ attributes,
167
+ });
168
+ distributionSyncMetric('sync.server.pull.snapshot_pages', stats.snapshotPageCount, { attributes });
169
+ }
170
+ export async function pull(args) {
171
+ const { request, dialect } = args;
172
+ const db = args.db;
173
+ const partitionId = args.partitionId ?? 'default';
174
+ const requestedSubscriptionCount = Array.isArray(request.subscriptions)
175
+ ? request.subscriptions.length
176
+ : 0;
177
+ const startedAtMs = Date.now();
178
+ return startSyncSpan({
179
+ name: 'sync.server.pull',
180
+ op: 'sync.pull',
181
+ attributes: {
182
+ requested_subscription_count: requestedSubscriptionCount,
183
+ dedupe_rows: request.dedupeRows === true,
184
+ },
185
+ }, async (span) => {
186
+ try {
187
+ // Validate and sanitize request limits
188
+ const limitCommits = sanitizeLimit(request.limitCommits, 50, 1, 500);
189
+ const limitSnapshotRows = sanitizeLimit(request.limitSnapshotRows, 1000, 1, 5000);
190
+ const maxSnapshotPages = sanitizeLimit(request.maxSnapshotPages, 1, 1, 50);
191
+ const dedupeRows = request.dedupeRows === true;
192
+ // Resolve effective scopes for each subscription
193
+ const resolved = await resolveEffectiveScopesForSubscriptions({
194
+ db,
195
+ actorId: args.actorId,
196
+ subscriptions: request.subscriptions ?? [],
197
+ shapes: args.shapes,
198
+ });
199
+ const result = await dialect.executeInTransaction(db, async (trx) => {
200
+ await dialect.setRepeatableRead(trx);
201
+ const maxCommitSeq = await dialect.readMaxCommitSeq(trx, {
202
+ partitionId,
203
+ });
204
+ const minCommitSeq = await dialect.readMinCommitSeq(trx, {
205
+ partitionId,
206
+ });
207
+ const subResponses = [];
208
+ const activeSubscriptions = [];
209
+ const nextCursors = [];
210
+ for (const sub of resolved) {
211
+ const cursor = Math.max(-1, sub.cursor ?? -1);
212
+ // Validate shape exists (throws if not registered)
213
+ args.shapes.getOrThrow(sub.shape);
214
+ if (sub.status === 'revoked' ||
215
+ Object.keys(sub.scopes).length === 0) {
216
+ subResponses.push({
217
+ id: sub.id,
218
+ status: 'revoked',
219
+ scopes: {},
220
+ bootstrap: false,
221
+ nextCursor: cursor,
222
+ commits: [],
223
+ });
224
+ continue;
225
+ }
226
+ const effectiveScopes = sub.scopes;
227
+ activeSubscriptions.push({ scopes: effectiveScopes });
228
+ const needsBootstrap = sub.bootstrapState != null ||
229
+ cursor < 0 ||
230
+ cursor > maxCommitSeq ||
231
+ (minCommitSeq > 0 && cursor < minCommitSeq - 1);
232
+ if (needsBootstrap) {
233
+ const tables = args.shapes
234
+ .getBootstrapOrderFor(sub.shape)
235
+ .map((handler) => handler.table);
236
+ const initState = {
237
+ asOfCommitSeq: maxCommitSeq,
238
+ tables,
239
+ tableIndex: 0,
240
+ rowCursor: null,
241
+ };
242
+ const requestedState = sub.bootstrapState ?? null;
243
+ const state = requestedState &&
244
+ typeof requestedState.asOfCommitSeq === 'number' &&
245
+ Array.isArray(requestedState.tables) &&
246
+ typeof requestedState.tableIndex === 'number'
247
+ ? requestedState
248
+ : initState;
249
+ // If the bootstrap state's asOfCommitSeq is no longer catch-up-able, restart bootstrap.
250
+ const effectiveState = state.asOfCommitSeq < minCommitSeq - 1 ? initState : state;
251
+ const tableName = effectiveState.tables[effectiveState.tableIndex];
252
+ // No tables (or ran past the end): treat bootstrap as complete.
253
+ if (!tableName) {
254
+ subResponses.push({
255
+ id: sub.id,
256
+ status: 'active',
257
+ scopes: effectiveScopes,
258
+ bootstrap: true,
259
+ bootstrapState: null,
260
+ nextCursor: effectiveState.asOfCommitSeq,
261
+ commits: [],
262
+ snapshots: [],
263
+ });
264
+ nextCursors.push(effectiveState.asOfCommitSeq);
265
+ continue;
266
+ }
267
+ const snapshots = [];
268
+ let nextState = effectiveState;
269
+ const cacheKey = `${partitionId}:${scopesToCacheKey(effectiveScopes)}`;
270
+ const flushSnapshotBundle = async (bundle) => {
271
+ const nowIso = new Date().toISOString();
272
+ const bundleRowLimit = Math.max(1, limitSnapshotRows * bundle.pageCount);
273
+ const cached = await readSnapshotChunkRefByPageKey(trx, {
274
+ partitionId,
275
+ scopeKey: cacheKey,
276
+ scope: bundle.table,
277
+ asOfCommitSeq: effectiveState.asOfCommitSeq,
278
+ rowCursor: bundle.startCursor,
279
+ rowLimit: bundleRowLimit,
280
+ encoding: SYNC_SNAPSHOT_CHUNK_ENCODING,
281
+ compression: SYNC_SNAPSHOT_CHUNK_COMPRESSION,
282
+ nowIso,
283
+ });
284
+ let chunkRef = cached;
285
+ if (!chunkRef) {
286
+ const sha256 = bundle.hash.digest('hex');
287
+ const expiresAt = new Date(Date.now() + Math.max(1000, bundle.ttlMs)).toISOString();
288
+ if (args.chunkStorage) {
289
+ if (args.chunkStorage.storeChunkStream) {
290
+ const { stream: bodyStream, byteLength } = await compressSnapshotPayloadStream(bundle.rowFrameParts);
291
+ chunkRef = await args.chunkStorage.storeChunkStream({
292
+ partitionId,
293
+ scopeKey: cacheKey,
294
+ scope: bundle.table,
295
+ asOfCommitSeq: effectiveState.asOfCommitSeq,
296
+ rowCursor: bundle.startCursor,
297
+ rowLimit: bundleRowLimit,
298
+ encoding: SYNC_SNAPSHOT_CHUNK_ENCODING,
299
+ compression: SYNC_SNAPSHOT_CHUNK_COMPRESSION,
300
+ sha256,
301
+ byteLength,
302
+ bodyStream,
303
+ expiresAt,
304
+ });
305
+ }
306
+ else {
307
+ const compressedBody = await compressSnapshotPayload(concatByteChunks(bundle.rowFrameParts));
308
+ chunkRef = await args.chunkStorage.storeChunk({
309
+ partitionId,
310
+ scopeKey: cacheKey,
311
+ scope: bundle.table,
312
+ asOfCommitSeq: effectiveState.asOfCommitSeq,
313
+ rowCursor: bundle.startCursor,
314
+ rowLimit: bundleRowLimit,
315
+ encoding: SYNC_SNAPSHOT_CHUNK_ENCODING,
316
+ compression: SYNC_SNAPSHOT_CHUNK_COMPRESSION,
317
+ sha256,
318
+ body: compressedBody,
319
+ expiresAt,
320
+ });
321
+ }
322
+ }
323
+ else {
324
+ const compressedBody = await compressSnapshotPayload(concatByteChunks(bundle.rowFrameParts));
325
+ const chunkId = randomUUID();
326
+ chunkRef = await insertSnapshotChunk(trx, {
327
+ chunkId,
328
+ partitionId,
329
+ scopeKey: cacheKey,
330
+ scope: bundle.table,
331
+ asOfCommitSeq: effectiveState.asOfCommitSeq,
332
+ rowCursor: bundle.startCursor,
333
+ rowLimit: bundleRowLimit,
334
+ encoding: SYNC_SNAPSHOT_CHUNK_ENCODING,
335
+ compression: SYNC_SNAPSHOT_CHUNK_COMPRESSION,
336
+ sha256,
337
+ body: compressedBody,
338
+ expiresAt,
339
+ });
340
+ }
341
+ }
342
+ snapshots.push({
343
+ table: bundle.table,
344
+ rows: [],
345
+ chunks: [chunkRef],
346
+ isFirstPage: bundle.isFirstPage,
347
+ isLastPage: bundle.isLastPage,
348
+ });
349
+ };
350
+ let activeBundle = null;
351
+ for (let pageIndex = 0; pageIndex < maxSnapshotPages; pageIndex++) {
352
+ if (!nextState)
353
+ break;
354
+ const nextTableName = nextState.tables[nextState.tableIndex];
355
+ if (!nextTableName) {
356
+ if (activeBundle) {
357
+ activeBundle.isLastPage = true;
358
+ await flushSnapshotBundle(activeBundle);
359
+ activeBundle = null;
360
+ }
361
+ nextState = null;
362
+ break;
363
+ }
364
+ const tableHandler = args.shapes.getOrThrow(nextTableName);
365
+ if (!activeBundle || activeBundle.table !== nextTableName) {
366
+ if (activeBundle) {
367
+ await flushSnapshotBundle(activeBundle);
368
+ }
369
+ const bundleHash = createHash('sha256');
370
+ const bundleHeader = encodeSnapshotRows([]);
371
+ bundleHash.update(bundleHeader);
372
+ activeBundle = {
373
+ table: nextTableName,
374
+ startCursor: nextState.rowCursor,
375
+ isFirstPage: nextState.rowCursor == null,
376
+ isLastPage: false,
377
+ pageCount: 0,
378
+ ttlMs: tableHandler.snapshotChunkTtlMs ?? 24 * 60 * 60 * 1000,
379
+ hash: bundleHash,
380
+ rowFrameParts: [bundleHeader],
381
+ };
382
+ }
383
+ const page = await tableHandler.snapshot({
384
+ db: trx,
385
+ actorId: args.actorId,
386
+ scopeValues: effectiveScopes,
387
+ cursor: nextState.rowCursor,
388
+ limit: limitSnapshotRows,
389
+ }, sub.params);
390
+ const rowFrames = encodeSnapshotRowFrames(page.rows ?? []);
391
+ activeBundle.hash.update(rowFrames);
392
+ activeBundle.rowFrameParts.push(rowFrames);
393
+ activeBundle.pageCount += 1;
394
+ if (page.nextCursor != null) {
395
+ nextState = { ...nextState, rowCursor: page.nextCursor };
396
+ continue;
397
+ }
398
+ activeBundle.isLastPage = true;
399
+ await flushSnapshotBundle(activeBundle);
400
+ activeBundle = null;
401
+ if (nextState.tableIndex + 1 < nextState.tables.length) {
402
+ nextState = {
403
+ ...nextState,
404
+ tableIndex: nextState.tableIndex + 1,
405
+ rowCursor: null,
406
+ };
407
+ continue;
408
+ }
409
+ nextState = null;
410
+ break;
411
+ }
412
+ if (activeBundle) {
413
+ await flushSnapshotBundle(activeBundle);
414
+ }
415
+ subResponses.push({
416
+ id: sub.id,
417
+ status: 'active',
418
+ scopes: effectiveScopes,
419
+ bootstrap: true,
420
+ bootstrapState: nextState,
421
+ nextCursor: effectiveState.asOfCommitSeq,
422
+ commits: [],
423
+ snapshots,
424
+ });
425
+ nextCursors.push(effectiveState.asOfCommitSeq);
426
+ continue;
427
+ }
428
+ // Incremental pull for this subscription
429
+ // Read the commit window for this table up-front so the subscription cursor
430
+ // can advance past commits that don't match the requested scopes.
431
+ const scannedCommitSeqs = await dialect.readCommitSeqsForPull(trx, {
432
+ partitionId,
433
+ cursor,
434
+ limitCommits,
435
+ tables: [sub.shape],
436
+ });
437
+ const maxScannedCommitSeq = scannedCommitSeqs.length > 0
438
+ ? scannedCommitSeqs[scannedCommitSeqs.length - 1]
439
+ : cursor;
440
+ // Collect rows and compute nextCursor in a single pass
441
+ const incrementalRows = [];
442
+ let nextCursor = cursor;
443
+ for await (const row of dialect.iterateIncrementalPullRows(trx, {
444
+ partitionId,
445
+ table: sub.shape,
446
+ scopes: effectiveScopes,
447
+ cursor,
448
+ limitCommits,
449
+ })) {
450
+ incrementalRows.push(row);
451
+ nextCursor = Math.max(nextCursor, row.commit_seq);
452
+ }
453
+ nextCursor = Math.max(nextCursor, maxScannedCommitSeq);
454
+ if (incrementalRows.length === 0) {
455
+ subResponses.push({
456
+ id: sub.id,
457
+ status: 'active',
458
+ scopes: effectiveScopes,
459
+ bootstrap: false,
460
+ nextCursor,
461
+ commits: [],
462
+ });
463
+ nextCursors.push(nextCursor);
464
+ continue;
465
+ }
466
+ if (dedupeRows) {
467
+ const latestByRowKey = new Map();
468
+ for (const r of incrementalRows) {
469
+ const rowKey = `${r.table}\u0000${r.row_id}`;
470
+ const change = {
471
+ table: r.table,
472
+ row_id: r.row_id,
473
+ op: r.op,
474
+ row_json: r.row_json,
475
+ row_version: r.row_version,
476
+ scopes: dialect.dbToScopes(r.scopes),
477
+ };
478
+ latestByRowKey.set(rowKey, {
479
+ commitSeq: r.commit_seq,
480
+ createdAt: r.created_at,
481
+ actorId: r.actor_id,
482
+ changeId: r.change_id,
483
+ change,
484
+ });
485
+ }
486
+ const latest = Array.from(latestByRowKey.values()).sort((a, b) => a.commitSeq - b.commitSeq || a.changeId - b.changeId);
487
+ const commitsBySeq = new Map();
488
+ for (const item of latest) {
489
+ let commit = commitsBySeq.get(item.commitSeq);
490
+ if (!commit) {
491
+ commit = {
492
+ commitSeq: item.commitSeq,
493
+ createdAt: item.createdAt,
494
+ actorId: item.actorId,
495
+ changes: [],
496
+ };
497
+ commitsBySeq.set(item.commitSeq, commit);
498
+ }
499
+ commit.changes.push(item.change);
500
+ }
501
+ const commits = Array.from(commitsBySeq.values()).sort((a, b) => a.commitSeq - b.commitSeq);
502
+ subResponses.push({
503
+ id: sub.id,
504
+ status: 'active',
505
+ scopes: effectiveScopes,
506
+ bootstrap: false,
507
+ nextCursor,
508
+ commits,
509
+ });
510
+ nextCursors.push(nextCursor);
511
+ continue;
512
+ }
513
+ const commitsBySeq = new Map();
514
+ const commitSeqs = [];
515
+ for (const r of incrementalRows) {
516
+ const seq = r.commit_seq;
517
+ let commit = commitsBySeq.get(seq);
518
+ if (!commit) {
519
+ commit = {
520
+ commitSeq: seq,
521
+ createdAt: r.created_at,
522
+ actorId: r.actor_id,
523
+ changes: [],
524
+ };
525
+ commitsBySeq.set(seq, commit);
526
+ commitSeqs.push(seq);
527
+ }
528
+ const change = {
529
+ table: r.table,
530
+ row_id: r.row_id,
531
+ op: r.op,
532
+ row_json: r.row_json,
533
+ row_version: r.row_version,
534
+ scopes: dialect.dbToScopes(r.scopes),
535
+ };
536
+ commit.changes.push(change);
537
+ }
538
+ const commits = commitSeqs
539
+ .map((seq) => commitsBySeq.get(seq))
540
+ .filter((c) => !!c)
541
+ .filter((c) => c.changes.length > 0);
542
+ subResponses.push({
543
+ id: sub.id,
544
+ status: 'active',
545
+ scopes: effectiveScopes,
546
+ bootstrap: false,
547
+ nextCursor,
548
+ commits,
549
+ });
550
+ nextCursors.push(nextCursor);
551
+ }
552
+ const effectiveScopes = mergeScopes(activeSubscriptions);
553
+ const clientCursor = nextCursors.length > 0 ? Math.min(...nextCursors) : maxCommitSeq;
554
+ return {
555
+ response: {
556
+ ok: true,
557
+ subscriptions: subResponses,
558
+ },
559
+ effectiveScopes,
560
+ clientCursor,
561
+ };
562
+ });
563
+ const durationMs = Math.max(0, Date.now() - startedAtMs);
564
+ const stats = summarizePullResponse(result.response);
565
+ span.setAttribute('status', 'ok');
566
+ span.setAttribute('duration_ms', durationMs);
567
+ span.setAttribute('subscription_count', stats.subscriptionCount);
568
+ span.setAttribute('commit_count', stats.commitCount);
569
+ span.setAttribute('change_count', stats.changeCount);
570
+ span.setAttribute('snapshot_page_count', stats.snapshotPageCount);
571
+ span.setStatus('ok');
572
+ recordPullMetrics({
573
+ status: 'ok',
574
+ dedupeRows,
575
+ durationMs,
576
+ stats,
577
+ });
578
+ return result;
579
+ }
580
+ catch (error) {
581
+ const durationMs = Math.max(0, Date.now() - startedAtMs);
582
+ span.setAttribute('status', 'error');
583
+ span.setAttribute('duration_ms', durationMs);
584
+ span.setStatus('error');
585
+ recordPullMetrics({
586
+ status: 'error',
587
+ dedupeRows: request.dedupeRows === true,
588
+ durationMs,
589
+ stats: {
590
+ subscriptionCount: 0,
591
+ activeSubscriptionCount: 0,
592
+ revokedSubscriptionCount: 0,
593
+ bootstrapSubscriptionCount: 0,
594
+ commitCount: 0,
595
+ changeCount: 0,
596
+ snapshotPageCount: 0,
597
+ },
598
+ });
599
+ captureSyncException(error, {
600
+ event: 'sync.server.pull',
601
+ requestedSubscriptionCount,
602
+ dedupeRows: request.dedupeRows === true,
603
+ });
604
+ throw error;
605
+ }
606
+ });
607
+ }
608
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../src/pull.ts"],"names":[],"mappings":"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"}