@dxos/client-services 0.8.4-main.c4373fc → 0.8.4-main.c85a9c8dae

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/dist/lib/browser/{chunk-HWGM5TYF.mjs → chunk-MQ6PWJ76.mjs} +1936 -2336
  2. package/dist/lib/browser/chunk-MQ6PWJ76.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-NQSC7HOE.mjs +22 -0
  4. package/dist/lib/browser/chunk-NQSC7HOE.mjs.map +7 -0
  5. package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
  6. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +522 -172
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  11. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  12. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  13. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  14. package/dist/lib/browser/packlets/locks/browser.mjs +126 -0
  15. package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
  16. package/dist/lib/browser/packlets/locks/node.mjs +66 -0
  17. package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
  18. package/dist/lib/browser/testing/index.mjs +59 -76
  19. package/dist/lib/browser/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  21. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  22. package/dist/lib/node-esm/{chunk-XUIY55CH.mjs → chunk-GUAL4U7S.mjs} +1468 -1737
  23. package/dist/lib/node-esm/chunk-GUAL4U7S.mjs.map +7 -0
  24. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs +22 -0
  25. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +522 -172
  27. package/dist/lib/node-esm/index.mjs.map +4 -4
  28. package/dist/lib/node-esm/meta.json +1 -1
  29. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  30. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  31. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  32. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  33. package/dist/lib/node-esm/packlets/locks/browser.mjs +126 -0
  34. package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
  35. package/dist/lib/node-esm/packlets/locks/node.mjs +66 -0
  36. package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
  37. package/dist/lib/node-esm/testing/index.mjs +59 -76
  38. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  39. package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
  40. package/dist/types/src/packlets/devtools/devtools.d.ts +2 -2
  41. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  42. package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
  43. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
  44. package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
  45. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  46. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +2 -2
  47. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +1 -1
  48. package/dist/types/src/packlets/identity/identity-manager.d.ts +4 -4
  49. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  50. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +2 -2
  51. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  52. package/dist/types/src/packlets/identity/identity.d.ts +2 -2
  53. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  54. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +4 -4
  55. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  56. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
  57. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  58. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +2 -3
  59. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  60. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
  61. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  62. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -2
  63. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  64. package/dist/types/src/packlets/locks/index.d.ts +1 -1
  65. package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
  66. package/dist/types/src/packlets/logging/logging-service.d.ts +4 -0
  67. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  68. package/dist/types/src/packlets/services/client-rpc-server.d.ts +2 -2
  69. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  70. package/dist/types/src/packlets/services/feed-syncer.d.ts +59 -0
  71. package/dist/types/src/packlets/services/feed-syncer.d.ts.map +1 -0
  72. package/dist/types/src/packlets/services/feed-syncer.test.d.ts +2 -0
  73. package/dist/types/src/packlets/services/feed-syncer.test.d.ts.map +1 -0
  74. package/dist/types/src/packlets/services/platform.d.ts.map +1 -1
  75. package/dist/types/src/packlets/services/service-context.d.ts +12 -7
  76. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  77. package/dist/types/src/packlets/services/service-host.d.ts +19 -5
  78. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  79. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  80. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +10 -5
  81. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  82. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -2
  83. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  84. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  85. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  86. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -6
  87. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  88. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  89. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  90. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  91. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -5
  92. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  93. package/dist/types/src/packlets/worker/worker-runtime.d.ts +31 -4
  94. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  95. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -2
  96. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  97. package/dist/types/src/version.d.ts +1 -1
  98. package/dist/types/src/version.d.ts.map +1 -1
  99. package/dist/types/tsconfig.tsbuildinfo +1 -1
  100. package/package.json +70 -48
  101. package/src/packlets/agents/edge-agent-service.ts +11 -1
  102. package/src/packlets/devices/devices-service.ts +1 -1
  103. package/src/packlets/devtools/devtools.ts +2 -2
  104. package/src/packlets/diagnostics/index.ts +1 -1
  105. package/src/packlets/identity/authenticator.ts +2 -2
  106. package/src/packlets/identity/default-space-state-machine.ts +2 -2
  107. package/src/packlets/identity/identity-manager.ts +6 -6
  108. package/src/packlets/identity/identity-recovery-manager.ts +2 -2
  109. package/src/packlets/identity/identity.test.ts +4 -4
  110. package/src/packlets/identity/identity.ts +2 -2
  111. package/src/packlets/invitations/device-invitation-protocol.ts +5 -5
  112. package/src/packlets/invitations/invitation-guest-extenstion.ts +6 -4
  113. package/src/packlets/invitations/invitation-host-extension.ts +6 -4
  114. package/src/packlets/invitations/invitation-protocol.ts +2 -3
  115. package/src/packlets/invitations/invitations-handler.ts +7 -7
  116. package/src/packlets/invitations/space-invitation-protocol.ts +7 -13
  117. package/src/packlets/locks/index.ts +1 -1
  118. package/src/packlets/logging/logging-service.ts +5 -1
  119. package/src/packlets/services/client-rpc-server.ts +4 -4
  120. package/src/packlets/services/feed-syncer.test.ts +340 -0
  121. package/src/packlets/services/feed-syncer.ts +330 -0
  122. package/src/packlets/services/platform.ts +7 -1
  123. package/src/packlets/services/service-context.ts +53 -21
  124. package/src/packlets/services/service-host.ts +53 -16
  125. package/src/packlets/space-export/space-archive-reader.ts +1 -1
  126. package/src/packlets/space-export/space-archive-writer.ts +3 -1
  127. package/src/packlets/spaces/data-space-manager.ts +56 -21
  128. package/src/packlets/spaces/data-space.ts +10 -6
  129. package/src/packlets/spaces/edge-feed-replicator.test.ts +1 -1
  130. package/src/packlets/spaces/edge-feed-replicator.ts +3 -3
  131. package/src/packlets/spaces/epoch-migrations.ts +2 -2
  132. package/src/packlets/spaces/notarization-plugin.test.ts +2 -2
  133. package/src/packlets/spaces/notarization-plugin.ts +8 -8
  134. package/src/packlets/spaces/spaces-service.ts +10 -7
  135. package/src/packlets/storage/storage.ts +4 -4
  136. package/src/packlets/testing/invitation-utils.ts +7 -4
  137. package/src/packlets/testing/test-builder.ts +36 -10
  138. package/src/packlets/worker/worker-runtime.ts +149 -11
  139. package/src/packlets/worker/worker-session.ts +8 -8
  140. package/src/version.ts +1 -1
  141. package/dist/lib/browser/chunk-HWGM5TYF.mjs.map +0 -7
  142. package/dist/lib/node-esm/chunk-XUIY55CH.mjs.map +0 -7
@@ -1,6 +1,5 @@
1
1
  import "@dxos/node-std/globals";
2
2
  import {
3
- ClientRpcServer,
4
3
  ClientServicesHost,
5
4
  DataSpace,
6
5
  DataSpaceManager,
@@ -17,7 +16,6 @@ import {
17
16
  InvitationsHandler,
18
17
  InvitationsManager,
19
18
  InvitationsServiceImpl,
20
- Lock,
21
19
  ServiceContext,
22
20
  ServiceRegistry,
23
21
  SpaceInvitationProtocol,
@@ -25,17 +23,12 @@ import {
25
23
  TrustedKeySetAuthVerifier,
26
24
  createAdmissionKeypair,
27
25
  createAuthProvider,
28
- createCollectDiagnosticsBroadcastHandler,
29
- createCollectDiagnosticsBroadcastSender,
30
26
  createDiagnostics,
31
27
  createLevel,
32
28
  createStorageObjects,
33
- decodeProfileArchive,
34
- encodeProfileArchive,
35
- exportProfileData,
29
+ diagnostics_exports,
36
30
  getNetworkPeers,
37
- importProfileData,
38
- isLocked,
31
+ locks_exports,
39
32
  subscribeToFeedBlocks,
40
33
  subscribeToFeeds,
41
34
  subscribeToNetworkStatus,
@@ -43,128 +36,348 @@ import {
43
36
  subscribeToSignal,
44
37
  subscribeToSpaces,
45
38
  subscribeToSwarmInfo
46
- } from "./chunk-HWGM5TYF.mjs";
39
+ } from "./chunk-MQ6PWJ76.mjs";
40
+ import "./chunk-NQSC7HOE.mjs";
41
+ import {
42
+ __export,
43
+ __reExport
44
+ } from "./chunk-QCWEHHJW.mjs";
47
45
 
48
- // src/packlets/worker/worker-runtime.ts
49
- import { Trigger as Trigger2 } from "@dxos/async";
50
- import { DEFAULT_WORKER_BROADCAST_CHANNEL } from "@dxos/client-protocol";
51
- import { Context } from "@dxos/context";
52
- import { invariant as invariant2 } from "@dxos/invariant";
53
- import { log as log2 } from "@dxos/log";
54
- import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager, setIdentityTags } from "@dxos/messaging";
55
- import { RtcTransportProxyFactory } from "@dxos/network-manager";
46
+ // src/index.ts
47
+ var index_exports = {};
48
+ __export(index_exports, {
49
+ ClientRpcServer: () => ClientRpcServer,
50
+ ClientServicesHost: () => ClientServicesHost,
51
+ DataSpace: () => DataSpace,
52
+ DataSpaceManager: () => DataSpaceManager,
53
+ DeviceInvitationProtocol: () => DeviceInvitationProtocol,
54
+ DevtoolsHostEvents: () => DevtoolsHostEvents,
55
+ DevtoolsServiceImpl: () => DevtoolsServiceImpl,
56
+ DiagnosticsCollector: () => DiagnosticsCollector,
57
+ EdgeAgentManager: () => EdgeAgentManager,
58
+ EdgeAgentServiceImpl: () => EdgeAgentServiceImpl,
59
+ EdgeFeedReplicator: () => EdgeFeedReplicator,
60
+ Identity: () => Identity,
61
+ IdentityManager: () => IdentityManager,
62
+ IdentityServiceImpl: () => IdentityServiceImpl,
63
+ InvitationsHandler: () => InvitationsHandler,
64
+ InvitationsManager: () => InvitationsManager,
65
+ InvitationsServiceImpl: () => InvitationsServiceImpl,
66
+ ServiceContext: () => ServiceContext,
67
+ ServiceRegistry: () => ServiceRegistry,
68
+ SpaceInvitationProtocol: () => SpaceInvitationProtocol,
69
+ SpacesServiceImpl: () => SpacesServiceImpl,
70
+ TrustedKeySetAuthVerifier: () => TrustedKeySetAuthVerifier,
71
+ WorkerRuntime: () => WorkerRuntime,
72
+ WorkerSession: () => WorkerSession,
73
+ createAdmissionKeypair: () => createAdmissionKeypair,
74
+ createAuthProvider: () => createAuthProvider,
75
+ createDiagnostics: () => createDiagnostics,
76
+ createLevel: () => createLevel,
77
+ createStorageObjects: () => createStorageObjects,
78
+ decodeProfileArchive: () => decodeProfileArchive,
79
+ encodeProfileArchive: () => encodeProfileArchive,
80
+ exportProfileData: () => exportProfileData,
81
+ getNetworkPeers: () => getNetworkPeers,
82
+ importProfileData: () => importProfileData,
83
+ subscribeToFeedBlocks: () => subscribeToFeedBlocks,
84
+ subscribeToFeeds: () => subscribeToFeeds,
85
+ subscribeToNetworkStatus: () => subscribeToNetworkStatus,
86
+ subscribeToNetworkTopics: () => subscribeToNetworkTopics,
87
+ subscribeToSignal: () => subscribeToSignal,
88
+ subscribeToSpaces: () => subscribeToSpaces,
89
+ subscribeToSwarmInfo: () => subscribeToSwarmInfo
90
+ });
91
+ __reExport(index_exports, diagnostics_exports);
92
+ __reExport(index_exports, locks_exports);
56
93
 
57
- // src/packlets/worker/worker-session.ts
58
- import { Trigger, asyncTimeout } from "@dxos/async";
59
- import { PROXY_CONNECTION_TIMEOUT, iframeServiceBundle, workerServiceBundle } from "@dxos/client-protocol";
60
- import { invariant } from "@dxos/invariant";
61
- import { log, logInfo } from "@dxos/log";
62
- import { createProtoRpcPeer } from "@dxos/rpc";
63
- import { Callback } from "@dxos/util";
64
- function _define_property(obj, key, value) {
65
- if (key in obj) {
66
- Object.defineProperty(obj, key, {
67
- value,
68
- enumerable: true,
69
- configurable: true,
70
- writable: true
71
- });
72
- } else {
73
- obj[key] = value;
74
- }
75
- return obj;
76
- }
94
+ // src/packlets/services/client-rpc-server.ts
95
+ import { Stream } from "@dxos/codec-protobuf";
96
+ import { raise } from "@dxos/debug";
97
+ import { RpcPeer, parseMethodName } from "@dxos/rpc";
98
+ import { MapCounter, trace } from "@dxos/tracing";
77
99
  function _ts_decorate(decorators, target, key, desc) {
78
100
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
79
101
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
80
102
  else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
81
103
  return c > 3 && r && Object.defineProperty(target, key, r), r;
82
104
  }
83
- var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/worker/worker-session.ts";
84
- var WorkerSession = class {
105
+ var ClientRpcServer = class {
106
+ _serviceRegistry;
107
+ _rpcPeer;
108
+ _handlerCache = /* @__PURE__ */ new Map();
109
+ _handleCall;
110
+ _handleStream;
111
+ _callMetrics = new MapCounter();
112
+ get _services() {
113
+ return Object.keys(this._serviceRegistry.services);
114
+ }
115
+ constructor(params) {
116
+ const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;
117
+ this._handleCall = handleCall;
118
+ this._handleStream = handleStream;
119
+ this._serviceRegistry = serviceRegistry;
120
+ this._rpcPeer = new RpcPeer({
121
+ ...rpcOptions,
122
+ callHandler: (method, params2) => {
123
+ const [serviceName, methodName] = parseMethodName(method);
124
+ const handler = (method2, params3) => this._getServiceHandler(serviceName).call(method2, params3);
125
+ this._callMetrics.inc(`${serviceName}.${methodName} request`);
126
+ if (this._handleCall) {
127
+ return this._handleCall(methodName, params2, handler);
128
+ } else {
129
+ return handler(methodName, params2);
130
+ }
131
+ },
132
+ streamHandler: (method, params2) => {
133
+ const [serviceName, methodName] = parseMethodName(method);
134
+ const handler = (method2, params3) => this._getServiceHandler(serviceName).callStream(method2, params3);
135
+ this._callMetrics.inc(`${serviceName}.${methodName} request stream`);
136
+ if (this._handleStream) {
137
+ return Stream.map(Stream.unwrapPromise(this._handleStream(methodName, params2, handler)), (data) => {
138
+ this._callMetrics.inc(`${serviceName}.${methodName} response stream`);
139
+ return data;
140
+ });
141
+ } else {
142
+ return handler(methodName, params2);
143
+ }
144
+ }
145
+ });
146
+ }
85
147
  async open() {
86
- log.info("opening...", void 0, {
148
+ await this._rpcPeer.open();
149
+ }
150
+ async close() {
151
+ await this._rpcPeer.close();
152
+ }
153
+ _getServiceHandler(serviceName) {
154
+ if (!this._handlerCache.has(serviceName)) {
155
+ const [key, descriptor] = Object.entries(this._serviceRegistry.descriptors).find(([key2, descriptor2]) => descriptor2.name === serviceName) ?? raise(new Error(`Service not available: ${serviceName}`));
156
+ const service = this._serviceRegistry.services[key];
157
+ if (!service) {
158
+ throw new Error(`Service not available: ${serviceName}`);
159
+ }
160
+ this._handlerCache.set(serviceName, descriptor.createServer(service));
161
+ }
162
+ return this._handlerCache.get(serviceName);
163
+ }
164
+ };
165
+ _ts_decorate([
166
+ trace.metricsCounter()
167
+ ], ClientRpcServer.prototype, "_callMetrics", void 0);
168
+ _ts_decorate([
169
+ trace.info()
170
+ ], ClientRpcServer.prototype, "_services", null);
171
+ ClientRpcServer = _ts_decorate([
172
+ trace.resource()
173
+ ], ClientRpcServer);
174
+
175
+ // src/packlets/storage/profile-archive.ts
176
+ import { cbor } from "@automerge/automerge-repo";
177
+ import { invariant } from "@dxos/invariant";
178
+ import { log } from "@dxos/log";
179
+ import { ProfileArchiveEntryType } from "@dxos/protocols";
180
+ import { arrayToBuffer } from "@dxos/util";
181
+ var __dxlog_file = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/storage/profile-archive.ts";
182
+ var encodeProfileArchive = (profile) => cbor.encode(profile);
183
+ var decodeProfileArchive = (data) => cbor.decode(data);
184
+ var exportProfileData = async ({ storage, level }) => {
185
+ const archive = {
186
+ storage: [],
187
+ meta: {
188
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
189
+ }
190
+ };
191
+ {
192
+ const directory = await storage.createDirectory();
193
+ const files = await directory.list();
194
+ log.info("begin exporting files", {
195
+ count: files.length
196
+ }, {
87
197
  F: __dxlog_file,
88
- L: 122,
89
- S: this,
198
+ L: 31,
199
+ S: void 0,
90
200
  C: (f, a) => f(...a)
91
201
  });
92
- await Promise.all([
93
- this._clientRpc.open(),
94
- this._iframeRpc.open(),
95
- this._maybeOpenShell()
96
- ]);
97
- await this._startTrigger.wait({
98
- timeout: PROXY_CONNECTION_TIMEOUT
99
- });
100
- if (this.lockKey) {
101
- void this._afterLockReleases(this.lockKey, () => this.close());
202
+ for (const filename of files) {
203
+ const file = await directory.getOrCreateFile(filename);
204
+ const { size } = await file.stat();
205
+ const data = await file.read(0, size);
206
+ archive.storage.push({
207
+ type: ProfileArchiveEntryType.FILE,
208
+ key: filename,
209
+ value: data
210
+ });
102
211
  }
103
- log.info("opened", void 0, {
212
+ log.info("done exporting files", {
213
+ count: files.length
214
+ }, {
104
215
  F: __dxlog_file,
105
- L: 133,
106
- S: this,
216
+ L: 42,
217
+ S: void 0,
107
218
  C: (f, a) => f(...a)
108
219
  });
109
220
  }
110
- async close() {
111
- log.info("closing...", void 0, {
221
+ {
222
+ log.info("begin exporting kv pairs", void 0, {
112
223
  F: __dxlog_file,
113
- L: 137,
114
- S: this,
224
+ L: 46,
225
+ S: void 0,
115
226
  C: (f, a) => f(...a)
116
227
  });
117
- try {
118
- await this.onClose.callIfSet();
119
- } catch (err) {
120
- log.catch(err, void 0, {
121
- F: __dxlog_file,
122
- L: 141,
123
- S: this,
124
- C: (f, a) => f(...a)
228
+ const iter = await level.iterator({
229
+ keyEncoding: "binary",
230
+ valueEncoding: "binary"
231
+ });
232
+ let count = 0;
233
+ for await (const [key, value] of iter) {
234
+ archive.storage.push({
235
+ type: ProfileArchiveEntryType.KEY_VALUE,
236
+ key,
237
+ value
125
238
  });
239
+ count++;
126
240
  }
127
- await Promise.all([
128
- this._clientRpc.close(),
129
- this._iframeRpc.close()
130
- ]);
131
- log.info("closed", void 0, {
241
+ log.info("done exporting kv pairs", {
242
+ count
243
+ }, {
132
244
  F: __dxlog_file,
133
- L: 145,
134
- S: this,
245
+ L: 57,
246
+ S: void 0,
135
247
  C: (f, a) => f(...a)
136
248
  });
137
249
  }
138
- async _maybeOpenShell() {
139
- try {
140
- this._shellClientRpc && await asyncTimeout(this._shellClientRpc.open(), 1e3);
141
- } catch {
142
- log.info("No shell connected.", void 0, {
250
+ return archive;
251
+ };
252
+ var importProfileData = async ({ storage, level }, archive) => {
253
+ let batch = level.batch();
254
+ let count = 0;
255
+ for (const entry of archive.storage) {
256
+ switch (entry.type) {
257
+ case ProfileArchiveEntryType.FILE: {
258
+ const directory = await storage.createDirectory();
259
+ invariant(typeof entry.key === "string", "Invalid key type", {
260
+ F: __dxlog_file,
261
+ L: 80,
262
+ S: void 0,
263
+ A: [
264
+ "typeof entry.key === 'string'",
265
+ "'Invalid key type'"
266
+ ]
267
+ });
268
+ const file = await directory.getOrCreateFile(entry.key);
269
+ invariant(entry.value instanceof Uint8Array, "Invalid value type", {
270
+ F: __dxlog_file,
271
+ L: 82,
272
+ S: void 0,
273
+ A: [
274
+ "entry.value instanceof Uint8Array",
275
+ "'Invalid value type'"
276
+ ]
277
+ });
278
+ await file.write(0, arrayToBuffer(entry.value));
279
+ await file.close();
280
+ break;
281
+ }
282
+ case ProfileArchiveEntryType.KEY_VALUE: {
283
+ invariant(entry.key instanceof Uint8Array, "Invalid key type", {
284
+ F: __dxlog_file,
285
+ L: 88,
286
+ S: void 0,
287
+ A: [
288
+ "entry.key instanceof Uint8Array",
289
+ "'Invalid key type'"
290
+ ]
291
+ });
292
+ invariant(entry.value instanceof Uint8Array, "Invalid value type", {
293
+ F: __dxlog_file,
294
+ L: 89,
295
+ S: void 0,
296
+ A: [
297
+ "entry.value instanceof Uint8Array",
298
+ "'Invalid value type'"
299
+ ]
300
+ });
301
+ batch.put(entry.key, entry.value, {
302
+ keyEncoding: "binary",
303
+ valueEncoding: "binary"
304
+ });
305
+ break;
306
+ }
307
+ default:
308
+ throw new Error(`Invalid entry type: ${entry.type}`);
309
+ }
310
+ if (++count % 1e3 === 0) {
311
+ await batch.write();
312
+ batch = level.batch();
313
+ log.info("importing", {
314
+ count,
315
+ total: archive.storage.length,
316
+ progress: `${(count / archive.storage.length * 100).toFixed()}%`
317
+ }, {
143
318
  F: __dxlog_file,
144
- L: 152,
145
- S: this,
319
+ L: 102,
320
+ S: void 0,
146
321
  C: (f, a) => f(...a)
147
322
  });
148
323
  }
149
324
  }
150
- _afterLockReleases(lockKey, callback) {
151
- return navigator.locks.request(lockKey, () => {
152
- }).then(callback);
153
- }
325
+ log.info("committing changes..", void 0, {
326
+ F: __dxlog_file,
327
+ L: 110,
328
+ S: void 0,
329
+ C: (f, a) => f(...a)
330
+ });
331
+ await batch.write();
332
+ };
333
+
334
+ // src/packlets/worker/worker-runtime.ts
335
+ import * as Reactivity from "@effect/experimental/Reactivity";
336
+ import * as Effect from "effect/Effect";
337
+ import * as Layer from "effect/Layer";
338
+ import * as ManagedRuntime from "effect/ManagedRuntime";
339
+ import { Trigger as Trigger2 } from "@dxos/async";
340
+ import { DEFAULT_WORKER_BROADCAST_CHANNEL } from "@dxos/client-protocol";
341
+ import { Context } from "@dxos/context";
342
+ import { invariant as invariant3 } from "@dxos/invariant";
343
+ import { log as log3 } from "@dxos/log";
344
+ import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager, setIdentityTags } from "@dxos/messaging";
345
+ import { RtcTransportProxyFactory } from "@dxos/network-manager";
346
+ import * as OpfsWorker from "@dxos/sql-sqlite/OpfsWorker";
347
+ import * as SqlExport from "@dxos/sql-sqlite/SqlExport";
348
+ import * as SqliteClient from "@dxos/sql-sqlite/SqliteClient";
349
+ import * as SqlTransaction from "@dxos/sql-sqlite/SqlTransaction";
350
+
351
+ // src/packlets/worker/worker-session.ts
352
+ import { Trigger, asyncTimeout } from "@dxos/async";
353
+ import { PROXY_CONNECTION_TIMEOUT, iframeServiceBundle, workerServiceBundle } from "@dxos/client-protocol";
354
+ import { invariant as invariant2 } from "@dxos/invariant";
355
+ import { log as log2, logInfo } from "@dxos/log";
356
+ import { createProtoRpcPeer } from "@dxos/rpc";
357
+ import { Callback } from "@dxos/util";
358
+ function _ts_decorate2(decorators, target, key, desc) {
359
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
360
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
361
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
362
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
363
+ }
364
+ var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/worker/worker-session.ts";
365
+ var WorkerSession = class {
366
+ _clientRpc;
367
+ _shellClientRpc;
368
+ _iframeRpc;
369
+ _startTrigger = new Trigger();
370
+ _serviceHost;
371
+ onClose = new Callback();
372
+ origin;
373
+ // TODO(nf): factor out?
374
+ observabilityGroup;
375
+ signalTelemetryEnabled;
376
+ lockKey;
377
+ bridgeService;
154
378
  constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }) {
155
- _define_property(this, "_clientRpc", void 0);
156
- _define_property(this, "_shellClientRpc", void 0);
157
- _define_property(this, "_iframeRpc", void 0);
158
- _define_property(this, "_startTrigger", new Trigger());
159
- _define_property(this, "_serviceHost", void 0);
160
- _define_property(this, "onClose", new Callback());
161
- _define_property(this, "origin", void 0);
162
- _define_property(this, "observabilityGroup", void 0);
163
- _define_property(this, "signalTelemetryEnabled", void 0);
164
- _define_property(this, "lockKey", void 0);
165
- _define_property(this, "bridgeService", void 0);
166
- invariant(serviceHost, void 0, {
167
- F: __dxlog_file,
379
+ invariant2(serviceHost, void 0, {
380
+ F: __dxlog_file2,
168
381
  L: 54,
169
382
  S: this,
170
383
  A: [
@@ -220,8 +433,8 @@ var WorkerSession = class {
220
433
  try {
221
434
  await this.close();
222
435
  } catch (err) {
223
- log.catch(err, void 0, {
224
- F: __dxlog_file,
436
+ log2.catch(err, void 0, {
437
+ F: __dxlog_file2,
225
438
  L: 108,
226
439
  S: this,
227
440
  C: (f, a) => f(...a)
@@ -236,41 +449,147 @@ var WorkerSession = class {
236
449
  });
237
450
  this.bridgeService = this._iframeRpc.rpc.BridgeService;
238
451
  }
452
+ async open() {
453
+ log2("opening...", void 0, {
454
+ F: __dxlog_file2,
455
+ L: 122,
456
+ S: this,
457
+ C: (f, a) => f(...a)
458
+ });
459
+ await Promise.all([
460
+ this._clientRpc.open(),
461
+ this._iframeRpc.open(),
462
+ this._maybeOpenShell()
463
+ ]);
464
+ await this._startTrigger.wait({
465
+ timeout: PROXY_CONNECTION_TIMEOUT
466
+ });
467
+ if (this.lockKey) {
468
+ void this._afterLockReleases(this.lockKey, () => this.close());
469
+ }
470
+ log2("opened", void 0, {
471
+ F: __dxlog_file2,
472
+ L: 133,
473
+ S: this,
474
+ C: (f, a) => f(...a)
475
+ });
476
+ }
477
+ async close() {
478
+ log2.debug("closing...", void 0, {
479
+ F: __dxlog_file2,
480
+ L: 137,
481
+ S: this,
482
+ C: (f, a) => f(...a)
483
+ });
484
+ try {
485
+ await this.onClose.callIfSet();
486
+ } catch (err) {
487
+ log2.catch(err, void 0, {
488
+ F: __dxlog_file2,
489
+ L: 141,
490
+ S: this,
491
+ C: (f, a) => f(...a)
492
+ });
493
+ }
494
+ await Promise.all([
495
+ this._clientRpc.close(),
496
+ this._iframeRpc.close()
497
+ ]);
498
+ log2.debug("closed", void 0, {
499
+ F: __dxlog_file2,
500
+ L: 145,
501
+ S: this,
502
+ C: (f, a) => f(...a)
503
+ });
504
+ }
505
+ async _maybeOpenShell() {
506
+ try {
507
+ this._shellClientRpc && await asyncTimeout(this._shellClientRpc.open(), 1e3);
508
+ } catch {
509
+ log2.info("No shell connected.", void 0, {
510
+ F: __dxlog_file2,
511
+ L: 152,
512
+ S: this,
513
+ C: (f, a) => f(...a)
514
+ });
515
+ }
516
+ }
517
+ _afterLockReleases(lockKey, callback) {
518
+ return navigator.locks.request(lockKey, () => {
519
+ }).then(callback);
520
+ }
239
521
  };
240
- _ts_decorate([
522
+ _ts_decorate2([
241
523
  logInfo
242
524
  ], WorkerSession.prototype, "origin", void 0);
243
- _ts_decorate([
525
+ _ts_decorate2([
244
526
  logInfo
245
527
  ], WorkerSession.prototype, "lockKey", void 0);
246
528
 
247
529
  // src/packlets/worker/worker-runtime.ts
248
- function _define_property2(obj, key, value) {
249
- if (key in obj) {
250
- Object.defineProperty(obj, key, {
251
- value,
252
- enumerable: true,
253
- configurable: true,
254
- writable: true
530
+ var __dxlog_file3 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/worker/worker-runtime.ts";
531
+ var WorkerRuntime = class {
532
+ _configProvider;
533
+ _acquireLock;
534
+ _releaseLock;
535
+ _onStop;
536
+ _transportFactory = new RtcTransportProxyFactory();
537
+ _ready = new Trigger2();
538
+ _sessions = /* @__PURE__ */ new Set();
539
+ _clientServices;
540
+ _channel;
541
+ _automaticallyConnectWebrtc;
542
+ _livenessLock = new WebLockWrapper(`@dxos/client-services/WorkerRuntime/${crypto.randomUUID()}`);
543
+ _broadcastChannel;
544
+ _sessionForNetworking;
545
+ _config;
546
+ _signalMetadataTags = {
547
+ runtime: "worker-runtime"
548
+ };
549
+ _signalTelemetryEnabled = false;
550
+ _runtime;
551
+ constructor({ channel = DEFAULT_WORKER_BROADCAST_CHANNEL, configProvider, acquireLock, releaseLock, onStop, automaticallyConnectWebrtc = true, sqliteLayer }) {
552
+ this._configProvider = configProvider;
553
+ this._acquireLock = acquireLock;
554
+ this._releaseLock = releaseLock;
555
+ this._onStop = onStop;
556
+ this._channel = channel;
557
+ if (sqliteLayer) {
558
+ log3.warn("Using testing SQLite layer", void 0, {
559
+ F: __dxlog_file3,
560
+ L: 103,
561
+ S: this,
562
+ C: (f, a) => f(...a)
563
+ });
564
+ }
565
+ this._runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(sqliteLayer ?? LocalSqliteOpfsLayer), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));
566
+ this._clientServices = new ClientServicesHost({
567
+ callbacks: {
568
+ onReset: async () => this.stop()
569
+ },
570
+ runtime: this._runtime.runtimeEffect,
571
+ runtimeProps: {
572
+ // Auto-activate spaces that were previously active after leader changeover.
573
+ autoActivateSpaces: true
574
+ }
255
575
  });
256
- } else {
257
- obj[key] = value;
576
+ this._automaticallyConnectWebrtc = automaticallyConnectWebrtc;
258
577
  }
259
- return obj;
260
- }
261
- var __dxlog_file2 = "/__w/dxos/dxos/packages/sdk/client-services/src/packlets/worker/worker-runtime.ts";
262
- var WorkerRuntime = class {
263
578
  get host() {
264
579
  return this._clientServices;
265
580
  }
581
+ get livenessLockKey() {
582
+ return this._livenessLock.key;
583
+ }
266
584
  async start() {
267
- log2("starting...", void 0, {
268
- F: __dxlog_file2,
269
- L: 85,
585
+ log3("starting...", void 0, {
586
+ F: __dxlog_file3,
587
+ L: 132,
270
588
  S: this,
271
589
  C: (f, a) => f(...a)
272
590
  });
273
591
  try {
592
+ void this._livenessLock.acquire();
274
593
  this._broadcastChannel = new BroadcastChannel(this._channel);
275
594
  this._broadcastChannel.postMessage({
276
595
  action: "stop"
@@ -289,13 +608,13 @@ var WorkerRuntime = class {
289
608
  transportFactory: this._transportFactory
290
609
  });
291
610
  await this._clientServices.open(new Context(void 0, {
292
- F: __dxlog_file2,
293
- L: 108
611
+ F: __dxlog_file3,
612
+ L: 158
294
613
  }));
295
614
  this._ready.wake(void 0);
296
- log2("started", void 0, {
297
- F: __dxlog_file2,
298
- L: 110,
615
+ log3("started", void 0, {
616
+ F: __dxlog_file3,
617
+ L: 160,
299
618
  S: this,
300
619
  C: (f, a) => f(...a)
301
620
  });
@@ -308,9 +627,9 @@ var WorkerRuntime = class {
308
627
  });
309
628
  } catch (err) {
310
629
  this._ready.wake(err);
311
- log2.error("starting", err, {
312
- F: __dxlog_file2,
313
- L: 120,
630
+ log3.error("starting", err, {
631
+ F: __dxlog_file3,
632
+ L: 170,
314
633
  S: this,
315
634
  C: (f, a) => f(...a)
316
635
  });
@@ -321,12 +640,14 @@ var WorkerRuntime = class {
321
640
  this._broadcastChannel?.close();
322
641
  this._broadcastChannel = void 0;
323
642
  await this._clientServices.close();
643
+ await this._runtime.dispose();
324
644
  await this._onStop?.();
645
+ await this._livenessLock.release();
325
646
  }
326
647
  /**
327
648
  * Create a new session.
328
649
  */
329
- async createSession({ appPort, systemPort, shellPort }) {
650
+ async createSession({ appPort, systemPort, shellPort, onClose }) {
330
651
  const session = new WorkerSession({
331
652
  serviceHost: this._clientServices,
332
653
  appPort,
@@ -339,13 +660,16 @@ var WorkerRuntime = class {
339
660
  if (this._sessions.size === 0) {
340
661
  await this.stop();
341
662
  } else {
342
- this._reconnectWebrtc();
663
+ if (this._automaticallyConnectWebrtc) {
664
+ this._reconnectWebrtc();
665
+ }
343
666
  }
667
+ await onClose?.();
344
668
  });
345
669
  await session.open();
346
- invariant2(!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin, `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`, {
347
- F: __dxlog_file2,
348
- L: 158,
670
+ invariant3(!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin, `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`, {
671
+ F: __dxlog_file3,
672
+ L: 213,
349
673
  S: this,
350
674
  A: [
351
675
  "!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin",
@@ -358,15 +682,30 @@ var WorkerRuntime = class {
358
682
  this._signalTelemetryEnabled = session.signalTelemetryEnabled ?? false;
359
683
  this._signalMetadataTags.origin = session.origin;
360
684
  this._sessions.add(session);
361
- this._reconnectWebrtc();
685
+ if (this._automaticallyConnectWebrtc) {
686
+ this._reconnectWebrtc();
687
+ }
688
+ return session;
689
+ }
690
+ /**
691
+ * Connects the WebRTC bridge to the specified session.
692
+ * If no session is provided, disconnects the WebRTC bridge.
693
+ *
694
+ * Called automatically if `automaticallyConnectWebrtc` is true.
695
+ *
696
+ * @param session The session to connect the WebRTC bridge to.
697
+ */
698
+ connectWebrtcBridge(session) {
699
+ this._sessionForNetworking = session;
700
+ this._transportFactory.setBridgeService(session?.bridgeService);
362
701
  }
363
702
  /**
364
703
  * Selects one of the existing session for WebRTC networking.
365
704
  */
366
705
  _reconnectWebrtc() {
367
- log2("reconnecting webrtc...", void 0, {
368
- F: __dxlog_file2,
369
- L: 176,
706
+ log3("reconnecting webrtc...", void 0, {
707
+ F: __dxlog_file3,
708
+ L: 248,
370
709
  S: this,
371
710
  C: (f, a) => f(...a)
372
711
  });
@@ -377,42 +716,57 @@ var WorkerRuntime = class {
377
716
  }
378
717
  if (!this._sessionForNetworking) {
379
718
  const selected = Array.from(this._sessions).find((session) => session.bridgeService);
380
- if (selected) {
381
- this._sessionForNetworking = selected;
382
- this._transportFactory.setBridgeService(selected.bridgeService);
383
- } else {
384
- this._transportFactory.setBridgeService(void 0);
385
- }
719
+ this.connectWebrtcBridge(selected);
386
720
  }
387
721
  }
388
- constructor({ channel = DEFAULT_WORKER_BROADCAST_CHANNEL, configProvider, acquireLock, releaseLock, onStop }) {
389
- _define_property2(this, "_configProvider", void 0);
390
- _define_property2(this, "_acquireLock", void 0);
391
- _define_property2(this, "_releaseLock", void 0);
392
- _define_property2(this, "_onStop", void 0);
393
- _define_property2(this, "_transportFactory", new RtcTransportProxyFactory());
394
- _define_property2(this, "_ready", new Trigger2());
395
- _define_property2(this, "_sessions", /* @__PURE__ */ new Set());
396
- _define_property2(this, "_clientServices", void 0);
397
- _define_property2(this, "_channel", void 0);
398
- _define_property2(this, "_broadcastChannel", void 0);
399
- _define_property2(this, "_sessionForNetworking", void 0);
400
- _define_property2(this, "_config", void 0);
401
- _define_property2(this, "_signalMetadataTags", {
402
- runtime: "worker-runtime"
403
- });
404
- _define_property2(this, "_signalTelemetryEnabled", false);
405
- this._configProvider = configProvider;
406
- this._acquireLock = acquireLock;
407
- this._releaseLock = releaseLock;
408
- this._onStop = onStop;
409
- this._channel = channel;
410
- this._clientServices = new ClientServicesHost({
411
- callbacks: {
412
- onReset: async () => this.stop()
413
- }
722
+ };
723
+ var DB_NAME = "DXOS";
724
+ var SqlExportLayer = Layer.effect(SqlExport.SqlExport, Effect.gen(function* () {
725
+ const sql = yield* SqliteClient.SqliteClient;
726
+ return {
727
+ export: sql.export
728
+ };
729
+ }));
730
+ var LocalSqliteOpfsLayer = Layer.unwrapScoped(Effect.gen(function* () {
731
+ const { port1: clientPort, port2: serverPort } = new MessageChannel();
732
+ clientPort.start();
733
+ serverPort.start();
734
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
735
+ clientPort.close();
736
+ serverPort.close();
737
+ }));
738
+ yield* Effect.forkScoped(OpfsWorker.run({
739
+ port: serverPort,
740
+ dbName: DB_NAME
741
+ }));
742
+ return SqlExportLayer.pipe(Layer.provideMerge(SqliteClient.layer({
743
+ worker: Effect.succeed(clientPort)
744
+ })));
745
+ }));
746
+ var WebLockWrapper = class {
747
+ #key;
748
+ #release;
749
+ constructor(key) {
750
+ this.#key = key;
751
+ }
752
+ get key() {
753
+ return this.#key;
754
+ }
755
+ acquire(options = {}) {
756
+ return navigator.locks.request(this.#key, options, async () => {
757
+ await new Promise((resolve) => {
758
+ this.#release = resolve;
759
+ });
760
+ this.#release = void 0;
414
761
  });
415
762
  }
763
+ release() {
764
+ this.#release?.();
765
+ this.#release = void 0;
766
+ }
767
+ [Symbol.dispose]() {
768
+ this.release();
769
+ }
416
770
  };
417
771
  export {
418
772
  ClientRpcServer,
@@ -432,7 +786,6 @@ export {
432
786
  InvitationsHandler,
433
787
  InvitationsManager,
434
788
  InvitationsServiceImpl,
435
- Lock,
436
789
  ServiceContext,
437
790
  ServiceRegistry,
438
791
  SpaceInvitationProtocol,
@@ -442,8 +795,6 @@ export {
442
795
  WorkerSession,
443
796
  createAdmissionKeypair,
444
797
  createAuthProvider,
445
- createCollectDiagnosticsBroadcastHandler,
446
- createCollectDiagnosticsBroadcastSender,
447
798
  createDiagnostics,
448
799
  createLevel,
449
800
  createStorageObjects,
@@ -452,7 +803,6 @@ export {
452
803
  exportProfileData,
453
804
  getNetworkPeers,
454
805
  importProfileData,
455
- isLocked,
456
806
  subscribeToFeedBlocks,
457
807
  subscribeToFeeds,
458
808
  subscribeToNetworkStatus,