@powersync/service-module-postgres-storage 0.15.0 → 0.16.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.
- package/CHANGELOG.md +20 -0
- package/dist/{@types/storage → storage}/PostgresBucketStorageFactory.d.ts +12 -12
- package/dist/storage/PostgresBucketStorageFactory.js +57 -52
- package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
- package/dist/storage/PostgresReportStorage.js.map +1 -1
- package/dist/storage/PostgresStorageProvider.js +1 -1
- package/dist/storage/PostgresStorageProvider.js.map +1 -1
- package/dist/{@types/storage → storage}/PostgresSyncRulesStorage.d.ts +16 -7
- package/dist/storage/PostgresSyncRulesStorage.js +48 -45
- package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
- package/dist/{@types/storage → storage}/batch/PostgresBucketBatch.d.ts +2 -3
- package/dist/storage/batch/PostgresBucketBatch.js +26 -25
- package/dist/storage/batch/PostgresBucketBatch.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 +89 -0
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.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/storage/PostgresBucketStorageFactory.ts +64 -54
- package/src/storage/PostgresReportStorage.ts +1 -2
- package/src/storage/PostgresStorageProvider.ts +1 -1
- package/src/storage/PostgresSyncRulesStorage.ts +51 -52
- package/src/storage/batch/PostgresBucketBatch.ts +30 -32
- package/src/storage/storage-index.ts +1 -0
- package/src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts +97 -0
- package/src/utils/test-utils.ts +2 -2
- package/test/src/migrations.test.ts +1 -1
- package/test/src/storage.test.ts +7 -2
- package/test/src/storage_compacting.test.ts +6 -4
- package/test/src/storage_sync.test.ts +2 -1
- package/test/tsconfig.json +0 -2
- 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/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}/PostgresCompactor.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}/checkpoints/PostgresWriteCheckpointAPI.d.ts +0 -0
- /package/dist/{@types/storage → storage}/current-data-store.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/ActiveCheckpoint.d.ts +0 -0
- /package/dist/{@types/types → types}/models/ActiveCheckpointNotification.d.ts +0 -0
- /package/dist/{@types/types → types}/models/BucketData.d.ts +0 -0
- /package/dist/{@types/types → types}/models/BucketParameters.d.ts +0 -0
- /package/dist/{@types/types → types}/models/CurrentData.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/SdkReporting.d.ts +0 -0
- /package/dist/{@types/types → types}/models/SourceTable.d.ts +0 -0
- /package/dist/{@types/types → types}/models/SyncRules.d.ts +0 -0
- /package/dist/{@types/types → types}/models/WriteCheckpoint.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/types → types}/types.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
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
+
import { storage } from '@powersync/service-core';
|
|
3
|
+
import { models } from '../../types/types.js';
|
|
4
|
+
export declare class PostgresPersistedSyncConfigContent extends storage.PersistedSyncConfigContent {
|
|
5
|
+
private db;
|
|
6
|
+
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded);
|
|
7
|
+
getSyncConfigStatus(): Promise<storage.PersistedSyncConfigStatus | null>;
|
|
8
|
+
}
|
|
9
|
+
export declare class PostgresPersistedReplicationStream extends storage.PersistedReplicationStream {
|
|
10
|
+
private db;
|
|
11
|
+
private readonly row;
|
|
12
|
+
current_lock: storage.ReplicationLock | null;
|
|
13
|
+
readonly syncConfigContent: readonly PostgresPersistedSyncConfigContent[];
|
|
14
|
+
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded);
|
|
15
|
+
parsed(options: storage.ParseSyncConfigOptions): storage.ParsedSyncConfigSet;
|
|
16
|
+
lock(): Promise<storage.ReplicationLock>;
|
|
17
|
+
}
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
+
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
3
|
+
import { storage } from '@powersync/service-core';
|
|
4
|
+
import { models } from '../../types/types.js';
|
|
5
|
+
export class PostgresPersistedSyncConfigContent extends storage.PersistedSyncConfigContent {
|
|
6
|
+
db;
|
|
7
|
+
constructor(db, row) {
|
|
8
|
+
super({
|
|
9
|
+
replicationStreamId: Number(row.id),
|
|
10
|
+
sync_rules_content: row.content,
|
|
11
|
+
compiled_plan: row.sync_plan,
|
|
12
|
+
replicationStreamName: row.slot_name,
|
|
13
|
+
storageVersion: row.storage_version ?? storage.LEGACY_STORAGE_VERSION
|
|
14
|
+
});
|
|
15
|
+
this.db = db;
|
|
16
|
+
}
|
|
17
|
+
async getSyncConfigStatus() {
|
|
18
|
+
const row = await this.db.sql `
|
|
19
|
+
SELECT
|
|
20
|
+
*
|
|
21
|
+
FROM
|
|
22
|
+
sync_rules
|
|
23
|
+
WHERE
|
|
24
|
+
id = ${{ value: this.replicationStreamId, type: 'int4' }}
|
|
25
|
+
`
|
|
26
|
+
.decoded(models.SyncRules)
|
|
27
|
+
.first();
|
|
28
|
+
return row == null ? null : syncConfigStatusFromRow(row);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
function syncConfigStatusFromRow(row) {
|
|
32
|
+
return {
|
|
33
|
+
id: String(row.id),
|
|
34
|
+
replicationStreamId: Number(row.id),
|
|
35
|
+
state: row.state,
|
|
36
|
+
snapshot_done: row.snapshot_done,
|
|
37
|
+
last_checkpoint_lsn: row.last_checkpoint_lsn,
|
|
38
|
+
last_fatal_error: row.last_fatal_error,
|
|
39
|
+
last_keepalive_ts: row.last_keepalive_ts ? new Date(row.last_keepalive_ts) : null,
|
|
40
|
+
last_checkpoint_ts: row.last_checkpoint_ts ? new Date(row.last_checkpoint_ts) : null
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export class PostgresPersistedReplicationStream extends storage.PersistedReplicationStream {
|
|
44
|
+
db;
|
|
45
|
+
row;
|
|
46
|
+
current_lock = null;
|
|
47
|
+
syncConfigContent;
|
|
48
|
+
constructor(db, row) {
|
|
49
|
+
super({
|
|
50
|
+
replicationStreamId: Number(row.id),
|
|
51
|
+
replicationStreamName: row.slot_name,
|
|
52
|
+
state: row.state,
|
|
53
|
+
storageVersion: row.storage_version ?? storage.LEGACY_STORAGE_VERSION
|
|
54
|
+
});
|
|
55
|
+
this.db = db;
|
|
56
|
+
this.row = row;
|
|
57
|
+
this.syncConfigContent = [new PostgresPersistedSyncConfigContent(this.db, this.row)];
|
|
58
|
+
}
|
|
59
|
+
parsed(options) {
|
|
60
|
+
return this.syncConfigContent[0].parsed(options);
|
|
61
|
+
}
|
|
62
|
+
async lock() {
|
|
63
|
+
const manager = new lib_postgres.PostgresLockManager({
|
|
64
|
+
db: this.db,
|
|
65
|
+
name: `sync_rules_${this.replicationStreamId}_${this.replicationStreamName}`
|
|
66
|
+
});
|
|
67
|
+
const lockHandle = await manager.acquire();
|
|
68
|
+
if (!lockHandle) {
|
|
69
|
+
throw new ServiceError(ErrorCode.PSYNC_S1003, `Replication stream is locked by another process, standing by.`);
|
|
70
|
+
}
|
|
71
|
+
const interval = setInterval(async () => {
|
|
72
|
+
try {
|
|
73
|
+
await lockHandle.refresh();
|
|
74
|
+
}
|
|
75
|
+
catch (e) {
|
|
76
|
+
this.logger.error('Failed to refresh lock', e);
|
|
77
|
+
clearInterval(interval);
|
|
78
|
+
}
|
|
79
|
+
}, 30_130);
|
|
80
|
+
return (this.current_lock = {
|
|
81
|
+
sync_rules_id: this.replicationStreamId,
|
|
82
|
+
release: async () => {
|
|
83
|
+
clearInterval(interval);
|
|
84
|
+
return lockHandle.release();
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=PostgresPersistedSyncConfigContent.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PostgresPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts"],"names":[],"mappings":"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"}
|
package/dist/utils/test-utils.js
CHANGED
|
@@ -54,7 +54,7 @@ export function postgresTestSetup(factoryOptions) {
|
|
|
54
54
|
await runMigrations({ down: false, up: true });
|
|
55
55
|
await using storageFactory = new PostgresBucketStorageFactory({
|
|
56
56
|
config: TEST_CONNECTION_OPTIONS,
|
|
57
|
-
|
|
57
|
+
replicationStreamNamePrefix: 'test_'
|
|
58
58
|
});
|
|
59
59
|
await truncateTables(storageFactory.db);
|
|
60
60
|
};
|
|
@@ -81,7 +81,7 @@ export function postgresTestSetup(factoryOptions) {
|
|
|
81
81
|
}
|
|
82
82
|
return new PostgresBucketStorageFactory({
|
|
83
83
|
config: TEST_CONNECTION_OPTIONS,
|
|
84
|
-
|
|
84
|
+
replicationStreamNamePrefix: 'test_'
|
|
85
85
|
});
|
|
86
86
|
}
|
|
87
87
|
catch (ex) {
|
|
@@ -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.15.0",
|
|
6
|
-
"main": "dist/index.js",
|
|
4
|
+
"version": "0.16.0",
|
|
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.
|
|
32
|
-
"@powersync/
|
|
33
|
-
"@powersync/
|
|
34
|
-
"@powersync/service-types": "0.
|
|
35
|
-
"@powersync/service-jpgwire": "0.21.
|
|
19
|
+
"@powersync/lib-service-postgres": "0.5.0",
|
|
20
|
+
"@powersync/lib-services-framework": "0.9.6",
|
|
21
|
+
"@powersync/service-core": "1.23.0",
|
|
22
|
+
"@powersync/service-types": "0.16.0",
|
|
23
|
+
"@powersync/service-jpgwire": "0.21.20",
|
|
36
24
|
"@powersync/service-jsonbig": "0.17.13",
|
|
37
|
-
"@powersync/service-sync-rules": "0.
|
|
25
|
+
"@powersync/service-sync-rules": "0.38.0"
|
|
38
26
|
},
|
|
39
27
|
"devDependencies": {
|
|
40
28
|
"typescript": "~6.0.3",
|
|
41
|
-
"@powersync/service-core-tests": "0.
|
|
29
|
+
"@powersync/service-core-tests": "0.17.0"
|
|
42
30
|
},
|
|
43
31
|
"scripts": {
|
|
44
32
|
"build": "tsc -b",
|
|
@@ -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';
|
|
@@ -10,17 +10,17 @@ import { getStorageApplicationName } from '../utils/application-name.js';
|
|
|
10
10
|
import { NOTIFICATION_CHANNEL, STORAGE_SCHEMA_NAME } from '../utils/db.js';
|
|
11
11
|
import { notifySyncRulesUpdate } from './batch/PostgresBucketBatch.js';
|
|
12
12
|
import { PostgresSyncRulesStorage } from './PostgresSyncRulesStorage.js';
|
|
13
|
-
import {
|
|
13
|
+
import { PostgresPersistedReplicationStream } from './sync-rules/PostgresPersistedSyncConfigContent.js';
|
|
14
14
|
|
|
15
15
|
export type PostgresBucketStorageOptions = {
|
|
16
16
|
config: NormalizedPostgresStorageConfig;
|
|
17
|
-
|
|
17
|
+
replicationStreamNamePrefix: string;
|
|
18
18
|
};
|
|
19
19
|
|
|
20
20
|
export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
21
21
|
[framework.DO_NOT_LOG] = true;
|
|
22
22
|
readonly db: lib_postgres.DatabaseClient;
|
|
23
|
-
public readonly
|
|
23
|
+
public readonly replicationStreamNamePrefix: string;
|
|
24
24
|
|
|
25
25
|
private activeStorageCache: storage.SyncRulesBucketStorage | undefined;
|
|
26
26
|
|
|
@@ -32,7 +32,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
32
32
|
notificationChannels: [NOTIFICATION_CHANNEL],
|
|
33
33
|
applicationName: getStorageApplicationName()
|
|
34
34
|
});
|
|
35
|
-
this.
|
|
35
|
+
this.replicationStreamNamePrefix = options.replicationStreamNamePrefix;
|
|
36
36
|
|
|
37
37
|
this.db.registerListener({
|
|
38
38
|
connectionCreated: async (connection) => this.prepareStatements(connection)
|
|
@@ -49,31 +49,31 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
getInstance(
|
|
52
|
-
|
|
52
|
+
replicationStream: storage.PersistedReplicationStream,
|
|
53
53
|
options?: GetIntanceOptions
|
|
54
54
|
): storage.SyncRulesBucketStorage {
|
|
55
|
-
const
|
|
55
|
+
const syncRuleStorage = new PostgresSyncRulesStorage({
|
|
56
56
|
factory: this,
|
|
57
57
|
db: this.db,
|
|
58
|
-
|
|
58
|
+
replicationStream,
|
|
59
59
|
batchLimits: this.options.config.batch_limits
|
|
60
60
|
});
|
|
61
61
|
if (!options?.skipLifecycleHooks) {
|
|
62
|
-
this.iterateListeners((cb) => cb.syncStorageCreated?.(
|
|
62
|
+
this.iterateListeners((cb) => cb.syncStorageCreated?.(syncRuleStorage));
|
|
63
63
|
}
|
|
64
|
-
|
|
64
|
+
syncRuleStorage.registerListener({
|
|
65
65
|
batchStarted: (batch) => {
|
|
66
66
|
batch.registerListener({
|
|
67
67
|
replicationEvent: (payload) => this.iterateListeners((cb) => cb.replicationEvent?.(payload))
|
|
68
68
|
});
|
|
69
69
|
}
|
|
70
70
|
});
|
|
71
|
-
return
|
|
71
|
+
return syncRuleStorage;
|
|
72
72
|
}
|
|
73
73
|
|
|
74
74
|
async getStorageMetrics(): Promise<storage.StorageMetrics> {
|
|
75
|
-
const
|
|
76
|
-
if (
|
|
75
|
+
const activeSyncConfig = await this.getActiveSyncConfig();
|
|
76
|
+
if (activeSyncConfig == null) {
|
|
77
77
|
return {
|
|
78
78
|
operations_size_bytes: 0,
|
|
79
79
|
parameters_size_bytes: 0,
|
|
@@ -153,7 +153,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
153
153
|
};
|
|
154
154
|
}
|
|
155
155
|
|
|
156
|
-
async updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<
|
|
156
|
+
async updateSyncRules(options: storage.UpdateSyncRulesOptions): Promise<PostgresPersistedReplicationStream> {
|
|
157
157
|
const storageVersion =
|
|
158
158
|
options.storageVersion ?? options.config.parsed.config.storageVersion ?? storage.CURRENT_STORAGE_VERSION;
|
|
159
159
|
const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
|
|
@@ -200,7 +200,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
200
200
|
${{ type: 'json', value: options.config.plan }},
|
|
201
201
|
${{ type: 'varchar', value: storage.SyncRuleState.PROCESSING }},
|
|
202
202
|
CONCAT(
|
|
203
|
-
${{ type: 'varchar', value: this.
|
|
203
|
+
${{ type: 'varchar', value: this.replicationStreamNamePrefix }},
|
|
204
204
|
(
|
|
205
205
|
SELECT
|
|
206
206
|
id
|
|
@@ -220,7 +220,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
220
220
|
|
|
221
221
|
await notifySyncRulesUpdate(this.db, newSyncRulesRow!);
|
|
222
222
|
|
|
223
|
-
return new
|
|
223
|
+
return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow!);
|
|
224
224
|
});
|
|
225
225
|
}
|
|
226
226
|
|
|
@@ -252,28 +252,28 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
252
252
|
`.execute();
|
|
253
253
|
}
|
|
254
254
|
|
|
255
|
-
async restartReplication(
|
|
256
|
-
const next = await this.
|
|
257
|
-
const active = await this.
|
|
255
|
+
async restartReplication(replicationStreamId: number): Promise<void> {
|
|
256
|
+
const next = await this.getDeployingSyncConfig();
|
|
257
|
+
const active = await this.getActiveSyncConfig();
|
|
258
258
|
|
|
259
259
|
// In both the below cases, we create a new replication stream.
|
|
260
260
|
// The current one will continue serving sync requests until the next one has finished processing.
|
|
261
|
-
if (next != null && next.
|
|
261
|
+
if (next != null && next.content.replicationStreamId == replicationStreamId) {
|
|
262
262
|
// We need to redo the "next" replication stream
|
|
263
263
|
|
|
264
|
-
await this.updateSyncRules(next.asUpdateOptions());
|
|
264
|
+
await this.updateSyncRules(next.content.asUpdateOptions());
|
|
265
265
|
// Pro-actively stop replicating
|
|
266
266
|
await this.db.sql`
|
|
267
267
|
UPDATE sync_rules
|
|
268
268
|
SET
|
|
269
269
|
state = ${{ value: storage.SyncRuleState.STOP, type: 'varchar' }}
|
|
270
270
|
WHERE
|
|
271
|
-
id = ${{ value: next.
|
|
271
|
+
id = ${{ value: next.content.replicationStreamId, type: 'int4' }}
|
|
272
272
|
AND state = ${{ value: storage.SyncRuleState.PROCESSING, type: 'varchar' }}
|
|
273
273
|
`.execute();
|
|
274
|
-
} else if (next == null && active?.
|
|
274
|
+
} else if (next == null && active?.content.replicationStreamId == replicationStreamId) {
|
|
275
275
|
// Slot removed for "active" replication stream, while there is no "next" one.
|
|
276
|
-
await this.updateSyncRules(active.asUpdateOptions());
|
|
276
|
+
await this.updateSyncRules(active.content.asUpdateOptions());
|
|
277
277
|
|
|
278
278
|
// Pro-actively stop replicating, but still serve clients with existing data
|
|
279
279
|
await this.db.sql`
|
|
@@ -281,10 +281,10 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
281
281
|
SET
|
|
282
282
|
state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
|
|
283
283
|
WHERE
|
|
284
|
-
id = ${{ value: active.
|
|
284
|
+
id = ${{ value: active.content.replicationStreamId, type: 'int4' }}
|
|
285
285
|
AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
|
|
286
286
|
`.execute();
|
|
287
|
-
} else if (next != null && active?.
|
|
287
|
+
} else if (next != null && active?.content.replicationStreamId == replicationStreamId) {
|
|
288
288
|
// Already have "next" replication stream - don't update any.
|
|
289
289
|
|
|
290
290
|
// Pro-actively stop replicating, but still serve clients with existing data
|
|
@@ -293,13 +293,13 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
293
293
|
SET
|
|
294
294
|
state = ${{ value: storage.SyncRuleState.ERRORED, type: 'varchar' }}
|
|
295
295
|
WHERE
|
|
296
|
-
id = ${{ value: active.
|
|
296
|
+
id = ${{ value: active.content.replicationStreamId, type: 'int4' }}
|
|
297
297
|
AND state = ${{ value: storage.SyncRuleState.ACTIVE, type: 'varchar' }}
|
|
298
298
|
`.execute();
|
|
299
299
|
}
|
|
300
300
|
}
|
|
301
301
|
|
|
302
|
-
async
|
|
302
|
+
async getActiveSyncConfig(): Promise<storage.ResolvedSyncConfig | null> {
|
|
303
303
|
const activeRow = await this.db.sql`
|
|
304
304
|
SELECT
|
|
305
305
|
*
|
|
@@ -319,11 +319,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
319
319
|
return null;
|
|
320
320
|
}
|
|
321
321
|
|
|
322
|
-
return
|
|
322
|
+
return this.resolvedSyncConfigFromRow(activeRow, { cacheActiveStorage: true });
|
|
323
323
|
}
|
|
324
324
|
|
|
325
|
-
async
|
|
326
|
-
const
|
|
325
|
+
async getDeployingSyncConfig(): Promise<storage.ResolvedSyncConfig | null> {
|
|
326
|
+
const row = await this.db.sql`
|
|
327
327
|
SELECT
|
|
328
328
|
*
|
|
329
329
|
FROM
|
|
@@ -337,14 +337,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
337
337
|
`
|
|
338
338
|
.decoded(models.SyncRules)
|
|
339
339
|
.first();
|
|
340
|
-
if (!nextRow) {
|
|
341
|
-
return null;
|
|
342
|
-
}
|
|
343
340
|
|
|
344
|
-
return
|
|
341
|
+
return row == null ? null : this.resolvedSyncConfigFromRow(row);
|
|
345
342
|
}
|
|
346
343
|
|
|
347
|
-
async
|
|
344
|
+
async getReplicatingReplicationStreams(): Promise<storage.PersistedReplicationStream[]> {
|
|
348
345
|
const rows = await this.db.sql`
|
|
349
346
|
SELECT
|
|
350
347
|
*
|
|
@@ -357,10 +354,10 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
357
354
|
.decoded(models.SyncRules)
|
|
358
355
|
.rows();
|
|
359
356
|
|
|
360
|
-
return rows.map((row) => new
|
|
357
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
361
358
|
}
|
|
362
359
|
|
|
363
|
-
async
|
|
360
|
+
async getStoppedReplicationStreams(): Promise<storage.PersistedReplicationStream[]> {
|
|
364
361
|
const rows = await this.db.sql`
|
|
365
362
|
SELECT
|
|
366
363
|
*
|
|
@@ -372,24 +369,37 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
372
369
|
.decoded(models.SyncRules)
|
|
373
370
|
.rows();
|
|
374
371
|
|
|
375
|
-
return rows.map((row) => new
|
|
372
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
376
373
|
}
|
|
377
374
|
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
375
|
+
private resolvedSyncConfigFromRow(
|
|
376
|
+
row: models.SyncRulesDecoded,
|
|
377
|
+
options: { cacheActiveStorage?: boolean } = {}
|
|
378
|
+
): storage.ResolvedSyncConfig {
|
|
379
|
+
const stream = new PostgresPersistedReplicationStream(this.db, row);
|
|
380
|
+
const content = stream.syncConfigContent[0];
|
|
381
|
+
const thisFactory = this;
|
|
383
382
|
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
383
|
+
return {
|
|
384
|
+
content,
|
|
385
|
+
replicationStream: stream,
|
|
386
|
+
get storage() {
|
|
387
|
+
// It is important that this instance is cached.
|
|
388
|
+
// Not for the instance construction itself, but to ensure that internal caches on the instance
|
|
389
|
+
// are re-used properly.
|
|
390
|
+
if (options.cacheActiveStorage) {
|
|
391
|
+
const activeStorageCache = thisFactory.activeStorageCache;
|
|
392
|
+
if (activeStorageCache?.replicationStreamId == stream.replicationStreamId) {
|
|
393
|
+
return activeStorageCache;
|
|
394
|
+
}
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
const instance = thisFactory.getInstance(stream);
|
|
398
|
+
if (options.cacheActiveStorage) {
|
|
399
|
+
thisFactory.activeStorageCache = instance;
|
|
400
|
+
}
|
|
401
|
+
return instance;
|
|
402
|
+
}
|
|
403
|
+
};
|
|
394
404
|
}
|
|
395
405
|
}
|
|
@@ -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,7 @@ 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
31
|
});
|
|
32
32
|
|
|
33
33
|
const reportStorageFactory = new PostgresReportStorage({
|