@dxos/client-services 0.8.4-main.1da679c → 0.8.4-main.21d9917

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 (131) hide show
  1. package/dist/lib/browser/chunk-NQSC7HOE.mjs +22 -0
  2. package/dist/lib/browser/chunk-NQSC7HOE.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
  4. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-XT2YQZXS.mjs → chunk-QWDES2YZ.mjs} +1681 -2334
  6. package/dist/lib/browser/chunk-QWDES2YZ.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +513 -171
  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-MDSLKO5V.mjs → chunk-2ZEVKBWH.mjs} +1231 -1753
  23. package/dist/lib/node-esm/chunk-2ZEVKBWH.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 +513 -171
  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/services/client-rpc-server.d.ts +2 -2
  67. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  68. package/dist/types/src/packlets/services/service-context.d.ts +13 -7
  69. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  70. package/dist/types/src/packlets/services/service-host.d.ts +19 -5
  71. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  72. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  73. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +10 -5
  74. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  75. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -2
  76. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  77. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  78. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  79. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -6
  80. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  81. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  82. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  83. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  84. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -5
  85. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  86. package/dist/types/src/packlets/worker/worker-runtime.d.ts +23 -4
  87. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  88. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -2
  89. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  90. package/dist/types/src/version.d.ts +1 -1
  91. package/dist/types/tsconfig.tsbuildinfo +1 -1
  92. package/package.json +70 -48
  93. package/src/packlets/agents/edge-agent-service.ts +11 -1
  94. package/src/packlets/devices/devices-service.ts +1 -1
  95. package/src/packlets/devtools/devtools.ts +2 -2
  96. package/src/packlets/diagnostics/index.ts +1 -1
  97. package/src/packlets/identity/authenticator.ts +2 -2
  98. package/src/packlets/identity/default-space-state-machine.ts +2 -2
  99. package/src/packlets/identity/identity-manager.ts +6 -6
  100. package/src/packlets/identity/identity-recovery-manager.ts +2 -2
  101. package/src/packlets/identity/identity.test.ts +4 -4
  102. package/src/packlets/identity/identity.ts +2 -2
  103. package/src/packlets/invitations/device-invitation-protocol.ts +5 -5
  104. package/src/packlets/invitations/invitation-guest-extenstion.ts +6 -4
  105. package/src/packlets/invitations/invitation-host-extension.ts +6 -4
  106. package/src/packlets/invitations/invitation-protocol.ts +2 -3
  107. package/src/packlets/invitations/invitations-handler.ts +7 -7
  108. package/src/packlets/invitations/space-invitation-protocol.ts +7 -13
  109. package/src/packlets/locks/index.ts +1 -1
  110. package/src/packlets/logging/logging-service.ts +1 -1
  111. package/src/packlets/services/client-rpc-server.ts +4 -4
  112. package/src/packlets/services/service-context.ts +30 -19
  113. package/src/packlets/services/service-host.ts +62 -16
  114. package/src/packlets/space-export/space-archive-reader.ts +1 -1
  115. package/src/packlets/space-export/space-archive-writer.ts +3 -1
  116. package/src/packlets/spaces/data-space-manager.ts +56 -21
  117. package/src/packlets/spaces/data-space.ts +7 -6
  118. package/src/packlets/spaces/edge-feed-replicator.test.ts +1 -1
  119. package/src/packlets/spaces/edge-feed-replicator.ts +3 -3
  120. package/src/packlets/spaces/epoch-migrations.ts +2 -2
  121. package/src/packlets/spaces/notarization-plugin.test.ts +2 -2
  122. package/src/packlets/spaces/notarization-plugin.ts +8 -8
  123. package/src/packlets/spaces/spaces-service.ts +10 -7
  124. package/src/packlets/storage/storage.ts +4 -4
  125. package/src/packlets/testing/invitation-utils.ts +7 -4
  126. package/src/packlets/testing/test-builder.ts +36 -10
  127. package/src/packlets/worker/worker-runtime.ts +141 -11
  128. package/src/packlets/worker/worker-session.ts +4 -4
  129. package/src/version.ts +1 -1
  130. package/dist/lib/browser/chunk-XT2YQZXS.mjs.map +0 -7
  131. package/dist/lib/node-esm/chunk-MDSLKO5V.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-XT2YQZXS.mjs";
39
+ } from "./chunk-QWDES2YZ.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,140 @@ var WorkerSession = class {
236
449
  });
237
450
  this.bridgeService = this._iframeRpc.rpc.BridgeService;
238
451
  }
452
+ async open() {
453
+ log2.info("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.info("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.info("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.info("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, enableFullTextIndexing }) {
552
+ this._configProvider = configProvider;
553
+ this._acquireLock = acquireLock;
554
+ this._releaseLock = releaseLock;
555
+ this._onStop = onStop;
556
+ this._channel = channel;
557
+ this._runtime = ManagedRuntime.make(SqlTransaction.layer.pipe(Layer.provideMerge(LocalSqliteOpfsLayer), Layer.provideMerge(Reactivity.layer)).pipe(Layer.orDie));
558
+ this._clientServices = new ClientServicesHost({
559
+ callbacks: {
560
+ onReset: async () => this.stop()
561
+ },
562
+ runtime: this._runtime.runtimeEffect,
563
+ runtimeProps: {
564
+ enableFullTextIndexing,
565
+ // Auto-activate spaces that were previously active after leader changeover.
566
+ autoActivateSpaces: true
567
+ }
255
568
  });
256
- } else {
257
- obj[key] = value;
569
+ this._automaticallyConnectWebrtc = automaticallyConnectWebrtc;
258
570
  }
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
571
  get host() {
264
572
  return this._clientServices;
265
573
  }
574
+ get livenessLockKey() {
575
+ return this._livenessLock.key;
576
+ }
266
577
  async start() {
267
- log2("starting...", void 0, {
268
- F: __dxlog_file2,
269
- L: 85,
578
+ log3("starting...", void 0, {
579
+ F: __dxlog_file3,
580
+ L: 125,
270
581
  S: this,
271
582
  C: (f, a) => f(...a)
272
583
  });
273
584
  try {
585
+ void this._livenessLock.acquire();
274
586
  this._broadcastChannel = new BroadcastChannel(this._channel);
275
587
  this._broadcastChannel.postMessage({
276
588
  action: "stop"
@@ -289,13 +601,13 @@ var WorkerRuntime = class {
289
601
  transportFactory: this._transportFactory
290
602
  });
291
603
  await this._clientServices.open(new Context(void 0, {
292
- F: __dxlog_file2,
293
- L: 108
604
+ F: __dxlog_file3,
605
+ L: 151
294
606
  }));
295
607
  this._ready.wake(void 0);
296
- log2("started", void 0, {
297
- F: __dxlog_file2,
298
- L: 110,
608
+ log3("started", void 0, {
609
+ F: __dxlog_file3,
610
+ L: 153,
299
611
  S: this,
300
612
  C: (f, a) => f(...a)
301
613
  });
@@ -308,9 +620,9 @@ var WorkerRuntime = class {
308
620
  });
309
621
  } catch (err) {
310
622
  this._ready.wake(err);
311
- log2.error("starting", err, {
312
- F: __dxlog_file2,
313
- L: 120,
623
+ log3.error("starting", err, {
624
+ F: __dxlog_file3,
625
+ L: 163,
314
626
  S: this,
315
627
  C: (f, a) => f(...a)
316
628
  });
@@ -321,7 +633,9 @@ var WorkerRuntime = class {
321
633
  this._broadcastChannel?.close();
322
634
  this._broadcastChannel = void 0;
323
635
  await this._clientServices.close();
636
+ await this._runtime.dispose();
324
637
  await this._onStop?.();
638
+ await this._livenessLock.release();
325
639
  }
326
640
  /**
327
641
  * Create a new session.
@@ -339,13 +653,15 @@ var WorkerRuntime = class {
339
653
  if (this._sessions.size === 0) {
340
654
  await this.stop();
341
655
  } else {
342
- this._reconnectWebrtc();
656
+ if (this._automaticallyConnectWebrtc) {
657
+ this._reconnectWebrtc();
658
+ }
343
659
  }
344
660
  });
345
661
  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,
662
+ invariant3(!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin, `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`, {
663
+ F: __dxlog_file3,
664
+ L: 205,
349
665
  S: this,
350
666
  A: [
351
667
  "!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin",
@@ -358,15 +674,30 @@ var WorkerRuntime = class {
358
674
  this._signalTelemetryEnabled = session.signalTelemetryEnabled ?? false;
359
675
  this._signalMetadataTags.origin = session.origin;
360
676
  this._sessions.add(session);
361
- this._reconnectWebrtc();
677
+ if (this._automaticallyConnectWebrtc) {
678
+ this._reconnectWebrtc();
679
+ }
680
+ return session;
681
+ }
682
+ /**
683
+ * Connects the WebRTC bridge to the specified session.
684
+ * If no session is provided, disconnects the WebRTC bridge.
685
+ *
686
+ * Called automatically if `automaticallyConnectWebrtc` is true.
687
+ *
688
+ * @param session The session to connect the WebRTC bridge to.
689
+ */
690
+ connectWebrtcBridge(session) {
691
+ this._sessionForNetworking = session;
692
+ this._transportFactory.setBridgeService(session?.bridgeService);
362
693
  }
363
694
  /**
364
695
  * Selects one of the existing session for WebRTC networking.
365
696
  */
366
697
  _reconnectWebrtc() {
367
- log2("reconnecting webrtc...", void 0, {
368
- F: __dxlog_file2,
369
- L: 176,
698
+ log3("reconnecting webrtc...", void 0, {
699
+ F: __dxlog_file3,
700
+ L: 240,
370
701
  S: this,
371
702
  C: (f, a) => f(...a)
372
703
  });
@@ -377,42 +708,57 @@ var WorkerRuntime = class {
377
708
  }
378
709
  if (!this._sessionForNetworking) {
379
710
  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
- }
711
+ this.connectWebrtcBridge(selected);
386
712
  }
387
713
  }
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
- }
714
+ };
715
+ var DB_NAME = "DXOS";
716
+ var SqlExportLayer = Layer.effect(SqlExport.SqlExport, Effect.gen(function* () {
717
+ const sql = yield* SqliteClient.SqliteClient;
718
+ return {
719
+ export: sql.export
720
+ };
721
+ }));
722
+ var LocalSqliteOpfsLayer = Layer.unwrapScoped(Effect.gen(function* () {
723
+ const { port1: clientPort, port2: serverPort } = new MessageChannel();
724
+ clientPort.start();
725
+ serverPort.start();
726
+ yield* Effect.addFinalizer(() => Effect.sync(() => {
727
+ clientPort.close();
728
+ serverPort.close();
729
+ }));
730
+ yield* Effect.forkScoped(OpfsWorker.run({
731
+ port: serverPort,
732
+ dbName: DB_NAME
733
+ }));
734
+ return SqlExportLayer.pipe(Layer.provideMerge(SqliteClient.layer({
735
+ worker: Effect.succeed(clientPort)
736
+ })));
737
+ }));
738
+ var WebLockWrapper = class {
739
+ #key;
740
+ #release;
741
+ constructor(key) {
742
+ this.#key = key;
743
+ }
744
+ get key() {
745
+ return this.#key;
746
+ }
747
+ acquire(options = {}) {
748
+ return navigator.locks.request(this.#key, options, async () => {
749
+ await new Promise((resolve) => {
750
+ this.#release = resolve;
751
+ });
752
+ this.#release = void 0;
414
753
  });
415
754
  }
755
+ release() {
756
+ this.#release?.();
757
+ this.#release = void 0;
758
+ }
759
+ [Symbol.dispose]() {
760
+ this.release();
761
+ }
416
762
  };
417
763
  export {
418
764
  ClientRpcServer,
@@ -432,7 +778,6 @@ export {
432
778
  InvitationsHandler,
433
779
  InvitationsManager,
434
780
  InvitationsServiceImpl,
435
- Lock,
436
781
  ServiceContext,
437
782
  ServiceRegistry,
438
783
  SpaceInvitationProtocol,
@@ -442,8 +787,6 @@ export {
442
787
  WorkerSession,
443
788
  createAdmissionKeypair,
444
789
  createAuthProvider,
445
- createCollectDiagnosticsBroadcastHandler,
446
- createCollectDiagnosticsBroadcastSender,
447
790
  createDiagnostics,
448
791
  createLevel,
449
792
  createStorageObjects,
@@ -452,7 +795,6 @@ export {
452
795
  exportProfileData,
453
796
  getNetworkPeers,
454
797
  importProfileData,
455
- isLocked,
456
798
  subscribeToFeedBlocks,
457
799
  subscribeToFeeds,
458
800
  subscribeToNetworkStatus,