@powersync/service-core 0.2.1 → 0.2.2
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 +9 -0
- package/dist/runner/teardown.js +25 -10
- package/dist/runner/teardown.js.map +1 -1
- package/package.json +3 -3
- package/src/runner/teardown.ts +28 -11
- package/test/src/pg_test.test.ts +18 -0
- package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,14 @@
|
|
|
1
1
|
# @powersync/service-core
|
|
2
2
|
|
|
3
|
+
## 0.2.2
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- 8245912: Fix teardown command not terminating after some errors.
|
|
8
|
+
- 7587a74: Fix date parsing in replication for dates further back than 100 AD.
|
|
9
|
+
- Updated dependencies [7587a74]
|
|
10
|
+
- @powersync/service-jpgwire@0.17.13
|
|
11
|
+
|
|
3
12
|
## 0.2.1
|
|
4
13
|
|
|
5
14
|
### Patch Changes
|
package/dist/runner/teardown.js
CHANGED
|
@@ -26,9 +26,9 @@ async function terminateReplicator(storageFactory, connection, syncRules) {
|
|
|
26
26
|
source_db: connection,
|
|
27
27
|
lock
|
|
28
28
|
});
|
|
29
|
-
|
|
29
|
+
micro.logger.info(`Terminating replication slot ${stream.slot_name}`);
|
|
30
30
|
await stream.terminate();
|
|
31
|
-
|
|
31
|
+
micro.logger.info(`Terminated replication slot ${stream.slot_name}`);
|
|
32
32
|
}
|
|
33
33
|
finally {
|
|
34
34
|
await lock.release();
|
|
@@ -66,14 +66,29 @@ async function terminateReplicators(storageFactory, connection) {
|
|
|
66
66
|
export async function teardown(runnerConfig) {
|
|
67
67
|
const config = await utils.loadConfig(runnerConfig);
|
|
68
68
|
const mongoDB = storage.createPowerSyncMongo(config.storage);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
69
|
+
try {
|
|
70
|
+
micro.logger.info(`Waiting for auth`);
|
|
71
|
+
await db.mongo.waitForAuth(mongoDB.db);
|
|
72
|
+
const bucketStorage = new storage.MongoBucketStorage(mongoDB, { slot_name_prefix: config.slot_name_prefix });
|
|
73
|
+
const connection = config.connection;
|
|
74
|
+
micro.logger.info(`Terminating replication slots`);
|
|
75
|
+
if (connection) {
|
|
76
|
+
await terminateReplicators(bucketStorage, connection);
|
|
77
|
+
}
|
|
78
|
+
const database = mongoDB.db;
|
|
79
|
+
micro.logger.info(`Dropping database ${database.namespace}`);
|
|
80
|
+
await database.dropDatabase();
|
|
81
|
+
micro.logger.info(`Done`);
|
|
82
|
+
await mongoDB.client.close();
|
|
83
|
+
// If there was an error connecting to postgress, the process may stay open indefinitely.
|
|
84
|
+
// This forces an exit.
|
|
85
|
+
// We do not consider those errors a teardown failure.
|
|
86
|
+
process.exit(0);
|
|
87
|
+
}
|
|
88
|
+
catch (e) {
|
|
89
|
+
micro.logger.error(`Teardown failure`, e);
|
|
90
|
+
await mongoDB.client.close();
|
|
91
|
+
process.exit(1);
|
|
74
92
|
}
|
|
75
|
-
const database = mongoDB.db;
|
|
76
|
-
await database.dropDatabase();
|
|
77
|
-
await mongoDB.client.close();
|
|
78
93
|
}
|
|
79
94
|
//# sourceMappingURL=teardown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/runner/teardown.ts"],"names":[],"mappings":"AAAA,0DAA0D;AAC1D,gBAAgB;AAChB,2EAA2E;AAC3E,yBAAyB;AAEzB,OAAO,KAAK,KAAK,MAAM,6BAA6B,CAAC;AACrD,OAAO,KAAK,MAAM,MAAM,iBAAiB,CAAC;AAE1C,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,KAAK,OAAO,MAAM,6BAA6B,CAAC;AACvD,OAAO,KAAK,KAAK,MAAM,uBAAuB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,qCAAqC,CAAC;AAEnE;;;;GAIG;AACH,KAAK,UAAU,mBAAmB,CAChC,cAA4C,EAC5C,UAAoC,EACpC,SAA4C;IAE5C,mEAAmE;IACnE,sBAAsB;IACtB,MAAM,IAAI,GAAG,MAAM,SAAS,CAAC,IAAI,EAAE,CAAC;IACpC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,OAAO,GAAG,cAAc,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,eAAe,CAAC;YAC7C,OAAO,EAAE,cAAc;YACvB,OAAO,EAAE,OAAO;YAChB,SAAS,EAAE,UAAU;YACrB,IAAI;SACL,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"teardown.js","sourceRoot":"","sources":["../../src/runner/teardown.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public"
|
|
7
7
|
},
|
|
8
|
-
"version": "0.2.
|
|
8
|
+
"version": "0.2.2",
|
|
9
9
|
"main": "dist/index.js",
|
|
10
10
|
"license": "FSL-1.1-Apache-2.0",
|
|
11
11
|
"type": "module",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"ts-codec": "^1.2.2",
|
|
34
34
|
"uuid": "^9.0.1",
|
|
35
35
|
"yaml": "^2.3.2",
|
|
36
|
-
"@powersync/service-jpgwire": "0.17.
|
|
36
|
+
"@powersync/service-jpgwire": "0.17.13",
|
|
37
37
|
"@powersync/service-jsonbig": "0.17.10",
|
|
38
|
-
"@powersync/service-rsocket-router": "0.0.7",
|
|
39
38
|
"@powersync/service-sync-rules": "0.17.10",
|
|
39
|
+
"@powersync/service-rsocket-router": "0.0.7",
|
|
40
40
|
"@powersync/service-types": "0.1.0"
|
|
41
41
|
},
|
|
42
42
|
"devDependencies": {
|
package/src/runner/teardown.ts
CHANGED
|
@@ -33,9 +33,10 @@ async function terminateReplicator(
|
|
|
33
33
|
source_db: connection,
|
|
34
34
|
lock
|
|
35
35
|
});
|
|
36
|
-
|
|
36
|
+
|
|
37
|
+
micro.logger.info(`Terminating replication slot ${stream.slot_name}`);
|
|
37
38
|
await stream.terminate();
|
|
38
|
-
|
|
39
|
+
micro.logger.info(`Terminated replication slot ${stream.slot_name}`);
|
|
39
40
|
} finally {
|
|
40
41
|
await lock.release();
|
|
41
42
|
}
|
|
@@ -76,16 +77,32 @@ async function terminateReplicators(
|
|
|
76
77
|
export async function teardown(runnerConfig: utils.RunnerConfig) {
|
|
77
78
|
const config = await utils.loadConfig(runnerConfig);
|
|
78
79
|
const mongoDB = storage.createPowerSyncMongo(config.storage);
|
|
79
|
-
|
|
80
|
+
try {
|
|
81
|
+
micro.logger.info(`Waiting for auth`);
|
|
82
|
+
await db.mongo.waitForAuth(mongoDB.db);
|
|
80
83
|
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
const bucketStorage = new storage.MongoBucketStorage(mongoDB, { slot_name_prefix: config.slot_name_prefix });
|
|
85
|
+
const connection = config.connection;
|
|
83
86
|
|
|
84
|
-
|
|
85
|
-
await terminateReplicators(bucketStorage, connection);
|
|
86
|
-
}
|
|
87
|
+
micro.logger.info(`Terminating replication slots`);
|
|
87
88
|
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
89
|
+
if (connection) {
|
|
90
|
+
await terminateReplicators(bucketStorage, connection);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const database = mongoDB.db;
|
|
94
|
+
micro.logger.info(`Dropping database ${database.namespace}`);
|
|
95
|
+
await database.dropDatabase();
|
|
96
|
+
micro.logger.info(`Done`);
|
|
97
|
+
await mongoDB.client.close();
|
|
98
|
+
|
|
99
|
+
// If there was an error connecting to postgress, the process may stay open indefinitely.
|
|
100
|
+
// This forces an exit.
|
|
101
|
+
// We do not consider those errors a teardown failure.
|
|
102
|
+
process.exit(0);
|
|
103
|
+
} catch (e) {
|
|
104
|
+
micro.logger.error(`Teardown failure`, e);
|
|
105
|
+
await mongoDB.client.close();
|
|
106
|
+
process.exit(1);
|
|
107
|
+
}
|
|
91
108
|
}
|
package/test/src/pg_test.test.ts
CHANGED
|
@@ -86,6 +86,12 @@ VALUES(6, 'epoch'::timestamp, 'epoch'::timestamptz);
|
|
|
86
86
|
|
|
87
87
|
INSERT INTO test_data(id, timestamp, timestamptz)
|
|
88
88
|
VALUES(7, 'infinity'::timestamp, 'infinity'::timestamptz);
|
|
89
|
+
|
|
90
|
+
INSERT INTO test_data(id, timestamptz)
|
|
91
|
+
VALUES(8, '0022-02-03 12:13:14+03'::timestamptz);
|
|
92
|
+
|
|
93
|
+
INSERT INTO test_data(id, timestamptz)
|
|
94
|
+
VALUES(9, '10022-02-03 12:13:14+03'::timestamptz);
|
|
89
95
|
`);
|
|
90
96
|
}
|
|
91
97
|
|
|
@@ -186,6 +192,18 @@ VALUES(10, ARRAY['null']::TEXT[]);
|
|
|
186
192
|
timestamp: '9999-12-31 23:59:59',
|
|
187
193
|
timestamptz: '9999-12-31 23:59:59Z'
|
|
188
194
|
});
|
|
195
|
+
|
|
196
|
+
expect(transformed[7]).toMatchObject({
|
|
197
|
+
id: 8n,
|
|
198
|
+
timestamptz: '0022-02-03 09:13:14Z'
|
|
199
|
+
});
|
|
200
|
+
|
|
201
|
+
expect(transformed[8]).toMatchObject({
|
|
202
|
+
id: 9n,
|
|
203
|
+
// 10022-02-03 12:13:14+03 - out of range of both our date parsing logic, and sqlite's date functions
|
|
204
|
+
// We can consider just preserving the source string as an alternative if this causes issues.
|
|
205
|
+
timestamptz: null
|
|
206
|
+
});
|
|
189
207
|
}
|
|
190
208
|
|
|
191
209
|
function checkResultArrays(transformed: Record<string, any>[]) {
|