@powersync/service-core 1.25.0 → 1.26.0

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 (113) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/dist/api/diagnostics.js +2 -0
  3. package/dist/api/diagnostics.js.map +1 -1
  4. package/dist/entry/commands/compact-action.js +28 -24
  5. package/dist/entry/commands/compact-action.js.map +1 -1
  6. package/dist/metrics/metrics-interfaces.d.ts +5 -1
  7. package/dist/metrics/metrics-interfaces.js.map +1 -1
  8. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.d.ts +36 -0
  9. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js +70 -0
  10. package/dist/metrics/open-telemetry/MetricAttributeFilteringExporter.js.map +1 -0
  11. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js +6 -1
  12. package/dist/metrics/open-telemetry/OpenTelemetryMetricsFactory.js.map +1 -1
  13. package/dist/metrics/open-telemetry/util.js +7 -3
  14. package/dist/metrics/open-telemetry/util.js.map +1 -1
  15. package/dist/replication/AbstractReplicator.js +16 -6
  16. package/dist/replication/AbstractReplicator.js.map +1 -1
  17. package/dist/routes/configure-fastify.d.ts +9 -0
  18. package/dist/routes/endpoints/admin.d.ts +18 -0
  19. package/dist/routes/endpoints/admin.js +3 -1
  20. package/dist/routes/endpoints/admin.js.map +1 -1
  21. package/dist/routes/endpoints/sync-rules.js +3 -1
  22. package/dist/routes/endpoints/sync-rules.js.map +1 -1
  23. package/dist/storage/BucketStorageBatch.d.ts +2 -1
  24. package/dist/storage/BucketStorageBatch.js.map +1 -1
  25. package/dist/storage/BucketStorageFactory.d.ts +28 -4
  26. package/dist/storage/BucketStorageFactory.js +8 -4
  27. package/dist/storage/BucketStorageFactory.js.map +1 -1
  28. package/dist/storage/PersistedSyncConfigContent.d.ts +2 -0
  29. package/dist/storage/PersistedSyncConfigContent.js +23 -10
  30. package/dist/storage/PersistedSyncConfigContent.js.map +1 -1
  31. package/dist/storage/ReplicationEventPayload.d.ts +6 -1
  32. package/dist/storage/SourceTable.d.ts +13 -5
  33. package/dist/storage/SourceTable.js +8 -4
  34. package/dist/storage/SourceTable.js.map +1 -1
  35. package/dist/storage/StorageVersionConfig.d.ts +4 -0
  36. package/dist/storage/StorageVersionConfig.js +10 -1
  37. package/dist/storage/StorageVersionConfig.js.map +1 -1
  38. package/dist/storage/SyncRulesBucketStorage.d.ts +39 -7
  39. package/dist/storage/SyncRulesBucketStorage.js.map +1 -1
  40. package/dist/storage/WriteCheckpointAPI.d.ts +25 -3
  41. package/dist/storage/WriteCheckpointAPI.js.map +1 -1
  42. package/dist/storage/implementation/BucketDefinitionMapping.d.ts +23 -7
  43. package/dist/storage/implementation/BucketDefinitionMapping.js +88 -14
  44. package/dist/storage/implementation/BucketDefinitionMapping.js.map +1 -1
  45. package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js +9 -1
  46. package/dist/storage/implementation/IncrementalReprocessingSyncConfigLog.js.map +1 -1
  47. package/dist/storage/storage-metrics.js +120 -4
  48. package/dist/storage/storage-metrics.js.map +1 -1
  49. package/dist/sync/BucketChecksumState.d.ts +1 -1
  50. package/dist/sync/BucketChecksumState.js.map +1 -1
  51. package/dist/sync/sync.js +37 -9
  52. package/dist/sync/sync.js.map +1 -1
  53. package/dist/sync/util.js +10 -1
  54. package/dist/sync/util.js.map +1 -1
  55. package/dist/util/config/compound-config-collector.js +5 -0
  56. package/dist/util/config/compound-config-collector.js.map +1 -1
  57. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js +1 -0
  58. package/dist/util/config/sync-rules/impl/base64-sync-rules-collector.js.map +1 -1
  59. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js +1 -0
  60. package/dist/util/config/sync-rules/impl/filesystem-sync-rules-collector.js.map +1 -1
  61. package/dist/util/config/sync-rules/sync-rules-provider.d.ts +2 -0
  62. package/dist/util/config/sync-rules/sync-rules-provider.js +3 -0
  63. package/dist/util/config/sync-rules/sync-rules-provider.js.map +1 -1
  64. package/dist/util/config/types.d.ts +1 -0
  65. package/dist/util/protocol-types.d.ts +4 -4
  66. package/dist/util/protocol-types.js +3 -2
  67. package/dist/util/protocol-types.js.map +1 -1
  68. package/dist/util/utils.d.ts +1 -0
  69. package/dist/util/utils.js +15 -0
  70. package/dist/util/utils.js.map +1 -1
  71. package/package.json +6 -5
  72. package/src/api/diagnostics.ts +2 -0
  73. package/src/entry/commands/compact-action.ts +32 -24
  74. package/src/metrics/metrics-interfaces.ts +6 -1
  75. package/src/metrics/open-telemetry/MetricAttributeFilteringExporter.ts +85 -0
  76. package/src/metrics/open-telemetry/OpenTelemetryMetricsFactory.ts +7 -2
  77. package/src/metrics/open-telemetry/util.ts +7 -3
  78. package/src/replication/AbstractReplicator.ts +22 -6
  79. package/src/routes/endpoints/admin.ts +3 -1
  80. package/src/routes/endpoints/sync-rules.ts +3 -1
  81. package/src/storage/BucketStorageBatch.ts +2 -1
  82. package/src/storage/BucketStorageFactory.ts +44 -8
  83. package/src/storage/PersistedSyncConfigContent.ts +26 -11
  84. package/src/storage/ReplicationEventPayload.ts +6 -1
  85. package/src/storage/SourceTable.ts +17 -4
  86. package/src/storage/StorageVersionConfig.ts +11 -1
  87. package/src/storage/SyncRulesBucketStorage.ts +47 -7
  88. package/src/storage/WriteCheckpointAPI.ts +32 -3
  89. package/src/storage/implementation/BucketDefinitionMapping.ts +120 -17
  90. package/src/storage/implementation/IncrementalReprocessingSyncConfigLog.ts +22 -5
  91. package/src/storage/storage-metrics.ts +154 -8
  92. package/src/sync/BucketChecksumState.ts +3 -1
  93. package/src/sync/sync.ts +40 -11
  94. package/src/sync/util.ts +21 -8
  95. package/src/util/config/compound-config-collector.ts +6 -0
  96. package/src/util/config/sync-rules/impl/base64-sync-rules-collector.ts +1 -0
  97. package/src/util/config/sync-rules/impl/filesystem-sync-rules-collector.ts +1 -0
  98. package/src/util/config/sync-rules/sync-rules-provider.ts +5 -0
  99. package/src/util/config/types.ts +1 -0
  100. package/src/util/protocol-types.ts +3 -2
  101. package/src/util/utils.ts +14 -0
  102. package/test/src/AbstractReplicator.test.ts +30 -0
  103. package/test/src/MetricAttributeFilteringExporter.test.ts +96 -0
  104. package/test/src/PersistedSyncConfigContent.test.ts +152 -0
  105. package/test/src/config.test.ts +40 -0
  106. package/test/src/diagnostics.test.ts +25 -0
  107. package/test/src/routes/admin.test.ts +8 -2
  108. package/test/src/routes/stream.test.ts +123 -2
  109. package/test/src/storage/SourceTable.test.ts +4 -1
  110. package/test/src/storage-metrics.test.ts +148 -0
  111. package/test/src/sync/util.test.ts +15 -0
  112. package/test/src/util/utils.test.ts +23 -0
  113. package/tsconfig.tsbuildinfo +1 -1
@@ -15,5 +15,8 @@ export class ConfigurationFileSyncRulesProvider {
15
15
  get exitOnError() {
16
16
  return this.config.exit_on_error;
17
17
  }
18
+ get versionLabel() {
19
+ return this.config.version_label;
20
+ }
18
21
  }
19
22
  //# sourceMappingURL=sync-rules-provider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"sync-rules-provider.js","sourceRoot":"","sources":["../../../../src/util/config/sync-rules/sync-rules-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAS7B,MAAM,OAAO,kCAAkC;IACzB;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAE/C,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;CACF"}
1
+ {"version":3,"file":"sync-rules-provider.js","sourceRoot":"","sources":["../../../../src/util/config/sync-rules/sync-rules-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAU7B,MAAM,OAAO,kCAAkC;IACzB;IAApB,YAAoB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;IAAG,CAAC;IAE/C,KAAK,CAAC,GAAG;QACP,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;QAC7B,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YAC5B,OAAO,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;IAED,IAAI,YAAY;QACd,OAAO,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC;IACnC,CAAC;CACF"}
@@ -17,6 +17,7 @@ export type MigrationContext = {
17
17
  export type Runner = (config: RunnerConfig) => Promise<void>;
18
18
  export type SyncRulesConfig = {
19
19
  present: boolean;
20
+ version_label?: string;
20
21
  content?: string;
21
22
  path?: string;
22
23
  exit_on_error: boolean;
@@ -20,14 +20,14 @@ export declare const RequestedStreamSubscription: t.ObjectCodec<{
20
20
  /**
21
21
  * An optional dictionary of parameters to pass to this specific stream.
22
22
  */
23
- parameters: t.Union<t.RecordCodec<t.Codec<any, any, t.CodecType.Any, t.CodecProps>>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
23
+ parameters: t.Codec<Record<string, any> | null, Record<string, any> | null>;
24
24
  /**
25
25
  * Set when the client wishes to re-assign a different priority to this stream.
26
26
  *
27
27
  * Streams and sync rules can also assign a default priority, but clients are allowed to override those. This can be
28
28
  * useful when the priority for partial syncs depends on e.g. the current page opened in a client.
29
29
  */
30
- override_priority: t.Union<t.IdentityCodec<t.CodecType.Number>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
30
+ override_priority: t.Codec<number | null, number | null>;
31
31
  }>;
32
32
  export type RequestedStreamSubscription = t.Decoded<typeof RequestedStreamSubscription>;
33
33
  /**
@@ -51,14 +51,14 @@ export declare const StreamSubscriptionRequest: t.ObjectCodec<{
51
51
  /**
52
52
  * An optional dictionary of parameters to pass to this specific stream.
53
53
  */
54
- parameters: t.Union<t.RecordCodec<t.Codec<any, any, t.CodecType.Any, t.CodecProps>>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
54
+ parameters: t.Codec<Record<string, any> | null, Record<string, any> | null>;
55
55
  /**
56
56
  * Set when the client wishes to re-assign a different priority to this stream.
57
57
  *
58
58
  * Streams and sync rules can also assign a default priority, but clients are allowed to override those. This can be
59
59
  * useful when the priority for partial syncs depends on e.g. the current page opened in a client.
60
60
  */
61
- override_priority: t.Union<t.IdentityCodec<t.CodecType.Number>, t.Codec<null, null, t.CodecType.Null, t.CodecProps>>;
61
+ override_priority: t.Codec<number | null, number | null>;
62
62
  }>>;
63
63
  }>;
64
64
  export type StreamSubscriptionRequest = t.Decoded<typeof StreamSubscriptionRequest>;
@@ -1,3 +1,4 @@
1
+ import { orNull } from '@powersync/service-types';
1
2
  import * as t from 'ts-codec';
2
3
  export const BucketRequest = t.object({
3
4
  name: t.string,
@@ -17,14 +18,14 @@ export const RequestedStreamSubscription = t.object({
17
18
  /**
18
19
  * An optional dictionary of parameters to pass to this specific stream.
19
20
  */
20
- parameters: t.union(t.record(t.any), t.Null),
21
+ parameters: orNull(t.record(t.any)),
21
22
  /**
22
23
  * Set when the client wishes to re-assign a different priority to this stream.
23
24
  *
24
25
  * Streams and sync rules can also assign a default priority, but clients are allowed to override those. This can be
25
26
  * useful when the priority for partial syncs depends on e.g. the current page opened in a client.
26
27
  */
27
- override_priority: t.union(t.number, t.Null)
28
+ override_priority: orNull(t.number)
28
29
  });
29
30
  /**
30
31
  * An overview of all subscribed streams as part of a streaming sync request.
@@ -1 +1 @@
1
- {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC;IAC5C;;;;;OAKG;IACH,iBAAiB,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC;CAC7C,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC;CACpD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAE3C;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC"}
1
+ {"version":3,"file":"protocol-types.js","sourceRoot":"","sources":["../../src/util/protocol-types.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,0BAA0B,CAAC;AAClD,OAAO,KAAK,CAAC,MAAM,UAAU,CAAC;AAE9B,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,IAAI,EAAE,CAAC,CAAC,MAAM;IAEd;;OAEG;IACH,KAAK,EAAE,CAAC,CAAC,MAAM;CAChB,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAC,CAAC,MAAM,CAAC;IAClD;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC,MAAM;IAChB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACnC;;;;;OAKG;IACH,iBAAiB,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;CACpC,CAAC,CAAC;AAIH;;GAEG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG,CAAC,CAAC,MAAM,CAAC;IAChD;;;;OAIG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,aAAa,EAAE,CAAC,CAAC,KAAK,CAAC,2BAA2B,CAAC;CACpD,CAAC,CAAC;AAIH,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C;;OAEG;IACH,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC,QAAQ,EAAE;IAE1C;;OAEG;IACH,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAElC;;OAEG;IACH,gBAAgB,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,QAAQ,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAEtC;;OAEG;IACH,YAAY,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,QAAQ,EAAE;IAE3C;;OAEG;IACH,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ,EAAE;IAE9B;;OAEG;IACH,OAAO,EAAE,yBAAyB,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC"}
@@ -78,3 +78,4 @@ export declare function flatstr(s: string): string;
78
78
  * Estimate in-memory size of row.
79
79
  */
80
80
  export declare function estimateRowSize(record: sync_rules.ToastableSqliteRow | undefined): number;
81
+ export declare function formatBytes(bytes: number | bigint): string;
@@ -252,4 +252,19 @@ export function estimateRowSize(record) {
252
252
  }
253
253
  return size;
254
254
  }
255
+ export function formatBytes(bytes) {
256
+ if (typeof bytes == 'bigint') {
257
+ bytes = Number(bytes); // We round either way
258
+ }
259
+ if (bytes >= 1024 * 1024 * 1024) {
260
+ return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)}GB`;
261
+ }
262
+ else if (bytes >= 1024 * 1024) {
263
+ return `${(bytes / (1024 * 1024)).toFixed(1)}MB`;
264
+ }
265
+ else if (bytes >= 1024) {
266
+ return `${(bytes / 1024).toFixed(1)}KB`;
267
+ }
268
+ return `${bytes}B`;
269
+ }
255
270
  //# sourceMappingURL=utils.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/util/utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -4,13 +4,14 @@
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
7
- "version": "1.25.0",
7
+ "version": "1.26.0",
8
8
  "license": "FSL-1.1-ALv2",
9
9
  "type": "module",
10
10
  "exports": "./dist/index.js",
11
11
  "dependencies": {
12
12
  "@js-sdsl/ordered-set": "^4.4.2",
13
13
  "@opentelemetry/api": "^1.9.0",
14
+ "@opentelemetry/core": "^2.0.1",
14
15
  "@opentelemetry/exporter-metrics-otlp-http": "^0.203.0",
15
16
  "@opentelemetry/exporter-prometheus": "^0.203.0",
16
17
  "@opentelemetry/resources": "^2.0.1",
@@ -32,11 +33,11 @@
32
33
  "uuid": "^14.0.0",
33
34
  "winston": "^3.13.0",
34
35
  "yaml": "^2.8.3",
35
- "@powersync/lib-services-framework": "0.10.0",
36
36
  "@powersync/service-jsonbig": "0.17.13",
37
- "@powersync/service-rsocket-router": "0.2.25",
38
- "@powersync/service-sync-rules": "0.40.0",
39
- "@powersync/service-types": "0.17.0"
37
+ "@powersync/service-rsocket-router": "0.2.26",
38
+ "@powersync/service-sync-rules": "0.41.0",
39
+ "@powersync/lib-services-framework": "0.10.1",
40
+ "@powersync/service-types": "0.18.0"
40
41
  },
41
42
  "devDependencies": {
42
43
  "@types/async": "^3.2.24",
@@ -65,6 +65,7 @@ export async function getSyncRulesStatus(
65
65
  parsed = singleConfig;
66
66
  } catch (e) {
67
67
  return {
68
+ version_label: syncConfig.version_label,
68
69
  content: include_content ? syncConfig.sync_rules_content : undefined,
69
70
  connections: [],
70
71
  errors: [{ level: 'fatal', message: e.message, ts: now }]
@@ -221,6 +222,7 @@ export async function getSyncRulesStatus(
221
222
  }
222
223
 
223
224
  return {
225
+ version_label: syncConfig.version_label,
224
226
  content: include_content ? syncConfig.sync_rules_content : undefined,
225
227
  connections: [
226
228
  {
@@ -28,7 +28,11 @@ export function registerCompactAction(program: Command) {
28
28
  .command(COMMAND_NAME)
29
29
  .option(`-b, --buckets [buckets]`, 'Full bucket names, comma-separated (e.g., "global[],mybucket[\\"user1\\"]")')
30
30
  .option('-p, --parameter-indexes', 'Compacting parameter indexes. Defaults to set unless --buckets is provided.')
31
- .option('--no-parameter-indexes', 'Disabling compacting parameter indexes.');
31
+ .option('--no-parameter-indexes', 'Disabling compacting parameter indexes.')
32
+ .option(
33
+ '--incremental-only',
34
+ '[EXPERIMENTAL] Perform incremental compacting only. Parameter compaction runs on supported storage versions.'
35
+ );
32
36
 
33
37
  wrapConfigCommand(compactCommand);
34
38
 
@@ -48,8 +52,9 @@ export function registerCompactAction(program: Command) {
48
52
  }
49
53
  }
50
54
 
51
- let compactParameters: boolean | null = options.parameterIndexes;
55
+ const incremental: boolean = options.incrementalOnly ?? false;
52
56
 
57
+ let compactParameters: boolean | null = options.parameterIndexes;
53
58
  if (buckets == null) {
54
59
  logger.info('Compacting storage for all buckets...');
55
60
  } else if (buckets.length == 0) {
@@ -87,29 +92,32 @@ export function registerCompactAction(program: Command) {
87
92
  Date.now() - config.api_parameters.checkpoint_request_retention_minutes * MINUTE_MS
88
93
  );
89
94
 
90
- const active = (await bucketStorage.getActiveSyncConfig())?.storage;
91
- if (active == null) {
92
- logger.info('No active instance to compact');
93
- return;
94
- }
95
- if (buckets != null) {
96
- logger.info('Performing compaction...');
97
- await active.compact({
98
- memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
99
- compactBuckets: buckets,
100
- compactParameterData: compactParameters ?? false,
101
- deleteCheckpointRequestsBefore,
102
- signal: abortController.signal
103
- });
104
- } else {
105
- await active.compact({
106
- memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
107
- compactParameterData: compactParameters ?? true,
108
- deleteCheckpointRequestsBefore,
109
- signal: abortController.signal
110
- });
95
+ const streams = await bucketStorage.getReplicatingReplicationStreams();
96
+ for (let stream of streams) {
97
+ const storage = bucketStorage.getInstance(stream);
98
+ const compactParameterData =
99
+ (compactParameters ?? buckets == null) && (!incremental || storage.supportsIncrementalParameterCompaction());
100
+ logger.info(`[${stream.replicationStreamName}] Performing compaction...`);
101
+ if (buckets != null) {
102
+ await storage.compact({
103
+ memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
104
+ compactBuckets: buckets,
105
+ compactParameterData,
106
+ incrementalOnly: incremental,
107
+ deleteCheckpointRequestsBefore,
108
+ signal: abortController.signal
109
+ });
110
+ } else {
111
+ await storage.compact({
112
+ memoryLimitMB: COMPACT_MEMORY_LIMIT_MB,
113
+ compactParameterData,
114
+ incrementalOnly: incremental,
115
+ deleteCheckpointRequestsBefore,
116
+ signal: abortController.signal
117
+ });
118
+ }
119
+ logger.info(`[${stream.replicationStreamName}] Successfully compacted storage.`);
111
120
  }
112
- logger.info('Successfully compacted storage.');
113
121
  } catch (e) {
114
122
  logger.error(`Failed to compact:`, e);
115
123
  // Indirectly triggers lifeCycleEngine.stop
@@ -19,7 +19,12 @@ export interface ObservableGauge {
19
19
  * Set a value provider that provides the value for the gauge at the time of observation.
20
20
  * @param valueProvider
21
21
  */
22
- setValueProvider(valueProvider: () => Promise<number | undefined>): void;
22
+ setValueProvider(valueProvider: () => Promise<number | ObservableGaugeObservation[] | undefined>): void;
23
+ }
24
+
25
+ export interface ObservableGaugeObservation {
26
+ value: number;
27
+ attributes?: Record<string, string>;
23
28
  }
24
29
 
25
30
  export enum Precision {
@@ -0,0 +1,85 @@
1
+ import { Attributes } from '@opentelemetry/api';
2
+ import { ExportResult } from '@opentelemetry/core';
3
+ import {
4
+ AggregationSelector,
5
+ AggregationTemporalitySelector,
6
+ DataPoint,
7
+ DataPointType,
8
+ MetricData,
9
+ PushMetricExporter,
10
+ ResourceMetrics
11
+ } from '@opentelemetry/sdk-metrics';
12
+
13
+ /**
14
+ * Decorates a push exporter and removes selected attributes from every metric data point before
15
+ * delegating the export. The input metrics are not mutated, so another reader can export the
16
+ * original attributes.
17
+ *
18
+ * This exporter deliberately does not merge data points when filtering makes their attribute sets
19
+ * identical. Both points are forwarded with the same attributes. There is no generally correct
20
+ * merge operation at this layer: gauges, counters, and histograms have different aggregation
21
+ * semantics. Callers must therefore ensure that an excluded attribute does not distinguish data
22
+ * points for the same metric, resource, and instrumentation scope. Otherwise, the resulting
23
+ * duplicate series identity may be rejected or interpreted unpredictably downstream.
24
+ *
25
+ * Lifecycle methods and aggregation selection are delegated unchanged to the wrapped exporter.
26
+ */
27
+ export class MetricAttributeFilteringExporter implements PushMetricExporter {
28
+ readonly selectAggregation?: AggregationSelector;
29
+ readonly selectAggregationTemporality?: AggregationTemporalitySelector;
30
+
31
+ constructor(
32
+ /** The exporter that receives the filtered copy of the metrics. */
33
+ private readonly delegate: PushMetricExporter,
34
+ /** Attribute names to remove from every exported data point. */
35
+ private readonly excludedAttributes: ReadonlySet<string>
36
+ ) {
37
+ this.selectAggregation = delegate.selectAggregation?.bind(delegate);
38
+ this.selectAggregationTemporality = delegate.selectAggregationTemporality?.bind(delegate);
39
+ }
40
+
41
+ export(metrics: ResourceMetrics, resultCallback: (result: ExportResult) => void): void {
42
+ this.delegate.export(this.filterAttributes(metrics), resultCallback);
43
+ }
44
+
45
+ forceFlush(): Promise<void> {
46
+ return this.delegate.forceFlush();
47
+ }
48
+
49
+ shutdown(): Promise<void> {
50
+ return this.delegate.shutdown();
51
+ }
52
+
53
+ private filterAttributes(metrics: ResourceMetrics): ResourceMetrics {
54
+ return {
55
+ ...metrics,
56
+ scopeMetrics: metrics.scopeMetrics.map((scopeMetrics) => ({
57
+ ...scopeMetrics,
58
+ metrics: scopeMetrics.metrics.map((metric) => this.filterMetricAttributes(metric))
59
+ }))
60
+ };
61
+ }
62
+
63
+ private filterMetricAttributes(metric: MetricData): MetricData {
64
+ switch (metric.dataPointType) {
65
+ case DataPointType.SUM:
66
+ case DataPointType.GAUGE:
67
+ return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
68
+ case DataPointType.HISTOGRAM:
69
+ return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
70
+ case DataPointType.EXPONENTIAL_HISTOGRAM:
71
+ return { ...metric, dataPoints: metric.dataPoints.map((dataPoint) => this.filterDataPoint(dataPoint)) };
72
+ }
73
+ }
74
+
75
+ private filterDataPoint<T>(dataPoint: DataPoint<T>): DataPoint<T> {
76
+ return {
77
+ ...dataPoint,
78
+ attributes: this.filterDataPointAttributes(dataPoint.attributes)
79
+ };
80
+ }
81
+
82
+ private filterDataPointAttributes(attributes: Attributes): Attributes {
83
+ return Object.fromEntries(Object.entries(attributes).filter(([name]) => !this.excludedAttributes.has(name)));
84
+ }
85
+ }
@@ -4,6 +4,7 @@ import {
4
4
  MetricMetadata,
5
5
  MetricsFactory,
6
6
  ObservableGauge,
7
+ ObservableGaugeObservation,
7
8
  Precision,
8
9
  UpDownCounter
9
10
  } from '../metrics-interfaces.js';
@@ -31,12 +32,16 @@ export class OpenTelemetryMetricsFactory implements MetricsFactory {
31
32
  });
32
33
 
33
34
  return {
34
- setValueProvider(valueProvider: () => Promise<number | undefined>) {
35
+ setValueProvider(valueProvider: () => Promise<number | ObservableGaugeObservation[] | undefined>) {
35
36
  gauge.addCallback(async (result) => {
36
37
  const value = await valueProvider();
37
38
 
38
- if (value != undefined) {
39
+ if (typeof value === 'number') {
39
40
  result.observe(value);
41
+ } else if (value != undefined) {
42
+ for (const observation of value) {
43
+ result.observe(observation.value, observation.attributes);
44
+ }
40
45
  }
41
46
  });
42
47
  }
@@ -4,6 +4,7 @@ import { MeterProvider, MetricReader, PeriodicExportingMetricReader } from '@ope
4
4
  import { logger } from '@powersync/lib-services-framework';
5
5
  import { ServiceContext } from '../../system/ServiceContext.js';
6
6
  import { MetricsFactory } from '../metrics-interfaces.js';
7
+ import { MetricAttributeFilteringExporter } from './MetricAttributeFilteringExporter.js';
7
8
  import { OpenTelemetryMetricsFactory } from './OpenTelemetryMetricsFactory.js';
8
9
 
9
10
  import { resourceFromAttributes } from '@opentelemetry/resources';
@@ -29,10 +30,13 @@ export function createOpenTelemetryMetricsFactory(context: ServiceContext): Metr
29
30
  }
30
31
 
31
32
  if (!configuration.telemetry.disable_telemetry_sharing) {
33
+ const otlpExporter = new OTLPMetricExporter({
34
+ url: configuration.telemetry.internal_service_endpoint
35
+ });
32
36
  const periodicExporter = new PeriodicExportingMetricReader({
33
- exporter: new OTLPMetricExporter({
34
- url: configuration.telemetry.internal_service_endpoint
35
- }),
37
+ // sync_config_id uniquely identifies these metric series after version_label is removed,
38
+ // so filtering cannot create duplicate data points.
39
+ exporter: new MetricAttributeFilteringExporter(otlpExporter, new Set(['version_label'])),
36
40
  exportIntervalMillis: 1000 * 60 * 5 // 5 minutes
37
41
  });
38
42
 
@@ -156,7 +156,8 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
156
156
 
157
157
  let configuredLock: storage.ReplicationLock | undefined = undefined;
158
158
  if (loadedSyncConfig != null) {
159
- this.logger.info('Loaded sync config');
159
+ const versionLabel = this.syncRuleProvider.versionLabel;
160
+ this.logger.info(`Loaded sync config${versionLabel == null ? '' : ` ${versionLabel}`}`);
160
161
  try {
161
162
  // Configure new sync config, if they have changed.
162
163
  // In that case, also immediately take out a lock, so that another process doesn't start replication on it.
@@ -165,7 +166,11 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
165
166
  // the same time.
166
167
 
167
168
  const { lock } = await this.storage.configureSyncRules(
168
- storage.updateSyncRulesFromYaml(loadedSyncConfig, { lock: true, validate: this.syncRuleProvider.exitOnError })
169
+ storage.updateSyncRulesFromYaml(loadedSyncConfig, {
170
+ lock: true,
171
+ validate: this.syncRuleProvider.exitOnError,
172
+ version_label: versionLabel
173
+ })
169
174
  );
170
175
  if (lock) {
171
176
  configuredLock = lock;
@@ -184,7 +189,11 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
184
189
  while (!this.stopped) {
185
190
  await container.probes.touch();
186
191
  try {
187
- const refreshResult = await this.refresh({ configuredLock, loadedSyncConfig });
192
+ const refreshResult = await this.refresh({
193
+ configuredLock,
194
+ loadedSyncConfig,
195
+ loadedVersionLabel: this.syncRuleProvider.versionLabel
196
+ });
188
197
  if (refreshResult.replicationJobStarted || Date.now() >= fastRefreshDeadline) {
189
198
  useFastRefresh = false;
190
199
  }
@@ -216,6 +225,7 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
216
225
  private async refresh(options?: {
217
226
  configuredLock?: storage.ReplicationLock;
218
227
  loadedSyncConfig?: string;
228
+ loadedVersionLabel?: string;
219
229
  }): Promise<{ replicationJobStarted: boolean }> {
220
230
  if (this.stopped) {
221
231
  return { replicationJobStarted: false };
@@ -233,7 +243,9 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
233
243
  const jobId = replicationStream.replicationJobId;
234
244
  const existingJob = existingJobs.get(jobId);
235
245
  const syncConfigMismatchMessage = 'Ignoring replication stream for sync config not loaded by this process';
236
- if (!this.shouldHandleReplicationStream(replicationStream, options?.loadedSyncConfig)) {
246
+ if (
247
+ !this.shouldHandleReplicationStream(replicationStream, options?.loadedSyncConfig, options?.loadedVersionLabel)
248
+ ) {
237
249
  this.logReplicationStreamInfoOnce(replicationStream, 'sync-config-mismatch', () => {
238
250
  replicationStream.logger.info(syncConfigMismatchMessage);
239
251
  });
@@ -371,7 +383,8 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
371
383
  */
372
384
  private shouldHandleReplicationStream(
373
385
  replicationStream: storage.PersistedReplicationStream,
374
- loadedSyncRules: string | undefined
386
+ loadedSyncRules: string | undefined,
387
+ loadedVersionLabel: string | undefined
375
388
  ) {
376
389
  if (loadedSyncRules == null) {
377
390
  return true;
@@ -380,7 +393,10 @@ export abstract class AbstractReplicator<T extends AbstractReplicationJob = Abst
380
393
  const processingConfig = replicationStream.syncConfigContent.find(
381
394
  (syncConfig) => syncConfig.syncConfigState == storage.SyncRuleState.PROCESSING
382
395
  );
383
- return processingConfig == null || processingConfig.sync_rules_content == loadedSyncRules;
396
+ return (
397
+ processingConfig == null ||
398
+ (processingConfig.sync_rules_content == loadedSyncRules && processingConfig.version_label == loadedVersionLabel)
399
+ );
384
400
  }
385
401
 
386
402
  protected createJobId(syncRuleId: number) {
@@ -165,7 +165,9 @@ export const reprocess = routeDefinition({
165
165
  storage.updateSyncRulesFromYaml(active.content.sync_rules_content, {
166
166
  // This sync config already passed validation. But if the config is not valid anymore due
167
167
  // to a service change, we do want to report the error here.
168
- validate: true
168
+ validate: true,
169
+ version_label: active.content.version_label,
170
+ forceNewReplicationStream: true
169
171
  })
170
172
  );
171
173
 
@@ -180,7 +180,9 @@ export const reprocessSyncRules = routeDefinition({
180
180
  updateSyncRulesFromYaml(sync_rules.sync_rules_content, {
181
181
  // This sync config already passed validation. But if the rules are not valid anymore due
182
182
  // to a service change, we do want to report the error here.
183
- validate: true
183
+ validate: true,
184
+ version_label: sync_rules.version_label,
185
+ forceNewReplicationStream: true
184
186
  })
185
187
  );
186
188
  return {
@@ -176,7 +176,8 @@ export interface BucketStorageBatch extends ObserverClient<BucketBatchStorageLis
176
176
  * Queue a custom checkpoint request to be persisted after operations are
177
177
  * flushed. Set `checkpoint_requested_at` when the custom checkpoint came from
178
178
  * a client checkpoint request and should be cleaned up by request-retention
179
- * compaction; omit it for persistent source-owned checkpoints.
179
+ * compaction; omit it for persistent source-owned checkpoints. Incremental
180
+ * event handlers should copy `event_id` from their {@link ReplicationEventPayload}.
180
181
  */
181
182
  addCustomWriteCheckpoint(checkpoint: BatchedCustomWriteCheckpointOptions): void;
182
183
  }