@powersync/service-module-mongodb-storage 0.0.0-dev-20250108073049

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 (123) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +67 -0
  3. package/README.md +3 -0
  4. package/dist/index.d.ts +5 -0
  5. package/dist/index.js +6 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/migrations/MongoMigrationAgent.d.ts +12 -0
  8. package/dist/migrations/MongoMigrationAgent.js +25 -0
  9. package/dist/migrations/MongoMigrationAgent.js.map +1 -0
  10. package/dist/migrations/db/migrations/1684951997326-init.d.ts +3 -0
  11. package/dist/migrations/db/migrations/1684951997326-init.js +30 -0
  12. package/dist/migrations/db/migrations/1684951997326-init.js.map +1 -0
  13. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.d.ts +2 -0
  14. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js +5 -0
  15. package/dist/migrations/db/migrations/1688556755264-initial-sync-rules.js.map +1 -0
  16. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.d.ts +3 -0
  17. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js +54 -0
  18. package/dist/migrations/db/migrations/1702295701188-sync-rule-state.js.map +1 -0
  19. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.d.ts +3 -0
  20. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js +26 -0
  21. package/dist/migrations/db/migrations/1711543888062-write-checkpoint-index.js.map +1 -0
  22. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.d.ts +3 -0
  23. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js +28 -0
  24. package/dist/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.js.map +1 -0
  25. package/dist/migrations/mongo-migration-store.d.ts +7 -0
  26. package/dist/migrations/mongo-migration-store.js +49 -0
  27. package/dist/migrations/mongo-migration-store.js.map +1 -0
  28. package/dist/module/MongoStorageModule.d.ts +10 -0
  29. package/dist/module/MongoStorageModule.js +31 -0
  30. package/dist/module/MongoStorageModule.js.map +1 -0
  31. package/dist/storage/MongoBucketStorage.d.ts +48 -0
  32. package/dist/storage/MongoBucketStorage.js +426 -0
  33. package/dist/storage/MongoBucketStorage.js.map +1 -0
  34. package/dist/storage/implementation/MongoBucketBatch.d.ts +72 -0
  35. package/dist/storage/implementation/MongoBucketBatch.js +681 -0
  36. package/dist/storage/implementation/MongoBucketBatch.js.map +1 -0
  37. package/dist/storage/implementation/MongoCompactor.d.ts +40 -0
  38. package/dist/storage/implementation/MongoCompactor.js +300 -0
  39. package/dist/storage/implementation/MongoCompactor.js.map +1 -0
  40. package/dist/storage/implementation/MongoIdSequence.d.ts +12 -0
  41. package/dist/storage/implementation/MongoIdSequence.js +21 -0
  42. package/dist/storage/implementation/MongoIdSequence.js.map +1 -0
  43. package/dist/storage/implementation/MongoPersistedSyncRules.d.ts +9 -0
  44. package/dist/storage/implementation/MongoPersistedSyncRules.js +9 -0
  45. package/dist/storage/implementation/MongoPersistedSyncRules.js.map +1 -0
  46. package/dist/storage/implementation/MongoPersistedSyncRulesContent.d.ts +20 -0
  47. package/dist/storage/implementation/MongoPersistedSyncRulesContent.js +26 -0
  48. package/dist/storage/implementation/MongoPersistedSyncRulesContent.js.map +1 -0
  49. package/dist/storage/implementation/MongoStorageProvider.d.ts +5 -0
  50. package/dist/storage/implementation/MongoStorageProvider.js +33 -0
  51. package/dist/storage/implementation/MongoStorageProvider.js.map +1 -0
  52. package/dist/storage/implementation/MongoSyncBucketStorage.d.ts +36 -0
  53. package/dist/storage/implementation/MongoSyncBucketStorage.js +529 -0
  54. package/dist/storage/implementation/MongoSyncBucketStorage.js.map +1 -0
  55. package/dist/storage/implementation/MongoSyncRulesLock.d.ts +16 -0
  56. package/dist/storage/implementation/MongoSyncRulesLock.js +65 -0
  57. package/dist/storage/implementation/MongoSyncRulesLock.js.map +1 -0
  58. package/dist/storage/implementation/MongoTestStorageFactoryGenerator.d.ts +7 -0
  59. package/dist/storage/implementation/MongoTestStorageFactoryGenerator.js +16 -0
  60. package/dist/storage/implementation/MongoTestStorageFactoryGenerator.js.map +1 -0
  61. package/dist/storage/implementation/MongoWriteCheckpointAPI.d.ts +20 -0
  62. package/dist/storage/implementation/MongoWriteCheckpointAPI.js +104 -0
  63. package/dist/storage/implementation/MongoWriteCheckpointAPI.js.map +1 -0
  64. package/dist/storage/implementation/OperationBatch.d.ts +34 -0
  65. package/dist/storage/implementation/OperationBatch.js +119 -0
  66. package/dist/storage/implementation/OperationBatch.js.map +1 -0
  67. package/dist/storage/implementation/PersistedBatch.d.ts +46 -0
  68. package/dist/storage/implementation/PersistedBatch.js +223 -0
  69. package/dist/storage/implementation/PersistedBatch.js.map +1 -0
  70. package/dist/storage/implementation/db.d.ts +36 -0
  71. package/dist/storage/implementation/db.js +47 -0
  72. package/dist/storage/implementation/db.js.map +1 -0
  73. package/dist/storage/implementation/models.d.ts +139 -0
  74. package/dist/storage/implementation/models.js +2 -0
  75. package/dist/storage/implementation/models.js.map +1 -0
  76. package/dist/storage/implementation/util.d.ts +46 -0
  77. package/dist/storage/implementation/util.js +155 -0
  78. package/dist/storage/implementation/util.js.map +1 -0
  79. package/dist/storage/storage-index.d.ts +14 -0
  80. package/dist/storage/storage-index.js +15 -0
  81. package/dist/storage/storage-index.js.map +1 -0
  82. package/dist/types/types.d.ts +18 -0
  83. package/dist/types/types.js +9 -0
  84. package/dist/types/types.js.map +1 -0
  85. package/package.json +48 -0
  86. package/src/index.ts +7 -0
  87. package/src/migrations/MongoMigrationAgent.ts +39 -0
  88. package/src/migrations/db/migrations/1684951997326-init.ts +39 -0
  89. package/src/migrations/db/migrations/1688556755264-initial-sync-rules.ts +5 -0
  90. package/src/migrations/db/migrations/1702295701188-sync-rule-state.ts +105 -0
  91. package/src/migrations/db/migrations/1711543888062-write-checkpoint-index.ts +38 -0
  92. package/src/migrations/db/migrations/1727099539247-custom-write-checkpoint-index.ts +40 -0
  93. package/src/migrations/mongo-migration-store.ts +62 -0
  94. package/src/module/MongoStorageModule.ts +37 -0
  95. package/src/storage/MongoBucketStorage.ts +531 -0
  96. package/src/storage/implementation/MongoBucketBatch.ts +896 -0
  97. package/src/storage/implementation/MongoCompactor.ts +381 -0
  98. package/src/storage/implementation/MongoIdSequence.ts +24 -0
  99. package/src/storage/implementation/MongoPersistedSyncRules.ts +16 -0
  100. package/src/storage/implementation/MongoPersistedSyncRulesContent.ts +49 -0
  101. package/src/storage/implementation/MongoStorageProvider.ts +39 -0
  102. package/src/storage/implementation/MongoSyncBucketStorage.ts +612 -0
  103. package/src/storage/implementation/MongoSyncRulesLock.ts +88 -0
  104. package/src/storage/implementation/MongoTestStorageFactoryGenerator.ts +25 -0
  105. package/src/storage/implementation/MongoWriteCheckpointAPI.ts +146 -0
  106. package/src/storage/implementation/OperationBatch.ts +129 -0
  107. package/src/storage/implementation/PersistedBatch.ts +283 -0
  108. package/src/storage/implementation/db.ts +87 -0
  109. package/src/storage/implementation/models.ts +161 -0
  110. package/src/storage/implementation/util.ts +169 -0
  111. package/src/storage/storage-index.ts +14 -0
  112. package/src/types/types.ts +18 -0
  113. package/test/src/__snapshots__/storage_sync.test.ts.snap +332 -0
  114. package/test/src/env.ts +6 -0
  115. package/test/src/setup.ts +9 -0
  116. package/test/src/storage.test.ts +7 -0
  117. package/test/src/storage_compacting.test.ts +6 -0
  118. package/test/src/storage_sync.test.ts +113 -0
  119. package/test/src/util.ts +8 -0
  120. package/test/tsconfig.json +31 -0
  121. package/tsconfig.json +31 -0
  122. package/tsconfig.tsbuildinfo +1 -0
  123. package/vitest.config.ts +15 -0
@@ -0,0 +1,7 @@
1
+ import { register } from '@powersync/service-core-tests';
2
+ import { describe } from 'vitest';
3
+ import { INITIALIZED_MONGO_STORAGE_FACTORY } from './util.js';
4
+
5
+ describe('Mongo Sync Bucket Storage', () => register.registerDataStorageTests(INITIALIZED_MONGO_STORAGE_FACTORY));
6
+
7
+ describe('Sync Bucket Validation', register.registerBucketValidationTests);
@@ -0,0 +1,6 @@
1
+ import { MongoCompactOptions } from '@module/storage/implementation/MongoCompactor.js';
2
+ import { register } from '@powersync/service-core-tests';
3
+ import { describe } from 'vitest';
4
+ import { INITIALIZED_MONGO_STORAGE_FACTORY } from './util.js';
5
+
6
+ describe('Mongo Sync Bucket Storage Compact', () => register.registerCompactTests<MongoCompactOptions>(INITIALIZED_MONGO_STORAGE_FACTORY, { clearBatchLimit: 2, moveBatchLimit: 1, moveBatchQueryLimit: 1 }));
@@ -0,0 +1,113 @@
1
+ import { storage } from '@powersync/service-core';
2
+ import { register, TEST_TABLE, test_utils } from '@powersync/service-core-tests';
3
+ import { describe, expect, test } from 'vitest';
4
+ import { INITIALIZED_MONGO_STORAGE_FACTORY } from './util.js';
5
+
6
+ describe('sync - mongodb', () => {
7
+ register.registerSyncTests(INITIALIZED_MONGO_STORAGE_FACTORY);
8
+
9
+ // The split of returned results can vary depending on storage drivers
10
+ test('large batch (2)', async () => {
11
+ // Test syncing a batch of data that is small in count,
12
+ // but large enough in size to be split over multiple returned chunks.
13
+ // Similar to the above test, but splits over 1MB chunks.
14
+ const sync_rules = test_utils.testRules(
15
+ `
16
+ bucket_definitions:
17
+ global:
18
+ data:
19
+ - SELECT id, description FROM "%"
20
+ `
21
+ );
22
+ using factory = await INITIALIZED_MONGO_STORAGE_FACTORY();
23
+ const bucketStorage = factory.getInstance(sync_rules);
24
+
25
+ const result = await bucketStorage.startBatch(test_utils.BATCH_OPTIONS, async (batch) => {
26
+ const sourceTable = TEST_TABLE;
27
+
28
+ const largeDescription = '0123456789'.repeat(2_000_00);
29
+
30
+ await batch.save({
31
+ sourceTable,
32
+ tag: storage.SaveOperationTag.INSERT,
33
+ after: {
34
+ id: 'test1',
35
+ description: 'test1'
36
+ },
37
+ afterReplicaId: test_utils.rid('test1')
38
+ });
39
+
40
+ await batch.save({
41
+ sourceTable,
42
+ tag: storage.SaveOperationTag.INSERT,
43
+ after: {
44
+ id: 'large1',
45
+ description: largeDescription
46
+ },
47
+ afterReplicaId: test_utils.rid('large1')
48
+ });
49
+
50
+ // Large enough to split the returned batch
51
+ await batch.save({
52
+ sourceTable,
53
+ tag: storage.SaveOperationTag.INSERT,
54
+ after: {
55
+ id: 'large2',
56
+ description: largeDescription
57
+ },
58
+ afterReplicaId: test_utils.rid('large2')
59
+ });
60
+
61
+ await batch.save({
62
+ sourceTable,
63
+ tag: storage.SaveOperationTag.INSERT,
64
+ after: {
65
+ id: 'test3',
66
+ description: 'test3'
67
+ },
68
+ afterReplicaId: test_utils.rid('test3')
69
+ });
70
+ });
71
+
72
+ const checkpoint = result!.flushed_op;
73
+
74
+ const options: storage.BucketDataBatchOptions = {};
75
+
76
+ const batch1 = await test_utils.fromAsync(
77
+ bucketStorage.getBucketDataBatch(checkpoint, new Map([['global[]', '0']]), options)
78
+ );
79
+ expect(test_utils.getBatchData(batch1)).toEqual([
80
+ { op_id: '1', op: 'PUT', object_id: 'test1', checksum: 2871785649 },
81
+ { op_id: '2', op: 'PUT', object_id: 'large1', checksum: 1178768505 }
82
+ ]);
83
+ expect(test_utils.getBatchMeta(batch1)).toEqual({
84
+ after: '0',
85
+ has_more: true,
86
+ next_after: '2'
87
+ });
88
+
89
+ const batch2 = await test_utils.fromAsync(
90
+ bucketStorage.getBucketDataBatch(checkpoint, new Map([['global[]', batch1[0].batch.next_after]]), options)
91
+ );
92
+ expect(test_utils.getBatchData(batch2)).toEqual([
93
+ { op_id: '3', op: 'PUT', object_id: 'large2', checksum: 1607205872 }
94
+ ]);
95
+ expect(test_utils.getBatchMeta(batch2)).toEqual({
96
+ after: '2',
97
+ has_more: true,
98
+ next_after: '3'
99
+ });
100
+
101
+ const batch3 = await test_utils.fromAsync(
102
+ bucketStorage.getBucketDataBatch(checkpoint, new Map([['global[]', batch2[0].batch.next_after]]), options)
103
+ );
104
+ expect(test_utils.getBatchData(batch3)).toEqual([
105
+ { op_id: '4', op: 'PUT', object_id: 'test3', checksum: 1359888332 }
106
+ ]);
107
+ expect(test_utils.getBatchMeta(batch3)).toEqual({
108
+ after: '3',
109
+ has_more: false,
110
+ next_after: '4'
111
+ });
112
+ });
113
+ });
@@ -0,0 +1,8 @@
1
+ import { env } from './env.js';
2
+
3
+ import { MongoTestStorageFactoryGenerator } from '@module/storage/implementation/MongoTestStorageFactoryGenerator.js';
4
+
5
+ export const INITIALIZED_MONGO_STORAGE_FACTORY = MongoTestStorageFactoryGenerator({
6
+ url: env.MONGO_TEST_URL,
7
+ isCI: env.CI
8
+ });
@@ -0,0 +1,31 @@
1
+ {
2
+ "extends": "../../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "baseUrl": "./",
6
+ "noEmit": true,
7
+ "esModuleInterop": true,
8
+ "skipLibCheck": true,
9
+ "sourceMap": true,
10
+ "paths": {
11
+ "@/*": ["../../../packages/service-core/src/*"],
12
+ "@module/*": ["../src/*"],
13
+ "@core-tests/*": ["../../../packages/service-core/test/src/*"]
14
+ }
15
+ },
16
+ "include": ["src"],
17
+ "references": [
18
+ {
19
+ "path": "../"
20
+ },
21
+ {
22
+ "path": "../../../packages/service-core/test"
23
+ },
24
+ {
25
+ "path": "../../../packages/service-core/"
26
+ },
27
+ {
28
+ "path": "../../../packages/service-core-tests/"
29
+ }
30
+ ]
31
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,31 @@
1
+ {
2
+ "extends": "../../tsconfig.base.json",
3
+ "compilerOptions": {
4
+ "rootDir": "src",
5
+ "outDir": "dist",
6
+ "esModuleInterop": true,
7
+ "skipLibCheck": true,
8
+ "sourceMap": true
9
+ },
10
+ "include": ["src"],
11
+ "references": [
12
+ {
13
+ "path": "../../packages/types"
14
+ },
15
+ {
16
+ "path": "../../packages/jsonbig"
17
+ },
18
+ {
19
+ "path": "../../packages/sync-rules"
20
+ },
21
+ {
22
+ "path": "../../packages/service-core"
23
+ },
24
+ {
25
+ "path": "../../libs/lib-services"
26
+ },
27
+ {
28
+ "path": "../../libs/lib-mongodb"
29
+ }
30
+ ]
31
+ }