@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.
- package/CHANGELOG.md +179 -6
- package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.d.ts +3 -0
- package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.js +42 -0
- package/dist/migrations/scripts/1782950400000-checkpoint-requested-at.js.map +1 -0
- package/dist/migrations/scripts/1784900000000-source-metadata.d.ts +3 -0
- package/dist/migrations/scripts/1784900000000-source-metadata.js +22 -0
- package/dist/migrations/scripts/1784900000000-source-metadata.js.map +1 -0
- package/dist/migrations/scripts/1788000000000-sync-config-version-label.d.ts +3 -0
- package/dist/migrations/scripts/1788000000000-sync-config-version-label.js +12 -0
- package/dist/migrations/scripts/1788000000000-sync-config-version-label.js.map +1 -0
- package/dist/{@types/storage → storage}/PostgresBucketStorageFactory.d.ts +14 -12
- package/dist/storage/PostgresBucketStorageFactory.js +73 -62
- package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
- package/dist/{@types/storage → storage}/PostgresCompactor.d.ts +3 -1
- package/dist/storage/PostgresCompactor.js +21 -1
- package/dist/storage/PostgresCompactor.js.map +1 -1
- package/dist/storage/PostgresReportStorage.js.map +1 -1
- package/dist/storage/PostgresStorageProvider.js +3 -1
- package/dist/storage/PostgresStorageProvider.js.map +1 -1
- package/dist/{@types/storage → storage}/PostgresSyncRulesStorage.d.ts +39 -13
- package/dist/storage/PostgresSyncRulesStorage.js +266 -181
- package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
- package/dist/{@types/storage → storage}/batch/PostgresBucketBatch.d.ts +10 -26
- package/dist/storage/batch/PostgresBucketBatch.js +290 -286
- package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
- package/dist/{@types/storage → storage}/checkpoints/PostgresWriteCheckpointAPI.d.ts +2 -2
- package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js +163 -26
- package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js.map +1 -1
- package/dist/{@types/storage → storage}/current-data-store.d.ts +8 -2
- package/dist/storage/current-data-store.js +66 -11
- package/dist/storage/current-data-store.js.map +1 -1
- package/dist/{@types/storage → storage}/storage-index.d.ts +1 -0
- package/dist/storage/storage-index.js +1 -0
- package/dist/storage/storage-index.js.map +1 -1
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.d.ts +17 -0
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js +94 -0
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js.map +1 -0
- package/dist/{@types/types → types}/models/ActiveCheckpoint.d.ts +2 -2
- package/dist/types/models/ActiveCheckpoint.js +3 -2
- package/dist/types/models/ActiveCheckpoint.js.map +1 -1
- package/dist/{@types/types → types}/models/ActiveCheckpointNotification.d.ts +2 -2
- package/dist/types/models/BucketData.d.ts +22 -0
- package/dist/types/models/BucketData.js +7 -6
- package/dist/types/models/BucketData.js.map +1 -1
- package/dist/{@types/types → types}/models/CurrentData.d.ts +1 -1
- package/dist/types/models/CurrentData.js +2 -1
- package/dist/types/models/CurrentData.js.map +1 -1
- package/dist/{@types/types → types}/models/SdkReporting.d.ts +3 -3
- package/dist/types/models/SdkReporting.js +3 -5
- package/dist/types/models/SdkReporting.js.map +1 -1
- package/dist/{@types/types → types}/models/SourceTable.d.ts +13 -8
- package/dist/types/models/SourceTable.js +11 -6
- package/dist/types/models/SourceTable.js.map +1 -1
- package/dist/{@types/types → types}/models/SyncRules.d.ts +11 -10
- package/dist/types/models/SyncRules.js +12 -11
- package/dist/types/models/SyncRules.js.map +1 -1
- package/dist/{@types/types → types}/models/WriteCheckpoint.d.ts +2 -0
- package/dist/types/models/WriteCheckpoint.js +6 -2
- package/dist/types/models/WriteCheckpoint.js.map +1 -1
- package/dist/{@types/types → types}/types.d.ts +2 -0
- package/dist/utils/checkpoints.d.ts +9 -0
- package/dist/utils/checkpoints.js +26 -0
- package/dist/utils/checkpoints.js.map +1 -0
- package/dist/utils/test-utils.js +2 -2
- package/dist/utils/test-utils.js.map +1 -1
- package/package.json +10 -22
- package/src/migrations/scripts/1782950400000-checkpoint-requested-at.ts +51 -0
- package/src/migrations/scripts/1784900000000-source-metadata.ts +31 -0
- package/src/migrations/scripts/1788000000000-sync-config-version-label.ts +18 -0
- package/src/storage/PostgresBucketStorageFactory.ts +82 -65
- package/src/storage/PostgresCompactor.ts +25 -1
- package/src/storage/PostgresReportStorage.ts +1 -2
- package/src/storage/PostgresStorageProvider.ts +3 -1
- package/src/storage/PostgresSyncRulesStorage.ts +295 -196
- package/src/storage/batch/PostgresBucketBatch.ts +321 -310
- package/src/storage/checkpoints/PostgresWriteCheckpointAPI.ts +176 -26
- package/src/storage/current-data-store.ts +66 -11
- package/src/storage/storage-index.ts +1 -0
- package/src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts +105 -0
- package/src/types/models/ActiveCheckpoint.ts +3 -2
- package/src/types/models/BucketData.ts +7 -6
- package/src/types/models/CurrentData.ts +2 -1
- package/src/types/models/SdkReporting.ts +4 -4
- package/src/types/models/SourceTable.ts +12 -6
- package/src/types/models/SyncRules.ts +12 -11
- package/src/types/models/WriteCheckpoint.ts +6 -2
- package/src/utils/checkpoints.ts +31 -0
- package/src/utils/test-utils.ts +2 -2
- package/test/src/__snapshots__/storage_sync.test.ts.snap +44 -1621
- package/test/src/checkpoint_notifications.test.ts +528 -0
- package/test/src/migrations.test.ts +1 -1
- package/test/src/storage.test.ts +235 -11
- package/test/src/storage_compacting.test.ts +17 -9
- package/test/src/storage_sync.test.ts +55 -8
- package/test/src/util.ts +1 -1
- package/test/tsconfig.json +1 -3
- package/tsconfig.json +1 -4
- package/tsconfig.tsbuildinfo +1 -0
- package/dist/.tsbuildinfo +0 -1
- package/dist/@types/storage/sync-rules/PostgresPersistedSyncRulesContent.d.ts +0 -9
- package/dist/@types/types/models/BucketData.d.ts +0 -22
- package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js +0 -49
- package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js.map +0 -1
- package/src/storage/sync-rules/PostgresPersistedSyncRulesContent.ts +0 -54
- /package/dist/{@types/index.d.ts → index.d.ts} +0 -0
- /package/dist/{@types/migrations → migrations}/PostgresMigrationAgent.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/PostgresMigrationStore.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/migration-utils.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1684951997326-init.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1749024804042-snapshot-progress.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1756282360128-connection-reporting.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1771232439485-storage-version.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1771424826685-current-data-pending-deletes.d.ts +0 -0
- /package/dist/{@types/migrations → migrations}/scripts/1771491856000-sync-plan.d.ts +0 -0
- /package/dist/{@types/module → module}/PostgresStorageModule.d.ts +0 -0
- /package/dist/{@types/storage → storage}/PostgresReportStorage.d.ts +0 -0
- /package/dist/{@types/storage → storage}/PostgresStorageProvider.d.ts +0 -0
- /package/dist/{@types/storage → storage}/batch/OperationBatch.d.ts +0 -0
- /package/dist/{@types/storage → storage}/batch/PostgresPersistedBatch.d.ts +0 -0
- /package/dist/{@types/storage → storage}/table-id.d.ts +0 -0
- /package/dist/{@types/types → types}/codecs.d.ts +0 -0
- /package/dist/{@types/types → types}/models/BucketParameters.d.ts +0 -0
- /package/dist/{@types/types → types}/models/Instance.d.ts +0 -0
- /package/dist/{@types/types → types}/models/Migration.d.ts +0 -0
- /package/dist/{@types/types → types}/models/json.d.ts +0 -0
- /package/dist/{@types/types → types}/models/models-index.d.ts +0 -0
- /package/dist/{@types/utils → utils}/application-name.d.ts +0 -0
- /package/dist/{@types/utils → utils}/bson.d.ts +0 -0
- /package/dist/{@types/utils → utils}/bucket-data.d.ts +0 -0
- /package/dist/{@types/utils → utils}/db.d.ts +0 -0
- /package/dist/{@types/utils → utils}/test-utils.d.ts +0 -0
- /package/dist/{@types/utils → utils}/ts-codec.d.ts +0 -0
- /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":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,aAAa,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACtG,OAAO,EAAE,SAAS,EAAiE,MAAM,yBAAyB,CAAC;AACnH,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,4BAA4B,EAAE,MAAM,4CAA4C,CAAC;AAC1F,OAAO,EAAE,qBAAqB,EAAE,MAAM,qCAAqC,CAAC;AAC5E,OAAO,EAAE,8BAA8B,EAAgC,MAAM,mBAAmB,CAAC;AACjG,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AAWzC,MAAM,UAAU,iBAAiB,CAAC,cAA0C;IAC1E,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,YAAqB;QAC3B,GAAG,EAAE,cAAc,CAAC,GAAG;QACvB,OAAO,EAAE,SAAkB;KAC5B,CAAC;IAEF,MAAM,uBAAuB,GAAG,8BAA8B,CAAC,WAAW,CAAC,CAAC;IAE5E,MAAM,aAAa,GAAG,KAAK,EAAE,OAAuC,EAAE,EAAE;QACtE,YAAY,gBAAgB,GAA8B,IAAI,SAAS,CAAC,gBAAgB,EAAE,CAAC;QAC3F,YAAY,cAAc,GAAG,cAAc,CAAC,cAAc;YACxD,CAAC,CAAC,cAAc,CAAC,cAAc,CAAC,WAAW,CAAC;YAC5C,CAAC,CAAC,IAAI,sBAAsB,CAAC,WAAW,CAAC,CAAC;QAC5C,gBAAgB,CAAC,sBAAsB,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,kBAAkB,GAAG,EAAE,aAAa,EAAE,EAAE,OAAO,EAAE,WAAW,EAAE,EAA+B,CAAC;QAEpG,+EAA+E;QAC/E,MAAM,MAAM,GAAG,YAAY,CAAC;YAC1B,KAAK,EAAE,MAAM;YACb,MAAM,EAAE,aAAa,CAAC,MAAM;YAC5B,UAAU,EAAE,CAAC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;SACvC,CAAC,CAAC;QAEH,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,MAAM,gBAAgB,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,IAAI;gBAC9C,gBAAgB,EAAE;oBAChB,eAAe,EAAE,kBAAkB;iBACpC;gBACD,MAAM;aACP,CAAC,CAAC;QACL,CAAC;QAED,IAAI,OAAO,CAAC,EAAE,EAAE,CAAC;YACf,MAAM,gBAAgB,CAAC,OAAO,CAAC;gBAC7B,SAAS,EAAE,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;gBAC5C,gBAAgB,EAAE;oBAChB,eAAe,EAAE,kBAAkB;iBACpC;gBACD,MAAM;aACP,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,EAAE,SAAyC,EAAE,EAAE;QAClE,MAAM,aAAa,CAAC;YAClB,IAAI,EAAE,IAAI;YACV,EAAE,EAAE,SAAS,IAAI,SAAS,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE;SACnD,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,YAAY,GAAG,KAAK,IAAI,EAAE;QAC9B,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;QAE/C,YAAY,cAAc,GAAG,IAAI,4BAA4B,CAAC;YAC5D,MAAM,EAAE,uBAAuB;YAC/B,
|
|
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
|
-
"
|
|
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
|
-
|
|
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-
|
|
32
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
33
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
34
|
-
"@powersync/service-types": "0.
|
|
35
|
-
"@powersync/service-jpgwire": "0.0.0-dev-
|
|
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-
|
|
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-
|
|
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
|
|
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 {
|
|
12
|
+
import { PostgresPersistedReplicationStream } from './sync-rules/PostgresPersistedSyncConfigContent.js';
|
|
14
13
|
|
|
15
14
|
export type PostgresBucketStorageOptions = {
|
|
16
15
|
config: NormalizedPostgresStorageConfig;
|
|
17
|
-
|
|
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
|
|
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.
|
|
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
|
-
|
|
53
|
+
replicationStream: storage.PersistedReplicationStream,
|
|
53
54
|
options?: GetIntanceOptions
|
|
54
55
|
): storage.SyncRulesBucketStorage {
|
|
55
|
-
const
|
|
56
|
+
const syncRuleStorage = new PostgresSyncRulesStorage({
|
|
56
57
|
factory: this,
|
|
57
58
|
db: this.db,
|
|
58
|
-
|
|
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?.(
|
|
64
|
+
this.iterateListeners((cb) => cb.syncStorageCreated?.(syncRuleStorage));
|
|
63
65
|
}
|
|
64
|
-
|
|
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
|
|
73
|
+
return syncRuleStorage;
|
|
72
74
|
}
|
|
73
75
|
|
|
74
76
|
async getStorageMetrics(): Promise<storage.StorageMetrics> {
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
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<
|
|
160
|
+
async updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedReplicationStream> {
|
|
157
161
|
const storageVersion =
|
|
158
|
-
options.storageVersion ??
|
|
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.
|
|
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
|
-
|
|
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(
|
|
256
|
-
const next = await this.
|
|
257
|
-
const active = await this.
|
|
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.
|
|
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.
|
|
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?.
|
|
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.
|
|
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?.
|
|
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.
|
|
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
|
|
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
|
|
329
|
+
return this.resolvedSyncConfigFromRow(activeRow, { cacheActiveStorage: true });
|
|
323
330
|
}
|
|
324
331
|
|
|
325
|
-
async
|
|
326
|
-
const
|
|
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
|
|
348
|
+
return row == null ? null : this.resolvedSyncConfigFromRow(row);
|
|
345
349
|
}
|
|
346
350
|
|
|
347
|
-
async
|
|
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
|
|
364
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
361
365
|
}
|
|
362
366
|
|
|
363
|
-
async
|
|
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
|
|
379
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
376
380
|
}
|
|
377
381
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
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
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
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
|
-
|
|
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({
|