@powersync/service-core 0.0.0-dev-20250214100224 → 0.0.0-dev-20250227082606
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 +42 -2
- package/dist/api/RouteAPI.d.ts +1 -1
- package/dist/api/diagnostics.js +107 -169
- package/dist/api/diagnostics.js.map +1 -1
- package/dist/entry/commands/compact-action.js +10 -73
- package/dist/entry/commands/compact-action.js.map +1 -1
- package/dist/modules/AbstractModule.d.ts +1 -1
- package/dist/replication/AbstractReplicator.js +8 -76
- package/dist/replication/AbstractReplicator.js.map +1 -1
- package/dist/routes/RouterEngine.js.map +1 -1
- package/dist/routes/endpoints/checkpointing.js +3 -2
- package/dist/routes/endpoints/checkpointing.js.map +1 -1
- package/dist/routes/endpoints/socket-route.js +7 -6
- package/dist/routes/endpoints/socket-route.js.map +1 -1
- package/dist/routes/endpoints/sync-stream.js +7 -6
- package/dist/routes/endpoints/sync-stream.js.map +1 -1
- package/dist/runner/teardown.js +3 -65
- package/dist/runner/teardown.js.map +1 -1
- package/dist/storage/BucketStorage.d.ts +8 -441
- package/dist/storage/BucketStorage.js +9 -10
- package/dist/storage/BucketStorage.js.map +1 -1
- package/dist/storage/BucketStorageBatch.d.ts +130 -0
- package/dist/storage/BucketStorageBatch.js +10 -0
- package/dist/storage/BucketStorageBatch.js.map +1 -0
- package/dist/storage/BucketStorageFactory.d.ts +145 -0
- package/dist/storage/BucketStorageFactory.js +2 -0
- package/dist/storage/BucketStorageFactory.js.map +1 -0
- package/dist/storage/ChecksumCache.js.map +1 -1
- package/dist/storage/PersistedSyncRulesContent.d.ts +20 -0
- package/dist/storage/PersistedSyncRulesContent.js +2 -0
- package/dist/storage/PersistedSyncRulesContent.js.map +1 -0
- package/dist/storage/ReplicationEventPayload.d.ts +1 -1
- package/dist/storage/ReplicationLock.d.ts +4 -0
- package/dist/storage/ReplicationLock.js +2 -0
- package/dist/storage/ReplicationLock.js.map +1 -0
- package/dist/storage/SourceEntity.d.ts +6 -2
- package/dist/storage/SourceTable.d.ts +2 -2
- package/dist/storage/SourceTable.js.map +1 -1
- package/dist/storage/StorageEngine.d.ts +4 -4
- package/dist/storage/StorageEngine.js +2 -2
- package/dist/storage/StorageEngine.js.map +1 -1
- package/dist/storage/StorageProvider.d.ts +4 -1
- package/dist/storage/SyncRulesBucketStorage.d.ts +207 -0
- package/dist/storage/SyncRulesBucketStorage.js +7 -0
- package/dist/storage/SyncRulesBucketStorage.js.map +1 -0
- package/dist/storage/bson.d.ts +14 -3
- package/dist/storage/bson.js +18 -2
- package/dist/storage/bson.js.map +1 -1
- package/dist/storage/storage-index.d.ts +5 -0
- package/dist/storage/storage-index.js +5 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/sync/BucketChecksumState.d.ts +95 -0
- package/dist/sync/BucketChecksumState.js +321 -0
- package/dist/sync/BucketChecksumState.js.map +1 -0
- package/dist/sync/SyncContext.d.ts +17 -0
- package/dist/sync/SyncContext.js +23 -0
- package/dist/sync/SyncContext.js.map +1 -0
- package/dist/sync/sync-index.d.ts +2 -0
- package/dist/sync/sync-index.js +2 -0
- package/dist/sync/sync-index.js.map +1 -1
- package/dist/sync/sync.d.ts +10 -4
- package/dist/sync/sync.js +142 -148
- package/dist/sync/sync.js.map +1 -1
- package/dist/sync/util.d.ts +9 -0
- package/dist/sync/util.js +44 -0
- package/dist/sync/util.js.map +1 -1
- package/dist/system/ServiceContext.d.ts +3 -0
- package/dist/system/ServiceContext.js +7 -0
- package/dist/system/ServiceContext.js.map +1 -1
- package/dist/util/checkpointing.d.ts +1 -1
- package/dist/util/checkpointing.js +15 -78
- package/dist/util/checkpointing.js.map +1 -1
- package/dist/util/config/compound-config-collector.js +13 -1
- package/dist/util/config/compound-config-collector.js.map +1 -1
- package/dist/util/config/defaults.d.ts +5 -0
- package/dist/util/config/defaults.js +6 -0
- package/dist/util/config/defaults.js.map +1 -0
- package/dist/util/config/types.d.ts +7 -2
- package/dist/util/config/types.js.map +1 -1
- package/dist/util/protocol-types.d.ts +13 -4
- package/package.json +6 -6
- package/src/api/RouteAPI.ts +1 -1
- package/src/api/diagnostics.ts +1 -1
- package/src/entry/commands/compact-action.ts +2 -3
- package/src/modules/AbstractModule.ts +1 -1
- package/src/replication/AbstractReplicator.ts +7 -12
- package/src/routes/RouterEngine.ts +1 -0
- package/src/routes/endpoints/checkpointing.ts +3 -3
- package/src/routes/endpoints/socket-route.ts +9 -6
- package/src/routes/endpoints/sync-stream.ts +10 -6
- package/src/runner/teardown.ts +1 -1
- package/src/storage/BucketStorage.ts +8 -550
- package/src/storage/BucketStorageBatch.ts +158 -0
- package/src/storage/BucketStorageFactory.ts +166 -0
- package/src/storage/ChecksumCache.ts +1 -0
- package/src/storage/PersistedSyncRulesContent.ts +26 -0
- package/src/storage/ReplicationEventPayload.ts +1 -1
- package/src/storage/ReplicationLock.ts +5 -0
- package/src/storage/SourceEntity.ts +6 -2
- package/src/storage/SourceTable.ts +1 -1
- package/src/storage/StorageEngine.ts +4 -4
- package/src/storage/StorageProvider.ts +4 -1
- package/src/storage/SyncRulesBucketStorage.ts +265 -0
- package/src/storage/bson.ts +22 -4
- package/src/storage/storage-index.ts +5 -0
- package/src/sync/BucketChecksumState.ts +418 -0
- package/src/sync/SyncContext.ts +36 -0
- package/src/sync/sync-index.ts +2 -0
- package/src/sync/sync.ts +199 -177
- package/src/sync/util.ts +54 -0
- package/src/system/ServiceContext.ts +9 -0
- package/src/util/checkpointing.ts +4 -6
- package/src/util/config/compound-config-collector.ts +24 -1
- package/src/util/config/defaults.ts +5 -0
- package/src/util/config/types.ts +8 -2
- package/src/util/protocol-types.ts +16 -4
- package/test/src/auth.test.ts +5 -5
- package/test/src/sync/BucketChecksumState.test.ts +580 -0
- package/test/src/sync/util.test.ts +34 -0
- package/tsconfig.tsbuildinfo +1 -1
|
@@ -1,84 +1,21 @@
|
|
|
1
|
-
var __addDisposableResource = (this && this.__addDisposableResource) || function (env, value, async) {
|
|
2
|
-
if (value !== null && value !== void 0) {
|
|
3
|
-
if (typeof value !== "object" && typeof value !== "function") throw new TypeError("Object expected.");
|
|
4
|
-
var dispose, inner;
|
|
5
|
-
if (async) {
|
|
6
|
-
if (!Symbol.asyncDispose) throw new TypeError("Symbol.asyncDispose is not defined.");
|
|
7
|
-
dispose = value[Symbol.asyncDispose];
|
|
8
|
-
}
|
|
9
|
-
if (dispose === void 0) {
|
|
10
|
-
if (!Symbol.dispose) throw new TypeError("Symbol.dispose is not defined.");
|
|
11
|
-
dispose = value[Symbol.dispose];
|
|
12
|
-
if (async) inner = dispose;
|
|
13
|
-
}
|
|
14
|
-
if (typeof dispose !== "function") throw new TypeError("Object not disposable.");
|
|
15
|
-
if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };
|
|
16
|
-
env.stack.push({ value: value, dispose: dispose, async: async });
|
|
17
|
-
}
|
|
18
|
-
else if (async) {
|
|
19
|
-
env.stack.push({ async: true });
|
|
20
|
-
}
|
|
21
|
-
return value;
|
|
22
|
-
};
|
|
23
|
-
var __disposeResources = (this && this.__disposeResources) || (function (SuppressedError) {
|
|
24
|
-
return function (env) {
|
|
25
|
-
function fail(e) {
|
|
26
|
-
env.error = env.hasError ? new SuppressedError(e, env.error, "An error was suppressed during disposal.") : e;
|
|
27
|
-
env.hasError = true;
|
|
28
|
-
}
|
|
29
|
-
var r, s = 0;
|
|
30
|
-
function next() {
|
|
31
|
-
while (r = env.stack.pop()) {
|
|
32
|
-
try {
|
|
33
|
-
if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);
|
|
34
|
-
if (r.dispose) {
|
|
35
|
-
var result = r.dispose.call(r.value);
|
|
36
|
-
if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });
|
|
37
|
-
}
|
|
38
|
-
else s |= 1;
|
|
39
|
-
}
|
|
40
|
-
catch (e) {
|
|
41
|
-
fail(e);
|
|
42
|
-
}
|
|
43
|
-
}
|
|
44
|
-
if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();
|
|
45
|
-
if (env.hasError) throw env.error;
|
|
46
|
-
}
|
|
47
|
-
return next();
|
|
48
|
-
};
|
|
49
|
-
})(typeof SuppressedError === "function" ? SuppressedError : function (error, suppressed, message) {
|
|
50
|
-
var e = new Error(message);
|
|
51
|
-
return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
|
|
52
|
-
});
|
|
53
1
|
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
54
2
|
export async function createWriteCheckpoint(options) {
|
|
55
|
-
const
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
if (!activeSyncRules) {
|
|
60
|
-
throw new ServiceError(ErrorCode.PSYNC_S2302, `Cannot create Write Checkpoint since no sync rules are active.`);
|
|
61
|
-
}
|
|
62
|
-
const syncBucketStorage = __addDisposableResource(env_1, options.storage.getInstance(activeSyncRules), false);
|
|
63
|
-
const { writeCheckpoint, currentCheckpoint } = await options.api.createReplicationHead(async (currentCheckpoint) => {
|
|
64
|
-
const writeCheckpoint = await syncBucketStorage.createManagedWriteCheckpoint({
|
|
65
|
-
user_id: full_user_id,
|
|
66
|
-
heads: { '1': currentCheckpoint }
|
|
67
|
-
});
|
|
68
|
-
return { writeCheckpoint, currentCheckpoint };
|
|
69
|
-
});
|
|
70
|
-
return {
|
|
71
|
-
writeCheckpoint: String(writeCheckpoint),
|
|
72
|
-
replicationHead: currentCheckpoint
|
|
73
|
-
};
|
|
74
|
-
}
|
|
75
|
-
catch (e_1) {
|
|
76
|
-
env_1.error = e_1;
|
|
77
|
-
env_1.hasError = true;
|
|
78
|
-
}
|
|
79
|
-
finally {
|
|
80
|
-
__disposeResources(env_1);
|
|
3
|
+
const full_user_id = checkpointUserId(options.userId, options.clientId);
|
|
4
|
+
const syncBucketStorage = await options.storage.getActiveStorage();
|
|
5
|
+
if (!syncBucketStorage) {
|
|
6
|
+
throw new ServiceError(ErrorCode.PSYNC_S2302, `Cannot create Write Checkpoint since no sync rules are active.`);
|
|
81
7
|
}
|
|
8
|
+
const { writeCheckpoint, currentCheckpoint } = await options.api.createReplicationHead(async (currentCheckpoint) => {
|
|
9
|
+
const writeCheckpoint = await syncBucketStorage.createManagedWriteCheckpoint({
|
|
10
|
+
user_id: full_user_id,
|
|
11
|
+
heads: { '1': currentCheckpoint }
|
|
12
|
+
});
|
|
13
|
+
return { writeCheckpoint, currentCheckpoint };
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
writeCheckpoint: String(writeCheckpoint),
|
|
17
|
+
replicationHead: currentCheckpoint
|
|
18
|
+
};
|
|
82
19
|
}
|
|
83
20
|
export function checkpointUserId(user_id, client_id) {
|
|
84
21
|
if (user_id == null) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checkpointing.js","sourceRoot":"","sources":["../../src/util/checkpointing.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checkpointing.js","sourceRoot":"","sources":["../../src/util/checkpointing.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAU5E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAqC;IAC/E,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;IAExE,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC;IACnE,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,gEAAgE,CAAC,CAAC;IAClH,CAAC;IAED,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE;QACjH,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,4BAA4B,CAAC;YAC3E,OAAO,EAAE,YAAY;YACrB,KAAK,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE;SAClC,CAAC,CAAC;QACH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;QACxC,eAAe,EAAE,iBAAiB;KACnC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,OAA2B,EAAE,SAA6B;IACzF,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,MAAM,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;IACzC,CAAC;IACD,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACtB,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,OAAO,IAAI,SAAS,EAAE,CAAC;AACnC,CAAC"}
|
|
@@ -6,6 +6,7 @@ import { FileSystemConfigCollector } from './collectors/impl/filesystem-config-c
|
|
|
6
6
|
import { Base64SyncRulesCollector } from './sync-rules/impl/base64-sync-rules-collector.js';
|
|
7
7
|
import { FileSystemSyncRulesCollector } from './sync-rules/impl/filesystem-sync-rules-collector.js';
|
|
8
8
|
import { InlineSyncRulesCollector } from './sync-rules/impl/inline-sync-rules-collector.js';
|
|
9
|
+
import { DEFAULT_MAX_BUCKETS_PER_CONNECTION, DEFAULT_MAX_CONCURRENT_CONNECTIONS, DEFAULT_MAX_DATA_FETCH_CONCURRENCY, DEFAULT_MAX_PARAMETER_QUERY_RESULTS, DEFAULT_MAX_POOL_SIZE } from './defaults.js';
|
|
9
10
|
const POWERSYNC_DEV_KID = 'powersync-dev';
|
|
10
11
|
const DEFAULT_COLLECTOR_OPTIONS = {
|
|
11
12
|
configCollectors: [new Base64ConfigCollector(), new FileSystemConfigCollector(), new FallbackConfigCollector()],
|
|
@@ -80,7 +81,12 @@ export class CompoundConfigCollector {
|
|
|
80
81
|
let config = {
|
|
81
82
|
base_config: baseConfig,
|
|
82
83
|
connections: baseConfig.replication?.connections || [],
|
|
83
|
-
storage:
|
|
84
|
+
storage: {
|
|
85
|
+
...baseConfig.storage,
|
|
86
|
+
parameters: {
|
|
87
|
+
max_pool_size: baseConfig.storage?.parameters?.max_pool_size ?? DEFAULT_MAX_POOL_SIZE
|
|
88
|
+
}
|
|
89
|
+
},
|
|
84
90
|
client_keystore: keyStore,
|
|
85
91
|
// Dev tokens only use the static keys, no external key sources
|
|
86
92
|
// We may restrict this even further to only the powersync-dev key.
|
|
@@ -100,6 +106,12 @@ export class CompoundConfigCollector {
|
|
|
100
106
|
disable_telemetry_sharing: baseConfig.telemetry?.disable_telemetry_sharing ?? false,
|
|
101
107
|
internal_service_endpoint: baseConfig.telemetry?.internal_service_endpoint ?? 'https://pulse.journeyapps.com/v1/metrics'
|
|
102
108
|
},
|
|
109
|
+
api_parameters: {
|
|
110
|
+
max_buckets_per_connection: baseConfig.api?.parameters?.max_buckets_per_connection ?? DEFAULT_MAX_BUCKETS_PER_CONNECTION,
|
|
111
|
+
max_parameter_query_results: baseConfig.api?.parameters?.max_parameter_query_results ?? DEFAULT_MAX_PARAMETER_QUERY_RESULTS,
|
|
112
|
+
max_concurrent_connections: baseConfig.api?.parameters?.max_concurrent_connections ?? DEFAULT_MAX_CONCURRENT_CONNECTIONS,
|
|
113
|
+
max_data_fetch_concurrency: baseConfig.api?.parameters?.max_data_fetch_concurrency ?? DEFAULT_MAX_DATA_FETCH_CONCURRENCY
|
|
114
|
+
},
|
|
103
115
|
// TODO maybe move this out of the connection or something
|
|
104
116
|
// slot_name_prefix: connections[0]?.slot_name_prefix ?? 'powersync_'
|
|
105
117
|
slot_name_prefix: 'powersync_',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compound-config-collector.js","sourceRoot":"","sources":["../../../src/util/config/compound-config-collector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAiB,MAAM,mCAAmC,CAAC;AAE1E,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;
|
|
1
|
+
{"version":3,"file":"compound-config-collector.js","sourceRoot":"","sources":["../../../src/util/config/compound-config-collector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const DEFAULT_MAX_POOL_SIZE = 8;
|
|
2
|
+
export declare const DEFAULT_MAX_CONCURRENT_CONNECTIONS = 200;
|
|
3
|
+
export declare const DEFAULT_MAX_DATA_FETCH_CONCURRENCY = 10;
|
|
4
|
+
export declare const DEFAULT_MAX_BUCKETS_PER_CONNECTION = 1000;
|
|
5
|
+
export declare const DEFAULT_MAX_PARAMETER_QUERY_RESULTS = 1000;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export const DEFAULT_MAX_POOL_SIZE = 8;
|
|
2
|
+
export const DEFAULT_MAX_CONCURRENT_CONNECTIONS = 200;
|
|
3
|
+
export const DEFAULT_MAX_DATA_FETCH_CONCURRENCY = 10;
|
|
4
|
+
export const DEFAULT_MAX_BUCKETS_PER_CONNECTION = 1000;
|
|
5
|
+
export const DEFAULT_MAX_PARAMETER_QUERY_RESULTS = 1000;
|
|
6
|
+
//# sourceMappingURL=defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../../src/util/config/defaults.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC;AACvC,MAAM,CAAC,MAAM,kCAAkC,GAAG,GAAG,CAAC;AACtD,MAAM,CAAC,MAAM,kCAAkC,GAAG,EAAE,CAAC;AACrD,MAAM,CAAC,MAAM,kCAAkC,GAAG,IAAI,CAAC;AACvD,MAAM,CAAC,MAAM,mCAAmC,GAAG,IAAI,CAAC"}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { configFile } from '@powersync/service-types';
|
|
2
|
-
import { PowerSyncConfig } from '@powersync/service-types/src/config/PowerSyncConfig.js';
|
|
3
2
|
import { CompoundKeyCollector } from '../../auth/CompoundKeyCollector.js';
|
|
4
3
|
import { KeySpec } from '../../auth/KeySpec.js';
|
|
5
4
|
import { KeyStore } from '../../auth/KeyStore.js';
|
|
@@ -24,7 +23,7 @@ export type SyncRulesConfig = {
|
|
|
24
23
|
exit_on_error: boolean;
|
|
25
24
|
};
|
|
26
25
|
export type ResolvedPowerSyncConfig = {
|
|
27
|
-
base_config: PowerSyncConfig;
|
|
26
|
+
base_config: configFile.PowerSyncConfig;
|
|
28
27
|
connections?: configFile.GenericDataSourceConfig[];
|
|
29
28
|
storage: configFile.GenericStorageConfig;
|
|
30
29
|
dev: {
|
|
@@ -52,6 +51,12 @@ export type ResolvedPowerSyncConfig = {
|
|
|
52
51
|
disable_telemetry_sharing: boolean;
|
|
53
52
|
internal_service_endpoint: string;
|
|
54
53
|
};
|
|
54
|
+
api_parameters: {
|
|
55
|
+
max_concurrent_connections: number;
|
|
56
|
+
max_data_fetch_concurrency: number;
|
|
57
|
+
max_buckets_per_connection: number;
|
|
58
|
+
max_parameter_query_results: number;
|
|
59
|
+
};
|
|
55
60
|
/** Prefix for postgres replication slot names. May eventually be connection-specific. */
|
|
56
61
|
slot_name_prefix: string;
|
|
57
62
|
parameters: Record<string, number | string | boolean | null>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/util/config/types.ts"],"names":[],"mappings":"AAKA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as t from 'ts-codec';
|
|
2
|
-
import { SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
2
|
+
import { BucketDescription, BucketPriority, SqliteJsonValue } from '@powersync/service-sync-rules';
|
|
3
3
|
export declare const BucketRequest: t.ObjectCodec<{
|
|
4
4
|
name: t.IdentityCodec<t.CodecType.String>;
|
|
5
5
|
/**
|
|
@@ -52,7 +52,7 @@ export interface StreamingSyncCheckpointDiff {
|
|
|
52
52
|
checkpoint_diff: {
|
|
53
53
|
last_op_id: OpId;
|
|
54
54
|
write_checkpoint?: OpId;
|
|
55
|
-
updated_buckets:
|
|
55
|
+
updated_buckets: BucketChecksumWithDescription[];
|
|
56
56
|
removed_buckets: string[];
|
|
57
57
|
};
|
|
58
58
|
}
|
|
@@ -64,9 +64,16 @@ export interface StreamingSyncCheckpointComplete {
|
|
|
64
64
|
last_op_id: OpId;
|
|
65
65
|
};
|
|
66
66
|
}
|
|
67
|
+
export interface StreamingSyncCheckpointPartiallyComplete {
|
|
68
|
+
partial_checkpoint_complete: {
|
|
69
|
+
last_op_id: OpId;
|
|
70
|
+
priority: BucketPriority;
|
|
71
|
+
};
|
|
72
|
+
}
|
|
67
73
|
export interface StreamingSyncKeepalive {
|
|
74
|
+
token_expires_in: number;
|
|
68
75
|
}
|
|
69
|
-
export type StreamingSyncLine = StreamingSyncData | StreamingSyncCheckpoint | StreamingSyncCheckpointDiff | StreamingSyncCheckpointComplete | StreamingSyncKeepalive;
|
|
76
|
+
export type StreamingSyncLine = StreamingSyncData | StreamingSyncCheckpoint | StreamingSyncCheckpointDiff | StreamingSyncCheckpointComplete | StreamingSyncCheckpointPartiallyComplete | StreamingSyncKeepalive;
|
|
70
77
|
/**
|
|
71
78
|
* 64-bit unsigned number, as a base-10 string.
|
|
72
79
|
*/
|
|
@@ -74,7 +81,7 @@ export type OpId = string;
|
|
|
74
81
|
export interface Checkpoint {
|
|
75
82
|
last_op_id: OpId;
|
|
76
83
|
write_checkpoint?: OpId;
|
|
77
|
-
buckets:
|
|
84
|
+
buckets: BucketChecksumWithDescription[];
|
|
78
85
|
}
|
|
79
86
|
export interface BucketState {
|
|
80
87
|
bucket: string;
|
|
@@ -119,3 +126,5 @@ export interface BucketChecksum {
|
|
|
119
126
|
*/
|
|
120
127
|
count: number;
|
|
121
128
|
}
|
|
129
|
+
export interface BucketChecksumWithDescription extends BucketChecksum, BucketDescription {
|
|
130
|
+
}
|
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-20250227082606",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"@opentelemetry/sdk-metrics": "1.24.1",
|
|
19
19
|
"async": "^3.2.4",
|
|
20
20
|
"async-mutex": "^0.5.0",
|
|
21
|
-
"bson": "^6.
|
|
21
|
+
"bson": "^6.10.3",
|
|
22
22
|
"commander": "^12.0.0",
|
|
23
23
|
"cors": "^2.8.5",
|
|
24
24
|
"ipaddr.js": "^2.1.0",
|
|
@@ -32,11 +32,11 @@
|
|
|
32
32
|
"uuid": "^9.0.1",
|
|
33
33
|
"winston": "^3.13.0",
|
|
34
34
|
"yaml": "^2.3.2",
|
|
35
|
-
"@powersync/lib-services-framework": "0.5.
|
|
35
|
+
"@powersync/lib-services-framework": "0.5.3",
|
|
36
36
|
"@powersync/service-jsonbig": "0.17.10",
|
|
37
|
-
"@powersync/service-rsocket-router": "0.0.
|
|
38
|
-
"@powersync/service-sync-rules": "0.
|
|
39
|
-
"@powersync/service-types": "0.
|
|
37
|
+
"@powersync/service-rsocket-router": "0.0.20",
|
|
38
|
+
"@powersync/service-sync-rules": "0.24.0",
|
|
39
|
+
"@powersync/service-types": "0.0.0-dev-20250227082606"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
42
|
"@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, SyncRulesBucketStorage } from '../storage/
|
|
3
|
+
import { ParseSyncRulesOptions, SyncRulesBucketStorage } from '../storage/storage-index.js';
|
|
4
4
|
|
|
5
5
|
export interface PatternResult {
|
|
6
6
|
schema: string;
|
package/src/api/diagnostics.ts
CHANGED
|
@@ -57,7 +57,7 @@ export async function getSyncRulesStatus(
|
|
|
57
57
|
// This method can run under some situations if no connection is configured yet.
|
|
58
58
|
// It will return a default tag in such a case. This default tag is not module specific.
|
|
59
59
|
const tag = sourceConfig.tag ?? DEFAULT_TAG;
|
|
60
|
-
|
|
60
|
+
const systemStorage = live_status ? bucketStorage.getInstance(sync_rules) : undefined;
|
|
61
61
|
const status = await systemStorage?.getStatus();
|
|
62
62
|
let replication_lag_bytes: number | undefined = undefined;
|
|
63
63
|
|
|
@@ -50,14 +50,13 @@ export function registerCompactAction(program: Command) {
|
|
|
50
50
|
await serviceContext.lifeCycleEngine.start();
|
|
51
51
|
const bucketStorage = serviceContext.storageEngine.activeBucketStorage;
|
|
52
52
|
|
|
53
|
-
const active = await bucketStorage.
|
|
53
|
+
const active = await bucketStorage.getActiveStorage();
|
|
54
54
|
if (active == null) {
|
|
55
55
|
logger.info('No active instance to compact');
|
|
56
56
|
return;
|
|
57
57
|
}
|
|
58
|
-
using p = bucketStorage.getInstance(active);
|
|
59
58
|
logger.info('Performing compaction...');
|
|
60
|
-
await
|
|
59
|
+
await active.compact({ memoryLimitMB: COMPACT_MEMORY_LIMIT_MB, compactBuckets: buckets });
|
|
61
60
|
logger.info('Successfully compacted storage.');
|
|
62
61
|
} catch (e) {
|
|
63
62
|
logger.error(`Failed to compact: ${e.toString()}`);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { ServiceContextContainer } from '../system/ServiceContext.js';
|
|
2
2
|
import { logger } from '@powersync/lib-services-framework';
|
|
3
3
|
import winston from 'winston';
|
|
4
|
-
import { PersistedSyncRulesContent } from '../storage/
|
|
4
|
+
import { PersistedSyncRulesContent } from '../storage/storage-index.js';
|
|
5
5
|
|
|
6
6
|
export interface TearDownOptions {
|
|
7
7
|
/**
|
|
@@ -193,16 +193,15 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
193
193
|
|
|
194
194
|
this.replicationJobs = newJobs;
|
|
195
195
|
|
|
196
|
-
//
|
|
196
|
+
// Stop any orphaned jobs that no longer have sync rules.
|
|
197
|
+
// Termination happens below
|
|
197
198
|
for (let job of existingJobs.values()) {
|
|
198
199
|
// Old - stop and clean up
|
|
199
200
|
try {
|
|
200
201
|
await job.stop();
|
|
201
|
-
await this.terminateSyncRules(job.storage);
|
|
202
|
-
job.storage[Symbol.dispose]();
|
|
203
202
|
} catch (e) {
|
|
204
203
|
// This will be retried
|
|
205
|
-
this.logger.warn('Failed to
|
|
204
|
+
this.logger.warn('Failed to stop old replication job}', e);
|
|
206
205
|
}
|
|
207
206
|
}
|
|
208
207
|
|
|
@@ -210,7 +209,7 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
210
209
|
const stopped = await this.storage.getStoppedSyncRules();
|
|
211
210
|
for (let syncRules of stopped) {
|
|
212
211
|
try {
|
|
213
|
-
|
|
212
|
+
const syncRuleStorage = this.storage.getInstance(syncRules, { skipLifecycleHooks: true });
|
|
214
213
|
await this.terminateSyncRules(syncRuleStorage);
|
|
215
214
|
} catch (e) {
|
|
216
215
|
this.logger.warn(`Failed clean up replication config for sync rule: ${syncRules.id}`, e);
|
|
@@ -224,13 +223,9 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
|
|
|
224
223
|
|
|
225
224
|
protected async terminateSyncRules(syncRuleStorage: storage.SyncRulesBucketStorage) {
|
|
226
225
|
this.logger.info(`Terminating sync rules: ${syncRuleStorage.group_id}...`);
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
this.logger.info(`Successfully terminated sync rules: ${syncRuleStorage.group_id}`);
|
|
231
|
-
} catch (e) {
|
|
232
|
-
this.logger.warn(`Failed clean up replication config for sync rules: ${syncRuleStorage.group_id}`, e);
|
|
233
|
-
}
|
|
226
|
+
await this.cleanUp(syncRuleStorage);
|
|
227
|
+
await syncRuleStorage.terminate();
|
|
228
|
+
this.logger.info(`Successfully terminated sync rules: ${syncRuleStorage.group_id}`);
|
|
234
229
|
}
|
|
235
230
|
|
|
236
231
|
abstract testConnection(): Promise<ConnectionTestResult>;
|
|
@@ -10,6 +10,7 @@ import { SYNC_RULES_ROUTES } from './endpoints/sync-rules.js';
|
|
|
10
10
|
import { SYNC_STREAM_ROUTES } from './endpoints/sync-stream.js';
|
|
11
11
|
import { SocketRouteGenerator } from './router-socket.js';
|
|
12
12
|
import { RouteDefinition } from './router.js';
|
|
13
|
+
import { SyncContext } from '../sync/SyncContext.js';
|
|
13
14
|
|
|
14
15
|
export type RouterSetupResponse = {
|
|
15
16
|
onShutdown: () => Promise<void>;
|
|
@@ -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';
|
|
@@ -31,8 +30,9 @@ export const writeCheckpoint = routeDefinition({
|
|
|
31
30
|
|
|
32
31
|
logger.info(`Waiting for LSN checkpoint: ${head}`);
|
|
33
32
|
while (Date.now() - start < timeout) {
|
|
34
|
-
const
|
|
35
|
-
|
|
33
|
+
const bucketStorage = await service_context.storageEngine.activeBucketStorage.getActiveStorage();
|
|
34
|
+
const cp = await bucketStorage?.getCheckpoint();
|
|
35
|
+
if (cp == null) {
|
|
36
36
|
throw new Error('No sync rules available');
|
|
37
37
|
}
|
|
38
38
|
if (cp.lsn && cp.lsn >= head) {
|
|
@@ -13,7 +13,7 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
|
|
|
13
13
|
validator: schema.createTsCodecValidator(util.StreamingSyncRequest, { allowAdditional: true }),
|
|
14
14
|
handler: async ({ context, params, responder, observer, initialN, signal: upstreamSignal }) => {
|
|
15
15
|
const { service_context } = context;
|
|
16
|
-
const { routerEngine } = service_context;
|
|
16
|
+
const { routerEngine, syncContext } = service_context;
|
|
17
17
|
|
|
18
18
|
// Create our own controller that we can abort directly
|
|
19
19
|
const controller = new AbortController();
|
|
@@ -49,9 +49,9 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
|
|
|
49
49
|
const {
|
|
50
50
|
storageEngine: { activeBucketStorage }
|
|
51
51
|
} = service_context;
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
if (
|
|
52
|
+
|
|
53
|
+
const bucketStorage = await activeBucketStorage.getActiveStorage();
|
|
54
|
+
if (bucketStorage == null) {
|
|
55
55
|
responder.onError(
|
|
56
56
|
new errors.ServiceError({
|
|
57
57
|
status: 500,
|
|
@@ -63,6 +63,8 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
|
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
65
|
|
|
66
|
+
const syncRules = bucketStorage.getParsedSyncRules(routerEngine!.getAPI().getParseSyncRulesOptions());
|
|
67
|
+
|
|
66
68
|
const removeStopHandler = routerEngine!.addStopHandler(() => {
|
|
67
69
|
controller.abort();
|
|
68
70
|
});
|
|
@@ -71,8 +73,9 @@ export const syncStreamReactive: SocketRouteGenerator = (router) =>
|
|
|
71
73
|
const tracker = new sync.RequestTracker();
|
|
72
74
|
try {
|
|
73
75
|
for await (const data of sync.streamResponse({
|
|
74
|
-
|
|
75
|
-
|
|
76
|
+
syncContext: syncContext,
|
|
77
|
+
bucketStorage: bucketStorage,
|
|
78
|
+
syncRules: syncRules,
|
|
76
79
|
params: {
|
|
77
80
|
...params,
|
|
78
81
|
binary_data: true // always true for web sockets
|
|
@@ -20,7 +20,7 @@ export const syncStreamed = routeDefinition({
|
|
|
20
20
|
validator: schema.createTsCodecValidator(util.StreamingSyncRequest, { allowAdditional: true }),
|
|
21
21
|
handler: async (payload) => {
|
|
22
22
|
const { service_context } = payload.context;
|
|
23
|
-
const { routerEngine, storageEngine } = service_context;
|
|
23
|
+
const { routerEngine, storageEngine, syncContext } = service_context;
|
|
24
24
|
const headers = payload.request.headers;
|
|
25
25
|
const userAgent = headers['x-user-agent'] ?? headers['user-agent'];
|
|
26
26
|
const clientId = payload.params.client_id;
|
|
@@ -36,15 +36,18 @@ export const syncStreamed = routeDefinition({
|
|
|
36
36
|
const params: util.StreamingSyncRequest = payload.params;
|
|
37
37
|
const syncParams = new RequestParameters(payload.context.token_payload!, payload.params.parameters ?? {});
|
|
38
38
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
if (
|
|
39
|
+
const bucketStorage = await storageEngine.activeBucketStorage.getActiveStorage();
|
|
40
|
+
|
|
41
|
+
if (bucketStorage == null) {
|
|
42
42
|
throw new errors.ServiceError({
|
|
43
43
|
status: 500,
|
|
44
44
|
code: ErrorCode.PSYNC_S2302,
|
|
45
45
|
description: 'No sync rules available'
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
+
|
|
49
|
+
const syncRules = bucketStorage.getParsedSyncRules(routerEngine!.getAPI().getParseSyncRulesOptions());
|
|
50
|
+
|
|
48
51
|
const controller = new AbortController();
|
|
49
52
|
const tracker = new sync.RequestTracker();
|
|
50
53
|
try {
|
|
@@ -53,8 +56,9 @@ export const syncStreamed = routeDefinition({
|
|
|
53
56
|
sync.transformToBytesTracked(
|
|
54
57
|
sync.ndjson(
|
|
55
58
|
sync.streamResponse({
|
|
56
|
-
|
|
57
|
-
|
|
59
|
+
syncContext: syncContext,
|
|
60
|
+
bucketStorage,
|
|
61
|
+
syncRules: syncRules,
|
|
58
62
|
params,
|
|
59
63
|
syncParams,
|
|
60
64
|
token: payload.context.token_payload!,
|
package/src/runner/teardown.ts
CHANGED
|
@@ -51,7 +51,7 @@ async function terminateSyncRules(storageFactory: storage.BucketStorageFactory,
|
|
|
51
51
|
|
|
52
52
|
// Mark the sync rules as terminated
|
|
53
53
|
for (let syncRules of combinedSyncRules) {
|
|
54
|
-
|
|
54
|
+
const syncRulesStorage = storageFactory.getInstance(syncRules);
|
|
55
55
|
// The storage will be dropped at the end of the teardown, so we don't need to clear it here
|
|
56
56
|
await syncRulesStorage.terminate({ clearStorage: false });
|
|
57
57
|
}
|