@powersync/service-module-postgres-storage 0.0.0-dev-20260602073133 → 0.0.0-dev-20260909133214

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 (133) hide show
  1. package/CHANGELOG.md +179 -6
  2. package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.d.ts +3 -0
  3. package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.js +42 -0
  4. package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.js.map +1 -0
  5. package/dist/migrations/scripts/1784900000000-source-metadata.d.ts +3 -0
  6. package/dist/migrations/scripts/1784900000000-source-metadata.js +22 -0
  7. package/dist/migrations/scripts/1784900000000-source-metadata.js.map +1 -0
  8. package/dist/migrations/scripts/1788000000000-sync-config-version-label.d.ts +3 -0
  9. package/dist/migrations/scripts/1788000000000-sync-config-version-label.js +12 -0
  10. package/dist/migrations/scripts/1788000000000-sync-config-version-label.js.map +1 -0
  11. package/dist/{@types/storage → storage}/PostgresBucketStorageFactory.d.ts +14 -12
  12. package/dist/storage/PostgresBucketStorageFactory.js +73 -62
  13. package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
  14. package/dist/{@types/storage → storage}/PostgresCompactor.d.ts +3 -1
  15. package/dist/storage/PostgresCompactor.js +21 -1
  16. package/dist/storage/PostgresCompactor.js.map +1 -1
  17. package/dist/storage/PostgresReportStorage.js.map +1 -1
  18. package/dist/storage/PostgresStorageProvider.js +3 -1
  19. package/dist/storage/PostgresStorageProvider.js.map +1 -1
  20. package/dist/{@types/storage → storage}/PostgresSyncRulesStorage.d.ts +39 -13
  21. package/dist/storage/PostgresSyncRulesStorage.js +266 -181
  22. package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
  23. package/dist/{@types/storage → storage}/batch/PostgresBucketBatch.d.ts +10 -26
  24. package/dist/storage/batch/PostgresBucketBatch.js +290 -286
  25. package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
  26. package/dist/{@types/storage → storage}/checkpoints/PostgresWriteCheckpointAPI.d.ts +2 -2
  27. package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js +163 -26
  28. package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js.map +1 -1
  29. package/dist/{@types/storage → storage}/current-data-store.d.ts +8 -2
  30. package/dist/storage/current-data-store.js +66 -11
  31. package/dist/storage/current-data-store.js.map +1 -1
  32. package/dist/{@types/storage → storage}/storage-index.d.ts +1 -0
  33. package/dist/storage/storage-index.js +1 -0
  34. package/dist/storage/storage-index.js.map +1 -1
  35. package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.d.ts +17 -0
  36. package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js +94 -0
  37. package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js.map +1 -0
  38. package/dist/{@types/types → types}/models/ActiveCheckpoint.d.ts +2 -2
  39. package/dist/types/models/ActiveCheckpoint.js +3 -2
  40. package/dist/types/models/ActiveCheckpoint.js.map +1 -1
  41. package/dist/{@types/types → types}/models/ActiveCheckpointNotification.d.ts +2 -2
  42. package/dist/types/models/BucketData.d.ts +22 -0
  43. package/dist/types/models/BucketData.js +7 -6
  44. package/dist/types/models/BucketData.js.map +1 -1
  45. package/dist/{@types/types → types}/models/CurrentData.d.ts +1 -1
  46. package/dist/types/models/CurrentData.js +2 -1
  47. package/dist/types/models/CurrentData.js.map +1 -1
  48. package/dist/{@types/types → types}/models/SdkReporting.d.ts +3 -3
  49. package/dist/types/models/SdkReporting.js +3 -5
  50. package/dist/types/models/SdkReporting.js.map +1 -1
  51. package/dist/{@types/types → types}/models/SourceTable.d.ts +13 -8
  52. package/dist/types/models/SourceTable.js +11 -6
  53. package/dist/types/models/SourceTable.js.map +1 -1
  54. package/dist/{@types/types → types}/models/SyncRules.d.ts +11 -10
  55. package/dist/types/models/SyncRules.js +12 -11
  56. package/dist/types/models/SyncRules.js.map +1 -1
  57. package/dist/{@types/types → types}/models/WriteCheckpoint.d.ts +2 -0
  58. package/dist/types/models/WriteCheckpoint.js +6 -2
  59. package/dist/types/models/WriteCheckpoint.js.map +1 -1
  60. package/dist/{@types/types → types}/types.d.ts +2 -0
  61. package/dist/utils/checkpoints.d.ts +9 -0
  62. package/dist/utils/checkpoints.js +26 -0
  63. package/dist/utils/checkpoints.js.map +1 -0
  64. package/dist/utils/test-utils.js +2 -2
  65. package/dist/utils/test-utils.js.map +1 -1
  66. package/package.json +10 -22
  67. package/src/migrations/scripts/1782950400000-checkpoint-requested-at.ts +51 -0
  68. package/src/migrations/scripts/1784900000000-source-metadata.ts +31 -0
  69. package/src/migrations/scripts/1788000000000-sync-config-version-label.ts +18 -0
  70. package/src/storage/PostgresBucketStorageFactory.ts +82 -65
  71. package/src/storage/PostgresCompactor.ts +25 -1
  72. package/src/storage/PostgresReportStorage.ts +1 -2
  73. package/src/storage/PostgresStorageProvider.ts +3 -1
  74. package/src/storage/PostgresSyncRulesStorage.ts +295 -196
  75. package/src/storage/batch/PostgresBucketBatch.ts +321 -310
  76. package/src/storage/checkpoints/PostgresWriteCheckpointAPI.ts +176 -26
  77. package/src/storage/current-data-store.ts +66 -11
  78. package/src/storage/storage-index.ts +1 -0
  79. package/src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts +105 -0
  80. package/src/types/models/ActiveCheckpoint.ts +3 -2
  81. package/src/types/models/BucketData.ts +7 -6
  82. package/src/types/models/CurrentData.ts +2 -1
  83. package/src/types/models/SdkReporting.ts +4 -4
  84. package/src/types/models/SourceTable.ts +12 -6
  85. package/src/types/models/SyncRules.ts +12 -11
  86. package/src/types/models/WriteCheckpoint.ts +6 -2
  87. package/src/utils/checkpoints.ts +31 -0
  88. package/src/utils/test-utils.ts +2 -2
  89. package/test/src/__snapshots__/storage_sync.test.ts.snap +44 -1621
  90. package/test/src/checkpoint_notifications.test.ts +528 -0
  91. package/test/src/migrations.test.ts +1 -1
  92. package/test/src/storage.test.ts +235 -11
  93. package/test/src/storage_compacting.test.ts +17 -9
  94. package/test/src/storage_sync.test.ts +55 -8
  95. package/test/src/util.ts +1 -1
  96. package/test/tsconfig.json +1 -3
  97. package/tsconfig.json +1 -4
  98. package/tsconfig.tsbuildinfo +1 -0
  99. package/dist/.tsbuildinfo +0 -1
  100. package/dist/@types/storage/sync-rules/PostgresPersistedSyncRulesContent.d.ts +0 -9
  101. package/dist/@types/types/models/BucketData.d.ts +0 -22
  102. package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js +0 -49
  103. package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js.map +0 -1
  104. package/src/storage/sync-rules/PostgresPersistedSyncRulesContent.ts +0 -54
  105. /package/dist/{@types/index.d.ts → index.d.ts} +0 -0
  106. /package/dist/{@types/migrations → migrations}/PostgresMigrationAgent.d.ts +0 -0
  107. /package/dist/{@types/migrations → migrations}/PostgresMigrationStore.d.ts +0 -0
  108. /package/dist/{@types/migrations → migrations}/migration-utils.d.ts +0 -0
  109. /package/dist/{@types/migrations → migrations}/scripts/1684951997326-init.d.ts +0 -0
  110. /package/dist/{@types/migrations → migrations}/scripts/1749024804042-snapshot-progress.d.ts +0 -0
  111. /package/dist/{@types/migrations → migrations}/scripts/1756282360128-connection-reporting.d.ts +0 -0
  112. /package/dist/{@types/migrations → migrations}/scripts/1771232439485-storage-version.d.ts +0 -0
  113. /package/dist/{@types/migrations → migrations}/scripts/1771424826685-current-data-pending-deletes.d.ts +0 -0
  114. /package/dist/{@types/migrations → migrations}/scripts/1771491856000-sync-plan.d.ts +0 -0
  115. /package/dist/{@types/module → module}/PostgresStorageModule.d.ts +0 -0
  116. /package/dist/{@types/storage → storage}/PostgresReportStorage.d.ts +0 -0
  117. /package/dist/{@types/storage → storage}/PostgresStorageProvider.d.ts +0 -0
  118. /package/dist/{@types/storage → storage}/batch/OperationBatch.d.ts +0 -0
  119. /package/dist/{@types/storage → storage}/batch/PostgresPersistedBatch.d.ts +0 -0
  120. /package/dist/{@types/storage → storage}/table-id.d.ts +0 -0
  121. /package/dist/{@types/types → types}/codecs.d.ts +0 -0
  122. /package/dist/{@types/types → types}/models/BucketParameters.d.ts +0 -0
  123. /package/dist/{@types/types → types}/models/Instance.d.ts +0 -0
  124. /package/dist/{@types/types → types}/models/Migration.d.ts +0 -0
  125. /package/dist/{@types/types → types}/models/json.d.ts +0 -0
  126. /package/dist/{@types/types → types}/models/models-index.d.ts +0 -0
  127. /package/dist/{@types/utils → utils}/application-name.d.ts +0 -0
  128. /package/dist/{@types/utils → utils}/bson.d.ts +0 -0
  129. /package/dist/{@types/utils → utils}/bucket-data.d.ts +0 -0
  130. /package/dist/{@types/utils → utils}/db.d.ts +0 -0
  131. /package/dist/{@types/utils → utils}/test-utils.d.ts +0 -0
  132. /package/dist/{@types/utils → utils}/ts-codec.d.ts +0 -0
  133. /package/dist/{@types/utils → utils}/utils-index.d.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/utils/test-utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-utils.js","sourceRoot":"","sources":["../../src/utils/test-utils.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,44 +1,32 @@
1
1
  {
2
2
  "name": "@powersync/service-module-postgres-storage",
3
3
  "repository": "https://github.com/powersync-ja/powersync-service",
4
- "types": "dist/@types/index.d.ts",
5
- "version": "0.0.0-dev-20260602073133",
6
- "main": "dist/index.js",
4
+ "version": "0.0.0-dev-20260909133214",
7
5
  "license": "FSL-1.1-ALv2",
8
6
  "type": "module",
9
7
  "publishConfig": {
10
8
  "access": "public"
11
9
  },
12
10
  "exports": {
13
- ".": {
14
- "types": "./dist/@types/index.d.ts",
15
- "import": "./dist/index.js",
16
- "require": "./dist/index.js",
17
- "default": "./dist/index.js"
18
- },
19
- "./types": {
20
- "types": "./dist/@types/index.d.ts",
21
- "import": "./dist/types/types.js",
22
- "require": "./dist/types/types.js",
23
- "default": "./dist/types/types.js"
24
- }
11
+ ".": "./dist/index.js",
12
+ "./types": "./dist/types/types.js"
25
13
  },
26
14
  "dependencies": {
27
15
  "ix": "^5.0.0",
28
16
  "lru-cache": "^10.2.2",
29
17
  "ts-codec": "^1.3.0",
30
18
  "uuid": "^14.0.0",
31
- "@powersync/lib-service-postgres": "0.0.0-dev-20260602073133",
32
- "@powersync/lib-services-framework": "0.0.0-dev-20260602073133",
33
- "@powersync/service-core": "0.0.0-dev-20260602073133",
34
- "@powersync/service-types": "0.15.2",
35
- "@powersync/service-jpgwire": "0.0.0-dev-20260602073133",
19
+ "@powersync/lib-service-postgres": "0.0.0-dev-20260909133214",
20
+ "@powersync/lib-services-framework": "0.0.0-dev-20260909133214",
21
+ "@powersync/service-core": "0.0.0-dev-20260909133214",
22
+ "@powersync/service-types": "0.18.0",
23
+ "@powersync/service-jpgwire": "0.0.0-dev-20260909133214",
36
24
  "@powersync/service-jsonbig": "0.17.13",
37
- "@powersync/service-sync-rules": "0.0.0-dev-20260602073133"
25
+ "@powersync/service-sync-rules": "0.0.0-dev-20260909133214"
38
26
  },
39
27
  "devDependencies": {
40
28
  "typescript": "~6.0.3",
41
- "@powersync/service-core-tests": "0.0.0-dev-20260602073133"
29
+ "@powersync/service-core-tests": "0.0.0-dev-20260909133214"
42
30
  },
43
31
  "scripts": {
44
32
  "build": "tsc -b",
@@ -0,0 +1,51 @@
1
+ import { migrations } from '@powersync/service-core';
2
+
3
+ import { openMigrationDB } from '../migration-utils.js';
4
+
5
+ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
6
+ const {
7
+ service_context: { configuration }
8
+ } = context;
9
+ await using client = openMigrationDB(configuration.storage);
10
+
11
+ await client.transaction(async (db) => {
12
+ await db.sql`
13
+ ALTER TABLE write_checkpoints
14
+ ADD COLUMN checkpoint_requested_at TIMESTAMP WITH TIME ZONE
15
+ `.execute();
16
+ await db.sql`
17
+ ALTER TABLE custom_write_checkpoints
18
+ ADD COLUMN checkpoint_requested_at TIMESTAMP WITH TIME ZONE
19
+ `.execute();
20
+ await db.sql`
21
+ CREATE INDEX write_checkpoints_checkpoint_requested_at ON write_checkpoints (checkpoint_requested_at)
22
+ WHERE
23
+ checkpoint_requested_at IS NOT NULL
24
+ `.execute();
25
+ await db.sql`
26
+ CREATE INDEX custom_write_checkpoints_checkpoint_requested_at ON custom_write_checkpoints (checkpoint_requested_at)
27
+ WHERE
28
+ checkpoint_requested_at IS NOT NULL
29
+ `.execute();
30
+ });
31
+ };
32
+
33
+ export const down: migrations.PowerSyncMigrationFunction = async (context) => {
34
+ const {
35
+ service_context: { configuration }
36
+ } = context;
37
+ await using client = openMigrationDB(configuration.storage);
38
+
39
+ await client.transaction(async (db) => {
40
+ // Also drops the write_checkpoints_checkpoint_requested_at index.
41
+ await db.sql`
42
+ ALTER TABLE write_checkpoints
43
+ DROP COLUMN checkpoint_requested_at
44
+ `.execute();
45
+ // Also drops the custom_write_checkpoints_checkpoint_requested_at index.
46
+ await db.sql`
47
+ ALTER TABLE custom_write_checkpoints
48
+ DROP COLUMN checkpoint_requested_at
49
+ `.execute();
50
+ });
51
+ };
@@ -0,0 +1,31 @@
1
+ import { migrations } from '@powersync/service-core';
2
+
3
+ import { openMigrationDB } from '../migration-utils.js';
4
+
5
+ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
6
+ const {
7
+ service_context: { configuration }
8
+ } = context;
9
+ await using client = openMigrationDB(configuration.storage);
10
+
11
+ await client.transaction(async (db) => {
12
+ await db.sql`
13
+ ALTER TABLE source_tables
14
+ ADD COLUMN source_metadata JSONB
15
+ `.execute();
16
+ });
17
+ };
18
+
19
+ export const down: migrations.PowerSyncMigrationFunction = async (context) => {
20
+ const {
21
+ service_context: { configuration }
22
+ } = context;
23
+ await using client = openMigrationDB(configuration.storage);
24
+
25
+ await client.transaction(async (db) => {
26
+ await db.sql`
27
+ ALTER TABLE source_tables
28
+ DROP COLUMN source_metadata
29
+ `.execute();
30
+ });
31
+ };
@@ -0,0 +1,18 @@
1
+ import { migrations } from '@powersync/service-core';
2
+ import { openMigrationDB } from '../migration-utils.js';
3
+
4
+ export const up: migrations.PowerSyncMigrationFunction = async (context) => {
5
+ const {
6
+ service_context: { configuration }
7
+ } = context;
8
+ await using client = openMigrationDB(configuration.storage);
9
+ await client.sql`ALTER TABLE sync_rules ADD COLUMN version_label TEXT`.execute();
10
+ };
11
+
12
+ export const down: migrations.PowerSyncMigrationFunction = async (context) => {
13
+ const {
14
+ service_context: { configuration }
15
+ } = context;
16
+ await using client = openMigrationDB(configuration.storage);
17
+ await client.sql`ALTER TABLE sync_rules DROP COLUMN version_label`.execute();
18
+ };
@@ -1,4 +1,4 @@
1
- import { framework, GetIntanceOptions, storage, SyncRulesBucketStorage } from '@powersync/service-core';
1
+ import { framework, GetIntanceOptions, storage } from '@powersync/service-core';
2
2
  import * as pg_wire from '@powersync/service-jpgwire';
3
3
  import crypto from 'crypto';
4
4
  import * as uuid from 'uuid';
@@ -8,19 +8,20 @@ import { models, NormalizedPostgresStorageConfig } from '../types/types.js';
8
8
 
9
9
  import { getStorageApplicationName } from '../utils/application-name.js';
10
10
  import { NOTIFICATION_CHANNEL, STORAGE_SCHEMA_NAME } from '../utils/db.js';
11
- import { notifySyncRulesUpdate } from './batch/PostgresBucketBatch.js';
12
11
  import { PostgresSyncRulesStorage } from './PostgresSyncRulesStorage.js';
13
- import { PostgresPersistedSyncRulesContent } from './sync-rules/PostgresPersistedSyncRulesContent.js';
12
+ import { PostgresPersistedReplicationStream } from './sync-rules/PostgresPersistedSyncConfigContent.js';
14
13
 
15
14
  export type PostgresBucketStorageOptions = {
16
15
  config: NormalizedPostgresStorageConfig;
17
- slot_name_prefix: string;
16
+ replicationStreamNamePrefix: string;
17
+ checksumCacheTtlMs?: number;
18
+ defaultStorageVersion?: number;
18
19
  };
19
20
 
20
21
  export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
21
22
  [framework.DO_NOT_LOG] = true;
22
23
  readonly db: lib_postgres.DatabaseClient;
23
- public readonly slot_name_prefix: string;
24
+ public readonly replicationStreamNamePrefix: string;
24
25
 
25
26
  private activeStorageCache: storage.SyncRulesBucketStorage | undefined;
26
27
 
@@ -32,7 +33,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
32
33
  notificationChannels: [NOTIFICATION_CHANNEL],
33
34
  applicationName: getStorageApplicationName()
34
35
  });
35
- this.slot_name_prefix = options.slot_name_prefix;
36
+ this.replicationStreamNamePrefix = options.replicationStreamNamePrefix;
36
37
 
37
38
  this.db.registerListener({
38
39
  connectionCreated: async (connection) => this.prepareStatements(connection)
@@ -49,35 +50,37 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
49
50
  }
50
51
 
51
52
  getInstance(
52
- syncRules: storage.PersistedSyncRulesContent,
53
+ replicationStream: storage.PersistedReplicationStream,
53
54
  options?: GetIntanceOptions
54
55
  ): storage.SyncRulesBucketStorage {
55
- const storage = new PostgresSyncRulesStorage({
56
+ const syncRuleStorage = new PostgresSyncRulesStorage({
56
57
  factory: this,
57
58
  db: this.db,
58
- sync_rules: syncRules,
59
- batchLimits: this.options.config.batch_limits
59
+ replicationStream,
60
+ batchLimits: this.options.config.batch_limits,
61
+ checksumCacheTtlMs: this.options.checksumCacheTtlMs
60
62
  });
61
63
  if (!options?.skipLifecycleHooks) {
62
- this.iterateListeners((cb) => cb.syncStorageCreated?.(storage));
64
+ this.iterateListeners((cb) => cb.syncStorageCreated?.(syncRuleStorage));
63
65
  }
64
- storage.registerListener({
66
+ syncRuleStorage.registerListener({
65
67
  batchStarted: (batch) => {
66
68
  batch.registerListener({
67
69
  replicationEvent: (payload) => this.iterateListeners((cb) => cb.replicationEvent?.(payload))
68
70
  });
69
71
  }
70
72
  });
71
- return storage;
73
+ return syncRuleStorage;
72
74
  }
73
75
 
74
76
  async getStorageMetrics(): Promise<storage.StorageMetrics> {
75
- const active_sync_rules = await this.getActiveSyncRules({ defaultSchema: 'public' });
76
- if (active_sync_rules == null) {
77
+ const activeSyncConfig = await this.getActiveSyncConfig();
78
+ if (activeSyncConfig == null) {
77
79
  return {
78
80
  operations_size_bytes: 0,
79
81
  parameters_size_bytes: 0,
80
- replication_size_bytes: 0
82
+ replication_size_bytes: 0,
83
+ object_storage_size_bytes: 0
81
84
  };
82
85
  }
83
86
 
@@ -103,7 +106,8 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
103
106
  return {
104
107
  operations_size_bytes: Number(sizes!.operations_size_bytes),
105
108
  parameters_size_bytes: Number(sizes!.parameter_size_bytes),
106
- replication_size_bytes: Number(sizes!.v1_current_size_bytes) + Number(sizes!.v3_current_size_bytes)
109
+ replication_size_bytes: Number(sizes!.v1_current_size_bytes) + Number(sizes!.v3_current_size_bytes),
110
+ object_storage_size_bytes: 0
107
111
  };
108
112
  }
109
113
 
@@ -153,14 +157,17 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
153
157
  };
154
158
  }
155
159
 
156
- async updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedSyncRulesContent> {
160
+ async updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedReplicationStream> {
157
161
  const storageVersion =
158
- options.storageVersion ?? options.config.parsed.config.storageVersion ?? storage.CURRENT_STORAGE_VERSION;
162
+ options.storageVersion ??
163
+ options.config.parsed.config.storageVersion ??
164
+ this.options.defaultStorageVersion ??
165
+ storage.CURRENT_STORAGE_VERSION;
159
166
  const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
160
- if (storageConfig == null) {
167
+ if (storageConfig == null || storageVersion >= storage.STORAGE_VERSION_4) {
161
168
  throw new framework.ServiceError(
162
169
  framework.ErrorCode.PSYNC_S1005,
163
- `Unsupported storage version ${storageVersion}`
170
+ `Unsupported storage version ${storageVersion} for PostgreSQL storage`
164
171
  );
165
172
  }
166
173
  await this.initializeStorageVersion(storageConfig);
@@ -186,7 +193,8 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
186
193
  sync_plan,
187
194
  state,
188
195
  slot_name,
189
- storage_version
196
+ storage_version,
197
+ version_label
190
198
  )
191
199
  VALUES
192
200
  (
@@ -200,7 +208,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
200
208
  ${{ type: 'json', value: options.config.plan }},
201
209
  ${{ type: 'varchar', value: storage.SyncRuleState.PROCESSING }},
202
210
  CONCAT(
203
- ${{ type: 'varchar', value: this.slot_name_prefix }},
211
+ ${{ type: 'varchar', value: this.replicationStreamNamePrefix }},
204
212
  (
205
213
  SELECT
206
214
  id
@@ -210,7 +218,8 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
210
218
  '_',
211
219
  ${{ type: 'varchar', value: crypto.randomBytes(2).toString('hex') }}
212
220
  ),
213
- ${{ type: 'int4', value: storageVersion }}
221
+ ${{ type: 'int4', value: storageVersion }},
222
+ ${{ type: 'varchar', value: options.version_label ?? null }}
214
223
  )
215
224
  RETURNING
216
225
  *
@@ -218,9 +227,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
218
227
  .decoded(models.SyncRules)
219
228
  .first();
220
229
 
221
- await notifySyncRulesUpdate(this.db, newSyncRulesRow!);
222
-
223
- return new PostgresPersistedSyncRulesContent(this.db, newSyncRulesRow!);
230
+ return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow!);
224
231
  });
225
232
  }
226
233
 
@@ -252,28 +259,28 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
252
259
  `.execute();
253
260
  }
254
261
 
255
- async restartReplication(sync_rules_group_id: number): Promise<void> {
256
- const next = await this.getNextSyncRulesContent();
257
- const active = await this.getActiveSyncRulesContent();
262
+ async restartReplication(replicationStreamId: number): Promise<void> {
263
+ const next = await this.getDeployingSyncConfig();
264
+ const active = await this.getActiveSyncConfig();
258
265
 
259
266
  // In both the below cases, we create a new replication stream.
260
267
  // The current one will continue serving sync requests until the next one has finished processing.
261
- if (next != null && next.id == sync_rules_group_id) {
268
+ if (next != null && next.content.replicationStreamId == replicationStreamId) {
262
269
  // We need to redo the "next" replication stream
263
270
 
264
- await this.updateSyncRules(next.asUpdateOptions());
271
+ await this.updateSyncRules(next.content.asUpdateOptions());
265
272
  // Pro-actively stop replicating
266
273
  await this.db.sql`
267
274
  UPDATE sync_rules
268
275
  SET
269
276
  state = ${{ value: storage.SyncRuleState.STOP, type: 'varchar' }}
270
277
  WHERE
271
- id = ${{ value: next.id, type: 'int4' }}
278
+ id = ${{ value: next.content.replicationStreamId, type: 'int4' }}
272
279
  AND state = ${{ value: storage.SyncRuleState.PROCESSING, type: 'varchar' }}
273
280
  `.execute();
274
- } else if (next == null && active?.id == sync_rules_group_id) {
281
+ } else if (next == null && active?.content.replicationStreamId == replicationStreamId) {
275
282
  // Slot removed for "active" replication stream, while there is no "next" one.
276
- await this.updateSyncRules(active.asUpdateOptions());
283
+ await this.updateSyncRules(active.content.asUpdateOptions());
277
284
 
278
285
  // Pro-actively stop replicating, but still serve clients with existing data
279
286
  await this.db.sql`
@@ -281,10 +288,10 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
281
288
  SET
282
289
  state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
283
290
  WHERE
284
- id = ${{ value: active.id, type: 'int4' }}
291
+ id = ${{ value: active.content.replicationStreamId, type: 'int4' }}
285
292
  AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
286
293
  `.execute();
287
- } else if (next != null && active?.id == sync_rules_group_id) {
294
+ } else if (next != null && active?.content.replicationStreamId == replicationStreamId) {
288
295
  // Already have "next" replication stream - don't update any.
289
296
 
290
297
  // Pro-actively stop replicating, but still serve clients with existing data
@@ -293,13 +300,13 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
293
300
  SET
294
301
  state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
295
302
  WHERE
296
- id = ${{ value: active.id, type: 'int4' }}
303
+ id = ${{ value: active.content.replicationStreamId, type: 'int4' }}
297
304
  AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
298
305
  `.execute();
299
306
  }
300
307
  }
301
308
 
302
- async getActiveSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null> {
309
+ async getActiveSyncConfig(): Promise<storage.ResolvedSyncConfig | null> {
303
310
  const activeRow = await this.db.sql`
304
311
  SELECT
305
312
  *
@@ -319,11 +326,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
319
326
  return null;
320
327
  }
321
328
 
322
- return new PostgresPersistedSyncRulesContent(this.db, activeRow);
329
+ return this.resolvedSyncConfigFromRow(activeRow, { cacheActiveStorage: true });
323
330
  }
324
331
 
325
- async getNextSyncRulesContent(): Promise<storage.PersistedSyncRulesContent | null> {
326
- const nextRow = await this.db.sql`
332
+ async getDeployingSyncConfig(): Promise<storage.ResolvedSyncConfig | null> {
333
+ const row = await this.db.sql`
327
334
  SELECT
328
335
  *
329
336
  FROM
@@ -337,14 +344,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
337
344
  `
338
345
  .decoded(models.SyncRules)
339
346
  .first();
340
- if (!nextRow) {
341
- return null;
342
- }
343
347
 
344
- return new PostgresPersistedSyncRulesContent(this.db, nextRow);
348
+ return row == null ? null : this.resolvedSyncConfigFromRow(row);
345
349
  }
346
350
 
347
- async getReplicatingSyncRules(): Promise<storage.PersistedSyncRulesContent[]> {
351
+ async getReplicatingReplicationStreams(): Promise<storage.PersistedReplicationStream[]> {
348
352
  const rows = await this.db.sql`
349
353
  SELECT
350
354
  *
@@ -357,10 +361,10 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
357
361
  .decoded(models.SyncRules)
358
362
  .rows();
359
363
 
360
- return rows.map((row) => new PostgresPersistedSyncRulesContent(this.db, row));
364
+ return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
361
365
  }
362
366
 
363
- async getStoppedSyncRules(): Promise<storage.PersistedSyncRulesContent[]> {
367
+ async getStoppedReplicationStreams(): Promise<storage.PersistedReplicationStream[]> {
364
368
  const rows = await this.db.sql`
365
369
  SELECT
366
370
  *
@@ -372,24 +376,37 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
372
376
  .decoded(models.SyncRules)
373
377
  .rows();
374
378
 
375
- return rows.map((row) => new PostgresPersistedSyncRulesContent(this.db, row));
379
+ return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
376
380
  }
377
381
 
378
- async getActiveStorage(): Promise<SyncRulesBucketStorage | null> {
379
- const content = await this.getActiveSyncRulesContent();
380
- if (content == null) {
381
- return null;
382
- }
382
+ private resolvedSyncConfigFromRow(
383
+ row: models.SyncRulesDecoded,
384
+ options: { cacheActiveStorage?: boolean } = {}
385
+ ): storage.ResolvedSyncConfig {
386
+ const stream = new PostgresPersistedReplicationStream(this.db, row);
387
+ const content = stream.syncConfigContent[0];
388
+ const thisFactory = this;
383
389
 
384
- // It is important that this instance is cached.
385
- // Not for the instance construction itself, but to ensure that internal caches on the instance
386
- // are re-used properly.
387
- if (this.activeStorageCache?.group_id == content.id) {
388
- return this.activeStorageCache;
389
- } else {
390
- const instance = this.getInstance(content);
391
- this.activeStorageCache = instance;
392
- return instance;
393
- }
390
+ return {
391
+ content,
392
+ replicationStream: stream,
393
+ get storage() {
394
+ // It is important that this instance is cached.
395
+ // Not for the instance construction itself, but to ensure that internal caches on the instance
396
+ // are re-used properly.
397
+ if (options.cacheActiveStorage) {
398
+ const activeStorageCache = thisFactory.activeStorageCache;
399
+ if (activeStorageCache?.replicationStreamId == stream.replicationStreamId) {
400
+ return activeStorageCache;
401
+ }
402
+ }
403
+
404
+ const instance = thisFactory.getInstance(stream);
405
+ if (options.cacheActiveStorage) {
406
+ thisFactory.activeStorageCache = instance;
407
+ }
408
+ return instance;
409
+ }
410
+ };
394
411
  }
395
412
  }
@@ -53,6 +53,7 @@ export class PostgresCompactor {
53
53
  private clearBatchLimit: number;
54
54
  private maxOpId: InternalOpId;
55
55
  private buckets: string[] | undefined;
56
+ private deleteCheckpointRequestsBefore: Date | undefined;
56
57
 
57
58
  constructor(
58
59
  private db: lib_postgres.DatabaseClient,
@@ -65,14 +66,17 @@ export class PostgresCompactor {
65
66
  this.clearBatchLimit = options.clearBatchLimit ?? DEFAULT_CLEAR_BATCH_LIMIT;
66
67
  this.maxOpId = options.maxOpId ?? 0n;
67
68
  this.buckets = options.compactBuckets;
69
+ this.deleteCheckpointRequestsBefore = options.deleteCheckpointRequestsBefore;
68
70
  }
69
71
 
70
72
  /**
71
73
  * Compact buckets by converting operations into MOVE and/or CLEAR operations.
72
74
  *
73
- * See /docs/compacting-operations.md for details.
75
+ * See /docs/storage/compacting-operations.md for details.
74
76
  */
75
77
  async compact() {
78
+ await this.deleteOldCheckpointRequests();
79
+
76
80
  if (this.buckets) {
77
81
  for (let bucket of this.buckets) {
78
82
  await this.compactSingleBucket(bucket);
@@ -82,6 +86,26 @@ export class PostgresCompactor {
82
86
  }
83
87
  }
84
88
 
89
+ private async deleteOldCheckpointRequests() {
90
+ if (this.deleteCheckpointRequestsBefore == null) {
91
+ return;
92
+ }
93
+
94
+ await this.db.sql`
95
+ DELETE FROM write_checkpoints
96
+ WHERE
97
+ checkpoint_requested_at IS NOT NULL
98
+ AND checkpoint_requested_at < ${{ type: 1184, value: this.deleteCheckpointRequestsBefore.toISOString() }}
99
+ `.execute();
100
+
101
+ await this.db.sql`
102
+ DELETE FROM custom_write_checkpoints
103
+ WHERE
104
+ checkpoint_requested_at IS NOT NULL
105
+ AND checkpoint_requested_at < ${{ type: 1184, value: this.deleteCheckpointRequestsBefore.toISOString() }}
106
+ `.execute();
107
+ }
108
+
85
109
  private async compactAllBuckets() {
86
110
  const DISCOVERY_BATCH_SIZE = 200;
87
111
  let lastBucket = '';
@@ -3,7 +3,6 @@ import { logger } from '@powersync/lib-services-framework';
3
3
  import { storage } from '@powersync/service-core';
4
4
  import * as pg_wire from '@powersync/service-jpgwire';
5
5
  import { event_types } from '@powersync/service-types';
6
- import { ClientConnectionResponse } from '@powersync/service-types/dist/reports.js';
7
6
  import { toInteger } from 'ix/util/tointeger.js';
8
7
  import { v4 } from 'uuid';
9
8
  import { SdkReporting, SdkReportingDecoded } from '../types/models/SdkReporting.js';
@@ -295,7 +294,7 @@ export class PostgresReportStorage implements storage.ReportStorage {
295
294
  const limit = data.limit || 100;
296
295
  const statement = this.clientsConnectionPagination(data);
297
296
 
298
- const result = await this.db.queryRows<ClientConnectionResponse>(statement.mainQuery);
297
+ const result = await this.db.queryRows<event_types.ClientConnectionResponse>(statement.mainQuery);
299
298
  const items = result.map((item) => ({
300
299
  ...item,
301
300
  /** JS Date conversion to match document schema used for Mongo storage */
@@ -27,7 +27,9 @@ export class PostgresStorageProvider implements storage.StorageProvider {
27
27
  const normalizedConfig = normalizePostgresStorageConfig(decodedConfig);
28
28
  const storageFactory = new PostgresBucketStorageFactory({
29
29
  config: normalizedConfig,
30
- slot_name_prefix: options.resolvedConfig.slot_name_prefix
30
+ replicationStreamNamePrefix: options.resolvedConfig.slot_name_prefix,
31
+ checksumCacheTtlMs: options.resolvedConfig.api_parameters.bucket_count_cache_ttl_minutes * 60_000,
32
+ defaultStorageVersion: decodedConfig.default_storage_version
31
33
  });
32
34
 
33
35
  const reportStorageFactory = new PostgresReportStorage({