@dxos/echo-pipeline 0.8.3 → 0.8.4-main.05e74ebcff
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/LICENSE +102 -5
- package/README.md +1 -1
- package/dist/lib/neutral/chunk-46DCRDA7.mjs +271 -0
- package/dist/lib/neutral/chunk-46DCRDA7.mjs.map +7 -0
- package/dist/lib/{browser/chunk-35I6ERLG.mjs → neutral/chunk-LR7UFVQX.mjs} +313 -709
- package/dist/lib/neutral/chunk-LR7UFVQX.mjs.map +7 -0
- package/dist/lib/{browser → neutral}/filter/index.mjs +3 -2
- package/dist/lib/neutral/index.mjs +7332 -0
- package/dist/lib/neutral/index.mjs.map +7 -0
- package/dist/lib/neutral/meta.json +1 -0
- package/dist/lib/{browser → neutral}/testing/index.mjs +90 -311
- package/dist/lib/neutral/testing/index.mjs.map +7 -0
- package/dist/types/src/automerge/automerge-host-subduction.test.d.ts +2 -0
- package/dist/types/src/automerge/automerge-host-subduction.test.d.ts.map +1 -0
- package/dist/types/src/automerge/automerge-host.d.ts +119 -54
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/automerge/automerge-repo-subduction.test.d.ts +2 -0
- package/dist/types/src/automerge/automerge-repo-subduction.test.d.ts.map +1 -0
- package/dist/types/src/automerge/automerge-repo.test.d.ts +1 -1
- package/dist/types/src/automerge/automerge-repo.test.d.ts.map +1 -1
- package/dist/types/src/automerge/automerge-subduction.test.d.ts +2 -0
- package/dist/types/src/automerge/automerge-subduction.test.d.ts.map +1 -0
- package/dist/types/src/automerge/collection-synchronizer.d.ts +25 -4
- package/dist/types/src/automerge/collection-synchronizer.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-data-monitor.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-network-adapter.d.ts +23 -10
- package/dist/types/src/automerge/echo-network-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/echo-replicator.d.ts +46 -15
- package/dist/types/src/automerge/echo-replicator.d.ts.map +1 -1
- package/dist/types/src/automerge/errors.d.ts +35 -0
- package/dist/types/src/automerge/errors.d.ts.map +1 -0
- package/dist/types/src/automerge/handle-state.d.ts +52 -0
- package/dist/types/src/automerge/handle-state.d.ts.map +1 -0
- package/dist/types/src/automerge/heads-store.d.ts +9 -2
- package/dist/types/src/automerge/heads-store.d.ts.map +1 -1
- package/dist/types/src/automerge/index.d.ts +3 -1
- package/dist/types/src/automerge/index.d.ts.map +1 -1
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts +11 -5
- package/dist/types/src/automerge/leveldb-storage-adapter.d.ts.map +1 -1
- package/dist/types/src/automerge/mesh-echo-replicator-connection.d.ts +9 -8
- package/dist/types/src/automerge/mesh-echo-replicator-connection.d.ts.map +1 -1
- package/dist/types/src/automerge/mesh-echo-replicator.d.ts +6 -5
- package/dist/types/src/automerge/mesh-echo-replicator.d.ts.map +1 -1
- package/dist/types/src/automerge/network-protocol.d.ts.map +1 -1
- package/dist/types/src/automerge/space-collection.d.ts.map +1 -1
- package/dist/types/src/common/codec.d.ts +1 -1
- package/dist/types/src/common/codec.d.ts.map +1 -1
- package/dist/types/src/common/feeds.d.ts.map +1 -1
- package/dist/types/src/common/space-id.d.ts.map +1 -1
- package/dist/types/src/db-host/automerge-data-source.d.ts +35 -0
- package/dist/types/src/db-host/automerge-data-source.d.ts.map +1 -0
- package/dist/types/src/db-host/automerge-data-source.test.d.ts +2 -0
- package/dist/types/src/db-host/automerge-data-source.test.d.ts.map +1 -0
- package/dist/types/src/db-host/automerge-metrics.d.ts.map +1 -1
- package/dist/types/src/db-host/data-service.d.ts +13 -7
- package/dist/types/src/db-host/data-service.d.ts.map +1 -1
- package/dist/types/src/db-host/database-root.d.ts +9 -3
- package/dist/types/src/db-host/database-root.d.ts.map +1 -1
- package/dist/types/src/db-host/documents-synchronizer.d.ts +30 -8
- package/dist/types/src/db-host/documents-synchronizer.d.ts.map +1 -1
- package/dist/types/src/db-host/echo-host.d.ts +74 -28
- package/dist/types/src/db-host/echo-host.d.ts.map +1 -1
- package/dist/types/src/db-host/index.d.ts +2 -0
- package/dist/types/src/db-host/index.d.ts.map +1 -1
- package/dist/types/src/db-host/invalidation-hint.d.ts +19 -0
- package/dist/types/src/db-host/invalidation-hint.d.ts.map +1 -0
- package/dist/types/src/db-host/local-queue-service.d.ts +19 -0
- package/dist/types/src/db-host/local-queue-service.d.ts.map +1 -0
- package/dist/types/src/db-host/query-invalidation.test.d.ts +2 -0
- package/dist/types/src/db-host/query-invalidation.test.d.ts.map +1 -0
- package/dist/types/src/db-host/query-service.d.ts +19 -11
- package/dist/types/src/db-host/query-service.d.ts.map +1 -1
- package/dist/types/src/db-host/queue-data-source.d.ts +38 -0
- package/dist/types/src/db-host/queue-data-source.d.ts.map +1 -0
- package/dist/types/src/db-host/queue-service.test.d.ts +2 -0
- package/dist/types/src/db-host/queue-service.test.d.ts.map +1 -0
- package/dist/types/src/db-host/space-state-manager.d.ts +4 -3
- package/dist/types/src/db-host/space-state-manager.d.ts.map +1 -1
- package/dist/types/src/db-host/stub.d.ts +11 -0
- package/dist/types/src/db-host/stub.d.ts.map +1 -0
- package/dist/types/src/edge/echo-edge-replicator.d.ts +10 -7
- package/dist/types/src/edge/echo-edge-replicator.d.ts.map +1 -1
- package/dist/types/src/edge/echo-edge-subduction-replicator.d.ts +39 -0
- package/dist/types/src/edge/echo-edge-subduction-replicator.d.ts.map +1 -0
- package/dist/types/src/edge/echo-edge-subduction-replicator.test.d.ts +2 -0
- package/dist/types/src/edge/echo-edge-subduction-replicator.test.d.ts.map +1 -0
- package/dist/types/src/edge/index.d.ts +1 -0
- package/dist/types/src/edge/index.d.ts.map +1 -1
- package/dist/types/src/edge/inflight-request-limiter.d.ts.map +1 -1
- package/dist/types/src/filter/filter-match.d.ts +4 -1
- package/dist/types/src/filter/filter-match.d.ts.map +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
- package/dist/types/src/pipeline/message-selector.d.ts.map +1 -1
- package/dist/types/src/pipeline/pipeline.d.ts +3 -3
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/pipeline/timeframe-clock.d.ts.map +1 -1
- package/dist/types/src/query/errors.d.ts +22 -10
- package/dist/types/src/query/errors.d.ts.map +1 -1
- package/dist/types/src/query/plan.d.ts +66 -8
- package/dist/types/src/query/plan.d.ts.map +1 -1
- package/dist/types/src/query/query-executor.d.ts +66 -11
- package/dist/types/src/query/query-executor.d.ts.map +1 -1
- package/dist/types/src/query/query-planner.d.ts +12 -1
- package/dist/types/src/query/query-planner.d.ts.map +1 -1
- package/dist/types/src/space/admission-discovery-extension.d.ts.map +1 -1
- package/dist/types/src/space/auth.d.ts +3 -3
- package/dist/types/src/space/auth.d.ts.map +1 -1
- package/dist/types/src/space/control-pipeline.d.ts +5 -4
- package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
- package/dist/types/src/space/space-manager.d.ts +8 -8
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/space/space-protocol.d.ts +10 -9
- package/dist/types/src/space/space-protocol.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts +6 -6
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/dist/types/src/testing/change-metadata.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +0 -2
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts +2 -2
- package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-feed-builder.d.ts.map +1 -1
- package/dist/types/src/testing/test-network-adapter.d.ts +1 -1
- package/dist/types/src/testing/test-network-adapter.d.ts.map +1 -1
- package/dist/types/src/testing/test-replicator.d.ts +14 -13
- package/dist/types/src/testing/test-replicator.d.ts.map +1 -1
- package/dist/types/src/util.d.ts +1 -1
- package/dist/types/src/util.d.ts.map +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +59 -55
- package/src/automerge/automerge-host-subduction.test.ts +263 -0
- package/src/automerge/automerge-host.test.ts +162 -39
- package/src/automerge/automerge-host.ts +679 -201
- package/src/automerge/automerge-repo-subduction.test.ts +1054 -0
- package/src/automerge/automerge-repo.test.ts +349 -91
- package/src/automerge/automerge-subduction.test.ts +330 -0
- package/src/automerge/collection-synchronizer.test.ts +98 -17
- package/src/automerge/collection-synchronizer.ts +141 -37
- package/src/automerge/echo-data-monitor.ts +1 -1
- package/src/automerge/echo-network-adapter.test.ts +5 -4
- package/src/automerge/echo-network-adapter.ts +76 -31
- package/src/automerge/echo-replicator.ts +50 -15
- package/src/automerge/errors.ts +10 -0
- package/src/automerge/handle-state.ts +62 -0
- package/src/automerge/heads-store.ts +42 -3
- package/src/automerge/index.ts +3 -1
- package/src/automerge/leveldb-storage-adapter.ts +77 -11
- package/src/automerge/mesh-echo-replicator-connection.ts +12 -8
- package/src/automerge/mesh-echo-replicator.ts +15 -11
- package/src/automerge/storage-adapter.test.ts +1 -1
- package/src/common/space-id.ts +1 -1
- package/src/db-host/automerge-data-source.test.ts +299 -0
- package/src/db-host/automerge-data-source.ts +187 -0
- package/src/db-host/data-service.ts +35 -26
- package/src/db-host/database-root.ts +20 -8
- package/src/db-host/documents-synchronizer.test.ts +145 -14
- package/src/db-host/documents-synchronizer.ts +163 -51
- package/src/db-host/echo-host.ts +384 -99
- package/src/db-host/index.ts +2 -0
- package/src/db-host/invalidation-hint.ts +50 -0
- package/src/db-host/local-queue-service.ts +127 -0
- package/src/db-host/query-invalidation.test.ts +270 -0
- package/src/db-host/query-service.ts +111 -106
- package/src/db-host/queue-data-source.ts +160 -0
- package/src/db-host/queue-service.test.ts +145 -0
- package/src/db-host/space-state-manager.ts +12 -10
- package/src/db-host/stub.ts +33 -0
- package/src/edge/echo-edge-replicator.test.ts +12 -10
- package/src/edge/echo-edge-replicator.ts +144 -58
- package/src/edge/echo-edge-subduction-replicator.test.ts +158 -0
- package/src/edge/echo-edge-subduction-replicator.ts +377 -0
- package/src/edge/index.ts +1 -0
- package/src/filter/filter-match.test.ts +68 -32
- package/src/filter/filter-match.ts +230 -21
- package/src/metadata/metadata-store.ts +11 -8
- package/src/pipeline/pipeline-stress.test.ts +1 -1
- package/src/pipeline/pipeline.test.ts +2 -2
- package/src/pipeline/pipeline.ts +9 -7
- package/src/query/errors.ts +3 -1
- package/src/query/plan.ts +84 -9
- package/src/query/query-executor.ts +1197 -165
- package/src/query/query-planner.test.ts +993 -81
- package/src/query/query-planner.ts +503 -27
- package/src/space/admission-discovery-extension.ts +3 -3
- package/src/space/auth.ts +6 -6
- package/src/space/control-pipeline.test.ts +5 -4
- package/src/space/control-pipeline.ts +16 -13
- package/src/space/space-manager.browser.test.ts +1 -1
- package/src/space/space-manager.ts +16 -20
- package/src/space/space-protocol.browser.test.ts +15 -14
- package/src/space/space-protocol.test.ts +15 -14
- package/src/space/space-protocol.ts +22 -18
- package/src/space/space.test.ts +3 -3
- package/src/space/space.ts +11 -11
- package/src/testing/index.ts +0 -2
- package/src/testing/test-agent-builder.ts +3 -3
- package/src/testing/test-network-adapter.ts +24 -3
- package/src/testing/test-replicator.ts +19 -20
- package/src/util.ts +7 -3
- package/dist/lib/browser/chunk-35I6ERLG.mjs.map +0 -7
- package/dist/lib/browser/chunk-CGS2ULMK.mjs +0 -11
- package/dist/lib/browser/chunk-CGS2ULMK.mjs.map +0 -7
- package/dist/lib/browser/chunk-TQJTKNMS.mjs +0 -126
- package/dist/lib/browser/chunk-TQJTKNMS.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -4743
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node/chunk-HOPOFWAL.cjs +0 -147
- package/dist/lib/node/chunk-HOPOFWAL.cjs.map +0 -7
- package/dist/lib/node/chunk-JXX6LF5U.cjs +0 -2084
- package/dist/lib/node/chunk-JXX6LF5U.cjs.map +0 -7
- package/dist/lib/node/chunk-Q7SFCCGT.cjs +0 -33
- package/dist/lib/node/chunk-Q7SFCCGT.cjs.map +0 -7
- package/dist/lib/node/filter/index.cjs +0 -32
- package/dist/lib/node/filter/index.cjs.map +0 -7
- package/dist/lib/node/index.cjs +0 -4699
- package/dist/lib/node/index.cjs.map +0 -7
- package/dist/lib/node/meta.json +0 -1
- package/dist/lib/node/testing/index.cjs +0 -753
- package/dist/lib/node/testing/index.cjs.map +0 -7
- package/dist/lib/node-esm/chunk-5BHLPT24.mjs +0 -2067
- package/dist/lib/node-esm/chunk-5BHLPT24.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs +0 -11
- package/dist/lib/node-esm/chunk-HSLMI22Q.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-RVK35BS7.mjs +0 -126
- package/dist/lib/node-esm/chunk-RVK35BS7.mjs.map +0 -7
- package/dist/lib/node-esm/filter/index.mjs +0 -11
- package/dist/lib/node-esm/filter/index.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -4743
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/testing/index.mjs +0 -742
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/db-host/documents-iterator.d.ts +0 -7
- package/dist/types/src/db-host/documents-iterator.d.ts.map +0 -1
- package/dist/types/src/testing/test-data.d.ts +0 -18
- package/dist/types/src/testing/test-data.d.ts.map +0 -1
- package/dist/types/src/testing/test-schema.d.ts +0 -37
- package/dist/types/src/testing/test-schema.d.ts.map +0 -1
- package/src/db-host/documents-iterator.ts +0 -74
- package/src/testing/test-data.ts +0 -127
- package/src/testing/test-schema.ts +0 -53
- /package/dist/lib/{browser → neutral}/filter/index.mjs.map +0 -0
package/package.json
CHANGED
|
@@ -1,38 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dxos/echo-pipeline",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4-main.05e74ebcff",
|
|
4
4
|
"description": "ECHO database.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/dxos/dxos"
|
|
10
|
+
},
|
|
11
|
+
"license": "FSL-1.1-Apache-2.0",
|
|
8
12
|
"author": "info@dxos.org",
|
|
9
|
-
"sideEffects":
|
|
13
|
+
"sideEffects": false,
|
|
10
14
|
"type": "module",
|
|
11
15
|
"exports": {
|
|
12
16
|
".": {
|
|
17
|
+
"source": "./src/index.ts",
|
|
13
18
|
"types": "./dist/types/src/index.d.ts",
|
|
14
|
-
"
|
|
15
|
-
"node": "./dist/lib/node-esm/index.mjs"
|
|
19
|
+
"default": "./dist/lib/neutral/index.mjs"
|
|
16
20
|
},
|
|
17
21
|
"./testing": {
|
|
22
|
+
"source": "./src/testing/index.ts",
|
|
18
23
|
"types": "./dist/types/src/testing/index.d.ts",
|
|
19
|
-
"
|
|
20
|
-
"node": "./dist/lib/node-esm/testing/index.mjs"
|
|
24
|
+
"default": "./dist/lib/neutral/testing/index.mjs"
|
|
21
25
|
},
|
|
22
26
|
"./filter": {
|
|
27
|
+
"source": "./src/filter/index.ts",
|
|
23
28
|
"types": "./dist/types/src/filter/index.d.ts",
|
|
24
|
-
"
|
|
25
|
-
"node": "./dist/lib/node-esm/filter/index.mjs"
|
|
29
|
+
"default": "./dist/lib/neutral/filter/index.mjs"
|
|
26
30
|
}
|
|
27
31
|
},
|
|
28
32
|
"types": "dist/types/src/index.d.ts",
|
|
29
|
-
"typesVersions": {
|
|
30
|
-
"*": {
|
|
31
|
-
"testing": [
|
|
32
|
-
"dist/types/src/testing/index.d.ts"
|
|
33
|
-
]
|
|
34
|
-
}
|
|
35
|
-
},
|
|
36
33
|
"files": [
|
|
37
34
|
"testing.d.ts",
|
|
38
35
|
"testing.js",
|
|
@@ -40,51 +37,58 @@
|
|
|
40
37
|
"src"
|
|
41
38
|
],
|
|
42
39
|
"dependencies": {
|
|
43
|
-
"@automerge/automerge": "3.
|
|
44
|
-
"@automerge/automerge-repo": "2.0.
|
|
40
|
+
"@automerge/automerge": "3.2.6",
|
|
41
|
+
"@automerge/automerge-repo": "2.6.0-subduction.17",
|
|
42
|
+
"@automerge/automerge-subduction": "0.12.1",
|
|
43
|
+
"@effect/sql": "0.49.0",
|
|
44
|
+
"@effect/sql-sqlite-node": "0.50.1",
|
|
45
|
+
"bs58check": "^4.0.0",
|
|
45
46
|
"crc-32": "^1.2.2",
|
|
46
|
-
"effect": "3.
|
|
47
|
+
"effect": "3.20.0",
|
|
48
|
+
"fast-deep-equal": "^3.1.3",
|
|
47
49
|
"level-transcoder": "^1.0.1",
|
|
48
|
-
"
|
|
49
|
-
"@dxos/
|
|
50
|
-
"@dxos/
|
|
51
|
-
"@dxos/context": "0.8.
|
|
52
|
-
"@dxos/
|
|
53
|
-
"@dxos/
|
|
54
|
-
"@dxos/
|
|
55
|
-
"@dxos/echo": "0.8.
|
|
56
|
-
"@dxos/
|
|
57
|
-
"@dxos/
|
|
58
|
-
"@dxos/
|
|
59
|
-
"@dxos/
|
|
60
|
-
"@dxos/
|
|
61
|
-
"@dxos/
|
|
62
|
-
"@dxos/hypercore": "0.8.
|
|
63
|
-
"@dxos/
|
|
64
|
-
"@dxos/
|
|
65
|
-
"@dxos/keys": "0.8.
|
|
66
|
-
"@dxos/
|
|
67
|
-
"@dxos/
|
|
68
|
-
"@dxos/
|
|
69
|
-
"@dxos/
|
|
70
|
-
"@dxos/
|
|
71
|
-
"@dxos/
|
|
72
|
-
"@dxos/protocols": "0.8.
|
|
73
|
-
"@dxos/
|
|
74
|
-
"@dxos/teleport
|
|
75
|
-
"@dxos/
|
|
76
|
-
"@dxos/teleport-extension-
|
|
77
|
-
"@dxos/teleport-extension-
|
|
78
|
-
"@dxos/
|
|
79
|
-
"@dxos/
|
|
80
|
-
"@dxos/
|
|
81
|
-
"@dxos/
|
|
50
|
+
"semver": "^7.7.3",
|
|
51
|
+
"@dxos/async": "0.8.4-main.05e74ebcff",
|
|
52
|
+
"@dxos/codec-protobuf": "0.8.4-main.05e74ebcff",
|
|
53
|
+
"@dxos/context": "0.8.4-main.05e74ebcff",
|
|
54
|
+
"@dxos/credentials": "0.8.4-main.05e74ebcff",
|
|
55
|
+
"@dxos/debug": "0.8.4-main.05e74ebcff",
|
|
56
|
+
"@dxos/echo": "0.8.4-main.05e74ebcff",
|
|
57
|
+
"@dxos/echo-protocol": "0.8.4-main.05e74ebcff",
|
|
58
|
+
"@dxos/edge-client": "0.8.4-main.05e74ebcff",
|
|
59
|
+
"@dxos/crypto": "0.8.4-main.05e74ebcff",
|
|
60
|
+
"@dxos/errors": "0.8.4-main.05e74ebcff",
|
|
61
|
+
"@dxos/effect": "0.8.4-main.05e74ebcff",
|
|
62
|
+
"@dxos/feed-store": "0.8.4-main.05e74ebcff",
|
|
63
|
+
"@dxos/feed": "0.8.4-main.05e74ebcff",
|
|
64
|
+
"@dxos/hypercore": "0.8.4-main.05e74ebcff",
|
|
65
|
+
"@dxos/index-core": "0.8.4-main.05e74ebcff",
|
|
66
|
+
"@dxos/invariant": "0.8.4-main.05e74ebcff",
|
|
67
|
+
"@dxos/keys": "0.8.4-main.05e74ebcff",
|
|
68
|
+
"@dxos/keyring": "0.8.4-main.05e74ebcff",
|
|
69
|
+
"@dxos/kv-store": "0.8.4-main.05e74ebcff",
|
|
70
|
+
"@dxos/log": "0.8.4-main.05e74ebcff",
|
|
71
|
+
"@dxos/messaging": "0.8.4-main.05e74ebcff",
|
|
72
|
+
"@dxos/network-manager": "0.8.4-main.05e74ebcff",
|
|
73
|
+
"@dxos/node-std": "0.8.4-main.05e74ebcff",
|
|
74
|
+
"@dxos/protocols": "0.8.4-main.05e74ebcff",
|
|
75
|
+
"@dxos/sql-sqlite": "0.8.4-main.05e74ebcff",
|
|
76
|
+
"@dxos/teleport": "0.8.4-main.05e74ebcff",
|
|
77
|
+
"@dxos/random-access-storage": "0.8.4-main.05e74ebcff",
|
|
78
|
+
"@dxos/teleport-extension-automerge-replicator": "0.8.4-main.05e74ebcff",
|
|
79
|
+
"@dxos/teleport-extension-gossip": "0.8.4-main.05e74ebcff",
|
|
80
|
+
"@dxos/teleport-extension-object-sync": "0.8.4-main.05e74ebcff",
|
|
81
|
+
"@dxos/timeframe": "0.8.4-main.05e74ebcff",
|
|
82
|
+
"@dxos/typings": "0.8.4-main.05e74ebcff",
|
|
83
|
+
"@dxos/tracing": "0.8.4-main.05e74ebcff",
|
|
84
|
+
"@dxos/util": "0.8.4-main.05e74ebcff",
|
|
85
|
+
"@dxos/teleport-extension-replicator": "0.8.4-main.05e74ebcff"
|
|
82
86
|
},
|
|
83
87
|
"devDependencies": {
|
|
84
|
-
"@types/
|
|
88
|
+
"@types/semver": "^7.7.1",
|
|
85
89
|
"fast-check": "^3.19.0",
|
|
86
90
|
"get-port-please": "^3.1.1",
|
|
87
|
-
"@dxos/test-utils": "0.8.
|
|
91
|
+
"@dxos/test-utils": "0.8.4-main.05e74ebcff"
|
|
88
92
|
},
|
|
89
93
|
"publishConfig": {
|
|
90
94
|
"access": "public"
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2026 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { getHeads } from '@automerge/automerge';
|
|
6
|
+
import * as Automerge from '@automerge/automerge';
|
|
7
|
+
import { type DocumentId, type Heads, generateAutomergeUrl, parseAutomergeUrl } from '@automerge/automerge-repo';
|
|
8
|
+
import { describe, onTestFinished, test } from 'vitest';
|
|
9
|
+
|
|
10
|
+
import { sleep } from '@dxos/async';
|
|
11
|
+
import { Context } from '@dxos/context';
|
|
12
|
+
import type { CollectionId } from '@dxos/echo-protocol';
|
|
13
|
+
import { invariant } from '@dxos/invariant';
|
|
14
|
+
import { PublicKey } from '@dxos/keys';
|
|
15
|
+
import type { LevelDB } from '@dxos/kv-store';
|
|
16
|
+
import { createTestLevel } from '@dxos/kv-store/testing';
|
|
17
|
+
import { openAndClose } from '@dxos/test-utils';
|
|
18
|
+
import { range } from '@dxos/util';
|
|
19
|
+
|
|
20
|
+
import { TestReplicationNetwork } from '../testing';
|
|
21
|
+
import { AutomergeHost } from './automerge-host';
|
|
22
|
+
|
|
23
|
+
describe('AutomergeHost with Subduction', () => {
|
|
24
|
+
test('can create documents', async ({ expect }) => {
|
|
25
|
+
const level = await createLevel();
|
|
26
|
+
const host = await setupAutomergeHost({ level });
|
|
27
|
+
const handle = await host.createDoc<any>();
|
|
28
|
+
handle.change((doc: any) => {
|
|
29
|
+
doc.text = 'Hello world';
|
|
30
|
+
});
|
|
31
|
+
await host.flush(Context.default());
|
|
32
|
+
expect(handle.doc()!.text).toEqual('Hello world');
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
test('changes are preserved in storage', async ({ expect }) => {
|
|
36
|
+
const level = await createLevel();
|
|
37
|
+
const host = await setupAutomergeHost({ level });
|
|
38
|
+
const handle = await host.createDoc<any>();
|
|
39
|
+
handle.change((doc: any) => {
|
|
40
|
+
doc.text = 'Hello world';
|
|
41
|
+
});
|
|
42
|
+
const url = handle.url;
|
|
43
|
+
|
|
44
|
+
await host.flush(Context.default());
|
|
45
|
+
await host.close();
|
|
46
|
+
|
|
47
|
+
const host2 = await setupAutomergeHost({ level });
|
|
48
|
+
const handle2 = await host2.loadDoc<any>(Context.default(), url);
|
|
49
|
+
invariant(handle2);
|
|
50
|
+
await handle2.whenReady();
|
|
51
|
+
expect(handle2.doc()!.text).toEqual('Hello world');
|
|
52
|
+
await host2.flush(Context.default());
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
test('load resolves when document is created from binary', async ({ expect }) => {
|
|
56
|
+
const level = await createLevel();
|
|
57
|
+
const host = await setupAutomergeHost({ level });
|
|
58
|
+
|
|
59
|
+
const document = Automerge.from({ text: 'Hello world' });
|
|
60
|
+
const binary = Automerge.save(document);
|
|
61
|
+
const { documentId } = parseAutomergeUrl(generateAutomergeUrl());
|
|
62
|
+
|
|
63
|
+
const loadPromise = host.loadDoc(Context.default(), documentId);
|
|
64
|
+
|
|
65
|
+
const createdHandle = await host.createDoc(binary, { preserveHistory: true, documentId });
|
|
66
|
+
|
|
67
|
+
const loadedHandle = await loadPromise;
|
|
68
|
+
invariant(loadedHandle);
|
|
69
|
+
expect(loadedHandle.doc()).toEqual(createdHandle.doc());
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
test('query single document heads', async ({ expect }) => {
|
|
73
|
+
const tmpPath = `/tmp/dxos-${PublicKey.random().toHex()}`;
|
|
74
|
+
|
|
75
|
+
const level = await createLevel(tmpPath);
|
|
76
|
+
const host = await setupAutomergeHost({ level });
|
|
77
|
+
const handle = await host.createDoc({ text: 'Hello world' });
|
|
78
|
+
const expectedHeads = getHeads(handle.doc()!);
|
|
79
|
+
await host.flush(Context.default());
|
|
80
|
+
|
|
81
|
+
expect(await host.getHeads([handle.documentId])).toEqual([expectedHeads]);
|
|
82
|
+
await host.close();
|
|
83
|
+
await level.close();
|
|
84
|
+
|
|
85
|
+
{
|
|
86
|
+
const host = await setupAutomergeHost({ level: await createLevel(tmpPath) });
|
|
87
|
+
expect(await host.getHeads([handle.documentId])).toEqual([expectedHeads]);
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
test('query multiple document heads', async ({ expect }) => {
|
|
92
|
+
const tmpPath = `/tmp/dxos-${PublicKey.random().toHex()}`;
|
|
93
|
+
|
|
94
|
+
const level = await createLevel(tmpPath);
|
|
95
|
+
const host = await setupAutomergeHost({ level });
|
|
96
|
+
const handles = await Promise.all(range(2, () => host.createDoc({ text: 'Hello world' })));
|
|
97
|
+
const expectedHeads: (Heads | undefined)[] = handles.map((handle) => getHeads(handle.doc()!));
|
|
98
|
+
await host.flush(Context.default());
|
|
99
|
+
|
|
100
|
+
const ids = handles.map((handle) => handle.documentId);
|
|
101
|
+
ids.splice(1, 0, 'non-existent-id' as DocumentId);
|
|
102
|
+
expectedHeads.splice(1, 0, undefined);
|
|
103
|
+
|
|
104
|
+
expect(await host.getHeads(ids)).toEqual(expectedHeads);
|
|
105
|
+
await host.close();
|
|
106
|
+
await level.close();
|
|
107
|
+
|
|
108
|
+
{
|
|
109
|
+
const level = await createLevel(tmpPath);
|
|
110
|
+
const host = await setupAutomergeHost({ level });
|
|
111
|
+
expect(await host.getHeads(ids)).toEqual(expectedHeads);
|
|
112
|
+
await host.close();
|
|
113
|
+
await level.close();
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
test('loads remote document over replication network', { timeout: 5_000 }, async ({ expect }) => {
|
|
118
|
+
const level1 = await createLevel();
|
|
119
|
+
const host1 = await setupAutomergeHost({ level: level1 });
|
|
120
|
+
|
|
121
|
+
const level2 = await createLevel();
|
|
122
|
+
const host2 = await setupAutomergeHost({ level: level2 });
|
|
123
|
+
const handle = await host2.createDoc({ text: 'Hello from Subduction' });
|
|
124
|
+
await host2.flush(Context.default());
|
|
125
|
+
await waitForSubductionSave();
|
|
126
|
+
|
|
127
|
+
const network = await new TestReplicationNetwork().open();
|
|
128
|
+
try {
|
|
129
|
+
await host1.addReplicator(Context.default(), await network.createReplicator());
|
|
130
|
+
await host2.addReplicator(Context.default(), await network.createReplicator());
|
|
131
|
+
|
|
132
|
+
const loaded = await host1.loadDoc<{ text: string }>(Context.default(), handle.documentId, { timeout: 1_000 });
|
|
133
|
+
invariant(loaded);
|
|
134
|
+
expect(loaded.doc()!.text).toEqual('Hello from Subduction');
|
|
135
|
+
} finally {
|
|
136
|
+
await host1.close();
|
|
137
|
+
await host2.close();
|
|
138
|
+
await network.close();
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
test('collection synchronization', { timeout: 5_000 }, async ({ expect }) => {
|
|
143
|
+
const NUM_DOCUMENTS = 10;
|
|
144
|
+
|
|
145
|
+
const level1 = await createLevel();
|
|
146
|
+
const host1 = await setupAutomergeHost({ level: level1 });
|
|
147
|
+
|
|
148
|
+
const level2 = await createLevel();
|
|
149
|
+
const host2 = await setupAutomergeHost({ level: level2 });
|
|
150
|
+
const documentIds: DocumentId[] = [];
|
|
151
|
+
for (const i of range(NUM_DOCUMENTS)) {
|
|
152
|
+
const handle = await host2.createDoc({ docIndex: i });
|
|
153
|
+
documentIds.push(handle.documentId);
|
|
154
|
+
}
|
|
155
|
+
await host2.flush(Context.default());
|
|
156
|
+
await waitForSubductionSave();
|
|
157
|
+
|
|
158
|
+
const network = await new TestReplicationNetwork().open();
|
|
159
|
+
try {
|
|
160
|
+
await host1.addReplicator(Context.default(), await network.createReplicator());
|
|
161
|
+
await host2.addReplicator(Context.default(), await network.createReplicator());
|
|
162
|
+
|
|
163
|
+
const collectionId = 'test-collection';
|
|
164
|
+
const collectionUpdates: CollectionId[] = [];
|
|
165
|
+
const unsubscribe = host1.collectionStateUpdated.on(({ collectionId }) => {
|
|
166
|
+
collectionUpdates.push(collectionId);
|
|
167
|
+
});
|
|
168
|
+
await host1.updateLocalCollectionState(collectionId, documentIds);
|
|
169
|
+
await host2.updateLocalCollectionState(collectionId, documentIds);
|
|
170
|
+
|
|
171
|
+
for (const documentId of documentIds) {
|
|
172
|
+
await expect
|
|
173
|
+
.poll(() => host1.getHeads([documentId]), { timeout: 1_000 })
|
|
174
|
+
.toEqual(await host2.getHeads([documentId]));
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
// collectionStateUpdated fires whenever host1 observes a `collection-state` from host2
|
|
178
|
+
// (see {@link CollectionSynchronizer.remoteStateUpdated}). At least one event must
|
|
179
|
+
// arrive for the heads to have converged via the collection-sync path rather than
|
|
180
|
+
// raw Subduction byte transport.
|
|
181
|
+
expect(collectionUpdates).toContain(collectionId as CollectionId);
|
|
182
|
+
unsubscribe();
|
|
183
|
+
} finally {
|
|
184
|
+
await host1.close();
|
|
185
|
+
await host2.close();
|
|
186
|
+
await network.close();
|
|
187
|
+
}
|
|
188
|
+
});
|
|
189
|
+
|
|
190
|
+
test('collection synchronization is bidirectional', { timeout: 10_000 }, async ({ expect }) => {
|
|
191
|
+
const host1DocumentIds: DocumentId[] = [];
|
|
192
|
+
const host2DocumentIds: DocumentId[] = [];
|
|
193
|
+
|
|
194
|
+
const level1 = await createLevel();
|
|
195
|
+
const host1 = await setupAutomergeHost({ level: level1 });
|
|
196
|
+
for (const i of range(3)) {
|
|
197
|
+
const handle = await host1.createDoc({ host: 1, docIndex: i });
|
|
198
|
+
host1DocumentIds.push(handle.documentId);
|
|
199
|
+
}
|
|
200
|
+
await host1.flush(Context.default());
|
|
201
|
+
|
|
202
|
+
const level2 = await createLevel();
|
|
203
|
+
const host2 = await setupAutomergeHost({ level: level2 });
|
|
204
|
+
for (const i of range(3)) {
|
|
205
|
+
const handle = await host2.createDoc({ host: 2, docIndex: i });
|
|
206
|
+
host2DocumentIds.push(handle.documentId);
|
|
207
|
+
}
|
|
208
|
+
await host2.flush(Context.default());
|
|
209
|
+
await waitForSubductionSave();
|
|
210
|
+
|
|
211
|
+
const network = await new TestReplicationNetwork().open();
|
|
212
|
+
try {
|
|
213
|
+
await host1.addReplicator(Context.default(), await network.createReplicator());
|
|
214
|
+
await host2.addReplicator(Context.default(), await network.createReplicator());
|
|
215
|
+
|
|
216
|
+
const host1CollectionId = 'test-host1-collection';
|
|
217
|
+
await host1.updateLocalCollectionState(host1CollectionId, host1DocumentIds);
|
|
218
|
+
await host2.updateLocalCollectionState(host1CollectionId, host1DocumentIds);
|
|
219
|
+
|
|
220
|
+
for (const documentId of host1DocumentIds) {
|
|
221
|
+
await expect
|
|
222
|
+
.poll(() => host2.getHeads([documentId]), { timeout: 1_000 })
|
|
223
|
+
.toEqual(await host1.getHeads([documentId]));
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
const host2CollectionId = 'test-host2-collection';
|
|
227
|
+
await host1.updateLocalCollectionState(host2CollectionId, host2DocumentIds);
|
|
228
|
+
await host2.updateLocalCollectionState(host2CollectionId, host2DocumentIds);
|
|
229
|
+
|
|
230
|
+
for (const documentId of host2DocumentIds) {
|
|
231
|
+
await expect
|
|
232
|
+
.poll(() => host1.getHeads([documentId]), { timeout: 1_000 })
|
|
233
|
+
.toEqual(await host2.getHeads([documentId]));
|
|
234
|
+
}
|
|
235
|
+
} finally {
|
|
236
|
+
await host1.close();
|
|
237
|
+
await host2.close();
|
|
238
|
+
await network.close();
|
|
239
|
+
}
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
|
|
243
|
+
const createLevel = async (tmpPath?: string) => {
|
|
244
|
+
const level = createTestLevel(tmpPath);
|
|
245
|
+
await openAndClose(level);
|
|
246
|
+
return level;
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const waitForSubductionSave = async () => {
|
|
250
|
+
await sleep(150);
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
const setupAutomergeHost = async ({ level }: { level: LevelDB }) => {
|
|
254
|
+
const host = new AutomergeHost({
|
|
255
|
+
db: level,
|
|
256
|
+
useSubduction: true,
|
|
257
|
+
});
|
|
258
|
+
await host.open();
|
|
259
|
+
onTestFinished(async () => {
|
|
260
|
+
await host.close();
|
|
261
|
+
});
|
|
262
|
+
return host;
|
|
263
|
+
};
|