@dxos/client-services 0.10.0 → 0.11.1
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 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/packlets/storage/util.ts","../../src/packlets/storage/storage.ts","../../src/packlets/storage/level.ts","../../src/packlets/storage/profile-archive.ts","../../src/packlets/storage/profile-archive-sqlite.ts","../../src/packlets/worker/worker-session.ts","../../src/packlets/worker/worker-runtime.ts","../../src/index.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport { DX_DATA } from '@dxos/client-protocol';\nimport { Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { isNode } from '@dxos/util';\n\nexport const getRootPath = (config: Runtime.Client.Storage) => {\n const { dataRoot = isNode() ? DX_DATA : 'dxos/storage' } = config ?? {};\n return `${dataRoot}/`;\n};\n\nexport const isPersistent = (config: Runtime.Client.Storage) => {\n const { persistent = false } = config ?? {};\n return (\n (config.dataStore !== undefined && config.dataStore !== Runtime.Client.Storage.StorageDriver.RAM) || persistent\n );\n};\n","//\n// Copyright 2023 DXOS.org\n//\n\nimport { InvalidConfigError } from '@dxos/protocols';\nimport { Runtime } from '@dxos/protocols/proto/dxos/config';\nimport { StorageType, createStorage } from '@dxos/random-access-storage';\n\nimport { getRootPath } from './util';\n\nimport StorageDriver = Runtime.Client.Storage.StorageDriver;\n\n// TODO(burdon): Factor out.\nexport const createStorageObjects = (config: Runtime.Client.Storage) => {\n const { persistent = false, keyStore, dataStore } = config ?? {};\n if (persistent && dataStore === StorageDriver.RAM) {\n throw new InvalidConfigError({ message: 'RAM storage cannot be used in persistent mode.' });\n }\n if (!persistent && dataStore !== undefined && dataStore !== StorageDriver.RAM) {\n throw new InvalidConfigError({ message: 'Cannot use a persistent storage in not persistent mode.' });\n }\n if (persistent && keyStore === StorageDriver.RAM) {\n throw new InvalidConfigError({ message: 'RAM key storage cannot be used in persistent mode.' });\n }\n if (!persistent && keyStore !== StorageDriver.RAM && keyStore !== undefined) {\n throw new InvalidConfigError({ message: 'Cannot use a persistent key storage in not persistent mode.' });\n }\n\n return {\n storage: createStorage({\n type: persistent ? toStorageType(dataStore) : StorageType.RAM,\n root: getRootPath(config),\n }),\n };\n};\n\nconst toStorageType = (type: StorageDriver | undefined): StorageType | undefined => {\n switch (type) {\n case undefined:\n return undefined;\n case StorageDriver.RAM:\n return StorageType.RAM;\n case StorageDriver.CHROME:\n return StorageType.CHROME;\n case StorageDriver.FIREFOX:\n return StorageType.FIREFOX;\n case StorageDriver.IDB:\n return StorageType.IDB;\n case StorageDriver.NODE:\n return StorageType.NODE;\n case StorageDriver.WEBFS:\n return StorageType.WEBFS;\n default:\n throw new Error(`Invalid storage type: ${StorageDriver[type]}`);\n }\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport path from 'node:path';\n\nimport { PublicKey } from '@dxos/keys';\nimport { type Runtime } from '@dxos/protocols/proto/dxos/config';\n\nimport { getRootPath, isPersistent } from './util';\n\nexport const createLevel = async (config: Runtime.Client.Storage) => {\n // Imported here rather than at module scope so that this barrel, which the client pulls in on every\n // startup, does not bind `level`'s native addon — a compiled binary cannot carry one.\n const { createLevel: createKV } = await import('@dxos/kv-store/level');\n const persistent = isPersistent(config);\n const storagePath = persistent ? path.join(getRootPath(config), 'level') : `/tmp/dxos-${PublicKey.random().toHex()}`;\n const level = createKV(storagePath);\n // TODO(dmaretskyi): This function shouldn't call open - .\n await level.open();\n return level;\n};\n","//\n// Copyright 2024 DXOS.org\n//\n\nimport { cbor } from '@automerge/automerge-repo';\n\nimport { invariant } from '@dxos/invariant';\nimport type { LevelDB } from '@dxos/kv-store';\nimport { log } from '@dxos/log';\nimport { type ProfileArchive, ProfileArchiveEntryType } from '@dxos/protocols';\nimport type { Storage } from '@dxos/random-access-storage';\nimport { arrayToBuffer } from '@dxos/util';\n\nexport const encodeProfileArchive = (profile: ProfileArchive): Uint8Array => cbor.encode(profile);\n\nexport const decodeProfileArchive = (data: Uint8Array): ProfileArchive => cbor.decode(data);\n\nexport const exportProfileData = async ({\n storage,\n level,\n}: {\n storage: Storage;\n level: LevelDB;\n}): Promise<ProfileArchive> => {\n const archive: ProfileArchive = { storage: [], meta: { timestamp: new Date().toISOString() } };\n\n {\n const directory = await storage.createDirectory();\n const files = await directory.list();\n\n log.info('begin exporting files', { count: files.length });\n for (const filename of files) {\n const file = await directory.getOrCreateFile(filename);\n const { size } = await file.stat();\n const data = await file.read(0, size);\n archive.storage.push({\n type: ProfileArchiveEntryType.FILE,\n key: filename,\n value: data,\n });\n }\n log.info('done exporting files', { count: files.length });\n }\n\n {\n log.info('begin exporting kv pairs');\n const iter = await level.iterator<Uint8Array, Uint8Array>({ keyEncoding: 'binary', valueEncoding: 'binary' });\n let count = 0;\n for await (const [key, value] of iter) {\n archive.storage.push({\n type: ProfileArchiveEntryType.KEY_VALUE,\n key,\n value,\n });\n count++;\n }\n log.info('done exporting kv pairs', { count });\n }\n\n return archive;\n};\n\nexport const importProfileData = async (\n {\n storage,\n level,\n }: {\n storage: Storage;\n level: LevelDB;\n },\n archive: ProfileArchive,\n): Promise<void> => {\n let batch = level.batch();\n\n let count = 0;\n for (const entry of archive.storage) {\n switch (entry.type) {\n case ProfileArchiveEntryType.FILE: {\n const directory = await storage.createDirectory();\n invariant(typeof entry.key === 'string', 'Invalid key type');\n const file = await directory.getOrCreateFile(entry.key);\n invariant(entry.value instanceof Uint8Array, 'Invalid value type');\n await file.write(0, arrayToBuffer(entry.value));\n await file.close();\n break;\n }\n case ProfileArchiveEntryType.KEY_VALUE: {\n invariant(entry.key instanceof Uint8Array, 'Invalid key type');\n invariant(entry.value instanceof Uint8Array, 'Invalid value type');\n batch.put(entry.key, entry.value, { keyEncoding: 'binary', valueEncoding: 'binary' });\n break;\n }\n case ProfileArchiveEntryType.SQLITE_DATABASE:\n log.warn('Skipping SQLITE_DATABASE entry (import via OPFS recovery API)', { key: entry.key });\n break;\n default:\n throw new Error(`Invalid entry type: ${entry.type}`);\n }\n\n if (++count % 1000 === 0) {\n // Apparently indexedDB can't handle big batches.\n await batch.write();\n batch = level.batch();\n\n log.info('importing', {\n count,\n total: archive.storage.length,\n progress: `${((count / archive.storage.length) * 100).toFixed()}%`,\n });\n }\n }\n\n log.info('committing changes..');\n await batch.write();\n};\n","//\n// Copyright 2026 DXOS.org\n//\n\nimport { type ProfileArchive, ProfileArchiveEntryType } from '@dxos/protocols';\n\n/** Default OPFS SQLite database name used by Composer recovery and the OPFS worker. */\nexport const OPFS_SQLITE_DB_FILENAME = 'DXOS' as const;\n\nconst SQLITE_MAGIC = new TextEncoder().encode('SQLite format 3\\u0000');\n\n/**\n * Returns true when `bytes` begins with the SQLite 3 file header.\n */\nexport const isValidSqliteDatabase = (bytes: Uint8Array): boolean => {\n if (bytes.byteLength < SQLITE_MAGIC.byteLength) {\n return false;\n }\n for (let index = 0; index < SQLITE_MAGIC.byteLength; index++) {\n if (bytes[index] !== SQLITE_MAGIC[index]) {\n return false;\n }\n }\n return true;\n};\n\nconst coerceToUint8Array = (value: unknown): Uint8Array | undefined => {\n if (value instanceof Uint8Array) {\n return value;\n }\n if (value instanceof ArrayBuffer) {\n return new Uint8Array(value);\n }\n if (Array.isArray(value)) {\n return new Uint8Array(value);\n }\n return undefined;\n};\n\nexport type SqliteProfileEntry = {\n opfsFilename: string;\n database: Uint8Array;\n};\n\nexport type CreateSqliteProfileArchiveOptions = {\n /** Host where the export was created (stored in archive meta). */\n origin?: string;\n};\n\n/**\n * Build a profile archive containing a single validated SQLITE_DATABASE entry.\n */\nexport const createSqliteProfileArchive = (\n opfsFilename: string,\n database: Uint8Array,\n options?: CreateSqliteProfileArchiveOptions,\n): ProfileArchive => {\n if (!isValidSqliteDatabase(database)) {\n throw new Error('Invalid SQLite database (missing SQLite format 3 header)');\n }\n\n return {\n meta: {\n timestamp: new Date().toISOString(),\n ...(options?.origin ? { origin: options.origin } : {}),\n },\n storage: [\n {\n type: ProfileArchiveEntryType.SQLITE_DATABASE,\n key: opfsFilename,\n value: database,\n },\n ],\n };\n};\n\n/**\n * Extract validated SQLITE_DATABASE entries from a profile archive.\n */\nexport const getSqliteProfileEntries = (archive: ProfileArchive): SqliteProfileEntry[] => {\n const entries: SqliteProfileEntry[] = [];\n\n for (const entry of archive.storage) {\n if (entry.type !== ProfileArchiveEntryType.SQLITE_DATABASE) {\n continue;\n }\n if (typeof entry.key !== 'string') {\n continue;\n }\n\n const database = coerceToUint8Array(entry.value);\n if (!database || !isValidSqliteDatabase(database)) {\n continue;\n }\n\n entries.push({ opfsFilename: entry.key, database });\n }\n\n return entries;\n};\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport type * as RpcClient from '@effect/rpc/RpcClient';\nimport type * as RpcServer from '@effect/rpc/RpcServer';\nimport * as Effect from 'effect/Effect';\n\nimport { Trigger } from '@dxos/async';\nimport { ClientRpcServer, PROXY_CONNECTION_TIMEOUT, makeBridgeServiceClientOverProtocol } from '@dxos/client-protocol';\nimport { EffectEx } from '@dxos/effect';\nimport { log, logInfo } from '@dxos/log';\nimport { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { type WorkerService } from '@dxos/protocols/rpc';\nimport { Callback, type MaybePromise } from '@dxos/util';\n\nimport { type ClientServicesHost } from '../services';\n\nexport type WorkerSessionProps = {\n serviceHost: ClientServicesHost;\n /**\n * Reverse-direction (worker→tab) protocol serving the tab's {@link BridgeService} (WebRTC transport)\n * over effect-rpc. The worker is the client; the tab is the runner.\n */\n systemProtocol: RpcClient.Protocol['Type'];\n /**\n * Forward-direction (tab→worker) protocol over which the worker serves the client services.\n */\n appProtocol: RpcServer.Protocol['Type'];\n // TODO(wittjosiah): Remove shellPort.\n shellPort?: MessagePort;\n readySignal: Trigger<Error | undefined>;\n};\n\n/**\n * Represents a tab connection within the worker.\n *\n * The session holds imperative per-connection transport state (RPC servers, the WebRTC bridge client);\n * its lifecycle is driven by {@link WorkerRuntime} through the {@link open} / {@link close} Effects.\n */\nexport class WorkerSession {\n private readonly _clientRpc: ClientRpcServer;\n private readonly _shellClientRpc?: ClientRpcServer;\n private readonly _startTrigger = new Trigger();\n private readonly _serviceHost: ClientServicesHost;\n private readonly _systemProtocol: RpcClient.Protocol['Type'];\n #closeBridge?: () => Promise<void>;\n\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n @logInfo\n public lockKey?: string;\n\n public bridgeService?: BridgeService;\n\n // Per-session `WorkerService` control handlers, served over the app port alongside the client\n // services (both run tab→worker). `start` conveys the tab origin / liveness lock and releases the\n // gate below; `stop` tears the session down.\n readonly #workerServiceHandlers: WorkerService.Handlers = {\n 'WorkerService.start': (payload) =>\n Effect.sync(() => {\n this.origin = payload.origin;\n this.lockKey = payload.lockKey;\n this._startTrigger.wake();\n }),\n 'WorkerService.stop': () =>\n // Close on the next tick (forked) so the RPC response is delivered before the transport tears down.\n Effect.forkDaemon(\n Effect.gen(this, function* () {\n yield* Effect.async<void>((resume) => {\n setTimeout(() => resume(Effect.void));\n });\n yield* this.close();\n }).pipe(Effect.tapErrorCause((cause) => Effect.sync(() => log.catch(cause)))),\n ).pipe(Effect.asVoid),\n };\n\n constructor({ serviceHost, systemProtocol, appProtocol, shellPort, readySignal }: WorkerSessionProps) {\n this._serviceHost = serviceHost;\n this._systemProtocol = systemProtocol;\n\n // Hold requests until the worker runtime is ready; propagate startup errors to callers.\n const onRequest = async () => {\n const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n if (error) {\n throw error;\n }\n };\n\n const services = () => ({\n ...this._serviceHost.services,\n WorkerService: this.#workerServiceHandlers,\n });\n\n this._clientRpc = new ClientRpcServer({\n services,\n protocol: appProtocol,\n onRequest,\n });\n\n this._shellClientRpc = shellPort\n ? new ClientRpcServer({\n services,\n port: shellPort,\n onRequest,\n })\n : undefined;\n }\n\n open(): Effect.Effect<void> {\n return Effect.gen(this, function* () {\n log('opening...');\n // The tab serves the WebRTC `BridgeService` on the reverse channel; build a client the worker's\n // network stack can proxy through.\n const { bridgeService, close } = yield* Effect.promise(() =>\n makeBridgeServiceClientOverProtocol(this._systemProtocol),\n );\n this.bridgeService = bridgeService;\n this.#closeBridge = close;\n\n yield* Effect.promise(() => Promise.all([this._clientRpc.open(), this._maybeOpenShell()]));\n\n // Wait until the tab calls `WorkerService.start` (conveys origin + liveness lock).\n yield* Effect.promise(() => this._startTrigger.wait({ timeout: PROXY_CONNECTION_TIMEOUT }));\n\n if (this.lockKey) {\n void this._afterLockReleases(this.lockKey, () =>\n EffectEx.runPromise(this.close()).catch((err) => log.catch(err)),\n );\n }\n\n log('opened');\n });\n }\n\n close(): Effect.Effect<void> {\n return Effect.gen(this, function* () {\n log.debug('closing...');\n yield* Effect.promise(async () => {\n try {\n await this.onClose.callIfSet();\n } catch (err: any) {\n log.catch(err);\n }\n });\n\n yield* Effect.promise(() =>\n Promise.all([this._clientRpc.close(), this._shellClientRpc?.close(), this.#closeBridge?.()]),\n );\n this.bridgeService = undefined;\n this.#closeBridge = undefined;\n log.debug('closed');\n });\n }\n\n private async _maybeOpenShell(): Promise<void> {\n try {\n this._shellClientRpc && (await this._shellClientRpc.open());\n } catch {\n log.info('No shell connected.');\n }\n }\n\n private _afterLockReleases(lockKey: string, callback: () => MaybePromise<void>): Promise<void> {\n return navigator.locks\n .request(lockKey, () => {\n // No-op.\n })\n .then(callback);\n }\n}\n","//\n// Copyright 2022 DXOS.org\n//\n\nimport * as Reactivity from '@effect/experimental/Reactivity';\nimport type * as RpcClient from '@effect/rpc/RpcClient';\nimport type * as RpcServer from '@effect/rpc/RpcServer';\nimport type * as SqlClient from '@effect/sql/SqlClient';\nimport * as Context_ from 'effect/Context';\nimport * as Effect from 'effect/Effect';\nimport * as Exit from 'effect/Exit';\nimport * as Layer from 'effect/Layer';\nimport * as ManagedRuntime from 'effect/ManagedRuntime';\nimport * as Scope from 'effect/Scope';\n\nimport { Trigger } from '@dxos/async';\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { EffectEx } from '@dxos/effect';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, setIdentityTags } from '@dxos/messaging';\nimport { RtcTransportProxyFactory } from '@dxos/network-manager';\nimport { makeInProcessClient } from '@dxos/protocols';\nimport { DevicesService, IdentityService } from '@dxos/protocols/rpc';\nimport * as SqlExport from '@dxos/sql-sqlite/SqlExport';\nimport * as SqliteClient from '@dxos/sql-sqlite/SqliteClient';\nimport * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { ClientServicesHost } from '../services';\nimport { WorkerSession } from './worker-session';\n\n// Session transports are effect-rpc protocol layers handed over by the worker framework: appProtocol\n// serves the client services (+ WorkerService); systemProtocol carries the reverse-direction\n// BridgeService (worker→tab).\nexport type CreateSessionProps = {\n appProtocol: RpcServer.Protocol['Type'];\n systemProtocol: RpcClient.Protocol['Type'];\n shellPort?: MessagePort;\n onClose?: () => Promise<void>;\n};\n\nexport type WorkerRuntimeOptions = {\n configProvider: () => MaybePromise<Config>;\n acquireLock: () => Promise<void>;\n releaseLock: () => void;\n onStop?: () => Promise<void>;\n /**\n * @default true\n */\n automaticallyConnectWebrtc?: boolean;\n\n /**\n * Optional SQLite layer for Effect. Defaults to LocalSqliteOpfsLayer.\n * For testing in Node.js, use `sqliteLayerMemory` from `@dxos/sql-sqlite/platform`.\n */\n sqliteLayer?: Layer.Layer<SqlClient.SqlClient | SqlExport.SqlExport, unknown>;\n};\n\n/**\n * Effect service surface for the dedicated-worker runtime.\n *\n * Manages connections from proxies (in tabs): tabs make requests to the `ClientServicesHost`, and\n * provide a WebRTC gateway. Lifecycle (`start` / `stop`) is caller-driven — the worker framework\n * builds the runtime after receiving init config, then drives sessions for their lifetime — so these\n * are explicit programs rather than Layer finalizers.\n */\nexport interface WorkerRuntimeService {\n /** The client services host served to connected tabs. */\n readonly host: ClientServicesHost;\n /** Resolve config, open the services host, and signal readiness. Never fails: startup errors are surfaced to session callers via the readiness gate. */\n readonly start: () => Effect.Effect<void>;\n /** Tear down sessions' host, dispose the runtime, release the storage lock, and run `onStop`. Idempotent. */\n readonly stop: () => Effect.Effect<void>;\n /** Open a new tab session over the supplied effect-rpc protocols and register it for WebRTC bridging. */\n readonly createSession: (props: CreateSessionProps) => Effect.Effect<WorkerSession>;\n /** Route the WebRTC bridge through the given session (or disconnect when `undefined`). */\n readonly connectWebrtcBridge: (session: WorkerSession | undefined) => Effect.Effect<void>;\n}\n\n/**\n * Context tag for the dedicated-worker runtime service. Provided by {@link layerWorkerRuntime}.\n */\nexport class WorkerRuntime extends Context_.Tag('@dxos/client-services/WorkerRuntime')<\n WorkerRuntime,\n WorkerRuntimeService\n>() {}\n\n/**\n * Constructs the {@link WorkerRuntimeService}. The SQLite {@link ManagedRuntime} and\n * {@link ClientServicesHost} are built eagerly; the async open sequence runs in {@link start}.\n */\nexport const makeWorkerRuntime = ({\n configProvider,\n acquireLock,\n releaseLock,\n onStop,\n automaticallyConnectWebrtc = true,\n sqliteLayer,\n}: WorkerRuntimeOptions): WorkerRuntimeService => {\n const transportFactory = new RtcTransportProxyFactory();\n const ready = new Trigger<Error | undefined>();\n const sessions = new Set<WorkerSession>();\n const signalMetadataTags: any = { runtime: 'worker-runtime' };\n\n let stopped = false;\n let sessionForNetworking: WorkerSession | undefined;\n let config: Config;\n let serviceScope: Scope.CloseableScope | undefined;\n\n if (sqliteLayer) {\n log.warn('Using testing SQLite layer');\n }\n\n const runtime = ManagedRuntime.make(\n SqlTransaction.layer\n .pipe(Layer.provideMerge(sqliteLayer ?? LocalSqliteOpfsLayer), Layer.provideMerge(Reactivity.layer))\n .pipe(Layer.orDie),\n );\n\n const stop = (): Effect.Effect<void> =>\n Effect.promise(async () => {\n if (stopped) {\n return;\n }\n stopped = true;\n // Release the lock to notify remote clients that the worker is terminating.\n releaseLock();\n // Always dispose the SQLite runtime and run onStop, even if host / scope teardown rejects —\n // otherwise a failed close would leak the runtime and skip the shutdown signal.\n try {\n await clientServices.close(Context.default());\n if (serviceScope) {\n await EffectEx.runPromise(Scope.close(serviceScope, Exit.void));\n serviceScope = undefined;\n }\n } finally {\n await runtime.dispose();\n await onStop?.();\n }\n });\n\n const clientServices = new ClientServicesHost({\n callbacks: {\n onReset: async () => {\n await EffectEx.runPromise(stop());\n },\n },\n runtime: runtime.runtimeEffect,\n runtimeProps: {\n // Auto-activate spaces that were previously active after leader changeover.\n autoActivateSpaces: true,\n },\n });\n\n const connectBridge = (session: WorkerSession | undefined): void => {\n sessionForNetworking = session;\n transportFactory.setBridgeService(session?.bridgeService);\n };\n\n // Selects one of the existing sessions for WebRTC networking.\n const reconnectWebrtc = Effect.sync(() => {\n log('reconnecting webrtc...');\n // Drop the current session if it has since closed.\n if (sessionForNetworking && !sessions.has(sessionForNetworking)) {\n sessionForNetworking = undefined;\n }\n if (!sessionForNetworking) {\n connectBridge(Array.from(sessions).find((session) => session.bridgeService));\n }\n });\n\n const start = (): Effect.Effect<void> =>\n Effect.promise(async () => {\n log('starting...');\n try {\n log('worker-runtime: acquiring storage lock');\n await acquireLock();\n log('worker-runtime: storage lock acquired, resolving config');\n config = await configProvider();\n log('worker-runtime: config resolved');\n const observabilityGroup = config.get('runtime.client.observabilityGroup');\n if (observabilityGroup) {\n signalMetadataTags.group = observabilityGroup;\n }\n log('worker-runtime: initializing client services host');\n clientServices.initialize({\n config,\n // Edge signaling is created in the services host from the edge connection; otherwise fall\n // back to an isolated in-memory manager (KUBE `WebsocketSignalManager` removed).\n signalManager: config.get('runtime.client.edgeFeatures')?.signaling\n ? undefined\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory,\n });\n log('worker-runtime: client services host initialized, opening');\n\n await clientServices.open(new Context());\n log('worker-runtime: client services host opened, signalling ready');\n ready.wake(undefined);\n log('started');\n // Bridge the host identity/devices Handlers to the effect-rpc client surface in-process.\n serviceScope = Effect.runSync(Scope.make());\n const { IdentityService: identityHandlers, DevicesService: devicesHandlers } = clientServices.services;\n invariant(identityHandlers, 'IdentityService handler not available');\n invariant(devicesHandlers, 'DevicesService handler not available');\n const [identityService, devicesService] = await EffectEx.runPromise(\n Effect.all([\n makeInProcessClient(IdentityService.Rpcs, identityHandlers),\n makeInProcessClient(DevicesService.Rpcs, devicesHandlers),\n ]).pipe(Effect.provideService(Scope.Scope, serviceScope)),\n );\n setIdentityTags({\n identityService,\n devicesService,\n setTag: (key: string, value: string) => {\n signalMetadataTags[key] = value;\n },\n });\n } catch (err: any) {\n ready.wake(err);\n log.error('starting', err);\n }\n });\n\n const createSession = ({\n appProtocol,\n systemProtocol,\n shellPort,\n onClose,\n }: CreateSessionProps): Effect.Effect<WorkerSession> =>\n Effect.gen(function* () {\n const session = new WorkerSession({\n serviceHost: clientServices,\n appProtocol,\n systemProtocol,\n shellPort,\n readySignal: ready,\n });\n\n // When tab is closed or client is destroyed.\n session.onClose.set(async () => {\n await EffectEx.runPromise(\n Effect.gen(function* () {\n sessions.delete(session);\n if (sessions.size === 0) {\n // Terminate the worker when all sessions are closed.\n yield* stop();\n } else if (automaticallyConnectWebrtc) {\n yield* reconnectWebrtc;\n }\n }),\n );\n await onClose?.();\n });\n\n yield* session.open();\n // A worker can only service one origin currently.\n invariant(\n !signalMetadataTags.origin || signalMetadataTags.origin === session.origin,\n `worker origin changed from ${signalMetadataTags.origin} to ${session.origin}?`,\n );\n signalMetadataTags.origin = session.origin;\n sessions.add(session);\n\n if (automaticallyConnectWebrtc) {\n yield* reconnectWebrtc;\n }\n\n return session;\n });\n\n return {\n host: clientServices,\n start,\n stop,\n createSession,\n connectWebrtcBridge: (session) => Effect.sync(() => connectBridge(session)),\n };\n};\n\n/**\n * Layer providing the {@link WorkerRuntime} service. The service is constructed synchronously;\n * callers drive `start` / `stop` explicitly (see {@link WorkerRuntimeService}).\n */\nexport const layerWorkerRuntime = (options: WorkerRuntimeOptions): Layer.Layer<WorkerRuntime> =>\n Layer.sync(WorkerRuntime, () => makeWorkerRuntime(options));\n\nconst DB_NAME = 'DXOS';\n\n/**\n * SqlExport layer that wraps SqliteClient to provide export functionality.\n */\nconst SqlExportLayer: Layer.Layer<SqlExport.SqlExport, never, SqliteClient.SqliteClient> = Layer.effect(\n SqlExport.SqlExport,\n Effect.gen(function* () {\n const sql = yield* SqliteClient.SqliteClient;\n return {\n export: sql.export,\n } satisfies SqlExport.Service;\n }),\n);\n\n/**\n * Local SQLite layer for the worker.\n * Uses in-process OPFS via {@link SqliteClient.layerOpfs} (no MessagePort).\n * NOTE: Only usable within a worker.\n */\nconst LocalSqliteOpfsLayer = SqlExportLayer.pipe(\n Layer.provideMerge(SqliteClient.layerOpfs({ dbName: DB_NAME })),\n Layer.provideMerge(Reactivity.layer),\n);\n","//\n// Copyright 2020 DXOS.org\n//\n\nexport * from './packlets/devtools';\nexport * from './packlets/diagnostics';\nexport * from './packlets/identity';\nexport * from './packlets/invitations';\nexport * from './packlets/locks';\nexport * from './packlets/metadata';\nexport * from './packlets/services';\nexport * from './packlets/space';\nexport * from './packlets/space-export';\nexport * from './packlets/spaces';\nexport * from './packlets/storage';\nexport * from './packlets/worker';\nexport * from './packlets/agents';\n"],"mappings":"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"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { Trigger } from "@dxos/async";
|
|
2
|
+
import { log } from "@dxos/log";
|
|
3
|
+
//#region src/packlets/diagnostics/browser-diagnostics-broadcast.ts
|
|
4
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/diagnostics/browser-diagnostics-broadcast.ts";
|
|
5
|
+
var CHANNEL_NAME = "dxos.diagnostics.broadcast";
|
|
6
|
+
var createCollectDiagnosticsBroadcastSender = () => {
|
|
7
|
+
return { broadcastDiagnosticsRequest: async () => {
|
|
8
|
+
let expectedResponse = "probe-ack";
|
|
9
|
+
let channel;
|
|
10
|
+
try {
|
|
11
|
+
const trigger = new Trigger();
|
|
12
|
+
channel = new BroadcastChannel(CHANNEL_NAME);
|
|
13
|
+
channel.onmessage = (msg) => {
|
|
14
|
+
if (expectedResponse === msg.data.type) trigger.wake(msg.data);
|
|
15
|
+
};
|
|
16
|
+
channel.postMessage({ type: "probe" });
|
|
17
|
+
await trigger.wait({ timeout: 200 });
|
|
18
|
+
expectedResponse = "receive-diagnostics";
|
|
19
|
+
trigger.reset();
|
|
20
|
+
channel.postMessage({ type: "request-diagnostics" });
|
|
21
|
+
return (await trigger.wait({ timeout: 5e3 })).payload;
|
|
22
|
+
} catch (e) {
|
|
23
|
+
const errorDescription = e instanceof Error ? e.message : JSON.stringify(e);
|
|
24
|
+
return {
|
|
25
|
+
expectedResponse,
|
|
26
|
+
errorDescription
|
|
27
|
+
};
|
|
28
|
+
} finally {
|
|
29
|
+
safeClose(channel);
|
|
30
|
+
}
|
|
31
|
+
} };
|
|
32
|
+
};
|
|
33
|
+
var createCollectDiagnosticsBroadcastHandler = (systemService) => {
|
|
34
|
+
let channel;
|
|
35
|
+
return {
|
|
36
|
+
start: () => {
|
|
37
|
+
channel = new BroadcastChannel(CHANNEL_NAME);
|
|
38
|
+
channel.onmessage = async (message) => {
|
|
39
|
+
try {
|
|
40
|
+
if (message.data.type === "probe") channel?.postMessage({ type: "probe-ack" });
|
|
41
|
+
else if (message.data.type === "request-diagnostics") {
|
|
42
|
+
const diagnostics = await systemService.getDiagnostics({});
|
|
43
|
+
channel?.postMessage({
|
|
44
|
+
type: "receive-diagnostics",
|
|
45
|
+
payload: diagnostics
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
} catch (error) {
|
|
49
|
+
log.catch(error, void 0, {
|
|
50
|
+
"~LogMeta": "~LogMeta",
|
|
51
|
+
F: __dxlog_file,
|
|
52
|
+
L: 77,
|
|
53
|
+
S: void 0
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
},
|
|
58
|
+
stop: () => {
|
|
59
|
+
safeClose(channel);
|
|
60
|
+
channel = void 0;
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
};
|
|
64
|
+
var safeClose = (channel) => {
|
|
65
|
+
try {
|
|
66
|
+
channel?.close();
|
|
67
|
+
} catch (e) {}
|
|
68
|
+
};
|
|
69
|
+
//#endregion
|
|
70
|
+
export { createCollectDiagnosticsBroadcastHandler, createCollectDiagnosticsBroadcastSender };
|
|
71
|
+
|
|
72
|
+
//# sourceMappingURL=browser-diagnostics-broadcast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser-diagnostics-broadcast.mjs","names":[],"sources":["../../../../src/packlets/diagnostics/browser-diagnostics-broadcast.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { log } from '@dxos/log';\nimport { type SystemService } from '@dxos/protocols/proto/dxos/client/services';\n\nimport {\n type CollectDiagnosticsBroadcastHandler,\n type CollectDiagnosticsBroadcastSender,\n} from './diagnostics-collector';\n\nconst CHANNEL_NAME = 'dxos.diagnostics.broadcast';\n\nenum MessageType {\n PROBE = 'probe',\n PROBE_ACK = 'probe-ack',\n REQUEST_DIAGNOSTICS = 'request-diagnostics',\n RECEIVE_DIAGNOSTICS = 'receive-diagnostics',\n}\n\ninterface Message {\n type: MessageType;\n payload?: any;\n}\n\nexport const createCollectDiagnosticsBroadcastSender = (): CollectDiagnosticsBroadcastSender => {\n return {\n broadcastDiagnosticsRequest: async () => {\n let expectedResponse = MessageType.PROBE_ACK;\n let channel: BroadcastChannel | undefined;\n try {\n const trigger = new Trigger<Message>();\n channel = new BroadcastChannel(CHANNEL_NAME);\n channel.onmessage = (msg) => {\n if (expectedResponse === msg.data.type) {\n trigger.wake(msg.data);\n }\n };\n channel.postMessage({ type: MessageType.PROBE });\n await trigger.wait({ timeout: 200 });\n expectedResponse = MessageType.RECEIVE_DIAGNOSTICS;\n trigger.reset();\n channel.postMessage({ type: MessageType.REQUEST_DIAGNOSTICS });\n const diagnostics = await trigger.wait({ timeout: 5000 });\n return diagnostics.payload;\n } catch (e) {\n const errorDescription = e instanceof Error ? e.message : JSON.stringify(e);\n return { expectedResponse, errorDescription };\n } finally {\n safeClose(channel);\n }\n },\n };\n};\n\nexport const createCollectDiagnosticsBroadcastHandler = (\n systemService: SystemService,\n): CollectDiagnosticsBroadcastHandler => {\n let channel: BroadcastChannel | undefined;\n return {\n start: () => {\n channel = new BroadcastChannel(CHANNEL_NAME);\n channel.onmessage = async (message) => {\n try {\n if (message.data.type === MessageType.PROBE) {\n channel?.postMessage({ type: MessageType.PROBE_ACK });\n } else if (message.data.type === MessageType.REQUEST_DIAGNOSTICS) {\n const diagnostics = await systemService.getDiagnostics({});\n channel?.postMessage({\n type: MessageType.RECEIVE_DIAGNOSTICS,\n payload: diagnostics,\n });\n }\n } catch (error) {\n log.catch(error);\n }\n };\n },\n stop: () => {\n safeClose(channel);\n channel = undefined;\n },\n };\n};\n\nconst safeClose = (channel?: BroadcastChannel) => {\n try {\n channel?.close();\n } catch (e) {\n // ignored\n }\n};\n"],"mappings":";;;;AAaA,IAAM,eAAe;AAcrB,IAAa,gDAAmF;CAC9F,OAAO,EACL,6BAA6B,YAAY;EACvC,IAAI,mBAAA;EACJ,IAAI;EACJ,IAAI;GACF,MAAM,UAAU,IAAI,QAAiB;GACrC,UAAU,IAAI,iBAAiB,YAAY;GAC3C,QAAQ,aAAa,QAAQ;IAC3B,IAAI,qBAAqB,IAAI,KAAK,MAChC,QAAQ,KAAK,IAAI,IAAI;GAEzB;GACA,QAAQ,YAAY,EAAE,MAAA,QAAwB,CAAC;GAC/C,MAAM,QAAQ,KAAK,EAAE,SAAS,IAAI,CAAC;GACnC,mBAAA;GACA,QAAQ,MAAM;GACd,QAAQ,YAAY,EAAE,MAAA,sBAAsC,CAAC;GAE7D,QAAO,MADmB,QAAQ,KAAK,EAAE,SAAS,IAAK,CAAC,EAAA,CACrC;EACrB,SAAS,GAAG;GACV,MAAM,mBAAmB,aAAa,QAAQ,EAAE,UAAU,KAAK,UAAU,CAAC;GAC1E,OAAO;IAAE;IAAkB;GAAiB;EAC9C,UAAU;GACR,UAAU,OAAO;EACnB;CACF,EACF;AACF;AAEA,IAAa,4CACX,kBACuC;CACvC,IAAI;CACJ,OAAO;EACL,aAAa;GACX,UAAU,IAAI,iBAAiB,YAAY;GAC3C,QAAQ,YAAY,OAAO,YAAY;IACrC,IAAI;KACF,IAAI,QAAQ,KAAK,SAAA,SACf,SAAS,YAAY,EAAE,MAAA,YAA4B,CAAC;UAC/C,IAAI,QAAQ,KAAK,SAAA,uBAA0C;MAChE,MAAM,cAAc,MAAM,cAAc,eAAe,CAAC,CAAC;MACzD,SAAS,YAAY;OACnB,MAAA;OACA,SAAS;MACX,CAAC;KACH;IACF,SAAS,OAAO;KACd,IAAI,MAAM,OAAI,KAAA,GAAA;MAAA,YAAA;MAAA,GAAA;MAAA,GAAA;MAAA,GAAA,KAAA;KAAA,CAAC;IACjB;GACF;EACF;EACA,YAAY;GACV,UAAU,OAAO;GACjB,UAAU,KAAA;EACZ;CACF;AACF;AAEA,IAAM,aAAa,YAA+B;CAChD,IAAI;EACF,SAAS,MAAM;CACjB,SAAS,GAAG,CAEZ;AACF"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
//#region src/packlets/diagnostics/diagnostics-broadcast.ts
|
|
2
|
+
var createCollectDiagnosticsBroadcastSender = () => {
|
|
3
|
+
return { broadcastDiagnosticsRequest: async () => void 0 };
|
|
4
|
+
};
|
|
5
|
+
var createCollectDiagnosticsBroadcastHandler = (_) => {
|
|
6
|
+
return {
|
|
7
|
+
start: () => {},
|
|
8
|
+
stop: () => {}
|
|
9
|
+
};
|
|
10
|
+
};
|
|
11
|
+
//#endregion
|
|
12
|
+
export { createCollectDiagnosticsBroadcastHandler, createCollectDiagnosticsBroadcastSender };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=diagnostics-broadcast.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics-broadcast.mjs","names":[],"sources":["../../../../src/packlets/diagnostics/diagnostics-broadcast.ts"],"sourcesContent":["//\n// Copyright 2024 DXOS.org\n//\n\nimport { type SystemService } from '@dxos/protocols/rpc';\n\nimport {\n type CollectDiagnosticsBroadcastHandler,\n type CollectDiagnosticsBroadcastSender,\n} from './diagnostics-collector';\n\nexport const createCollectDiagnosticsBroadcastSender = (): CollectDiagnosticsBroadcastSender => {\n return { broadcastDiagnosticsRequest: async () => undefined };\n};\n\nexport const createCollectDiagnosticsBroadcastHandler = (\n _: SystemService.Handlers,\n): CollectDiagnosticsBroadcastHandler => {\n return {\n start: () => {},\n stop: () => {},\n };\n};\n"],"mappings":";AAWA,IAAa,gDAAmF;CAC9F,OAAO,EAAE,6BAA6B,YAAY,KAAA,EAAU;AAC9D;AAEA,IAAa,4CACX,MACuC;CACvC,OAAO;EACL,aAAa,CAAC;EACd,YAAY,CAAC;CACf;AACF"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { t as __decorate } from "../../chunk-decorate.mjs";
|
|
2
|
+
import { Trigger, asyncTimeout } from "@dxos/async";
|
|
3
|
+
import { log, logInfo } from "@dxos/log";
|
|
4
|
+
import { RESOURCE_LOCK_TIMEOUT } from "@dxos/client-protocol";
|
|
5
|
+
//#region src/packlets/locks/browser.ts
|
|
6
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/locks/browser.ts";
|
|
7
|
+
var Lock = class {
|
|
8
|
+
_broadcastChannel = new BroadcastChannel("vault-resource-lock");
|
|
9
|
+
_lockKey;
|
|
10
|
+
_onAcquire;
|
|
11
|
+
_onRelease;
|
|
12
|
+
_releaseTrigger = new Trigger();
|
|
13
|
+
constructor({ lockKey, onAcquire, onRelease }) {
|
|
14
|
+
this._lockKey = lockKey;
|
|
15
|
+
this._onAcquire = onAcquire;
|
|
16
|
+
this._onRelease = onRelease;
|
|
17
|
+
this._broadcastChannel.onmessage = this._onMessage.bind(this);
|
|
18
|
+
}
|
|
19
|
+
get lockKey() {
|
|
20
|
+
return this._lockKey;
|
|
21
|
+
}
|
|
22
|
+
async acquire() {
|
|
23
|
+
this._broadcastChannel.postMessage({ message: "acquiring" });
|
|
24
|
+
try {
|
|
25
|
+
log("aquiring lock...", void 0, {
|
|
26
|
+
"~LogMeta": "~LogMeta",
|
|
27
|
+
F: __dxlog_file,
|
|
28
|
+
L: 42,
|
|
29
|
+
S: this
|
|
30
|
+
});
|
|
31
|
+
await asyncTimeout(this._requestLock(), RESOURCE_LOCK_TIMEOUT);
|
|
32
|
+
log("acquired lock", void 0, {
|
|
33
|
+
"~LogMeta": "~LogMeta",
|
|
34
|
+
F: __dxlog_file,
|
|
35
|
+
L: 44,
|
|
36
|
+
S: this
|
|
37
|
+
});
|
|
38
|
+
} catch {
|
|
39
|
+
log("stealing lock...", void 0, {
|
|
40
|
+
"~LogMeta": "~LogMeta",
|
|
41
|
+
F: __dxlog_file,
|
|
42
|
+
L: 46,
|
|
43
|
+
S: this
|
|
44
|
+
});
|
|
45
|
+
await this._requestLock(true);
|
|
46
|
+
log("stolen lock", void 0, {
|
|
47
|
+
"~LogMeta": "~LogMeta",
|
|
48
|
+
F: __dxlog_file,
|
|
49
|
+
L: 48,
|
|
50
|
+
S: this
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
async release() {
|
|
55
|
+
this._releaseTrigger.wake();
|
|
56
|
+
}
|
|
57
|
+
_onMessage(event) {
|
|
58
|
+
if (event.data.message === "acquiring") this._releaseTrigger.wake();
|
|
59
|
+
}
|
|
60
|
+
async _requestLock(steal = false) {
|
|
61
|
+
log("requesting lock...", { steal }, {
|
|
62
|
+
"~LogMeta": "~LogMeta",
|
|
63
|
+
F: __dxlog_file,
|
|
64
|
+
L: 63,
|
|
65
|
+
S: this
|
|
66
|
+
});
|
|
67
|
+
const acquired = new Trigger();
|
|
68
|
+
navigator.locks.request(this._lockKey, { steal }, async () => {
|
|
69
|
+
await this._onAcquire?.();
|
|
70
|
+
acquired.wake();
|
|
71
|
+
this._releaseTrigger = new Trigger();
|
|
72
|
+
await this._releaseTrigger.wait();
|
|
73
|
+
log("releasing lock...", void 0, {
|
|
74
|
+
"~LogMeta": "~LogMeta",
|
|
75
|
+
F: __dxlog_file,
|
|
76
|
+
L: 72,
|
|
77
|
+
S: this
|
|
78
|
+
});
|
|
79
|
+
await this._onRelease?.();
|
|
80
|
+
log("released lock", void 0, {
|
|
81
|
+
"~LogMeta": "~LogMeta",
|
|
82
|
+
F: __dxlog_file,
|
|
83
|
+
L: 74,
|
|
84
|
+
S: this
|
|
85
|
+
});
|
|
86
|
+
}).catch(async () => {
|
|
87
|
+
await this._onRelease?.();
|
|
88
|
+
});
|
|
89
|
+
await acquired.wait();
|
|
90
|
+
log("recieved lock", { steal }, {
|
|
91
|
+
"~LogMeta": "~LogMeta",
|
|
92
|
+
F: __dxlog_file,
|
|
93
|
+
L: 81,
|
|
94
|
+
S: this
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
__decorate([logInfo], Lock.prototype, "lockKey", null);
|
|
99
|
+
var isLocked = (lockPath) => {
|
|
100
|
+
throw new Error("Not implemented");
|
|
101
|
+
};
|
|
102
|
+
//#endregion
|
|
103
|
+
export { Lock, isLocked };
|
|
104
|
+
|
|
105
|
+
//# sourceMappingURL=browser.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.mjs","names":[],"sources":["../../../../src/packlets/locks/browser.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger, asyncTimeout } from '@dxos/async';\nimport { RESOURCE_LOCK_TIMEOUT } from '@dxos/client-protocol';\nimport { log, logInfo } from '@dxos/log';\n\nimport { type ResourceLock, type ResourceLockOptions } from './resource-lock';\n\nenum Message {\n ACQUIRING = 'acquiring',\n}\n\n// TODO(mykola): Factor out.\n// TODO(burdon): Extend to support locking for web and NodeJS (use npm lockfile). Use to lock agents.\nexport class Lock implements ResourceLock {\n private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');\n private readonly _lockKey: string;\n private readonly _onAcquire: ResourceLockOptions['onAcquire'];\n private readonly _onRelease: ResourceLockOptions['onRelease'];\n private _releaseTrigger = new Trigger();\n\n constructor({ lockKey, onAcquire, onRelease }: ResourceLockOptions) {\n this._lockKey = lockKey;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n this._broadcastChannel.onmessage = this._onMessage.bind(this);\n }\n\n @logInfo\n get lockKey() {\n return this._lockKey;\n }\n\n async acquire(): Promise<void> {\n this._broadcastChannel.postMessage({\n message: Message.ACQUIRING,\n });\n\n try {\n log('aquiring lock...');\n await asyncTimeout(this._requestLock(), RESOURCE_LOCK_TIMEOUT);\n log('acquired lock');\n } catch {\n log('stealing lock...');\n await this._requestLock(true);\n log('stolen lock');\n }\n }\n\n async release(): Promise<void> {\n this._releaseTrigger.wake();\n }\n\n private _onMessage(event: MessageEvent<any>): void {\n if (event.data.message === Message.ACQUIRING) {\n this._releaseTrigger.wake();\n }\n }\n\n private async _requestLock(steal = false): Promise<void> {\n log('requesting lock...', { steal });\n const acquired = new Trigger();\n\n void navigator.locks\n .request(this._lockKey, { steal }, async () => {\n await this._onAcquire?.();\n acquired.wake();\n this._releaseTrigger = new Trigger();\n await this._releaseTrigger.wait();\n log('releasing lock...');\n await this._onRelease?.();\n log('released lock');\n })\n .catch(async () => {\n await this._onRelease?.();\n });\n\n await acquired.wait();\n log('recieved lock', { steal });\n }\n}\n\n// TODO(mykola): Implement.\nexport const isLocked = (lockPath: string) => {\n throw new Error('Not implemented');\n};\n"],"mappings":";;;;;;AAgBA,IAAa,OAAb,MAA0C;CACxC,oBAAqC,IAAI,iBAAiB,qBAAqB;CAC/E;CACA;CACA;CACA,kBAA0B,IAAI,QAAQ;CAEtC,YAAY,EAAE,SAAS,WAAW,aAAkC;EAClE,KAAK,WAAW;EAChB,KAAK,aAAa;EAClB,KAAK,aAAa;EAClB,KAAK,kBAAkB,YAAY,KAAK,WAAW,KAAK,IAAI;CAC9D;CAEA,IACI,UAAU;EACZ,OAAO,KAAK;CACd;CAEA,MAAM,UAAyB;EAC7B,KAAK,kBAAkB,YAAY,EACjC,SAAA,YACF,CAAC;EAED,IAAI;GACF,IAAI,oBAAiB,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;GACtB,MAAM,aAAa,KAAK,aAAa,GAAG,qBAAqB;GAC7D,IAAI,iBAAc,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;EACrB,QAAQ;GACN,IAAI,oBAAiB,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;GACtB,MAAM,KAAK,aAAa,IAAI;GAC5B,IAAI,eAAY,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;EACnB;CACF;CAEA,MAAM,UAAyB;EAC7B,KAAK,gBAAgB,KAAK;CAC5B;CAEA,WAAmB,OAAgC;EACjD,IAAI,MAAM,KAAK,YAAA,aACb,KAAK,gBAAgB,KAAK;CAE9B;CAEA,MAAc,aAAa,QAAQ,OAAsB;EACvD,IAAI,sBAAsB,EAAE,MAAM,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC;EACnC,MAAM,WAAW,IAAI,QAAQ;EAE7B,UAAe,MACZ,QAAQ,KAAK,UAAU,EAAE,MAAM,GAAG,YAAY;GAC7C,MAAM,KAAK,aAAa;GACxB,SAAS,KAAK;GACd,KAAK,kBAAkB,IAAI,QAAQ;GACnC,MAAM,KAAK,gBAAgB,KAAK;GAChC,IAAI,qBAAkB,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;GACvB,MAAM,KAAK,aAAa;GACxB,IAAI,iBAAc,KAAA,GAAA;IAAA,YAAA;IAAA,GAAA;IAAA,GAAA;IAAA,GAAA;GAAA,CAAC;EACrB,CAAC,CAAA,CACA,MAAM,YAAY;GACjB,MAAM,KAAK,aAAa;EAC1B,CAAC;EAEH,MAAM,SAAS,KAAK;EACpB,IAAI,iBAAiB,EAAE,MAAM,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC;CAChC;AACF;YApDG,OAAA,GAAA,KAAA,WAAA,WAAA,IAAA;AAuDH,IAAa,YAAY,aAAqB;CAC5C,MAAM,IAAI,MAAM,iBAAiB;AACnC"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { t as __decorate } from "../../chunk-decorate.mjs";
|
|
2
|
+
import { log, logInfo } from "@dxos/log";
|
|
3
|
+
import { invariant } from "@dxos/invariant";
|
|
4
|
+
import { LockFile } from "@dxos/lock-file";
|
|
5
|
+
//#region src/packlets/locks/node.ts
|
|
6
|
+
var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/locks/node.ts";
|
|
7
|
+
var Lock = class {
|
|
8
|
+
_lockPath;
|
|
9
|
+
_onAcquire;
|
|
10
|
+
_onRelease;
|
|
11
|
+
_fileHandle;
|
|
12
|
+
constructor({ lockKey: lockPath, onAcquire, onRelease }) {
|
|
13
|
+
this._lockPath = lockPath;
|
|
14
|
+
this._onAcquire = onAcquire;
|
|
15
|
+
this._onRelease = onRelease;
|
|
16
|
+
}
|
|
17
|
+
get lockKey() {
|
|
18
|
+
return this._lockPath;
|
|
19
|
+
}
|
|
20
|
+
async acquire() {
|
|
21
|
+
log("acquiring lock...", void 0, {
|
|
22
|
+
"~LogMeta": "~LogMeta",
|
|
23
|
+
F: __dxlog_file,
|
|
24
|
+
L: 32,
|
|
25
|
+
S: this
|
|
26
|
+
});
|
|
27
|
+
this._fileHandle = await LockFile.acquire(this._lockPath);
|
|
28
|
+
await this._onAcquire?.();
|
|
29
|
+
log("acquired lock", void 0, {
|
|
30
|
+
"~LogMeta": "~LogMeta",
|
|
31
|
+
F: __dxlog_file,
|
|
32
|
+
L: 37,
|
|
33
|
+
S: this
|
|
34
|
+
});
|
|
35
|
+
}
|
|
36
|
+
async release() {
|
|
37
|
+
await this._onRelease?.();
|
|
38
|
+
invariant(this._fileHandle, "Lock is not acquired", {
|
|
39
|
+
"~LogMeta": "~LogMeta",
|
|
40
|
+
F: __dxlog_file,
|
|
41
|
+
L: 42,
|
|
42
|
+
S: this,
|
|
43
|
+
A: ["this._fileHandle", "'Lock is not acquired'"]
|
|
44
|
+
});
|
|
45
|
+
await LockFile.release(this._fileHandle);
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
__decorate([logInfo], Lock.prototype, "lockKey", null);
|
|
49
|
+
var isLocked = (lockPath) => LockFile.isLocked(lockPath);
|
|
50
|
+
//#endregion
|
|
51
|
+
export { Lock, isLocked };
|
|
52
|
+
|
|
53
|
+
//# sourceMappingURL=node.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.mjs","names":[],"sources":["../../../../src/packlets/locks/node.ts"],"sourcesContent":["//\n// Copyright 2023 DXOS.org\n//\n\nimport { type FileHandle } from 'node:fs/promises';\n\nimport { invariant } from '@dxos/invariant';\nimport { LockFile } from '@dxos/lock-file';\nimport { log, logInfo } from '@dxos/log';\n\nimport { type ResourceLock, type ResourceLockOptions } from './resource-lock';\n\n// TODO(mykola): Factor out.\nexport class Lock implements ResourceLock {\n private readonly _lockPath: string;\n private readonly _onAcquire: ResourceLockOptions['onAcquire'];\n private readonly _onRelease: ResourceLockOptions['onRelease'];\n private _fileHandle?: FileHandle;\n\n constructor({ lockKey: lockPath, onAcquire, onRelease }: ResourceLockOptions) {\n this._lockPath = lockPath;\n this._onAcquire = onAcquire;\n this._onRelease = onRelease;\n }\n\n @logInfo\n get lockKey() {\n return this._lockPath;\n }\n\n async acquire(): Promise<void> {\n log('acquiring lock...');\n this._fileHandle = await LockFile.acquire(this._lockPath);\n\n await this._onAcquire?.();\n\n log('acquired lock');\n }\n\n async release(): Promise<void> {\n await this._onRelease?.();\n invariant(this._fileHandle, 'Lock is not acquired');\n await LockFile.release(this._fileHandle);\n }\n}\n\nexport const isLocked = (lockPath: string) => LockFile.isLocked(lockPath);\n"],"mappings":";;;;;;AAaA,IAAa,OAAb,MAA0C;CACxC;CACA;CACA;CACA;CAEA,YAAY,EAAE,SAAS,UAAU,WAAW,aAAkC;EAC5E,KAAK,YAAY;EACjB,KAAK,aAAa;EAClB,KAAK,aAAa;CACpB;CAEA,IACI,UAAU;EACZ,OAAO,KAAK;CACd;CAEA,MAAM,UAAyB;EAC7B,IAAI,qBAAkB,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC;EACvB,KAAK,cAAc,MAAM,SAAS,QAAQ,KAAK,SAAS;EAExD,MAAM,KAAK,aAAa;EAExB,IAAI,iBAAc,KAAA,GAAA;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;EAAA,CAAC;CACrB;CAEA,MAAM,UAAyB;EAC7B,MAAM,KAAK,aAAa;EACxB,UAAU,KAAK,aAAa,wBAAqB;GAAA,YAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA;GAAA,GAAA,CAAA,oBAAA,wBAAA;EAAA,CAAC;EAClD,MAAM,SAAS,QAAQ,KAAK,WAAW;CACzC;AACF;YAnBG,OAAA,GAAA,KAAA,WAAA,WAAA,IAAA;AAqBH,IAAa,YAAY,aAAqB,SAAS,SAAS,QAAQ"}
|