@powersync/service-module-postgres-storage 0.13.3 → 0.13.4

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 (43) hide show
  1. package/CHANGELOG.md +20 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/@types/storage/PostgresBucketStorageFactory.d.ts +2 -1
  4. package/dist/@types/storage/PostgresReportStorage.d.ts +1 -1
  5. package/dist/@types/storage/PostgresSyncRulesStorage.d.ts +1 -0
  6. package/dist/@types/types/models/SyncRules.d.ts +9 -0
  7. package/dist/@types/types/models/models-index.d.ts +1 -1
  8. package/dist/@types/utils/test-utils.d.ts +2 -2
  9. package/dist/@types/utils/utils-index.d.ts +1 -1
  10. package/dist/migrations/migration-utils.js +2 -2
  11. package/dist/migrations/migration-utils.js.map +1 -1
  12. package/dist/storage/PostgresBucketStorageFactory.js +1 -0
  13. package/dist/storage/PostgresBucketStorageFactory.js.map +1 -1
  14. package/dist/storage/PostgresReportStorage.js +3 -3
  15. package/dist/storage/PostgresReportStorage.js.map +1 -1
  16. package/dist/storage/PostgresSyncRulesStorage.js +2 -1
  17. package/dist/storage/PostgresSyncRulesStorage.js.map +1 -1
  18. package/dist/storage/batch/PostgresBucketBatch.js +3 -3
  19. package/dist/storage/batch/PostgresBucketBatch.js.map +1 -1
  20. package/dist/storage/current-data-store.js +1 -1
  21. package/dist/storage/current-data-store.js.map +1 -1
  22. package/dist/types/models/SyncRules.js +3 -1
  23. package/dist/types/models/SyncRules.js.map +1 -1
  24. package/dist/types/models/models-index.js +1 -1
  25. package/dist/types/models/models-index.js.map +1 -1
  26. package/dist/utils/test-utils.js +3 -3
  27. package/dist/utils/test-utils.js.map +1 -1
  28. package/dist/utils/utils-index.js +1 -1
  29. package/dist/utils/utils-index.js.map +1 -1
  30. package/package.json +8 -8
  31. package/src/migrations/migration-utils.ts +2 -2
  32. package/src/storage/PostgresBucketStorageFactory.ts +1 -0
  33. package/src/storage/PostgresReportStorage.ts +5 -5
  34. package/src/storage/PostgresSyncRulesStorage.ts +3 -1
  35. package/src/storage/batch/PostgresBucketBatch.ts +3 -3
  36. package/src/storage/current-data-store.ts +1 -1
  37. package/src/types/models/SyncRules.ts +3 -1
  38. package/src/types/models/models-index.ts +1 -1
  39. package/src/utils/test-utils.ts +3 -3
  40. package/src/utils/utils-index.ts +1 -1
  41. package/test/src/__snapshots__/storage_sync.test.ts.snap +282 -0
  42. package/test/src/connection-report-storage.test.ts +4 -4
  43. package/test/src/setup.ts +1 -1
package/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@powersync/service-module-postgres-storage",
3
3
  "repository": "https://github.com/powersync-ja/powersync-service",
4
4
  "types": "dist/@types/index.d.ts",
5
- "version": "0.13.3",
5
+ "version": "0.13.4",
6
6
  "main": "dist/index.js",
7
7
  "license": "FSL-1.1-ALv2",
8
8
  "type": "module",
@@ -28,17 +28,17 @@
28
28
  "lru-cache": "^10.2.2",
29
29
  "ts-codec": "^1.3.0",
30
30
  "uuid": "^11.1.0",
31
- "@powersync/lib-service-postgres": "0.4.25",
32
- "@powersync/lib-services-framework": "0.9.2",
33
- "@powersync/service-core": "1.20.4",
34
- "@powersync/service-types": "0.15.0",
35
- "@powersync/service-jpgwire": "0.21.16",
31
+ "@powersync/lib-service-postgres": "0.4.26",
32
+ "@powersync/lib-services-framework": "0.9.3",
33
+ "@powersync/service-core": "1.20.5",
34
+ "@powersync/service-types": "0.15.1",
35
+ "@powersync/service-jpgwire": "0.21.17",
36
36
  "@powersync/service-jsonbig": "0.17.12",
37
- "@powersync/service-sync-rules": "0.34.1"
37
+ "@powersync/service-sync-rules": "0.35.0"
38
38
  },
39
39
  "devDependencies": {
40
40
  "typescript": "~5.9.3",
41
- "@powersync/service-core-tests": "0.15.3"
41
+ "@powersync/service-core-tests": "0.15.4"
42
42
  },
43
43
  "scripts": {
44
44
  "build": "tsc -b",
@@ -1,9 +1,9 @@
1
1
  import * as lib_postgres from '@powersync/lib-service-postgres';
2
+ import { ServiceAssertionError } from '@powersync/lib-services-framework';
2
3
  import { configFile } from '@powersync/service-types';
3
4
  import { isPostgresStorageConfig, normalizePostgresStorageConfig, PostgresStorageConfig } from '../types/types.js';
4
- import { STORAGE_SCHEMA_NAME } from '../utils/db.js';
5
- import { ServiceAssertionError } from '@powersync/lib-services-framework';
6
5
  import { getStorageApplicationName } from '../utils/application-name.js';
6
+ import { STORAGE_SCHEMA_NAME } from '../utils/db.js';
7
7
 
8
8
  export const openMigrationDB = (config: configFile.BaseStorageConfig) => {
9
9
  if (!isPostgresStorageConfig(config)) {
@@ -18,6 +18,7 @@ export type PostgresBucketStorageOptions = {
18
18
  };
19
19
 
20
20
  export class PostgresBucketStorageFactory extends storage.BucketStorageFactory {
21
+ [framework.DO_NOT_LOG] = true;
21
22
  readonly db: lib_postgres.DatabaseClient;
22
23
  public readonly slot_name_prefix: string;
23
24
 
@@ -1,15 +1,15 @@
1
+ import * as lib_postgres from '@powersync/lib-service-postgres';
2
+ import { logger } from '@powersync/lib-services-framework';
1
3
  import { storage } from '@powersync/service-core';
2
4
  import * as pg_wire from '@powersync/service-jpgwire';
3
5
  import { event_types } from '@powersync/service-types';
6
+ import { ClientConnectionResponse } from '@powersync/service-types/dist/reports.js';
7
+ import { toInteger } from 'ix/util/tointeger.js';
4
8
  import { v4 } from 'uuid';
5
- import * as lib_postgres from '@powersync/lib-service-postgres';
6
- import { NormalizedPostgresStorageConfig } from '../types/types.js';
7
9
  import { SdkReporting, SdkReportingDecoded } from '../types/models/SdkReporting.js';
8
- import { toInteger } from 'ix/util/tointeger.js';
9
- import { logger } from '@powersync/lib-services-framework';
10
+ import { NormalizedPostgresStorageConfig } from '../types/types.js';
10
11
  import { getStorageApplicationName } from '../utils/application-name.js';
11
12
  import { STORAGE_SCHEMA_NAME } from '../utils/db.js';
12
- import { ClientConnectionResponse } from '@powersync/service-types/dist/reports.js';
13
13
 
14
14
  export type PostgresReportStorageOptions = {
15
15
  config: NormalizedPostgresStorageConfig;
@@ -34,9 +34,9 @@ import { SourceTableDecoded, StoredRelationId } from '../types/models/SourceTabl
34
34
  import { pick } from '../utils/ts-codec.js';
35
35
  import { PostgresBucketBatch } from './batch/PostgresBucketBatch.js';
36
36
  import { PostgresWriteCheckpointAPI } from './checkpoints/PostgresWriteCheckpointAPI.js';
37
+ import { PostgresCurrentDataStore } from './current-data-store.js';
37
38
  import { PostgresBucketStorageFactory } from './PostgresBucketStorageFactory.js';
38
39
  import { PostgresCompactor } from './PostgresCompactor.js';
39
- import { PostgresCurrentDataStore } from './current-data-store.js';
40
40
 
41
41
  export type PostgresSyncRulesStorageOptions = {
42
42
  factory: PostgresBucketStorageFactory;
@@ -50,6 +50,8 @@ export class PostgresSyncRulesStorage
50
50
  extends framework.BaseObserver<storage.SyncRulesBucketStorageListener>
51
51
  implements storage.SyncRulesBucketStorage
52
52
  {
53
+ [framework.DO_NOT_LOG] = true;
54
+
53
55
  public readonly group_id: number;
54
56
  public readonly sync_rules: storage.PersistedSyncRulesContent;
55
57
  public readonly slot_name: string;
@@ -20,16 +20,16 @@ import {
20
20
  import * as sync_rules from '@powersync/service-sync-rules';
21
21
  import * as timers from 'timers/promises';
22
22
  import * as t from 'ts-codec';
23
+ import { bigint } from '../../types/codecs.js';
23
24
  import { CurrentBucket, V3CurrentDataDecoded } from '../../types/models/CurrentData.js';
24
25
  import { models, RequiredOperationBatchLimits } from '../../types/types.js';
25
26
  import { NOTIFICATION_CHANNEL } from '../../utils/db.js';
26
27
  import { pick } from '../../utils/ts-codec.js';
27
28
  import { batchCreateCustomWriteCheckpoints } from '../checkpoints/PostgresWriteCheckpointAPI.js';
28
- import { cacheKey, encodedCacheKey, OperationBatch, RecordOperation } from './OperationBatch.js';
29
- import { PostgresPersistedBatch } from './PostgresPersistedBatch.js';
30
- import { bigint } from '../../types/codecs.js';
31
29
  import { PostgresCurrentDataStore } from '../current-data-store.js';
32
30
  import { postgresTableId } from '../table-id.js';
31
+ import { cacheKey, encodedCacheKey, OperationBatch, RecordOperation } from './OperationBatch.js';
32
+ import { PostgresPersistedBatch } from './PostgresPersistedBatch.js';
33
33
 
34
34
  export interface PostgresBucketBatchOptions {
35
35
  logger: Logger;
@@ -1,8 +1,8 @@
1
1
  import * as lib_postgres from '@powersync/lib-service-postgres';
2
2
  import { storage } from '@powersync/service-core';
3
3
  import * as t from 'ts-codec';
4
- import { pick } from '../utils/ts-codec.js';
5
4
  import * as models from '../types/models/CurrentData.js';
5
+ import { pick } from '../utils/ts-codec.js';
6
6
 
7
7
  type Queryable = Pick<lib_postgres.DatabaseClient, 'sql' | 'streamRows'>;
8
8
 
@@ -1,4 +1,5 @@
1
1
  import { framework, storage } from '@powersync/service-core';
2
+ import { ReplicationError } from '@powersync/service-types';
2
3
  import * as t from 'ts-codec';
3
4
  import { bigint, pgwire_number } from '../codecs.js';
4
5
  import { jsonContainerObject } from './json.js';
@@ -59,7 +60,8 @@ export const SyncRules = t.object({
59
60
  overrides: t.record(t.boolean),
60
61
  maxTimeValuePrecision: t.number.optional()
61
62
  }),
62
- eventDescriptors: t.record(t.array(t.string))
63
+ eventDescriptors: t.record(t.array(t.string)),
64
+ errors: t.array(ReplicationError).optional()
63
65
  })
64
66
  )
65
67
  )
@@ -5,7 +5,7 @@ export * from './BucketParameters.js';
5
5
  export * from './CurrentData.js';
6
6
  export * from './Instance.js';
7
7
  export * from './Migration.js';
8
+ export * from './SdkReporting.js';
8
9
  export * from './SourceTable.js';
9
10
  export * from './SyncRules.js';
10
11
  export * from './WriteCheckpoint.js';
11
- export * from './SdkReporting.js';
@@ -1,9 +1,9 @@
1
+ import { createLogger, logger as defaultLogger, transports } from '@powersync/lib-services-framework';
1
2
  import { framework, PowerSyncMigrationManager, ServiceContext, TestStorageOptions } from '@powersync/service-core';
2
3
  import { PostgresMigrationAgent } from '../migrations/PostgresMigrationAgent.js';
3
- import { normalizePostgresStorageConfig, PostgresStorageConfigDecoded } from '../types/types.js';
4
- import { PostgresReportStorage } from '../storage/PostgresReportStorage.js';
5
4
  import { PostgresBucketStorageFactory } from '../storage/PostgresBucketStorageFactory.js';
6
- import { logger as defaultLogger, createLogger, transports } from '@powersync/lib-services-framework';
5
+ import { PostgresReportStorage } from '../storage/PostgresReportStorage.js';
6
+ import { normalizePostgresStorageConfig, PostgresStorageConfigDecoded } from '../types/types.js';
7
7
  import { truncateTables } from './db.js';
8
8
 
9
9
  export type PostgresTestStorageOptions = {
@@ -1,5 +1,5 @@
1
1
  export * from './bson.js';
2
2
  export * from './bucket-data.js';
3
3
  export * from './db.js';
4
- export * from './ts-codec.js';
5
4
  export * as test_utils from './test-utils.js';
5
+ export * from './ts-codec.js';
@@ -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;
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