@powersync/service-core 0.0.0-dev-20241021151922 → 0.0.0-dev-20241021185145
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/CHANGELOG.md +5 -5
- package/dist/api/RouteAPI.d.ts +6 -4
- package/dist/api/diagnostics.js +3 -1
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/api/schema.js +2 -2
- package/dist/api/schema.js.map +1 -1
- package/dist/replication/AbstractReplicationJob.js +2 -2
- package/dist/replication/AbstractReplicationJob.js.map +1 -1
- package/dist/replication/ReplicationModule.js +3 -0
- package/dist/replication/ReplicationModule.js.map +1 -1
- package/dist/routes/configure-fastify.js +12 -12
- package/dist/routes/configure-fastify.js.map +1 -1
- package/dist/routes/configure-rsocket.js +4 -1
- package/dist/routes/configure-rsocket.js.map +1 -1
- package/dist/routes/endpoints/admin.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js +14 -82
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/sync-rules.js.map +1 -1
- package/dist/routes/router.d.ts +8 -1
- package/dist/routes/router.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +19 -15
- package/dist/storage/BucketStorage.js +6 -0
- package/dist/storage/BucketStorage.js.map +1 -1
- package/dist/storage/MongoBucketStorage.d.ts +9 -3
- package/dist/storage/MongoBucketStorage.js +21 -4
- package/dist/storage/MongoBucketStorage.js.map +1 -1
- package/dist/storage/StorageEngine.d.ts +5 -1
- package/dist/storage/StorageEngine.js +19 -1
- package/dist/storage/StorageEngine.js.map +1 -1
- package/dist/storage/StorageProvider.d.ts +8 -1
- package/dist/storage/mongo/MongoBucketBatch.d.ts +2 -2
- package/dist/storage/mongo/MongoBucketBatch.js +1 -0
- package/dist/storage/mongo/MongoBucketBatch.js.map +1 -1
- package/dist/storage/mongo/MongoStorageProvider.js +2 -1
- package/dist/storage/mongo/MongoStorageProvider.js.map +1 -1
- package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +3 -13
- package/dist/storage/mongo/MongoSyncBucketStorage.js +7 -35
- package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
- package/dist/storage/mongo/MongoWriteCheckpointAPI.d.ts +2 -4
- package/dist/storage/mongo/MongoWriteCheckpointAPI.js +7 -13
- package/dist/storage/mongo/MongoWriteCheckpointAPI.js.map +1 -1
- package/dist/storage/storage-index.d.ts +2 -2
- package/dist/storage/storage-index.js +2 -2
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/{WriteCheckpointAPI.d.ts → write-checkpoint.d.ts} +9 -28
- package/dist/storage/{WriteCheckpointAPI.js → write-checkpoint.js} +1 -1
- package/dist/storage/write-checkpoint.js.map +1 -0
- package/dist/util/config/compound-config-collector.js +1 -2
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/types.d.ts +0 -1
- package/dist/util/protocol-types.d.ts +2 -1
- package/package.json +5 -5
- package/src/api/RouteAPI.ts +7 -4
- package/src/api/diagnostics.ts +3 -1
- package/src/api/schema.ts +3 -3
- package/src/replication/AbstractReplicationJob.ts +2 -2
- package/src/replication/ReplicationModule.ts +4 -0
- package/src/routes/configure-fastify.ts +16 -17
- package/src/routes/configure-rsocket.ts +7 -2
- package/src/routes/endpoints/admin.ts +2 -2
- package/src/routes/endpoints/checkpointing.ts +1 -8
- package/src/routes/endpoints/sync-rules.ts +1 -0
- package/src/routes/router.ts +7 -1
- package/src/storage/BucketStorage.ts +23 -16
- package/src/storage/MongoBucketStorage.ts +39 -9
- package/src/storage/StorageEngine.ts +24 -2
- package/src/storage/StorageProvider.ts +9 -1
- package/src/storage/mongo/MongoBucketBatch.ts +3 -2
- package/src/storage/mongo/MongoStorageProvider.ts +2 -1
- package/src/storage/mongo/MongoSyncBucketStorage.ts +9 -52
- package/src/storage/mongo/MongoWriteCheckpointAPI.ts +8 -16
- package/src/storage/storage-index.ts +2 -2
- package/src/storage/{WriteCheckpointAPI.ts → write-checkpoint.ts} +12 -30
- package/src/util/config/compound-config-collector.ts +1 -2
- package/src/util/config/types.ts +0 -1
- package/src/util/protocol-types.ts +1 -1
- package/test/src/compacting.test.ts +13 -15
- package/test/src/data_storage.test.ts +56 -56
- package/test/src/sync.test.ts +10 -9
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/storage/WriteCheckpointAPI.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MongoWriteCheckpointAPI.js","sourceRoot":"","sources":["../../../src/storage/mongo/MongoWriteCheckpointAPI.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,SAAS,MAAM,mCAAmC,CAAC;AAC/D,OAAO,EAOL,mBAAmB,EACpB,MAAM,
|
|
1
|
+
{"version":3,"file":"MongoWriteCheckpointAPI.js","sourceRoot":"","sources":["../../../src/storage/mongo/MongoWriteCheckpointAPI.ts"],"names":[],"mappings":"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"}
|
|
@@ -4,7 +4,6 @@ export * from './ReplicationEventPayload.js';
|
|
|
4
4
|
export * from './SourceEntity.js';
|
|
5
5
|
export * from './SourceTable.js';
|
|
6
6
|
export * from './StorageEngine.js';
|
|
7
|
-
export * from './mongo/config.js';
|
|
8
7
|
export * from './mongo/db.js';
|
|
9
8
|
export * from './mongo/models.js';
|
|
10
9
|
export * from './mongo/MongoBucketBatch.js';
|
|
@@ -17,4 +16,5 @@ export * from './mongo/MongoSyncRulesLock.js';
|
|
|
17
16
|
export * from './mongo/OperationBatch.js';
|
|
18
17
|
export * from './mongo/PersistedBatch.js';
|
|
19
18
|
export * from './mongo/util.js';
|
|
20
|
-
export * from './
|
|
19
|
+
export * from './mongo/config.js';
|
|
20
|
+
export * from './write-checkpoint.js';
|
|
@@ -4,7 +4,6 @@ export * from './ReplicationEventPayload.js';
|
|
|
4
4
|
export * from './SourceEntity.js';
|
|
5
5
|
export * from './SourceTable.js';
|
|
6
6
|
export * from './StorageEngine.js';
|
|
7
|
-
export * from './mongo/config.js';
|
|
8
7
|
export * from './mongo/db.js';
|
|
9
8
|
export * from './mongo/models.js';
|
|
10
9
|
export * from './mongo/MongoBucketBatch.js';
|
|
@@ -17,5 +16,6 @@ export * from './mongo/MongoSyncRulesLock.js';
|
|
|
17
16
|
export * from './mongo/OperationBatch.js';
|
|
18
17
|
export * from './mongo/PersistedBatch.js';
|
|
19
18
|
export * from './mongo/util.js';
|
|
20
|
-
export * from './
|
|
19
|
+
export * from './mongo/config.js';
|
|
20
|
+
export * from './write-checkpoint.js';
|
|
21
21
|
//# sourceMappingURL=storage-index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"storage-index.js","sourceRoot":"","sources":["../../src/storage/storage-index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,
|
|
1
|
+
{"version":3,"file":"storage-index.js","sourceRoot":"","sources":["../../src/storage/storage-index.ts"],"names":[],"mappings":"AAAA,cAAc,oBAAoB,CAAC;AACnC,cAAc,yBAAyB,CAAC;AACxC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mBAAmB,CAAC;AAClC,cAAc,kBAAkB,CAAC;AACjC,cAAc,oBAAoB,CAAC;AAEnC,cAAc,eAAe,CAAC;AAC9B,cAAc,mBAAmB,CAAC;AAClC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oCAAoC,CAAC;AACnD,cAAc,2CAA2C,CAAC;AAC1D,cAAc,iCAAiC,CAAC;AAChD,cAAc,mCAAmC,CAAC;AAClD,cAAc,+BAA+B,CAAC;AAC9C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,2BAA2B,CAAC;AAC1C,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,uBAAuB,CAAC"}
|
|
@@ -23,18 +23,18 @@ export interface CustomWriteCheckpointFilters extends BaseWriteCheckpointIdentif
|
|
|
23
23
|
*/
|
|
24
24
|
sync_rules_id: number;
|
|
25
25
|
}
|
|
26
|
-
export interface
|
|
26
|
+
export interface CustomWriteCheckpointOptions extends CustomWriteCheckpointFilters {
|
|
27
27
|
/**
|
|
28
28
|
* A supplied incrementing Write Checkpoint number
|
|
29
29
|
*/
|
|
30
30
|
checkpoint: bigint;
|
|
31
31
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
32
|
+
/**
|
|
33
|
+
* Options for creating a custom Write Checkpoint in a batch.
|
|
34
|
+
* A {@link BucketStorageBatch} is already associated with a Sync Rules instance.
|
|
35
|
+
* The `sync_rules_id` is not required here.
|
|
36
|
+
*/
|
|
37
|
+
export type BatchedCustomWriteCheckpointOptions = Omit<CustomWriteCheckpointOptions, 'sync_rules_id'>;
|
|
38
38
|
/**
|
|
39
39
|
* Managed Write Checkpoints are a mapping of User ID to replication HEAD
|
|
40
40
|
*/
|
|
@@ -45,30 +45,11 @@ export interface ManagedWriteCheckpointFilters extends BaseWriteCheckpointIdenti
|
|
|
45
45
|
heads: Record<string, string>;
|
|
46
46
|
}
|
|
47
47
|
export type ManagedWriteCheckpointOptions = ManagedWriteCheckpointFilters;
|
|
48
|
-
export type SyncStorageLastWriteCheckpointFilters = BaseWriteCheckpointIdentifier | ManagedWriteCheckpointFilters;
|
|
49
48
|
export type LastWriteCheckpointFilters = CustomWriteCheckpointFilters | ManagedWriteCheckpointFilters;
|
|
50
|
-
export interface
|
|
51
|
-
readonly writeCheckpointMode: WriteCheckpointMode;
|
|
52
|
-
setWriteCheckpointMode(mode: WriteCheckpointMode): void;
|
|
53
|
-
createManagedWriteCheckpoint(checkpoint: ManagedWriteCheckpointOptions): Promise<bigint>;
|
|
54
|
-
}
|
|
55
|
-
/**
|
|
56
|
-
* Write Checkpoint API to be used in conjunction with a {@link SyncRulesBucketStorage}.
|
|
57
|
-
* This storage corresponds with a set of sync rules. These APIs don't require specifying a
|
|
58
|
-
* sync rules id.
|
|
59
|
-
*/
|
|
60
|
-
export interface SyncStorageWriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
61
|
-
batchCreateCustomWriteCheckpoints(checkpoints: BatchedCustomWriteCheckpointOptions[]): Promise<void>;
|
|
62
|
-
createCustomWriteCheckpoint(checkpoint: BatchedCustomWriteCheckpointOptions): Promise<bigint>;
|
|
63
|
-
lastWriteCheckpoint(filters: SyncStorageLastWriteCheckpointFilters): Promise<bigint | null>;
|
|
64
|
-
}
|
|
65
|
-
/**
|
|
66
|
-
* Write Checkpoint API which is interfaced directly with the storage layer. This requires
|
|
67
|
-
* sync rules identifiers for custom write checkpoints.
|
|
68
|
-
*/
|
|
69
|
-
export interface WriteCheckpointAPI extends BaseWriteCheckpointAPI {
|
|
49
|
+
export interface WriteCheckpointAPI {
|
|
70
50
|
batchCreateCustomWriteCheckpoints(checkpoints: CustomWriteCheckpointOptions[]): Promise<void>;
|
|
71
51
|
createCustomWriteCheckpoint(checkpoint: CustomWriteCheckpointOptions): Promise<bigint>;
|
|
52
|
+
createManagedWriteCheckpoint(checkpoint: ManagedWriteCheckpointOptions): Promise<bigint>;
|
|
72
53
|
lastWriteCheckpoint(filters: LastWriteCheckpointFilters): Promise<bigint | null>;
|
|
73
54
|
}
|
|
74
55
|
export declare const DEFAULT_WRITE_CHECKPOINT_MODE = WriteCheckpointMode.MANAGED;
|
|
@@ -13,4 +13,4 @@ export var WriteCheckpointMode;
|
|
|
13
13
|
WriteCheckpointMode["MANAGED"] = "managed";
|
|
14
14
|
})(WriteCheckpointMode || (WriteCheckpointMode = {}));
|
|
15
15
|
export const DEFAULT_WRITE_CHECKPOINT_MODE = WriteCheckpointMode.MANAGED;
|
|
16
|
-
//# sourceMappingURL=
|
|
16
|
+
//# sourceMappingURL=write-checkpoint.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-checkpoint.js","sourceRoot":"","sources":["../../src/storage/write-checkpoint.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,mBAYX;AAZD,WAAY,mBAAmB;IAC7B;;;OAGG;IACH,wCAAiB,CAAA;IACjB;;;;OAIG;IACH,0CAAmB,CAAA;AACrB,CAAC,EAZW,mBAAmB,KAAnB,mBAAmB,QAY9B;AAsDD,MAAM,CAAC,MAAM,6BAA6B,GAAG,mBAAmB,CAAC,OAAO,CAAC"}
|
|
@@ -75,8 +75,7 @@ export class CompoundConfigCollector {
|
|
|
75
75
|
},
|
|
76
76
|
// TODO maybe move this out of the connection or something
|
|
77
77
|
// slot_name_prefix: connections[0]?.slot_name_prefix ?? 'powersync_'
|
|
78
|
-
slot_name_prefix: 'powersync_'
|
|
79
|
-
parameters: baseConfig.parameters ?? {}
|
|
78
|
+
slot_name_prefix: 'powersync_'
|
|
80
79
|
};
|
|
81
80
|
return config;
|
|
82
81
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compound-config-collector.js","sourceRoot":"","sources":["../../../src/util/config/compound-config-collector.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"compound-config-collector.js","sourceRoot":"","sources":["../../../src/util/config/compound-config-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,OAAO,KAAK,IAAI,MAAM,0BAA0B,CAAC;AAEjD,OAAO,EAAE,qBAAqB,EAAE,MAAM,8CAA8C,CAAC;AACrF,OAAO,EAAE,uBAAuB,EAAE,MAAM,gDAAgD,CAAC;AACzF,OAAO,EAAE,yBAAyB,EAAE,MAAM,kDAAkD,CAAC;AAC7F,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AAC5F,OAAO,EAAE,4BAA4B,EAAE,MAAM,sDAAsD,CAAC;AACpG,OAAO,EAAE,wBAAwB,EAAE,MAAM,kDAAkD,CAAC;AA4B5F,MAAM,iBAAiB,GAAG,eAAe,CAAC;AAE1C,MAAM,yBAAyB,GAAmC;IAChE,gBAAgB,EAAE,CAAC,IAAI,qBAAqB,EAAE,EAAE,IAAI,yBAAyB,EAAE,EAAE,IAAI,uBAAuB,EAAE,CAAC;IAC/G,mBAAmB,EAAE;QACnB,IAAI,wBAAwB,EAAE;QAC9B,IAAI,4BAA4B,EAAE;QAClC,IAAI,wBAAwB,EAAE;KAC/B;CACF,CAAC;AAEF,MAAM,OAAO,uBAAuB;IAClC,YAAsB,UAA0C,yBAAyB;QAAnE,YAAO,GAAP,OAAO,CAA4D;IAAG,CAAC;IAE7F;;OAEG;IACH,KAAK,CAAC,aAAa,CAAC,eAA6B,EAAE;QACjD,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,YAAY,CAAC,CAAC;QAE9D,MAAM,WAAW,GAAG,UAAU,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE,CAAC;QAC9D,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;QAClF,CAAC;QAED,MAAM,UAAU,GAAG,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;QACnD,MAAM,QAAQ,GAAG,IAAI,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAE/C,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC;QAC3D,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAE5E,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;QAEhC,IAAI,SAAS,GAAG,UAAU,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;QACvD,IAAI,OAAO,SAAS,IAAI,QAAQ,EAAE,CAAC;YACjC,SAAS,GAAG,CAAC,SAAS,CAAC,CAAC;QAC1B,CAAC;QAED,KAAK,IAAI,GAAG,IAAI,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,GAAG,CACZ,IAAI,IAAI,CAAC,kBAAkB,CACzB,IAAI,IAAI,CAAC,mBAAmB,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,gBAAgB,EAAE,CAAC,CAClG,CACF,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,IAAI,EAAE,IAAI,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,IAAI,iBAAiB,CAAC,CAAC;QAE1G,IAAI,MAAgC,CAAC;QACrC,IAAI,UAAU,CAAC,GAAG,EAAE,SAAS,IAAI,UAAU,IAAI,IAAI,IAAI,UAAU,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;YAC/E,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;QAED,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;QAEzE,IAAI,aAAa,GAAa,UAAU,CAAC,WAAW,EAAE,QAAQ,IAAI,EAAE,CAAC;QAErE,IAAI,MAAM,GAA4B;YACpC,WAAW,EAAE,UAAU;YACvB,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,WAAW,IAAI,EAAE;YACtD,OAAO,EAAE,UAAU,CAAC,OAAO;YAC3B,eAAe,EAAE,QAAQ;YACzB,+DAA+D;YAC/D,mEAAmE;YACnE,mBAAmB,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC;YACvD,UAAU,EAAE,UAAU,CAAC,GAAG,EAAE,MAAM,IAAI,EAAE;YACxC,GAAG,EAAE;gBACH,SAAS,EAAE,UAAU,CAAC,GAAG,EAAE,SAAS,IAAI,KAAK;gBAC7C,WAAW,EAAE,UAAU,CAAC,GAAG,EAAE,WAAW,IAAI,KAAK;gBACjD,aAAa,EAAE,UAAU,CAAC,GAAG,EAAE,aAAa;gBAC5C,QAAQ,EAAE,UAAU,CAAC,GAAG,EAAE,QAAQ,IAAI,KAAK;gBAC3C,OAAO,EAAE,MAAM;aAChB;YACD,IAAI,EAAE,UAAU,CAAC,IAAI,IAAI,IAAI;YAC7B,UAAU;YACV,aAAa;YAEb,oBAAoB,EAAE,IAAI,EAAE,QAAQ;YACpC,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,EAAE;YACnC,UAAU,EAAE,UAAU,CAAC,UAAU;YACjC,SAAS,EAAE;gBACT,yBAAyB,EAAE,UAAU,CAAC,SAAS,EAAE,yBAAyB,IAAI,KAAK;gBACnF,yBAAyB,EACvB,UAAU,CAAC,SAAS,EAAE,yBAAyB,IAAI,0CAA0C;aAChG;YACD,0DAA0D;YAC1D,qEAAqE;YACrE,gBAAgB,EAAE,YAAY;SAC/B,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED;;;OAGG;IACO,KAAK,CAAC,iBAAiB,CAAC,aAA2B;QAC3D,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;YACtD,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;gBAC1D,IAAI,UAAU,EAAE,CAAC;oBACf,OAAO,UAAU,CAAC;gBACpB,CAAC;gBACD,MAAM,CAAC,KAAK,CACV,2CAA2C,SAAS,CAAC,IAAI,iDAAiD,CAC3G,CAAC;YACJ,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,yCAAyC;gBACzC,MAAM,IAAI,KAAK,CAAC,kCAAkC,SAAS,CAAC,IAAI,8BAA8B,EAAE,EAAE,CAAC,CAAC;YACtG,CAAC;QACH,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uFAAuF,CAAC,CAAC;IAC3G,CAAC;IAES,KAAK,CAAC,gBAAgB,CAC9B,UAAsC,EACtC,YAA0B;QAE1B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,OAAO,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;gBACjE,IAAI,MAAM,EAAE,CAAC;oBACX,OAAO,MAAM,CAAC;gBAChB,CAAC;gBACD,MAAM,CAAC,KAAK,CACV,qCAAqC,SAAS,CAAC,IAAI,iDAAiD,CACrG,CAAC;YACJ,CAAC;YAAC,OAAO,EAAE,EAAE,CAAC;gBACZ,yCAAyC;gBACzC,MAAM,IAAI,KAAK,CAAC,sCAAsC,SAAS,CAAC,IAAI,8BAA8B,EAAE,EAAE,CAAC,CAAC;YAC1G,CAAC;QACH,CAAC;QACD,OAAO;YACL,OAAO,EAAE,KAAK;SACf,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -71,7 +71,7 @@ export type StreamingSyncLine = StreamingSyncData | StreamingSyncCheckpoint | St
|
|
|
71
71
|
* 64-bit unsigned number, as a base-10 string.
|
|
72
72
|
*/
|
|
73
73
|
export type OpId = string;
|
|
74
|
-
|
|
74
|
+
interface Checkpoint {
|
|
75
75
|
last_op_id: OpId;
|
|
76
76
|
write_checkpoint?: OpId;
|
|
77
77
|
buckets: BucketChecksum[];
|
|
@@ -119,3 +119,4 @@ export interface BucketChecksum {
|
|
|
119
119
|
*/
|
|
120
120
|
count: number;
|
|
121
121
|
}
|
|
122
|
+
export {};
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.0.0-dev-
|
|
8
|
+
"version": "0.0.0-dev-20241021185145",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
"uuid": "^9.0.1",
|
|
34
34
|
"winston": "^3.13.0",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
36
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20241021185145",
|
|
37
37
|
"@powersync/service-jsonbig": "0.17.10",
|
|
38
|
-
"@powersync/service-rsocket-router": "0.0.0-dev-
|
|
39
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
40
|
-
"@powersync/service-types": "0.0.0-dev-
|
|
38
|
+
"@powersync/service-rsocket-router": "0.0.0-dev-20241021185145",
|
|
39
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20241021185145",
|
|
40
|
+
"@powersync/service-types": "0.0.0-dev-20241021185145"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
|
43
43
|
"@types/async": "^3.2.24",
|
package/src/api/RouteAPI.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { SqlSyncRules, TablePattern } from '@powersync/service-sync-rules';
|
|
2
2
|
import * as types from '@powersync/service-types';
|
|
3
|
-
import { ParseSyncRulesOptions } from '../storage/BucketStorage.js';
|
|
3
|
+
import { ParseSyncRulesOptions, SyncRulesBucketStorage } from '../storage/BucketStorage.js';
|
|
4
4
|
|
|
5
5
|
export interface PatternResult {
|
|
6
6
|
schema: string;
|
|
@@ -10,6 +10,10 @@ export interface PatternResult {
|
|
|
10
10
|
table?: types.TableInfo;
|
|
11
11
|
}
|
|
12
12
|
|
|
13
|
+
export interface ReplicationLagOptions {
|
|
14
|
+
bucketStorage: SyncRulesBucketStorage;
|
|
15
|
+
}
|
|
16
|
+
|
|
13
17
|
/**
|
|
14
18
|
* Describes all the methods currently required to service the sync API endpoints.
|
|
15
19
|
*/
|
|
@@ -17,7 +21,7 @@ export interface RouteAPI {
|
|
|
17
21
|
/**
|
|
18
22
|
* @returns basic identification of the connection
|
|
19
23
|
*/
|
|
20
|
-
getSourceConfig(): Promise<types.configFile.
|
|
24
|
+
getSourceConfig(): Promise<types.configFile.ResolvedDataSourceConfig>;
|
|
21
25
|
|
|
22
26
|
/**
|
|
23
27
|
* Checks the current connection status of the data source.
|
|
@@ -42,9 +46,8 @@ export interface RouteAPI {
|
|
|
42
46
|
/**
|
|
43
47
|
* @returns The replication lag: that is the amount of data which has not been
|
|
44
48
|
* replicated yet, in bytes.
|
|
45
|
-
* @param {string} syncRulesId An identifier representing which set of sync rules the lag is required for.
|
|
46
49
|
*/
|
|
47
|
-
getReplicationLag(
|
|
50
|
+
getReplicationLag(options: ReplicationLagOptions): Promise<number | undefined>;
|
|
48
51
|
|
|
49
52
|
/**
|
|
50
53
|
* Get the current LSN or equivalent replication HEAD position identifier
|
package/src/api/diagnostics.ts
CHANGED
|
@@ -78,7 +78,9 @@ export async function getSyncRulesStatus(
|
|
|
78
78
|
|
|
79
79
|
if (systemStorage) {
|
|
80
80
|
try {
|
|
81
|
-
replication_lag_bytes = await apiHandler.getReplicationLag(
|
|
81
|
+
replication_lag_bytes = await apiHandler.getReplicationLag({
|
|
82
|
+
bucketStorage: systemStorage
|
|
83
|
+
});
|
|
82
84
|
} catch (e) {
|
|
83
85
|
// Ignore
|
|
84
86
|
logger.warn(`Unable to get replication lag`, e);
|
package/src/api/schema.ts
CHANGED
|
@@ -16,9 +16,9 @@ export async function getConnectionsSchema(api: api.RouteAPI): Promise<internal_
|
|
|
16
16
|
return {
|
|
17
17
|
connections: [
|
|
18
18
|
{
|
|
19
|
-
|
|
20
|
-
tag: baseConfig.tag
|
|
21
|
-
|
|
19
|
+
id: baseConfig.id,
|
|
20
|
+
tag: baseConfig.tag,
|
|
21
|
+
schemas: await api.getConnectionSchema()
|
|
22
22
|
}
|
|
23
23
|
],
|
|
24
24
|
defaultConnectionTag: baseConfig.tag!,
|
|
@@ -16,7 +16,7 @@ export abstract class AbstractReplicationJob {
|
|
|
16
16
|
protected isReplicatingPromise: Promise<void> | null = null;
|
|
17
17
|
|
|
18
18
|
protected constructor(protected options: AbstractReplicationJobOptions) {
|
|
19
|
-
this.logger = logger.child({ name: `ReplicationJob: ${
|
|
19
|
+
this.logger = logger.child({ name: `ReplicationJob: ${this.id}` });
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
/**
|
|
@@ -52,7 +52,7 @@ export abstract class AbstractReplicationJob {
|
|
|
52
52
|
* Safely stop the replication process
|
|
53
53
|
*/
|
|
54
54
|
public async stop(): Promise<void> {
|
|
55
|
-
this.logger.info(`Stopping
|
|
55
|
+
this.logger.info(`Stopping replication job for sync rule iteration: ${this.storage.group_id}`);
|
|
56
56
|
this.abortController.abort();
|
|
57
57
|
await this.isReplicatingPromise;
|
|
58
58
|
}
|
|
@@ -58,6 +58,10 @@ export abstract class ReplicationModule<TConfig extends DataSourceConfig> extend
|
|
|
58
58
|
return;
|
|
59
59
|
}
|
|
60
60
|
|
|
61
|
+
if (!matchingConfig.length) {
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
|
|
61
65
|
if (matchingConfig.length > 1) {
|
|
62
66
|
this.logger.warning(
|
|
63
67
|
`Multiple data sources of type ${this.type} found in the configuration. Only the first will be used.`
|
|
@@ -8,7 +8,7 @@ import { CHECKPOINT_ROUTES } from './endpoints/checkpointing.js';
|
|
|
8
8
|
import { SYNC_RULES_ROUTES } from './endpoints/sync-rules.js';
|
|
9
9
|
import { SYNC_STREAM_ROUTES } from './endpoints/sync-stream.js';
|
|
10
10
|
import { createRequestQueueHook, CreateRequestQueueParams } from './hooks.js';
|
|
11
|
-
import { RouteDefinition } from './router.js';
|
|
11
|
+
import { RouteDefinition, RouterServiceContext } from './router.js';
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* A list of route definitions to be registered as endpoints.
|
|
@@ -56,6 +56,19 @@ export const DEFAULT_ROUTE_OPTIONS = {
|
|
|
56
56
|
*/
|
|
57
57
|
export function configureFastifyServer(server: fastify.FastifyInstance, options: FastifyServerConfig) {
|
|
58
58
|
const { service_context, routes = DEFAULT_ROUTE_OPTIONS } = options;
|
|
59
|
+
|
|
60
|
+
const generateContext = async () => {
|
|
61
|
+
const { routerEngine } = service_context;
|
|
62
|
+
if (!routerEngine) {
|
|
63
|
+
throw new Error(`RouterEngine has not been registered`);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
return {
|
|
67
|
+
user_id: undefined,
|
|
68
|
+
service_context: service_context as RouterServiceContext
|
|
69
|
+
};
|
|
70
|
+
};
|
|
71
|
+
|
|
59
72
|
/**
|
|
60
73
|
* Fastify creates an encapsulated context for each `.register` call.
|
|
61
74
|
* Creating a separate context here to separate the concurrency limits for Admin APIs
|
|
@@ -63,16 +76,7 @@ export function configureFastifyServer(server: fastify.FastifyInstance, options:
|
|
|
63
76
|
* https://github.com/fastify/fastify/blob/main/docs/Reference/Encapsulation.md
|
|
64
77
|
*/
|
|
65
78
|
server.register(async function (childContext) {
|
|
66
|
-
registerFastifyRoutes(
|
|
67
|
-
childContext,
|
|
68
|
-
async () => {
|
|
69
|
-
return {
|
|
70
|
-
user_id: undefined,
|
|
71
|
-
service_context
|
|
72
|
-
};
|
|
73
|
-
},
|
|
74
|
-
routes.api?.routes ?? DEFAULT_ROUTE_OPTIONS.api.routes
|
|
75
|
-
);
|
|
79
|
+
registerFastifyRoutes(childContext, generateContext, routes.api?.routes ?? DEFAULT_ROUTE_OPTIONS.api.routes);
|
|
76
80
|
// Limit the active concurrent requests
|
|
77
81
|
childContext.addHook(
|
|
78
82
|
'onRequest',
|
|
@@ -84,12 +88,7 @@ export function configureFastifyServer(server: fastify.FastifyInstance, options:
|
|
|
84
88
|
server.register(async function (childContext) {
|
|
85
89
|
registerFastifyRoutes(
|
|
86
90
|
childContext,
|
|
87
|
-
|
|
88
|
-
return {
|
|
89
|
-
user_id: undefined,
|
|
90
|
-
service_context
|
|
91
|
-
};
|
|
92
|
-
},
|
|
91
|
+
generateContext,
|
|
93
92
|
routes.sync_stream?.routes ?? DEFAULT_ROUTE_OPTIONS.sync_stream.routes
|
|
94
93
|
);
|
|
95
94
|
// Limit the active concurrent requests
|
|
@@ -8,7 +8,7 @@ import { ServiceContext } from '../system/ServiceContext.js';
|
|
|
8
8
|
import { generateContext, getTokenFromHeader } from './auth.js';
|
|
9
9
|
import { syncStreamReactive } from './endpoints/socket-route.js';
|
|
10
10
|
import { RSocketContextMeta, SocketRouteGenerator } from './router-socket.js';
|
|
11
|
-
import { Context } from './router.js';
|
|
11
|
+
import { Context, RouterServiceContext } from './router.js';
|
|
12
12
|
|
|
13
13
|
export type RSockerRouterConfig = {
|
|
14
14
|
service_context: ServiceContext;
|
|
@@ -36,12 +36,17 @@ export function configureRSocket(router: ReactiveSocketRouter<Context>, options:
|
|
|
36
36
|
if (context?.token_payload == null) {
|
|
37
37
|
throw new errors.AuthorizationError(token_errors ?? 'Authentication required');
|
|
38
38
|
}
|
|
39
|
+
|
|
40
|
+
if (!service_context.routerEngine) {
|
|
41
|
+
throw new Error(`RouterEngine has not been registered`);
|
|
42
|
+
}
|
|
43
|
+
|
|
39
44
|
return {
|
|
40
45
|
token,
|
|
41
46
|
user_agent,
|
|
42
47
|
...context,
|
|
43
48
|
token_errors: token_errors,
|
|
44
|
-
service_context
|
|
49
|
+
service_context: service_context as RouterServiceContext
|
|
45
50
|
};
|
|
46
51
|
} else {
|
|
47
52
|
throw new errors.AuthorizationError('No token provided');
|
|
@@ -137,8 +137,8 @@ export const reprocess = routeDefinition({
|
|
|
137
137
|
connections: [
|
|
138
138
|
{
|
|
139
139
|
// Previously the connection was asserted with `!`
|
|
140
|
-
tag: baseConfig
|
|
141
|
-
id: baseConfig
|
|
140
|
+
tag: baseConfig.tag,
|
|
141
|
+
id: baseConfig.id,
|
|
142
142
|
slot_name: new_rules.slot_name
|
|
143
143
|
}
|
|
144
144
|
]
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { logger, router, schema } from '@powersync/lib-services-framework';
|
|
2
2
|
import * as t from 'ts-codec';
|
|
3
3
|
|
|
4
|
-
import * as framework from '@powersync/lib-services-framework';
|
|
5
4
|
import * as util from '../../util/util-index.js';
|
|
6
5
|
import { authUser } from '../auth.js';
|
|
7
6
|
import { routeDefinition } from '../router.js';
|
|
@@ -64,13 +63,7 @@ export const writeCheckpoint2 = routeDefinition({
|
|
|
64
63
|
storageEngine: { activeBucketStorage }
|
|
65
64
|
} = service_context;
|
|
66
65
|
|
|
67
|
-
const
|
|
68
|
-
if (!activeSyncRules) {
|
|
69
|
-
throw new framework.errors.ValidationError(`Cannot create Write Checkpoint since no sync rules are active.`);
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
using syncBucketStorage = activeBucketStorage.getInstance(activeSyncRules);
|
|
73
|
-
const writeCheckpoint = await syncBucketStorage.createManagedWriteCheckpoint({
|
|
66
|
+
const writeCheckpoint = await activeBucketStorage.createManagedWriteCheckpoint({
|
|
74
67
|
user_id: full_user_id,
|
|
75
68
|
heads: { '1': currentCheckpoint }
|
|
76
69
|
});
|
|
@@ -3,6 +3,7 @@ import { SqlSyncRules, SyncRulesErrors } from '@powersync/service-sync-rules';
|
|
|
3
3
|
import type { FastifyPluginAsync } from 'fastify';
|
|
4
4
|
import * as t from 'ts-codec';
|
|
5
5
|
|
|
6
|
+
import * as system from '../../system/system-index.js';
|
|
6
7
|
import { authApi } from '../auth.js';
|
|
7
8
|
import { routeDefinition } from '../router.js';
|
|
8
9
|
import { RouteAPI } from '../../api/RouteAPI.js';
|
package/src/routes/router.ts
CHANGED
|
@@ -1,13 +1,19 @@
|
|
|
1
1
|
import { router } from '@powersync/lib-services-framework';
|
|
2
2
|
import * as auth from '../auth/auth-index.js';
|
|
3
3
|
import { ServiceContext } from '../system/ServiceContext.js';
|
|
4
|
+
import { RouterEngine } from './RouterEngine.js';
|
|
4
5
|
|
|
6
|
+
/**
|
|
7
|
+
* The {@link RouterEngine} must be provided for these routes
|
|
8
|
+
*/
|
|
9
|
+
export type RouterServiceContext = ServiceContext & { routerEngine: RouterEngine };
|
|
5
10
|
/**
|
|
6
11
|
* Common context for routes
|
|
7
12
|
*/
|
|
8
13
|
export type Context = {
|
|
9
14
|
user_id?: string;
|
|
10
|
-
|
|
15
|
+
|
|
16
|
+
service_context: RouterServiceContext;
|
|
11
17
|
|
|
12
18
|
token_payload?: auth.JwtPayload;
|
|
13
19
|
token_errors?: string[];
|
|
@@ -12,15 +12,16 @@ import * as util from '../util/util-index.js';
|
|
|
12
12
|
import { ReplicationEventPayload } from './ReplicationEventPayload.js';
|
|
13
13
|
import { SourceEntityDescriptor } from './SourceEntity.js';
|
|
14
14
|
import { SourceTable } from './SourceTable.js';
|
|
15
|
-
import { BatchedCustomWriteCheckpointOptions, ReplicaId } from './storage-index.js';
|
|
16
|
-
import { SyncStorageWriteCheckpointAPI } from './WriteCheckpointAPI.js';
|
|
15
|
+
import { BatchedCustomWriteCheckpointOptions, ReplicaId, WriteCheckpointAPI } from './storage-index.js';
|
|
17
16
|
|
|
18
17
|
export interface BucketStorageFactoryListener extends DisposableListener {
|
|
19
18
|
syncStorageCreated: (storage: SyncRulesBucketStorage) => void;
|
|
20
19
|
replicationEvent: (event: ReplicationEventPayload) => void;
|
|
21
20
|
}
|
|
22
21
|
|
|
23
|
-
export interface BucketStorageFactory
|
|
22
|
+
export interface BucketStorageFactory
|
|
23
|
+
extends DisposableObserverClient<BucketStorageFactoryListener>,
|
|
24
|
+
WriteCheckpointAPI {
|
|
24
25
|
/**
|
|
25
26
|
* Update sync rules from configuration, if changed.
|
|
26
27
|
*/
|
|
@@ -105,20 +106,22 @@ export interface BucketStorageFactory extends DisposableObserverClient<BucketSto
|
|
|
105
106
|
getPowerSyncInstanceId(): Promise<string>;
|
|
106
107
|
}
|
|
107
108
|
|
|
108
|
-
export interface
|
|
109
|
-
base: ActiveCheckpoint;
|
|
110
|
-
writeCheckpoint: bigint | null;
|
|
111
|
-
}
|
|
112
|
-
|
|
113
|
-
export interface ActiveCheckpoint {
|
|
109
|
+
export interface Checkpoint {
|
|
114
110
|
readonly checkpoint: util.OpId;
|
|
115
111
|
readonly lsn: string | null;
|
|
112
|
+
}
|
|
116
113
|
|
|
114
|
+
export interface ActiveCheckpoint extends Checkpoint {
|
|
117
115
|
hasSyncRules(): boolean;
|
|
118
116
|
|
|
119
117
|
getBucketStorage(): Promise<SyncRulesBucketStorage | null>;
|
|
120
118
|
}
|
|
121
119
|
|
|
120
|
+
export interface WriteCheckpoint {
|
|
121
|
+
base: ActiveCheckpoint;
|
|
122
|
+
writeCheckpoint: bigint | null;
|
|
123
|
+
}
|
|
124
|
+
|
|
122
125
|
export interface StorageMetrics {
|
|
123
126
|
/**
|
|
124
127
|
* Size of operations (bucket_data)
|
|
@@ -205,9 +208,7 @@ export interface SyncRulesBucketStorageListener extends DisposableListener {
|
|
|
205
208
|
batchStarted: (batch: BucketStorageBatch) => void;
|
|
206
209
|
}
|
|
207
210
|
|
|
208
|
-
export interface SyncRulesBucketStorage
|
|
209
|
-
extends DisposableObserverClient<SyncRulesBucketStorageListener>,
|
|
210
|
-
SyncStorageWriteCheckpointAPI {
|
|
211
|
+
export interface SyncRulesBucketStorage extends DisposableObserverClient<SyncRulesBucketStorageListener> {
|
|
211
212
|
readonly group_id: number;
|
|
212
213
|
readonly slot_name: string;
|
|
213
214
|
|
|
@@ -220,7 +221,7 @@ export interface SyncRulesBucketStorage
|
|
|
220
221
|
callback: (batch: BucketStorageBatch) => Promise<void>
|
|
221
222
|
): Promise<FlushedResult | null>;
|
|
222
223
|
|
|
223
|
-
getCheckpoint(): Promise<
|
|
224
|
+
getCheckpoint(): Promise<Checkpoint>;
|
|
224
225
|
|
|
225
226
|
getParsedSyncRules(options: ParseSyncRulesOptions): SqlSyncRules;
|
|
226
227
|
|
|
@@ -386,8 +387,14 @@ export type SaveOp = 'insert' | 'update' | 'delete';
|
|
|
386
387
|
|
|
387
388
|
export type SaveOptions = SaveInsert | SaveUpdate | SaveDelete;
|
|
388
389
|
|
|
390
|
+
export enum SaveOperationTag {
|
|
391
|
+
INSERT = 'insert',
|
|
392
|
+
UPDATE = 'update',
|
|
393
|
+
DELETE = 'delete'
|
|
394
|
+
}
|
|
395
|
+
|
|
389
396
|
export interface SaveInsert {
|
|
390
|
-
tag:
|
|
397
|
+
tag: SaveOperationTag.INSERT;
|
|
391
398
|
sourceTable: SourceTable;
|
|
392
399
|
before?: undefined;
|
|
393
400
|
beforeReplicaId?: undefined;
|
|
@@ -396,7 +403,7 @@ export interface SaveInsert {
|
|
|
396
403
|
}
|
|
397
404
|
|
|
398
405
|
export interface SaveUpdate {
|
|
399
|
-
tag:
|
|
406
|
+
tag: SaveOperationTag.UPDATE;
|
|
400
407
|
sourceTable: SourceTable;
|
|
401
408
|
|
|
402
409
|
/**
|
|
@@ -415,7 +422,7 @@ export interface SaveUpdate {
|
|
|
415
422
|
}
|
|
416
423
|
|
|
417
424
|
export interface SaveDelete {
|
|
418
|
-
tag:
|
|
425
|
+
tag: SaveOperationTag.DELETE;
|
|
419
426
|
sourceTable: SourceTable;
|
|
420
427
|
before?: SqliteRow;
|
|
421
428
|
beforeReplicaId: ReplicaId;
|