@dxos/client-services 0.6.8-main.3be982f → 0.6.8-staging.63bcb81

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 (46) hide show
  1. package/dist/lib/browser/{chunk-I6MMWGWX.mjs → chunk-IOA57UTY.mjs} +183 -135
  2. package/dist/lib/browser/chunk-IOA57UTY.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +7 -7
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/testing/index.mjs +17 -10
  7. package/dist/lib/browser/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-PAH5HN65.cjs → chunk-5ZXCTX74.cjs} +185 -137
  9. package/dist/lib/node/chunk-5ZXCTX74.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +51 -51
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/testing/index.cjs +23 -16
  14. package/dist/lib/node/testing/index.cjs.map +3 -3
  15. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  16. package/dist/types/src/packlets/identity/identity-manager.d.ts +4 -1
  17. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  18. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  19. package/dist/types/src/packlets/services/service-context.d.ts +3 -1
  20. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  21. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  22. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +4 -0
  23. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  24. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -0
  25. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  26. package/dist/types/src/packlets/testing/test-builder.d.ts +6 -4
  27. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  28. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  29. package/dist/types/src/version.d.ts +1 -1
  30. package/dist/types/src/version.d.ts.map +1 -1
  31. package/package.json +37 -37
  32. package/src/packlets/devtools/network.ts +12 -5
  33. package/src/packlets/identity/identity-manager.ts +5 -0
  34. package/src/packlets/identity/identity.test.ts +3 -0
  35. package/src/packlets/invitations/invitations-handler.ts +0 -1
  36. package/src/packlets/network/network-service.ts +3 -3
  37. package/src/packlets/services/service-context.test.ts +4 -2
  38. package/src/packlets/services/service-context.ts +31 -3
  39. package/src/packlets/services/service-host.ts +20 -11
  40. package/src/packlets/spaces/data-space-manager.ts +8 -0
  41. package/src/packlets/spaces/data-space.ts +3 -1
  42. package/src/packlets/testing/test-builder.ts +21 -9
  43. package/src/packlets/worker/worker-runtime.ts +5 -3
  44. package/src/version.ts +1 -1
  45. package/dist/lib/browser/chunk-I6MMWGWX.mjs.map +0 -7
  46. package/dist/lib/node/chunk-PAH5HN65.cjs.map +0 -7
@@ -18,52 +18,52 @@ var __copyProps = (to, from, except, desc) => {
18
18
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
19
  var node_exports = {};
20
20
  __export(node_exports, {
21
- ClientRpcServer: () => import_chunk_PAH5HN65.ClientRpcServer,
22
- ClientServicesHost: () => import_chunk_PAH5HN65.ClientServicesHost,
23
- DataSpace: () => import_chunk_PAH5HN65.DataSpace,
24
- DataSpaceManager: () => import_chunk_PAH5HN65.DataSpaceManager,
25
- DeviceInvitationProtocol: () => import_chunk_PAH5HN65.DeviceInvitationProtocol,
26
- DevtoolsHostEvents: () => import_chunk_PAH5HN65.DevtoolsHostEvents,
27
- DevtoolsServiceImpl: () => import_chunk_PAH5HN65.DevtoolsServiceImpl,
28
- DiagnosticsCollector: () => import_chunk_PAH5HN65.DiagnosticsCollector,
29
- EdgeFeedReplicator: () => import_chunk_PAH5HN65.EdgeFeedReplicator,
30
- Identity: () => import_chunk_PAH5HN65.Identity,
31
- IdentityManager: () => import_chunk_PAH5HN65.IdentityManager,
32
- IdentityServiceImpl: () => import_chunk_PAH5HN65.IdentityServiceImpl,
33
- InvitationsHandler: () => import_chunk_PAH5HN65.InvitationsHandler,
34
- InvitationsManager: () => import_chunk_PAH5HN65.InvitationsManager,
35
- InvitationsServiceImpl: () => import_chunk_PAH5HN65.InvitationsServiceImpl,
36
- Lock: () => import_chunk_PAH5HN65.Lock,
37
- ServiceContext: () => import_chunk_PAH5HN65.ServiceContext,
38
- ServiceRegistry: () => import_chunk_PAH5HN65.ServiceRegistry,
39
- SpaceInvitationProtocol: () => import_chunk_PAH5HN65.SpaceInvitationProtocol,
40
- SpacesServiceImpl: () => import_chunk_PAH5HN65.SpacesServiceImpl,
41
- TrustedKeySetAuthVerifier: () => import_chunk_PAH5HN65.TrustedKeySetAuthVerifier,
21
+ ClientRpcServer: () => import_chunk_5ZXCTX74.ClientRpcServer,
22
+ ClientServicesHost: () => import_chunk_5ZXCTX74.ClientServicesHost,
23
+ DataSpace: () => import_chunk_5ZXCTX74.DataSpace,
24
+ DataSpaceManager: () => import_chunk_5ZXCTX74.DataSpaceManager,
25
+ DeviceInvitationProtocol: () => import_chunk_5ZXCTX74.DeviceInvitationProtocol,
26
+ DevtoolsHostEvents: () => import_chunk_5ZXCTX74.DevtoolsHostEvents,
27
+ DevtoolsServiceImpl: () => import_chunk_5ZXCTX74.DevtoolsServiceImpl,
28
+ DiagnosticsCollector: () => import_chunk_5ZXCTX74.DiagnosticsCollector,
29
+ EdgeFeedReplicator: () => import_chunk_5ZXCTX74.EdgeFeedReplicator,
30
+ Identity: () => import_chunk_5ZXCTX74.Identity,
31
+ IdentityManager: () => import_chunk_5ZXCTX74.IdentityManager,
32
+ IdentityServiceImpl: () => import_chunk_5ZXCTX74.IdentityServiceImpl,
33
+ InvitationsHandler: () => import_chunk_5ZXCTX74.InvitationsHandler,
34
+ InvitationsManager: () => import_chunk_5ZXCTX74.InvitationsManager,
35
+ InvitationsServiceImpl: () => import_chunk_5ZXCTX74.InvitationsServiceImpl,
36
+ Lock: () => import_chunk_5ZXCTX74.Lock,
37
+ ServiceContext: () => import_chunk_5ZXCTX74.ServiceContext,
38
+ ServiceRegistry: () => import_chunk_5ZXCTX74.ServiceRegistry,
39
+ SpaceInvitationProtocol: () => import_chunk_5ZXCTX74.SpaceInvitationProtocol,
40
+ SpacesServiceImpl: () => import_chunk_5ZXCTX74.SpacesServiceImpl,
41
+ TrustedKeySetAuthVerifier: () => import_chunk_5ZXCTX74.TrustedKeySetAuthVerifier,
42
42
  WorkerRuntime: () => WorkerRuntime,
43
43
  WorkerSession: () => WorkerSession,
44
- createAdmissionKeypair: () => import_chunk_PAH5HN65.createAdmissionKeypair,
45
- createAuthProvider: () => import_chunk_PAH5HN65.createAuthProvider,
46
- createCollectDiagnosticsBroadcastHandler: () => import_chunk_PAH5HN65.createCollectDiagnosticsBroadcastHandler,
47
- createCollectDiagnosticsBroadcastSender: () => import_chunk_PAH5HN65.createCollectDiagnosticsBroadcastSender,
48
- createDiagnostics: () => import_chunk_PAH5HN65.createDiagnostics,
49
- createLevel: () => import_chunk_PAH5HN65.createLevel,
50
- createStorageObjects: () => import_chunk_PAH5HN65.createStorageObjects,
51
- decodeProfileArchive: () => import_chunk_PAH5HN65.decodeProfileArchive,
52
- encodeProfileArchive: () => import_chunk_PAH5HN65.encodeProfileArchive,
53
- exportProfileData: () => import_chunk_PAH5HN65.exportProfileData,
54
- getNetworkPeers: () => import_chunk_PAH5HN65.getNetworkPeers,
55
- importProfileData: () => import_chunk_PAH5HN65.importProfileData,
56
- isLocked: () => import_chunk_PAH5HN65.isLocked,
57
- subscribeToFeedBlocks: () => import_chunk_PAH5HN65.subscribeToFeedBlocks,
58
- subscribeToFeeds: () => import_chunk_PAH5HN65.subscribeToFeeds,
59
- subscribeToNetworkStatus: () => import_chunk_PAH5HN65.subscribeToNetworkStatus,
60
- subscribeToNetworkTopics: () => import_chunk_PAH5HN65.subscribeToNetworkTopics,
61
- subscribeToSignal: () => import_chunk_PAH5HN65.subscribeToSignal,
62
- subscribeToSpaces: () => import_chunk_PAH5HN65.subscribeToSpaces,
63
- subscribeToSwarmInfo: () => import_chunk_PAH5HN65.subscribeToSwarmInfo
44
+ createAdmissionKeypair: () => import_chunk_5ZXCTX74.createAdmissionKeypair,
45
+ createAuthProvider: () => import_chunk_5ZXCTX74.createAuthProvider,
46
+ createCollectDiagnosticsBroadcastHandler: () => import_chunk_5ZXCTX74.createCollectDiagnosticsBroadcastHandler,
47
+ createCollectDiagnosticsBroadcastSender: () => import_chunk_5ZXCTX74.createCollectDiagnosticsBroadcastSender,
48
+ createDiagnostics: () => import_chunk_5ZXCTX74.createDiagnostics,
49
+ createLevel: () => import_chunk_5ZXCTX74.createLevel,
50
+ createStorageObjects: () => import_chunk_5ZXCTX74.createStorageObjects,
51
+ decodeProfileArchive: () => import_chunk_5ZXCTX74.decodeProfileArchive,
52
+ encodeProfileArchive: () => import_chunk_5ZXCTX74.encodeProfileArchive,
53
+ exportProfileData: () => import_chunk_5ZXCTX74.exportProfileData,
54
+ getNetworkPeers: () => import_chunk_5ZXCTX74.getNetworkPeers,
55
+ importProfileData: () => import_chunk_5ZXCTX74.importProfileData,
56
+ isLocked: () => import_chunk_5ZXCTX74.isLocked,
57
+ subscribeToFeedBlocks: () => import_chunk_5ZXCTX74.subscribeToFeedBlocks,
58
+ subscribeToFeeds: () => import_chunk_5ZXCTX74.subscribeToFeeds,
59
+ subscribeToNetworkStatus: () => import_chunk_5ZXCTX74.subscribeToNetworkStatus,
60
+ subscribeToNetworkTopics: () => import_chunk_5ZXCTX74.subscribeToNetworkTopics,
61
+ subscribeToSignal: () => import_chunk_5ZXCTX74.subscribeToSignal,
62
+ subscribeToSpaces: () => import_chunk_5ZXCTX74.subscribeToSpaces,
63
+ subscribeToSwarmInfo: () => import_chunk_5ZXCTX74.subscribeToSwarmInfo
64
64
  });
65
65
  module.exports = __toCommonJS(node_exports);
66
- var import_chunk_PAH5HN65 = require("./chunk-PAH5HN65.cjs");
66
+ var import_chunk_5ZXCTX74 = require("./chunk-5ZXCTX74.cjs");
67
67
  var import_async = require("@dxos/async");
68
68
  var import_client_protocol = require("@dxos/client-protocol");
69
69
  var import_context = require("@dxos/context");
@@ -122,12 +122,12 @@ var WorkerSession = class {
122
122
  return handler(method, params);
123
123
  }
124
124
  };
125
- this._clientRpc = new import_chunk_PAH5HN65.ClientRpcServer({
125
+ this._clientRpc = new import_chunk_5ZXCTX74.ClientRpcServer({
126
126
  serviceRegistry: this._serviceHost.serviceRegistry,
127
127
  port: appPort,
128
128
  ...middleware
129
129
  });
130
- this._shellClientRpc = shellPort ? new import_chunk_PAH5HN65.ClientRpcServer({
130
+ this._shellClientRpc = shellPort ? new import_chunk_5ZXCTX74.ClientRpcServer({
131
131
  serviceRegistry: this._serviceHost.serviceRegistry,
132
132
  port: shellPort,
133
133
  ...middleware
@@ -256,7 +256,7 @@ var WorkerRuntime = class {
256
256
  this._releaseLock = releaseLock;
257
257
  this._onStop = onStop;
258
258
  this._channel = channel;
259
- this._clientServices = new import_chunk_PAH5HN65.ClientServicesHost({
259
+ this._clientServices = new import_chunk_5ZXCTX74.ClientServicesHost({
260
260
  callbacks: {
261
261
  onReset: async () => this.stop()
262
262
  }
@@ -287,17 +287,17 @@ var WorkerRuntime = class {
287
287
  const signals = this._config.get("runtime.services.signaling");
288
288
  this._clientServices.initialize({
289
289
  config: this._config,
290
- signalManager: signals ? new import_messaging.WebsocketSignalManager(signals, () => this._signalTelemetryEnabled ? this._signalMetadataTags : {}) : new import_messaging.MemorySignalManager(new import_messaging.MemorySignalManagerContext()),
290
+ signalManager: this._config.get("runtime.client.edgeFeatures")?.signaling ? void 0 : signals ? new import_messaging.WebsocketSignalManager(signals, () => this._signalTelemetryEnabled ? this._signalMetadataTags : {}) : new import_messaging.MemorySignalManager(new import_messaging.MemorySignalManagerContext()),
291
291
  transportFactory: this._transportFactory
292
292
  });
293
293
  await this._clientServices.open(new import_context.Context(void 0, {
294
294
  F: __dxlog_file2,
295
- L: 105
295
+ L: 107
296
296
  }));
297
297
  this._ready.wake(void 0);
298
298
  (0, import_log.log)("started", void 0, {
299
299
  F: __dxlog_file2,
300
- L: 107,
300
+ L: 109,
301
301
  S: this,
302
302
  C: (f, a) => f(...a)
303
303
  });
@@ -312,7 +312,7 @@ var WorkerRuntime = class {
312
312
  this._ready.wake(err);
313
313
  import_log.log.error("starting", err, {
314
314
  F: __dxlog_file2,
315
- L: 117,
315
+ L: 119,
316
316
  S: this,
317
317
  C: (f, a) => f(...a)
318
318
  });
@@ -347,7 +347,7 @@ var WorkerRuntime = class {
347
347
  await session.open();
348
348
  (0, import_invariant.invariant)(!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin, `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`, {
349
349
  F: __dxlog_file2,
350
- L: 155,
350
+ L: 157,
351
351
  S: this,
352
352
  A: [
353
353
  "!this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin",
@@ -368,7 +368,7 @@ var WorkerRuntime = class {
368
368
  _reconnectWebrtc() {
369
369
  (0, import_log.log)("reconnecting webrtc...", void 0, {
370
370
  F: __dxlog_file2,
371
- L: 173,
371
+ L: 175,
372
372
  S: this,
373
373
  C: (f, a) => f(...a)
374
374
  });
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/packlets/worker/worker-runtime.ts", "../../../src/packlets/worker/worker-session.ts"],
4
- "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { DEFAULT_WORKER_BROADCAST_CHANNEL } from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport {\n MemorySignalManager,\n MemorySignalManagerContext,\n WebsocketSignalManager,\n setIdentityTags,\n} from '@dxos/messaging';\nimport { SimplePeerTransportProxyFactory } from '@dxos/network-manager';\nimport { type RpcPort } from '@dxos/rpc';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { WorkerSession } from './worker-session';\nimport { ClientServicesHost } from '../services';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type CreateSessionParams = {\n appPort: RpcPort;\n systemPort: RpcPort;\n shellPort?: RpcPort;\n};\n\nexport type WorkerRuntimeOptions = {\n channel?: string;\n configProvider: () => MaybePromise<Config>;\n acquireLock: () => Promise<void>;\n releaseLock: () => void;\n onStop?: () => Promise<void>;\n};\n\n/**\n * Runtime for the shared worker.\n * Manages connections from proxies (in tabs).\n * Tabs make requests to the `ClientServicesHost`, and provide a WebRTC gateway.\n */\nexport class WorkerRuntime {\n private readonly _configProvider: () => MaybePromise<Config>;\n private readonly _acquireLock: () => Promise<void>;\n private readonly _releaseLock: () => void;\n private readonly _onStop?: () => Promise<void>;\n private readonly _transportFactory = new SimplePeerTransportProxyFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n private readonly _sessions = new Set<WorkerSession>();\n private readonly _clientServices!: ClientServicesHost;\n private readonly _channel: string;\n private _broadcastChannel?: BroadcastChannel;\n private _sessionForNetworking?: WorkerSession; // TODO(burdon): Expose to client QueryStatusResponse.\n private _config!: Config;\n private _signalMetadataTags: any = { runtime: 'worker-runtime' };\n private _signalTelemetryEnabled: boolean = false;\n\n constructor({\n channel = DEFAULT_WORKER_BROADCAST_CHANNEL,\n configProvider,\n acquireLock,\n releaseLock,\n onStop,\n }: WorkerRuntimeOptions) {\n this._configProvider = configProvider;\n this._acquireLock = acquireLock;\n this._releaseLock = releaseLock;\n this._onStop = onStop;\n this._channel = channel;\n this._clientServices = new ClientServicesHost({\n callbacks: {\n onReset: async () => this.stop(),\n },\n });\n }\n\n get host() {\n return this._clientServices;\n }\n\n async start() {\n log('starting...');\n try {\n this._broadcastChannel = new BroadcastChannel(this._channel);\n this._broadcastChannel.postMessage({ action: 'stop' });\n this._broadcastChannel.onmessage = async (event) => {\n if (event.data?.action === 'stop') {\n await this.stop();\n }\n };\n\n await this._acquireLock();\n this._config = await this._configProvider();\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices.initialize({\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals, () => (this._signalTelemetryEnabled ? this._signalMetadataTags : {}))\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n await this._clientServices.open(new Context());\n this._ready.wake(undefined);\n log('started');\n setIdentityTags({\n identityService: this._clientServices.services.IdentityService!,\n devicesService: this._clientServices.services.DevicesService!,\n setTag: (k: string, v: string) => {\n this._signalMetadataTags[k] = v;\n },\n });\n } catch (err: any) {\n this._ready.wake(err);\n log.error('starting', err);\n }\n }\n\n async stop() {\n // Release the lock to notify remote clients that the worker is terminating.\n this._releaseLock();\n this._broadcastChannel?.close();\n this._broadcastChannel = undefined;\n await this._clientServices.close();\n await this._onStop?.();\n }\n\n /**\n * Create a new session.\n */\n async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {\n const session = new WorkerSession({\n serviceHost: this._clientServices,\n appPort,\n systemPort,\n shellPort,\n readySignal: this._ready,\n });\n\n // When tab is closed or client is destroyed.\n session.onClose.set(async () => {\n this._sessions.delete(session);\n if (this._sessions.size === 0) {\n // Terminate the worker when all sessions are closed.\n await this.stop();\n } else {\n this._reconnectWebrtc();\n }\n });\n\n await session.open();\n // A worker can only service one origin currently\n invariant(\n !this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin,\n `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`,\n );\n if (session.observabilityGroup) {\n this._signalMetadataTags.group = session.observabilityGroup;\n }\n this._signalTelemetryEnabled = session.signalTelemetryEnabled ?? false;\n this._signalMetadataTags.origin = session.origin;\n this._sessions.add(session);\n\n this._reconnectWebrtc();\n }\n\n /**\n * Selects one of the existing session for WebRTC networking.\n */\n private _reconnectWebrtc() {\n log('reconnecting webrtc...');\n // Check if current session is already closed.\n if (this._sessionForNetworking) {\n if (!this._sessions.has(this._sessionForNetworking)) {\n this._sessionForNetworking = undefined;\n }\n }\n\n // Select existing session.\n if (!this._sessionForNetworking) {\n const selected = Array.from(this._sessions).find((session) => session.bridgeService);\n if (selected) {\n this._sessionForNetworking = selected;\n this._transportFactory.setBridgeService(selected.bridgeService);\n } else {\n this._transportFactory.setBridgeService(undefined);\n }\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport {\n iframeServiceBundle,\n type IframeServiceBundle,\n PROXY_CONNECTION_TIMEOUT,\n workerServiceBundle,\n} from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\nimport { Callback, type MaybePromise } from '@dxos/util';\n\nimport { type ClientServicesHost, ClientRpcServer, type ClientRpcServerParams } from '../services';\n\nexport type WorkerSessionParams = {\n serviceHost: ClientServicesHost;\n systemPort: RpcPort;\n appPort: RpcPort;\n // TODO(wittjosiah): Remove shellPort.\n shellPort?: RpcPort;\n readySignal: Trigger<Error | undefined>;\n};\n\n/**\n * Represents a tab connection within the worker.\n */\nexport class WorkerSession {\n private readonly _clientRpc: ClientRpcServer;\n private readonly _shellClientRpc?: ClientRpcServer;\n private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;\n private readonly _startTrigger = new Trigger();\n private readonly _serviceHost: ClientServicesHost;\n\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n // TODO(nf): factor out?\n public observabilityGroup?: string;\n public signalTelemetryEnabled?: boolean;\n\n @logInfo\n public lockKey?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }: WorkerSessionParams) {\n invariant(serviceHost);\n this._serviceHost = serviceHost;\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: appPort,\n ...middleware,\n });\n\n this._shellClientRpc = shellPort\n ? new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: shellPort,\n ...middleware,\n })\n : undefined;\n\n this._iframeRpc = createProtoRpcPeer({\n requested: iframeServiceBundle,\n exposed: workerServiceBundle,\n handlers: {\n WorkerService: {\n start: async (request) => {\n this.origin = request.origin;\n this.lockKey = request.lockKey;\n this.observabilityGroup = request.observabilityGroup;\n this.signalTelemetryEnabled = request.signalTelemetryEnabled;\n this._startTrigger.wake();\n },\n\n stop: async () => {\n setTimeout(async () => {\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n });\n },\n },\n },\n port: systemPort,\n timeout: 1_000, // With low timeout heartbeat may fail if the tab's thread is saturated.\n });\n\n this.bridgeService = this._iframeRpc.rpc.BridgeService;\n }\n\n async open() {\n log.info('opening...');\n await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);\n\n // Wait until the worker's RPC service has started.\n await this._startTrigger.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n\n // TODO(burdon): Comment required.\n if (this.lockKey) {\n void this._afterLockReleases(this.lockKey, () => this.close());\n }\n\n log.info('opened');\n }\n\n async close() {\n log.info('closing...');\n try {\n await this.onClose.callIfSet();\n } catch (err: any) {\n log.catch(err);\n }\n\n await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);\n log.info('closed');\n }\n\n private async _maybeOpenShell() {\n try {\n this._shellClientRpc && (await asyncTimeout(this._shellClientRpc.open(), 1_000));\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"],
5
- "mappings": "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",
6
- "names": ["import_async", "import_client_protocol", "import_invariant", "import_log", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "_startTrigger", "Trigger", "onClose", "Callback", "invariant", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "undefined", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "lockKey", "observabilityGroup", "signalTelemetryEnabled", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "navigator", "locks", "then", "logInfo", "WorkerRuntime", "channel", "DEFAULT_WORKER_BROADCAST_CHANNEL", "configProvider", "acquireLock", "releaseLock", "onStop", "_transportFactory", "SimplePeerTransportProxyFactory", "_ready", "_sessions", "Set", "_signalMetadataTags", "runtime", "_signalTelemetryEnabled", "_configProvider", "_acquireLock", "_releaseLock", "_onStop", "_channel", "_clientServices", "ClientServicesHost", "callbacks", "onReset", "host", "_broadcastChannel", "BroadcastChannel", "postMessage", "action", "onmessage", "event", "data", "_config", "signals", "get", "initialize", "config", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "Context", "setIdentityTags", "identityService", "services", "IdentityService", "devicesService", "DevicesService", "setTag", "k", "v", "createSession", "session", "set", "delete", "size", "_reconnectWebrtc", "group", "add", "_sessionForNetworking", "has", "selected", "Array", "from", "find", "setBridgeService"]
4
+ "sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { DEFAULT_WORKER_BROADCAST_CHANNEL } from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport {\n MemorySignalManager,\n MemorySignalManagerContext,\n WebsocketSignalManager,\n setIdentityTags,\n} from '@dxos/messaging';\nimport { SimplePeerTransportProxyFactory } from '@dxos/network-manager';\nimport { type RpcPort } from '@dxos/rpc';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { WorkerSession } from './worker-session';\nimport { ClientServicesHost } from '../services';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type CreateSessionParams = {\n appPort: RpcPort;\n systemPort: RpcPort;\n shellPort?: RpcPort;\n};\n\nexport type WorkerRuntimeOptions = {\n channel?: string;\n configProvider: () => MaybePromise<Config>;\n acquireLock: () => Promise<void>;\n releaseLock: () => void;\n onStop?: () => Promise<void>;\n};\n\n/**\n * Runtime for the shared worker.\n * Manages connections from proxies (in tabs).\n * Tabs make requests to the `ClientServicesHost`, and provide a WebRTC gateway.\n */\nexport class WorkerRuntime {\n private readonly _configProvider: () => MaybePromise<Config>;\n private readonly _acquireLock: () => Promise<void>;\n private readonly _releaseLock: () => void;\n private readonly _onStop?: () => Promise<void>;\n private readonly _transportFactory = new SimplePeerTransportProxyFactory();\n private readonly _ready = new Trigger<Error | undefined>();\n private readonly _sessions = new Set<WorkerSession>();\n private readonly _clientServices!: ClientServicesHost;\n private readonly _channel: string;\n private _broadcastChannel?: BroadcastChannel;\n private _sessionForNetworking?: WorkerSession; // TODO(burdon): Expose to client QueryStatusResponse.\n private _config!: Config;\n private _signalMetadataTags: any = { runtime: 'worker-runtime' };\n private _signalTelemetryEnabled: boolean = false;\n\n constructor({\n channel = DEFAULT_WORKER_BROADCAST_CHANNEL,\n configProvider,\n acquireLock,\n releaseLock,\n onStop,\n }: WorkerRuntimeOptions) {\n this._configProvider = configProvider;\n this._acquireLock = acquireLock;\n this._releaseLock = releaseLock;\n this._onStop = onStop;\n this._channel = channel;\n this._clientServices = new ClientServicesHost({\n callbacks: {\n onReset: async () => this.stop(),\n },\n });\n }\n\n get host() {\n return this._clientServices;\n }\n\n async start() {\n log('starting...');\n try {\n this._broadcastChannel = new BroadcastChannel(this._channel);\n this._broadcastChannel.postMessage({ action: 'stop' });\n this._broadcastChannel.onmessage = async (event) => {\n if (event.data?.action === 'stop') {\n await this.stop();\n }\n };\n\n await this._acquireLock();\n this._config = await this._configProvider();\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices.initialize({\n config: this._config,\n signalManager: this._config.get('runtime.client.edgeFeatures')?.signaling\n ? undefined\n : signals\n ? new WebsocketSignalManager(signals, () => (this._signalTelemetryEnabled ? this._signalMetadataTags : {}))\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n await this._clientServices.open(new Context());\n this._ready.wake(undefined);\n log('started');\n setIdentityTags({\n identityService: this._clientServices.services.IdentityService!,\n devicesService: this._clientServices.services.DevicesService!,\n setTag: (k: string, v: string) => {\n this._signalMetadataTags[k] = v;\n },\n });\n } catch (err: any) {\n this._ready.wake(err);\n log.error('starting', err);\n }\n }\n\n async stop() {\n // Release the lock to notify remote clients that the worker is terminating.\n this._releaseLock();\n this._broadcastChannel?.close();\n this._broadcastChannel = undefined;\n await this._clientServices.close();\n await this._onStop?.();\n }\n\n /**\n * Create a new session.\n */\n async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {\n const session = new WorkerSession({\n serviceHost: this._clientServices,\n appPort,\n systemPort,\n shellPort,\n readySignal: this._ready,\n });\n\n // When tab is closed or client is destroyed.\n session.onClose.set(async () => {\n this._sessions.delete(session);\n if (this._sessions.size === 0) {\n // Terminate the worker when all sessions are closed.\n await this.stop();\n } else {\n this._reconnectWebrtc();\n }\n });\n\n await session.open();\n // A worker can only service one origin currently\n invariant(\n !this._signalMetadataTags.origin || this._signalMetadataTags.origin === session.origin,\n `worker origin changed from ${this._signalMetadataTags.origin} to ${session.origin}?`,\n );\n if (session.observabilityGroup) {\n this._signalMetadataTags.group = session.observabilityGroup;\n }\n this._signalTelemetryEnabled = session.signalTelemetryEnabled ?? false;\n this._signalMetadataTags.origin = session.origin;\n this._sessions.add(session);\n\n this._reconnectWebrtc();\n }\n\n /**\n * Selects one of the existing session for WebRTC networking.\n */\n private _reconnectWebrtc() {\n log('reconnecting webrtc...');\n // Check if current session is already closed.\n if (this._sessionForNetworking) {\n if (!this._sessions.has(this._sessionForNetworking)) {\n this._sessionForNetworking = undefined;\n }\n }\n\n // Select existing session.\n if (!this._sessionForNetworking) {\n const selected = Array.from(this._sessions).find((session) => session.bridgeService);\n if (selected) {\n this._sessionForNetworking = selected;\n this._transportFactory.setBridgeService(selected.bridgeService);\n } else {\n this._transportFactory.setBridgeService(undefined);\n }\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { asyncTimeout, Trigger } from '@dxos/async';\nimport {\n iframeServiceBundle,\n type IframeServiceBundle,\n PROXY_CONNECTION_TIMEOUT,\n workerServiceBundle,\n} from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { log, logInfo } from '@dxos/log';\nimport { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\nimport { Callback, type MaybePromise } from '@dxos/util';\n\nimport { type ClientServicesHost, ClientRpcServer, type ClientRpcServerParams } from '../services';\n\nexport type WorkerSessionParams = {\n serviceHost: ClientServicesHost;\n systemPort: RpcPort;\n appPort: RpcPort;\n // TODO(wittjosiah): Remove shellPort.\n shellPort?: RpcPort;\n readySignal: Trigger<Error | undefined>;\n};\n\n/**\n * Represents a tab connection within the worker.\n */\nexport class WorkerSession {\n private readonly _clientRpc: ClientRpcServer;\n private readonly _shellClientRpc?: ClientRpcServer;\n private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;\n private readonly _startTrigger = new Trigger();\n private readonly _serviceHost: ClientServicesHost;\n\n public readonly onClose = new Callback<() => Promise<void>>();\n\n @logInfo\n public origin?: string;\n\n // TODO(nf): factor out?\n public observabilityGroup?: string;\n public signalTelemetryEnabled?: boolean;\n\n @logInfo\n public lockKey?: string;\n\n public bridgeService?: BridgeService;\n\n constructor({ serviceHost, systemPort, appPort, shellPort, readySignal }: WorkerSessionParams) {\n invariant(serviceHost);\n this._serviceHost = serviceHost;\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n handleStream: async (method, params, handler) => {\n const error = await readySignal.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n if (error) {\n throw error;\n }\n\n return handler(method, params);\n },\n };\n\n this._clientRpc = new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: appPort,\n ...middleware,\n });\n\n this._shellClientRpc = shellPort\n ? new ClientRpcServer({\n serviceRegistry: this._serviceHost.serviceRegistry,\n port: shellPort,\n ...middleware,\n })\n : undefined;\n\n this._iframeRpc = createProtoRpcPeer({\n requested: iframeServiceBundle,\n exposed: workerServiceBundle,\n handlers: {\n WorkerService: {\n start: async (request) => {\n this.origin = request.origin;\n this.lockKey = request.lockKey;\n this.observabilityGroup = request.observabilityGroup;\n this.signalTelemetryEnabled = request.signalTelemetryEnabled;\n this._startTrigger.wake();\n },\n\n stop: async () => {\n setTimeout(async () => {\n try {\n await this.close();\n } catch (err: any) {\n log.catch(err);\n }\n });\n },\n },\n },\n port: systemPort,\n timeout: 1_000, // With low timeout heartbeat may fail if the tab's thread is saturated.\n });\n\n this.bridgeService = this._iframeRpc.rpc.BridgeService;\n }\n\n async open() {\n log.info('opening...');\n await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);\n\n // Wait until the worker's RPC service has started.\n await this._startTrigger.wait({ timeout: PROXY_CONNECTION_TIMEOUT });\n\n // TODO(burdon): Comment required.\n if (this.lockKey) {\n void this._afterLockReleases(this.lockKey, () => this.close());\n }\n\n log.info('opened');\n }\n\n async close() {\n log.info('closing...');\n try {\n await this.onClose.callIfSet();\n } catch (err: any) {\n log.catch(err);\n }\n\n await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);\n log.info('closed');\n }\n\n private async _maybeOpenShell() {\n try {\n this._shellClientRpc && (await asyncTimeout(this._shellClientRpc.open(), 1_000));\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"],
5
+ "mappings": "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",
6
+ "names": ["import_async", "import_client_protocol", "import_invariant", "import_log", "WorkerSession", "constructor", "serviceHost", "systemPort", "appPort", "shellPort", "readySignal", "_startTrigger", "Trigger", "onClose", "Callback", "invariant", "_serviceHost", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "port", "_shellClientRpc", "undefined", "_iframeRpc", "createProtoRpcPeer", "requested", "iframeServiceBundle", "exposed", "workerServiceBundle", "handlers", "WorkerService", "start", "request", "origin", "lockKey", "observabilityGroup", "signalTelemetryEnabled", "wake", "stop", "setTimeout", "close", "err", "log", "catch", "bridgeService", "rpc", "BridgeService", "open", "info", "Promise", "all", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "navigator", "locks", "then", "logInfo", "WorkerRuntime", "channel", "DEFAULT_WORKER_BROADCAST_CHANNEL", "configProvider", "acquireLock", "releaseLock", "onStop", "_transportFactory", "SimplePeerTransportProxyFactory", "_ready", "_sessions", "Set", "_signalMetadataTags", "runtime", "_signalTelemetryEnabled", "_configProvider", "_acquireLock", "_releaseLock", "_onStop", "_channel", "_clientServices", "ClientServicesHost", "callbacks", "onReset", "host", "_broadcastChannel", "BroadcastChannel", "postMessage", "action", "onmessage", "event", "data", "_config", "signals", "get", "initialize", "config", "signalManager", "signaling", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "Context", "setIdentityTags", "identityService", "services", "IdentityService", "devicesService", "DevicesService", "setTag", "k", "v", "createSession", "session", "set", "delete", "size", "_reconnectWebrtc", "group", "add", "_sessionForNetworking", "has", "selected", "Array", "from", "find", "setBridgeService"]
7
7
  }