@powersync/service-core 0.0.0-dev-20240709124106 → 0.0.0-dev-20240725112650

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 (85) hide show
  1. package/CHANGELOG.md +39 -2
  2. package/dist/entry/cli-entry.js +2 -1
  3. package/dist/entry/cli-entry.js.map +1 -1
  4. package/dist/entry/commands/compact-action.d.ts +2 -0
  5. package/dist/entry/commands/compact-action.js +48 -0
  6. package/dist/entry/commands/compact-action.js.map +1 -0
  7. package/dist/entry/entry-index.d.ts +1 -0
  8. package/dist/entry/entry-index.js +1 -0
  9. package/dist/entry/entry-index.js.map +1 -1
  10. package/dist/routes/configure-fastify.d.ts +883 -0
  11. package/dist/routes/configure-fastify.js +58 -0
  12. package/dist/routes/configure-fastify.js.map +1 -0
  13. package/dist/routes/configure-rsocket.d.ts +13 -0
  14. package/dist/routes/configure-rsocket.js +46 -0
  15. package/dist/routes/configure-rsocket.js.map +1 -0
  16. package/dist/routes/endpoints/socket-route.js +10 -9
  17. package/dist/routes/endpoints/socket-route.js.map +1 -1
  18. package/dist/routes/endpoints/sync-stream.js +9 -1
  19. package/dist/routes/endpoints/sync-stream.js.map +1 -1
  20. package/dist/routes/route-register.d.ts +1 -1
  21. package/dist/routes/route-register.js +2 -1
  22. package/dist/routes/route-register.js.map +1 -1
  23. package/dist/routes/router-socket.d.ts +4 -4
  24. package/dist/routes/router-socket.js.map +1 -1
  25. package/dist/routes/router.d.ts +1 -0
  26. package/dist/routes/router.js.map +1 -1
  27. package/dist/routes/routes-index.d.ts +2 -0
  28. package/dist/routes/routes-index.js +2 -0
  29. package/dist/routes/routes-index.js.map +1 -1
  30. package/dist/storage/BucketStorage.d.ts +31 -1
  31. package/dist/storage/BucketStorage.js.map +1 -1
  32. package/dist/storage/mongo/MongoCompactor.d.ts +40 -0
  33. package/dist/storage/mongo/MongoCompactor.js +292 -0
  34. package/dist/storage/mongo/MongoCompactor.js.map +1 -0
  35. package/dist/storage/mongo/MongoSyncBucketStorage.d.ts +3 -2
  36. package/dist/storage/mongo/MongoSyncBucketStorage.js +19 -13
  37. package/dist/storage/mongo/MongoSyncBucketStorage.js.map +1 -1
  38. package/dist/storage/mongo/models.d.ts +5 -4
  39. package/dist/storage/mongo/models.js.map +1 -1
  40. package/dist/storage/mongo/util.d.ts +3 -0
  41. package/dist/storage/mongo/util.js +22 -0
  42. package/dist/storage/mongo/util.js.map +1 -1
  43. package/dist/sync/RequestTracker.d.ts +9 -0
  44. package/dist/sync/RequestTracker.js +19 -0
  45. package/dist/sync/RequestTracker.js.map +1 -0
  46. package/dist/sync/sync-index.d.ts +1 -0
  47. package/dist/sync/sync-index.js +1 -0
  48. package/dist/sync/sync-index.js.map +1 -1
  49. package/dist/sync/sync.d.ts +2 -0
  50. package/dist/sync/sync.js +51 -18
  51. package/dist/sync/sync.js.map +1 -1
  52. package/dist/sync/util.d.ts +2 -1
  53. package/dist/sync/util.js +2 -3
  54. package/dist/sync/util.js.map +1 -1
  55. package/package.json +6 -6
  56. package/src/entry/cli-entry.ts +2 -1
  57. package/src/entry/commands/compact-action.ts +54 -0
  58. package/src/entry/entry-index.ts +1 -0
  59. package/src/routes/configure-fastify.ts +102 -0
  60. package/src/routes/configure-rsocket.ts +59 -0
  61. package/src/routes/endpoints/socket-route.ts +10 -9
  62. package/src/routes/endpoints/sync-stream.ts +10 -1
  63. package/src/routes/route-register.ts +3 -2
  64. package/src/routes/router-socket.ts +5 -5
  65. package/src/routes/router.ts +2 -0
  66. package/src/routes/routes-index.ts +2 -0
  67. package/src/storage/BucketStorage.ts +36 -1
  68. package/src/storage/mongo/MongoCompactor.ts +371 -0
  69. package/src/storage/mongo/MongoSyncBucketStorage.ts +25 -14
  70. package/src/storage/mongo/models.ts +5 -4
  71. package/src/storage/mongo/util.ts +25 -0
  72. package/src/sync/RequestTracker.ts +21 -0
  73. package/src/sync/sync-index.ts +1 -0
  74. package/src/sync/sync.ts +61 -17
  75. package/src/sync/util.ts +6 -2
  76. package/test/src/__snapshots__/sync.test.ts.snap +85 -0
  77. package/test/src/bucket_validation.test.ts +142 -0
  78. package/test/src/bucket_validation.ts +116 -0
  79. package/test/src/compacting.test.ts +207 -0
  80. package/test/src/data_storage.test.ts +19 -60
  81. package/test/src/slow_tests.test.ts +144 -102
  82. package/test/src/sync.test.ts +176 -28
  83. package/test/src/util.ts +65 -1
  84. package/test/src/wal_stream_utils.ts +13 -4
  85. package/tsconfig.tsbuildinfo +1 -1
package/CHANGELOG.md CHANGED
@@ -1,6 +1,43 @@
1
1
  # @powersync/service-core
2
2
 
3
- ## 0.0.0-dev-20240709124106
3
+ ## 0.0.0-dev-20240725112650
4
+
5
+ ### Minor Changes
6
+
7
+ - 2fee597: Added utility functions for registering routes
8
+
9
+ ## 0.5.1
10
+
11
+ ### Patch Changes
12
+
13
+ - bfe0e64: Fix compact command to use the correct database
14
+
15
+ ## 0.5.0
16
+
17
+ ### Minor Changes
18
+
19
+ - 1c1a3bf: Implement a compact command
20
+
21
+ ## 0.4.2
22
+
23
+ ### Patch Changes
24
+
25
+ - bdbf95c: Log user_id and sync stats for each connection
26
+ - Updated dependencies [876f4a0]
27
+ - Updated dependencies [9bff878]
28
+ - @powersync/service-sync-rules@0.18.1
29
+ - @powersync/service-rsocket-router@0.0.10
30
+
31
+ ## 0.4.1
32
+
33
+ ### Patch Changes
34
+
35
+ - 1066f86: Fixed missing route error logs
36
+ - Updated dependencies [909f71a]
37
+ - @powersync/service-rsocket-router@0.0.9
38
+ - @powersync/lib-services-framework@0.1.1
39
+
40
+ ## 0.4.0
4
41
 
5
42
  ### Minor Changes
6
43
 
@@ -16,7 +53,7 @@
16
53
  - Updated dependencies [299becf]
17
54
  - Updated dependencies [0c2e2f5]
18
55
  - Updated dependencies [0a250e3]
19
- - @powersync/service-sync-rules@0.0.0-dev-20240709124106
56
+ - @powersync/service-sync-rules@0.18.0
20
57
 
21
58
  ## 0.3.0
22
59
 
@@ -1,7 +1,7 @@
1
1
  import { Command } from 'commander';
2
2
  import { registerMigrationAction } from './commands/migrate-action.js';
3
3
  import { registerTearDownAction } from './commands/teardown-action.js';
4
- import { registerStartAction } from './entry-index.js';
4
+ import { registerCompactAction, registerStartAction } from './entry-index.js';
5
5
  import { logger } from '@powersync/lib-services-framework';
6
6
  /**
7
7
  * Generates a Commander program which serves as the entry point
@@ -14,6 +14,7 @@ export function generateEntryProgram(startHandlers) {
14
14
  entryProgram.name('powersync-runner').description('CLI to initiate a PowerSync service runner');
15
15
  registerTearDownAction(entryProgram);
16
16
  registerMigrationAction(entryProgram);
17
+ registerCompactAction(entryProgram);
17
18
  if (startHandlers) {
18
19
  registerStartAction(entryProgram, startHandlers);
19
20
  }
@@ -1 +1 @@
1
- {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../../src/entry/cli-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAyD;IAC5F,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC;IAEhG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IAEtC,IAAI,aAAa,EAAE;QACjB,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;KAClD;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB;;WAEG;QACH,OAAO,EAAE,KAAK,UAAU,UAAU;YAChC,IAAI;gBACF,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;aACjC;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACjB;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"cli-entry.js","sourceRoot":"","sources":["../../src/entry/cli-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAGpC,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAE3D;;;;;GAKG;AACH,MAAM,UAAU,oBAAoB,CAAC,aAAyD;IAC5F,MAAM,YAAY,GAAG,IAAI,OAAO,EAAE,CAAC;IACnC,YAAY,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,4CAA4C,CAAC,CAAC;IAEhG,sBAAsB,CAAC,YAAY,CAAC,CAAC;IACrC,uBAAuB,CAAC,YAAY,CAAC,CAAC;IACtC,qBAAqB,CAAC,YAAY,CAAC,CAAC;IAEpC,IAAI,aAAa,EAAE;QACjB,mBAAmB,CAAC,YAAY,EAAE,aAAa,CAAC,CAAC;KAClD;IAED,OAAO;QACL,OAAO,EAAE,YAAY;QACrB;;WAEG;QACH,OAAO,EAAE,KAAK,UAAU,UAAU;YAChC,IAAI;gBACF,MAAM,YAAY,CAAC,UAAU,EAAE,CAAC;aACjC;YAAC,OAAO,CAAC,EAAE;gBACV,MAAM,CAAC,KAAK,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC;gBAC/B,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;aACjB;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,2 @@
1
+ import { Command } from 'commander';
2
+ export declare function registerCompactAction(program: Command): Command;
@@ -0,0 +1,48 @@
1
+ import { logger } from '@powersync/lib-services-framework';
2
+ import * as v8 from 'v8';
3
+ import { createPowerSyncMongo, MongoBucketStorage } from '../../storage/storage-index.js';
4
+ import { loadConfig } from '../../util/config.js';
5
+ import { extractRunnerOptions, wrapConfigCommand } from './config-command.js';
6
+ const COMMAND_NAME = 'compact';
7
+ /**
8
+ * Approximately max-old-space-size + 64MB.
9
+ */
10
+ const HEAP_LIMIT = v8.getHeapStatistics().heap_size_limit;
11
+ /**
12
+ * Subtract 128MB for process overhead.
13
+ *
14
+ * Limit to 1024MB overall.
15
+ */
16
+ const COMPACT_MEMORY_LIMIT_MB = Math.min(HEAP_LIMIT / 1024 / 1024 - 128, 1024);
17
+ export function registerCompactAction(program) {
18
+ const compactCommand = program.command(COMMAND_NAME);
19
+ wrapConfigCommand(compactCommand);
20
+ return compactCommand.description('Compact storage').action(async (options) => {
21
+ const runnerConfig = extractRunnerOptions(options);
22
+ const config = await loadConfig(runnerConfig);
23
+ const { storage } = config;
24
+ const psdb = createPowerSyncMongo(storage);
25
+ const client = psdb.client;
26
+ await client.connect();
27
+ try {
28
+ const bucketStorage = new MongoBucketStorage(psdb, { slot_name_prefix: config.slot_name_prefix });
29
+ const active = await bucketStorage.getActiveSyncRules();
30
+ if (active == null) {
31
+ logger.info('No active instance to compact');
32
+ return;
33
+ }
34
+ const p = bucketStorage.getInstance(active);
35
+ await p.compact({ memoryLimitMB: COMPACT_MEMORY_LIMIT_MB });
36
+ logger.info('done');
37
+ }
38
+ catch (e) {
39
+ logger.error(`Failed to compact: ${e.toString()}`);
40
+ process.exit(1);
41
+ }
42
+ finally {
43
+ await client.close();
44
+ process.exit(0);
45
+ }
46
+ });
47
+ }
48
+ //# sourceMappingURL=compact-action.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compact-action.js","sourceRoot":"","sources":["../../../src/entry/commands/compact-action.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,mCAAmC,CAAC;AAC3D,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,oBAAoB,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAE9E,MAAM,YAAY,GAAG,SAAS,CAAC;AAE/B;;GAEG;AACH,MAAM,UAAU,GAAG,EAAE,CAAC,iBAAiB,EAAE,CAAC,eAAe,CAAC;AAE1D;;;;GAIG;AACH,MAAM,uBAAuB,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,GAAG,IAAI,GAAG,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC,CAAC;AAE/E,MAAM,UAAU,qBAAqB,CAAC,OAAgB;IACpD,MAAM,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC;IAErD,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAElC,OAAO,cAAc,CAAC,WAAW,CAAC,iBAAiB,CAAC,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC5E,MAAM,YAAY,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAEnD,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,YAAY,CAAC,CAAC;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,CAAC;QAC3B,MAAM,IAAI,GAAG,oBAAoB,CAAC,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,IAAI;YACF,MAAM,aAAa,GAAG,IAAI,kBAAkB,CAAC,IAAI,EAAE,EAAE,gBAAgB,EAAE,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC;YAClG,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,kBAAkB,EAAE,CAAC;YACxD,IAAI,MAAM,IAAI,IAAI,EAAE;gBAClB,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;gBAC7C,OAAO;aACR;YACD,MAAM,CAAC,GAAG,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YAC5C,MAAM,CAAC,CAAC,OAAO,CAAC,EAAE,aAAa,EAAE,uBAAuB,EAAE,CAAC,CAAC;YAC5D,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;SACrB;QAAC,OAAO,CAAC,EAAE;YACV,MAAM,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;YACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;gBAAS;YACR,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;YACrB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SACjB;IACH,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -3,3 +3,4 @@ export * from './commands/config-command.js';
3
3
  export * from './commands/migrate-action.js';
4
4
  export * from './commands/start-action.js';
5
5
  export * from './commands/teardown-action.js';
6
+ export * from './commands/compact-action.js';
@@ -3,4 +3,5 @@ export * from './commands/config-command.js';
3
3
  export * from './commands/migrate-action.js';
4
4
  export * from './commands/start-action.js';
5
5
  export * from './commands/teardown-action.js';
6
+ export * from './commands/compact-action.js';
6
7
  //# sourceMappingURL=entry-index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"entry-index.js","sourceRoot":"","sources":["../../src/entry/entry-index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC"}
1
+ {"version":3,"file":"entry-index.js","sourceRoot":"","sources":["../../src/entry/entry-index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAC;AAC/B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,4BAA4B,CAAC;AAC3C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,8BAA8B,CAAC"}