@dxos/client-services 0.10.0 → 0.11.0
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/dist/lib/chunk-client-services-layer.mjs +11425 -0
- package/dist/lib/chunk-client-services-layer.mjs.map +1 -0
- package/dist/lib/chunk-decorate.mjs +9 -0
- package/dist/lib/index.mjs +731 -0
- package/dist/lib/index.mjs.map +1 -0
- package/dist/lib/packlets/diagnostics/browser-diagnostics-broadcast.mjs +72 -0
- package/dist/lib/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +1 -0
- package/dist/lib/packlets/diagnostics/diagnostics-broadcast.mjs +14 -0
- package/dist/lib/packlets/diagnostics/diagnostics-broadcast.mjs.map +1 -0
- package/dist/lib/packlets/locks/browser.mjs +105 -0
- package/dist/lib/packlets/locks/browser.mjs.map +1 -0
- package/dist/lib/packlets/locks/node.mjs +53 -0
- package/dist/lib/packlets/locks/node.mjs.map +1 -0
- package/dist/lib/testing.mjs +570 -0
- package/dist/lib/testing.mjs.map +1 -0
- package/dist/types/src/index.d.ts +2 -0
- package/dist/types/src/index.d.ts.map +1 -1
- package/dist/types/src/packlets/agents/edge-agent-manager.d.ts +21 -4
- package/dist/types/src/packlets/agents/edge-agent-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/agents/edge-agent-service.d.ts +8 -7
- package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
- package/dist/types/src/packlets/devices/devices-service.d.ts +7 -5
- package/dist/types/src/packlets/devices/devices-service.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/devtools.d.ts +30 -29
- package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/feeds.d.ts +1 -1
- package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/network.d.ts +2 -1
- package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
- package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +2 -2
- package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics-collector.d.ts.map +1 -1
- package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +1 -8
- package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/authenticator.d.ts +1 -1
- package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/contacts-service.d.ts +9 -6
- package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-manager.d.ts +32 -3
- package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +23 -4
- package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity-service.d.ts +15 -20
- package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
- package/dist/types/src/packlets/identity/identity.d.ts +2 -2
- package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts +17 -0
- package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts +25 -4
- package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/invitations/invitations-service.d.ts +11 -11
- package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
- package/dist/types/src/packlets/logging/logging-service.d.ts +14 -12
- package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
- package/dist/types/src/packlets/metadata/index.d.ts +3 -0
- package/dist/types/src/packlets/metadata/index.d.ts.map +1 -0
- package/dist/types/src/packlets/metadata/metadata-store.d.ts +107 -0
- package/dist/types/src/packlets/metadata/metadata-store.d.ts.map +1 -0
- package/dist/types/src/packlets/metadata/metadata-store.test.d.ts +2 -0
- package/dist/types/src/packlets/metadata/metadata-store.test.d.ts.map +1 -0
- package/dist/types/src/packlets/metadata/sqlite-metadata-store.d.ts +65 -0
- package/dist/types/src/packlets/metadata/sqlite-metadata-store.d.ts.map +1 -0
- package/dist/types/src/packlets/network/network-service.d.ts +15 -14
- package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
- package/dist/types/src/packlets/pipeline/codec.d.ts +11 -0
- package/dist/types/src/packlets/pipeline/codec.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/feeds.d.ts +7 -0
- package/dist/types/src/packlets/pipeline/feeds.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/index.d.ts +5 -0
- package/dist/types/src/packlets/pipeline/index.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/message-selector.d.ts +11 -0
- package/dist/types/src/packlets/pipeline/message-selector.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/pipeline-stress.test.d.ts +2 -0
- package/dist/types/src/packlets/pipeline/pipeline-stress.test.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/pipeline.d.ts +131 -0
- package/dist/types/src/packlets/pipeline/pipeline.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/pipeline.test.d.ts +2 -0
- package/dist/types/src/packlets/pipeline/pipeline.test.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/testing/index.d.ts +2 -0
- package/dist/types/src/packlets/pipeline/testing/index.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/testing/test-feed-builder.d.ts +9 -0
- package/dist/types/src/packlets/pipeline/testing/test-feed-builder.d.ts.map +1 -0
- package/dist/types/src/packlets/pipeline/timeframe-clock.d.ts +31 -0
- package/dist/types/src/packlets/pipeline/timeframe-clock.d.ts.map +1 -0
- package/dist/types/src/packlets/services/client-services-layer.d.ts +21 -0
- package/dist/types/src/packlets/services/client-services-layer.d.ts.map +1 -0
- package/dist/types/src/packlets/services/cross-device-space-synchronizer.d.ts +28 -0
- package/dist/types/src/packlets/services/cross-device-space-synchronizer.d.ts.map +1 -0
- package/dist/types/src/packlets/services/effect-rpc.test.d.ts +2 -0
- package/dist/types/src/packlets/services/effect-rpc.test.d.ts.map +1 -0
- package/dist/types/src/packlets/services/feed-syncer.d.ts +22 -2
- package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -1
- package/dist/types/src/packlets/services/index.d.ts +2 -2
- package/dist/types/src/packlets/services/index.d.ts.map +1 -1
- package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-context.d.ts +38 -57
- package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
- package/dist/types/src/packlets/services/service-host.d.ts +82 -31
- package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
- package/dist/types/src/packlets/services/sqlite-storage.d.ts +29 -0
- package/dist/types/src/packlets/services/sqlite-storage.d.ts.map +1 -1
- package/dist/types/src/packlets/services/sqlite-storage.test.d.ts +2 -0
- package/dist/types/src/packlets/services/sqlite-storage.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/admission-discovery-extension.d.ts +30 -0
- package/dist/types/src/packlets/space/admission-discovery-extension.d.ts.map +1 -0
- package/dist/types/src/packlets/space/auth.d.ts +24 -0
- package/dist/types/src/packlets/space/auth.d.ts.map +1 -0
- package/dist/types/src/packlets/space/control-pipeline.d.ts +46 -0
- package/dist/types/src/packlets/space/control-pipeline.d.ts.map +1 -0
- package/dist/types/src/packlets/space/control-pipeline.test.d.ts +2 -0
- package/dist/types/src/packlets/space/control-pipeline.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/index.d.ts +6 -0
- package/dist/types/src/packlets/space/index.d.ts.map +1 -0
- package/dist/types/src/packlets/space/replication.browser.test.d.ts +2 -0
- package/dist/types/src/packlets/space/replication.browser.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space-manager.browser.test.d.ts +2 -0
- package/dist/types/src/packlets/space/space-manager.browser.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space-manager.d.ts +72 -0
- package/dist/types/src/packlets/space/space-manager.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space-protocol.browser.test.d.ts +2 -0
- package/dist/types/src/packlets/space/space-protocol.browser.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space-protocol.d.ts +99 -0
- package/dist/types/src/packlets/space/space-protocol.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space-protocol.test.d.ts +2 -0
- package/dist/types/src/packlets/space/space-protocol.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space.d.ts +65 -0
- package/dist/types/src/packlets/space/space.d.ts.map +1 -0
- package/dist/types/src/packlets/space/space.test.d.ts +2 -0
- package/dist/types/src/packlets/space/space.test.d.ts.map +1 -0
- package/dist/types/src/packlets/space/testing/change-metadata.d.ts +8 -0
- package/dist/types/src/packlets/space/testing/change-metadata.d.ts.map +1 -0
- package/dist/types/src/packlets/space/testing/index.d.ts +4 -0
- package/dist/types/src/packlets/space/testing/index.d.ts.map +1 -0
- package/dist/types/src/packlets/space/testing/test-agent-builder.d.ts +62 -0
- package/dist/types/src/packlets/space/testing/test-agent-builder.d.ts.map +1 -0
- package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts +1 -1
- package/dist/types/src/packlets/space-export/serialized-space-reader.d.ts.map +1 -1
- package/dist/types/src/packlets/space-export/serialized-space-writer.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts +40 -7
- package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts +3 -1
- package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/genesis.d.ts +1 -1
- package/dist/types/src/packlets/spaces/genesis.d.ts.map +1 -1
- package/dist/types/src/packlets/spaces/spaces-service.d.ts +25 -23
- package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
- package/dist/types/src/packlets/storage/level.d.ts.map +1 -1
- package/dist/types/src/packlets/system/system-service.d.ts +18 -18
- package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts +1 -1
- package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
- package/dist/types/src/packlets/testing/test-builder.d.ts +7 -6
- package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
- package/dist/types/src/packlets/worker/worker-runtime.d.ts +41 -58
- package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
- package/dist/types/src/packlets/worker/worker-session.d.ts +21 -8
- package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
- package/dist/types/src/testing/index.d.ts +1 -0
- package/dist/types/src/testing/index.d.ts.map +1 -1
- package/dist/types/src/version.d.ts +1 -1
- package/dist/types/tsconfig.tsbuildinfo +1 -1
- package/package.json +52 -48
- package/src/index.ts +2 -0
- package/src/packlets/agents/edge-agent-manager.ts +56 -15
- package/src/packlets/agents/edge-agent-service.ts +25 -15
- package/src/packlets/devices/devices-service.test.ts +20 -19
- package/src/packlets/devices/devices-service.ts +17 -17
- package/src/packlets/devtools/devtools.ts +133 -75
- package/src/packlets/devtools/feeds.ts +2 -1
- package/src/packlets/devtools/network.ts +42 -12
- package/src/packlets/devtools/spaces.ts +1 -1
- package/src/packlets/diagnostics/diagnostics-broadcast.ts +4 -2
- package/src/packlets/diagnostics/diagnostics-collector.ts +5 -18
- package/src/packlets/diagnostics/diagnostics.ts +0 -11
- package/src/packlets/identity/authenticator.ts +2 -1
- package/src/packlets/identity/contacts-service.ts +46 -37
- package/src/packlets/identity/identity-manager.test.ts +3 -1
- package/src/packlets/identity/identity-manager.ts +73 -5
- package/src/packlets/identity/identity-recovery-manager.ts +56 -7
- package/src/packlets/identity/identity-service.test.ts +27 -18
- package/src/packlets/identity/identity-service.ts +114 -71
- package/src/packlets/identity/identity.test.ts +4 -9
- package/src/packlets/identity/identity.ts +1 -2
- package/src/packlets/invitations/edge-invitation-handler.ts +0 -1
- package/src/packlets/invitations/invitations-handler.ts +39 -3
- package/src/packlets/invitations/invitations-manager.ts +52 -4
- package/src/packlets/invitations/invitations-service.ts +54 -28
- package/src/packlets/logging/logging-service.ts +41 -29
- package/src/packlets/logging/logging.test.ts +28 -15
- package/src/packlets/metadata/index.ts +6 -0
- package/src/packlets/metadata/metadata-store.test.ts +49 -0
- package/src/packlets/metadata/metadata-store.ts +446 -0
- package/src/packlets/metadata/sqlite-metadata-store.ts +409 -0
- package/src/packlets/network/network-service.test.ts +19 -12
- package/src/packlets/network/network-service.ts +96 -29
- package/src/packlets/pipeline/codec.ts +18 -0
- package/src/packlets/pipeline/feeds.ts +22 -0
- package/src/packlets/pipeline/index.ts +8 -0
- package/src/packlets/pipeline/message-selector.ts +35 -0
- package/src/packlets/pipeline/pipeline-stress.test.ts +230 -0
- package/src/packlets/pipeline/pipeline.test.ts +140 -0
- package/src/packlets/pipeline/pipeline.ts +439 -0
- package/src/packlets/pipeline/testing/index.ts +5 -0
- package/src/packlets/pipeline/testing/test-feed-builder.ts +19 -0
- package/src/packlets/pipeline/timeframe-clock.ts +81 -0
- package/src/packlets/services/client-services-layer.ts +186 -0
- package/src/packlets/services/cross-device-space-synchronizer.ts +132 -0
- package/src/packlets/services/effect-rpc.test.ts +314 -0
- package/src/packlets/services/feed-syncer.ts +57 -3
- package/src/packlets/services/index.ts +2 -2
- package/src/packlets/services/platform.ts +0 -6
- package/src/packlets/services/service-context.ts +219 -522
- package/src/packlets/services/service-host.test.ts +34 -11
- package/src/packlets/services/service-host.ts +693 -213
- package/src/packlets/services/spec.md +106 -0
- package/src/packlets/services/sqlite-storage.test.ts +48 -0
- package/src/packlets/services/sqlite-storage.ts +117 -20
- package/src/packlets/space/admission-discovery-extension.ts +91 -0
- package/src/packlets/space/auth.ts +92 -0
- package/src/packlets/space/control-pipeline.test.ts +165 -0
- package/src/packlets/space/control-pipeline.ts +229 -0
- package/src/packlets/space/index.ts +9 -0
- package/src/packlets/space/replication.browser.test.ts +58 -0
- package/src/packlets/space/space-manager.browser.test.ts +40 -0
- package/src/packlets/space/space-manager.ts +224 -0
- package/src/packlets/space/space-protocol.browser.test.ts +129 -0
- package/src/packlets/space/space-protocol.test.ts +158 -0
- package/src/packlets/space/space-protocol.ts +308 -0
- package/src/packlets/space/space.test.ts +181 -0
- package/src/packlets/space/space.ts +196 -0
- package/src/packlets/space/testing/change-metadata.ts +27 -0
- package/src/packlets/space/testing/index.ts +7 -0
- package/src/packlets/space/testing/test-agent-builder.ts +252 -0
- package/src/packlets/space-export/serialized-space-reader.ts +3 -1
- package/src/packlets/space-export/serialized-space-writer.ts +53 -30
- package/src/packlets/space-export/space-archive.test.ts +30 -0
- package/src/packlets/spaces/data-space-manager.test.ts +1 -1
- package/src/packlets/spaces/data-space-manager.ts +148 -33
- package/src/packlets/spaces/data-space.ts +29 -18
- package/src/packlets/spaces/edge-feed-replicator.test.ts +1 -1
- package/src/packlets/spaces/genesis.ts +1 -1
- package/src/packlets/spaces/spaces-service.test.ts +35 -22
- package/src/packlets/spaces/spaces-service.ts +259 -180
- package/src/packlets/storage/level.ts +3 -1
- package/src/packlets/system/system-service.test.ts +31 -13
- package/src/packlets/system/system-service.ts +65 -37
- package/src/packlets/testing/invitation-utils.ts +3 -3
- package/src/packlets/testing/test-builder.ts +35 -20
- package/src/packlets/worker/worker-runtime.ts +222 -260
- package/src/packlets/worker/worker-session.ts +108 -91
- package/src/testing/index.ts +1 -0
- package/src/version.ts +1 -1
- package/dist/lib/browser/chunk-QCWEHHJW.mjs +0 -24
- package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +0 -7
- package/dist/lib/browser/chunk-XJRPB3GA.mjs +0 -22
- package/dist/lib/browser/chunk-XJRPB3GA.mjs.map +0 -7
- package/dist/lib/browser/chunk-XU5R2BMF.mjs +0 -8837
- package/dist/lib/browser/chunk-XU5R2BMF.mjs.map +0 -7
- package/dist/lib/browser/index.mjs +0 -876
- package/dist/lib/browser/index.mjs.map +0 -7
- package/dist/lib/browser/meta.json +0 -1
- package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +0 -88
- package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +0 -7
- package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +0 -11
- package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +0 -7
- package/dist/lib/browser/packlets/locks/browser.mjs +0 -86
- package/dist/lib/browser/packlets/locks/browser.mjs.map +0 -7
- package/dist/lib/browser/packlets/locks/node.mjs +0 -48
- package/dist/lib/browser/packlets/locks/node.mjs.map +0 -7
- package/dist/lib/browser/testing/index.mjs +0 -436
- package/dist/lib/browser/testing/index.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2DT3MZRL.mjs +0 -22
- package/dist/lib/node-esm/chunk-2DT3MZRL.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +0 -24
- package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +0 -7
- package/dist/lib/node-esm/chunk-H5YTUD35.mjs +0 -8837
- package/dist/lib/node-esm/chunk-H5YTUD35.mjs.map +0 -7
- package/dist/lib/node-esm/index.mjs +0 -876
- package/dist/lib/node-esm/index.mjs.map +0 -7
- package/dist/lib/node-esm/meta.json +0 -1
- package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +0 -88
- package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +0 -7
- package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +0 -11
- package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +0 -7
- package/dist/lib/node-esm/packlets/locks/browser.mjs +0 -86
- package/dist/lib/node-esm/packlets/locks/browser.mjs.map +0 -7
- package/dist/lib/node-esm/packlets/locks/node.mjs +0 -48
- package/dist/lib/node-esm/packlets/locks/node.mjs.map +0 -7
- package/dist/lib/node-esm/testing/index.mjs +0 -436
- package/dist/lib/node-esm/testing/index.mjs.map +0 -7
- package/dist/types/src/packlets/services/client-rpc-server.d.ts +0 -24
- package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +0 -1
- package/dist/types/src/packlets/services/service-registry.d.ts +0 -15
- package/dist/types/src/packlets/services/service-registry.d.ts.map +0 -1
- package/dist/types/src/packlets/services/service-registry.test.d.ts +0 -2
- package/dist/types/src/packlets/services/service-registry.test.d.ts.map +0 -1
- package/dist/types/src/testing/setup.d.ts +0 -3
- package/dist/types/src/testing/setup.d.ts.map +0 -1
- package/src/packlets/services/client-rpc-server.ts +0 -111
- package/src/packlets/services/service-registry.test.ts +0 -78
- package/src/packlets/services/service-registry.ts +0 -36
- package/src/testing/setup.ts +0 -11
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, expect, onTestFinished, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { Context } from '@dxos/context';
|
|
8
|
+
import { CredentialGenerator, createCredential } from '@dxos/credentials';
|
|
9
|
+
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
10
|
+
import { Keyring } from '@dxos/keyring';
|
|
11
|
+
import { type PublicKey } from '@dxos/keys';
|
|
12
|
+
import { log } from '@dxos/log';
|
|
13
|
+
import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
14
|
+
import { AdmittedFeed } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
15
|
+
import { StorageType, createStorage } from '@dxos/random-access-storage';
|
|
16
|
+
import { Timeframe } from '@dxos/timeframe';
|
|
17
|
+
|
|
18
|
+
import { MetadataStore } from '../metadata';
|
|
19
|
+
import { valueEncoding } from '../pipeline';
|
|
20
|
+
import { ControlPipeline } from './control-pipeline';
|
|
21
|
+
|
|
22
|
+
describe('space/control-pipeline', () => {
|
|
23
|
+
test('admits feeds', async () => {
|
|
24
|
+
const keyring = new Keyring();
|
|
25
|
+
const spaceKey = await keyring.createKey();
|
|
26
|
+
const identityKey = await keyring.createKey();
|
|
27
|
+
const deviceKey = await keyring.createKey();
|
|
28
|
+
|
|
29
|
+
const feedStore = new FeedStore<FeedMessage>({
|
|
30
|
+
factory: new FeedFactory<FeedMessage>({
|
|
31
|
+
root: createStorage({ type: StorageType.RAM }).createDirectory(),
|
|
32
|
+
signer: keyring,
|
|
33
|
+
hypercore: {
|
|
34
|
+
valueEncoding,
|
|
35
|
+
},
|
|
36
|
+
}),
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
const createFeed = async () => {
|
|
40
|
+
const feedKey = await keyring.createKey();
|
|
41
|
+
return feedStore.openFeed(feedKey, { writable: true });
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
// TODO(dmaretskyi): Separate test for cold start after genesis.
|
|
45
|
+
const genesisFeed = await createFeed();
|
|
46
|
+
const metadata = new MetadataStore(createStorage({ type: StorageType.RAM }).createDirectory());
|
|
47
|
+
await metadata.addSpace({ key: spaceKey, genesisFeedKey: genesisFeed.key, controlFeedKey: genesisFeed.key });
|
|
48
|
+
const controlPipeline = new ControlPipeline({
|
|
49
|
+
spaceKey,
|
|
50
|
+
genesisFeed,
|
|
51
|
+
feedProvider: (key) => feedStore.openFeed(key),
|
|
52
|
+
metadataStore: metadata,
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
const admittedFeeds: PublicKey[] = [];
|
|
56
|
+
controlPipeline.onFeedAdmitted.set(async (info) => {
|
|
57
|
+
log.debug('feed admitted');
|
|
58
|
+
admittedFeeds.push(info.key);
|
|
59
|
+
});
|
|
60
|
+
expect(admittedFeeds).toEqual([]);
|
|
61
|
+
|
|
62
|
+
await controlPipeline.setWriteFeed(genesisFeed);
|
|
63
|
+
await controlPipeline.start(Context.default());
|
|
64
|
+
|
|
65
|
+
onTestFinished(() => controlPipeline.stop());
|
|
66
|
+
|
|
67
|
+
//
|
|
68
|
+
// Genesis
|
|
69
|
+
//
|
|
70
|
+
{
|
|
71
|
+
const generator = new CredentialGenerator(keyring, identityKey, deviceKey);
|
|
72
|
+
const credentials = await generator.createSpaceGenesis(spaceKey, genesisFeed.key);
|
|
73
|
+
expect(credentials).toHaveLength(3);
|
|
74
|
+
|
|
75
|
+
for (const credential of credentials) {
|
|
76
|
+
await controlPipeline.pipeline.writer?.write({
|
|
77
|
+
credential: {
|
|
78
|
+
credential,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
await controlPipeline.pipeline.state.waitUntilTimeframe(controlPipeline.pipeline.state.endTimeframe);
|
|
84
|
+
expect(admittedFeeds).toEqual([genesisFeed.key]);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// New control feed.
|
|
88
|
+
const controlFeed2 = await createFeed();
|
|
89
|
+
{
|
|
90
|
+
await controlPipeline.pipeline.writer!.write({
|
|
91
|
+
credential: {
|
|
92
|
+
credential: await createCredential({
|
|
93
|
+
signer: keyring,
|
|
94
|
+
issuer: identityKey,
|
|
95
|
+
subject: controlFeed2.key,
|
|
96
|
+
assertion: {
|
|
97
|
+
'@type': 'dxos.halo.credentials.AdmittedFeed',
|
|
98
|
+
spaceKey,
|
|
99
|
+
identityKey,
|
|
100
|
+
deviceKey,
|
|
101
|
+
'designation': AdmittedFeed.Designation.CONTROL,
|
|
102
|
+
},
|
|
103
|
+
}),
|
|
104
|
+
},
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
await controlPipeline.pipeline.state.waitUntilTimeframe(controlPipeline.pipeline.state.endTimeframe);
|
|
108
|
+
expect(admittedFeeds).toEqual([genesisFeed.key, controlFeed2.key]);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// New data feed.
|
|
112
|
+
const dataFeed1 = await createFeed();
|
|
113
|
+
{
|
|
114
|
+
await controlPipeline.pipeline.writer!.write({
|
|
115
|
+
credential: {
|
|
116
|
+
credential: await createCredential({
|
|
117
|
+
signer: keyring,
|
|
118
|
+
issuer: identityKey,
|
|
119
|
+
subject: dataFeed1.key,
|
|
120
|
+
assertion: {
|
|
121
|
+
'@type': 'dxos.halo.credentials.AdmittedFeed',
|
|
122
|
+
spaceKey,
|
|
123
|
+
identityKey,
|
|
124
|
+
deviceKey,
|
|
125
|
+
'designation': AdmittedFeed.Designation.DATA,
|
|
126
|
+
},
|
|
127
|
+
}),
|
|
128
|
+
},
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
const end = controlPipeline.pipeline.state.endTimeframe;
|
|
132
|
+
await controlPipeline.pipeline.state.waitUntilTimeframe(end);
|
|
133
|
+
expect(admittedFeeds).toEqual([genesisFeed.key, controlFeed2.key, dataFeed1.key]);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// TODO(dmaretskyi): Move to other test (data feed cannot admit feeds).
|
|
137
|
+
const dataFeed2 = await createFeed();
|
|
138
|
+
{
|
|
139
|
+
await dataFeed1.append({
|
|
140
|
+
payload: {
|
|
141
|
+
'@type': 'dxos.echo.feed.FeedMessage',
|
|
142
|
+
'timeframe': controlPipeline.pipeline.state.timeframe,
|
|
143
|
+
'credential': {
|
|
144
|
+
credential: await createCredential({
|
|
145
|
+
signer: keyring,
|
|
146
|
+
issuer: identityKey,
|
|
147
|
+
subject: dataFeed2.key,
|
|
148
|
+
assertion: {
|
|
149
|
+
'@type': 'dxos.halo.credentials.AdmittedFeed',
|
|
150
|
+
spaceKey,
|
|
151
|
+
identityKey,
|
|
152
|
+
deviceKey,
|
|
153
|
+
'designation': AdmittedFeed.Designation.DATA,
|
|
154
|
+
},
|
|
155
|
+
}),
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
timeframe: new Timeframe(),
|
|
159
|
+
});
|
|
160
|
+
|
|
161
|
+
await controlPipeline.pipeline.state.waitUntilTimeframe(controlPipeline.pipeline.state.endTimeframe);
|
|
162
|
+
expect(admittedFeeds).toEqual([genesisFeed.key, controlFeed2.key, dataFeed1.key]);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { DeferredTask, scheduleMicroTask, sleepWithContext, trackLeaks } from '@dxos/async';
|
|
6
|
+
import { Context } from '@dxos/context';
|
|
7
|
+
import {
|
|
8
|
+
type DelegateInvitationCredential,
|
|
9
|
+
type FeedInfo,
|
|
10
|
+
type MemberInfo,
|
|
11
|
+
type SpaceState,
|
|
12
|
+
SpaceStateMachine,
|
|
13
|
+
} from '@dxos/credentials';
|
|
14
|
+
import { type FeedWrapper } from '@dxos/feed-store';
|
|
15
|
+
import { PublicKey } from '@dxos/keys';
|
|
16
|
+
import { log } from '@dxos/log';
|
|
17
|
+
import { type FeedMessageBlock } from '@dxos/protocols';
|
|
18
|
+
import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
19
|
+
import { type ControlPipelineSnapshot } from '@dxos/protocols/proto/dxos/echo/metadata';
|
|
20
|
+
import { AdmittedFeed, type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
|
|
21
|
+
import { Timeframe } from '@dxos/timeframe';
|
|
22
|
+
import { trace } from '@dxos/tracing';
|
|
23
|
+
import { type AsyncCallback, Callback, tracer } from '@dxos/util';
|
|
24
|
+
|
|
25
|
+
import { type IMetadataStore } from '../metadata';
|
|
26
|
+
import { Pipeline, type PipelineAccessor } from '../pipeline';
|
|
27
|
+
|
|
28
|
+
export type ControlPipelineProps = {
|
|
29
|
+
spaceKey: PublicKey;
|
|
30
|
+
genesisFeed: FeedWrapper<FeedMessage>;
|
|
31
|
+
feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;
|
|
32
|
+
metadataStore: IMetadataStore;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;
|
|
36
|
+
|
|
37
|
+
const CONTROL_PIPELINE_SNAPSHOT_DELAY = 10_000;
|
|
38
|
+
|
|
39
|
+
const USE_SNAPSHOTS = true;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Processes HALO credentials, which include genesis and invitations.
|
|
43
|
+
*/
|
|
44
|
+
@trackLeaks('start', 'stop')
|
|
45
|
+
export class ControlPipeline {
|
|
46
|
+
private readonly _ctx = new Context();
|
|
47
|
+
private readonly _pipeline: Pipeline;
|
|
48
|
+
private readonly _spaceStateMachine: SpaceStateMachine;
|
|
49
|
+
|
|
50
|
+
private readonly _spaceKey: PublicKey;
|
|
51
|
+
private readonly _metadata: IMetadataStore;
|
|
52
|
+
private _targetTimeframe?: Timeframe;
|
|
53
|
+
private _lastTimeframeSaveTime: number = Date.now();
|
|
54
|
+
|
|
55
|
+
public readonly onFeedAdmitted = new Callback<AsyncCallback<FeedInfo>>();
|
|
56
|
+
public readonly onMemberRoleChanged: Callback<AsyncCallback<MemberInfo[]>>;
|
|
57
|
+
public readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;
|
|
58
|
+
public readonly onDelegatedInvitation: Callback<AsyncCallback<DelegateInvitationCredential>>;
|
|
59
|
+
public readonly onDelegatedInvitationRemoved: Callback<AsyncCallback<DelegateInvitationCredential>>;
|
|
60
|
+
|
|
61
|
+
private _snapshotTask = new DeferredTask(this._ctx, async () => {
|
|
62
|
+
await sleepWithContext(this._ctx, CONTROL_PIPELINE_SNAPSHOT_DELAY);
|
|
63
|
+
await this._saveSnapshot();
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineProps) {
|
|
67
|
+
this._spaceKey = spaceKey;
|
|
68
|
+
this._metadata = metadataStore;
|
|
69
|
+
this._pipeline = new Pipeline();
|
|
70
|
+
void this._pipeline.addFeed(genesisFeed); // TODO(burdon): Require async open/close?
|
|
71
|
+
|
|
72
|
+
this._spaceStateMachine = new SpaceStateMachine(spaceKey);
|
|
73
|
+
this._spaceStateMachine.onFeedAdmitted.set(async (info) => {
|
|
74
|
+
// log('feed admitted', { info });
|
|
75
|
+
log('feed admitted', { key: info.key });
|
|
76
|
+
|
|
77
|
+
// TODO(burdon): Check not stopping.
|
|
78
|
+
if (info.assertion.designation === AdmittedFeed.Designation.CONTROL && !info.key.equals(genesisFeed.key)) {
|
|
79
|
+
scheduleMicroTask(this._ctx, async () => {
|
|
80
|
+
try {
|
|
81
|
+
const feed = await feedProvider(info.key);
|
|
82
|
+
if (this._ctx.disposed) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
if (!this._pipeline.hasFeed(feed.key)) {
|
|
86
|
+
await this._pipeline.addFeed(feed);
|
|
87
|
+
}
|
|
88
|
+
} catch (err: any) {
|
|
89
|
+
log.catch(err);
|
|
90
|
+
}
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
await this.onFeedAdmitted.callIfSet(info);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
this.onMemberRoleChanged = this._spaceStateMachine.onMemberRoleChanged;
|
|
98
|
+
this.onCredentialProcessed = this._spaceStateMachine.onCredentialProcessed;
|
|
99
|
+
this.onDelegatedInvitation = this._spaceStateMachine.onDelegatedInvitation;
|
|
100
|
+
this.onDelegatedInvitationRemoved = this._spaceStateMachine.onDelegatedInvitationRemoved;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
get spaceState(): SpaceState {
|
|
104
|
+
return this._spaceStateMachine;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
get pipeline(): PipelineAccessor {
|
|
108
|
+
return this._pipeline;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
async setWriteFeed(feed: FeedWrapper<FeedMessage>): Promise<void> {
|
|
112
|
+
await this._pipeline.addFeed(feed);
|
|
113
|
+
this._pipeline.setWriteFeed(feed);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
@trace.span({ showInBrowserTimeline: true, op: 'lifecycle' })
|
|
117
|
+
async start(ctx: Context): Promise<void> {
|
|
118
|
+
const snapshot = this._metadata.getSpaceControlPipelineSnapshot(this._spaceKey);
|
|
119
|
+
log('load snapshot', { key: this._spaceKey, present: !!snapshot, tf: snapshot?.timeframe });
|
|
120
|
+
if (USE_SNAPSHOTS && snapshot) {
|
|
121
|
+
await this._processSnapshot(snapshot);
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
log('starting...');
|
|
125
|
+
setTimeout(async () => {
|
|
126
|
+
void this._consumePipeline(ctx);
|
|
127
|
+
});
|
|
128
|
+
|
|
129
|
+
await this._pipeline.start();
|
|
130
|
+
log('started');
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
private async _processSnapshot(snapshot: ControlPipelineSnapshot): Promise<void> {
|
|
134
|
+
await this._pipeline.setCursor(snapshot.timeframe);
|
|
135
|
+
|
|
136
|
+
for (const message of snapshot.messages ?? []) {
|
|
137
|
+
const result = await this._spaceStateMachine.process(message.credential, {
|
|
138
|
+
sourceFeed: message.feedKey,
|
|
139
|
+
skipVerification: true,
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
if (!result) {
|
|
143
|
+
log.warn('credential processing failed from snapshot', { message });
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
private async _saveSnapshot(): Promise<void> {
|
|
149
|
+
await this._pipeline.pause();
|
|
150
|
+
const snapshot: ControlPipelineSnapshot = {
|
|
151
|
+
timeframe: this._pipeline.state.timeframe,
|
|
152
|
+
messages: this._spaceStateMachine.credentialEntries.map((entry) => ({
|
|
153
|
+
feedKey: entry.sourceFeed,
|
|
154
|
+
credential: entry.credential,
|
|
155
|
+
})),
|
|
156
|
+
};
|
|
157
|
+
await this._pipeline.unpause();
|
|
158
|
+
|
|
159
|
+
log('save snapshot', { key: this._spaceKey, snapshot: getSnapshotLoggerContext(snapshot) });
|
|
160
|
+
await this._metadata.setSpaceControlPipelineSnapshot(this._spaceKey, snapshot);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
private async _consumePipeline(ctx: Context): Promise<void> {
|
|
164
|
+
for await (const msg of this._pipeline.consume()) {
|
|
165
|
+
try {
|
|
166
|
+
await this._processMessage(ctx, msg);
|
|
167
|
+
} catch (err: any) {
|
|
168
|
+
log.catch(err);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
@trace.span({ showInBrowserTimeline: true, showInRemoteTracing: false })
|
|
174
|
+
private async _processMessage(ctx: Context, msg: FeedMessageBlock): Promise<void> {
|
|
175
|
+
log('processing', { key: msg.feedKey, seq: msg.seq });
|
|
176
|
+
if (msg.data.payload.credential) {
|
|
177
|
+
const timer = tracer.mark('dxos.echo.pipeline.control');
|
|
178
|
+
const result = await this._spaceStateMachine.process(msg.data.payload.credential.credential, {
|
|
179
|
+
sourceFeed: PublicKey.from(msg.feedKey),
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
timer.end();
|
|
183
|
+
if (!result) {
|
|
184
|
+
log.warn('processing failed', { msg });
|
|
185
|
+
} else {
|
|
186
|
+
await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
this._snapshotTask.schedule();
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
private async _noteTargetStateIfNeeded(timeframe: Timeframe): Promise<void> {
|
|
194
|
+
// TODO(dmaretskyi): Replace this with a proper debounce/throttle.
|
|
195
|
+
|
|
196
|
+
if (Date.now() - this._lastTimeframeSaveTime > TIMEFRAME_SAVE_DEBOUNCE_INTERVAL) {
|
|
197
|
+
this._lastTimeframeSaveTime = Date.now();
|
|
198
|
+
|
|
199
|
+
await this._saveTargetTimeframe(timeframe);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
async stop(): Promise<void> {
|
|
204
|
+
log('stopping...');
|
|
205
|
+
await this._ctx.dispose();
|
|
206
|
+
await this._pipeline.stop();
|
|
207
|
+
await this._saveTargetTimeframe(this._pipeline.state.timeframe);
|
|
208
|
+
log('stopped');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
private async _saveTargetTimeframe(timeframe: Timeframe): Promise<void> {
|
|
212
|
+
try {
|
|
213
|
+
const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);
|
|
214
|
+
await this._metadata.setSpaceControlLatestTimeframe(this._spaceKey, newTimeframe);
|
|
215
|
+
this._targetTimeframe = newTimeframe;
|
|
216
|
+
} catch (err: any) {
|
|
217
|
+
log(err);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
const getSnapshotLoggerContext = (snapshot: ControlPipelineSnapshot) => {
|
|
223
|
+
return snapshot.messages?.map((msg) => {
|
|
224
|
+
const issuer = msg.credential.issuer;
|
|
225
|
+
const subject = msg.credential.subject.id;
|
|
226
|
+
const type = msg.credential.subject.assertion['@type'];
|
|
227
|
+
return { issuer, subject, type };
|
|
228
|
+
});
|
|
229
|
+
};
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2021 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, expect, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { FeedFactory, FeedStore } from '@dxos/feed-store';
|
|
8
|
+
import { Keyring } from '@dxos/keyring';
|
|
9
|
+
import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
10
|
+
import { createStorage } from '@dxos/random-access-storage';
|
|
11
|
+
import { Timeframe } from '@dxos/timeframe';
|
|
12
|
+
|
|
13
|
+
import { valueEncoding } from '../pipeline';
|
|
14
|
+
|
|
15
|
+
describe('replication', () => {
|
|
16
|
+
test('replicates a feed through a direct stream', async () => {
|
|
17
|
+
// Some storage drivers may break when there are multiple storage instances.
|
|
18
|
+
const storage = createStorage();
|
|
19
|
+
|
|
20
|
+
// Creates an appropriate persistent storage for the browser: IDB in Chrome or File storage in Firefox.
|
|
21
|
+
const keyring1 = new Keyring();
|
|
22
|
+
const feedStore1 = new FeedStore<FeedMessage>({
|
|
23
|
+
factory: new FeedFactory<FeedMessage>({
|
|
24
|
+
root: storage.createDirectory('feeds1'),
|
|
25
|
+
signer: keyring1,
|
|
26
|
+
hypercore: {
|
|
27
|
+
valueEncoding,
|
|
28
|
+
},
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
const keyring2 = new Keyring();
|
|
33
|
+
const feedStore2 = new FeedStore<FeedMessage>({
|
|
34
|
+
factory: new FeedFactory<FeedMessage>({
|
|
35
|
+
root: storage.createDirectory('feeds2'),
|
|
36
|
+
signer: keyring2,
|
|
37
|
+
hypercore: {
|
|
38
|
+
valueEncoding,
|
|
39
|
+
},
|
|
40
|
+
}),
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const feed1 = await feedStore1.openFeed(await keyring1.createKey(), {
|
|
44
|
+
writable: true,
|
|
45
|
+
});
|
|
46
|
+
const feed2 = await feedStore2.openFeed(feed1.key);
|
|
47
|
+
|
|
48
|
+
const stream1 = feed1.replicate(true, { live: true, noise: false, encrypted: false });
|
|
49
|
+
const stream2 = feed2.replicate(false, { live: true, noise: false, encrypted: false });
|
|
50
|
+
stream1.pipe(stream2).pipe(stream1);
|
|
51
|
+
|
|
52
|
+
await feed1.append({
|
|
53
|
+
timeframe: new Timeframe([[feed1.key, 123]]),
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
await expect.poll(() => feed2.properties.length).toEqual(1);
|
|
57
|
+
});
|
|
58
|
+
});
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
//
|
|
2
|
+
// Copyright 2022 DXOS.org
|
|
3
|
+
//
|
|
4
|
+
|
|
5
|
+
import { describe, onTestFinished, test } from 'vitest';
|
|
6
|
+
|
|
7
|
+
import { createStorage } from '@dxos/random-access-storage';
|
|
8
|
+
|
|
9
|
+
import { TestAgentBuilder } from './testing';
|
|
10
|
+
|
|
11
|
+
describe('space-manager', () => {
|
|
12
|
+
test.skip('invitations', async () => {
|
|
13
|
+
const builder = new TestAgentBuilder({
|
|
14
|
+
storage: createStorage(),
|
|
15
|
+
});
|
|
16
|
+
onTestFinished(async () => {
|
|
17
|
+
await builder.close();
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
const peer1 = await builder.createPeer();
|
|
21
|
+
const spaceManager1 = peer1.spaceManager;
|
|
22
|
+
await spaceManager1.open();
|
|
23
|
+
|
|
24
|
+
const peer2 = await builder.createPeer();
|
|
25
|
+
const spaceManager2 = peer2.spaceManager;
|
|
26
|
+
await spaceManager2.open();
|
|
27
|
+
|
|
28
|
+
onTestFinished(() => spaceManager1.close());
|
|
29
|
+
onTestFinished(() => spaceManager2.close());
|
|
30
|
+
|
|
31
|
+
// const space1 = await spaceManager1.createSpace();
|
|
32
|
+
// expect(space1.isOpen).to.be.true;
|
|
33
|
+
|
|
34
|
+
// TODO(burdon): Create invitation and join.
|
|
35
|
+
// TODO(burdon): Need to factor out DataInvitations from services.
|
|
36
|
+
|
|
37
|
+
// const space2 = await spaceManager2.acceptSpace();
|
|
38
|
+
// expect(space2.key).not.to.be.undefined;
|
|
39
|
+
});
|
|
40
|
+
});
|