@powersync/service-module-postgres-storage 0.0.0-dev-20260909133214 → 0.0.0-dev-20261005112123
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 +61 -7
- package/dist/storage/PostgresBucketStorageFactory.d.ts +1 -1
- package/dist/storage/PostgresBucketStorageFactory.js +14 -8
- package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
- package/dist/storage/PostgresStorageProvider.js +1 -1
- package/dist/storage/PostgresStorageProvider.js.map +1 -1
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.d.ts +3 -2
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js +7 -4
- package/dist/storage/sync-rules/PostgresPersistedSyncConfigContent.js.map +1 -1
- package/dist/utils/test-utils.d.ts +2 -1
- package/dist/utils/test-utils.js +3 -3
- package/dist/utils/test-utils.js.map +1 -1
- package/package.json +8 -8
- package/src/storage/PostgresBucketStorageFactory.ts +16 -8
- package/src/storage/PostgresStorageProvider.ts +9 -6
- package/src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts +18 -12
- package/src/utils/test-utils.ts +23 -9
- package/test/src/migrations.test.ts +8 -4
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,15 +1,69 @@
|
|
|
1
1
|
# @powersync/service-module-postgres-storage
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20261005112123
|
|
4
4
|
|
|
5
5
|
### Patch Changes
|
|
6
6
|
|
|
7
|
-
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
7
|
+
- ef5e87c: Add `config.source_table_options` to edition 3 sync configs. This flat map uses `table`, `database.table`, or `connection.database.table` keys. Core accepts empty table options; module-specific options require a registered parser that declares and parses them.
|
|
8
|
+
|
|
9
|
+
Connection prefixes are parsed and stored, but explicitly qualified patterns continue to use the `default` connection tag during hydration. This change does not enable selecting another replication connection through a prefix.
|
|
10
|
+
|
|
11
|
+
```yaml
|
|
12
|
+
config:
|
|
13
|
+
edition: 3
|
|
14
|
+
source_table_options:
|
|
15
|
+
my_table: {}
|
|
16
|
+
streams:
|
|
17
|
+
my_table:
|
|
18
|
+
query: SELECT * FROM my_table
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
Plans with parsed source-table options or required module IDs use sync-plan format 3. Plans without either retain formats 1 and 2. Changed source-table options require replacement processing when a new sync config is deployed.
|
|
22
|
+
|
|
23
|
+
Add a shared service-context parser with module registration hooks for schema extension, parsing, and persisted validation. Validation routes, deployments, replication, and saved-config loading use this parser. Saved plans fail to load when a required module is unavailable.
|
|
24
|
+
|
|
25
|
+
- Updated dependencies [ef5e87c]
|
|
26
|
+
- Updated dependencies [e703ca5]
|
|
27
|
+
- Updated dependencies [324093e]
|
|
28
|
+
- @powersync/service-sync-rules@0.0.0-dev-20261005112123
|
|
29
|
+
- @powersync/service-core@0.0.0-dev-20261005112123
|
|
30
|
+
- @powersync/lib-services-framework@0.0.0-dev-20261005112123
|
|
31
|
+
- @powersync/service-jpgwire@0.0.0-dev-20261005112123
|
|
32
|
+
- @powersync/lib-service-postgres@0.0.0-dev-20261005112123
|
|
33
|
+
|
|
34
|
+
## 0.19.2
|
|
35
|
+
|
|
36
|
+
### Patch Changes
|
|
37
|
+
|
|
38
|
+
- 5078032: Change the default MongoDB storage version from 2 to 4.
|
|
39
|
+
- Updated dependencies [0483d4e]
|
|
40
|
+
- Updated dependencies [28f024b]
|
|
41
|
+
- Updated dependencies [5078032]
|
|
42
|
+
- Updated dependencies [424bbc0]
|
|
43
|
+
- Updated dependencies [e87703a]
|
|
44
|
+
- Updated dependencies [b70f467]
|
|
45
|
+
- Updated dependencies [18f0c95]
|
|
46
|
+
- Updated dependencies [c60db6e]
|
|
47
|
+
- Updated dependencies [0483d4e]
|
|
48
|
+
- Updated dependencies [a8c3f15]
|
|
49
|
+
- @powersync/service-core@1.27.0
|
|
50
|
+
- @powersync/service-types@0.19.0
|
|
51
|
+
- @powersync/service-sync-rules@0.43.0
|
|
52
|
+
- @powersync/lib-service-postgres@0.5.6
|
|
53
|
+
- @powersync/lib-services-framework@0.10.3
|
|
54
|
+
- @powersync/service-jpgwire@0.21.25
|
|
55
|
+
|
|
56
|
+
## 0.19.1
|
|
57
|
+
|
|
58
|
+
### Patch Changes
|
|
59
|
+
|
|
60
|
+
- Updated dependencies [f842b4e]
|
|
61
|
+
- Updated dependencies [5ae6f75]
|
|
62
|
+
- @powersync/service-core@1.26.1
|
|
63
|
+
- @powersync/service-sync-rules@0.42.0
|
|
64
|
+
- @powersync/lib-services-framework@0.10.2
|
|
65
|
+
- @powersync/service-jpgwire@0.21.24
|
|
66
|
+
- @powersync/lib-service-postgres@0.5.5
|
|
13
67
|
|
|
14
68
|
## 0.19.0
|
|
15
69
|
|
|
@@ -15,7 +15,7 @@ export declare class PostgresBucketStorageFactory extends storage.BucketStorageF
|
|
|
15
15
|
readonly db: lib_postgres.DatabaseClient;
|
|
16
16
|
readonly replicationStreamNamePrefix: string;
|
|
17
17
|
private activeStorageCache;
|
|
18
|
-
constructor(options: PostgresBucketStorageOptions);
|
|
18
|
+
constructor(options: PostgresBucketStorageOptions, syncConfigParser: storage.SyncConfigParser);
|
|
19
19
|
[Symbol.asyncDispose](): Promise<void>;
|
|
20
20
|
prepareStatements(connection: pg_wire.PgConnection): Promise<void>;
|
|
21
21
|
getInstance(replicationStream: storage.PersistedReplicationStream, options?: GetIntanceOptions): storage.SyncRulesBucketStorage;
|
|
@@ -13,8 +13,8 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
13
13
|
db;
|
|
14
14
|
replicationStreamNamePrefix;
|
|
15
15
|
activeStorageCache;
|
|
16
|
-
constructor(options) {
|
|
17
|
-
super();
|
|
16
|
+
constructor(options, syncConfigParser) {
|
|
17
|
+
super({ syncConfigParser });
|
|
18
18
|
this.options = options;
|
|
19
19
|
this.db = new lib_postgres.DatabaseClient({
|
|
20
20
|
config: options.config,
|
|
@@ -28,7 +28,12 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
28
28
|
});
|
|
29
29
|
}
|
|
30
30
|
async [Symbol.asyncDispose]() {
|
|
31
|
-
|
|
31
|
+
try {
|
|
32
|
+
await super[Symbol.asyncDispose]();
|
|
33
|
+
}
|
|
34
|
+
finally {
|
|
35
|
+
await this.db[Symbol.asyncDispose]();
|
|
36
|
+
}
|
|
32
37
|
}
|
|
33
38
|
async prepareStatements(connection) {
|
|
34
39
|
// It should be possible to prepare statements for some common operations here.
|
|
@@ -129,7 +134,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
129
134
|
const storageVersion = options.storageVersion ??
|
|
130
135
|
options.config.parsed.config.storageVersion ??
|
|
131
136
|
this.options.defaultStorageVersion ??
|
|
132
|
-
storage.
|
|
137
|
+
storage.STORAGE_VERSION_2;
|
|
133
138
|
const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
|
|
134
139
|
if (storageConfig == null || storageVersion >= storage.STORAGE_VERSION_4) {
|
|
135
140
|
throw new framework.ServiceError(framework.ErrorCode.PSYNC_S1005, `Unsupported storage version ${storageVersion} for PostgreSQL storage`);
|
|
@@ -143,6 +148,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
143
148
|
WHERE
|
|
144
149
|
state = ${{ type: 'varchar', value: storage.SyncRuleState.PROCESSING }}
|
|
145
150
|
`.execute();
|
|
151
|
+
// Uses the legacy sequence name "sync_rules_id_sequence" for backwards-compatibility. See AGENTS.md.
|
|
146
152
|
const newSyncRulesRow = await db.sql `
|
|
147
153
|
WITH
|
|
148
154
|
next_id AS (
|
|
@@ -189,7 +195,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
189
195
|
`
|
|
190
196
|
.decoded(models.SyncRules)
|
|
191
197
|
.first();
|
|
192
|
-
return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow);
|
|
198
|
+
return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow, this.syncConfigParser);
|
|
193
199
|
});
|
|
194
200
|
}
|
|
195
201
|
/**
|
|
@@ -311,7 +317,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
311
317
|
`
|
|
312
318
|
.decoded(models.SyncRules)
|
|
313
319
|
.rows();
|
|
314
|
-
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
320
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser));
|
|
315
321
|
}
|
|
316
322
|
async getStoppedReplicationStreams() {
|
|
317
323
|
const rows = await this.db.sql `
|
|
@@ -324,10 +330,10 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
324
330
|
`
|
|
325
331
|
.decoded(models.SyncRules)
|
|
326
332
|
.rows();
|
|
327
|
-
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
333
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser));
|
|
328
334
|
}
|
|
329
335
|
resolvedSyncConfigFromRow(row, options = {}) {
|
|
330
|
-
const stream = new PostgresPersistedReplicationStream(this.db, row);
|
|
336
|
+
const stream = new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser);
|
|
331
337
|
const content = stream.syncConfigContent[0];
|
|
332
338
|
const thisFactory = this;
|
|
333
339
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAqB,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAEhF,OAAO,MAAM,MAAM,QAAQ,CAAC;AAC5B,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAmC,MAAM,mBAAmB,CAAC;AAE5E,OAAO,EAAE,yBAAyB,EAAE,MAAM,8BAA8B,CAAC;AACzE,OAAO,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;AACzE,OAAO,EAAE,kCAAkC,EAAE,MAAM,oDAAoD,CAAC;AASxG,MAAM,OAAO,4BAA6B,SAAQ,OAAO,CAAC,oBAAoB;
|
|
1
|
+
{"version":3,"file":"PostgresBucketStorageFactory.js","sourceRoot":"","sources":["../../src/storage/PostgresBucketStorageFactory.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,7 +22,7 @@ export class PostgresStorageProvider {
|
|
|
22
22
|
replicationStreamNamePrefix: options.resolvedConfig.slot_name_prefix,
|
|
23
23
|
checksumCacheTtlMs: options.resolvedConfig.api_parameters.bucket_count_cache_ttl_minutes * 60_000,
|
|
24
24
|
defaultStorageVersion: decodedConfig.default_storage_version
|
|
25
|
-
});
|
|
25
|
+
}, options.syncConfigParser);
|
|
26
26
|
const reportStorageFactory = new PostgresReportStorage({
|
|
27
27
|
config: normalizedConfig
|
|
28
28
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresStorageProvider.js","sourceRoot":"","sources":["../../src/storage/PostgresStorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,uBAAuB;IAClC,IAAI,IAAI;QACN,OAAO,YAAY,CAAC,wBAAwB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAkC;QACjD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,gFAAgF;YAChF,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,IAAI,QAAQ,YAAY,CAAC,wBAAwB,EAAE,CAC1H,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,4BAA4B,
|
|
1
|
+
{"version":3,"file":"PostgresStorageProvider.js","sourceRoot":"","sources":["../../src/storage/PostgresStorageProvider.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAG3D,OAAO,EAAE,uBAAuB,EAAE,8BAA8B,EAAE,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AACnH,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,4BAA4B,EAAE,MAAM,mCAAmC,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,MAAM,OAAO,uBAAuB;IAClC,IAAI,IAAI;QACN,OAAO,YAAY,CAAC,wBAAwB,CAAC;IAC/C,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,OAAkC;QACjD,MAAM,EAAE,cAAc,EAAE,GAAG,OAAO,CAAC;QAEnC,MAAM,EAAE,OAAO,EAAE,GAAG,cAAc,CAAC;QACnC,IAAI,CAAC,uBAAuB,CAAC,OAAO,CAAC,EAAE,CAAC;YACtC,gFAAgF;YAChF,MAAM,IAAI,KAAK,CACb,8DAA8D,OAAO,CAAC,IAAI,QAAQ,YAAY,CAAC,wBAAwB,EAAE,CAC1H,CAAC;QACJ,CAAC;QAED,MAAM,aAAa,GAAG,qBAAqB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC5D,MAAM,gBAAgB,GAAG,8BAA8B,CAAC,aAAa,CAAC,CAAC;QACvE,MAAM,cAAc,GAAG,IAAI,4BAA4B,CACrD;YACE,MAAM,EAAE,gBAAgB;YACxB,2BAA2B,EAAE,OAAO,CAAC,cAAc,CAAC,gBAAgB;YACpE,kBAAkB,EAAE,OAAO,CAAC,cAAc,CAAC,cAAc,CAAC,8BAA8B,GAAG,MAAM;YACjG,qBAAqB,EAAE,aAAa,CAAC,uBAAuB;SAC7D,EACD,OAAO,CAAC,gBAAgB,CACzB,CAAC;QAEF,MAAM,oBAAoB,GAAG,IAAI,qBAAqB,CAAC;YACrD,MAAM,EAAE,gBAAgB;SACzB,CAAC,CAAC;QAEH,OAAO;YACL,aAAa,EAAE,oBAAoB;YACnC,OAAO,EAAE,cAAc;YACvB,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/C,MAAM,oBAAoB,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;YACvD,CAAC;YACD,QAAQ,EAAE,KAAK,IAAI,EAAE;gBACnB,MAAM,CAAC,IAAI,CAAC,kCAAkC,gBAAgB,CAAC,QAAQ,KAAK,CAAC,CAAC;gBAC9E,MAAM,UAAU,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;gBACpC,MAAM,cAAc,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBAC/C,MAAM,oBAAoB,CAAC,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC;gBACrD,OAAO,IAAI,CAAC;YACd,CAAC;SAC8B,CAAC;IACpC,CAAC;CACF"}
|
|
@@ -3,15 +3,16 @@ import { storage } from '@powersync/service-core';
|
|
|
3
3
|
import { models } from '../../types/types.js';
|
|
4
4
|
export declare class PostgresPersistedSyncConfigContent extends storage.PersistedSyncConfigContent {
|
|
5
5
|
private db;
|
|
6
|
-
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded);
|
|
6
|
+
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded, syncConfigParser: storage.SyncConfigParser);
|
|
7
7
|
getSyncConfigStatus(): Promise<storage.PersistedSyncConfigStatus | null>;
|
|
8
8
|
}
|
|
9
9
|
export declare class PostgresPersistedReplicationStream extends storage.PersistedReplicationStream {
|
|
10
10
|
private db;
|
|
11
11
|
private readonly row;
|
|
12
|
+
private readonly syncConfigParser;
|
|
12
13
|
current_lock: storage.ReplicationLock | null;
|
|
13
14
|
readonly syncConfigContent: readonly PostgresPersistedSyncConfigContent[];
|
|
14
|
-
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded);
|
|
15
|
+
constructor(db: lib_postgres.DatabaseClient, row: models.SyncRulesDecoded, syncConfigParser: storage.SyncConfigParser);
|
|
15
16
|
parsed(options: storage.ParseSyncConfigOptions): storage.ParsedSyncConfigSet;
|
|
16
17
|
lock(): Promise<storage.ReplicationLock>;
|
|
17
18
|
}
|
|
@@ -4,7 +4,7 @@ import { storage } from '@powersync/service-core';
|
|
|
4
4
|
import { models } from '../../types/types.js';
|
|
5
5
|
export class PostgresPersistedSyncConfigContent extends storage.PersistedSyncConfigContent {
|
|
6
6
|
db;
|
|
7
|
-
constructor(db, row) {
|
|
7
|
+
constructor(db, row, syncConfigParser) {
|
|
8
8
|
super({
|
|
9
9
|
replicationStreamId: Number(row.id),
|
|
10
10
|
sync_rules_content: row.content,
|
|
@@ -13,7 +13,7 @@ export class PostgresPersistedSyncConfigContent extends storage.PersistedSyncCon
|
|
|
13
13
|
storageVersion: row.storage_version ?? storage.LEGACY_STORAGE_VERSION,
|
|
14
14
|
syncConfigState: row.state,
|
|
15
15
|
version_label: row.version_label ?? undefined
|
|
16
|
-
});
|
|
16
|
+
}, syncConfigParser);
|
|
17
17
|
this.db = db;
|
|
18
18
|
}
|
|
19
19
|
async getSyncConfigStatus() {
|
|
@@ -45,9 +45,10 @@ function syncConfigStatusFromRow(row) {
|
|
|
45
45
|
export class PostgresPersistedReplicationStream extends storage.PersistedReplicationStream {
|
|
46
46
|
db;
|
|
47
47
|
row;
|
|
48
|
+
syncConfigParser;
|
|
48
49
|
current_lock = null;
|
|
49
50
|
syncConfigContent;
|
|
50
|
-
constructor(db, row) {
|
|
51
|
+
constructor(db, row, syncConfigParser) {
|
|
51
52
|
super({
|
|
52
53
|
replicationStreamId: Number(row.id),
|
|
53
54
|
replicationStreamName: row.slot_name,
|
|
@@ -56,10 +57,11 @@ export class PostgresPersistedReplicationStream extends storage.PersistedReplica
|
|
|
56
57
|
});
|
|
57
58
|
this.db = db;
|
|
58
59
|
this.row = row;
|
|
60
|
+
this.syncConfigParser = syncConfigParser;
|
|
59
61
|
if (this.storageVersion >= storage.STORAGE_VERSION_4) {
|
|
60
62
|
throw new ServiceError(ErrorCode.PSYNC_S1005, `Unsupported storage version ${this.storageVersion} for PostgreSQL storage`);
|
|
61
63
|
}
|
|
62
|
-
this.syncConfigContent = [new PostgresPersistedSyncConfigContent(this.db, this.row)];
|
|
64
|
+
this.syncConfigContent = [new PostgresPersistedSyncConfigContent(this.db, this.row, this.syncConfigParser)];
|
|
63
65
|
}
|
|
64
66
|
parsed(options) {
|
|
65
67
|
return this.syncConfigContent[0].parsed(options);
|
|
@@ -67,6 +69,7 @@ export class PostgresPersistedReplicationStream extends storage.PersistedReplica
|
|
|
67
69
|
async lock() {
|
|
68
70
|
const manager = new lib_postgres.PostgresLockManager({
|
|
69
71
|
db: this.db,
|
|
72
|
+
// Uses the legacy "sync_rules_" lock name prefix for backwards-compatibility. See AGENTS.md.
|
|
70
73
|
name: `sync_rules_${this.replicationStreamId}_${this.replicationStreamName}`
|
|
71
74
|
});
|
|
72
75
|
const lockHandle = await manager.acquire();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,OAAO,kCAAmC,SAAQ,OAAO,CAAC,0BAA0B;IAE9E;IADV,YACU,EAA+B,EACvC,GAA4B;
|
|
1
|
+
{"version":3,"file":"PostgresPersistedSyncConfigContent.js","sourceRoot":"","sources":["../../../src/storage/sync-rules/PostgresPersistedSyncConfigContent.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,mCAAmC,CAAC;AAC5E,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,MAAM,OAAO,kCAAmC,SAAQ,OAAO,CAAC,0BAA0B;IAE9E;IADV,YACU,EAA+B,EACvC,GAA4B,EAC5B,gBAA0C;QAE1C,KAAK,CACH;YACE,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,kBAAkB,EAAE,GAAG,CAAC,OAAO;YAC/B,aAAa,EAAE,GAAG,CAAC,SAAS;YAC5B,qBAAqB,EAAE,GAAG,CAAC,SAAS;YACpC,cAAc,EAAE,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,sBAAsB;YACrE,eAAe,EAAE,GAAG,CAAC,KAA8B;YACnD,aAAa,EAAE,GAAG,CAAC,aAAa,IAAI,SAAS;SAC9C,EACD,gBAAgB,CACjB,CAAC;QAfM,OAAE,GAAF,EAAE,CAA6B;IAgBzC,CAAC;IAED,KAAK,CAAC,mBAAmB;QACvB,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,GAAG,CAAA;;;;;;eAMlB,EAAE,KAAK,EAAE,IAAI,CAAC,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE;KAC3D;aACE,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC;aACzB,KAAK,EAAE,CAAC;QAEX,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC3D,CAAC;CACF;AAED,SAAS,uBAAuB,CAAC,GAA4B;IAC3D,OAAO;QACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QAClB,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,EAAE,GAAG,CAAC,KAA8B;QACzC,aAAa,EAAE,GAAG,CAAC,aAAa;QAChC,mBAAmB,EAAE,GAAG,CAAC,mBAAmB;QAC5C,gBAAgB,EAAE,GAAG,CAAC,gBAAgB;QACtC,iBAAiB,EAAE,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,IAAI;QACjF,kBAAkB,EAAE,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI;KACrF,CAAC;AACJ,CAAC;AAED,MAAM,OAAO,kCAAmC,SAAQ,OAAO,CAAC,0BAA0B;IAK9E;IACS;IACA;IANnB,YAAY,GAAmC,IAAI,CAAC;IAC3C,iBAAiB,CAAgD;IAE1E,YACU,EAA+B,EACtB,GAA4B,EAC5B,gBAA0C;QAE3D,KAAK,CAAC;YACJ,mBAAmB,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YACnC,qBAAqB,EAAE,GAAG,CAAC,SAAS;YACpC,KAAK,EAAE,GAAG,CAAC,KAA8B;YACzC,cAAc,EAAE,GAAG,CAAC,eAAe,IAAI,OAAO,CAAC,sBAAsB;SACtE,CAAC,CAAC;QATK,OAAE,GAAF,EAAE,CAA6B;QACtB,QAAG,GAAH,GAAG,CAAyB;QAC5B,qBAAgB,GAAhB,gBAAgB,CAA0B;QAQ3D,IAAI,IAAI,CAAC,cAAc,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;YACrD,MAAM,IAAI,YAAY,CACpB,SAAS,CAAC,WAAW,EACrB,+BAA+B,IAAI,CAAC,cAAc,yBAAyB,CAC5E,CAAC;QACJ,CAAC;QACD,IAAI,CAAC,iBAAiB,GAAG,CAAC,IAAI,kCAAkC,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC9G,CAAC;IAED,MAAM,CAAC,OAAuC;QAC5C,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,mBAAmB,CAAC;YACnD,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,6FAA6F;YAC7F,IAAI,EAAE,cAAc,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,qBAAqB,EAAE;SAC7E,CAAC,CAAC;QACH,MAAM,UAAU,GAAG,MAAM,OAAO,CAAC,OAAO,EAAE,CAAC;QAC3C,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,YAAY,CAAC,SAAS,CAAC,WAAW,EAAE,+DAA+D,CAAC,CAAC;QACjH,CAAC;QAED,MAAM,QAAQ,GAAG,WAAW,CAAC,KAAK,IAAI,EAAE;YACtC,IAAI,CAAC;gBACH,MAAM,UAAU,CAAC,OAAO,EAAE,CAAC;YAC7B,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE,CAAC,CAAC,CAAC;gBAC/C,aAAa,CAAC,QAAQ,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC,EAAE,MAAM,CAAC,CAAC;QAEX,OAAO,CAAC,IAAI,CAAC,YAAY,GAAG;YAC1B,aAAa,EAAE,IAAI,CAAC,mBAAmB;YACvC,OAAO,EAAE,KAAK,IAAI,EAAE;gBAClB,aAAa,CAAC,QAAQ,CAAC,CAAC;gBACxB,OAAO,UAAU,CAAC,OAAO,EAAE,CAAC;YAC9B,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { framework, TestStorageOptions } from '@powersync/service-core';
|
|
1
|
+
import { framework, SyncConfigParser, TestStorageOptions } from '@powersync/service-core';
|
|
2
2
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
3
3
|
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
4
4
|
import { PostgresReportStorage } from '../storage/PostgresReportStorage.js';
|
|
5
5
|
import { PostgresStorageConfigDecoded } from '../types/types.js';
|
|
6
6
|
export type PostgresTestStorageOptions = {
|
|
7
7
|
url: string;
|
|
8
|
+
syncConfigParser?: SyncConfigParser;
|
|
8
9
|
/**
|
|
9
10
|
* Vitest can cause issues when loading .ts files for migrations.
|
|
10
11
|
* This allows for providing a custom PostgresMigrationAgent.
|
package/dist/utils/test-utils.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createLogger, logger as defaultLogger, transports } from '@powersync/lib-services-framework';
|
|
2
|
-
import { framework } from '@powersync/service-core';
|
|
2
|
+
import { framework, SqlSyncConfigParser } from '@powersync/service-core';
|
|
3
3
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
4
4
|
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
5
5
|
import { PostgresReportStorage } from '../storage/PostgresReportStorage.js';
|
|
@@ -55,7 +55,7 @@ export function postgresTestSetup(factoryOptions) {
|
|
|
55
55
|
await using storageFactory = new PostgresBucketStorageFactory({
|
|
56
56
|
config: TEST_CONNECTION_OPTIONS,
|
|
57
57
|
replicationStreamNamePrefix: 'test_'
|
|
58
|
-
});
|
|
58
|
+
}, factoryOptions.syncConfigParser ?? new SqlSyncConfigParser());
|
|
59
59
|
await truncateTables(storageFactory.db);
|
|
60
60
|
};
|
|
61
61
|
return {
|
|
@@ -82,7 +82,7 @@ export function postgresTestSetup(factoryOptions) {
|
|
|
82
82
|
return new PostgresBucketStorageFactory({
|
|
83
83
|
config: TEST_CONNECTION_OPTIONS,
|
|
84
84
|
replicationStreamNamePrefix: 'test_'
|
|
85
|
-
});
|
|
85
|
+
}, factoryOptions.syncConfigParser ?? new SqlSyncConfigParser());
|
|
86
86
|
}
|
|
87
87
|
catch (ex) {
|
|
88
88
|
// Vitest does not display these errors nicely when using the `await using` syntx
|
|
@@ -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,
|
|
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@powersync/service-module-postgres-storage",
|
|
3
3
|
"repository": "https://github.com/powersync-ja/powersync-service",
|
|
4
|
-
"version": "0.0.0-dev-
|
|
4
|
+
"version": "0.0.0-dev-20261005112123",
|
|
5
5
|
"license": "FSL-1.1-ALv2",
|
|
6
6
|
"type": "module",
|
|
7
7
|
"publishConfig": {
|
|
@@ -16,17 +16,17 @@
|
|
|
16
16
|
"lru-cache": "^10.2.2",
|
|
17
17
|
"ts-codec": "^1.3.0",
|
|
18
18
|
"uuid": "^14.0.0",
|
|
19
|
-
"@powersync/lib-service-postgres": "0.0.0-dev-
|
|
20
|
-
"@powersync/lib-services-framework": "0.0.0-dev-
|
|
21
|
-
"@powersync/service-core": "0.0.0-dev-
|
|
22
|
-
"@powersync/service-
|
|
23
|
-
"@powersync/service-
|
|
19
|
+
"@powersync/lib-service-postgres": "0.0.0-dev-20261005112123",
|
|
20
|
+
"@powersync/lib-services-framework": "0.0.0-dev-20261005112123",
|
|
21
|
+
"@powersync/service-core": "0.0.0-dev-20261005112123",
|
|
22
|
+
"@powersync/service-jpgwire": "0.0.0-dev-20261005112123",
|
|
23
|
+
"@powersync/service-types": "0.19.0",
|
|
24
24
|
"@powersync/service-jsonbig": "0.17.13",
|
|
25
|
-
"@powersync/service-sync-rules": "0.0.0-dev-
|
|
25
|
+
"@powersync/service-sync-rules": "0.0.0-dev-20261005112123"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
28
|
"typescript": "~6.0.3",
|
|
29
|
-
"@powersync/service-core-tests": "0.0.0-dev-
|
|
29
|
+
"@powersync/service-core-tests": "0.0.0-dev-20261005112123"
|
|
30
30
|
},
|
|
31
31
|
"scripts": {
|
|
32
32
|
"build": "tsc -b",
|
|
@@ -25,8 +25,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
25
25
|
|
|
26
26
|
private activeStorageCache: storage.SyncRulesBucketStorage | undefined;
|
|
27
27
|
|
|
28
|
-
constructor(
|
|
29
|
-
|
|
28
|
+
constructor(
|
|
29
|
+
protected options: PostgresBucketStorageOptions,
|
|
30
|
+
syncConfigParser: storage.SyncConfigParser
|
|
31
|
+
) {
|
|
32
|
+
super({ syncConfigParser });
|
|
30
33
|
this.db = new lib_postgres.DatabaseClient({
|
|
31
34
|
config: options.config,
|
|
32
35
|
schema: STORAGE_SCHEMA_NAME,
|
|
@@ -41,7 +44,11 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
41
44
|
}
|
|
42
45
|
|
|
43
46
|
async [Symbol.asyncDispose]() {
|
|
44
|
-
|
|
47
|
+
try {
|
|
48
|
+
await super[Symbol.asyncDispose]();
|
|
49
|
+
} finally {
|
|
50
|
+
await this.db[Symbol.asyncDispose]();
|
|
51
|
+
}
|
|
45
52
|
}
|
|
46
53
|
|
|
47
54
|
async prepareStatements(connection: pg_wire.PgConnection) {
|
|
@@ -162,7 +169,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
162
169
|
options.storageVersion ??
|
|
163
170
|
options.config.parsed.config.storageVersion ??
|
|
164
171
|
this.options.defaultStorageVersion ??
|
|
165
|
-
storage.
|
|
172
|
+
storage.STORAGE_VERSION_2;
|
|
166
173
|
const storageConfig = storage.STORAGE_VERSION_CONFIG[storageVersion];
|
|
167
174
|
if (storageConfig == null || storageVersion >= storage.STORAGE_VERSION_4) {
|
|
168
175
|
throw new framework.ServiceError(
|
|
@@ -180,6 +187,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
180
187
|
state = ${{ type: 'varchar', value: storage.SyncRuleState.PROCESSING }}
|
|
181
188
|
`.execute();
|
|
182
189
|
|
|
190
|
+
// Uses the legacy sequence name "sync_rules_id_sequence" for backwards-compatibility. See AGENTS.md.
|
|
183
191
|
const newSyncRulesRow = await db.sql`
|
|
184
192
|
WITH
|
|
185
193
|
next_id AS (
|
|
@@ -227,7 +235,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
227
235
|
.decoded(models.SyncRules)
|
|
228
236
|
.first();
|
|
229
237
|
|
|
230
|
-
return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow
|
|
238
|
+
return new PostgresPersistedReplicationStream(this.db, newSyncRulesRow!, this.syncConfigParser);
|
|
231
239
|
});
|
|
232
240
|
}
|
|
233
241
|
|
|
@@ -361,7 +369,7 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
361
369
|
.decoded(models.SyncRules)
|
|
362
370
|
.rows();
|
|
363
371
|
|
|
364
|
-
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
372
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser));
|
|
365
373
|
}
|
|
366
374
|
|
|
367
375
|
async getStoppedReplicationStreams(): Promise<storage.PersistedReplicationStream[]> {
|
|
@@ -376,14 +384,14 @@ export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
|
|
|
376
384
|
.decoded(models.SyncRules)
|
|
377
385
|
.rows();
|
|
378
386
|
|
|
379
|
-
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row));
|
|
387
|
+
return rows.map((row) => new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser));
|
|
380
388
|
}
|
|
381
389
|
|
|
382
390
|
private resolvedSyncConfigFromRow(
|
|
383
391
|
row: models.SyncRulesDecoded,
|
|
384
392
|
options: { cacheActiveStorage?: boolean } = {}
|
|
385
393
|
): storage.ResolvedSyncConfig {
|
|
386
|
-
const stream = new PostgresPersistedReplicationStream(this.db, row);
|
|
394
|
+
const stream = new PostgresPersistedReplicationStream(this.db, row, this.syncConfigParser);
|
|
387
395
|
const content = stream.syncConfigContent[0];
|
|
388
396
|
const thisFactory = this;
|
|
389
397
|
|
|
@@ -25,12 +25,15 @@ export class PostgresStorageProvider implements storage.StorageProvider {
|
|
|
25
25
|
|
|
26
26
|
const decodedConfig = PostgresStorageConfig.decode(storage);
|
|
27
27
|
const normalizedConfig = normalizePostgresStorageConfig(decodedConfig);
|
|
28
|
-
const storageFactory = new PostgresBucketStorageFactory(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
28
|
+
const storageFactory = new PostgresBucketStorageFactory(
|
|
29
|
+
{
|
|
30
|
+
config: normalizedConfig,
|
|
31
|
+
replicationStreamNamePrefix: options.resolvedConfig.slot_name_prefix,
|
|
32
|
+
checksumCacheTtlMs: options.resolvedConfig.api_parameters.bucket_count_cache_ttl_minutes * 60_000,
|
|
33
|
+
defaultStorageVersion: decodedConfig.default_storage_version
|
|
34
|
+
},
|
|
35
|
+
options.syncConfigParser
|
|
36
|
+
);
|
|
34
37
|
|
|
35
38
|
const reportStorageFactory = new PostgresReportStorage({
|
|
36
39
|
config: normalizedConfig
|
|
@@ -6,17 +6,21 @@ import { models } from '../../types/types.js';
|
|
|
6
6
|
export class PostgresPersistedSyncConfigContent extends storage.PersistedSyncConfigContent {
|
|
7
7
|
constructor(
|
|
8
8
|
private db: lib_postgres.DatabaseClient,
|
|
9
|
-
row: models.SyncRulesDecoded
|
|
9
|
+
row: models.SyncRulesDecoded,
|
|
10
|
+
syncConfigParser: storage.SyncConfigParser
|
|
10
11
|
) {
|
|
11
|
-
super(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
12
|
+
super(
|
|
13
|
+
{
|
|
14
|
+
replicationStreamId: Number(row.id),
|
|
15
|
+
sync_rules_content: row.content,
|
|
16
|
+
compiled_plan: row.sync_plan,
|
|
17
|
+
replicationStreamName: row.slot_name,
|
|
18
|
+
storageVersion: row.storage_version ?? storage.LEGACY_STORAGE_VERSION,
|
|
19
|
+
syncConfigState: row.state as storage.SyncRuleState,
|
|
20
|
+
version_label: row.version_label ?? undefined
|
|
21
|
+
},
|
|
22
|
+
syncConfigParser
|
|
23
|
+
);
|
|
20
24
|
}
|
|
21
25
|
|
|
22
26
|
async getSyncConfigStatus(): Promise<storage.PersistedSyncConfigStatus | null> {
|
|
@@ -54,7 +58,8 @@ export class PostgresPersistedReplicationStream extends storage.PersistedReplica
|
|
|
54
58
|
|
|
55
59
|
constructor(
|
|
56
60
|
private db: lib_postgres.DatabaseClient,
|
|
57
|
-
private readonly row: models.SyncRulesDecoded
|
|
61
|
+
private readonly row: models.SyncRulesDecoded,
|
|
62
|
+
private readonly syncConfigParser: storage.SyncConfigParser
|
|
58
63
|
) {
|
|
59
64
|
super({
|
|
60
65
|
replicationStreamId: Number(row.id),
|
|
@@ -68,7 +73,7 @@ export class PostgresPersistedReplicationStream extends storage.PersistedReplica
|
|
|
68
73
|
`Unsupported storage version ${this.storageVersion} for PostgreSQL storage`
|
|
69
74
|
);
|
|
70
75
|
}
|
|
71
|
-
this.syncConfigContent = [new PostgresPersistedSyncConfigContent(this.db, this.row)];
|
|
76
|
+
this.syncConfigContent = [new PostgresPersistedSyncConfigContent(this.db, this.row, this.syncConfigParser)];
|
|
72
77
|
}
|
|
73
78
|
|
|
74
79
|
parsed(options: storage.ParseSyncConfigOptions): storage.ParsedSyncConfigSet {
|
|
@@ -78,6 +83,7 @@ export class PostgresPersistedReplicationStream extends storage.PersistedReplica
|
|
|
78
83
|
async lock(): Promise<storage.ReplicationLock> {
|
|
79
84
|
const manager = new lib_postgres.PostgresLockManager({
|
|
80
85
|
db: this.db,
|
|
86
|
+
// Uses the legacy "sync_rules_" lock name prefix for backwards-compatibility. See AGENTS.md.
|
|
81
87
|
name: `sync_rules_${this.replicationStreamId}_${this.replicationStreamName}`
|
|
82
88
|
});
|
|
83
89
|
const lockHandle = await manager.acquire();
|
package/src/utils/test-utils.ts
CHANGED
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
import { createLogger, logger as defaultLogger, transports } from '@powersync/lib-services-framework';
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
framework,
|
|
4
|
+
PowerSyncMigrationManager,
|
|
5
|
+
ServiceContext,
|
|
6
|
+
SqlSyncConfigParser,
|
|
7
|
+
SyncConfigParser,
|
|
8
|
+
TestStorageOptions
|
|
9
|
+
} from '@powersync/service-core';
|
|
3
10
|
import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
|
|
4
11
|
import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
|
|
5
12
|
import { PostgresReportStorage } from '../storage/PostgresReportStorage.js';
|
|
@@ -8,6 +15,7 @@ import { truncateTables } from './db.js';
|
|
|
8
15
|
|
|
9
16
|
export type PostgresTestStorageOptions = {
|
|
10
17
|
url: string;
|
|
18
|
+
syncConfigParser?: SyncConfigParser;
|
|
11
19
|
/**
|
|
12
20
|
* Vitest can cause issues when loading .ts files for migrations.
|
|
13
21
|
* This allows for providing a custom PostgresMigrationAgent.
|
|
@@ -71,10 +79,13 @@ export function postgresTestSetup(factoryOptions: PostgresTestStorageOptions) {
|
|
|
71
79
|
const clearStorage = async () => {
|
|
72
80
|
await runMigrations({ down: false, up: true });
|
|
73
81
|
|
|
74
|
-
await using storageFactory = new PostgresBucketStorageFactory(
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
82
|
+
await using storageFactory = new PostgresBucketStorageFactory(
|
|
83
|
+
{
|
|
84
|
+
config: TEST_CONNECTION_OPTIONS,
|
|
85
|
+
replicationStreamNamePrefix: 'test_'
|
|
86
|
+
},
|
|
87
|
+
factoryOptions.syncConfigParser ?? new SqlSyncConfigParser()
|
|
88
|
+
);
|
|
78
89
|
await truncateTables(storageFactory.db);
|
|
79
90
|
};
|
|
80
91
|
|
|
@@ -100,10 +111,13 @@ export function postgresTestSetup(factoryOptions: PostgresTestStorageOptions) {
|
|
|
100
111
|
await clearStorage();
|
|
101
112
|
}
|
|
102
113
|
|
|
103
|
-
return new PostgresBucketStorageFactory(
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
114
|
+
return new PostgresBucketStorageFactory(
|
|
115
|
+
{
|
|
116
|
+
config: TEST_CONNECTION_OPTIONS,
|
|
117
|
+
replicationStreamNamePrefix: 'test_'
|
|
118
|
+
},
|
|
119
|
+
factoryOptions.syncConfigParser ?? new SqlSyncConfigParser()
|
|
120
|
+
);
|
|
107
121
|
} catch (ex) {
|
|
108
122
|
// Vitest does not display these errors nicely when using the `await using` syntx
|
|
109
123
|
console.error(ex, ex.cause);
|