@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.
- package/README.md +25 -0
- package/dist/blobs/adapters/database.d.ts.map +1 -1
- package/dist/blobs/adapters/database.js +25 -3
- package/dist/blobs/adapters/database.js.map +1 -1
- package/dist/blobs/adapters/filesystem.d.ts +31 -0
- package/dist/blobs/adapters/filesystem.d.ts.map +1 -0
- package/dist/blobs/adapters/filesystem.js +140 -0
- package/dist/blobs/adapters/filesystem.js.map +1 -0
- package/dist/blobs/adapters/s3.d.ts +3 -2
- package/dist/blobs/adapters/s3.d.ts.map +1 -1
- package/dist/blobs/adapters/s3.js +49 -0
- package/dist/blobs/adapters/s3.js.map +1 -1
- package/dist/blobs/index.d.ts +1 -0
- package/dist/blobs/index.d.ts.map +1 -1
- package/dist/blobs/index.js +6 -5
- package/dist/blobs/index.js.map +1 -1
- package/dist/clients.d.ts +1 -0
- package/dist/clients.d.ts.map +1 -1
- package/dist/clients.js.map +1 -1
- package/dist/compaction.d.ts +1 -1
- package/dist/compaction.js +1 -1
- package/dist/dialect/base.d.ts +83 -0
- package/dist/dialect/base.d.ts.map +1 -0
- package/dist/dialect/base.js +144 -0
- package/dist/dialect/base.js.map +1 -0
- package/dist/dialect/helpers.d.ts +10 -0
- package/dist/dialect/helpers.d.ts.map +1 -0
- package/dist/dialect/helpers.js +59 -0
- package/dist/dialect/helpers.js.map +1 -0
- package/dist/dialect/index.d.ts +2 -0
- package/dist/dialect/index.d.ts.map +1 -1
- package/dist/dialect/index.js +3 -1
- package/dist/dialect/index.js.map +1 -1
- package/dist/dialect/types.d.ts +38 -46
- package/dist/dialect/types.d.ts.map +1 -1
- package/dist/{shapes → handlers}/create-handler.d.ts +18 -5
- package/dist/handlers/create-handler.d.ts.map +1 -0
- package/dist/{shapes → handlers}/create-handler.js +140 -43
- package/dist/handlers/create-handler.js.map +1 -0
- package/dist/handlers/index.d.ts.map +1 -0
- package/dist/handlers/index.js +4 -0
- package/dist/handlers/index.js.map +1 -0
- package/dist/handlers/registry.d.ts.map +1 -0
- package/dist/handlers/registry.js.map +1 -0
- package/dist/{shapes → handlers}/types.d.ts +7 -7
- package/dist/{shapes → handlers}/types.d.ts.map +1 -1
- package/dist/{shapes → handlers}/types.js.map +1 -1
- package/dist/helpers/conflict.d.ts +1 -1
- package/dist/helpers/conflict.d.ts.map +1 -1
- package/dist/helpers/emitted-change.d.ts +1 -1
- package/dist/helpers/emitted-change.d.ts.map +1 -1
- package/dist/helpers/index.js +4 -4
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +17 -16
- package/dist/index.js.map +1 -1
- package/dist/notify.d.ts +47 -0
- package/dist/notify.d.ts.map +1 -0
- package/dist/notify.js +85 -0
- package/dist/notify.js.map +1 -0
- package/dist/proxy/handler.d.ts +1 -1
- package/dist/proxy/handler.d.ts.map +1 -1
- package/dist/proxy/handler.js +15 -11
- package/dist/proxy/handler.js.map +1 -1
- package/dist/proxy/index.d.ts +2 -2
- package/dist/proxy/index.d.ts.map +1 -1
- package/dist/proxy/index.js +3 -3
- package/dist/proxy/index.js.map +1 -1
- package/dist/proxy/mutation-detector.d.ts +4 -0
- package/dist/proxy/mutation-detector.d.ts.map +1 -1
- package/dist/proxy/mutation-detector.js +209 -24
- package/dist/proxy/mutation-detector.js.map +1 -1
- package/dist/proxy/oplog.d.ts +2 -1
- package/dist/proxy/oplog.d.ts.map +1 -1
- package/dist/proxy/oplog.js +15 -9
- package/dist/proxy/oplog.js.map +1 -1
- package/dist/proxy/registry.d.ts +0 -11
- package/dist/proxy/registry.d.ts.map +1 -1
- package/dist/proxy/registry.js +0 -24
- package/dist/proxy/registry.js.map +1 -1
- package/dist/proxy/types.d.ts +2 -0
- package/dist/proxy/types.d.ts.map +1 -1
- package/dist/pull.d.ts +4 -3
- package/dist/pull.d.ts.map +1 -1
- package/dist/pull.js +565 -314
- package/dist/pull.js.map +1 -1
- package/dist/push.d.ts +15 -3
- package/dist/push.d.ts.map +1 -1
- package/dist/push.js +359 -229
- package/dist/push.js.map +1 -1
- package/dist/realtime/index.js +1 -1
- package/dist/realtime/types.d.ts +2 -0
- package/dist/realtime/types.d.ts.map +1 -1
- package/dist/schema.d.ts +11 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/snapshot-chunks/db-metadata.d.ts +6 -1
- package/dist/snapshot-chunks/db-metadata.d.ts.map +1 -1
- package/dist/snapshot-chunks/db-metadata.js +261 -92
- package/dist/snapshot-chunks/db-metadata.js.map +1 -1
- package/dist/snapshot-chunks/index.d.ts +0 -1
- package/dist/snapshot-chunks/index.d.ts.map +1 -1
- package/dist/snapshot-chunks/index.js +2 -3
- package/dist/snapshot-chunks/index.js.map +1 -1
- package/dist/snapshot-chunks/types.d.ts +20 -5
- package/dist/snapshot-chunks/types.d.ts.map +1 -1
- package/dist/snapshot-chunks.d.ts +12 -8
- package/dist/snapshot-chunks.d.ts.map +1 -1
- package/dist/snapshot-chunks.js +40 -12
- package/dist/snapshot-chunks.js.map +1 -1
- package/dist/subscriptions/index.js +1 -1
- package/dist/subscriptions/resolve.d.ts +6 -6
- package/dist/subscriptions/resolve.d.ts.map +1 -1
- package/dist/subscriptions/resolve.js +53 -14
- package/dist/subscriptions/resolve.js.map +1 -1
- package/package.json +28 -7
- package/src/blobs/adapters/database.test.ts +67 -0
- package/src/blobs/adapters/database.ts +34 -9
- package/src/blobs/adapters/filesystem.test.ts +132 -0
- package/src/blobs/adapters/filesystem.ts +189 -0
- package/src/blobs/adapters/s3.test.ts +522 -0
- package/src/blobs/adapters/s3.ts +55 -2
- package/src/blobs/index.ts +1 -0
- package/src/clients.ts +1 -0
- package/src/compaction.ts +1 -1
- package/src/dialect/base.ts +292 -0
- package/src/dialect/helpers.ts +61 -0
- package/src/dialect/index.ts +2 -0
- package/src/dialect/types.ts +50 -54
- package/src/{shapes → handlers}/create-handler.ts +219 -64
- package/src/{shapes → handlers}/types.ts +10 -7
- package/src/helpers/conflict.ts +1 -1
- package/src/helpers/emitted-change.ts +1 -1
- package/src/index.ts +2 -1
- package/src/notify.test.ts +516 -0
- package/src/notify.ts +131 -0
- package/src/proxy/handler.test.ts +120 -0
- package/src/proxy/handler.ts +18 -10
- package/src/proxy/index.ts +2 -1
- package/src/proxy/mutation-detector.test.ts +71 -0
- package/src/proxy/mutation-detector.ts +227 -29
- package/src/proxy/oplog.ts +19 -10
- package/src/proxy/registry.ts +0 -33
- package/src/proxy/types.ts +2 -0
- package/src/pull.ts +788 -405
- package/src/push.ts +507 -312
- package/src/realtime/types.ts +2 -0
- package/src/schema.ts +11 -1
- package/src/snapshot-chunks/db-metadata.test.ts +169 -0
- package/src/snapshot-chunks/db-metadata.ts +347 -105
- package/src/snapshot-chunks/index.ts +0 -1
- package/src/snapshot-chunks/types.ts +31 -5
- package/src/snapshot-chunks.ts +60 -21
- package/src/subscriptions/resolve.ts +73 -18
- package/dist/shapes/create-handler.d.ts.map +0 -1
- package/dist/shapes/create-handler.js.map +0 -1
- package/dist/shapes/index.d.ts.map +0 -1
- package/dist/shapes/index.js +0 -4
- package/dist/shapes/index.js.map +0 -1
- package/dist/shapes/registry.d.ts.map +0 -1
- package/dist/shapes/registry.js.map +0 -1
- package/dist/snapshot-chunks/adapters/s3.d.ts +0 -63
- package/dist/snapshot-chunks/adapters/s3.d.ts.map +0 -1
- package/dist/snapshot-chunks/adapters/s3.js +0 -50
- package/dist/snapshot-chunks/adapters/s3.js.map +0 -1
- package/src/snapshot-chunks/adapters/s3.ts +0 -68
- /package/dist/{shapes → handlers}/index.d.ts +0 -0
- /package/dist/{shapes → handlers}/registry.d.ts +0 -0
- /package/dist/{shapes → handlers}/registry.js +0 -0
- /package/dist/{shapes → handlers}/types.js +0 -0
- /package/src/{shapes → handlers}/index.ts +0 -0
- /package/src/{shapes → handlers}/registry.ts +0 -0
package/src/snapshot-chunks.ts
CHANGED
|
@@ -5,32 +5,40 @@
|
|
|
5
5
|
* without embedding huge JSON payloads into pull responses.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
-
import
|
|
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:
|
|
19
|
-
compression:
|
|
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:
|
|
30
|
-
compression:
|
|
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
|
-
|
|
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 !==
|
|
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 !==
|
|
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:
|
|
117
|
-
compression:
|
|
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?: {
|
|
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 !==
|
|
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 !==
|
|
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
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
91
|
-
* 2. Call
|
|
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
|
-
|
|
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.
|
|
155
|
+
if (!sub.table || typeof sub.table !== 'string') {
|
|
118
156
|
throw new InvalidSubscriptionScopeError(
|
|
119
|
-
`Subscription ${sub.id} requires a
|
|
157
|
+
`Subscription ${sub.id} requires a table name`
|
|
120
158
|
);
|
|
121
159
|
}
|
|
122
160
|
|
|
123
|
-
const
|
|
124
|
-
if (!
|
|
161
|
+
const handler = args.handlers.get(sub.table);
|
|
162
|
+
if (!handler) {
|
|
125
163
|
throw new InvalidSubscriptionScopeError(
|
|
126
|
-
`Unknown
|
|
164
|
+
`Unknown table: ${sub.table} for subscription ${sub.id}`
|
|
127
165
|
);
|
|
128
166
|
}
|
|
129
167
|
|
|
130
|
-
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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"}
|
package/dist/shapes/index.js
DELETED
package/dist/shapes/index.js.map
DELETED
|
@@ -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
|