@powersync/service-module-postgres-storage 0.0.0-dev-20260313100403 → 0.0.0-dev-20260515144844

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.
Files changed (68) hide show
  1. package/CHANGELOG.md +100 -9
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/@types/storage/PostgresBucketStorageFactory.d.ts +2 -1
  4. package/dist/@types/storage/PostgresReportStorage.d.ts +4 -4
  5. package/dist/@types/storage/PostgresSyncRulesStorage.d.ts +4 -2
  6. package/dist/@types/storage/batch/PostgresBucketBatch.d.ts +1 -1
  7. package/dist/@types/types/models/SyncRules.d.ts +9 -0
  8. package/dist/@types/types/models/models-index.d.ts +1 -1
  9. package/dist/@types/utils/test-utils.d.ts +2 -2
  10. package/dist/@types/utils/utils-index.d.ts +1 -1
  11. package/dist/migrations/migration-utils.js +2 -2
  12. package/dist/migrations/migration-utils.js.map +1 -1
  13. package/dist/migrations/scripts/1684951997326-init.js +24 -100
  14. package/dist/migrations/scripts/1684951997326-init.js.map +1 -1
  15. package/dist/migrations/scripts/1749024804042-snapshot-progress.js +12 -88
  16. package/dist/migrations/scripts/1749024804042-snapshot-progress.js.map +1 -1
  17. package/dist/migrations/scripts/1756282360128-connection-reporting.js +12 -88
  18. package/dist/migrations/scripts/1756282360128-connection-reporting.js.map +1 -1
  19. package/dist/migrations/scripts/1771232439485-storage-version.js +14 -90
  20. package/dist/migrations/scripts/1771232439485-storage-version.js.map +1 -1
  21. package/dist/migrations/scripts/1771424826685-current-data-pending-deletes.js +1 -1
  22. package/dist/migrations/scripts/1771491856000-sync-plan.js +6 -82
  23. package/dist/migrations/scripts/1771491856000-sync-plan.js.map +1 -1
  24. package/dist/storage/PostgresBucketStorageFactory.js +6 -5
  25. package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
  26. package/dist/storage/PostgresReportStorage.js +10 -10
  27. package/dist/storage/PostgresReportStorage.js.map +1 -1
  28. package/dist/storage/PostgresSyncRulesStorage.js +76 -107
  29. package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
  30. package/dist/storage/batch/PostgresBucketBatch.js +5 -5
  31. package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
  32. package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js +1 -1
  33. package/dist/storage/checkpoints/PostgresWriteCheckpointAPI.js.map +1 -1
  34. package/dist/storage/current-data-store.js +1 -1
  35. package/dist/storage/current-data-store.js.map +1 -1
  36. package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js +3 -3
  37. package/dist/storage/sync-rules/PostgresPersistedSyncRulesContent.js.map +1 -1
  38. package/dist/types/models/SyncRules.js +3 -1
  39. package/dist/types/models/SyncRules.js.map +1 -1
  40. package/dist/types/models/models-index.js +1 -1
  41. package/dist/types/models/models-index.js.map +1 -1
  42. package/dist/utils/test-utils.js +36 -112
  43. package/dist/utils/test-utils.js.map +1 -1
  44. package/dist/utils/utils-index.js +1 -1
  45. package/dist/utils/utils-index.js.map +1 -1
  46. package/package.json +11 -12
  47. package/src/migrations/migration-utils.ts +2 -2
  48. package/src/migrations/scripts/1771424826685-current-data-pending-deletes.ts +1 -1
  49. package/src/storage/PostgresBucketStorageFactory.ts +7 -5
  50. package/src/storage/PostgresReportStorage.ts +12 -12
  51. package/src/storage/PostgresSyncRulesStorage.ts +81 -39
  52. package/src/storage/batch/PostgresBucketBatch.ts +5 -5
  53. package/src/storage/checkpoints/PostgresWriteCheckpointAPI.ts +3 -1
  54. package/src/storage/current-data-store.ts +1 -1
  55. package/src/storage/sync-rules/PostgresPersistedSyncRulesContent.ts +3 -6
  56. package/src/types/models/SyncRules.ts +3 -1
  57. package/src/types/models/models-index.ts +1 -1
  58. package/src/utils/test-utils.ts +3 -3
  59. package/src/utils/utils-index.ts +1 -1
  60. package/test/src/__snapshots__/{client-connections-storage.test.ts.snap → connection-report-storage.test.ts.snap} +22 -22
  61. package/test/src/__snapshots__/storage_sync.test.ts.snap +282 -0
  62. package/test/src/{client-connections-storage.test.ts → connection-report-storage.test.ts} +5 -5
  63. package/test/src/setup.ts +1 -1
  64. package/test/tsconfig.json +0 -1
  65. package/dist/@types/storage/current-data-table.d.ts +0 -9
  66. package/dist/storage/current-data-table.js +0 -22
  67. package/dist/storage/current-data-table.js.map +0 -1
  68. package/src/storage/current-data-table.ts +0 -26
@@ -1,5 +1,99 @@
1
1
  // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
2
 
3
+ exports[`sync - postgres > storage v1 > can override priority when subscribing to stream 1`] = `
4
+ [
5
+ {
6
+ "checkpoint": {
7
+ "buckets": [
8
+ {
9
+ "bucket": "1#todos|0["a"]",
10
+ "checksum": -1712802421,
11
+ "count": 1,
12
+ "priority": 0,
13
+ "subscriptions": [
14
+ {
15
+ "sub": 0,
16
+ },
17
+ {
18
+ "sub": 1,
19
+ },
20
+ ],
21
+ },
22
+ {
23
+ "bucket": "1#todos|0["b"]",
24
+ "checksum": -1291414318,
25
+ "count": 1,
26
+ "priority": 3,
27
+ "subscriptions": [
28
+ {
29
+ "sub": 1,
30
+ },
31
+ ],
32
+ },
33
+ ],
34
+ "last_op_id": "2",
35
+ "streams": [
36
+ {
37
+ "errors": [],
38
+ "is_default": false,
39
+ "name": "todos",
40
+ },
41
+ ],
42
+ "write_checkpoint": undefined,
43
+ },
44
+ },
45
+ {
46
+ "data": {
47
+ "after": "0",
48
+ "bucket": "1#todos|0["a"]",
49
+ "data": [
50
+ {
51
+ "checksum": 2582164875,
52
+ "data": "{"id":"a","description":"Test 1"}",
53
+ "object_id": "a",
54
+ "object_type": "test",
55
+ "op": "PUT",
56
+ "op_id": "1",
57
+ "subkey": "02d285ac-4f96-5124-8fba-c6d1df992dd1",
58
+ },
59
+ ],
60
+ "has_more": false,
61
+ "next_after": "1",
62
+ },
63
+ },
64
+ {
65
+ "partial_checkpoint_complete": {
66
+ "last_op_id": "2",
67
+ "priority": 0,
68
+ },
69
+ },
70
+ {
71
+ "data": {
72
+ "after": "0",
73
+ "bucket": "1#todos|0["b"]",
74
+ "data": [
75
+ {
76
+ "checksum": 3003552978,
77
+ "data": "{"id":"b","description":"Test 2"}",
78
+ "object_id": "b",
79
+ "object_type": "test",
80
+ "op": "PUT",
81
+ "op_id": "2",
82
+ "subkey": "243b0e26-87b2-578a-993c-5ac5b6f7fd64",
83
+ },
84
+ ],
85
+ "has_more": false,
86
+ "next_after": "2",
87
+ },
88
+ },
89
+ {
90
+ "checkpoint_complete": {
91
+ "last_op_id": "2",
92
+ },
93
+ },
94
+ ]
95
+ `;
96
+
3
97
  exports[`sync - postgres > storage v1 > compacting data - invalidate checkpoint 1`] = `
4
98
  [
5
99
  {
@@ -1095,6 +1189,100 @@ exports[`sync - postgres > storage v1 > sync updates to parameter query only 2`]
1095
1189
  ]
1096
1190
  `;
1097
1191
 
1192
+ exports[`sync - postgres > storage v2 > can override priority when subscribing to stream 1`] = `
1193
+ [
1194
+ {
1195
+ "checkpoint": {
1196
+ "buckets": [
1197
+ {
1198
+ "bucket": "1#todos|0["a"]",
1199
+ "checksum": -1712802421,
1200
+ "count": 1,
1201
+ "priority": 0,
1202
+ "subscriptions": [
1203
+ {
1204
+ "sub": 0,
1205
+ },
1206
+ {
1207
+ "sub": 1,
1208
+ },
1209
+ ],
1210
+ },
1211
+ {
1212
+ "bucket": "1#todos|0["b"]",
1213
+ "checksum": -1291414318,
1214
+ "count": 1,
1215
+ "priority": 3,
1216
+ "subscriptions": [
1217
+ {
1218
+ "sub": 1,
1219
+ },
1220
+ ],
1221
+ },
1222
+ ],
1223
+ "last_op_id": "2",
1224
+ "streams": [
1225
+ {
1226
+ "errors": [],
1227
+ "is_default": false,
1228
+ "name": "todos",
1229
+ },
1230
+ ],
1231
+ "write_checkpoint": undefined,
1232
+ },
1233
+ },
1234
+ {
1235
+ "data": {
1236
+ "after": "0",
1237
+ "bucket": "1#todos|0["a"]",
1238
+ "data": [
1239
+ {
1240
+ "checksum": 2582164875,
1241
+ "data": "{"id":"a","description":"Test 1"}",
1242
+ "object_id": "a",
1243
+ "object_type": "test",
1244
+ "op": "PUT",
1245
+ "op_id": "1",
1246
+ "subkey": "02d285ac-4f96-5124-8fba-c6d1df992dd1",
1247
+ },
1248
+ ],
1249
+ "has_more": false,
1250
+ "next_after": "1",
1251
+ },
1252
+ },
1253
+ {
1254
+ "partial_checkpoint_complete": {
1255
+ "last_op_id": "2",
1256
+ "priority": 0,
1257
+ },
1258
+ },
1259
+ {
1260
+ "data": {
1261
+ "after": "0",
1262
+ "bucket": "1#todos|0["b"]",
1263
+ "data": [
1264
+ {
1265
+ "checksum": 3003552978,
1266
+ "data": "{"id":"b","description":"Test 2"}",
1267
+ "object_id": "b",
1268
+ "object_type": "test",
1269
+ "op": "PUT",
1270
+ "op_id": "2",
1271
+ "subkey": "243b0e26-87b2-578a-993c-5ac5b6f7fd64",
1272
+ },
1273
+ ],
1274
+ "has_more": false,
1275
+ "next_after": "2",
1276
+ },
1277
+ },
1278
+ {
1279
+ "checkpoint_complete": {
1280
+ "last_op_id": "2",
1281
+ },
1282
+ },
1283
+ ]
1284
+ `;
1285
+
1098
1286
  exports[`sync - postgres > storage v2 > compacting data - invalidate checkpoint 1`] = `
1099
1287
  [
1100
1288
  {
@@ -2190,6 +2378,100 @@ exports[`sync - postgres > storage v2 > sync updates to parameter query only 2`]
2190
2378
  ]
2191
2379
  `;
2192
2380
 
2381
+ exports[`sync - postgres > storage v3 > can override priority when subscribing to stream 1`] = `
2382
+ [
2383
+ {
2384
+ "checkpoint": {
2385
+ "buckets": [
2386
+ {
2387
+ "bucket": "1#todos|0["a"]",
2388
+ "checksum": -1712802421,
2389
+ "count": 1,
2390
+ "priority": 0,
2391
+ "subscriptions": [
2392
+ {
2393
+ "sub": 0,
2394
+ },
2395
+ {
2396
+ "sub": 1,
2397
+ },
2398
+ ],
2399
+ },
2400
+ {
2401
+ "bucket": "1#todos|0["b"]",
2402
+ "checksum": -1291414318,
2403
+ "count": 1,
2404
+ "priority": 3,
2405
+ "subscriptions": [
2406
+ {
2407
+ "sub": 1,
2408
+ },
2409
+ ],
2410
+ },
2411
+ ],
2412
+ "last_op_id": "2",
2413
+ "streams": [
2414
+ {
2415
+ "errors": [],
2416
+ "is_default": false,
2417
+ "name": "todos",
2418
+ },
2419
+ ],
2420
+ "write_checkpoint": undefined,
2421
+ },
2422
+ },
2423
+ {
2424
+ "data": {
2425
+ "after": "0",
2426
+ "bucket": "1#todos|0["a"]",
2427
+ "data": [
2428
+ {
2429
+ "checksum": 2582164875,
2430
+ "data": "{"id":"a","description":"Test 1"}",
2431
+ "object_id": "a",
2432
+ "object_type": "test",
2433
+ "op": "PUT",
2434
+ "op_id": "1",
2435
+ "subkey": "02d285ac-4f96-5124-8fba-c6d1df992dd1",
2436
+ },
2437
+ ],
2438
+ "has_more": false,
2439
+ "next_after": "1",
2440
+ },
2441
+ },
2442
+ {
2443
+ "partial_checkpoint_complete": {
2444
+ "last_op_id": "2",
2445
+ "priority": 0,
2446
+ },
2447
+ },
2448
+ {
2449
+ "data": {
2450
+ "after": "0",
2451
+ "bucket": "1#todos|0["b"]",
2452
+ "data": [
2453
+ {
2454
+ "checksum": 3003552978,
2455
+ "data": "{"id":"b","description":"Test 2"}",
2456
+ "object_id": "b",
2457
+ "object_type": "test",
2458
+ "op": "PUT",
2459
+ "op_id": "2",
2460
+ "subkey": "243b0e26-87b2-578a-993c-5ac5b6f7fd64",
2461
+ },
2462
+ ],
2463
+ "has_more": false,
2464
+ "next_after": "2",
2465
+ },
2466
+ },
2467
+ {
2468
+ "checkpoint_complete": {
2469
+ "last_op_id": "2",
2470
+ },
2471
+ },
2472
+ ]
2473
+ `;
2474
+
2193
2475
  exports[`sync - postgres > storage v3 > compacting data - invalidate checkpoint 1`] = `
2194
2476
  [
2195
2477
  {
@@ -1,9 +1,9 @@
1
- import { afterAll, beforeAll, describe, expect, it } from 'vitest';
2
- import { POSTGRES_REPORT_STORAGE_FACTORY } from './util.js';
3
- import { event_types } from '@powersync/service-types';
4
1
  import { register, ReportUserData } from '@powersync/service-core-tests';
5
- import { PostgresReportStorage } from '../../src/storage/PostgresReportStorage.js';
6
2
  import { DateTimeValue } from '@powersync/service-sync-rules';
3
+ import { event_types } from '@powersync/service-types';
4
+ import { afterAll, beforeAll, describe, expect, it } from 'vitest';
5
+ import { PostgresReportStorage } from '../../src/storage/PostgresReportStorage.js';
6
+ import { POSTGRES_REPORT_STORAGE_FACTORY } from './util.js';
7
7
 
8
8
  const factory = await POSTGRES_REPORT_STORAGE_FACTORY();
9
9
  const userData = register.REPORT_TEST_USERS;
@@ -223,7 +223,7 @@ describe('Connection report storage', async () => {
223
223
  await factory.deleteOldConnectionData({
224
224
  date: dates.weekAgo
225
225
  });
226
- const sdk = await factory.getClientConnectionsSummary({
226
+ const sdk = await factory.getClientConnectionReports({
227
227
  start: dates.monthAgo,
228
228
  end: dates.now
229
229
  });
package/test/src/setup.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  import { container } from '@powersync/lib-services-framework';
2
- import { beforeAll } from 'vitest';
3
2
  import { METRICS_HELPER } from '@powersync/service-core-tests';
3
+ import { beforeAll } from 'vitest';
4
4
 
5
5
  beforeAll(async () => {
6
6
  // Executes for every test file
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "extends": "../../../tsconfig.tests.json",
3
3
  "compilerOptions": {
4
- "baseUrl": "./",
5
4
  "declarationDir": "dist/@types",
6
5
  "tsBuildInfoFile": "dist/.tsbuildinfo",
7
6
  "lib": ["ES2022", "esnext.disposable"],
@@ -1,9 +0,0 @@
1
- import { storage } from '@powersync/service-core';
2
- export declare const V1_CURRENT_DATA_TABLE = "current_data";
3
- export declare const V3_CURRENT_DATA_TABLE = "v3_current_data";
4
- /**
5
- * The table used by a specific storage version for general current_data access.
6
- */
7
- export declare function getCommonCurrentDataTable(storageConfig: storage.StorageVersionConfig): "current_data" | "v3_current_data";
8
- export declare function getV1CurrentDataTable(storageConfig: storage.StorageVersionConfig): string;
9
- export declare function getV3CurrentDataTable(storageConfig: storage.StorageVersionConfig): string;
@@ -1,22 +0,0 @@
1
- import { ServiceAssertionError } from '@powersync/lib-services-framework';
2
- export const V1_CURRENT_DATA_TABLE = 'current_data';
3
- export const V3_CURRENT_DATA_TABLE = 'v3_current_data';
4
- /**
5
- * The table used by a specific storage version for general current_data access.
6
- */
7
- export function getCommonCurrentDataTable(storageConfig) {
8
- return storageConfig.softDeleteCurrentData ? V3_CURRENT_DATA_TABLE : V1_CURRENT_DATA_TABLE;
9
- }
10
- export function getV1CurrentDataTable(storageConfig) {
11
- if (storageConfig.softDeleteCurrentData) {
12
- throw new ServiceAssertionError('current_data table cannot be used when softDeleteCurrentData is enabled');
13
- }
14
- return V1_CURRENT_DATA_TABLE;
15
- }
16
- export function getV3CurrentDataTable(storageConfig) {
17
- if (!storageConfig.softDeleteCurrentData) {
18
- throw new ServiceAssertionError('v3_current_data table cannot be used when softDeleteCurrentData is disabled');
19
- }
20
- return V3_CURRENT_DATA_TABLE;
21
- }
22
- //# sourceMappingURL=current-data-table.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"current-data-table.js","sourceRoot":"","sources":["../../src/storage/current-data-table.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,mCAAmC,CAAC;AAG1E,MAAM,CAAC,MAAM,qBAAqB,GAAG,cAAc,CAAC;AACpD,MAAM,CAAC,MAAM,qBAAqB,GAAG,iBAAiB,CAAC;AAEvD;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,aAA2C;IACnF,OAAO,aAAa,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,qBAAqB,CAAC;AAC7F,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAA2C;IAC/E,IAAI,aAAa,CAAC,qBAAqB,EAAE,CAAC;QACxC,MAAM,IAAI,qBAAqB,CAAC,yEAAyE,CAAC,CAAC;IAC7G,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,qBAAqB,CAAC,aAA2C;IAC/E,IAAI,CAAC,aAAa,CAAC,qBAAqB,EAAE,CAAC;QACzC,MAAM,IAAI,qBAAqB,CAAC,6EAA6E,CAAC,CAAC;IACjH,CAAC;IACD,OAAO,qBAAqB,CAAC;AAC/B,CAAC"}
@@ -1,26 +0,0 @@
1
- import { ServiceAssertionError } from '@powersync/lib-services-framework';
2
- import { storage } from '@powersync/service-core';
3
-
4
- export const V1_CURRENT_DATA_TABLE = 'current_data';
5
- export const V3_CURRENT_DATA_TABLE = 'v3_current_data';
6
-
7
- /**
8
- * The table used by a specific storage version for general current_data access.
9
- */
10
- export function getCommonCurrentDataTable(storageConfig: storage.StorageVersionConfig) {
11
- return storageConfig.softDeleteCurrentData ? V3_CURRENT_DATA_TABLE : V1_CURRENT_DATA_TABLE;
12
- }
13
-
14
- export function getV1CurrentDataTable(storageConfig: storage.StorageVersionConfig) {
15
- if (storageConfig.softDeleteCurrentData) {
16
- throw new ServiceAssertionError('current_data table cannot be used when softDeleteCurrentData is enabled');
17
- }
18
- return V1_CURRENT_DATA_TABLE;
19
- }
20
-
21
- export function getV3CurrentDataTable(storageConfig: storage.StorageVersionConfig) {
22
- if (!storageConfig.softDeleteCurrentData) {
23
- throw new ServiceAssertionError('v3_current_data table cannot be used when softDeleteCurrentData is disabled');
24
- }
25
- return V3_CURRENT_DATA_TABLE;
26
- }