@dxos/client-services 0.1.21 → 0.1.23

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 (29) hide show
  1. package/dist/lib/browser/index.mjs +79 -38
  2. package/dist/lib/browser/index.mjs.map +3 -3
  3. package/dist/lib/browser/meta.json +1 -1
  4. package/dist/lib/node/index.cjs +82 -41
  5. package/dist/lib/node/index.cjs.map +3 -3
  6. package/dist/lib/node/meta.json +1 -1
  7. package/dist/types/src/packlets/identity/authenticator.d.ts +8 -8
  8. package/dist/types/src/packlets/identity/authenticator.d.ts.map +1 -1
  9. package/dist/types/src/packlets/identity/identity-manager.d.ts.map +1 -1
  10. package/dist/types/src/packlets/identity/identity.d.ts +2 -2
  11. package/dist/types/src/packlets/identity/identity.d.ts.map +1 -1
  12. package/dist/types/src/packlets/services/service-context.d.ts.map +1 -1
  13. package/dist/types/src/packlets/spaces/data-space-manager.d.ts.map +1 -1
  14. package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts +2 -0
  15. package/dist/types/src/packlets/spaces/data-space-manager.test.d.ts.map +1 -0
  16. package/dist/types/src/packlets/spaces/data-space.d.ts +2 -0
  17. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  18. package/dist/types/src/packlets/testing/test-builder.d.ts +30 -1
  19. package/dist/types/src/packlets/testing/test-builder.d.ts.map +1 -1
  20. package/package.json +28 -28
  21. package/src/packlets/identity/authenticator.test.ts +4 -4
  22. package/src/packlets/identity/authenticator.ts +18 -13
  23. package/src/packlets/identity/identity-manager.ts +2 -4
  24. package/src/packlets/identity/identity.ts +4 -4
  25. package/src/packlets/services/service-context.ts +0 -4
  26. package/src/packlets/spaces/data-space-manager.test.ts +74 -0
  27. package/src/packlets/spaces/data-space-manager.ts +8 -3
  28. package/src/packlets/spaces/data-space.ts +12 -0
  29. package/src/packlets/testing/test-builder.ts +87 -1
@@ -39,7 +39,6 @@ __export(src_exports, {
39
39
  ClientServicesProxy: () => ClientServicesProxy,
40
40
  DevtoolsHostEvents: () => DevtoolsHostEvents,
41
41
  DevtoolsServiceImpl: () => DevtoolsServiceImpl,
42
- HaloAuthVerifier: () => HaloAuthVerifier,
43
42
  HaloInvitationsHandler: () => HaloInvitationsHandler,
44
43
  HaloInvitationsProxy: () => HaloInvitationsProxy,
45
44
  HaloInvitationsServiceImpl: () => HaloInvitationsServiceImpl,
@@ -59,11 +58,12 @@ __export(src_exports, {
59
58
  SpaceServiceImpl: () => SpaceServiceImpl,
60
59
  SystemServiceImpl: () => SystemServiceImpl,
61
60
  TracingServiceImpl: () => TracingServiceImpl,
61
+ TrustedKeySetAuthVerifier: () => TrustedKeySetAuthVerifier,
62
62
  WorkerRuntime: () => WorkerRuntime,
63
63
  WorkerSession: () => WorkerSession,
64
64
  clientServiceBundle: () => clientServiceBundle,
65
+ createAuthProvider: () => createAuthProvider,
65
66
  createDefaultModelFactory: () => createDefaultModelFactory,
66
- createHaloAuthProvider: () => createHaloAuthProvider,
67
67
  createStorageObjects: () => createStorageObjects,
68
68
  getNetworkPeers: () => getNetworkPeers,
69
69
  subscribeToFeedBlocks: () => subscribeToFeedBlocks,
@@ -563,7 +563,7 @@ var import_context = require("@dxos/context");
563
563
  var import_credentials = require("@dxos/credentials");
564
564
  var import_log2 = require("@dxos/log");
565
565
  var import_protocols = require("@dxos/protocols");
566
- var createHaloAuthProvider = (signer) => async (nonce) => {
566
+ var createAuthProvider = (signer) => async (nonce) => {
567
567
  const credential = await signer.createCredential({
568
568
  assertion: {
569
569
  "@type": "dxos.halo.credentials.Auth"
@@ -573,7 +573,7 @@ var createHaloAuthProvider = (signer) => async (nonce) => {
573
573
  });
574
574
  return import_protocols.schema.getCodecForType("dxos.halo.credentials.Credential").encode(credential);
575
575
  };
576
- var HaloAuthVerifier = class {
576
+ var TrustedKeySetAuthVerifier = class {
577
577
  constructor(_params) {
578
578
  this._params = _params;
579
579
  this._ctx = new import_context.Context();
@@ -581,20 +581,28 @@ var HaloAuthVerifier = class {
581
581
  async close() {
582
582
  await this._ctx.dispose();
583
583
  }
584
- _isTrustedDevice(deviceKey) {
585
- const deviceSet = this._params.trustedDevicesProvider();
584
+ _isTrustedKey(deviceKey) {
585
+ const deviceSet = this._params.trustedKeysProvider();
586
586
  return deviceSet.has(deviceKey);
587
587
  }
588
588
  get verifier() {
589
589
  return async (nonce, auth) => {
590
590
  const credential = import_protocols.schema.getCodecForType("dxos.halo.credentials.Credential").decode(auth);
591
+ (0, import_log2.log)("authenticating...", {
592
+ credential
593
+ }, {
594
+ file: "authenticator.ts",
595
+ line: 59,
596
+ scope: this,
597
+ callSite: (f, a) => f(...a)
598
+ });
591
599
  const result = await (0, import_credentials.verifyCredential)(credential);
592
600
  if (result.kind === "fail") {
593
601
  (0, import_log2.log)("Invalid credential", {
594
602
  result
595
603
  }, {
596
604
  file: "authenticator.ts",
597
- line: 61,
605
+ line: 63,
598
606
  scope: this,
599
607
  callSite: (f, a) => f(...a)
600
608
  });
@@ -606,13 +614,21 @@ var HaloAuthVerifier = class {
606
614
  credential
607
615
  }, {
608
616
  file: "authenticator.ts",
609
- line: 66,
617
+ line: 68,
610
618
  scope: this,
611
619
  callSite: (f, a) => f(...a)
612
620
  });
613
621
  return false;
614
622
  }
615
- if (this._isTrustedDevice(credential.issuer)) {
623
+ if (this._isTrustedKey(credential.issuer)) {
624
+ (0, import_log2.log)("key is not currently in trusted set, waiting...", {
625
+ key: credential.issuer
626
+ }, {
627
+ file: "authenticator.ts",
628
+ line: 73,
629
+ scope: this,
630
+ callSite: (f, a) => f(...a)
631
+ });
616
632
  return true;
617
633
  }
618
634
  const trigger = new import_async4.Trigger();
@@ -620,15 +636,31 @@ var HaloAuthVerifier = class {
620
636
  trigger.wake(false);
621
637
  });
622
638
  const clear = this._params.update.on(this._ctx, () => {
623
- if (this._isTrustedDevice(credential.issuer)) {
639
+ if (this._isTrustedKey(credential.issuer)) {
640
+ (0, import_log2.log)("auth success", {
641
+ key: credential.issuer
642
+ }, {
643
+ file: "authenticator.ts",
644
+ line: 83,
645
+ scope: this,
646
+ callSite: (f, a) => f(...a)
647
+ });
624
648
  trigger.wake(true);
649
+ } else {
650
+ (0, import_log2.log)("key is not currently in trusted set, waiting...", {
651
+ key: credential.issuer
652
+ }, {
653
+ file: "authenticator.ts",
654
+ line: 86,
655
+ scope: this,
656
+ callSite: (f, a) => f(...a)
657
+ });
625
658
  }
626
659
  });
627
660
  try {
628
- await trigger.wait({
661
+ return await trigger.wait({
629
662
  timeout: this._params.authTimeout
630
663
  });
631
- return true;
632
664
  } catch (e) {
633
665
  return false;
634
666
  } finally {
@@ -662,8 +694,8 @@ var Identity = class {
662
694
  identityKey: this.identityKey,
663
695
  onUpdate: () => this.stateUpdate.emit()
664
696
  }));
665
- this.authVerifier = new HaloAuthVerifier({
666
- trustedDevicesProvider: () => this.authorizedDeviceKeys,
697
+ this.authVerifier = new TrustedKeySetAuthVerifier({
698
+ trustedKeysProvider: () => this.authorizedDeviceKeys,
667
699
  update: this.stateUpdate,
668
700
  authTimeout: AUTH_TIMEOUT
669
701
  });
@@ -914,7 +946,7 @@ var IdentityManager = class {
914
946
  spaceRecord: identityRecord.haloSpace,
915
947
  swarmIdentity: {
916
948
  peerKey: identityRecord.deviceKey,
917
- credentialProvider: createHaloAuthProvider((0, import_credentials4.createCredentialSignerWithKey)(this._keyring, identityRecord.deviceKey)),
949
+ credentialProvider: createAuthProvider((0, import_credentials4.createCredentialSignerWithKey)(this._keyring, identityRecord.deviceKey)),
918
950
  credentialAuthenticator: (0, import_util3.deferFunction)(() => identity.authVerifier.verifier)
919
951
  },
920
952
  identityKey: identityRecord.identityKey
@@ -929,7 +961,7 @@ var IdentityManager = class {
929
961
  identityKey: identityRecord.identityKey
930
962
  }, {
931
963
  file: "identity-manager.ts",
932
- line: 182,
964
+ line: 180,
933
965
  scope: this,
934
966
  callSite: (f, a) => f(...a)
935
967
  });
@@ -2168,19 +2200,22 @@ var import_keyring = require("@dxos/keyring");
2168
2200
  var import_log10 = require("@dxos/log");
2169
2201
 
2170
2202
  // packages/sdk/client-services/src/packlets/spaces/data-space-manager.ts
2203
+ var import_node_assert11 = __toESM(require("node:assert"));
2171
2204
  var import_async12 = require("@dxos/async");
2172
2205
  var import_context5 = require("@dxos/context");
2173
2206
  var import_echo_db2 = require("@dxos/echo-db");
2174
- var import_keys6 = require("@dxos/keys");
2207
+ var import_keys7 = require("@dxos/keys");
2175
2208
  var import_log9 = require("@dxos/log");
2176
2209
  var import_teleport_extension_presence = require("@dxos/teleport-extension-presence");
2177
- var import_util4 = require("@dxos/util");
2210
+ var import_util5 = require("@dxos/util");
2178
2211
 
2179
2212
  // packages/sdk/client-services/src/packlets/spaces/data-space.ts
2180
2213
  var import_node_assert10 = __toESM(require("node:assert"));
2181
2214
  var import_async11 = require("@dxos/async");
2182
2215
  var import_context4 = require("@dxos/context");
2183
2216
  var import_echo_db = require("@dxos/echo-db");
2217
+ var import_keys6 = require("@dxos/keys");
2218
+ var import_util4 = require("@dxos/util");
2184
2219
  var __decorate = function(decorators, target, key, desc) {
2185
2220
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2186
2221
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -2191,6 +2226,7 @@ var __decorate = function(decorators, target, key, desc) {
2191
2226
  r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
2192
2227
  return c > 3 && r && Object.defineProperty(target, key, r), r;
2193
2228
  };
2229
+ var AUTH_TIMEOUT2 = 3e4;
2194
2230
  var DataSpace = class DataSpace2 {
2195
2231
  constructor(params) {
2196
2232
  this._ctx = new import_context4.Context();
@@ -2205,6 +2241,11 @@ var DataSpace = class DataSpace2 {
2205
2241
  feedInfoProvider: (feedKey) => this._inner.spaceState.feeds.get(feedKey),
2206
2242
  snapshotId: params.snapshotId
2207
2243
  });
2244
+ this.authVerifier = new TrustedKeySetAuthVerifier({
2245
+ trustedKeysProvider: () => new import_util4.ComplexSet(import_keys6.PublicKey.hash, Array.from(this._inner.spaceState.members.keys())),
2246
+ update: this._inner.stateUpdate,
2247
+ authTimeout: AUTH_TIMEOUT2
2248
+ });
2208
2249
  }
2209
2250
  get key() {
2210
2251
  return this._inner.key;
@@ -2234,6 +2275,7 @@ var DataSpace = class DataSpace2 {
2234
2275
  }
2235
2276
  async close() {
2236
2277
  await this._ctx.dispose();
2278
+ await this.authVerifier.close();
2237
2279
  await this._inner.close();
2238
2280
  await this._presence.destroy();
2239
2281
  }
@@ -2264,7 +2306,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2264
2306
  this._snapshotStore = _snapshotStore;
2265
2307
  this._ctx = new import_context5.Context();
2266
2308
  this.updated = new import_async12.Event();
2267
- this._spaces = new import_util4.ComplexMap(import_keys6.PublicKey.hash);
2309
+ this._spaces = new import_util5.ComplexMap(import_keys7.PublicKey.hash);
2268
2310
  }
2269
2311
  // TODO(burdon): Remove.
2270
2312
  get spaces() {
@@ -2276,7 +2318,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2276
2318
  spaces: this._metadataStore.spaces.length
2277
2319
  }, {
2278
2320
  file: "data-space-manager.ts",
2279
- line: 54,
2321
+ line: 57,
2280
2322
  scope: this,
2281
2323
  callSite: (f, a) => f(...a)
2282
2324
  });
@@ -2285,7 +2327,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2285
2327
  spaceMetadata
2286
2328
  }, {
2287
2329
  file: "data-space-manager.ts",
2288
- line: 57,
2330
+ line: 60,
2289
2331
  scope: this,
2290
2332
  callSite: (f, a) => f(...a)
2291
2333
  });
@@ -2295,7 +2337,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2295
2337
  spaceMetadata
2296
2338
  }, {
2297
2339
  file: "data-space-manager.ts",
2298
- line: 60,
2340
+ line: 63,
2299
2341
  scope: this,
2300
2342
  callSite: (f, a) => f(...a)
2301
2343
  });
@@ -2326,7 +2368,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2326
2368
  spaceKey
2327
2369
  }, {
2328
2370
  file: "data-space-manager.ts",
2329
- line: 89,
2371
+ line: 92,
2330
2372
  scope: this,
2331
2373
  callSite: (f, a) => f(...a)
2332
2374
  });
@@ -2338,6 +2380,7 @@ var DataSpaceManager = class DataSpaceManager2 {
2338
2380
  }
2339
2381
  // TODO(burdon): Rename join space.
2340
2382
  async acceptSpace(opts) {
2383
+ (0, import_node_assert11.default)(!this._spaces.has(opts.spaceKey), "Space already exists.");
2341
2384
  const metadata = {
2342
2385
  key: opts.spaceKey,
2343
2386
  genesisFeedKey: opts.genesisFeedKey,
@@ -2361,8 +2404,8 @@ var DataSpaceManager = class DataSpaceManager2 {
2361
2404
  metadata,
2362
2405
  swarmIdentity: {
2363
2406
  peerKey: this._signingContext.deviceKey,
2364
- credentialProvider: this._signingContext.credentialProvider,
2365
- credentialAuthenticator: this._signingContext.credentialAuthenticator
2407
+ credentialProvider: createAuthProvider(this._signingContext.credentialSigner),
2408
+ credentialAuthenticator: (0, import_util5.deferFunction)(() => dataSpace.authVerifier.verifier)
2366
2409
  },
2367
2410
  onNetworkConnection: (session) => {
2368
2411
  session.addExtension("dxos.mesh.teleport.presence", presence.createExtension({
@@ -2433,7 +2476,7 @@ var ServiceContext = class {
2433
2476
  async open() {
2434
2477
  (0, import_log10.log)("opening...", {}, {
2435
2478
  file: "service-context.ts",
2436
- line: 85,
2479
+ line: 83,
2437
2480
  scope: this,
2438
2481
  callSite: (f, a) => f(...a)
2439
2482
  });
@@ -2445,7 +2488,7 @@ var ServiceContext = class {
2445
2488
  }
2446
2489
  (0, import_log10.log)("opened", {}, {
2447
2490
  file: "service-context.ts",
2448
- line: 92,
2491
+ line: 90,
2449
2492
  scope: this,
2450
2493
  callSite: (f, a) => f(...a)
2451
2494
  });
@@ -2454,7 +2497,7 @@ var ServiceContext = class {
2454
2497
  var _a;
2455
2498
  (0, import_log10.log)("closing...", {}, {
2456
2499
  file: "service-context.ts",
2457
- line: 96,
2500
+ line: 94,
2458
2501
  scope: this,
2459
2502
  callSite: (f, a) => f(...a)
2460
2503
  });
@@ -2466,7 +2509,7 @@ var ServiceContext = class {
2466
2509
  this.dataServiceSubscriptions.clear();
2467
2510
  (0, import_log10.log)("closed", {}, {
2468
2511
  file: "service-context.ts",
2469
- line: 103,
2512
+ line: 101,
2470
2513
  scope: this,
2471
2514
  callSite: (f, a) => f(...a)
2472
2515
  });
@@ -2474,7 +2517,7 @@ var ServiceContext = class {
2474
2517
  async reset() {
2475
2518
  (0, import_log10.log)("resetting...", {}, {
2476
2519
  file: "service-context.ts",
2477
- line: 107,
2520
+ line: 105,
2478
2521
  scope: this,
2479
2522
  callSite: (f, a) => f(...a)
2480
2523
  });
@@ -2482,7 +2525,7 @@ var ServiceContext = class {
2482
2525
  await this.storage.reset();
2483
2526
  (0, import_log10.log)("reset", {}, {
2484
2527
  file: "service-context.ts",
2485
- line: 110,
2528
+ line: 108,
2486
2529
  scope: this,
2487
2530
  callSite: (f, a) => f(...a)
2488
2531
  });
@@ -2497,14 +2540,12 @@ var ServiceContext = class {
2497
2540
  var _a;
2498
2541
  (0, import_log10.log)("initializing spaces...", {}, {
2499
2542
  file: "service-context.ts",
2500
- line: 122,
2543
+ line: 120,
2501
2544
  scope: this,
2502
2545
  callSite: (f, a) => f(...a)
2503
2546
  });
2504
2547
  const identity = (_a = this.identityManager.identity) != null ? _a : (0, import_debug4.failUndefined)();
2505
2548
  const signingContext = {
2506
- credentialProvider: import_echo_db3.MOCK_AUTH_PROVIDER,
2507
- credentialAuthenticator: import_echo_db3.MOCK_AUTH_VERIFIER,
2508
2549
  credentialSigner: identity.getIdentityCredentialSigner(),
2509
2550
  identityKey: identity.identityKey,
2510
2551
  deviceKey: identity.deviceKey,
@@ -2881,11 +2922,11 @@ var import_messaging = require("@dxos/messaging");
2881
2922
  var import_network_manager4 = require("@dxos/network-manager");
2882
2923
 
2883
2924
  // packages/sdk/client-services/src/packlets/vault/worker-session.ts
2884
- var import_node_assert11 = __toESM(require("node:assert"));
2925
+ var import_node_assert12 = __toESM(require("node:assert"));
2885
2926
  var import_async17 = require("@dxos/async");
2886
2927
  var import_log12 = require("@dxos/log");
2887
2928
  var import_rpc4 = require("@dxos/rpc");
2888
- var import_util5 = require("@dxos/util");
2929
+ var import_util6 = require("@dxos/util");
2889
2930
  var __decorate3 = function(decorators, target, key, desc) {
2890
2931
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
2891
2932
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
@@ -2901,9 +2942,9 @@ var WorkerSession = class {
2901
2942
  heartbeatInterval: 1e3
2902
2943
  } }) {
2903
2944
  this._startTrigger = new import_async17.Trigger();
2904
- this.onClose = new import_util5.Callback();
2905
- (0, import_node_assert11.default)(options);
2906
- (0, import_node_assert11.default)(getServices);
2945
+ this.onClose = new import_util6.Callback();
2946
+ (0, import_node_assert12.default)(options);
2947
+ (0, import_node_assert12.default)(getServices);
2907
2948
  this._options = options;
2908
2949
  this._getServices = getServices;
2909
2950
  this._clientRpc = (0, import_rpc4.createProtoRpcPeer)({
@@ -3110,7 +3151,6 @@ var WorkerRuntime = class {
3110
3151
  ClientServicesProxy,
3111
3152
  DevtoolsHostEvents,
3112
3153
  DevtoolsServiceImpl,
3113
- HaloAuthVerifier,
3114
3154
  HaloInvitationsHandler,
3115
3155
  HaloInvitationsProxy,
3116
3156
  HaloInvitationsServiceImpl,
@@ -3130,11 +3170,12 @@ var WorkerRuntime = class {
3130
3170
  SpaceServiceImpl,
3131
3171
  SystemServiceImpl,
3132
3172
  TracingServiceImpl,
3173
+ TrustedKeySetAuthVerifier,
3133
3174
  WorkerRuntime,
3134
3175
  WorkerSession,
3135
3176
  clientServiceBundle,
3177
+ createAuthProvider,
3136
3178
  createDefaultModelFactory,
3137
- createHaloAuthProvider,
3138
3179
  createStorageObjects,
3139
3180
  getNetworkPeers,
3140
3181
  subscribeToFeedBlocks,