@powersync/service-module-postgres 0.0.0-dev-20250117095455 → 0.0.0-dev-20250214100224
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 +67 -11
- package/dist/api/PostgresRouteAPIAdapter.d.ts +2 -1
- package/dist/api/PostgresRouteAPIAdapter.js +22 -10
- package/dist/api/PostgresRouteAPIAdapter.js.map +1 -1
- package/dist/auth/SupabaseKeyCollector.js +6 -5
- package/dist/auth/SupabaseKeyCollector.js.map +1 -1
- package/dist/module/PostgresModule.d.ts +4 -2
- package/dist/module/PostgresModule.js +13 -5
- package/dist/module/PostgresModule.js.map +1 -1
- package/dist/replication/ConnectionManagerFactory.d.ts +1 -1
- package/dist/replication/ConnectionManagerFactory.js +2 -0
- package/dist/replication/ConnectionManagerFactory.js.map +1 -1
- package/dist/replication/PgManager.d.ts +5 -0
- package/dist/replication/PgManager.js +17 -2
- package/dist/replication/PgManager.js.map +1 -1
- package/dist/replication/PgRelation.js +2 -1
- package/dist/replication/PgRelation.js.map +1 -1
- package/dist/replication/PostgresErrorRateLimiter.js +5 -7
- package/dist/replication/PostgresErrorRateLimiter.js.map +1 -1
- package/dist/replication/WalStream.d.ts +18 -3
- package/dist/replication/WalStream.js +133 -22
- package/dist/replication/WalStream.js.map +1 -1
- package/dist/replication/WalStreamReplicationJob.js +7 -5
- package/dist/replication/WalStreamReplicationJob.js.map +1 -1
- package/dist/replication/WalStreamReplicator.d.ts +1 -0
- package/dist/replication/WalStreamReplicator.js +6 -1
- package/dist/replication/WalStreamReplicator.js.map +1 -1
- package/dist/replication/replication-utils.js +4 -4
- package/dist/replication/replication-utils.js.map +1 -1
- package/dist/utils/migration_lib.js +3 -4
- package/dist/utils/migration_lib.js.map +1 -1
- package/dist/utils/populate_test_data.js +1 -1
- package/dist/utils/populate_test_data.js.map +1 -1
- package/package.json +14 -12
- package/src/api/PostgresRouteAPIAdapter.ts +19 -9
- package/src/module/PostgresModule.ts +22 -5
- package/src/replication/ConnectionManagerFactory.ts +1 -1
- package/src/replication/PgManager.ts +10 -0
- package/src/replication/PgRelation.ts +2 -1
- package/src/replication/WalStream.ts +160 -26
- package/src/replication/WalStreamReplicationJob.ts +3 -3
- package/src/replication/WalStreamReplicator.ts +5 -0
- package/src/replication/replication-utils.ts +9 -4
- package/src/utils/migration_lib.ts +2 -1
- package/test/src/checkpoints.test.ts +70 -0
- package/test/src/storage_combination.test.ts +35 -0
- package/test/src/util.ts +1 -1
- package/test/src/wal_stream_utils.ts +1 -1
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,22 +1,78 @@
|
|
|
1
1
|
# @powersync/service-module-postgres
|
|
2
2
|
|
|
3
|
-
## 0.0.0-dev-
|
|
3
|
+
## 0.0.0-dev-20250214100224
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 84d03b8: Fix write checkpoint race condition
|
|
8
|
+
- Updated dependencies [84d03b8]
|
|
9
|
+
- @powersync/service-core@0.0.0-dev-20250214100224
|
|
10
|
+
|
|
11
|
+
## 0.7.0
|
|
12
|
+
|
|
13
|
+
### Minor Changes
|
|
14
|
+
|
|
15
|
+
- 4b43cdb: Exit replication process when sync rules are not valid; configurable with a new `sync_rules.exit_on_error` option.
|
|
16
|
+
|
|
17
|
+
### Patch Changes
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [e26e434]
|
|
20
|
+
- Updated dependencies [4b43cdb]
|
|
21
|
+
- Updated dependencies [9a9e668]
|
|
22
|
+
- @powersync/service-sync-rules@0.23.4
|
|
23
|
+
- @powersync/service-core@0.18.0
|
|
24
|
+
- @powersync/service-types@0.8.0
|
|
25
|
+
- @powersync/lib-services-framework@0.5.1
|
|
26
|
+
- @powersync/lib-service-postgres@0.3.1
|
|
27
|
+
|
|
28
|
+
## 0.6.1
|
|
29
|
+
|
|
30
|
+
### Patch Changes
|
|
31
|
+
|
|
32
|
+
- Updated dependencies [223f701]
|
|
33
|
+
- @powersync/lib-service-postgres@0.3.0
|
|
34
|
+
|
|
35
|
+
## 0.6.0
|
|
36
|
+
|
|
37
|
+
### Minor Changes
|
|
38
|
+
|
|
39
|
+
- 23fb49f: Allowed using the same Postgres server for the replication source and sync bucket storage. This is only supported on Postgres versions newer than 14.0.
|
|
40
|
+
|
|
41
|
+
### Patch Changes
|
|
42
|
+
|
|
43
|
+
- Updated dependencies [23fb49f]
|
|
44
|
+
- @powersync/service-core@0.17.0
|
|
45
|
+
|
|
46
|
+
## 0.5.1
|
|
47
|
+
|
|
48
|
+
### Patch Changes
|
|
49
|
+
|
|
50
|
+
- Updated dependencies [5043a82]
|
|
51
|
+
- @powersync/service-sync-rules@0.23.3
|
|
52
|
+
- @powersync/service-core@0.16.1
|
|
53
|
+
|
|
54
|
+
## 0.5.0
|
|
4
55
|
|
|
5
56
|
### Minor Changes
|
|
6
57
|
|
|
7
|
-
-
|
|
58
|
+
- 8675236: Allow limiting IP ranges of outgoing connections
|
|
8
59
|
|
|
9
60
|
### Patch Changes
|
|
10
61
|
|
|
11
|
-
-
|
|
12
|
-
- Updated dependencies [
|
|
13
|
-
- Updated dependencies [
|
|
14
|
-
- Updated dependencies [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
- @powersync/service-
|
|
62
|
+
- f049aa9: Introduce standard error codes
|
|
63
|
+
- Updated dependencies [f049aa9]
|
|
64
|
+
- Updated dependencies [8675236]
|
|
65
|
+
- Updated dependencies [f049aa9]
|
|
66
|
+
- Updated dependencies [8675236]
|
|
67
|
+
- Updated dependencies [8675236]
|
|
68
|
+
- Updated dependencies [8675236]
|
|
69
|
+
- Updated dependencies [f049aa9]
|
|
70
|
+
- @powersync/service-core@0.16.0
|
|
71
|
+
- @powersync/service-sync-rules@0.23.2
|
|
72
|
+
- @powersync/service-types@0.7.1
|
|
73
|
+
- @powersync/lib-service-postgres@0.2.0
|
|
74
|
+
- @powersync/lib-services-framework@0.5.0
|
|
75
|
+
- @powersync/service-jpgwire@0.19.0
|
|
20
76
|
|
|
21
77
|
## 0.4.0
|
|
22
78
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { api, ParseSyncRulesOptions } from '@powersync/service-core';
|
|
1
|
+
import { api, ParseSyncRulesOptions, ReplicationHeadCallback } from '@powersync/service-core';
|
|
2
2
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
3
|
import * as sync_rules from '@powersync/service-sync-rules';
|
|
4
4
|
import * as service_types from '@powersync/service-types';
|
|
@@ -22,5 +22,6 @@ export declare class PostgresRouteAPIAdapter implements api.RouteAPI {
|
|
|
22
22
|
protected getDebugTableInfo(tablePattern: sync_rules.TablePattern, name: string, relationId: number | null, syncRules: sync_rules.SqlSyncRules): Promise<service_types.TableInfo>;
|
|
23
23
|
getReplicationLag(options: api.ReplicationLagOptions): Promise<number | undefined>;
|
|
24
24
|
getReplicationHead(): Promise<string>;
|
|
25
|
+
createReplicationHead<T>(callback: ReplicationHeadCallback<T>): Promise<T>;
|
|
25
26
|
getConnectionSchema(): Promise<service_types.DatabaseSchema[]>;
|
|
26
27
|
}
|
|
@@ -1,15 +1,21 @@
|
|
|
1
1
|
import * as lib_postgres from '@powersync/lib-service-postgres';
|
|
2
|
+
import { ErrorCode, ServiceError } from '@powersync/lib-services-framework';
|
|
2
3
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
4
|
import * as sync_rules from '@powersync/service-sync-rules';
|
|
4
5
|
import * as service_types from '@powersync/service-types';
|
|
5
6
|
import * as replication_utils from '../replication/replication-utils.js';
|
|
6
7
|
import { getDebugTableInfo } from '../replication/replication-utils.js';
|
|
7
|
-
import { PUBLICATION_NAME } from '../replication/WalStream.js';
|
|
8
|
+
import { KEEPALIVE_STATEMENT, PUBLICATION_NAME } from '../replication/WalStream.js';
|
|
8
9
|
import * as types from '../types/types.js';
|
|
9
10
|
export class PostgresRouteAPIAdapter {
|
|
11
|
+
pool;
|
|
12
|
+
config;
|
|
13
|
+
connectionTag;
|
|
14
|
+
// TODO this should probably be configurable one day
|
|
15
|
+
publicationName = PUBLICATION_NAME;
|
|
10
16
|
static withConfig(config) {
|
|
11
17
|
const pool = pgwire.connectPgWirePool(config, {
|
|
12
|
-
idleTimeout:
|
|
18
|
+
idleTimeout: 30_000
|
|
13
19
|
});
|
|
14
20
|
return new PostgresRouteAPIAdapter(pool, config.tag, config);
|
|
15
21
|
}
|
|
@@ -19,8 +25,6 @@ export class PostgresRouteAPIAdapter {
|
|
|
19
25
|
constructor(pool, connectionTag, config) {
|
|
20
26
|
this.pool = pool;
|
|
21
27
|
this.config = config;
|
|
22
|
-
// TODO this should probably be configurable one day
|
|
23
|
-
this.publicationName = PUBLICATION_NAME;
|
|
24
28
|
this.connectionTag = connectionTag ?? sync_rules.DEFAULT_TAG;
|
|
25
29
|
}
|
|
26
30
|
getParseSyncRulesOptions() {
|
|
@@ -202,20 +206,28 @@ FROM pg_replication_slots WHERE slot_name = $1 LIMIT 1;`,
|
|
|
202
206
|
if (row) {
|
|
203
207
|
return Number(row.lsn_distance);
|
|
204
208
|
}
|
|
205
|
-
throw new
|
|
209
|
+
throw new ServiceError({
|
|
210
|
+
status: 500,
|
|
211
|
+
code: ErrorCode.PSYNC_S4001,
|
|
212
|
+
description: `Could not determine replication lag for slot ${slotName}`
|
|
213
|
+
});
|
|
206
214
|
}
|
|
207
215
|
async getReplicationHead() {
|
|
208
216
|
// On most Postgres versions, pg_logical_emit_message() returns the correct LSN.
|
|
209
217
|
// However, on Aurora (Postgres compatible), it can return an entirely different LSN,
|
|
210
218
|
// causing the write checkpoints to never be replicated back to the client.
|
|
211
219
|
// For those, we need to use pg_current_wal_lsn() instead.
|
|
212
|
-
const { results } = await lib_postgres.retriedQuery(this.pool,
|
|
213
|
-
// Specifically use the lsn from the first statement, not the second one.
|
|
220
|
+
const { results } = await lib_postgres.retriedQuery(this.pool, `SELECT pg_current_wal_lsn() as lsn`);
|
|
214
221
|
const lsn = results[0].rows[0][0];
|
|
215
222
|
return String(lsn);
|
|
216
223
|
}
|
|
224
|
+
async createReplicationHead(callback) {
|
|
225
|
+
const currentLsn = await this.getReplicationHead();
|
|
226
|
+
const r = await callback(currentLsn);
|
|
227
|
+
await lib_postgres.retriedQuery(this.pool, KEEPALIVE_STATEMENT);
|
|
228
|
+
return r;
|
|
229
|
+
}
|
|
217
230
|
async getConnectionSchema() {
|
|
218
|
-
var _a;
|
|
219
231
|
// https://github.com/Borvik/vscode-postgres/blob/88ec5ed061a0c9bced6c5d4ec122d0759c3f3247/src/language/server.ts
|
|
220
232
|
const results = await lib_postgres.retriedQuery(this.pool, `SELECT
|
|
221
233
|
tbl.schemaname,
|
|
@@ -260,10 +272,10 @@ GROUP BY schemaname, tablename, quoted_name`);
|
|
|
260
272
|
const rows = pgwire.pgwireRows(results);
|
|
261
273
|
let schemas = {};
|
|
262
274
|
for (let row of rows) {
|
|
263
|
-
const schema = (schemas[
|
|
275
|
+
const schema = (schemas[row.schemaname] ??= {
|
|
264
276
|
name: row.schemaname,
|
|
265
277
|
tables: []
|
|
266
|
-
})
|
|
278
|
+
});
|
|
267
279
|
const table = {
|
|
268
280
|
name: row.tablename,
|
|
269
281
|
columns: []
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/PostgresRouteAPIAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;
|
|
1
|
+
{"version":3,"file":"PostgresRouteAPIAdapter.js","sourceRoot":"","sources":["../../src/api/PostgresRouteAPIAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,16 +11,17 @@ import * as jose from 'jose';
|
|
|
11
11
|
* @deprecated Supabase is removing support for "app.settings.jwt_secret".
|
|
12
12
|
*/
|
|
13
13
|
export class SupabaseKeyCollector {
|
|
14
|
+
pool;
|
|
15
|
+
keyOptions = {
|
|
16
|
+
requiresAudience: ['authenticated'],
|
|
17
|
+
maxLifetimeSeconds: 86400 * 7 + 1200 // 1 week + 20 minutes margin
|
|
18
|
+
};
|
|
14
19
|
constructor(connectionConfig) {
|
|
15
|
-
this.keyOptions = {
|
|
16
|
-
requiresAudience: ['authenticated'],
|
|
17
|
-
maxLifetimeSeconds: 86400 * 7 + 1200 // 1 week + 20 minutes margin
|
|
18
|
-
};
|
|
19
20
|
this.pool = pgwire.connectPgWirePool(connectionConfig, {
|
|
20
21
|
// To avoid overloading the source database with open connections,
|
|
21
22
|
// limit to a single connection, and close the connection shortly
|
|
22
23
|
// after using it.
|
|
23
|
-
idleTimeout:
|
|
24
|
+
idleTimeout: 5_000,
|
|
24
25
|
maxSize: 1
|
|
25
26
|
});
|
|
26
27
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SupabaseKeyCollector.js","sourceRoot":"","sources":["../../src/auth/SupabaseKeyCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;
|
|
1
|
+
{"version":3,"file":"SupabaseKeyCollector.js","sourceRoot":"","sources":["../../src/auth/SupabaseKeyCollector.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,iCAAiC,CAAC;AAChE,OAAO,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AAC/C,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;AACrD,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAI7B;;;;;;;GAOG;AACH,MAAM,OAAO,oBAAoB;IACvB,IAAI,CAAkB;IAEtB,UAAU,GAAoB;QACpC,gBAAgB,EAAE,CAAC,eAAe,CAAC;QACnC,kBAAkB,EAAE,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,6BAA6B;KACnE,CAAC;IAEF,YAAY,gBAAgD;QAC1D,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,iBAAiB,CAAC,gBAAgB,EAAE;YACrD,kEAAkE;YAClE,iEAAiE;YACjE,kBAAkB;YAClB,WAAW,EAAE,KAAK;YAClB,OAAO,EAAE,CAAC;SACX,CAAC,CAAC;IACL,CAAC;IAED,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;IACzB,CAAC;IAED,KAAK,CAAC,OAAO;QACX,IAAI,GAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAC5B,MAAM,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,iEAAiE,CAAC,CAC9G,CAAC;YACF,GAAG,GAAG,IAAI,CAAC,CAAC,CAAQ,CAAC;QACvB,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,sCAAsC,CAAC,EAAE,CAAC;gBAChE,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,iDAAiD,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;YAChG,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,CAAC;YACV,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,GAAG,EAAE,UAAgC,CAAC;QACrD,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YACnB,OAAO;gBACL,IAAI,EAAE,EAAE;gBACR,MAAM,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,iBAAiB,EAAE,CAAC;aAC9C,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,GAAa;gBACpB,GAAG,EAAE,KAAK;gBACV,GAAG,EAAE,OAAO;gBACZ,iFAAiF;gBACjF,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;aACrD,CAAC;YACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACpE,OAAO;gBACL,IAAI,EAAE,CAAC,QAAQ,CAAC;gBAChB,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;IACH,CAAC;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { api, modules, replication, system } from '@powersync/service-core';
|
|
1
|
+
import { api, ConnectionTestResult, modules, replication, system } from '@powersync/service-core';
|
|
2
2
|
import * as types from '../types/types.js';
|
|
3
3
|
import { PostgresConnectionConfig } from '../types/types.js';
|
|
4
|
+
import { NormalizedBasePostgresConnectionConfig } from '@powersync/lib-service-postgres';
|
|
4
5
|
export declare class PostgresModule extends replication.ReplicationModule<types.PostgresConnectionConfig> {
|
|
5
6
|
constructor();
|
|
6
7
|
initialize(context: system.ServiceContextContainer): Promise<void>;
|
|
@@ -12,5 +13,6 @@ export declare class PostgresModule extends replication.ReplicationModule<types.
|
|
|
12
13
|
private resolveConfig;
|
|
13
14
|
teardown(options: modules.TearDownOptions): Promise<void>;
|
|
14
15
|
private registerSupabaseAuth;
|
|
15
|
-
testConnection(config: PostgresConnectionConfig): Promise<
|
|
16
|
+
testConnection(config: PostgresConnectionConfig): Promise<ConnectionTestResult>;
|
|
17
|
+
static testConnection(normalizedConfig: NormalizedBasePostgresConnectionConfig): Promise<ConnectionTestResult>;
|
|
16
18
|
}
|
|
@@ -9,6 +9,7 @@ import { checkSourceConfiguration, cleanUpReplicationSlot } from '../replication
|
|
|
9
9
|
import { PUBLICATION_NAME } from '../replication/WalStream.js';
|
|
10
10
|
import { WalStreamReplicator } from '../replication/WalStreamReplicator.js';
|
|
11
11
|
import * as types from '../types/types.js';
|
|
12
|
+
import { baseUri } from '@powersync/lib-service-postgres';
|
|
12
13
|
export class PostgresModule extends replication.ReplicationModule {
|
|
13
14
|
constructor() {
|
|
14
15
|
super({
|
|
@@ -65,7 +66,7 @@ export class PostgresModule extends replication.ReplicationModule {
|
|
|
65
66
|
async teardown(options) {
|
|
66
67
|
const normalisedConfig = this.resolveConfig(this.decodedConfig);
|
|
67
68
|
const connectionManager = new PgManager(normalisedConfig, {
|
|
68
|
-
idleTimeout:
|
|
69
|
+
idleTimeout: 30_000,
|
|
69
70
|
maxSize: 1
|
|
70
71
|
});
|
|
71
72
|
try {
|
|
@@ -114,18 +115,25 @@ export class PostgresModule extends replication.ReplicationModule {
|
|
|
114
115
|
}
|
|
115
116
|
async testConnection(config) {
|
|
116
117
|
this.decodeConfig(config);
|
|
117
|
-
const
|
|
118
|
-
|
|
119
|
-
|
|
118
|
+
const normalizedConfig = this.resolveConfig(this.decodedConfig);
|
|
119
|
+
return await this.testConnection(normalizedConfig);
|
|
120
|
+
}
|
|
121
|
+
static async testConnection(normalizedConfig) {
|
|
122
|
+
// FIXME: This is not a complete implementation yet.
|
|
123
|
+
const connectionManager = new PgManager(normalizedConfig, {
|
|
124
|
+
idleTimeout: 30_000,
|
|
120
125
|
maxSize: 1
|
|
121
126
|
});
|
|
122
127
|
const connection = await connectionManager.snapshotConnection();
|
|
123
128
|
try {
|
|
124
|
-
|
|
129
|
+
await checkSourceConfiguration(connection, PUBLICATION_NAME);
|
|
125
130
|
}
|
|
126
131
|
finally {
|
|
127
132
|
await connectionManager.end();
|
|
128
133
|
}
|
|
134
|
+
return {
|
|
135
|
+
connectionDescription: baseUri(normalizedConfig)
|
|
136
|
+
};
|
|
129
137
|
}
|
|
130
138
|
}
|
|
131
139
|
//# sourceMappingURL=PostgresModule.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresModule.js","sourceRoot":"","sources":["../../src/module/PostgresModule.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"PostgresModule.js","sourceRoot":"","sources":["../../src/module/PostgresModule.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import { NormalizedPostgresConnectionConfig } from '../types/types.js';
|
|
|
3
3
|
import { PgPoolOptions } from '@powersync/service-jpgwire';
|
|
4
4
|
export declare class ConnectionManagerFactory {
|
|
5
5
|
private readonly connectionManagers;
|
|
6
|
-
|
|
6
|
+
readonly dbConnectionConfig: NormalizedPostgresConnectionConfig;
|
|
7
7
|
constructor(dbConnectionConfig: NormalizedPostgresConnectionConfig);
|
|
8
8
|
create(poolOptions: PgPoolOptions): PgManager;
|
|
9
9
|
shutdown(): Promise<void>;
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { PgManager } from './PgManager.js';
|
|
2
2
|
import { logger } from '@powersync/lib-services-framework';
|
|
3
3
|
export class ConnectionManagerFactory {
|
|
4
|
+
connectionManagers;
|
|
5
|
+
dbConnectionConfig;
|
|
4
6
|
constructor(dbConnectionConfig) {
|
|
5
7
|
this.dbConnectionConfig = dbConnectionConfig;
|
|
6
8
|
this.connectionManagers = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ConnectionManagerFactory.js","sourceRoot":"","sources":["../../src/replication/ConnectionManagerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"ConnectionManagerFactory.js","sourceRoot":"","sources":["../../src/replication/ConnectionManagerFactory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D,MAAM,OAAO,wBAAwB;IAClB,kBAAkB,CAAc;IACjC,kBAAkB,CAAqC;IAEvE,YAAY,kBAAsD;QAChE,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC;QAC7C,IAAI,CAAC,kBAAkB,GAAG,EAAE,CAAC;IAC/B,CAAC;IAED,MAAM,CAAC,WAA0B;QAC/B,MAAM,OAAO,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;QACpE,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,KAAK,CAAC,QAAQ;QACZ,MAAM,CAAC,IAAI,CAAC,+CAA+C,CAAC,CAAC;QAC7D,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC9C,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC;QACtB,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,kDAAkD,CAAC,CAAC;IAClE,CAAC;CACF"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
2
|
+
import semver from 'semver';
|
|
2
3
|
import { NormalizedPostgresConnectionConfig } from '../types/types.js';
|
|
3
4
|
export declare class PgManager {
|
|
4
5
|
options: NormalizedPostgresConnectionConfig;
|
|
@@ -14,6 +15,10 @@ export declare class PgManager {
|
|
|
14
15
|
* Create a new replication connection.
|
|
15
16
|
*/
|
|
16
17
|
replicationConnection(): Promise<pgwire.PgConnection>;
|
|
18
|
+
/**
|
|
19
|
+
* @returns The Postgres server version in a parsed Semver instance
|
|
20
|
+
*/
|
|
21
|
+
getServerVersion(): Promise<semver.SemVer | null>;
|
|
17
22
|
/**
|
|
18
23
|
* Create a new standard connection, used for initial snapshot.
|
|
19
24
|
*
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
2
|
+
import semver from 'semver';
|
|
2
3
|
/**
|
|
3
4
|
* Shorter timeout for snapshot connections than for replication connections.
|
|
4
5
|
*/
|
|
5
|
-
const SNAPSHOT_SOCKET_TIMEOUT =
|
|
6
|
+
const SNAPSHOT_SOCKET_TIMEOUT = 30_000;
|
|
6
7
|
export class PgManager {
|
|
8
|
+
options;
|
|
9
|
+
poolOptions;
|
|
10
|
+
/**
|
|
11
|
+
* Do not use this for any transactions.
|
|
12
|
+
*/
|
|
13
|
+
pool;
|
|
14
|
+
connectionPromises = [];
|
|
7
15
|
constructor(options, poolOptions) {
|
|
8
16
|
this.options = options;
|
|
9
17
|
this.poolOptions = poolOptions;
|
|
10
|
-
this.connectionPromises = [];
|
|
11
18
|
// The pool is lazy - no connections are opened until a query is performed.
|
|
12
19
|
this.pool = pgwire.connectPgWirePool(this.options, poolOptions);
|
|
13
20
|
}
|
|
@@ -22,6 +29,14 @@ export class PgManager {
|
|
|
22
29
|
this.connectionPromises.push(p);
|
|
23
30
|
return await p;
|
|
24
31
|
}
|
|
32
|
+
/**
|
|
33
|
+
* @returns The Postgres server version in a parsed Semver instance
|
|
34
|
+
*/
|
|
35
|
+
async getServerVersion() {
|
|
36
|
+
const result = await this.pool.query(`SHOW server_version;`);
|
|
37
|
+
// The result is usually of the form "16.2 (Debian 16.2-1.pgdg120+2)"
|
|
38
|
+
return semver.coerce(result.rows[0][0].split(' ')[0]);
|
|
39
|
+
}
|
|
25
40
|
/**
|
|
26
41
|
* Create a new standard connection, used for initial snapshot.
|
|
27
42
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PgManager.js","sourceRoot":"","sources":["../../src/replication/PgManager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"PgManager.js","sourceRoot":"","sources":["../../src/replication/PgManager.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { ReplicationAssertionError } from '@powersync/lib-services-framework';
|
|
1
2
|
export function getReplicaIdColumns(relation) {
|
|
2
3
|
if (relation.replicaIdentity == 'nothing') {
|
|
3
4
|
return [];
|
|
@@ -12,7 +13,7 @@ export function getRelId(source) {
|
|
|
12
13
|
// Source types are wrong here
|
|
13
14
|
const relId = source.relationOid;
|
|
14
15
|
if (!relId) {
|
|
15
|
-
throw new
|
|
16
|
+
throw new ReplicationAssertionError(`No relation id found`);
|
|
16
17
|
}
|
|
17
18
|
return relId;
|
|
18
19
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PgRelation.js","sourceRoot":"","sources":["../../src/replication/PgRelation.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PgRelation.js","sourceRoot":"","sources":["../../src/replication/PgRelation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAgB,MAAM,mCAAmC,CAAC;AAM5F,MAAM,UAAU,mBAAmB,CAAC,QAA0B;IAC5D,IAAI,QAAQ,CAAC,eAAe,IAAI,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,OAAO,QAAQ,CAAC,OAAO;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC;aACnC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAoC,CAAC,CAAC;IAC1F,CAAC;AACH,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,MAAwB;IAC/C,8BAA8B;IAC9B,MAAM,KAAK,GAAI,MAAc,CAAC,WAAqB,CAAC;IACpD,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,MAAM,IAAI,yBAAyB,CAAC,sBAAsB,CAAC,CAAC;IAC9D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,MAAwB;IAC1D,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC;QAC1B,kBAAkB,EAAE,mBAAmB,CAAC,MAAM,CAAC;KACP,CAAC;AAC7C,CAAC"}
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
import { setTimeout } from 'timers/promises';
|
|
2
2
|
export class PostgresErrorRateLimiter {
|
|
3
|
-
|
|
4
|
-
this.nextAllowed = Date.now();
|
|
5
|
-
}
|
|
3
|
+
nextAllowed = Date.now();
|
|
6
4
|
async waitUntilAllowed(options) {
|
|
7
5
|
const delay = Math.max(0, this.nextAllowed - Date.now());
|
|
8
6
|
// Minimum delay between connections, even without errors
|
|
@@ -16,15 +14,15 @@ export class PostgresErrorRateLimiter {
|
|
|
16
14
|
const message = e.message ?? '';
|
|
17
15
|
if (message.includes('password authentication failed')) {
|
|
18
16
|
// Wait 15 minutes, to avoid triggering Supabase's fail2ban
|
|
19
|
-
this.setDelay(
|
|
17
|
+
this.setDelay(900_000);
|
|
20
18
|
}
|
|
21
19
|
else if (message.includes('ENOTFOUND')) {
|
|
22
20
|
// DNS lookup issue - incorrect URI or deleted instance
|
|
23
|
-
this.setDelay(
|
|
21
|
+
this.setDelay(120_000);
|
|
24
22
|
}
|
|
25
23
|
else if (message.includes('ECONNREFUSED')) {
|
|
26
24
|
// Could be fail2ban or similar
|
|
27
|
-
this.setDelay(
|
|
25
|
+
this.setDelay(120_000);
|
|
28
26
|
}
|
|
29
27
|
else if (message.includes('Unable to do postgres query on ended pool') ||
|
|
30
28
|
message.includes('Postgres unexpectedly closed connection')) {
|
|
@@ -33,7 +31,7 @@ export class PostgresErrorRateLimiter {
|
|
|
33
31
|
// we need to respect.
|
|
34
32
|
}
|
|
35
33
|
else {
|
|
36
|
-
this.setDelay(
|
|
34
|
+
this.setDelay(30_000);
|
|
37
35
|
}
|
|
38
36
|
}
|
|
39
37
|
setDelay(delay) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PostgresErrorRateLimiter.js","sourceRoot":"","sources":["../../src/replication/PostgresErrorRateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"PostgresErrorRateLimiter.js","sourceRoot":"","sources":["../../src/replication/PostgresErrorRateLimiter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C,MAAM,OAAO,wBAAwB;IACnC,WAAW,GAAW,IAAI,CAAC,GAAG,EAAE,CAAC;IAEjC,KAAK,CAAC,gBAAgB,CAAC,OAA0D;QAC/E,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACzD,yDAAyD;QACzD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QACnB,MAAM,UAAU,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;IAED,OAAO;QACL,OAAO,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,WAAW,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,CAAM;QAChB,MAAM,OAAO,GAAI,CAAC,CAAC,OAAkB,IAAI,EAAE,CAAC;QAC5C,IAAI,OAAO,CAAC,QAAQ,CAAC,gCAAgC,CAAC,EAAE,CAAC;YACvD,2DAA2D;YAC3D,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC;YACzC,uDAAuD;YACvD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YAC5C,+BAA+B;YAC/B,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QACzB,CAAC;aAAM,IACL,OAAO,CAAC,QAAQ,CAAC,2CAA2C,CAAC;YAC7D,OAAO,CAAC,QAAQ,CAAC,yCAAyC,CAAC,EAC3D,CAAC;YACD,oDAAoD;YACpD,yFAAyF;YACzF,sBAAsB;QACxB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACxB,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,KAAa;QAC5B,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;IACpE,CAAC;CACF"}
|
|
@@ -2,9 +2,6 @@ import { SourceEntityDescriptor, storage } from '@powersync/service-core';
|
|
|
2
2
|
import * as pgwire from '@powersync/service-jpgwire';
|
|
3
3
|
import { DatabaseInputRow, SqliteRow, SqlSyncRules, TablePattern } from '@powersync/service-sync-rules';
|
|
4
4
|
import { PgManager } from './PgManager.js';
|
|
5
|
-
export declare const ZERO_LSN = "00000000/00000000";
|
|
6
|
-
export declare const PUBLICATION_NAME = "powersync";
|
|
7
|
-
export declare const POSTGRES_DEFAULT_SCHEMA = "public";
|
|
8
5
|
export interface WalStreamOptions {
|
|
9
6
|
connections: PgManager;
|
|
10
7
|
storage: storage.SyncRulesBucketStorage;
|
|
@@ -16,6 +13,14 @@ interface InitResult {
|
|
|
16
13
|
/** True if snapshot must be started from scratch with a new slot. */
|
|
17
14
|
needsNewSlot: boolean;
|
|
18
15
|
}
|
|
16
|
+
export declare const ZERO_LSN = "00000000/00000000";
|
|
17
|
+
export declare const PUBLICATION_NAME = "powersync";
|
|
18
|
+
export declare const POSTGRES_DEFAULT_SCHEMA = "public";
|
|
19
|
+
export declare const KEEPALIVE_CONTENT = "ping";
|
|
20
|
+
export declare const KEEPALIVE_BUFFER: Buffer<ArrayBuffer>;
|
|
21
|
+
export declare const KEEPALIVE_STATEMENT: pgwire.Statement;
|
|
22
|
+
export declare const isKeepAliveMessage: (msg: pgwire.PgoutputMessage) => boolean;
|
|
23
|
+
export declare const sendKeepAlive: (db: pgwire.PgClient) => Promise<void>;
|
|
19
24
|
export declare class MissingReplicationSlotError extends Error {
|
|
20
25
|
constructor(message: string);
|
|
21
26
|
}
|
|
@@ -55,5 +60,15 @@ export declare class WalStream {
|
|
|
55
60
|
initReplication(replicationConnection: pgwire.PgConnection): Promise<void>;
|
|
56
61
|
streamChanges(replicationConnection: pgwire.PgConnection): Promise<void>;
|
|
57
62
|
ack(lsn: string, replicationStream: pgwire.ReplicationStream): Promise<void>;
|
|
63
|
+
/**
|
|
64
|
+
* Ensures that the storage is compatible with the replication connection.
|
|
65
|
+
* @throws {DatabaseConnectionError} If the storage is not compatible with the replication connection.
|
|
66
|
+
*/
|
|
67
|
+
protected ensureStorageCompatibility(): Promise<storage.ResolvedBucketBatchCommitOptions>;
|
|
68
|
+
/**
|
|
69
|
+
* Check if the replication connection Postgres server supports
|
|
70
|
+
* viewing the contents of logical replication messages.
|
|
71
|
+
*/
|
|
72
|
+
protected checkLogicalMessageSupport(): Promise<boolean>;
|
|
58
73
|
}
|
|
59
74
|
export {};
|