@powersync/service-module-postgres 0.14.4 → 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 +66 -0
- package/LICENSE +3 -3
- package/dist/api/PostgresRouteAPIAdapter.js +1 -1
- package/dist/api/PostgresRouteAPIAdapter.js.map +1 -1
- package/dist/module/PostgresModule.d.ts +1 -2
- package/dist/module/PostgresModule.js +3 -40
- package/dist/module/PostgresModule.js.map +1 -1
- package/dist/replication/PgRelation.js +1 -1
- package/dist/replication/PgRelation.js.map +1 -1
- package/dist/replication/SnapshotQuery.js +4 -4
- package/dist/replication/SnapshotQuery.js.map +1 -1
- package/dist/replication/WalStream.d.ts +3 -2
- package/dist/replication/WalStream.js +26 -16
- package/dist/replication/WalStream.js.map +1 -1
- package/dist/replication/replication-utils.js +10 -2
- package/dist/replication/replication-utils.js.map +1 -1
- package/dist/utils/pgwire_utils.d.ts +3 -3
- package/dist/utils/pgwire_utils.js.map +1 -1
- package/package.json +13 -13
- package/src/api/PostgresRouteAPIAdapter.ts +4 -1
- package/src/module/PostgresModule.ts +2 -43
- package/src/replication/PgRelation.ts +2 -2
- package/src/replication/SnapshotQuery.ts +4 -4
- package/src/replication/WalStream.ts +36 -19
- package/src/replication/replication-utils.ts +10 -2
- package/src/utils/pgwire_utils.ts +5 -3
- package/test/src/checkpoints.test.ts +2 -0
- package/test/src/large_batch.test.ts +0 -1
- package/test/src/pg_test.test.ts +57 -17
- package/test/src/slow_tests.test.ts +0 -2
- package/test/src/util.ts +2 -4
- package/test/src/wal_stream.test.ts +12 -21
- package/test/src/wal_stream_utils.ts +10 -1
- package/tsconfig.tsbuildinfo +1 -1
- package/dist/auth/SupabaseKeyCollector.d.ts +0 -17
- package/dist/auth/SupabaseKeyCollector.js +0 -71
- package/dist/auth/SupabaseKeyCollector.js.map +0 -1
- package/src/auth/SupabaseKeyCollector.ts +0 -83
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"replication-utils.js","sourceRoot":"","sources":["../../src/replication/replication-utils.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"replication-utils.js","sourceRoot":"","sources":["../../src/replication/replication-utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
2
|
-
import { DatabaseInputRow,
|
|
2
|
+
import { DatabaseInputRow, SqliteInputRow } from '@powersync/service-sync-rules';
|
|
3
3
|
/**
|
|
4
4
|
* pgwire message -> SQLite row.
|
|
5
5
|
* @param message
|
|
6
6
|
*/
|
|
7
|
-
export declare function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.PgoutputUpdate):
|
|
7
|
+
export declare function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.PgoutputUpdate): SqliteInputRow;
|
|
8
8
|
/**
|
|
9
9
|
* pgwire message -> SQLite row.
|
|
10
10
|
* @param message
|
|
11
11
|
*/
|
|
12
|
-
export declare function constructBeforeRecord(message: pgwire.PgoutputDelete | pgwire.PgoutputUpdate):
|
|
12
|
+
export declare function constructBeforeRecord(message: pgwire.PgoutputDelete | pgwire.PgoutputUpdate): SqliteInputRow | undefined;
|
|
13
13
|
/**
|
|
14
14
|
* We need a high level of control over how values are decoded, to make sure there is no loss
|
|
15
15
|
* of precision in the process.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pgwire_utils.js","sourceRoot":"","sources":["../../src/utils/pgwire_utils.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAE1G,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AACrD,OAAO,
|
|
1
|
+
{"version":3,"file":"pgwire_utils.js","sourceRoot":"","sources":["../../src/utils/pgwire_utils.ts"],"names":[],"mappings":"AAAA,0GAA0G;AAE1G,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AACrD,OAAO,EAAoC,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAEjG;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAAsD;IACzF,MAAM,OAAO,GAAI,OAAe,CAAC,QAAQ,CAAC;IAE1C,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CACnC,OAAsD;IAEtD,MAAM,OAAO,GAAI,OAAe,CAAC,SAAS,CAAC;IAC3C,IAAI,OAAO,IAAI,IAAI,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACtD,OAAO,cAAc,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,WAAW,CAAC,QAAiC,EAAE,QAA6B;IAC1F,IAAI,MAAM,GAAwB,EAAE,CAAC;IACrC,KAAK,IAAI,UAAU,IAAI,QAAQ,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC;QACpC,MAAM,OAAO,GAAI,QAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAC1E,IAAI,OAAO,MAAM,IAAI,QAAQ,IAAI,OAAO,EAAE,CAAC;YACzC,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,UAAU,CAAC,GAAG,MAAM,CAAC;QAC9B,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
package/package.json
CHANGED
|
@@ -5,9 +5,9 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.16.0",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
|
-
"license": "FSL-1.1-
|
|
10
|
+
"license": "FSL-1.1-ALv2",
|
|
11
11
|
"type": "module",
|
|
12
12
|
"exports": {
|
|
13
13
|
".": {
|
|
@@ -28,20 +28,20 @@
|
|
|
28
28
|
"ts-codec": "^1.3.0",
|
|
29
29
|
"uri-js": "^4.4.1",
|
|
30
30
|
"uuid": "^11.1.0",
|
|
31
|
-
"@powersync/lib-service-postgres": "0.4.
|
|
32
|
-
"@powersync/lib-services-framework": "0.7.
|
|
33
|
-
"@powersync/service-core": "1.
|
|
34
|
-
"@powersync/service-jpgwire": "0.20.
|
|
35
|
-
"@powersync/service-jsonbig": "0.17.
|
|
36
|
-
"@powersync/service-sync-rules": "0.
|
|
37
|
-
"@powersync/service-types": "0.
|
|
31
|
+
"@powersync/lib-service-postgres": "0.4.7",
|
|
32
|
+
"@powersync/lib-services-framework": "0.7.3",
|
|
33
|
+
"@powersync/service-core": "1.15.0",
|
|
34
|
+
"@powersync/service-jpgwire": "0.20.2",
|
|
35
|
+
"@powersync/service-jsonbig": "0.17.11",
|
|
36
|
+
"@powersync/service-sync-rules": "0.29.0",
|
|
37
|
+
"@powersync/service-types": "0.13.0"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"@types/semver": "^7.5.4",
|
|
41
|
-
"@powersync/service-core-tests": "0.
|
|
42
|
-
"@powersync/service-module-mongodb-storage": "0.
|
|
43
|
-
"@powersync/lib-service-postgres": "0.4.
|
|
44
|
-
"@powersync/service-module-postgres-storage": "0.
|
|
41
|
+
"@powersync/service-core-tests": "0.12.0",
|
|
42
|
+
"@powersync/service-module-mongodb-storage": "0.12.0",
|
|
43
|
+
"@powersync/lib-service-postgres": "0.4.7",
|
|
44
|
+
"@powersync/service-module-postgres-storage": "0.10.0"
|
|
45
45
|
},
|
|
46
46
|
"scripts": {
|
|
47
47
|
"build": "tsc -b",
|
|
@@ -105,7 +105,10 @@ export class PostgresRouteAPIAdapter implements api.RouteAPI {
|
|
|
105
105
|
columns: result.columns.map((c) => c.name),
|
|
106
106
|
rows: result.rows.map((row) => {
|
|
107
107
|
return row.map((value) => {
|
|
108
|
-
const sqlValue = sync_rules.
|
|
108
|
+
const sqlValue = sync_rules.applyValueContext(
|
|
109
|
+
sync_rules.toSyncRulesValue(value),
|
|
110
|
+
sync_rules.CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY
|
|
111
|
+
);
|
|
109
112
|
if (typeof sqlValue == 'bigint') {
|
|
110
113
|
return Number(value);
|
|
111
114
|
} else if (sync_rules.isJsonValue(sqlValue)) {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { baseUri, NormalizedBasePostgresConnectionConfig } from '@powersync/lib-service-postgres';
|
|
1
2
|
import {
|
|
2
3
|
api,
|
|
3
|
-
auth,
|
|
4
4
|
ConfigurationFileSyncRulesProvider,
|
|
5
5
|
ConnectionTestResult,
|
|
6
6
|
modules,
|
|
@@ -8,8 +8,8 @@ import {
|
|
|
8
8
|
system
|
|
9
9
|
} from '@powersync/service-core';
|
|
10
10
|
import * as jpgwire from '@powersync/service-jpgwire';
|
|
11
|
+
import { ReplicationMetric } from '@powersync/service-types';
|
|
11
12
|
import { PostgresRouteAPIAdapter } from '../api/PostgresRouteAPIAdapter.js';
|
|
12
|
-
import { SupabaseKeyCollector } from '../auth/SupabaseKeyCollector.js';
|
|
13
13
|
import { ConnectionManagerFactory } from '../replication/ConnectionManagerFactory.js';
|
|
14
14
|
import { PgManager } from '../replication/PgManager.js';
|
|
15
15
|
import { PostgresErrorRateLimiter } from '../replication/PostgresErrorRateLimiter.js';
|
|
@@ -18,8 +18,6 @@ import { PUBLICATION_NAME } from '../replication/WalStream.js';
|
|
|
18
18
|
import { WalStreamReplicator } from '../replication/WalStreamReplicator.js';
|
|
19
19
|
import * as types from '../types/types.js';
|
|
20
20
|
import { PostgresConnectionConfig } from '../types/types.js';
|
|
21
|
-
import { baseUri, NormalizedBasePostgresConnectionConfig } from '@powersync/lib-service-postgres';
|
|
22
|
-
import { ReplicationMetric } from '@powersync/service-types';
|
|
23
21
|
import { getApplicationName } from '../utils/application-name.js';
|
|
24
22
|
|
|
25
23
|
export class PostgresModule extends replication.ReplicationModule<types.PostgresConnectionConfig> {
|
|
@@ -32,19 +30,6 @@ export class PostgresModule extends replication.ReplicationModule<types.Postgres
|
|
|
32
30
|
}
|
|
33
31
|
|
|
34
32
|
async onInitialized(context: system.ServiceContextContainer): Promise<void> {
|
|
35
|
-
const client_auth = context.configuration.base_config.client_auth;
|
|
36
|
-
|
|
37
|
-
if (client_auth?.supabase && client_auth?.supabase_jwt_secret == null) {
|
|
38
|
-
// Only use the deprecated SupabaseKeyCollector when there is no
|
|
39
|
-
// secret hardcoded. Hardcoded secrets are handled elsewhere, using
|
|
40
|
-
// StaticSupabaseKeyCollector.
|
|
41
|
-
|
|
42
|
-
// Support for SupabaseKeyCollector is deprecated and support will be
|
|
43
|
-
// completely removed by Supabase soon. We can keep support a while
|
|
44
|
-
// longer for self-hosted setups, before also removing that on our side.
|
|
45
|
-
this.registerSupabaseAuth(context);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
33
|
// Record replicated bytes using global jpgwire metrics. Only registered if this module is replicating
|
|
49
34
|
if (context.replicationEngine) {
|
|
50
35
|
jpgwire.setMetricsRecorder({
|
|
@@ -110,32 +95,6 @@ export class PostgresModule extends replication.ReplicationModule<types.Postgres
|
|
|
110
95
|
}
|
|
111
96
|
}
|
|
112
97
|
|
|
113
|
-
// TODO: This should rather be done by registering the key collector in some kind of auth engine
|
|
114
|
-
private registerSupabaseAuth(context: system.ServiceContextContainer) {
|
|
115
|
-
const { configuration } = context;
|
|
116
|
-
// Register the Supabase key collector(s)
|
|
117
|
-
configuration.connections
|
|
118
|
-
?.map((baseConfig) => {
|
|
119
|
-
if (baseConfig.type != types.POSTGRES_CONNECTION_TYPE) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
try {
|
|
123
|
-
return this.resolveConfig(types.PostgresConnectionConfig.decode(baseConfig as any));
|
|
124
|
-
} catch (ex) {
|
|
125
|
-
this.logger.warn('Failed to decode configuration.', ex);
|
|
126
|
-
}
|
|
127
|
-
})
|
|
128
|
-
.filter((c) => !!c)
|
|
129
|
-
.forEach((config) => {
|
|
130
|
-
const keyCollector = new SupabaseKeyCollector(config!);
|
|
131
|
-
context.lifeCycleEngine.withLifecycle(keyCollector, {
|
|
132
|
-
// Close the internal pool
|
|
133
|
-
stop: (collector) => collector.shutdown()
|
|
134
|
-
});
|
|
135
|
-
configuration.client_keystore.collector.add(new auth.CachedKeyCollector(keyCollector));
|
|
136
|
-
});
|
|
137
|
-
}
|
|
138
|
-
|
|
139
98
|
async testConnection(config: PostgresConnectionConfig): Promise<ConnectionTestResult> {
|
|
140
99
|
this.decodeConfig(config);
|
|
141
100
|
const normalizedConfig = this.resolveConfig(this.decodedConfig!);
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ReplicationAssertionError
|
|
1
|
+
import { ReplicationAssertionError } from '@powersync/lib-services-framework';
|
|
2
2
|
import { storage } from '@powersync/service-core';
|
|
3
3
|
import { PgoutputRelation } from '@powersync/service-jpgwire';
|
|
4
4
|
|
|
@@ -27,6 +27,6 @@ export function getPgOutputRelation(source: PgoutputRelation): storage.SourceEnt
|
|
|
27
27
|
name: source.name,
|
|
28
28
|
schema: source.schema,
|
|
29
29
|
objectId: getRelId(source),
|
|
30
|
-
|
|
30
|
+
replicaIdColumns: getReplicaIdColumns(source)
|
|
31
31
|
} satisfies storage.SourceEntityDescriptor;
|
|
32
32
|
}
|
|
@@ -36,7 +36,7 @@ export class SimpleSnapshotQuery implements SnapshotQuery {
|
|
|
36
36
|
) {}
|
|
37
37
|
|
|
38
38
|
public async initialize(): Promise<void> {
|
|
39
|
-
await this.connection.query(`DECLARE snapshot_cursor CURSOR FOR SELECT * FROM ${this.table.
|
|
39
|
+
await this.connection.query(`DECLARE snapshot_cursor CURSOR FOR SELECT * FROM ${this.table.qualifiedName}`);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
public nextChunk(): AsyncIterableIterator<PgChunk> {
|
|
@@ -121,7 +121,7 @@ export class ChunkedSnapshotQuery implements SnapshotQuery {
|
|
|
121
121
|
const escapedKeyName = escapeIdentifier(this.key.name);
|
|
122
122
|
if (this.lastKey == null) {
|
|
123
123
|
stream = this.connection.stream(
|
|
124
|
-
`SELECT * FROM ${this.table.
|
|
124
|
+
`SELECT * FROM ${this.table.qualifiedName} ORDER BY ${escapedKeyName} LIMIT ${this.chunkSize}`
|
|
125
125
|
);
|
|
126
126
|
} else {
|
|
127
127
|
if (this.key.typeId == null) {
|
|
@@ -129,7 +129,7 @@ export class ChunkedSnapshotQuery implements SnapshotQuery {
|
|
|
129
129
|
}
|
|
130
130
|
let type: StatementParam['type'] = Number(this.key.typeId);
|
|
131
131
|
stream = this.connection.stream({
|
|
132
|
-
statement: `SELECT * FROM ${this.table.
|
|
132
|
+
statement: `SELECT * FROM ${this.table.qualifiedName} WHERE ${escapedKeyName} > $1 ORDER BY ${escapedKeyName} LIMIT ${this.chunkSize}`,
|
|
133
133
|
params: [{ value: this.lastKey, type }]
|
|
134
134
|
});
|
|
135
135
|
}
|
|
@@ -197,7 +197,7 @@ export class IdSnapshotQuery implements SnapshotQuery {
|
|
|
197
197
|
throw new Error(`Cannot determine primary key array type for ${JSON.stringify(keyDefinition)}`);
|
|
198
198
|
}
|
|
199
199
|
yield* this.connection.stream({
|
|
200
|
-
statement: `SELECT * FROM ${this.table.
|
|
200
|
+
statement: `SELECT * FROM ${this.table.qualifiedName} WHERE ${escapeIdentifier(keyDefinition.name)} = ANY($1)`,
|
|
201
201
|
params: [
|
|
202
202
|
{
|
|
203
203
|
type: type,
|
|
@@ -20,7 +20,15 @@ import {
|
|
|
20
20
|
storage
|
|
21
21
|
} from '@powersync/service-core';
|
|
22
22
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
23
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
applyValueContext,
|
|
25
|
+
CompatibilityContext,
|
|
26
|
+
DatabaseInputRow,
|
|
27
|
+
SqliteInputRow,
|
|
28
|
+
SqlSyncRules,
|
|
29
|
+
TablePattern,
|
|
30
|
+
toSyncRulesRow
|
|
31
|
+
} from '@powersync/service-sync-rules';
|
|
24
32
|
import * as pg_utils from '../utils/pgwire_utils.js';
|
|
25
33
|
|
|
26
34
|
import { PgManager } from './PgManager.js';
|
|
@@ -256,7 +264,7 @@ export class WalStream {
|
|
|
256
264
|
name,
|
|
257
265
|
schema,
|
|
258
266
|
objectId: relid,
|
|
259
|
-
|
|
267
|
+
replicaIdColumns: cresult.replicationColumns
|
|
260
268
|
} as SourceEntityDescriptor,
|
|
261
269
|
false
|
|
262
270
|
);
|
|
@@ -321,7 +329,7 @@ export class WalStream {
|
|
|
321
329
|
|
|
322
330
|
// Check that replication slot exists
|
|
323
331
|
for (let i = 120; i >= 0; i--) {
|
|
324
|
-
|
|
332
|
+
this.touch();
|
|
325
333
|
|
|
326
334
|
if (i == 0) {
|
|
327
335
|
container.reporter.captureException(last_error, {
|
|
@@ -450,7 +458,7 @@ WHERE oid = $1::regclass`,
|
|
|
450
458
|
|
|
451
459
|
async initialReplication(db: pgwire.PgConnection) {
|
|
452
460
|
const sourceTables = this.sync_rules.getSourceTables();
|
|
453
|
-
await this.storage.startBatch(
|
|
461
|
+
const flushResults = await this.storage.startBatch(
|
|
454
462
|
{
|
|
455
463
|
logger: this.logger,
|
|
456
464
|
zeroLSN: ZERO_LSN,
|
|
@@ -479,7 +487,7 @@ WHERE oid = $1::regclass`,
|
|
|
479
487
|
|
|
480
488
|
for (let table of tablesWithStatus) {
|
|
481
489
|
await this.snapshotTableInTx(batch, db, table);
|
|
482
|
-
|
|
490
|
+
this.touch();
|
|
483
491
|
}
|
|
484
492
|
|
|
485
493
|
// Always commit the initial snapshot at zero.
|
|
@@ -498,9 +506,19 @@ WHERE oid = $1::regclass`,
|
|
|
498
506
|
* to advance the active sync rules LSN.
|
|
499
507
|
*/
|
|
500
508
|
await sendKeepAlive(db);
|
|
509
|
+
|
|
510
|
+
const lastOp = flushResults?.flushed_op;
|
|
511
|
+
if (lastOp != null) {
|
|
512
|
+
// Populate the cache _after_ initial replication, but _before_ we switch to this sync rules.
|
|
513
|
+
await this.storage.populatePersistentChecksumCache({
|
|
514
|
+
// No checkpoint yet, but we do have the opId.
|
|
515
|
+
maxOpId: lastOp,
|
|
516
|
+
signal: this.abort_signal
|
|
517
|
+
});
|
|
518
|
+
}
|
|
501
519
|
}
|
|
502
520
|
|
|
503
|
-
static *getQueryData(results: Iterable<DatabaseInputRow>): Generator<
|
|
521
|
+
static *getQueryData(results: Iterable<DatabaseInputRow>): Generator<SqliteInputRow> {
|
|
504
522
|
for (let row of results) {
|
|
505
523
|
yield toSyncRulesRow(row);
|
|
506
524
|
}
|
|
@@ -628,7 +646,7 @@ WHERE oid = $1::regclass`,
|
|
|
628
646
|
at += rows.length;
|
|
629
647
|
this.metrics.getCounter(ReplicationMetric.ROWS_REPLICATED).add(rows.length);
|
|
630
648
|
|
|
631
|
-
|
|
649
|
+
this.touch();
|
|
632
650
|
}
|
|
633
651
|
|
|
634
652
|
// Important: flush before marking progress
|
|
@@ -737,6 +755,9 @@ WHERE oid = $1::regclass`,
|
|
|
737
755
|
rows.map((r) => r.key)
|
|
738
756
|
);
|
|
739
757
|
}
|
|
758
|
+
// Even with resnapshot, we need to wait until we get a new consistent checkpoint
|
|
759
|
+
// after the snapshot, so we need to send a keepalive message.
|
|
760
|
+
await sendKeepAlive(db);
|
|
740
761
|
} finally {
|
|
741
762
|
await db.end();
|
|
742
763
|
}
|
|
@@ -837,7 +858,6 @@ WHERE oid = $1::regclass`,
|
|
|
837
858
|
|
|
838
859
|
async streamChanges(replicationConnection: pgwire.PgConnection) {
|
|
839
860
|
// When changing any logic here, check /docs/wal-lsns.md.
|
|
840
|
-
|
|
841
861
|
const { createEmptyCheckpoints } = await this.ensureStorageCompatibility();
|
|
842
862
|
|
|
843
863
|
const replicationOptions: Record<string, string> = {
|
|
@@ -867,9 +887,6 @@ WHERE oid = $1::regclass`,
|
|
|
867
887
|
|
|
868
888
|
this.startedStreaming = true;
|
|
869
889
|
|
|
870
|
-
// Auto-activate as soon as initial replication is done
|
|
871
|
-
await this.storage.autoActivate();
|
|
872
|
-
|
|
873
890
|
let resnapshot: { table: storage.SourceTable; key: PrimaryKeyValue }[] = [];
|
|
874
891
|
|
|
875
892
|
const markRecordUnavailable = (record: SaveUpdate) => {
|
|
@@ -886,7 +903,8 @@ WHERE oid = $1::regclass`,
|
|
|
886
903
|
// The key should always be present in the "after" record.
|
|
887
904
|
return;
|
|
888
905
|
}
|
|
889
|
-
key
|
|
906
|
+
// We just need a consistent representation of the primary key, and don't care about fixed quirks.
|
|
907
|
+
key[name] = applyValueContext(value, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
|
|
890
908
|
}
|
|
891
909
|
resnapshot.push({
|
|
892
910
|
table: record.sourceTable,
|
|
@@ -911,7 +929,7 @@ WHERE oid = $1::regclass`,
|
|
|
911
929
|
let count = 0;
|
|
912
930
|
|
|
913
931
|
for await (const chunk of replicationStream.pgoutputDecode()) {
|
|
914
|
-
|
|
932
|
+
this.touch();
|
|
915
933
|
|
|
916
934
|
if (this.abort_signal.aborted) {
|
|
917
935
|
break;
|
|
@@ -1091,11 +1109,10 @@ WHERE oid = $1::regclass`,
|
|
|
1091
1109
|
}
|
|
1092
1110
|
return Date.now() - this.oldestUncommittedChange.getTime();
|
|
1093
1111
|
}
|
|
1094
|
-
}
|
|
1095
1112
|
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1113
|
+
private touch() {
|
|
1114
|
+
container.probes.touch().catch((e) => {
|
|
1115
|
+
this.logger.error(`Error touching probe`, e);
|
|
1116
|
+
});
|
|
1117
|
+
}
|
|
1101
1118
|
}
|
|
@@ -315,7 +315,15 @@ export async function getDebugTableInfo(options: GetDebugTableInfoOptions): Prom
|
|
|
315
315
|
|
|
316
316
|
const id_columns = id_columns_result?.replicationColumns ?? [];
|
|
317
317
|
|
|
318
|
-
const sourceTable = new storage.SourceTable(
|
|
318
|
+
const sourceTable = new storage.SourceTable({
|
|
319
|
+
id: 0,
|
|
320
|
+
connectionTag: connectionTag,
|
|
321
|
+
objectId: relationId ?? 0,
|
|
322
|
+
schema: schema,
|
|
323
|
+
name: name,
|
|
324
|
+
replicaIdColumns: id_columns,
|
|
325
|
+
snapshotComplete: true
|
|
326
|
+
});
|
|
319
327
|
|
|
320
328
|
const syncData = syncRules.tableSyncsData(sourceTable);
|
|
321
329
|
const syncParameters = syncRules.tableSyncsParameters(sourceTable);
|
|
@@ -342,7 +350,7 @@ export async function getDebugTableInfo(options: GetDebugTableInfoOptions): Prom
|
|
|
342
350
|
|
|
343
351
|
let selectError = null;
|
|
344
352
|
try {
|
|
345
|
-
await lib_postgres.retriedQuery(db, `SELECT * FROM ${sourceTable.
|
|
353
|
+
await lib_postgres.retriedQuery(db, `SELECT * FROM ${sourceTable.qualifiedName} LIMIT 1`);
|
|
346
354
|
} catch (e) {
|
|
347
355
|
selectError = { level: 'fatal', message: e.message };
|
|
348
356
|
}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
// Adapted from https://github.com/kagis/pgwire/blob/0dc927f9f8990a903f238737326e53ba1c8d094f/mod.js#L2218
|
|
2
2
|
|
|
3
3
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
4
|
-
import { DatabaseInputRow,
|
|
4
|
+
import { DatabaseInputRow, SqliteInputRow, toSyncRulesRow } from '@powersync/service-sync-rules';
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* pgwire message -> SQLite row.
|
|
8
8
|
* @param message
|
|
9
9
|
*/
|
|
10
|
-
export function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.PgoutputUpdate):
|
|
10
|
+
export function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.PgoutputUpdate): SqliteInputRow {
|
|
11
11
|
const rawData = (message as any).afterRaw;
|
|
12
12
|
|
|
13
13
|
const record = decodeTuple(message.relation, rawData);
|
|
@@ -18,7 +18,9 @@ export function constructAfterRecord(message: pgwire.PgoutputInsert | pgwire.Pgo
|
|
|
18
18
|
* pgwire message -> SQLite row.
|
|
19
19
|
* @param message
|
|
20
20
|
*/
|
|
21
|
-
export function constructBeforeRecord(
|
|
21
|
+
export function constructBeforeRecord(
|
|
22
|
+
message: pgwire.PgoutputDelete | pgwire.PgoutputUpdate
|
|
23
|
+
): SqliteInputRow | undefined {
|
|
22
24
|
const rawData = (message as any).beforeRaw;
|
|
23
25
|
if (rawData == null) {
|
|
24
26
|
return undefined;
|
|
@@ -36,6 +36,8 @@ const checkpointTests = (factory: TestStorageFactory) => {
|
|
|
36
36
|
await context.replicateSnapshot();
|
|
37
37
|
|
|
38
38
|
context.startStreaming();
|
|
39
|
+
// Wait for a consistent checkpoint before we start.
|
|
40
|
+
await context.getCheckpoint();
|
|
39
41
|
const storage = context.storage!;
|
|
40
42
|
|
|
41
43
|
const controller = new AbortController();
|
|
@@ -87,7 +87,6 @@ function defineBatchTests(factory: storage.TestStorageFactory) {
|
|
|
87
87
|
const start = Date.now();
|
|
88
88
|
|
|
89
89
|
await context.replicateSnapshot();
|
|
90
|
-
await context.storage!.autoActivate();
|
|
91
90
|
context.startStreaming();
|
|
92
91
|
|
|
93
92
|
const checkpoint = await context.getCheckpoint({ timeout: 100_000 });
|
package/test/src/pg_test.test.ts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
1
|
import { constructAfterRecord } from '@module/utils/pgwire_utils.js';
|
|
2
2
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
|
-
import {
|
|
3
|
+
import {
|
|
4
|
+
applyRowContext,
|
|
5
|
+
CompatibilityContext,
|
|
6
|
+
SqliteInputRow,
|
|
7
|
+
DateTimeValue,
|
|
8
|
+
TimeValue,
|
|
9
|
+
CompatibilityEdition
|
|
10
|
+
} from '@powersync/service-sync-rules';
|
|
4
11
|
import { describe, expect, test } from 'vitest';
|
|
5
12
|
import { clearTestDb, connectPgPool, connectPgWire, TEST_URI } from './util.js';
|
|
6
13
|
import { WalStream } from '@module/replication/WalStream.js';
|
|
@@ -158,9 +165,9 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
158
165
|
expect(transformed[2]).toMatchObject({
|
|
159
166
|
id: 3n,
|
|
160
167
|
date: '2023-03-06',
|
|
161
|
-
time: '15:47:00',
|
|
162
|
-
timestamp: '2023-03-06 15:47:00',
|
|
163
|
-
timestamptz: '2023-03-06 13:47:00Z'
|
|
168
|
+
time: new TimeValue('15:47:00'),
|
|
169
|
+
timestamp: new DateTimeValue('2023-03-06T15:47:00.000000', '2023-03-06 15:47:00'),
|
|
170
|
+
timestamptz: new DateTimeValue('2023-03-06T13:47:00.000000Z', '2023-03-06 13:47:00Z')
|
|
164
171
|
});
|
|
165
172
|
|
|
166
173
|
expect(transformed[3]).toMatchObject({
|
|
@@ -175,26 +182,26 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
175
182
|
expect(transformed[4]).toMatchObject({
|
|
176
183
|
id: 5n,
|
|
177
184
|
date: '0000-01-01',
|
|
178
|
-
time: '00:00:00',
|
|
179
|
-
timestamp: '0000-01-
|
|
180
|
-
timestamptz: '0000-01-
|
|
185
|
+
time: new TimeValue('00:00:00'),
|
|
186
|
+
timestamp: new DateTimeValue('0000-01-01T00:00:00'),
|
|
187
|
+
timestamptz: new DateTimeValue('0000-01-01T00:00:00Z')
|
|
181
188
|
});
|
|
182
189
|
|
|
183
190
|
expect(transformed[5]).toMatchObject({
|
|
184
191
|
id: 6n,
|
|
185
|
-
timestamp: '1970-01-01 00:00:00',
|
|
186
|
-
timestamptz: '1970-01-01 00:00:00Z'
|
|
192
|
+
timestamp: new DateTimeValue('1970-01-01T00:00:00.000000', '1970-01-01 00:00:00'),
|
|
193
|
+
timestamptz: new DateTimeValue('1970-01-01T00:00:00.000000Z', '1970-01-01 00:00:00Z')
|
|
187
194
|
});
|
|
188
195
|
|
|
189
196
|
expect(transformed[6]).toMatchObject({
|
|
190
197
|
id: 7n,
|
|
191
|
-
timestamp: '9999-12-
|
|
192
|
-
timestamptz: '9999-12-
|
|
198
|
+
timestamp: new DateTimeValue('9999-12-31T23:59:59'),
|
|
199
|
+
timestamptz: new DateTimeValue('9999-12-31T23:59:59Z')
|
|
193
200
|
});
|
|
194
201
|
|
|
195
202
|
expect(transformed[7]).toMatchObject({
|
|
196
203
|
id: 8n,
|
|
197
|
-
timestamptz: '0022-02-03 09:13:14Z'
|
|
204
|
+
timestamptz: new DateTimeValue('0022-02-03T09:13:14.000000Z', '0022-02-03 09:13:14Z')
|
|
198
205
|
});
|
|
199
206
|
|
|
200
207
|
expect(transformed[8]).toMatchObject({
|
|
@@ -235,8 +242,8 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
235
242
|
id: 3n,
|
|
236
243
|
date: `["2023-03-06"]`,
|
|
237
244
|
time: `["15:47:00"]`,
|
|
238
|
-
timestamp:
|
|
239
|
-
timestamptz:
|
|
245
|
+
timestamp: '["2023-03-06 15:47:00"]',
|
|
246
|
+
timestamptz: '["2023-03-06 13:47:00Z","2023-03-06 13:47:00.12345Z"]'
|
|
240
247
|
});
|
|
241
248
|
|
|
242
249
|
expect(transformed[3]).toMatchObject({
|
|
@@ -339,7 +346,7 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
339
346
|
|
|
340
347
|
const transformed = [
|
|
341
348
|
...WalStream.getQueryData(pgwire.pgwireRows(await db.query(`SELECT * FROM test_data_arrays ORDER BY id`)))
|
|
342
|
-
];
|
|
349
|
+
].map((e) => applyRowContext(e, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY));
|
|
343
350
|
|
|
344
351
|
checkResultArrays(transformed);
|
|
345
352
|
} finally {
|
|
@@ -415,7 +422,7 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
415
422
|
const transformed = await getReplicationTx(replicationStream);
|
|
416
423
|
await pg.end();
|
|
417
424
|
|
|
418
|
-
checkResultArrays(transformed);
|
|
425
|
+
checkResultArrays(transformed.map((e) => applyRowContext(e, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY)));
|
|
419
426
|
} finally {
|
|
420
427
|
await db.end();
|
|
421
428
|
}
|
|
@@ -430,13 +437,46 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
430
437
|
// const schema = await api.getConnectionsSchema(db);
|
|
431
438
|
// expect(schema).toMatchSnapshot();
|
|
432
439
|
});
|
|
440
|
+
|
|
441
|
+
test('date formats', async () => {
|
|
442
|
+
const db = await connectPgWire();
|
|
443
|
+
try {
|
|
444
|
+
await setupTable(db);
|
|
445
|
+
|
|
446
|
+
await db.query(`
|
|
447
|
+
INSERT INTO test_data(id, time, timestamp, timestamptz) VALUES (1, '17:42:01.12', '2023-03-06 15:47:12.4', '2023-03-06 15:47+02');
|
|
448
|
+
`);
|
|
449
|
+
|
|
450
|
+
const [row] = [
|
|
451
|
+
...WalStream.getQueryData(
|
|
452
|
+
pgwire.pgwireRows(await db.query(`SELECT time, timestamp, timestamptz FROM test_data`))
|
|
453
|
+
)
|
|
454
|
+
];
|
|
455
|
+
|
|
456
|
+
const oldFormat = applyRowContext(row, CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
|
|
457
|
+
expect(oldFormat).toMatchObject({
|
|
458
|
+
time: '17:42:01.12',
|
|
459
|
+
timestamp: '2023-03-06 15:47:12.4',
|
|
460
|
+
timestamptz: '2023-03-06 13:47:00Z'
|
|
461
|
+
});
|
|
462
|
+
|
|
463
|
+
const newFormat = applyRowContext(row, new CompatibilityContext(CompatibilityEdition.SYNC_STREAMS));
|
|
464
|
+
expect(newFormat).toMatchObject({
|
|
465
|
+
time: '17:42:01.120000',
|
|
466
|
+
timestamp: '2023-03-06T15:47:12.400000',
|
|
467
|
+
timestamptz: '2023-03-06T13:47:00.000000Z'
|
|
468
|
+
});
|
|
469
|
+
} finally {
|
|
470
|
+
await db.end();
|
|
471
|
+
}
|
|
472
|
+
});
|
|
433
473
|
});
|
|
434
474
|
|
|
435
475
|
/**
|
|
436
476
|
* Return all the inserts from the first transaction in the replication stream.
|
|
437
477
|
*/
|
|
438
478
|
async function getReplicationTx(replicationStream: pgwire.ReplicationStream) {
|
|
439
|
-
let transformed:
|
|
479
|
+
let transformed: SqliteInputRow[] = [];
|
|
440
480
|
for await (const batch of replicationStream.pgoutputDecode()) {
|
|
441
481
|
for (const msg of batch.messages) {
|
|
442
482
|
if (msg.tag == 'insert') {
|
|
@@ -97,7 +97,6 @@ bucket_definitions:
|
|
|
97
97
|
await pool.query(`ALTER TABLE test_data REPLICA IDENTITY FULL`);
|
|
98
98
|
|
|
99
99
|
await walStream.initReplication(replicationConnection);
|
|
100
|
-
await storage.autoActivate();
|
|
101
100
|
let abort = false;
|
|
102
101
|
streamPromise = walStream.streamChanges(replicationConnection).finally(() => {
|
|
103
102
|
abort = true;
|
|
@@ -348,7 +347,6 @@ bucket_definitions:
|
|
|
348
347
|
let initialReplicationDone = false;
|
|
349
348
|
streamPromise = (async () => {
|
|
350
349
|
await walStream.initReplication(replicationConnection);
|
|
351
|
-
await storage.autoActivate();
|
|
352
350
|
initialReplicationDone = true;
|
|
353
351
|
await walStream.streamChanges(replicationConnection);
|
|
354
352
|
})()
|
package/test/src/util.ts
CHANGED
|
@@ -90,10 +90,8 @@ export async function getClientCheckpoint(
|
|
|
90
90
|
while (Date.now() - start < timeout) {
|
|
91
91
|
const storage = await storageFactory.getActiveStorage();
|
|
92
92
|
const cp = await storage?.getCheckpoint();
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
96
|
-
if (cp.lsn && cp.lsn >= lsn) {
|
|
93
|
+
|
|
94
|
+
if (cp?.lsn != null && cp.lsn >= lsn) {
|
|
97
95
|
logger.info(`Got write checkpoint: ${lsn} : ${cp.checkpoint}`);
|
|
98
96
|
return cp.checkpoint;
|
|
99
97
|
}
|