@syncular/server 0.0.1 → 0.0.2-126

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 (171) hide show
  1. package/README.md +25 -0
  2. package/dist/blobs/adapters/database.d.ts.map +1 -1
  3. package/dist/blobs/adapters/database.js +25 -3
  4. package/dist/blobs/adapters/database.js.map +1 -1
  5. package/dist/blobs/adapters/filesystem.d.ts +31 -0
  6. package/dist/blobs/adapters/filesystem.d.ts.map +1 -0
  7. package/dist/blobs/adapters/filesystem.js +140 -0
  8. package/dist/blobs/adapters/filesystem.js.map +1 -0
  9. package/dist/blobs/adapters/s3.d.ts +3 -2
  10. package/dist/blobs/adapters/s3.d.ts.map +1 -1
  11. package/dist/blobs/adapters/s3.js +49 -0
  12. package/dist/blobs/adapters/s3.js.map +1 -1
  13. package/dist/blobs/index.d.ts +1 -0
  14. package/dist/blobs/index.d.ts.map +1 -1
  15. package/dist/blobs/index.js +6 -5
  16. package/dist/blobs/index.js.map +1 -1
  17. package/dist/clients.d.ts +1 -0
  18. package/dist/clients.d.ts.map +1 -1
  19. package/dist/clients.js.map +1 -1
  20. package/dist/compaction.d.ts +1 -1
  21. package/dist/compaction.js +1 -1
  22. package/dist/dialect/base.d.ts +83 -0
  23. package/dist/dialect/base.d.ts.map +1 -0
  24. package/dist/dialect/base.js +144 -0
  25. package/dist/dialect/base.js.map +1 -0
  26. package/dist/dialect/helpers.d.ts +10 -0
  27. package/dist/dialect/helpers.d.ts.map +1 -0
  28. package/dist/dialect/helpers.js +59 -0
  29. package/dist/dialect/helpers.js.map +1 -0
  30. package/dist/dialect/index.d.ts +2 -0
  31. package/dist/dialect/index.d.ts.map +1 -1
  32. package/dist/dialect/index.js +3 -1
  33. package/dist/dialect/index.js.map +1 -1
  34. package/dist/dialect/types.d.ts +38 -46
  35. package/dist/dialect/types.d.ts.map +1 -1
  36. package/dist/{shapes → handlers}/create-handler.d.ts +18 -5
  37. package/dist/handlers/create-handler.d.ts.map +1 -0
  38. package/dist/{shapes → handlers}/create-handler.js +140 -43
  39. package/dist/handlers/create-handler.js.map +1 -0
  40. package/dist/handlers/index.d.ts.map +1 -0
  41. package/dist/handlers/index.js +4 -0
  42. package/dist/handlers/index.js.map +1 -0
  43. package/dist/handlers/registry.d.ts.map +1 -0
  44. package/dist/handlers/registry.js.map +1 -0
  45. package/dist/{shapes → handlers}/types.d.ts +7 -7
  46. package/dist/{shapes → handlers}/types.d.ts.map +1 -1
  47. package/dist/{shapes → handlers}/types.js.map +1 -1
  48. package/dist/helpers/conflict.d.ts +1 -1
  49. package/dist/helpers/conflict.d.ts.map +1 -1
  50. package/dist/helpers/emitted-change.d.ts +1 -1
  51. package/dist/helpers/emitted-change.d.ts.map +1 -1
  52. package/dist/helpers/index.js +4 -4
  53. package/dist/index.d.ts +2 -1
  54. package/dist/index.d.ts.map +1 -1
  55. package/dist/index.js +17 -16
  56. package/dist/index.js.map +1 -1
  57. package/dist/notify.d.ts +47 -0
  58. package/dist/notify.d.ts.map +1 -0
  59. package/dist/notify.js +85 -0
  60. package/dist/notify.js.map +1 -0
  61. package/dist/proxy/handler.d.ts +1 -1
  62. package/dist/proxy/handler.d.ts.map +1 -1
  63. package/dist/proxy/handler.js +15 -11
  64. package/dist/proxy/handler.js.map +1 -1
  65. package/dist/proxy/index.d.ts +2 -2
  66. package/dist/proxy/index.d.ts.map +1 -1
  67. package/dist/proxy/index.js +3 -3
  68. package/dist/proxy/index.js.map +1 -1
  69. package/dist/proxy/mutation-detector.d.ts +4 -0
  70. package/dist/proxy/mutation-detector.d.ts.map +1 -1
  71. package/dist/proxy/mutation-detector.js +209 -24
  72. package/dist/proxy/mutation-detector.js.map +1 -1
  73. package/dist/proxy/oplog.d.ts +2 -1
  74. package/dist/proxy/oplog.d.ts.map +1 -1
  75. package/dist/proxy/oplog.js +15 -9
  76. package/dist/proxy/oplog.js.map +1 -1
  77. package/dist/proxy/registry.d.ts +0 -11
  78. package/dist/proxy/registry.d.ts.map +1 -1
  79. package/dist/proxy/registry.js +0 -24
  80. package/dist/proxy/registry.js.map +1 -1
  81. package/dist/proxy/types.d.ts +2 -0
  82. package/dist/proxy/types.d.ts.map +1 -1
  83. package/dist/pull.d.ts +4 -3
  84. package/dist/pull.d.ts.map +1 -1
  85. package/dist/pull.js +565 -314
  86. package/dist/pull.js.map +1 -1
  87. package/dist/push.d.ts +15 -3
  88. package/dist/push.d.ts.map +1 -1
  89. package/dist/push.js +359 -229
  90. package/dist/push.js.map +1 -1
  91. package/dist/realtime/index.js +1 -1
  92. package/dist/realtime/types.d.ts +2 -0
  93. package/dist/realtime/types.d.ts.map +1 -1
  94. package/dist/schema.d.ts +11 -1
  95. package/dist/schema.d.ts.map +1 -1
  96. package/dist/snapshot-chunks/db-metadata.d.ts +6 -1
  97. package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
  98. package/dist/snapshot-chunks/db-metadata.js +261 -92
  99. package/dist/snapshot-chunks/db-metadata.js.map +1 -1
  100. package/dist/snapshot-chunks/index.d.ts +0 -1
  101. package/dist/snapshot-chunks/index.d.ts.map +1 -1
  102. package/dist/snapshot-chunks/index.js +2 -3
  103. package/dist/snapshot-chunks/index.js.map +1 -1
  104. package/dist/snapshot-chunks/types.d.ts +20 -5
  105. package/dist/snapshot-chunks/types.d.ts.map +1 -1
  106. package/dist/snapshot-chunks.d.ts +12 -8
  107. package/dist/snapshot-chunks.d.ts.map +1 -1
  108. package/dist/snapshot-chunks.js +40 -12
  109. package/dist/snapshot-chunks.js.map +1 -1
  110. package/dist/subscriptions/index.js +1 -1
  111. package/dist/subscriptions/resolve.d.ts +6 -6
  112. package/dist/subscriptions/resolve.d.ts.map +1 -1
  113. package/dist/subscriptions/resolve.js +53 -14
  114. package/dist/subscriptions/resolve.js.map +1 -1
  115. package/package.json +28 -7
  116. package/src/blobs/adapters/database.test.ts +67 -0
  117. package/src/blobs/adapters/database.ts +34 -9
  118. package/src/blobs/adapters/filesystem.test.ts +132 -0
  119. package/src/blobs/adapters/filesystem.ts +189 -0
  120. package/src/blobs/adapters/s3.test.ts +522 -0
  121. package/src/blobs/adapters/s3.ts +55 -2
  122. package/src/blobs/index.ts +1 -0
  123. package/src/clients.ts +1 -0
  124. package/src/compaction.ts +1 -1
  125. package/src/dialect/base.ts +292 -0
  126. package/src/dialect/helpers.ts +61 -0
  127. package/src/dialect/index.ts +2 -0
  128. package/src/dialect/types.ts +50 -54
  129. package/src/{shapes → handlers}/create-handler.ts +219 -64
  130. package/src/{shapes → handlers}/types.ts +10 -7
  131. package/src/helpers/conflict.ts +1 -1
  132. package/src/helpers/emitted-change.ts +1 -1
  133. package/src/index.ts +2 -1
  134. package/src/notify.test.ts +516 -0
  135. package/src/notify.ts +131 -0
  136. package/src/proxy/handler.test.ts +120 -0
  137. package/src/proxy/handler.ts +18 -10
  138. package/src/proxy/index.ts +2 -1
  139. package/src/proxy/mutation-detector.test.ts +71 -0
  140. package/src/proxy/mutation-detector.ts +227 -29
  141. package/src/proxy/oplog.ts +19 -10
  142. package/src/proxy/registry.ts +0 -33
  143. package/src/proxy/types.ts +2 -0
  144. package/src/pull.ts +788 -405
  145. package/src/push.ts +507 -312
  146. package/src/realtime/types.ts +2 -0
  147. package/src/schema.ts +11 -1
  148. package/src/snapshot-chunks/db-metadata.test.ts +169 -0
  149. package/src/snapshot-chunks/db-metadata.ts +347 -105
  150. package/src/snapshot-chunks/index.ts +0 -1
  151. package/src/snapshot-chunks/types.ts +31 -5
  152. package/src/snapshot-chunks.ts +60 -21
  153. package/src/subscriptions/resolve.ts +73 -18
  154. package/dist/shapes/create-handler.d.ts.map +0 -1
  155. package/dist/shapes/create-handler.js.map +0 -1
  156. package/dist/shapes/index.d.ts.map +0 -1
  157. package/dist/shapes/index.js +0 -4
  158. package/dist/shapes/index.js.map +0 -1
  159. package/dist/shapes/registry.d.ts.map +0 -1
  160. package/dist/shapes/registry.js.map +0 -1
  161. package/dist/snapshot-chunks/adapters/s3.d.ts +0 -63
  162. package/dist/snapshot-chunks/adapters/s3.d.ts.map +0 -1
  163. package/dist/snapshot-chunks/adapters/s3.js +0 -50
  164. package/dist/snapshot-chunks/adapters/s3.js.map +0 -1
  165. package/src/snapshot-chunks/adapters/s3.ts +0 -68
  166. /package/dist/{shapes → handlers}/index.d.ts +0 -0
  167. /package/dist/{shapes → handlers}/registry.d.ts +0 -0
  168. /package/dist/{shapes → handlers}/registry.js +0 -0
  169. /package/dist/{shapes → handlers}/types.js +0 -0
  170. /package/src/{shapes → handlers}/index.ts +0 -0
  171. /package/src/{shapes → handlers}/registry.ts +0 -0
@@ -5,32 +5,40 @@
5
5
  * without embedding huge JSON payloads into pull responses.
6
6
  */
7
7
 
8
- import type { SyncSnapshotChunkRef } from '@syncular/core';
8
+ import {
9
+ SYNC_SNAPSHOT_CHUNK_COMPRESSION,
10
+ SYNC_SNAPSHOT_CHUNK_ENCODING,
11
+ type SyncSnapshotChunkCompression,
12
+ type SyncSnapshotChunkEncoding,
13
+ type SyncSnapshotChunkRef,
14
+ } from '@syncular/core';
9
15
  import { type Kysely, sql } from 'kysely';
10
16
  import type { SyncCoreDb } from './schema';
11
17
 
12
18
  export interface SnapshotChunkPageKey {
19
+ partitionId: string;
13
20
  scopeKey: string;
14
21
  scope: string;
15
22
  asOfCommitSeq: number;
16
23
  rowCursor: string | null;
17
24
  rowLimit: number;
18
- encoding: 'ndjson';
19
- compression: 'gzip';
25
+ encoding: SyncSnapshotChunkEncoding;
26
+ compression: SyncSnapshotChunkCompression;
20
27
  }
21
28
 
22
29
  export interface SnapshotChunkRow {
23
30
  chunkId: string;
31
+ partitionId: string;
24
32
  scopeKey: string;
25
33
  scope: string;
26
34
  asOfCommitSeq: number;
27
35
  rowCursor: string;
28
36
  rowLimit: number;
29
- encoding: 'ndjson';
30
- compression: 'gzip';
37
+ encoding: SyncSnapshotChunkEncoding;
38
+ compression: SyncSnapshotChunkCompression;
31
39
  sha256: string;
32
40
  byteLength: number;
33
- body: Uint8Array;
41
+ body: Uint8Array | ReadableStream<Uint8Array>;
34
42
  expiresAt: string;
35
43
  }
36
44
 
@@ -70,7 +78,8 @@ export async function readSnapshotChunkRefByPageKey<DB extends SyncCoreDb>(
70
78
  select chunk_id, sha256, byte_length, encoding, compression
71
79
  from ${sql.table('sync_snapshot_chunks')}
72
80
  where
73
- scope_key = ${args.scopeKey}
81
+ partition_id = ${args.partitionId}
82
+ and scope_key = ${args.scopeKey}
74
83
  and scope = ${args.scope}
75
84
  and as_of_commit_seq = ${args.asOfCommitSeq}
76
85
  and row_cursor = ${rowCursorKey}
@@ -84,12 +93,12 @@ export async function readSnapshotChunkRefByPageKey<DB extends SyncCoreDb>(
84
93
 
85
94
  if (!row) return null;
86
95
 
87
- if (row.encoding !== 'ndjson') {
96
+ if (row.encoding !== SYNC_SNAPSHOT_CHUNK_ENCODING) {
88
97
  throw new Error(
89
98
  `Unexpected snapshot chunk encoding: ${String(row.encoding)}`
90
99
  );
91
100
  }
92
- if (row.compression !== 'gzip') {
101
+ if (row.compression !== SYNC_SNAPSHOT_CHUNK_COMPRESSION) {
93
102
  throw new Error(
94
103
  `Unexpected snapshot chunk compression: ${String(row.compression)}`
95
104
  );
@@ -108,13 +117,14 @@ export async function insertSnapshotChunk<DB extends SyncCoreDb>(
108
117
  db: Kysely<DB>,
109
118
  args: {
110
119
  chunkId: string;
120
+ partitionId: string;
111
121
  scopeKey: string;
112
122
  scope: string;
113
123
  asOfCommitSeq: number;
114
124
  rowCursor: string | null;
115
125
  rowLimit: number;
116
- encoding: 'ndjson';
117
- compression: 'gzip';
126
+ encoding: SyncSnapshotChunkEncoding;
127
+ compression: SyncSnapshotChunkCompression;
118
128
  sha256: string;
119
129
  body: Uint8Array;
120
130
  expiresAt: string;
@@ -129,6 +139,7 @@ export async function insertSnapshotChunk<DB extends SyncCoreDb>(
129
139
  await sql`
130
140
  insert into ${sql.table('sync_snapshot_chunks')} (
131
141
  chunk_id,
142
+ partition_id,
132
143
  scope_key,
133
144
  scope,
134
145
  as_of_commit_seq,
@@ -145,6 +156,7 @@ export async function insertSnapshotChunk<DB extends SyncCoreDb>(
145
156
  )
146
157
  values (
147
158
  ${args.chunkId},
159
+ ${args.partitionId},
148
160
  ${args.scopeKey},
149
161
  ${args.scope},
150
162
  ${args.asOfCommitSeq},
@@ -160,6 +172,7 @@ export async function insertSnapshotChunk<DB extends SyncCoreDb>(
160
172
  ${args.expiresAt}
161
173
  )
162
174
  on conflict (
175
+ partition_id,
163
176
  scope_key,
164
177
  scope,
165
178
  as_of_commit_seq,
@@ -174,6 +187,7 @@ export async function insertSnapshotChunk<DB extends SyncCoreDb>(
174
187
  `.execute(db);
175
188
 
176
189
  const ref = await readSnapshotChunkRefByPageKey(db, {
190
+ partitionId: args.partitionId,
177
191
  scopeKey: args.scopeKey,
178
192
  scope: args.scope,
179
193
  asOfCommitSeq: args.asOfCommitSeq,
@@ -195,11 +209,17 @@ export async function readSnapshotChunk<DB extends SyncCoreDb>(
195
209
  chunkId: string,
196
210
  options?: {
197
211
  /** External chunk storage for reading from S3/R2/etc */
198
- chunkStorage?: { readChunk(chunkId: string): Promise<Uint8Array | null> };
212
+ chunkStorage?: {
213
+ readChunk(chunkId: string): Promise<Uint8Array | null>;
214
+ readChunkStream?(
215
+ chunkId: string
216
+ ): Promise<ReadableStream<Uint8Array> | null>;
217
+ };
199
218
  }
200
219
  ): Promise<SnapshotChunkRow | null> {
201
220
  const rowResult = await sql<{
202
221
  chunk_id: string;
222
+ partition_id: string;
203
223
  scope_key: string;
204
224
  scope: string;
205
225
  as_of_commit_seq: number;
@@ -215,6 +235,7 @@ export async function readSnapshotChunk<DB extends SyncCoreDb>(
215
235
  }>`
216
236
  select
217
237
  chunk_id,
238
+ partition_id,
218
239
  scope_key,
219
240
  scope,
220
241
  as_of_commit_seq,
@@ -235,27 +256,44 @@ export async function readSnapshotChunk<DB extends SyncCoreDb>(
235
256
 
236
257
  if (!row) return null;
237
258
 
238
- if (row.encoding !== 'ndjson') {
259
+ if (row.encoding !== SYNC_SNAPSHOT_CHUNK_ENCODING) {
239
260
  throw new Error(
240
261
  `Unexpected snapshot chunk encoding: ${String(row.encoding)}`
241
262
  );
242
263
  }
243
- if (row.compression !== 'gzip') {
264
+ if (row.compression !== SYNC_SNAPSHOT_CHUNK_COMPRESSION) {
244
265
  throw new Error(
245
266
  `Unexpected snapshot chunk compression: ${String(row.compression)}`
246
267
  );
247
268
  }
248
269
 
249
270
  // Read body from external storage if available, otherwise use inline body
250
- let body: Uint8Array;
271
+ let body: Uint8Array | ReadableStream<Uint8Array>;
251
272
  if (options?.chunkStorage) {
252
- const externalBody = await options.chunkStorage.readChunk(chunkId);
253
- if (externalBody) {
254
- body = externalBody;
255
- } else if (row.body) {
256
- body = coerceChunkRow(row.body);
273
+ if (options.chunkStorage.readChunkStream) {
274
+ const externalBodyStream =
275
+ await options.chunkStorage.readChunkStream(chunkId);
276
+ if (externalBodyStream) {
277
+ body = externalBodyStream;
278
+ } else {
279
+ const externalBody = await options.chunkStorage.readChunk(chunkId);
280
+ if (externalBody) {
281
+ body = externalBody;
282
+ } else if (row.body) {
283
+ body = coerceChunkRow(row.body);
284
+ } else {
285
+ throw new Error(`Snapshot chunk body missing for chunk ${chunkId}`);
286
+ }
287
+ }
257
288
  } else {
258
- throw new Error(`Snapshot chunk body missing for chunk ${chunkId}`);
289
+ const externalBody = await options.chunkStorage.readChunk(chunkId);
290
+ if (externalBody) {
291
+ body = externalBody;
292
+ } else if (row.body) {
293
+ body = coerceChunkRow(row.body);
294
+ } else {
295
+ throw new Error(`Snapshot chunk body missing for chunk ${chunkId}`);
296
+ }
259
297
  }
260
298
  } else {
261
299
  body = coerceChunkRow(row.body);
@@ -263,6 +301,7 @@ export async function readSnapshotChunk<DB extends SyncCoreDb>(
263
301
 
264
302
  return {
265
303
  chunkId: row.chunk_id,
304
+ partitionId: row.partition_id,
266
305
  scopeKey: row.scope_key,
267
306
  scope: row.scope,
268
307
  asOfCommitSeq: Number(row.as_of_commit_seq ?? 0),
@@ -1,7 +1,11 @@
1
- import type { ScopeValues, SyncSubscriptionRequest } from '@syncular/core';
1
+ import {
2
+ extractScopeVars,
3
+ type ScopeValues,
4
+ type SyncSubscriptionRequest,
5
+ } from '@syncular/core';
2
6
  import type { Kysely } from 'kysely';
7
+ import type { TableRegistry } from '../handlers/registry';
3
8
  import type { SyncCoreDb } from '../schema';
4
- import type { TableRegistry } from '../shapes/registry';
5
9
 
6
10
  export class InvalidSubscriptionScopeError extends Error {
7
11
  constructor(message: string) {
@@ -15,7 +19,7 @@ export class InvalidSubscriptionScopeError extends Error {
15
19
  */
16
20
  export interface ResolvedSubscription {
17
21
  id: string;
18
- shape: string;
22
+ table: string;
19
23
  scopes: ScopeValues;
20
24
  params: Record<string, unknown> | undefined;
21
25
  cursor: number;
@@ -83,12 +87,46 @@ function scopesEmpty(scopes: ScopeValues): boolean {
83
87
  return true;
84
88
  }
85
89
 
90
+ /**
91
+ * Collect valid scope keys from handler scope patterns.
92
+ */
93
+ function collectScopeKeys(scopePatterns: readonly string[]): Set<string> {
94
+ const keys = new Set<string>();
95
+ for (const pattern of scopePatterns) {
96
+ for (const key of extractScopeVars(pattern)) {
97
+ keys.add(key);
98
+ }
99
+ }
100
+ return keys;
101
+ }
102
+
103
+ function validateScopeKeys(args: {
104
+ scopeValues: ScopeValues;
105
+ validScopeKeys: Set<string>;
106
+ source: string;
107
+ subscriptionId: string;
108
+ table: string;
109
+ }): void {
110
+ for (const scopeKey of Object.keys(args.scopeValues)) {
111
+ if (args.validScopeKeys.has(scopeKey)) {
112
+ continue;
113
+ }
114
+ const expectedKeys =
115
+ args.validScopeKeys.size > 0
116
+ ? Array.from(args.validScopeKeys).sort().join(', ')
117
+ : '(none)';
118
+ throw new InvalidSubscriptionScopeError(
119
+ `Invalid scope key "${scopeKey}" in ${args.source} for subscription "${args.subscriptionId}" on table "${args.table}". Expected keys: ${expectedKeys}`
120
+ );
121
+ }
122
+ }
123
+
86
124
  /**
87
125
  * Resolve effective scopes for subscriptions.
88
126
  *
89
127
  * For each subscription:
90
- * 1. Look up the shape by subscription.shape
91
- * 2. Call shape.resolveScopes() to get allowed scopes for this actor
128
+ * 1. Look up the table handler by subscription.table
129
+ * 2. Call handler.resolveScopes() to get allowed scopes for this actor
92
130
  * 3. Intersect requested scopes with allowed scopes
93
131
  * 4. Mark as revoked if no effective scopes
94
132
  */
@@ -98,7 +136,7 @@ export async function resolveEffectiveScopesForSubscriptions<
98
136
  db: Kysely<DB>;
99
137
  actorId: string;
100
138
  subscriptions: SyncSubscriptionRequest[];
101
- shapes: TableRegistry<DB>;
139
+ handlers: TableRegistry<DB>;
102
140
  }): Promise<ResolvedSubscription[]> {
103
141
  const out: ResolvedSubscription[] = [];
104
142
  const seenIds = new Set<string>();
@@ -114,23 +152,33 @@ export async function resolveEffectiveScopesForSubscriptions<
114
152
  }
115
153
  seenIds.add(sub.id);
116
154
 
117
- if (!sub.shape || typeof sub.shape !== 'string') {
155
+ if (!sub.table || typeof sub.table !== 'string') {
118
156
  throw new InvalidSubscriptionScopeError(
119
- `Subscription ${sub.id} requires a shape (table name)`
157
+ `Subscription ${sub.id} requires a table name`
120
158
  );
121
159
  }
122
160
 
123
- const shape = args.shapes.get(sub.shape);
124
- if (!shape) {
161
+ const handler = args.handlers.get(sub.table);
162
+ if (!handler) {
125
163
  throw new InvalidSubscriptionScopeError(
126
- `Unknown shape: ${sub.shape} for subscription ${sub.id}`
164
+ `Unknown table: ${sub.table} for subscription ${sub.id}`
127
165
  );
128
166
  }
129
167
 
130
- // Get allowed scopes from the shape
168
+ const validScopeKeys = collectScopeKeys(handler.scopePatterns);
169
+ const requested = sub.scopes ?? {};
170
+ validateScopeKeys({
171
+ scopeValues: requested,
172
+ validScopeKeys,
173
+ source: 'requested scopes',
174
+ subscriptionId: sub.id,
175
+ table: sub.table,
176
+ });
177
+
178
+ // Get allowed scopes from the handler
131
179
  let allowed: ScopeValues;
132
180
  try {
133
- allowed = await shape.resolveScopes({
181
+ allowed = await handler.resolveScopes({
134
182
  db: args.db,
135
183
  actorId: args.actorId,
136
184
  });
@@ -138,12 +186,12 @@ export async function resolveEffectiveScopesForSubscriptions<
138
186
  // Scope resolution failed - mark subscription as revoked
139
187
  // rather than failing the entire pull
140
188
  console.error(
141
- `[resolveScopes] Failed for shape ${sub.shape}, subscription ${sub.id}:`,
189
+ `[resolveScopes] Failed for table ${sub.table}, subscription ${sub.id}:`,
142
190
  resolveErr
143
191
  );
144
192
  out.push({
145
193
  id: sub.id,
146
- shape: sub.shape,
194
+ table: sub.table,
147
195
  scopes: {},
148
196
  params: sub.params,
149
197
  cursor: sub.cursor,
@@ -153,14 +201,21 @@ export async function resolveEffectiveScopesForSubscriptions<
153
201
  continue;
154
202
  }
155
203
 
204
+ validateScopeKeys({
205
+ scopeValues: allowed,
206
+ validScopeKeys,
207
+ source: 'resolveScopes() result',
208
+ subscriptionId: sub.id,
209
+ table: sub.table,
210
+ });
211
+
156
212
  // Intersect with requested scopes
157
- const requested = sub.scopes ?? {};
158
213
  const effective = intersectScopes(requested, allowed);
159
214
 
160
215
  if (scopesEmpty(effective)) {
161
216
  out.push({
162
217
  id: sub.id,
163
- shape: sub.shape,
218
+ table: sub.table,
164
219
  scopes: {},
165
220
  params: sub.params,
166
221
  cursor: sub.cursor,
@@ -172,7 +227,7 @@ export async function resolveEffectiveScopesForSubscriptions<
172
227
 
173
228
  out.push({
174
229
  id: sub.id,
175
- shape: sub.shape,
230
+ table: sub.table,
176
231
  scopes: effective,
177
232
  params: sub.params,
178
233
  cursor: sub.cursor,
@@ -1 +0,0 @@
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;AAEzD;;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,CAgW9B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"create-handler.js","sourceRoot":"","sources":["../../src/shapes/create-handler.ts"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
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"}
@@ -1,4 +0,0 @@
1
- export * from './create-handler';
2
- export * from './registry';
3
- export * from './types';
4
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../src/shapes/registry.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,qBAAa,aAAa,CAAC,EAAE,SAAS,UAAU,GAAG,UAAU;IAC3D,OAAO,CAAC,MAAM,CAA6C;IAE3D,QAAQ,CAAC,OAAO,EAAE,kBAAkB,CAAC,EAAE,CAAC,GAAG,IAAI,CAgB9C;IAED,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,GAAG,SAAS,CAErD;IAED,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,CAIhD;IAED,MAAM,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CAEjC;IAED;;;OAGG;IACH,iBAAiB,IAAI,kBAAkB,CAAC,EAAE,CAAC,EAAE,CA8B5C;IAED;;;OAGG;IACH,oBAAoB,CAAC,KAAK,EAAE,MAAM,GAAG,kBAAkB,CAAC,EAAE,CAAC,EAAE,CA6B5D;CACF"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../src/shapes/registry.ts"],"names":[],"mappings":"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"}
@@ -1,63 +0,0 @@
1
- /**
2
- * @syncular/server - S3-compatible snapshot chunk storage adapter
3
- *
4
- * Stores snapshot chunk bodies in S3/R2/MinIO with metadata in database.
5
- */
6
- import type { BlobStorageAdapter } from '@syncular/core';
7
- import type { Kysely } from 'kysely';
8
- import type { SyncCoreDb } from '../../schema';
9
- export interface S3SnapshotChunkStorageOptions {
10
- /** Database instance for metadata */
11
- db: Kysely<SyncCoreDb>;
12
- /** S3 blob storage adapter */
13
- s3Adapter: BlobStorageAdapter;
14
- /** Optional key prefix for all chunks */
15
- keyPrefix?: string;
16
- }
17
- /**
18
- * Create S3-compatible snapshot chunk storage.
19
- *
20
- * Stores chunk bodies in S3/R2/MinIO and metadata in the database.
21
- * Supports presigned URLs for direct client downloads.
22
- *
23
- * @example
24
- * ```typescript
25
- * import { createS3BlobStorageAdapter } from '@syncular/server/blobs/adapters/s3';
26
- * import { createS3SnapshotChunkStorage } from '@syncular/server/snapshot-chunks/adapters/s3';
27
- *
28
- * const s3Adapter = createS3BlobStorageAdapter({
29
- * client: new S3Client({ region: 'us-east-1' }),
30
- * bucket: 'my-snapshot-chunks',
31
- * commands: { PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand },
32
- * getSignedUrl,
33
- * });
34
- *
35
- * const chunkStorage = createS3SnapshotChunkStorage({
36
- * db: kysely,
37
- * s3Adapter,
38
- * keyPrefix: 'snapshots/',
39
- * });
40
- * ```
41
- */
42
- export declare function createS3SnapshotChunkStorage(options: S3SnapshotChunkStorageOptions): {
43
- name: string;
44
- storeChunk: (metadata: Omit<import("..").SnapshotChunkMetadata, "blobHash" | "byteLength" | "chunkId"> & {
45
- body: Uint8Array<ArrayBufferLike>;
46
- }) => Promise<{
47
- id: string;
48
- byteLength: number;
49
- sha256: string;
50
- encoding: "ndjson";
51
- compression: "gzip";
52
- }>;
53
- readChunk: (chunkId: string) => Promise<Uint8Array<ArrayBufferLike> | null>;
54
- findChunk: (pageKey: import("..").SnapshotChunkPageKey) => Promise<{
55
- id: string;
56
- byteLength: number;
57
- sha256: string;
58
- encoding: "ndjson";
59
- compression: "gzip";
60
- } | null>;
61
- cleanupExpired: (beforeIso: string) => Promise<number>;
62
- };
63
- //# sourceMappingURL=s3.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"s3.d.ts","sourceRoot":"","sources":["../../../src/snapshot-chunks/adapters/s3.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACzD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAG/C,MAAM,WAAW,6BAA6B;IAC5C,qCAAqC;IACrC,EAAE,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC;IACvB,8BAA8B;IAC9B,SAAS,EAAE,kBAAkB,CAAC;IAC9B,yCAAyC;IACzC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAgB,4BAA4B,CAC1C,OAAO,EAAE,6BAA6B;;;;;;;;;;;;;;;;;;;;EAqBvC"}
@@ -1,50 +0,0 @@
1
- /**
2
- * @syncular/server - S3-compatible snapshot chunk storage adapter
3
- *
4
- * Stores snapshot chunk bodies in S3/R2/MinIO with metadata in database.
5
- */
6
- import { createDbMetadataChunkStorage } from '../db-metadata';
7
- /**
8
- * Create S3-compatible snapshot chunk storage.
9
- *
10
- * Stores chunk bodies in S3/R2/MinIO and metadata in the database.
11
- * Supports presigned URLs for direct client downloads.
12
- *
13
- * @example
14
- * ```typescript
15
- * import { createS3BlobStorageAdapter } from '@syncular/server/blobs/adapters/s3';
16
- * import { createS3SnapshotChunkStorage } from '@syncular/server/snapshot-chunks/adapters/s3';
17
- *
18
- * const s3Adapter = createS3BlobStorageAdapter({
19
- * client: new S3Client({ region: 'us-east-1' }),
20
- * bucket: 'my-snapshot-chunks',
21
- * commands: { PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand },
22
- * getSignedUrl,
23
- * });
24
- *
25
- * const chunkStorage = createS3SnapshotChunkStorage({
26
- * db: kysely,
27
- * s3Adapter,
28
- * keyPrefix: 'snapshots/',
29
- * });
30
- * ```
31
- */
32
- export function createS3SnapshotChunkStorage(options) {
33
- const { db, s3Adapter, keyPrefix } = options;
34
- // Wrap the S3 adapter to use prefixed keys
35
- const prefixedAdapter = keyPrefix
36
- ? {
37
- ...s3Adapter,
38
- name: `${s3Adapter.name}+prefixed`,
39
- // Keys are already handled by the S3 adapter, prefix is applied there
40
- }
41
- : s3Adapter;
42
- // Use the database metadata storage with S3 for bodies
43
- const storage = createDbMetadataChunkStorage({
44
- db,
45
- blobAdapter: prefixedAdapter,
46
- chunkIdPrefix: keyPrefix ? `${keyPrefix.replace(/\/$/, '')}_` : 'chunk_',
47
- });
48
- return storage;
49
- }
50
- //# sourceMappingURL=s3.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"s3.js","sourceRoot":"","sources":["../../../src/snapshot-chunks/adapters/s3.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAW9D;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,UAAU,4BAA4B,CAC1C,OAAsC,EACtC;IACA,MAAM,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,OAAO,CAAC;IAE7C,2CAA2C;IAC3C,MAAM,eAAe,GAAuB,SAAS;QACnD,CAAC,CAAC;YACE,GAAG,SAAS;YACZ,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,WAAW;YAClC,sEAAsE;SACvE;QACH,CAAC,CAAC,SAAS,CAAC;IAEd,uDAAuD;IACvD,MAAM,OAAO,GAAG,4BAA4B,CAAC;QAC3C,EAAE;QACF,WAAW,EAAE,eAAe;QAC5B,aAAa,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ;KACzE,CAAC,CAAC;IAEH,OAAO,OAAO,CAAC;AAAA,CAChB"}
@@ -1,68 +0,0 @@
1
- /**
2
- * @syncular/server - S3-compatible snapshot chunk storage adapter
3
- *
4
- * Stores snapshot chunk bodies in S3/R2/MinIO with metadata in database.
5
- */
6
-
7
- import type { BlobStorageAdapter } from '@syncular/core';
8
- import type { Kysely } from 'kysely';
9
- import type { SyncCoreDb } from '../../schema';
10
- import { createDbMetadataChunkStorage } from '../db-metadata';
11
-
12
- export interface S3SnapshotChunkStorageOptions {
13
- /** Database instance for metadata */
14
- db: Kysely<SyncCoreDb>;
15
- /** S3 blob storage adapter */
16
- s3Adapter: BlobStorageAdapter;
17
- /** Optional key prefix for all chunks */
18
- keyPrefix?: string;
19
- }
20
-
21
- /**
22
- * Create S3-compatible snapshot chunk storage.
23
- *
24
- * Stores chunk bodies in S3/R2/MinIO and metadata in the database.
25
- * Supports presigned URLs for direct client downloads.
26
- *
27
- * @example
28
- * ```typescript
29
- * import { createS3BlobStorageAdapter } from '@syncular/server/blobs/adapters/s3';
30
- * import { createS3SnapshotChunkStorage } from '@syncular/server/snapshot-chunks/adapters/s3';
31
- *
32
- * const s3Adapter = createS3BlobStorageAdapter({
33
- * client: new S3Client({ region: 'us-east-1' }),
34
- * bucket: 'my-snapshot-chunks',
35
- * commands: { PutObjectCommand, GetObjectCommand, HeadObjectCommand, DeleteObjectCommand },
36
- * getSignedUrl,
37
- * });
38
- *
39
- * const chunkStorage = createS3SnapshotChunkStorage({
40
- * db: kysely,
41
- * s3Adapter,
42
- * keyPrefix: 'snapshots/',
43
- * });
44
- * ```
45
- */
46
- export function createS3SnapshotChunkStorage(
47
- options: S3SnapshotChunkStorageOptions
48
- ) {
49
- const { db, s3Adapter, keyPrefix } = options;
50
-
51
- // Wrap the S3 adapter to use prefixed keys
52
- const prefixedAdapter: BlobStorageAdapter = keyPrefix
53
- ? {
54
- ...s3Adapter,
55
- name: `${s3Adapter.name}+prefixed`,
56
- // Keys are already handled by the S3 adapter, prefix is applied there
57
- }
58
- : s3Adapter;
59
-
60
- // Use the database metadata storage with S3 for bodies
61
- const storage = createDbMetadataChunkStorage({
62
- db,
63
- blobAdapter: prefixedAdapter,
64
- chunkIdPrefix: keyPrefix ? `${keyPrefix.replace(/\/$/, '')}_` : 'chunk_',
65
- });
66
-
67
- return storage;
68
- }
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes