@dxos/client-services 0.8.4-main.84f28bd → 0.8.4-main.937b3ca

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 (201) hide show
  1. package/dist/lib/browser/chunk-NQSC7HOE.mjs +22 -0
  2. package/dist/lib/browser/chunk-NQSC7HOE.mjs.map +7 -0
  3. package/dist/lib/browser/chunk-QCWEHHJW.mjs +24 -0
  4. package/dist/lib/browser/chunk-QCWEHHJW.mjs.map +7 -0
  5. package/dist/lib/browser/{chunk-OCFDRCSN.mjs → chunk-UDCUM4WV.mjs} +3626 -3714
  6. package/dist/lib/browser/chunk-UDCUM4WV.mjs.map +7 -0
  7. package/dist/lib/browser/index.mjs +462 -76
  8. package/dist/lib/browser/index.mjs.map +4 -4
  9. package/dist/lib/browser/meta.json +1 -1
  10. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  11. package/dist/lib/browser/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  12. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  13. package/dist/lib/browser/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  14. package/dist/lib/browser/packlets/locks/browser.mjs +126 -0
  15. package/dist/lib/browser/packlets/locks/browser.mjs.map +7 -0
  16. package/dist/lib/browser/packlets/locks/node.mjs +66 -0
  17. package/dist/lib/browser/packlets/locks/node.mjs.map +7 -0
  18. package/dist/lib/browser/testing/index.mjs +34 -22
  19. package/dist/lib/browser/testing/index.mjs.map +3 -3
  20. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs +24 -0
  21. package/dist/lib/node-esm/chunk-2SZHAWBN.mjs.map +7 -0
  22. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs +22 -0
  23. package/dist/lib/node-esm/chunk-PKEGMOQ4.mjs.map +7 -0
  24. package/dist/lib/node-esm/{chunk-D7F3FYZS.mjs → chunk-Q56HAUWS.mjs} +2636 -2592
  25. package/dist/lib/node-esm/chunk-Q56HAUWS.mjs.map +7 -0
  26. package/dist/lib/node-esm/index.mjs +462 -76
  27. package/dist/lib/node-esm/index.mjs.map +4 -4
  28. package/dist/lib/node-esm/meta.json +1 -1
  29. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs +93 -0
  30. package/dist/lib/node-esm/packlets/diagnostics/browser-diagnostics-broadcast.mjs.map +7 -0
  31. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs +11 -0
  32. package/dist/lib/node-esm/packlets/diagnostics/diagnostics-broadcast.mjs.map +7 -0
  33. package/dist/lib/node-esm/packlets/locks/browser.mjs +126 -0
  34. package/dist/lib/node-esm/packlets/locks/browser.mjs.map +7 -0
  35. package/dist/lib/node-esm/packlets/locks/node.mjs +66 -0
  36. package/dist/lib/node-esm/packlets/locks/node.mjs.map +7 -0
  37. package/dist/lib/node-esm/testing/index.mjs +34 -22
  38. package/dist/lib/node-esm/testing/index.mjs.map +3 -3
  39. package/dist/types/src/packlets/agents/edge-agent-service.d.ts +1 -1
  40. package/dist/types/src/packlets/agents/edge-agent-service.d.ts.map +1 -1
  41. package/dist/types/src/packlets/devices/devices-service.d.ts.map +1 -1
  42. package/dist/types/src/packlets/devtools/devtools.d.ts +20 -20
  43. package/dist/types/src/packlets/devtools/devtools.d.ts.map +1 -1
  44. package/dist/types/src/packlets/devtools/feeds.d.ts +1 -1
  45. package/dist/types/src/packlets/devtools/feeds.d.ts.map +1 -1
  46. package/dist/types/src/packlets/devtools/network.d.ts +1 -1
  47. package/dist/types/src/packlets/devtools/network.d.ts.map +1 -1
  48. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts +1 -1
  49. package/dist/types/src/packlets/diagnostics/browser-diagnostics-broadcast.d.ts.map +1 -1
  50. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts +1 -1
  51. package/dist/types/src/packlets/diagnostics/diagnostics-broadcast.d.ts.map +1 -1
  52. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts +1 -1
  53. package/dist/types/src/packlets/diagnostics/diagnostics.d.ts.map +1 -1
  54. package/dist/types/src/packlets/diagnostics/index.d.ts +1 -1
  55. package/dist/types/src/packlets/diagnostics/index.d.ts.map +1 -1
  56. package/dist/types/src/packlets/identity/authenticator.d.ts +2 -2
  57. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  58. package/dist/types/src/packlets/identity/contacts-service.d.ts +1 -1
  59. package/dist/types/src/packlets/identity/contacts-service.d.ts.map +1 -1
  60. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts +3 -3
  61. package/dist/types/src/packlets/identity/default-space-state-machine.d.ts.map +1 -1
  62. package/dist/types/src/packlets/identity/identity-manager.d.ts +5 -5
  63. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  64. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts +2 -2
  65. package/dist/types/src/packlets/identity/identity-recovery-manager.d.ts.map +1 -1
  66. package/dist/types/src/packlets/identity/identity-service.d.ts +1 -1
  67. package/dist/types/src/packlets/identity/identity-service.d.ts.map +1 -1
  68. package/dist/types/src/packlets/identity/identity.d.ts +3 -3
  69. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  70. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +4 -4
  71. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  72. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts +1 -1
  73. package/dist/types/src/packlets/invitations/edge-invitation-handler.d.ts.map +1 -1
  74. package/dist/types/src/packlets/invitations/index.d.ts +1 -1
  75. package/dist/types/src/packlets/invitations/index.d.ts.map +1 -1
  76. package/dist/types/src/packlets/invitations/invitation-guest-extenstion.d.ts.map +1 -1
  77. package/dist/types/src/packlets/invitations/invitation-host-extension.d.ts.map +1 -1
  78. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +3 -4
  79. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  80. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +4 -4
  81. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  82. package/dist/types/src/packlets/invitations/invitations-manager.d.ts.map +1 -1
  83. package/dist/types/src/packlets/invitations/invitations-service.d.ts +1 -1
  84. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  85. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +3 -3
  86. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  87. package/dist/types/src/packlets/invitations/utils.d.ts.map +1 -1
  88. package/dist/types/src/packlets/locks/index.d.ts +2 -2
  89. package/dist/types/src/packlets/locks/index.d.ts.map +1 -1
  90. package/dist/types/src/packlets/logging/logging-service.d.ts +1 -1
  91. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  92. package/dist/types/src/packlets/network/network-service.d.ts +2 -2
  93. package/dist/types/src/packlets/network/network-service.d.ts.map +1 -1
  94. package/dist/types/src/packlets/services/client-rpc-server.d.ts +2 -2
  95. package/dist/types/src/packlets/services/client-rpc-server.d.ts.map +1 -1
  96. package/dist/types/src/packlets/services/service-context.d.ts +14 -8
  97. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  98. package/dist/types/src/packlets/services/service-host.d.ts +20 -6
  99. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  100. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts +1 -1
  101. package/dist/types/src/packlets/space-export/space-archive-writer.d.ts.map +1 -1
  102. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +1 -1
  103. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  104. package/dist/types/src/packlets/spaces/data-space-manager.d.ts +12 -7
  105. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  106. package/dist/types/src/packlets/spaces/data-space.d.ts +6 -6
  107. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  108. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts +2 -2
  109. package/dist/types/src/packlets/spaces/edge-feed-replicator.d.ts.map +1 -1
  110. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts +6 -6
  111. package/dist/types/src/packlets/spaces/notarization-plugin.d.ts.map +1 -1
  112. package/dist/types/src/packlets/spaces/spaces-service.d.ts +2 -2
  113. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  114. package/dist/types/src/packlets/storage/profile-archive.d.ts.map +1 -1
  115. package/dist/types/src/packlets/storage/storage.d.ts.map +1 -1
  116. package/dist/types/src/packlets/system/system-service.d.ts +1 -1
  117. package/dist/types/src/packlets/system/system-service.d.ts.map +1 -1
  118. package/dist/types/src/packlets/testing/invitation-utils.d.ts +6 -3
  119. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  120. package/dist/types/src/packlets/testing/test-builder.d.ts +8 -7
  121. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  122. package/dist/types/src/packlets/worker/worker-runtime.d.ts +23 -4
  123. package/dist/types/src/packlets/worker/worker-runtime.d.ts.map +1 -1
  124. package/dist/types/src/packlets/worker/worker-session.d.ts +2 -2
  125. package/dist/types/src/packlets/worker/worker-session.d.ts.map +1 -1
  126. package/dist/types/src/version.d.ts +1 -1
  127. package/dist/types/tsconfig.tsbuildinfo +1 -1
  128. package/package.json +72 -48
  129. package/src/packlets/agents/edge-agent-manager.ts +2 -2
  130. package/src/packlets/agents/edge-agent-service.ts +13 -3
  131. package/src/packlets/devices/devices-service.test.ts +4 -3
  132. package/src/packlets/devices/devices-service.ts +2 -2
  133. package/src/packlets/devtools/devtools.ts +30 -29
  134. package/src/packlets/devtools/feeds.ts +2 -2
  135. package/src/packlets/devtools/network.ts +1 -1
  136. package/src/packlets/diagnostics/browser-diagnostics-broadcast.ts +1 -1
  137. package/src/packlets/diagnostics/diagnostics-broadcast.ts +1 -1
  138. package/src/packlets/diagnostics/diagnostics-collector.ts +1 -1
  139. package/src/packlets/diagnostics/diagnostics.ts +1 -1
  140. package/src/packlets/diagnostics/index.ts +1 -1
  141. package/src/packlets/identity/authenticator.node.test.ts +1 -1
  142. package/src/packlets/identity/authenticator.ts +3 -3
  143. package/src/packlets/identity/contacts-service.ts +3 -2
  144. package/src/packlets/identity/default-space-state-machine.ts +3 -3
  145. package/src/packlets/identity/identity-manager.test.ts +3 -3
  146. package/src/packlets/identity/identity-manager.ts +9 -9
  147. package/src/packlets/identity/identity-recovery-manager.ts +2 -2
  148. package/src/packlets/identity/identity-service.test.ts +3 -2
  149. package/src/packlets/identity/identity-service.ts +2 -1
  150. package/src/packlets/identity/identity.test.ts +9 -9
  151. package/src/packlets/identity/identity.ts +9 -8
  152. package/src/packlets/invitations/device-invitation-protocol.test.ts +4 -4
  153. package/src/packlets/invitations/device-invitation-protocol.ts +6 -5
  154. package/src/packlets/invitations/edge-invitation-handler.ts +1 -1
  155. package/src/packlets/invitations/index.ts +1 -1
  156. package/src/packlets/invitations/invitation-guest-extenstion.ts +7 -5
  157. package/src/packlets/invitations/invitation-host-extension.ts +8 -6
  158. package/src/packlets/invitations/invitation-protocol.ts +3 -4
  159. package/src/packlets/invitations/invitations-handler.test.ts +302 -292
  160. package/src/packlets/invitations/invitations-handler.ts +10 -10
  161. package/src/packlets/invitations/invitations-manager.ts +3 -3
  162. package/src/packlets/invitations/invitations-service.ts +1 -1
  163. package/src/packlets/invitations/space-invitation-protocol.test.ts +9 -9
  164. package/src/packlets/invitations/space-invitation-protocol.ts +10 -15
  165. package/src/packlets/invitations/utils.ts +1 -1
  166. package/src/packlets/locks/browser.ts +1 -1
  167. package/src/packlets/locks/index.ts +2 -2
  168. package/src/packlets/logging/logging-service.ts +4 -3
  169. package/src/packlets/logging/logging.test.ts +1 -1
  170. package/src/packlets/network/network-service.test.ts +4 -3
  171. package/src/packlets/network/network-service.ts +2 -2
  172. package/src/packlets/services/client-rpc-server.ts +5 -5
  173. package/src/packlets/services/service-context.test.ts +1 -1
  174. package/src/packlets/services/service-context.ts +39 -27
  175. package/src/packlets/services/service-host.test.ts +3 -2
  176. package/src/packlets/services/service-host.ts +74 -25
  177. package/src/packlets/services/service-registry.test.ts +2 -1
  178. package/src/packlets/space-export/space-archive-reader.ts +2 -2
  179. package/src/packlets/space-export/space-archive-writer.ts +7 -5
  180. package/src/packlets/space-export/tar.test.ts +1 -1
  181. package/src/packlets/spaces/automerge-space-state.ts +1 -1
  182. package/src/packlets/spaces/data-space-manager.ts +76 -36
  183. package/src/packlets/spaces/data-space.ts +15 -13
  184. package/src/packlets/spaces/edge-feed-replicator.test.ts +3 -3
  185. package/src/packlets/spaces/edge-feed-replicator.ts +4 -4
  186. package/src/packlets/spaces/epoch-migrations.ts +2 -2
  187. package/src/packlets/spaces/notarization-plugin.test.ts +3 -3
  188. package/src/packlets/spaces/notarization-plugin.ts +11 -11
  189. package/src/packlets/spaces/spaces-service.test.ts +3 -2
  190. package/src/packlets/spaces/spaces-service.ts +27 -23
  191. package/src/packlets/storage/profile-archive.ts +1 -1
  192. package/src/packlets/storage/storage.ts +7 -8
  193. package/src/packlets/system/system-service.test.ts +1 -1
  194. package/src/packlets/system/system-service.ts +4 -4
  195. package/src/packlets/testing/invitation-utils.ts +8 -5
  196. package/src/packlets/testing/test-builder.ts +39 -13
  197. package/src/packlets/worker/worker-runtime.ts +143 -12
  198. package/src/packlets/worker/worker-session.ts +7 -7
  199. package/src/version.ts +1 -1
  200. package/dist/lib/browser/chunk-OCFDRCSN.mjs.map +0 -7
  201. package/dist/lib/node-esm/chunk-D7F3FYZS.mjs.map +0 -7
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { type PushStream, scheduleTask, TimeoutError, type Trigger } from '@dxos/async';
5
+ import { type PushStream, TimeoutError, type Trigger, scheduleTask } from '@dxos/async';
6
6
  import { INVITATION_TIMEOUT, getExpirationTime } from '@dxos/client-protocol';
7
7
  import { type Context, ContextDisposedError } from '@dxos/context';
8
8
  import { createKeyPair, sign } from '@dxos/crypto';
@@ -10,19 +10,19 @@ import { type EdgeHttpClient } from '@dxos/edge-client';
10
10
  import { invariant } from '@dxos/invariant';
11
11
  import { PublicKey } from '@dxos/keys';
12
12
  import { log } from '@dxos/log';
13
- import { createTeleportProtocolFactory, type SwarmNetworkManager, type SwarmConnection } from '@dxos/network-manager';
13
+ import { type SwarmConnection, type SwarmNetworkManager, createTeleportProtocolFactory } from '@dxos/network-manager';
14
14
  import { InvalidInvitationError, InvalidInvitationExtensionRoleError, trace } from '@dxos/protocols';
15
15
  import { type AdmissionKeypair, Invitation } from '@dxos/protocols/proto/dxos/client/services';
16
16
  import { type DeviceProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
17
17
  import { AuthenticationResponse, type IntroductionResponse } from '@dxos/protocols/proto/dxos/halo/invitations';
18
18
  import { InvitationOptions } from '@dxos/protocols/proto/dxos/halo/invitations';
19
- import { type ExtensionContext, type TeleportExtension, type TeleportParams } from '@dxos/teleport';
19
+ import { type ExtensionContext, type TeleportExtension, type TeleportProps } from '@dxos/teleport';
20
20
  import { trace as _trace } from '@dxos/tracing';
21
21
  import { ComplexSet } from '@dxos/util';
22
22
 
23
23
  import { type EdgeInvitationConfig, EdgeInvitationHandler } from './edge-invitation-handler';
24
24
  import { InvitationGuestExtension } from './invitation-guest-extenstion';
25
- import { InvitationHostExtension, isAuthenticationRequired, MAX_OTP_ATTEMPTS } from './invitation-host-extension';
25
+ import { InvitationHostExtension, MAX_OTP_ATTEMPTS, isAuthenticationRequired } from './invitation-host-extension';
26
26
  import { type InvitationProtocol } from './invitation-protocol';
27
27
  import { createGuardedInvitationState } from './invitation-state';
28
28
  import { InvitationTopology } from './invitation-topology';
@@ -31,8 +31,8 @@ const metrics = _trace.metrics;
31
31
 
32
32
  const MAX_DELEGATED_INVITATION_HOST_TRIES = 3;
33
33
 
34
- export type InvitationConnectionParams = {
35
- teleport: Partial<TeleportParams>;
34
+ export type InvitationConnectionProps = {
35
+ teleport: Partial<TeleportProps>;
36
36
  edgeInvitations?: EdgeInvitationConfig;
37
37
  };
38
38
 
@@ -71,7 +71,7 @@ export class InvitationsHandler {
71
71
  constructor(
72
72
  private readonly _networkManager: SwarmNetworkManager,
73
73
  private readonly _edgeClient?: EdgeHttpClient,
74
- private readonly _connectionParams?: InvitationConnectionParams,
74
+ private readonly _connectionProps?: InvitationConnectionProps,
75
75
  ) {}
76
76
 
77
77
  handleInvitationFlow(
@@ -388,7 +388,7 @@ export class InvitationsHandler {
388
388
  return extension;
389
389
  };
390
390
 
391
- const edgeInvitationHandler = new EdgeInvitationHandler(this._connectionParams?.edgeInvitations, this._edgeClient, {
391
+ const edgeInvitationHandler = new EdgeInvitationHandler(this._connectionProps?.edgeInvitations, this._edgeClient, {
392
392
  onInvitationSuccess: async (admissionResponse, admissionRequest) => {
393
393
  const result = await protocol.accept(admissionResponse, admissionRequest);
394
394
  log.info('admitted by edge', { ...protocol.toJSON() });
@@ -440,7 +440,7 @@ export class InvitationsHandler {
440
440
  topic: invitation.swarmKey,
441
441
  protocolProvider: createTeleportProtocolFactory(async (teleport) => {
442
442
  teleport.addExtension('dxos.halo.invitations', extensionFactory());
443
- }, this._connectionParams?.teleport),
443
+ }, this._connectionProps?.teleport),
444
444
  topology: new InvitationTopology(role),
445
445
  label,
446
446
  });
@@ -503,7 +503,7 @@ export class InvitationsHandler {
503
503
  const checkInvitation = (protocol: InvitationProtocol, invitation: Partial<Invitation>) => {
504
504
  const expiresOn = getExpirationTime(invitation);
505
505
  if (expiresOn && expiresOn.getTime() < Date.now()) {
506
- return new InvalidInvitationError('Invitation already expired.');
506
+ return new InvalidInvitationError({ message: 'Invitation already expired.' });
507
507
  }
508
508
  return protocol.checkInvitation(invitation);
509
509
  };
@@ -4,14 +4,14 @@
4
4
 
5
5
  import { Event, PushStream, TimeoutError, Trigger } from '@dxos/async';
6
6
  import {
7
- AuthenticatingInvitation,
8
7
  AUTHENTICATION_CODE_LENGTH,
8
+ AuthenticatingInvitation,
9
9
  CancellableInvitation,
10
10
  INVITATION_TIMEOUT,
11
11
  } from '@dxos/client-protocol';
12
12
  import { Context } from '@dxos/context';
13
13
  import { generatePasscode } from '@dxos/credentials';
14
- import { hasInvitationExpired, type MetadataStore } from '@dxos/echo-pipeline';
14
+ import { type MetadataStore, hasInvitationExpired } from '@dxos/echo-pipeline';
15
15
  import { invariant } from '@dxos/invariant';
16
16
  import { PublicKey } from '@dxos/keys';
17
17
  import { log } from '@dxos/log';
@@ -23,7 +23,7 @@ import {
23
23
  import { SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';
24
24
 
25
25
  import type { InvitationProtocol } from './invitation-protocol';
26
- import { createAdmissionKeypair, type InvitationsHandler } from './invitations-handler';
26
+ import { type InvitationsHandler, createAdmissionKeypair } from './invitations-handler';
27
27
 
28
28
  /**
29
29
  * Entry point for creating and accepting invitations, keeps track of existing invitation set and
@@ -4,8 +4,8 @@
4
4
 
5
5
  import { Stream } from '@dxos/codec-protobuf/stream';
6
6
  import {
7
- type AuthenticationRequest,
8
7
  type AcceptInvitationRequest,
8
+ type AuthenticationRequest,
9
9
  type Invitation,
10
10
  type InvitationsService,
11
11
  QueryInvitationsResponse,
@@ -2,9 +2,9 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { onTestFinished, describe, expect, test } from 'vitest';
5
+ import { describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
- import { asyncChain, Trigger } from '@dxos/async';
7
+ import { Trigger, chain } from '@dxos/async';
8
8
  import { raise } from '@dxos/debug';
9
9
  import { AlreadyJoinedError } from '@dxos/protocols';
10
10
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
@@ -22,7 +22,7 @@ const closeAfterTest = async (peer: ServiceContext) => {
22
22
 
23
23
  describe('services/space-invitations-protocol', () => {
24
24
  test('genesis', async () => {
25
- const [peer] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(1));
25
+ const [peer] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(1));
26
26
 
27
27
  const space = await peer.dataSpaceManager!.createSpace();
28
28
  expect(peer.dataSpaceManager!.spaces.has(space.key)).to.be.true;
@@ -31,7 +31,7 @@ describe('services/space-invitations-protocol', () => {
31
31
  });
32
32
 
33
33
  test('genesis & ready', async () => {
34
- const [peer] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(1));
34
+ const [peer] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(1));
35
35
 
36
36
  const space = await peer.dataSpaceManager!.createSpace();
37
37
  expect(peer.dataSpaceManager!.spaces.has(space.key)).to.be.true;
@@ -41,7 +41,7 @@ describe('services/space-invitations-protocol', () => {
41
41
  });
42
42
 
43
43
  test('invitation with no auth', async () => {
44
- const [host, guest] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
44
+ const [host, guest] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
45
45
 
46
46
  const space1 = await host.dataSpaceManager!.createSpace();
47
47
  const spaceKey = space1.key;
@@ -65,7 +65,7 @@ describe('services/space-invitations-protocol', () => {
65
65
  });
66
66
 
67
67
  test('invitation when already joined', async () => {
68
- const [host, guest] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
68
+ const [host, guest] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
69
69
 
70
70
  const space1 = await host.dataSpaceManager!.createSpace();
71
71
  const spaceKey = space1.key;
@@ -92,7 +92,7 @@ describe('services/space-invitations-protocol', () => {
92
92
  });
93
93
 
94
94
  test('creates and accepts invitation with retry', async () => {
95
- const [host, guest] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
95
+ const [host, guest] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
96
96
 
97
97
  let attempt = 0;
98
98
 
@@ -153,7 +153,7 @@ describe('services/space-invitations-protocol', () => {
153
153
  });
154
154
 
155
155
  test('timeout', async () => {
156
- const [host, guest] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
156
+ const [host, guest] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
157
157
  const space = await host.dataSpaceManager!.createSpace();
158
158
  const hostInvitation = await createInvitation(host, {
159
159
  kind: Invitation.Kind.SPACE,
@@ -175,7 +175,7 @@ describe('services/space-invitations-protocol', () => {
175
175
  });
176
176
 
177
177
  test('cancels invitation', async () => {
178
- const [host, guest] = await asyncChain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
178
+ const [host, guest] = await chain<ServiceContext>([createIdentity, closeAfterTest])(createPeers(2));
179
179
 
180
180
  const hostConnected = new Trigger<Invitation>();
181
181
  const guestConnected = new Trigger<Invitation>();
@@ -12,24 +12,19 @@ import { invariant } from '@dxos/invariant';
12
12
  import { type Keyring } from '@dxos/keyring';
13
13
  import { type PublicKey } from '@dxos/keys';
14
14
  import { log } from '@dxos/log';
15
- import {
16
- AlreadyJoinedError,
17
- type ApiError,
18
- AuthorizationError,
19
- InvalidInvitationError,
20
- SpaceNotFoundError,
21
- } from '@dxos/protocols';
15
+ import { AlreadyJoinedError, AuthorizationError, InvalidInvitationError, SpaceNotFoundError } from '@dxos/protocols';
22
16
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
23
- import { SpaceMember, type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
17
+ import { type ProfileDocument, SpaceMember } from '@dxos/protocols/proto/dxos/halo/credentials';
24
18
  import {
25
19
  type AdmissionRequest,
26
20
  type AdmissionResponse,
27
21
  type IntroductionRequest,
28
22
  } from '@dxos/protocols/proto/dxos/halo/invitations';
29
23
 
24
+ import { type DataSpaceManager, type SigningContext } from '../spaces';
25
+
30
26
  import { type InvitationProtocol } from './invitation-protocol';
31
27
  import { computeExpirationTime } from './utils';
32
- import { type DataSpaceManager, type SigningContext } from '../spaces';
33
28
 
34
29
  export class SpaceInvitationProtocol implements InvitationProtocol {
35
30
  constructor(
@@ -47,16 +42,16 @@ export class SpaceInvitationProtocol implements InvitationProtocol {
47
42
  };
48
43
  }
49
44
 
50
- checkCanInviteNewMembers(): ApiError | undefined {
45
+ checkCanInviteNewMembers(): Error | undefined {
51
46
  if (this._spaceKey == null) {
52
- return new InvalidInvitationError('No spaceKey was provided for a space invitation.');
47
+ return new InvalidInvitationError({ message: 'No spaceKey was provided for a space invitation.' });
53
48
  }
54
49
  const space = this._spaceManager.spaces.get(this._spaceKey);
55
50
  if (space == null) {
56
51
  return new SpaceNotFoundError(this._spaceKey);
57
52
  }
58
53
  if (!space?.inner.spaceState.hasMembershipManagementPermission(this._signingContext.identityKey)) {
59
- return new AuthorizationError('No member management permission.');
54
+ return new AuthorizationError({ message: 'No member management permission.' });
60
55
  }
61
56
  return undefined;
62
57
  }
@@ -147,10 +142,10 @@ export class SpaceInvitationProtocol implements InvitationProtocol {
147
142
 
148
143
  checkInvitation(invitation: Partial<Invitation>): InvalidInvitationError | AlreadyJoinedError | undefined {
149
144
  if (invitation.spaceKey == null) {
150
- return new InvalidInvitationError('No spaceKey was provided for a space invitation.');
145
+ return new InvalidInvitationError({ message: 'No spaceKey was provided for a space invitation.' });
151
146
  }
152
147
  if (this._spaceManager.spaces.has(invitation.spaceKey)) {
153
- return new AlreadyJoinedError('Already joined space.');
148
+ return new AlreadyJoinedError({ message: 'Already joined space.' });
154
149
  }
155
150
  }
156
151
 
@@ -183,7 +178,7 @@ export class SpaceInvitationProtocol implements InvitationProtocol {
183
178
  invariant(credential.subject.id.equals(this._signingContext.identityKey));
184
179
 
185
180
  if (this._spaceManager.spaces.has(assertion.spaceKey)) {
186
- throw new AlreadyJoinedError('Already joined space.');
181
+ throw new AlreadyJoinedError({ message: 'Already joined space.' });
187
182
  }
188
183
 
189
184
  // Create local space.
@@ -3,7 +3,7 @@
3
3
  //
4
4
 
5
5
  import { type Mutex, type MutexGuard } from '@dxos/async';
6
- import { cancelWithContext, type Context, ContextDisposedError } from '@dxos/context';
6
+ import { type Context, ContextDisposedError, cancelWithContext } from '@dxos/context';
7
7
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
8
8
 
9
9
  export const stateToString = (state: Invitation.State): string => {
@@ -2,7 +2,7 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { asyncTimeout, Trigger } from '@dxos/async';
5
+ import { Trigger, asyncTimeout } from '@dxos/async';
6
6
  import { RESOURCE_LOCK_TIMEOUT } from '@dxos/client-protocol';
7
7
  import { log, logInfo } from '@dxos/log';
8
8
 
@@ -2,5 +2,5 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- export * from './resource-lock';
6
- export * from './node';
5
+ export type * from './resource-lock';
6
+ export * from '#locks-platform';
@@ -13,12 +13,12 @@ import {
13
13
  log,
14
14
  } from '@dxos/log';
15
15
  import {
16
+ type ControlMetricsRequest,
17
+ type ControlMetricsResponse,
16
18
  type LogEntry,
17
19
  type LoggingService,
18
20
  type Metrics,
19
21
  QueryLogsRequest,
20
- type ControlMetricsRequest,
21
- type ControlMetricsResponse,
22
22
  type QueryMetricsRequest,
23
23
  type QueryMetricsResponse,
24
24
  } from '@dxos/protocols/proto/dxos/client/services';
@@ -37,7 +37,7 @@ export class LoggingServiceImpl implements LoggingService {
37
37
  }
38
38
 
39
39
  async close(): Promise<void> {
40
- const index = log.runtimeConfig.processors.findIndex((processor) => processor === this._logProcessor);
40
+ const index = log.runtimeConfig.processors.findIndex((processor: LogProcessor) => processor === this._logProcessor);
41
41
  log.runtimeConfig.processors.splice(index, 1);
42
42
  }
43
43
 
@@ -112,6 +112,7 @@ export class LoggingServiceImpl implements LoggingService {
112
112
 
113
113
  const record: LogEntry = {
114
114
  ...entry,
115
+ message: entry.message ?? (entry.error ? (entry.error.message ?? String(entry.error)) : ''),
115
116
  context: jsonify(getContextFromEntry(entry)),
116
117
  timestamp: new Date(),
117
118
  meta: {
@@ -5,7 +5,7 @@
5
5
  import { afterEach, beforeEach, describe, expect, test } from 'vitest';
6
6
 
7
7
  import { Trigger } from '@dxos/async';
8
- import { log, LogLevel } from '@dxos/log';
8
+ import { LogLevel, log } from '@dxos/log';
9
9
  import { type LogEntry } from '@dxos/protocols/proto/dxos/client/services';
10
10
 
11
11
  import { LoggingServiceImpl } from './logging-service';
@@ -2,16 +2,17 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { afterEach, onTestFinished, beforeEach, describe, expect, test } from 'vitest';
5
+ import { afterEach, beforeEach, describe, expect, onTestFinished, test } from 'vitest';
6
6
 
7
7
  import { Trigger } from '@dxos/async';
8
8
  import { Context } from '@dxos/context';
9
- import { type NetworkService, ConnectionState } from '@dxos/protocols/proto/dxos/client/services';
9
+ import { ConnectionState, type NetworkService } from '@dxos/protocols/proto/dxos/client/services';
10
10
 
11
- import { NetworkServiceImpl } from './network-service';
12
11
  import { type ServiceContext } from '../services';
13
12
  import { createServiceContext } from '../testing';
14
13
 
14
+ import { NetworkServiceImpl } from './network-service';
15
+
15
16
  describe('NetworkService', () => {
16
17
  let serviceContext: ServiceContext;
17
18
  let networkService: NetworkService;
@@ -7,15 +7,15 @@ import { type EdgeConnection } from '@dxos/edge-client';
7
7
  import { type SignalManager } from '@dxos/messaging';
8
8
  import { type SwarmNetworkManager } from '@dxos/network-manager';
9
9
  import {
10
- type SubscribeSwarmStateRequest,
11
10
  type NetworkService,
12
11
  type NetworkStatus,
12
+ type SubscribeSwarmStateRequest,
13
13
  type UpdateConfigRequest,
14
14
  } from '@dxos/protocols/proto/dxos/client/services';
15
15
  import { type Peer, type SwarmResponse } from '@dxos/protocols/proto/dxos/edge/messenger';
16
16
  import {
17
- type LeaveRequest,
18
17
  type JoinRequest,
18
+ type LeaveRequest,
19
19
  type Message,
20
20
  type QueryRequest,
21
21
  } from '@dxos/protocols/proto/dxos/edge/signal';
@@ -5,13 +5,13 @@
5
5
  import { type ClientServices } from '@dxos/client-protocol';
6
6
  import { type Any, type ServiceHandler, Stream } from '@dxos/codec-protobuf';
7
7
  import { raise } from '@dxos/debug';
8
- import { parseMethodName, RpcPeer, type RpcPeerOptions, type ServiceBundle } from '@dxos/rpc';
8
+ import { RpcPeer, type RpcPeerOptions, type ServiceBundle, parseMethodName } from '@dxos/rpc';
9
9
  import { MapCounter, trace } from '@dxos/tracing';
10
10
  import { type MaybePromise } from '@dxos/util';
11
11
 
12
12
  import { type ServiceRegistry } from './service-registry';
13
13
 
14
- export type ClientRpcServerParams = {
14
+ export type ClientRpcServerProps = {
15
15
  serviceRegistry: ServiceRegistry<ClientServices>;
16
16
  handleCall?: (
17
17
  method: string,
@@ -30,8 +30,8 @@ export class ClientRpcServer {
30
30
  private readonly _serviceRegistry: ServiceRegistry<ClientServices>;
31
31
  private readonly _rpcPeer: RpcPeer;
32
32
  private readonly _handlerCache = new Map<string, ServiceHandler<any>>();
33
- private readonly _handleCall: ClientRpcServerParams['handleCall'];
34
- private readonly _handleStream: ClientRpcServerParams['handleStream'];
33
+ private readonly _handleCall: ClientRpcServerProps['handleCall'];
34
+ private readonly _handleStream: ClientRpcServerProps['handleStream'];
35
35
 
36
36
  @trace.metricsCounter()
37
37
  private readonly _callMetrics = new MapCounter();
@@ -41,7 +41,7 @@ export class ClientRpcServer {
41
41
  return Object.keys(this._serviceRegistry.services);
42
42
  }
43
43
 
44
- constructor(params: ClientRpcServerParams) {
44
+ constructor(params: ClientRpcServerProps) {
45
45
  const { serviceRegistry, handleCall, handleStream, ...rpcOptions } = params;
46
46
  this._handleCall = handleCall;
47
47
  this._handleStream = handleStream;
@@ -4,7 +4,7 @@
4
4
 
5
5
  import { describe, test } from 'vitest';
6
6
 
7
- import { MemorySignalManagerContext, MemorySignalManager } from '@dxos/messaging';
7
+ import { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';
8
8
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
9
9
  import { openAndClose } from '@dxos/test-utils';
10
10
 
@@ -2,9 +2,11 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
+ import type * as SqlClient from '@effect/sql/SqlClient';
6
+
5
7
  import { Mutex, Trigger } from '@dxos/async';
6
8
  import { Context, Resource } from '@dxos/context';
7
- import { getCredentialAssertion, type CredentialProcessor } from '@dxos/credentials';
9
+ import { type CredentialProcessor, getCredentialAssertion } from '@dxos/credentials';
8
10
  import { failUndefined, warnAfterTimeout } from '@dxos/debug';
9
11
  import {
10
12
  EchoEdgeReplicator,
@@ -15,7 +17,8 @@ import {
15
17
  valueEncoding,
16
18
  } from '@dxos/echo-pipeline';
17
19
  import { createChainEdgeIdentity, createEphemeralEdgeIdentity } from '@dxos/edge-client';
18
- import type { EdgeHttpClient, EdgeConnection, EdgeIdentity } from '@dxos/edge-client';
20
+ import type { EdgeConnection, EdgeHttpClient, EdgeIdentity } from '@dxos/edge-client';
21
+ import { type RuntimeProvider } from '@dxos/effect';
19
22
  import { FeedFactory, FeedStore } from '@dxos/feed-store';
20
23
  import { invariant } from '@dxos/invariant';
21
24
  import { Keyring } from '@dxos/keyring';
@@ -30,36 +33,39 @@ import { type Runtime } from '@dxos/protocols/proto/dxos/config';
30
33
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
31
34
  import { type Credential, type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
32
35
  import { type Storage } from '@dxos/random-access-storage';
36
+ import type * as SqlTransaction from '@dxos/sql-sqlite/SqlTransaction';
33
37
  import { BlobStore } from '@dxos/teleport-extension-object-sync';
34
38
  import { trace as Trace } from '@dxos/tracing';
35
39
  import { safeInstanceof } from '@dxos/util';
36
40
 
37
41
  import { EdgeAgentManager } from '../agents';
38
42
  import {
39
- IdentityManager,
40
43
  type CreateIdentityOptions,
41
- type IdentityManagerParams,
42
- type JoinIdentityParams,
44
+ IdentityManager,
45
+ type IdentityManagerProps,
46
+ type JoinIdentityProps,
43
47
  } from '../identity';
44
48
  import { EdgeIdentityRecoveryManager } from '../identity/identity-recovery-manager';
45
49
  import {
46
50
  DeviceInvitationProtocol,
47
- type InvitationConnectionParams,
51
+ type InvitationConnectionProps,
52
+ type InvitationProtocol,
48
53
  InvitationsHandler,
49
54
  InvitationsManager,
50
55
  SpaceInvitationProtocol,
51
- type InvitationProtocol,
52
56
  } from '../invitations';
53
- import { DataSpaceManager, type DataSpaceManagerRuntimeParams, type SigningContext } from '../spaces';
57
+ import { DataSpaceManager, type DataSpaceManagerRuntimeProps, type SigningContext } from '../spaces';
54
58
 
55
- export type ServiceContextRuntimeParams = Pick<
56
- IdentityManagerParams,
59
+ export type ServiceContextRuntimeProps = Pick<
60
+ IdentityManagerProps,
57
61
  'devicePresenceOfflineTimeout' | 'devicePresenceAnnounceInterval'
58
62
  > &
59
- DataSpaceManagerRuntimeParams & {
60
- invitationConnectionDefaultParams?: InvitationConnectionParams;
63
+ DataSpaceManagerRuntimeProps & {
64
+ invitationConnectionDefaultProps?: InvitationConnectionProps;
61
65
  disableP2pReplication?: boolean;
62
66
  enableVectorIndexing?: boolean;
67
+ enableSqlite?: boolean;
68
+ enableLocalQueues?: boolean;
63
69
  };
64
70
  /**
65
71
  * Shared backend for all client services.
@@ -105,11 +111,15 @@ export class ServiceContext extends Resource {
105
111
  public readonly signalManager: SignalManager,
106
112
  private readonly _edgeConnection: EdgeConnection | undefined,
107
113
  private readonly _edgeHttpClient: EdgeHttpClient | undefined,
108
- public readonly _runtimeParams?: ServiceContextRuntimeParams,
114
+ private readonly _runtime: RuntimeProvider.RuntimeProvider<SqlClient.SqlClient | SqlTransaction.SqlTransaction>,
115
+ public readonly _runtimeProps?: ServiceContextRuntimeProps,
109
116
  private readonly _edgeFeatures?: Runtime.Client.EdgeFeatures,
110
117
  ) {
111
118
  super();
112
119
 
120
+ log('runtimeProps', this._runtimeProps);
121
+ log('edgeFeatures', this._edgeFeatures);
122
+
113
123
  // TODO(burdon): Move strings to constants.
114
124
  this.metadataStore = new MetadataStore(storage.createDirectory('metadata'));
115
125
  this.blobStore = new BlobStore(storage.createDirectory('blobs'));
@@ -131,7 +141,7 @@ export class ServiceContext extends Resource {
131
141
  networkManager: this.networkManager,
132
142
  blobStore: this.blobStore,
133
143
  metadataStore: this.metadataStore,
134
- disableP2pReplication: this._runtimeParams?.disableP2pReplication,
144
+ disableP2pReplication: this._runtimeProps?.disableP2pReplication,
135
145
  });
136
146
 
137
147
  this.identityManager = new IdentityManager({
@@ -139,8 +149,8 @@ export class ServiceContext extends Resource {
139
149
  keyring: this.keyring,
140
150
  feedStore: this.feedStore,
141
151
  spaceManager: this.spaceManager,
142
- devicePresenceOfflineTimeout: this._runtimeParams?.devicePresenceOfflineTimeout,
143
- devicePresenceAnnounceInterval: this._runtimeParams?.devicePresenceAnnounceInterval,
152
+ devicePresenceOfflineTimeout: this._runtimeProps?.devicePresenceOfflineTimeout,
153
+ devicePresenceAnnounceInterval: this._runtimeProps?.devicePresenceAnnounceInterval,
144
154
  edgeConnection: this._edgeConnection,
145
155
  edgeFeatures: this._edgeFeatures,
146
156
  });
@@ -157,16 +167,17 @@ export class ServiceContext extends Resource {
157
167
  peerIdProvider: () => this.identityManager.identity?.deviceKey?.toHex(),
158
168
  getSpaceKeyByRootDocumentId: (documentId) => this.spaceManager.findSpaceByRootDocumentId(documentId)?.key,
159
169
  indexing: {
160
- vector: this._runtimeParams?.enableVectorIndexing,
170
+ vector: this._runtimeProps?.enableVectorIndexing,
171
+ sqlIndex: this._runtimeProps?.enableSqlite,
161
172
  },
173
+ runtime: this._runtime,
174
+ localQueues: this._runtimeProps?.enableLocalQueues,
162
175
  });
163
176
 
164
- this._meshReplicator = new MeshEchoReplicator();
165
-
166
177
  this.invitations = new InvitationsHandler(
167
178
  this.networkManager, //
168
179
  this._edgeHttpClient,
169
- _runtimeParams?.invitationConnectionDefaultParams,
180
+ _runtimeProps?.invitationConnectionDefaultProps,
170
181
  );
171
182
  this.invitationsManager = new InvitationsManager(
172
183
  this.invitations,
@@ -186,12 +197,13 @@ export class ServiceContext extends Resource {
186
197
  ),
187
198
  );
188
199
 
189
- if (!this._runtimeParams?.disableP2pReplication) {
200
+ if (!this._runtimeProps?.disableP2pReplication) {
190
201
  this._meshReplicator = new MeshEchoReplicator();
191
202
  }
192
- if (this._edgeConnection && this._edgeFeatures?.echoReplicator) {
203
+ if (this._edgeConnection && this._edgeFeatures?.echoReplicator && this._edgeHttpClient) {
193
204
  this._echoEdgeReplicator = new EchoEdgeReplicator({
194
205
  edgeConnection: this._edgeConnection,
206
+ edgeHttpClient: this._edgeHttpClient,
195
207
  });
196
208
  }
197
209
  }
@@ -244,13 +256,13 @@ export class ServiceContext extends Resource {
244
256
  await this.edgeAgentManager?.close();
245
257
  await this.identityManager.close();
246
258
  await this.spaceManager.close();
247
- await this.feedStore.close();
248
- await this.metadataStore.close();
249
-
250
259
  await this.echoHost.close(ctx);
260
+
251
261
  await this.networkManager.close();
252
262
  await this.signalManager.close();
253
263
  await this._edgeConnection?.close();
264
+ await this.feedStore.close();
265
+ await this.metadataStore.close();
254
266
 
255
267
  log('closed');
256
268
  }
@@ -282,7 +294,7 @@ export class ServiceContext extends Resource {
282
294
  }
283
295
  }
284
296
 
285
- private async _acceptIdentity(params: JoinIdentityParams) {
297
+ private async _acceptIdentity(params: JoinIdentityProps) {
286
298
  const { identity, identityRecord } = await this.identityManager.prepareIdentity(params);
287
299
  await this._setNetworkIdentity({ deviceCredential: params.authorizedDeviceCredential! });
288
300
  await identity.joinNetwork();
@@ -326,7 +338,7 @@ export class ServiceContext extends Resource {
326
338
  edgeHttpClient: this._edgeHttpClient,
327
339
  echoEdgeReplicator: this._echoEdgeReplicator,
328
340
  meshReplicator: this._meshReplicator,
329
- runtimeParams: this._runtimeParams as DataSpaceManagerRuntimeParams,
341
+ runtimeProps: this._runtimeProps as DataSpaceManagerRuntimeProps,
330
342
  edgeFeatures: this._edgeFeatures,
331
343
  });
332
344
  await this.dataSpaceManager.open();
@@ -3,9 +3,10 @@
3
3
  //
4
4
 
5
5
  import { rmSync } from 'node:fs';
6
- import { afterEach, onTestFinished, describe, expect, test } from 'vitest';
7
6
 
8
- import { asyncTimeout, latch, Trigger } from '@dxos/async';
7
+ import { afterEach, describe, expect, onTestFinished, test } from 'vitest';
8
+
9
+ import { Trigger, asyncTimeout, latch } from '@dxos/async';
9
10
  import { Config } from '@dxos/config';
10
11
  import { Context } from '@dxos/context';
11
12
  import { verifyPresentation } from '@dxos/credentials';