@dxos/client-services 0.1.22 → 0.1.24-next.6b1f434

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 (129) hide show
  1. package/dist/lib/browser/chunk-ZPZBLOQW.mjs +4086 -0
  2. package/dist/lib/browser/chunk-ZPZBLOQW.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +68 -3027
  4. package/dist/lib/browser/index.mjs.map +4 -4
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +198 -0
  7. package/dist/lib/browser/packlets/testing/index.mjs.map +7 -0
  8. package/dist/lib/node/index.cjs +1694 -667
  9. package/dist/lib/node/index.cjs.map +4 -4
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/packlets/testing/index.cjs +3806 -0
  12. package/dist/lib/node/packlets/testing/index.cjs.map +7 -0
  13. package/dist/types/src/packlets/deprecated/profile.d.ts +3 -1
  14. package/dist/types/src/packlets/deprecated/profile.d.ts.map +1 -1
  15. package/dist/types/src/packlets/deprecated/space.d.ts.map +1 -1
  16. package/dist/types/src/packlets/deprecated/system.d.ts +15 -9
  17. package/dist/types/src/packlets/deprecated/system.d.ts.map +1 -1
  18. package/dist/types/src/packlets/devtools/devtools.d.ts +2 -2
  19. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  20. package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
  21. package/dist/types/src/packlets/devtools/network.d.ts +3 -3
  22. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  23. package/dist/types/src/packlets/devtools/spaces.d.ts.map +1 -1
  24. package/dist/types/src/packlets/identity/authenticator.d.ts +9 -9
  25. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  26. package/dist/types/src/packlets/identity/identity-manager.d.ts +8 -2
  27. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  28. package/dist/types/src/packlets/identity/identity.d.ts +5 -4
  29. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  30. package/dist/types/src/packlets/invitations/halo-invitations-handler.d.ts +11 -3
  31. package/dist/types/src/packlets/invitations/halo-invitations-handler.d.ts.map +1 -1
  32. package/dist/types/src/packlets/invitations/invitations.d.ts +1 -1
  33. package/dist/types/src/packlets/invitations/invitations.d.ts.map +1 -1
  34. package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts +1 -1
  35. package/dist/types/src/packlets/invitations/space-invitations-handler.d.ts.map +1 -1
  36. package/dist/types/src/packlets/services/service-context.d.ts +3 -1
  37. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  38. package/dist/types/src/packlets/services/service-context.test.d.ts +2 -0
  39. package/dist/types/src/packlets/services/service-context.test.d.ts.map +1 -0
  40. package/dist/types/src/packlets/services/service-definitions.d.ts +1 -1
  41. package/dist/types/src/packlets/services/service-definitions.d.ts.map +1 -1
  42. package/dist/types/src/packlets/services/service-host.d.ts +9 -6
  43. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  44. package/dist/types/src/packlets/services/service-registry.d.ts +4 -3
  45. package/dist/types/src/packlets/services/service-registry.d.ts.map +1 -1
  46. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +9 -2
  47. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  48. package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts +2 -0
  49. package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts.map +1 -0
  50. package/dist/types/src/packlets/spaces/data-space.d.ts +20 -4
  51. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  52. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +50 -0
  53. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -0
  54. package/dist/types/src/packlets/spaces/notarization-plugin.test.d.ts +2 -0
  55. package/dist/types/src/packlets/spaces/notarization-plugin.test.d.ts.map +1 -0
  56. package/dist/types/src/packlets/spaces/spaces-service.d.ts +3 -2
  57. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  58. package/dist/types/src/packlets/testing/credential-utils.d.ts +8 -0
  59. package/dist/types/src/packlets/testing/credential-utils.d.ts.map +1 -0
  60. package/dist/types/src/packlets/testing/index.d.ts +2 -0
  61. package/dist/types/src/packlets/testing/index.d.ts.map +1 -1
  62. package/dist/types/src/packlets/testing/invitation-utils.d.ts +3 -0
  63. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -0
  64. package/dist/types/src/packlets/testing/test-builder.d.ts +31 -2
  65. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  66. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts +35 -0
  67. package/dist/types/src/packlets/vault/iframe-host-runtime.d.ts.map +1 -0
  68. package/dist/types/src/packlets/vault/{iframe-runtime.d.ts → iframe-proxy-runtime.d.ts} +9 -4
  69. package/dist/types/src/packlets/vault/iframe-proxy-runtime.d.ts.map +1 -0
  70. package/dist/types/src/packlets/vault/index.d.ts +6 -1
  71. package/dist/types/src/packlets/vault/index.d.ts.map +1 -1
  72. package/dist/types/src/packlets/vault/services.d.ts +9 -1
  73. package/dist/types/src/packlets/vault/services.d.ts.map +1 -1
  74. package/dist/types/src/packlets/vault/shell-controller.d.ts +24 -0
  75. package/dist/types/src/packlets/vault/shell-controller.d.ts.map +1 -0
  76. package/dist/types/src/packlets/vault/shell-runtime.d.ts +45 -0
  77. package/dist/types/src/packlets/vault/shell-runtime.d.ts.map +1 -0
  78. package/dist/types/src/packlets/vault/vault-resource-lock.d.ts +19 -0
  79. package/dist/types/src/packlets/vault/vault-resource-lock.d.ts.map +1 -0
  80. package/dist/types/src/packlets/vault/worker-runtime.d.ts +2 -1
  81. package/dist/types/src/packlets/vault/worker-runtime.d.ts.map +1 -1
  82. package/dist/types/src/packlets/vault/worker-session.d.ts +7 -4
  83. package/dist/types/src/packlets/vault/worker-session.d.ts.map +1 -1
  84. package/package.json +30 -29
  85. package/src/packlets/deprecated/profile.ts +20 -2
  86. package/src/packlets/deprecated/space.ts +41 -37
  87. package/src/packlets/deprecated/system.ts +26 -13
  88. package/src/packlets/devtools/devtools.ts +4 -4
  89. package/src/packlets/devtools/feeds.ts +11 -6
  90. package/src/packlets/devtools/network.ts +20 -9
  91. package/src/packlets/devtools/spaces.ts +8 -7
  92. package/src/packlets/identity/authenticator.test.ts +4 -4
  93. package/src/packlets/identity/authenticator.ts +27 -17
  94. package/src/packlets/identity/identity-manager.test.ts +25 -16
  95. package/src/packlets/identity/identity-manager.ts +25 -13
  96. package/src/packlets/identity/identity.test.ts +22 -23
  97. package/src/packlets/identity/identity.ts +15 -10
  98. package/src/packlets/invitations/halo-invitations-handler.test.ts +4 -45
  99. package/src/packlets/invitations/halo-invitations-handler.ts +33 -17
  100. package/src/packlets/invitations/invitations.ts +2 -1
  101. package/src/packlets/invitations/space-invitations-handler.test.ts +43 -26
  102. package/src/packlets/invitations/space-invitations-handler.ts +9 -12
  103. package/src/packlets/services/service-context.test.ts +56 -0
  104. package/src/packlets/services/service-context.ts +62 -10
  105. package/src/packlets/services/service-definitions.ts +1 -1
  106. package/src/packlets/services/service-host.test.ts +74 -5
  107. package/src/packlets/services/service-host.ts +86 -24
  108. package/src/packlets/services/service-registry.test.ts +2 -1
  109. package/src/packlets/services/service-registry.ts +5 -1
  110. package/src/packlets/spaces/data-space-manager.test.ts +131 -0
  111. package/src/packlets/spaces/data-space-manager.ts +61 -15
  112. package/src/packlets/spaces/data-space.ts +125 -14
  113. package/src/packlets/spaces/notarization-plugin.test.ts +81 -0
  114. package/src/packlets/spaces/notarization-plugin.ts +211 -0
  115. package/src/packlets/spaces/spaces-service.ts +10 -2
  116. package/src/packlets/testing/credential-utils.ts +28 -0
  117. package/src/packlets/testing/index.ts +2 -0
  118. package/src/packlets/testing/invitation-utils.ts +44 -0
  119. package/src/packlets/testing/test-builder.ts +96 -14
  120. package/src/packlets/vault/iframe-host-runtime.ts +131 -0
  121. package/src/packlets/vault/{iframe-runtime.ts → iframe-proxy-runtime.ts} +18 -3
  122. package/src/packlets/vault/index.ts +6 -1
  123. package/src/packlets/vault/services.ts +17 -1
  124. package/src/packlets/vault/shell-controller.ts +77 -0
  125. package/src/packlets/vault/shell-runtime.ts +133 -0
  126. package/src/packlets/vault/vault-resource-lock.ts +76 -0
  127. package/src/packlets/vault/worker-runtime.ts +16 -4
  128. package/src/packlets/vault/worker-session.ts +36 -26
  129. package/dist/types/src/packlets/vault/iframe-runtime.d.ts.map +0 -1
@@ -0,0 +1,76 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import { asyncTimeout, Trigger } from '@dxos/async';
6
+ import { log } from '@dxos/log';
7
+ import { MaybePromise } from '@dxos/util';
8
+
9
+ enum Message {
10
+ ACQUIRING = 'acquiring'
11
+ }
12
+
13
+ export type VaultResourceLockOptions = {
14
+ lockKey: string;
15
+ onAcquire?: () => MaybePromise<void>;
16
+ onRelease?: () => MaybePromise<void>;
17
+ };
18
+
19
+ export class VaultResourceLock {
20
+ private readonly _broadcastChannel = new BroadcastChannel('vault-resource-lock');
21
+ private readonly _lockKey: string;
22
+ private readonly _onAcquire: VaultResourceLockOptions['onAcquire'];
23
+ private readonly _onRelease: VaultResourceLockOptions['onRelease'];
24
+ private _releaseTrigger = new Trigger();
25
+
26
+ constructor({ lockKey, onAcquire, onRelease }: VaultResourceLockOptions) {
27
+ this._lockKey = lockKey;
28
+ this._onAcquire = onAcquire;
29
+ this._onRelease = onRelease;
30
+ this._broadcastChannel.onmessage = this._onMessage.bind(this);
31
+ }
32
+
33
+ async acquire() {
34
+ this._broadcastChannel.postMessage({
35
+ message: Message.ACQUIRING
36
+ });
37
+
38
+ try {
39
+ await asyncTimeout(this._requestLock(), 3_000);
40
+ } catch {
41
+ await this._requestLock(true);
42
+ }
43
+ }
44
+
45
+ async release() {
46
+ this._releaseTrigger.wake();
47
+ }
48
+
49
+ private _onMessage(event: MessageEvent<any>) {
50
+ if (event.data.message === Message.ACQUIRING) {
51
+ this._releaseTrigger.wake();
52
+ }
53
+ }
54
+
55
+ private async _requestLock(steal = false) {
56
+ log('requesting lock...', { steal });
57
+ const acquired = new Trigger();
58
+
59
+ void navigator.locks
60
+ .request(this._lockKey, { steal }, async () => {
61
+ await this._onAcquire?.();
62
+ acquired.wake();
63
+ this._releaseTrigger = new Trigger();
64
+ await this._releaseTrigger.wait();
65
+ log('releasing lock...');
66
+ await this._onRelease?.();
67
+ log('released lock');
68
+ })
69
+ .catch(async () => {
70
+ await this._onRelease?.();
71
+ });
72
+
73
+ await acquired.wait();
74
+ log('recieved lock', { steal });
75
+ }
76
+ }
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { Trigger } from '@dxos/async';
6
6
  import { Config } from '@dxos/config';
7
+ import { log } from '@dxos/log';
7
8
  import { MemorySignalManager, MemorySignalManagerContext, WebsocketSignalManager } from '@dxos/messaging';
8
9
  import { NetworkManager, WebRTCTransportProxyFactory } from '@dxos/network-manager';
9
10
  import { RpcPort } from '@dxos/rpc';
@@ -16,6 +17,7 @@ import { WorkerSession } from './worker-session';
16
17
  export type CreateSessionParams = {
17
18
  appPort: RpcPort;
18
19
  systemPort: RpcPort;
20
+ shellPort: RpcPort;
19
21
  };
20
22
 
21
23
  /**
@@ -37,6 +39,7 @@ export class WorkerRuntime {
37
39
  ) { }
38
40
 
39
41
  async start() {
42
+ log('starting...');
40
43
  try {
41
44
  this._config = await this._configProvider();
42
45
  const signalServer = this._config.get('runtime.services.signal.server');
@@ -53,8 +56,10 @@ export class WorkerRuntime {
53
56
 
54
57
  await this._clientServices.open();
55
58
  this._ready.wake(undefined);
59
+ log('started');
56
60
  } catch (err: any) {
57
61
  this._ready.wake(err);
62
+ log.catch(err);
58
63
  }
59
64
  }
60
65
 
@@ -66,17 +71,24 @@ export class WorkerRuntime {
66
71
  /**
67
72
  * Create a new session.
68
73
  */
69
- async createSession({ appPort, systemPort }: CreateSessionParams) {
74
+ async createSession({ appPort, systemPort, shellPort }: CreateSessionParams) {
70
75
  const session = new WorkerSession({
71
- getServices: async () => {
76
+ getService: async (find) => {
72
77
  const error = await this._ready.wait();
73
- if (error !== undefined) {
78
+ if (error) {
74
79
  throw error;
75
80
  }
76
- return this._clientServices;
81
+
82
+ const service = find(this._clientServices.services);
83
+ if (!service) {
84
+ throw new Error('Service not found');
85
+ }
86
+
87
+ return service;
77
88
  },
78
89
  appPort,
79
90
  systemPort,
91
+ shellPort,
80
92
  readySignal: this._ready
81
93
  });
82
94
 
@@ -4,19 +4,20 @@
4
4
 
5
5
  import assert from 'node:assert';
6
6
 
7
- import { Trigger } from '@dxos/async';
7
+ import { asyncTimeout, Trigger } from '@dxos/async';
8
8
  import { log, logInfo } from '@dxos/log';
9
9
  import { BridgeService } from '@dxos/protocols/proto/dxos/mesh/bridge';
10
10
  import { createProtoRpcPeer, ProtoRpcPeer, RpcPort } from '@dxos/rpc';
11
11
  import { Callback } from '@dxos/util';
12
12
 
13
- import { clientServiceBundle, ClientServices, ClientServicesHost } from '../services';
13
+ import { clientServiceBundle, ClientServices } from '../services';
14
14
  import { IframeServiceBundle, iframeServiceBundle, workerServiceBundle } from './services';
15
15
 
16
16
  export type WorkerSessionParams = {
17
- getServices: () => Promise<ClientServicesHost>;
17
+ getService: <Service>(find: (services: Partial<ClientServices>) => Service | undefined) => Promise<Service>;
18
18
  systemPort: RpcPort;
19
19
  appPort: RpcPort;
20
+ shellPort: RpcPort;
20
21
  readySignal: Trigger<Error | undefined>;
21
22
  options?: {
22
23
  heartbeatInterval: number;
@@ -28,9 +29,10 @@ export type WorkerSessionParams = {
28
29
  */
29
30
  export class WorkerSession {
30
31
  private readonly _clientRpc: ProtoRpcPeer<ClientServices>;
32
+ private readonly _shellClientRpc: ProtoRpcPeer<ClientServices>;
31
33
  private readonly _iframeRpc: ProtoRpcPeer<IframeServiceBundle>;
32
34
  private readonly _startTrigger = new Trigger();
33
- private readonly _getServices: () => Promise<ClientServicesHost>;
35
+ private readonly _getService: WorkerSessionParams['getService'];
34
36
  private readonly _options: NonNullable<WorkerSessionParams['options']>;
35
37
  private _heartbeatTimer?: NodeJS.Timeout;
36
38
 
@@ -42,35 +44,35 @@ export class WorkerSession {
42
44
  public bridgeService?: BridgeService;
43
45
 
44
46
  constructor({
45
- getServices,
47
+ getService,
46
48
  systemPort,
47
49
  appPort,
50
+ shellPort,
48
51
  options = {
49
52
  heartbeatInterval: 1_000
50
53
  }
51
54
  }: WorkerSessionParams) {
52
55
  assert(options);
53
- assert(getServices);
56
+ assert(getService);
54
57
  this._options = options;
55
- this._getServices = getServices;
56
-
57
- this._clientRpc = createProtoRpcPeer({
58
- exposed: clientServiceBundle,
59
- handlers: {
60
- HaloInvitationsService: async () => (await this._getServices()).services.HaloInvitationsService,
61
- DevicesService: async () => (await this._getServices()).services.DevicesService,
62
- SpaceInvitationsService: async () => (await this._getServices()).services.SpaceInvitationsService,
63
- SpacesService: async () => (await this._getServices()).services.SpacesService,
64
- NetworkService: async () => (await this._getServices()).services.NetworkService,
65
- SpaceService: async () => (await this._getServices()).services.SpaceService,
66
- DataService: async () => (await this._getServices()).services.DataService,
67
- ProfileService: async () => (await this._getServices()).services.ProfileService,
68
- SystemService: async () => (await this._getServices()).services.SystemService,
69
- DevtoolsHost: async () => (await this._getServices()).services.DevtoolsHost,
70
- TracingService: async () => (await this._getServices()).services.TracingService
71
- },
72
- port: appPort
73
- });
58
+ this._getService = getService;
59
+
60
+ const handlers = {
61
+ DataService: async () => await this._getService((services) => services.DataService),
62
+ DevicesService: async () => await this._getService((services) => services.DevicesService),
63
+ DevtoolsHost: async () => await this._getService((services) => services.DevtoolsHost),
64
+ HaloInvitationsService: async () => await this._getService((services) => services.HaloInvitationsService),
65
+ NetworkService: async () => await this._getService((services) => services.NetworkService),
66
+ ProfileService: async () => await this._getService((services) => services.ProfileService),
67
+ SpaceInvitationsService: async () => await this._getService((services) => services.SpaceInvitationsService),
68
+ SpaceService: async () => await this._getService((services) => services.SpaceService),
69
+ SpacesService: async () => await this._getService((services) => services.SpacesService),
70
+ SystemService: async () => await this._getService((services) => services.SystemService),
71
+ TracingService: async () => await this._getService((services) => services.TracingService)
72
+ };
73
+
74
+ this._clientRpc = createProtoRpcPeer({ exposed: clientServiceBundle, handlers, port: appPort });
75
+ this._shellClientRpc = createProtoRpcPeer({ exposed: clientServiceBundle, handlers, port: shellPort });
74
76
 
75
77
  this._iframeRpc = createProtoRpcPeer({
76
78
  requested: iframeServiceBundle,
@@ -102,7 +104,7 @@ export class WorkerSession {
102
104
 
103
105
  async open() {
104
106
  log.info('opening..');
105
- await Promise.all([this._clientRpc.open(), this._iframeRpc.open()]);
107
+ await Promise.all([this._clientRpc.open(), this._iframeRpc.open(), this._maybeOpenShell()]);
106
108
 
107
109
  await this._startTrigger.wait({ timeout: 3_000 });
108
110
 
@@ -137,4 +139,12 @@ export class WorkerSession {
137
139
 
138
140
  await Promise.all([this._clientRpc.close(), this._iframeRpc.close()]);
139
141
  }
142
+
143
+ private async _maybeOpenShell() {
144
+ try {
145
+ await asyncTimeout(this._shellClientRpc.open(), 1_000);
146
+ } catch {
147
+ log.info('No shell connected.');
148
+ }
149
+ }
140
150
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"iframe-runtime.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/vault/iframe-runtime.ts"],"names":[],"mappings":"AAMA,OAAO,EAAoC,OAAO,EAAE,MAAM,WAAW,CAAC;AAKtE,oBAAY,mBAAmB,GAAG;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,aAAa,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAU;IACtC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAU;IACzC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoC;IAC/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAgC;gBAEtD,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,mBAAmB;IAwBvE,IAAI,CAAC,MAAM,EAAE,MAAM;IAKnB,KAAK;CAIZ"}