@dxos/client-services 0.5.1-next.260c093 → 0.5.1-next.26de2f3

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 (61) hide show
  1. package/dist/lib/browser/{chunk-55TEJXLO.mjs → chunk-LPIE23D2.mjs} +1263 -907
  2. package/dist/lib/browser/chunk-LPIE23D2.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +31 -2
  4. package/dist/lib/browser/index.mjs.map +3 -3
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +28 -8
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  8. package/dist/lib/node/{chunk-3ZUQNDPT.cjs → chunk-MVAX2L2C.cjs} +1417 -1069
  9. package/dist/lib/node/chunk-MVAX2L2C.cjs.map +7 -0
  10. package/dist/lib/node/index.cjs +73 -44
  11. package/dist/lib/node/index.cjs.map +3 -3
  12. package/dist/lib/node/meta.json +1 -1
  13. package/dist/lib/node/packlets/testing/index.cjs +34 -14
  14. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  15. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +2 -1
  16. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  17. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts +39 -0
  18. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -0
  19. package/dist/types/src/packlets/invitations/{invitation-extension.d.ts → invitation-host-extension.d.ts} +17 -31
  20. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -0
  21. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +6 -1
  22. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  23. package/dist/types/src/packlets/invitations/invitation-topology.d.ts +37 -0
  24. package/dist/types/src/packlets/invitations/invitation-topology.d.ts.map +1 -0
  25. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +19 -10
  26. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  27. package/dist/types/src/packlets/invitations/invitations-handler.test.d.ts +2 -0
  28. package/dist/types/src/packlets/invitations/invitations-handler.test.d.ts.map +1 -0
  29. package/dist/types/src/packlets/invitations/invitations-manager.d.ts +2 -1
  30. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
  31. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +1 -0
  32. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  33. package/dist/types/src/packlets/invitations/utils.d.ts +6 -0
  34. package/dist/types/src/packlets/invitations/utils.d.ts.map +1 -0
  35. package/dist/types/src/packlets/services/service-context.d.ts +6 -3
  36. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  37. package/dist/types/src/packlets/testing/invitation-utils.d.ts +2 -1
  38. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  39. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  40. package/dist/types/src/packlets/vault/shell-runtime.d.ts +10 -2
  41. package/dist/types/src/packlets/vault/shell-runtime.d.ts.map +1 -1
  42. package/dist/types/src/version.d.ts +1 -1
  43. package/package.json +36 -36
  44. package/src/packlets/invitations/device-invitation-protocol.ts +5 -1
  45. package/src/packlets/invitations/invitation-guest-extenstion.ts +126 -0
  46. package/src/packlets/invitations/{invitation-extension.ts → invitation-host-extension.ts} +99 -105
  47. package/src/packlets/invitations/invitation-protocol.ts +7 -1
  48. package/src/packlets/invitations/invitation-topology.ts +87 -0
  49. package/src/packlets/invitations/invitations-handler.test.ts +361 -0
  50. package/src/packlets/invitations/invitations-handler.ts +246 -149
  51. package/src/packlets/invitations/invitations-manager.ts +42 -3
  52. package/src/packlets/invitations/space-invitation-protocol.ts +19 -1
  53. package/src/packlets/invitations/utils.ts +27 -0
  54. package/src/packlets/services/service-context.ts +5 -3
  55. package/src/packlets/testing/invitation-utils.ts +23 -3
  56. package/src/packlets/testing/test-builder.ts +3 -1
  57. package/src/packlets/vault/shell-runtime.ts +40 -2
  58. package/src/version.ts +1 -1
  59. package/dist/lib/browser/chunk-55TEJXLO.mjs.map +0 -7
  60. package/dist/lib/node/chunk-3ZUQNDPT.cjs.map +0 -7
  61. package/dist/types/src/packlets/invitations/invitation-extension.d.ts.map +0 -1
@@ -18,51 +18,51 @@ 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_3ZUQNDPT.ClientRpcServer,
22
- ClientServicesHost: () => import_chunk_3ZUQNDPT.ClientServicesHost,
23
- ClientServicesProviderResource: () => import_chunk_3ZUQNDPT.ClientServicesProviderResource,
24
- DataSpace: () => import_chunk_3ZUQNDPT.DataSpace,
25
- DataSpaceManager: () => import_chunk_3ZUQNDPT.DataSpaceManager,
26
- DeviceInvitationProtocol: () => import_chunk_3ZUQNDPT.DeviceInvitationProtocol,
27
- DevtoolsHostEvents: () => import_chunk_3ZUQNDPT.DevtoolsHostEvents,
28
- DevtoolsServiceImpl: () => import_chunk_3ZUQNDPT.DevtoolsServiceImpl,
29
- DiagnosticsCollector: () => import_chunk_3ZUQNDPT.DiagnosticsCollector,
21
+ ClientRpcServer: () => import_chunk_MVAX2L2C.ClientRpcServer,
22
+ ClientServicesHost: () => import_chunk_MVAX2L2C.ClientServicesHost,
23
+ ClientServicesProviderResource: () => import_chunk_MVAX2L2C.ClientServicesProviderResource,
24
+ DataSpace: () => import_chunk_MVAX2L2C.DataSpace,
25
+ DataSpaceManager: () => import_chunk_MVAX2L2C.DataSpaceManager,
26
+ DeviceInvitationProtocol: () => import_chunk_MVAX2L2C.DeviceInvitationProtocol,
27
+ DevtoolsHostEvents: () => import_chunk_MVAX2L2C.DevtoolsHostEvents,
28
+ DevtoolsServiceImpl: () => import_chunk_MVAX2L2C.DevtoolsServiceImpl,
29
+ DiagnosticsCollector: () => import_chunk_MVAX2L2C.DiagnosticsCollector,
30
30
  IFrameHostRuntime: () => IFrameHostRuntime,
31
- Identity: () => import_chunk_3ZUQNDPT.Identity,
32
- IdentityManager: () => import_chunk_3ZUQNDPT.IdentityManager,
33
- IdentityServiceImpl: () => import_chunk_3ZUQNDPT.IdentityServiceImpl,
34
- InvitationsHandler: () => import_chunk_3ZUQNDPT.InvitationsHandler,
35
- InvitationsManager: () => import_chunk_3ZUQNDPT.InvitationsManager,
36
- InvitationsServiceImpl: () => import_chunk_3ZUQNDPT.InvitationsServiceImpl,
37
- Lock: () => import_chunk_3ZUQNDPT.Lock,
38
- ServiceContext: () => import_chunk_3ZUQNDPT.ServiceContext,
39
- ServiceRegistry: () => import_chunk_3ZUQNDPT.ServiceRegistry,
31
+ Identity: () => import_chunk_MVAX2L2C.Identity,
32
+ IdentityManager: () => import_chunk_MVAX2L2C.IdentityManager,
33
+ IdentityServiceImpl: () => import_chunk_MVAX2L2C.IdentityServiceImpl,
34
+ InvitationsHandler: () => import_chunk_MVAX2L2C.InvitationsHandler,
35
+ InvitationsManager: () => import_chunk_MVAX2L2C.InvitationsManager,
36
+ InvitationsServiceImpl: () => import_chunk_MVAX2L2C.InvitationsServiceImpl,
37
+ Lock: () => import_chunk_MVAX2L2C.Lock,
38
+ ServiceContext: () => import_chunk_MVAX2L2C.ServiceContext,
39
+ ServiceRegistry: () => import_chunk_MVAX2L2C.ServiceRegistry,
40
40
  SharedWorkerConnection: () => SharedWorkerConnection,
41
41
  ShellRuntimeImpl: () => ShellRuntimeImpl,
42
- SpaceInvitationProtocol: () => import_chunk_3ZUQNDPT.SpaceInvitationProtocol,
43
- SpacesServiceImpl: () => import_chunk_3ZUQNDPT.SpacesServiceImpl,
44
- TrustedKeySetAuthVerifier: () => import_chunk_3ZUQNDPT.TrustedKeySetAuthVerifier,
42
+ SpaceInvitationProtocol: () => import_chunk_MVAX2L2C.SpaceInvitationProtocol,
43
+ SpacesServiceImpl: () => import_chunk_MVAX2L2C.SpacesServiceImpl,
44
+ TrustedKeySetAuthVerifier: () => import_chunk_MVAX2L2C.TrustedKeySetAuthVerifier,
45
45
  WorkerRuntime: () => WorkerRuntime,
46
46
  WorkerSession: () => WorkerSession,
47
- createAdmissionKeypair: () => import_chunk_3ZUQNDPT.createAdmissionKeypair,
48
- createAuthProvider: () => import_chunk_3ZUQNDPT.createAuthProvider,
49
- createCollectDiagnosticsBroadcastHandler: () => import_chunk_3ZUQNDPT.createCollectDiagnosticsBroadcastHandler,
50
- createCollectDiagnosticsBroadcastSender: () => import_chunk_3ZUQNDPT.createCollectDiagnosticsBroadcastSender,
51
- createDiagnostics: () => import_chunk_3ZUQNDPT.createDiagnostics,
52
- createLevel: () => import_chunk_3ZUQNDPT.createLevel,
53
- createStorageObjects: () => import_chunk_3ZUQNDPT.createStorageObjects,
54
- getNetworkPeers: () => import_chunk_3ZUQNDPT.getNetworkPeers,
55
- isLocked: () => import_chunk_3ZUQNDPT.isLocked,
56
- subscribeToFeedBlocks: () => import_chunk_3ZUQNDPT.subscribeToFeedBlocks,
57
- subscribeToFeeds: () => import_chunk_3ZUQNDPT.subscribeToFeeds,
58
- subscribeToNetworkStatus: () => import_chunk_3ZUQNDPT.subscribeToNetworkStatus,
59
- subscribeToNetworkTopics: () => import_chunk_3ZUQNDPT.subscribeToNetworkTopics,
60
- subscribeToSignal: () => import_chunk_3ZUQNDPT.subscribeToSignal,
61
- subscribeToSpaces: () => import_chunk_3ZUQNDPT.subscribeToSpaces,
62
- subscribeToSwarmInfo: () => import_chunk_3ZUQNDPT.subscribeToSwarmInfo
47
+ createAdmissionKeypair: () => import_chunk_MVAX2L2C.createAdmissionKeypair,
48
+ createAuthProvider: () => import_chunk_MVAX2L2C.createAuthProvider,
49
+ createCollectDiagnosticsBroadcastHandler: () => import_chunk_MVAX2L2C.createCollectDiagnosticsBroadcastHandler,
50
+ createCollectDiagnosticsBroadcastSender: () => import_chunk_MVAX2L2C.createCollectDiagnosticsBroadcastSender,
51
+ createDiagnostics: () => import_chunk_MVAX2L2C.createDiagnostics,
52
+ createLevel: () => import_chunk_MVAX2L2C.createLevel,
53
+ createStorageObjects: () => import_chunk_MVAX2L2C.createStorageObjects,
54
+ getNetworkPeers: () => import_chunk_MVAX2L2C.getNetworkPeers,
55
+ isLocked: () => import_chunk_MVAX2L2C.isLocked,
56
+ subscribeToFeedBlocks: () => import_chunk_MVAX2L2C.subscribeToFeedBlocks,
57
+ subscribeToFeeds: () => import_chunk_MVAX2L2C.subscribeToFeeds,
58
+ subscribeToNetworkStatus: () => import_chunk_MVAX2L2C.subscribeToNetworkStatus,
59
+ subscribeToNetworkTopics: () => import_chunk_MVAX2L2C.subscribeToNetworkTopics,
60
+ subscribeToSignal: () => import_chunk_MVAX2L2C.subscribeToSignal,
61
+ subscribeToSpaces: () => import_chunk_MVAX2L2C.subscribeToSpaces,
62
+ subscribeToSwarmInfo: () => import_chunk_MVAX2L2C.subscribeToSwarmInfo
63
63
  });
64
64
  module.exports = __toCommonJS(node_exports);
65
- var import_chunk_3ZUQNDPT = require("./chunk-3ZUQNDPT.cjs");
65
+ var import_chunk_MVAX2L2C = require("./chunk-MVAX2L2C.cjs");
66
66
  var import_async = require("@dxos/async");
67
67
  var import_client_protocol = require("@dxos/client-protocol");
68
68
  var import_context = require("@dxos/context");
@@ -99,7 +99,11 @@ var ShellRuntimeImpl = class {
99
99
  constructor(_port) {
100
100
  this._port = _port;
101
101
  this.layoutUpdate = new import_async2.Event();
102
+ this.invitationUrlUpdate = new import_async2.Event();
102
103
  this._layout = import_iframe.ShellLayout.DEFAULT;
104
+ this._invitationUrl = typeof window !== "undefined" ? window.location.origin : void 0;
105
+ this._deviceInvitationParam = "deviceInvitationCode";
106
+ this._spaceInvitationParam = "spaceInvitationCode";
103
107
  }
104
108
  get layout() {
105
109
  return this._layout;
@@ -110,6 +114,15 @@ var ShellRuntimeImpl = class {
110
114
  get spaceKey() {
111
115
  return this._spaceKey;
112
116
  }
117
+ get invitationUrl() {
118
+ return this._invitationUrl;
119
+ }
120
+ get deviceInvitationParam() {
121
+ return this._deviceInvitationParam;
122
+ }
123
+ get spaceInvitationParam() {
124
+ return this._spaceInvitationParam;
125
+ }
113
126
  setLayout({ layout, invitationCode, spaceKey }) {
114
127
  this._layout = layout;
115
128
  this._invitationCode = invitationCode;
@@ -120,10 +133,20 @@ var ShellRuntimeImpl = class {
120
133
  spaceKey
121
134
  });
122
135
  }
136
+ setInvitationUrl({ invitationUrl, deviceInvitationParam, spaceInvitationParam }) {
137
+ this._invitationUrl = invitationUrl;
138
+ this._deviceInvitationParam = deviceInvitationParam;
139
+ this._spaceInvitationParam = spaceInvitationParam;
140
+ this.invitationUrlUpdate.emit({
141
+ invitationUrl,
142
+ deviceInvitationParam,
143
+ spaceInvitationParam
144
+ });
145
+ }
123
146
  async setAppContext(context) {
124
147
  (0, import_invariant.invariant)(this._appRpc, "runtime not open", {
125
148
  F: __dxlog_file,
126
- L: 44,
149
+ L: 76,
127
150
  S: this,
128
151
  A: [
129
152
  "this._appRpc",
@@ -143,6 +166,12 @@ var ShellRuntimeImpl = class {
143
166
  this._invitationCode = request.invitationCode;
144
167
  this._spaceKey = request.spaceKey;
145
168
  this.layoutUpdate.emit(request);
169
+ },
170
+ setInvitationUrl: async (request) => {
171
+ this._invitationUrl = request.invitationUrl;
172
+ this._deviceInvitationParam = request.deviceInvitationParam;
173
+ this._spaceInvitationParam = request.spaceInvitationParam;
174
+ this.invitationUrlUpdate.emit(request);
146
175
  }
147
176
  }
148
177
  },
@@ -197,7 +226,7 @@ var IFrameHostRuntime = class {
197
226
  iceServers: this._config.get("runtime.services.ice")
198
227
  });
199
228
  const signals = this._config.get("runtime.services.signaling");
200
- this._clientServices = new import_chunk_3ZUQNDPT.ClientServicesHost({
229
+ this._clientServices = new import_chunk_MVAX2L2C.ClientServicesHost({
201
230
  lockKey: LOCK_KEY,
202
231
  config: this._config,
203
232
  signalManager: signals ? new import_messaging.WebsocketSignalManager(signals) : new import_messaging.MemorySignalManager(new import_messaging.MemorySignalManagerContext()),
@@ -223,7 +252,7 @@ var IFrameHostRuntime = class {
223
252
  return handler(method, params);
224
253
  }
225
254
  };
226
- this._clientRpc = new import_chunk_3ZUQNDPT.ClientRpcServer({
255
+ this._clientRpc = new import_chunk_MVAX2L2C.ClientRpcServer({
227
256
  serviceRegistry: this._clientServices.serviceRegistry,
228
257
  port: this._appPort,
229
258
  ...middleware
@@ -388,12 +417,12 @@ var WorkerSession = class {
388
417
  return handler(method, params);
389
418
  }
390
419
  };
391
- this._clientRpc = new import_chunk_3ZUQNDPT.ClientRpcServer({
420
+ this._clientRpc = new import_chunk_MVAX2L2C.ClientRpcServer({
392
421
  serviceRegistry: this._serviceHost.serviceRegistry,
393
422
  port: appPort,
394
423
  ...middleware
395
424
  });
396
- this._shellClientRpc = shellPort ? new import_chunk_3ZUQNDPT.ClientRpcServer({
425
+ this._shellClientRpc = shellPort ? new import_chunk_MVAX2L2C.ClientRpcServer({
397
426
  serviceRegistry: this._serviceHost.serviceRegistry,
398
427
  port: shellPort,
399
428
  ...middleware
@@ -520,7 +549,7 @@ var WorkerRuntime = class {
520
549
  this._signalTelemetryEnabled = false;
521
550
  this._acquireLock = acquireLock;
522
551
  this._releaseLock = releaseLock;
523
- this._clientServices = new import_chunk_3ZUQNDPT.ClientServicesHost({
552
+ this._clientServices = new import_chunk_MVAX2L2C.ClientServicesHost({
524
553
  callbacks: {
525
554
  onReset: async () => onReset()
526
555
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/packlets/vault/iframe-host-runtime.ts", "../../../src/packlets/vault/shell-runtime.ts", "../../../src/packlets/vault/shared-worker-connection.ts", "../../../src/packlets/vault/worker-runtime.ts", "../../../src/packlets/vault/worker-session.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { PROXY_CONNECTION_TIMEOUT, type ShellRuntime } from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createSimplePeerTransportFactory, type TransportFactory } from '@dxos/network-manager';\nimport { type RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, type MaybePromise, type Provider } from '@dxos/util';\n\nimport { ShellRuntimeImpl } from './shell-runtime';\nimport { ClientServicesHost } from '../services';\nimport { ClientRpcServer, type ClientRpcServerParams } from '../services/client-rpc-server';\n\nconst LOCK_KEY = 'DXOS_RESOURCE_LOCK';\n\nexport type IFrameHostRuntimeParams = {\n config: Config | Provider<MaybePromise<Config>>;\n origin: string;\n appPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Runs the client services in the main thread.\n *\n * Holds a lock over the client services such that only one instance can run at a time.\n * This should only be used when SharedWorker is not available.\n *\n * @deprecated\n */\nexport class IFrameHostRuntime {\n private readonly _configProvider: IFrameHostRuntimeParams['config'];\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n private _transportFactory!: TransportFactory;\n\n // TODO(dmaretskyi): Replace with host and figure out how to return services provider here.\n private _clientServices!: ClientServicesHost;\n private _clientRpc!: ClientRpcServer;\n private _shellRuntime?: ShellRuntimeImpl;\n\n @logInfo\n public origin: string;\n\n constructor({ config, origin, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = config;\n this.origin = origin;\n this._appPort = appPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get services() {\n return this._clientServices;\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await getAsyncValue(this._configProvider);\n this._transportFactory = createSimplePeerTransportFactory({\n iceServers: this._config.get('runtime.services.ice'),\n });\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices = new ClientServicesHost({\n lockKey: LOCK_KEY,\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.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 this._ready.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._clientServices.serviceRegistry,\n port: this._appPort,\n ...middleware,\n });\n\n await Promise.all([this._clientServices.open(new Context()), this._clientRpc.open(), this._shellRuntime?.open()]);\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n log('stopping...');\n await this._clientRpc.close();\n await this._clientServices.close();\n await this._shellRuntime?.close();\n log('stopped');\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { appServiceBundle, type AppServiceBundle, type ShellRuntime, shellServiceBundle } from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { type PublicKey } from '@dxos/keys';\nimport { type AppContextRequest, type LayoutRequest, ShellLayout } from '@dxos/protocols/proto/dxos/iframe';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\n\n/**\n * Endpoint that handles shell services.\n */\nexport class ShellRuntimeImpl implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n private _appRpc?: ProtoRpcPeer<AppServiceBundle>;\n private _layout = ShellLayout.DEFAULT;\n private _invitationCode?: string;\n private _spaceKey?: PublicKey;\n\n constructor(private readonly _port: RpcPort) {}\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n setLayout({ layout, invitationCode, spaceKey }: LayoutRequest) {\n this._layout = layout;\n this._invitationCode = invitationCode;\n this._spaceKey = spaceKey;\n this.layoutUpdate.emit({ layout, invitationCode, spaceKey });\n }\n\n async setAppContext(context: AppContextRequest) {\n invariant(this._appRpc, 'runtime not open');\n\n await this._appRpc.rpc.AppService.setContext(context);\n }\n\n async open() {\n this._appRpc = createProtoRpcPeer({\n requested: appServiceBundle,\n exposed: shellServiceBundle,\n handlers: {\n ShellService: {\n setLayout: async (request) => {\n this._layout = request.layout;\n this._invitationCode = request.invitationCode;\n this._spaceKey = request.spaceKey;\n this.layoutUpdate.emit(request);\n },\n },\n },\n port: this._port,\n });\n\n await this._appRpc.open();\n }\n\n async close() {\n await this._appRpc?.close();\n this._appRpc = undefined;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport {\n iframeServiceBundle,\n type ShellRuntime,\n workerServiceBundle,\n type WorkerServiceBundle,\n} from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { SimplePeerTransportService } from '@dxos/network-manager';\nimport { RemoteServiceConnectionError } from '@dxos/protocols';\nimport { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, type MaybePromise, type Provider } from '@dxos/util';\n\nimport { ShellRuntimeImpl } from './shell-runtime';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type SharedWorkerConnectionOptions = {\n config: Config | Provider<MaybePromise<Config>>;\n systemPort: RpcPort;\n /**\n * @deprecated Only used with iframes.\n */\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class SharedWorkerConnection {\n private readonly _id = String(Math.floor(Math.random() * 1000000));\n private readonly _configProvider: SharedWorkerConnectionOptions['config'];\n private readonly _systemPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _release = new Trigger();\n private _config!: Config;\n private _transportService!: BridgeService;\n private _systemRpc!: ProtoRpcPeer<WorkerServiceBundle>;\n private _shellRuntime?: ShellRuntimeImpl;\n\n constructor({ config, systemPort, shellPort }: SharedWorkerConnectionOptions) {\n this._configProvider = config;\n this._systemPort = systemPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async open(params: { origin: string; observabilityGroup?: string; signalTelemetryEnabled?: boolean }) {\n this._config = await getAsyncValue(this._configProvider);\n\n this._transportService = new SimplePeerTransportService({\n iceServers: this._config.get('runtime.services.ice'),\n });\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService,\n },\n port: this._systemPort,\n // TODO(wittjosiah): Make longer and factor out to constant.\n // TODO(wittjosiah): If this is too long then it breaks the reset flows in Composer.\n timeout: 200,\n });\n\n let lockKey: string | undefined;\n if (typeof navigator !== 'undefined') {\n lockKey = this._lockKey(params.origin);\n this._release = new Trigger();\n const ready = new Trigger();\n void navigator.locks.request(lockKey, async () => {\n ready.wake();\n await this._release.wait();\n });\n await ready.wait();\n }\n\n try {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ lockKey, ...params });\n } catch (err) {\n log.catch(err);\n throw new RemoteServiceConnectionError('Failed to connect to worker');\n }\n await this._shellRuntime?.open();\n }\n\n async close() {\n this._release.wake();\n await this._shellRuntime?.close();\n try {\n await this._systemRpc.rpc.WorkerService.stop();\n } catch {\n // If this fails, the worker is probably already gone.\n }\n await this._systemRpc.close();\n }\n\n private _lockKey(origin: string) {\n return `${origin}-${this._id}`;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\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 WorkerRuntimeCallbacks = {\n acquireLock: () => Promise<void>;\n releaseLock: () => void;\n onReset: () => 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 _acquireLock: () => Promise<void>;\n private readonly _releaseLock: () => 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 _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 private readonly _configProvider: () => MaybePromise<Config>,\n { acquireLock, releaseLock, onReset }: WorkerRuntimeCallbacks,\n ) {\n this._acquireLock = acquireLock;\n this._releaseLock = releaseLock;\n this._clientServices = new ClientServicesHost({\n callbacks: {\n onReset: async () => onReset(),\n },\n });\n }\n\n get host() {\n return this._clientServices;\n }\n\n async start() {\n log('starting...');\n try {\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 await this._clientServices.close();\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 if (globalThis.self) {\n self.close();\n }\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_log", "import_network_manager", "import_rpc", "import_util", "import_context", "import_invariant", "import_messaging", "ShellRuntimeImpl", "constructor", "_port", "layoutUpdate", "Event", "_layout", "ShellLayout", "DEFAULT", "layout", "invitationCode", "_invitationCode", "spaceKey", "_spaceKey", "setLayout", "emit", "setAppContext", "context", "invariant", "_appRpc", "rpc", "AppService", "setContext", "open", "createProtoRpcPeer", "requested", "appServiceBundle", "exposed", "shellServiceBundle", "handlers", "ShellService", "request", "port", "close", "undefined", "LOCK_KEY", "IFrameHostRuntime", "config", "origin", "appPort", "shellPort", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "_transportFactory", "createSimplePeerTransportFactory", "iceServers", "get", "signals", "ClientServicesHost", "lockKey", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "Promise", "all", "Context", "wake", "err", "catch", "stop", "logInfo", "SharedWorkerConnection", "systemPort", "_id", "String", "Math", "floor", "random", "_release", "_systemPort", "_transportService", "SimplePeerTransportService", "_systemRpc", "workerServiceBundle", "iframeServiceBundle", "BridgeService", "navigator", "_lockKey", "ready", "locks", "WorkerService", "RemoteServiceConnectionError", "WorkerSession", "serviceHost", "readySignal", "_startTrigger", "onClose", "Callback", "_serviceHost", "_shellClientRpc", "_iframeRpc", "observabilityGroup", "signalTelemetryEnabled", "setTimeout", "bridgeService", "info", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "then", "WorkerRuntime", "acquireLock", "releaseLock", "onReset", "SimplePeerTransportProxyFactory", "_sessions", "Set", "_signalMetadataTags", "runtime", "_signalTelemetryEnabled", "_acquireLock", "_releaseLock", "callbacks", "host", "initialize", "setIdentityTags", "identityService", "IdentityService", "devicesService", "DevicesService", "setTag", "k", "v", "createSession", "session", "set", "delete", "size", "globalThis", "self", "_reconnectWebrtc", "group", "add", "_sessionForNetworking", "has", "selected", "Array", "from", "find", "setBridgeService"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { PROXY_CONNECTION_TIMEOUT, type ShellRuntime } from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { log, logInfo } from '@dxos/log';\nimport { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';\nimport { createSimplePeerTransportFactory, type TransportFactory } from '@dxos/network-manager';\nimport { type RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, type MaybePromise, type Provider } from '@dxos/util';\n\nimport { ShellRuntimeImpl } from './shell-runtime';\nimport { ClientServicesHost } from '../services';\nimport { ClientRpcServer, type ClientRpcServerParams } from '../services/client-rpc-server';\n\nconst LOCK_KEY = 'DXOS_RESOURCE_LOCK';\n\nexport type IFrameHostRuntimeParams = {\n config: Config | Provider<MaybePromise<Config>>;\n origin: string;\n appPort: RpcPort;\n shellPort?: RpcPort;\n};\n\n/**\n * Runs the client services in the main thread.\n *\n * Holds a lock over the client services such that only one instance can run at a time.\n * This should only be used when SharedWorker is not available.\n *\n * @deprecated\n */\nexport class IFrameHostRuntime {\n private readonly _configProvider: IFrameHostRuntimeParams['config'];\n private readonly _ready = new Trigger<Error | undefined>();\n\n private readonly _appPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _config!: Config;\n private _transportFactory!: TransportFactory;\n\n // TODO(dmaretskyi): Replace with host and figure out how to return services provider here.\n private _clientServices!: ClientServicesHost;\n private _clientRpc!: ClientRpcServer;\n private _shellRuntime?: ShellRuntimeImpl;\n\n @logInfo\n public origin: string;\n\n constructor({ config, origin, appPort, shellPort }: IFrameHostRuntimeParams) {\n this._configProvider = config;\n this.origin = origin;\n this._appPort = appPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get services() {\n return this._clientServices;\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async start() {\n log('starting...');\n try {\n this._config = await getAsyncValue(this._configProvider);\n this._transportFactory = createSimplePeerTransportFactory({\n iceServers: this._config.get('runtime.services.ice'),\n });\n const signals = this._config.get('runtime.services.signaling');\n this._clientServices = new ClientServicesHost({\n lockKey: LOCK_KEY,\n config: this._config,\n signalManager: signals\n ? new WebsocketSignalManager(signals)\n : new MemorySignalManager(new MemorySignalManagerContext()), // TODO(dmaretskyi): Inject this context.\n transportFactory: this._transportFactory,\n });\n\n const middleware: Pick<ClientRpcServerParams, 'handleCall' | 'handleStream'> = {\n handleCall: async (method, params, handler) => {\n const error = await this._ready.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 this._ready.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._clientServices.serviceRegistry,\n port: this._appPort,\n ...middleware,\n });\n\n await Promise.all([this._clientServices.open(new Context()), this._clientRpc.open(), this._shellRuntime?.open()]);\n this._ready.wake(undefined);\n log('started');\n } catch (err: any) {\n this._ready.wake(err);\n log.catch(err);\n }\n }\n\n async stop() {\n log('stopping...');\n await this._clientRpc.close();\n await this._clientServices.close();\n await this._shellRuntime?.close();\n log('stopped');\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { appServiceBundle, type AppServiceBundle, type ShellRuntime, shellServiceBundle } from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { type PublicKey } from '@dxos/keys';\nimport {\n type AppContextRequest,\n type LayoutRequest,\n ShellLayout,\n type InvitationUrlRequest,\n} from '@dxos/protocols/proto/dxos/iframe';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\n\n/**\n * Endpoint that handles shell services.\n */\nexport class ShellRuntimeImpl implements ShellRuntime {\n readonly layoutUpdate = new Event<LayoutRequest>();\n readonly invitationUrlUpdate = new Event<InvitationUrlRequest>();\n\n private _appRpc?: ProtoRpcPeer<AppServiceBundle>;\n private _layout = ShellLayout.DEFAULT;\n private _spaceKey?: PublicKey;\n\n private _invitationCode?: string;\n private _invitationUrl? = typeof window !== 'undefined' ? window.location.origin : undefined;\n\n // TODO(burdon): Change to using underscores (coordinate with @dxos/web-auth).\n private _deviceInvitationParam = 'deviceInvitationCode'; // TODO(burdon): device_invitation_code\n private _spaceInvitationParam = 'spaceInvitationCode'; // TODO(burdon): space_invitation_code\n\n constructor(private readonly _port: RpcPort) {}\n\n get layout() {\n return this._layout;\n }\n\n get invitationCode() {\n return this._invitationCode;\n }\n\n get spaceKey() {\n return this._spaceKey;\n }\n\n get invitationUrl() {\n return this._invitationUrl!;\n }\n\n get deviceInvitationParam() {\n return this._deviceInvitationParam;\n }\n\n get spaceInvitationParam() {\n return this._spaceInvitationParam;\n }\n\n setLayout({ layout, invitationCode, spaceKey }: LayoutRequest) {\n this._layout = layout;\n this._invitationCode = invitationCode;\n this._spaceKey = spaceKey;\n this.layoutUpdate.emit({ layout, invitationCode, spaceKey });\n }\n\n setInvitationUrl({ invitationUrl, deviceInvitationParam, spaceInvitationParam }: InvitationUrlRequest) {\n this._invitationUrl = invitationUrl;\n this._deviceInvitationParam = deviceInvitationParam;\n this._spaceInvitationParam = spaceInvitationParam;\n this.invitationUrlUpdate.emit({ invitationUrl, deviceInvitationParam, spaceInvitationParam });\n }\n\n async setAppContext(context: AppContextRequest) {\n invariant(this._appRpc, 'runtime not open');\n\n await this._appRpc.rpc.AppService.setContext(context);\n }\n\n async open() {\n this._appRpc = createProtoRpcPeer({\n requested: appServiceBundle,\n exposed: shellServiceBundle,\n handlers: {\n ShellService: {\n setLayout: async (request) => {\n this._layout = request.layout;\n this._invitationCode = request.invitationCode;\n this._spaceKey = request.spaceKey;\n this.layoutUpdate.emit(request);\n },\n setInvitationUrl: async (request) => {\n this._invitationUrl = request.invitationUrl;\n this._deviceInvitationParam = request.deviceInvitationParam;\n this._spaceInvitationParam = request.spaceInvitationParam;\n this.invitationUrlUpdate.emit(request);\n },\n },\n },\n port: this._port,\n });\n\n await this._appRpc.open();\n }\n\n async close() {\n await this._appRpc?.close();\n this._appRpc = undefined;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport {\n iframeServiceBundle,\n type ShellRuntime,\n workerServiceBundle,\n type WorkerServiceBundle,\n} from '@dxos/client-protocol';\nimport { type Config } from '@dxos/config';\nimport { log } from '@dxos/log';\nimport { SimplePeerTransportService } from '@dxos/network-manager';\nimport { RemoteServiceConnectionError } from '@dxos/protocols';\nimport { type BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';\nimport { createProtoRpcPeer, type ProtoRpcPeer, type RpcPort } from '@dxos/rpc';\nimport { getAsyncValue, type MaybePromise, type Provider } from '@dxos/util';\n\nimport { ShellRuntimeImpl } from './shell-runtime';\n\n// NOTE: Keep as RpcPorts to avoid dependency on @dxos/rpc-tunnel so we don't depend on browser-specific apis.\nexport type SharedWorkerConnectionOptions = {\n config: Config | Provider<MaybePromise<Config>>;\n systemPort: RpcPort;\n /**\n * @deprecated Only used with iframes.\n */\n shellPort?: RpcPort;\n};\n\n/**\n * Manages the client connection to the shared worker.\n */\nexport class SharedWorkerConnection {\n private readonly _id = String(Math.floor(Math.random() * 1000000));\n private readonly _configProvider: SharedWorkerConnectionOptions['config'];\n private readonly _systemPort: RpcPort;\n private readonly _shellPort?: RpcPort;\n private _release = new Trigger();\n private _config!: Config;\n private _transportService!: BridgeService;\n private _systemRpc!: ProtoRpcPeer<WorkerServiceBundle>;\n private _shellRuntime?: ShellRuntimeImpl;\n\n constructor({ config, systemPort, shellPort }: SharedWorkerConnectionOptions) {\n this._configProvider = config;\n this._systemPort = systemPort;\n this._shellPort = shellPort;\n\n if (this._shellPort) {\n this._shellRuntime = new ShellRuntimeImpl(this._shellPort);\n }\n }\n\n get shell(): ShellRuntime | undefined {\n return this._shellRuntime;\n }\n\n async open(params: { origin: string; observabilityGroup?: string; signalTelemetryEnabled?: boolean }) {\n this._config = await getAsyncValue(this._configProvider);\n\n this._transportService = new SimplePeerTransportService({\n iceServers: this._config.get('runtime.services.ice'),\n });\n\n this._systemRpc = createProtoRpcPeer({\n requested: workerServiceBundle,\n exposed: iframeServiceBundle,\n handlers: {\n BridgeService: this._transportService,\n },\n port: this._systemPort,\n // TODO(wittjosiah): Make longer and factor out to constant.\n // TODO(wittjosiah): If this is too long then it breaks the reset flows in Composer.\n timeout: 200,\n });\n\n let lockKey: string | undefined;\n if (typeof navigator !== 'undefined') {\n lockKey = this._lockKey(params.origin);\n this._release = new Trigger();\n const ready = new Trigger();\n void navigator.locks.request(lockKey, async () => {\n ready.wake();\n await this._release.wait();\n });\n await ready.wait();\n }\n\n try {\n await this._systemRpc.open();\n await this._systemRpc.rpc.WorkerService.start({ lockKey, ...params });\n } catch (err) {\n log.catch(err);\n throw new RemoteServiceConnectionError('Failed to connect to worker');\n }\n await this._shellRuntime?.open();\n }\n\n async close() {\n this._release.wake();\n await this._shellRuntime?.close();\n try {\n await this._systemRpc.rpc.WorkerService.stop();\n } catch {\n // If this fails, the worker is probably already gone.\n }\n await this._systemRpc.close();\n }\n\n private _lockKey(origin: string) {\n return `${origin}-${this._id}`;\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\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 WorkerRuntimeCallbacks = {\n acquireLock: () => Promise<void>;\n releaseLock: () => void;\n onReset: () => 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 _acquireLock: () => Promise<void>;\n private readonly _releaseLock: () => 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 _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 private readonly _configProvider: () => MaybePromise<Config>,\n { acquireLock, releaseLock, onReset }: WorkerRuntimeCallbacks,\n ) {\n this._acquireLock = acquireLock;\n this._releaseLock = releaseLock;\n this._clientServices = new ClientServicesHost({\n callbacks: {\n onReset: async () => onReset(),\n },\n });\n }\n\n get host() {\n return this._clientServices;\n }\n\n async start() {\n log('starting...');\n try {\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 await this._clientServices.close();\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 if (globalThis.self) {\n self.close();\n }\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_log", "import_network_manager", "import_rpc", "import_util", "import_context", "import_invariant", "import_messaging", "ShellRuntimeImpl", "constructor", "_port", "layoutUpdate", "Event", "invitationUrlUpdate", "_layout", "ShellLayout", "DEFAULT", "_invitationUrl", "window", "location", "origin", "undefined", "_deviceInvitationParam", "_spaceInvitationParam", "layout", "invitationCode", "_invitationCode", "spaceKey", "_spaceKey", "invitationUrl", "deviceInvitationParam", "spaceInvitationParam", "setLayout", "emit", "setInvitationUrl", "setAppContext", "context", "invariant", "_appRpc", "rpc", "AppService", "setContext", "open", "createProtoRpcPeer", "requested", "appServiceBundle", "exposed", "shellServiceBundle", "handlers", "ShellService", "request", "port", "close", "LOCK_KEY", "IFrameHostRuntime", "config", "appPort", "shellPort", "_ready", "Trigger", "_configProvider", "_appPort", "_shellPort", "_shellRuntime", "services", "_clientServices", "shell", "start", "log", "_config", "getAsyncValue", "_transportFactory", "createSimplePeerTransportFactory", "iceServers", "get", "signals", "ClientServicesHost", "lockKey", "signalManager", "WebsocketSignalManager", "MemorySignalManager", "MemorySignalManagerContext", "transportFactory", "middleware", "handleCall", "method", "params", "handler", "error", "wait", "timeout", "PROXY_CONNECTION_TIMEOUT", "handleStream", "_clientRpc", "ClientRpcServer", "serviceRegistry", "Promise", "all", "Context", "wake", "err", "catch", "stop", "logInfo", "SharedWorkerConnection", "systemPort", "_id", "String", "Math", "floor", "random", "_release", "_systemPort", "_transportService", "SimplePeerTransportService", "_systemRpc", "workerServiceBundle", "iframeServiceBundle", "BridgeService", "navigator", "_lockKey", "ready", "locks", "WorkerService", "RemoteServiceConnectionError", "WorkerSession", "serviceHost", "readySignal", "_startTrigger", "onClose", "Callback", "_serviceHost", "_shellClientRpc", "_iframeRpc", "observabilityGroup", "signalTelemetryEnabled", "setTimeout", "bridgeService", "info", "_maybeOpenShell", "_afterLockReleases", "callIfSet", "asyncTimeout", "callback", "then", "WorkerRuntime", "acquireLock", "releaseLock", "onReset", "SimplePeerTransportProxyFactory", "_sessions", "Set", "_signalMetadataTags", "runtime", "_signalTelemetryEnabled", "_acquireLock", "_releaseLock", "callbacks", "host", "initialize", "setIdentityTags", "identityService", "IdentityService", "devicesService", "DevicesService", "setTag", "k", "v", "createSession", "session", "set", "delete", "size", "globalThis", "self", "_reconnectWebrtc", "group", "add", "_sessionForNetworking", "has", "selected", "Array", "from", "find", "setBridgeService"]
7
7
  }