@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.
Files changed (120) hide show
  1. package/CHANGELOG.md +42 -2
  2. package/dist/api/RouteAPI.d.ts +1 -1
  3. package/dist/api/diagnostics.js +107 -169
  4. package/dist/api/diagnostics.js.map +1 -1
  5. package/dist/entry/commands/compact-action.js +10 -73
  6. package/dist/entry/commands/compact-action.js.map +1 -1
  7. package/dist/modules/AbstractModule.d.ts +1 -1
  8. package/dist/replication/AbstractReplicator.js +8 -76
  9. package/dist/replication/AbstractReplicator.js.map +1 -1
  10. package/dist/routes/RouterEngine.js.map +1 -1
  11. package/dist/routes/endpoints/checkpointing.js +3 -2
  12. package/dist/routes/endpoints/checkpointing.js.map +1 -1
  13. package/dist/routes/endpoints/socket-route.js +7 -6
  14. package/dist/routes/endpoints/socket-route.js.map +1 -1
  15. package/dist/routes/endpoints/sync-stream.js +7 -6
  16. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  17. package/dist/runner/teardown.js +3 -65
  18. package/dist/runner/teardown.js.map +1 -1
  19. package/dist/storage/BucketStorage.d.ts +8 -441
  20. package/dist/storage/BucketStorage.js +9 -10
  21. package/dist/storage/BucketStorage.js.map +1 -1
  22. package/dist/storage/BucketStorageBatch.d.ts +130 -0
  23. package/dist/storage/BucketStorageBatch.js +10 -0
  24. package/dist/storage/BucketStorageBatch.js.map +1 -0
  25. package/dist/storage/BucketStorageFactory.d.ts +145 -0
  26. package/dist/storage/BucketStorageFactory.js +2 -0
  27. package/dist/storage/BucketStorageFactory.js.map +1 -0
  28. package/dist/storage/ChecksumCache.js.map +1 -1
  29. package/dist/storage/PersistedSyncRulesContent.d.ts +20 -0
  30. package/dist/storage/PersistedSyncRulesContent.js +2 -0
  31. package/dist/storage/PersistedSyncRulesContent.js.map +1 -0
  32. package/dist/storage/ReplicationEventPayload.d.ts +1 -1
  33. package/dist/storage/ReplicationLock.d.ts +4 -0
  34. package/dist/storage/ReplicationLock.js +2 -0
  35. package/dist/storage/ReplicationLock.js.map +1 -0
  36. package/dist/storage/SourceEntity.d.ts +6 -2
  37. package/dist/storage/SourceTable.d.ts +2 -2
  38. package/dist/storage/SourceTable.js.map +1 -1
  39. package/dist/storage/StorageEngine.d.ts +4 -4
  40. package/dist/storage/StorageEngine.js +2 -2
  41. package/dist/storage/StorageEngine.js.map +1 -1
  42. package/dist/storage/StorageProvider.d.ts +4 -1
  43. package/dist/storage/SyncRulesBucketStorage.d.ts +207 -0
  44. package/dist/storage/SyncRulesBucketStorage.js +7 -0
  45. package/dist/storage/SyncRulesBucketStorage.js.map +1 -0
  46. package/dist/storage/bson.d.ts +14 -3
  47. package/dist/storage/bson.js +18 -2
  48. package/dist/storage/bson.js.map +1 -1
  49. package/dist/storage/storage-index.d.ts +5 -0
  50. package/dist/storage/storage-index.js +5 -0
  51. package/dist/storage/storage-index.js.map +1 -1
  52. package/dist/sync/BucketChecksumState.d.ts +95 -0
  53. package/dist/sync/BucketChecksumState.js +321 -0
  54. package/dist/sync/BucketChecksumState.js.map +1 -0
  55. package/dist/sync/SyncContext.d.ts +17 -0
  56. package/dist/sync/SyncContext.js +23 -0
  57. package/dist/sync/SyncContext.js.map +1 -0
  58. package/dist/sync/sync-index.d.ts +2 -0
  59. package/dist/sync/sync-index.js +2 -0
  60. package/dist/sync/sync-index.js.map +1 -1
  61. package/dist/sync/sync.d.ts +10 -4
  62. package/dist/sync/sync.js +142 -148
  63. package/dist/sync/sync.js.map +1 -1
  64. package/dist/sync/util.d.ts +9 -0
  65. package/dist/sync/util.js +44 -0
  66. package/dist/sync/util.js.map +1 -1
  67. package/dist/system/ServiceContext.d.ts +3 -0
  68. package/dist/system/ServiceContext.js +7 -0
  69. package/dist/system/ServiceContext.js.map +1 -1
  70. package/dist/util/checkpointing.d.ts +1 -1
  71. package/dist/util/checkpointing.js +15 -78
  72. package/dist/util/checkpointing.js.map +1 -1
  73. package/dist/util/config/compound-config-collector.js +13 -1
  74. package/dist/util/config/compound-config-collector.js.map +1 -1
  75. package/dist/util/config/defaults.d.ts +5 -0
  76. package/dist/util/config/defaults.js +6 -0
  77. package/dist/util/config/defaults.js.map +1 -0
  78. package/dist/util/config/types.d.ts +7 -2
  79. package/dist/util/config/types.js.map +1 -1
  80. package/dist/util/protocol-types.d.ts +13 -4
  81. package/package.json +6 -6
  82. package/src/api/RouteAPI.ts +1 -1
  83. package/src/api/diagnostics.ts +1 -1
  84. package/src/entry/commands/compact-action.ts +2 -3
  85. package/src/modules/AbstractModule.ts +1 -1
  86. package/src/replication/AbstractReplicator.ts +7 -12
  87. package/src/routes/RouterEngine.ts +1 -0
  88. package/src/routes/endpoints/checkpointing.ts +3 -3
  89. package/src/routes/endpoints/socket-route.ts +9 -6
  90. package/src/routes/endpoints/sync-stream.ts +10 -6
  91. package/src/runner/teardown.ts +1 -1
  92. package/src/storage/BucketStorage.ts +8 -550
  93. package/src/storage/BucketStorageBatch.ts +158 -0
  94. package/src/storage/BucketStorageFactory.ts +166 -0
  95. package/src/storage/ChecksumCache.ts +1 -0
  96. package/src/storage/PersistedSyncRulesContent.ts +26 -0
  97. package/src/storage/ReplicationEventPayload.ts +1 -1
  98. package/src/storage/ReplicationLock.ts +5 -0
  99. package/src/storage/SourceEntity.ts +6 -2
  100. package/src/storage/SourceTable.ts +1 -1
  101. package/src/storage/StorageEngine.ts +4 -4
  102. package/src/storage/StorageProvider.ts +4 -1
  103. package/src/storage/SyncRulesBucketStorage.ts +265 -0
  104. package/src/storage/bson.ts +22 -4
  105. package/src/storage/storage-index.ts +5 -0
  106. package/src/sync/BucketChecksumState.ts +418 -0
  107. package/src/sync/SyncContext.ts +36 -0
  108. package/src/sync/sync-index.ts +2 -0
  109. package/src/sync/sync.ts +199 -177
  110. package/src/sync/util.ts +54 -0
  111. package/src/system/ServiceContext.ts +9 -0
  112. package/src/util/checkpointing.ts +4 -6
  113. package/src/util/config/compound-config-collector.ts +24 -1
  114. package/src/util/config/defaults.ts +5 -0
  115. package/src/util/config/types.ts +8 -2
  116. package/src/util/protocol-types.ts +16 -4
  117. package/test/src/auth.test.ts +5 -5
  118. package/test/src/sync/BucketChecksumState.test.ts +580 -0
  119. package/test/src/sync/util.test.ts +34 -0
  120. 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 env_1 = { stack: [], error: void 0, hasError: false };
56
- try {
57
- const full_user_id = checkpointUserId(options.userId, options.clientId);
58
- const activeSyncRules = await options.storage.getActiveSyncRulesContent();
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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,SAAS,EAAU,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAUpF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,OAAqC;;;QAC/E,MAAM,YAAY,GAAG,gBAAgB,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAExE,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,yBAAyB,EAAE,CAAC;QAC1E,IAAI,CAAC,eAAe,EAAE,CAAC;YACrB,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,gEAAgE,CAAC,CAAC;QAClH,CAAC;QAED,MAAM,iBAAiB,kCAAG,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,eAAe,CAAC,QAAA,CAAC;QAEvE,MAAM,EAAE,eAAe,EAAE,iBAAiB,EAAE,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,KAAK,EAAE,iBAAiB,EAAE,EAAE;YACjH,MAAM,eAAe,GAAG,MAAM,iBAAiB,CAAC,4BAA4B,CAAC;gBAC3E,OAAO,EAAE,YAAY;gBACrB,KAAK,EAAE,EAAE,GAAG,EAAE,iBAAiB,EAAE;aAClC,CAAC,CAAC;YACH,OAAO,EAAE,eAAe,EAAE,iBAAiB,EAAE,CAAC;QAChD,CAAC,CAAC,CAAC;QAEH,OAAO;YACL,eAAe,EAAE,MAAM,CAAC,eAAe,CAAC;YACxC,eAAe,EAAE,iBAAiB;SACnC,CAAC;;;;;;;;;CACH;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"}
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: baseConfig.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":"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"}
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":"AAMA,MAAM,CAAN,IAAY,aAIX;AAJD,WAAY,aAAa;IACvB,oCAAmB,CAAA;IACnB,4BAAW,CAAA;IACX,8BAAa,CAAA;AACf,CAAC,EAJW,aAAa,KAAb,aAAa,QAIxB"}
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: BucketChecksum[];
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: BucketChecksum[];
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-20250214100224",
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.8.0",
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.1",
35
+ "@powersync/lib-services-framework": "0.5.3",
36
36
  "@powersync/service-jsonbig": "0.17.10",
37
- "@powersync/service-rsocket-router": "0.0.18",
38
- "@powersync/service-sync-rules": "0.23.4",
39
- "@powersync/service-types": "0.8.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",
@@ -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/BucketStorage.js';
3
+ import { ParseSyncRulesOptions, SyncRulesBucketStorage } from '../storage/storage-index.js';
4
4
 
5
5
  export interface PatternResult {
6
6
  schema: string;
@@ -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
- using systemStorage = live_status ? bucketStorage.getInstance(sync_rules) : undefined;
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.getActiveSyncRulesContent();
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 p.compact({ memoryLimitMB: COMPACT_MEMORY_LIMIT_MB, compactBuckets: buckets });
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/BucketStorage.js';
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
- // Terminate any orphaned jobs that no longer have sync rules
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 terminate old replication job}', e);
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
- using syncRuleStorage = this.storage.getInstance(syncRules);
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
- try {
228
- await this.cleanUp(syncRuleStorage);
229
- await syncRuleStorage.terminate();
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 cp = await service_context.storageEngine.activeBucketStorage.getActiveCheckpoint();
35
- if (!cp.hasSyncRules()) {
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
- // Sanity check before we start the stream
53
- const cp = await activeBucketStorage.getActiveCheckpoint();
54
- if (!cp.hasSyncRules()) {
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
- storage: activeBucketStorage,
75
- parseOptions: routerEngine!.getAPI().getParseSyncRulesOptions(),
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
- // Sanity check before we start the stream
40
- const cp = await storageEngine.activeBucketStorage.getActiveCheckpoint();
41
- if (!cp.hasSyncRules()) {
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
- storage: storageEngine.activeBucketStorage,
57
- parseOptions: routerEngine!.getAPI().getParseSyncRulesOptions(),
59
+ syncContext: syncContext,
60
+ bucketStorage,
61
+ syncRules: syncRules,
58
62
  params,
59
63
  syncParams,
60
64
  token: payload.context.token_payload!,
@@ -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
- using syncRulesStorage = storageFactory.getInstance(syncRules);
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
  }