@dxos/client-services 0.3.11-main.d56f337 → 0.3.11-main.d8b8a39

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 (32) hide show
  1. package/dist/lib/browser/{chunk-DUTSCN4V.mjs → chunk-BF2EZUZV.mjs} +69 -49
  2. package/dist/lib/browser/chunk-BF2EZUZV.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/packlets/testing/index.mjs +4 -11
  6. package/dist/lib/browser/packlets/testing/index.mjs.map +3 -3
  7. package/dist/lib/node/{chunk-IRXK4VWQ.cjs → chunk-H5EXDUBC.cjs} +129 -109
  8. package/dist/lib/node/chunk-H5EXDUBC.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +37 -37
  10. package/dist/lib/node/meta.json +1 -1
  11. package/dist/lib/node/packlets/testing/index.cjs +11 -18
  12. package/dist/lib/node/packlets/testing/index.cjs.map +3 -3
  13. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts +2 -0
  14. package/dist/types/src/packlets/invitations/device-invitation-protocol.d.ts.map +1 -1
  15. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts +28 -3
  16. package/dist/types/src/packlets/invitations/invitation-protocol.d.ts.map +1 -1
  17. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  18. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts +2 -0
  19. package/dist/types/src/packlets/invitations/space-invitation-protocol.d.ts.map +1 -1
  20. package/dist/types/src/packlets/testing/invitation-utils.d.ts.map +1 -1
  21. package/dist/types/src/version.d.ts +1 -1
  22. package/package.json +35 -35
  23. package/src/packlets/invitations/device-invitation-protocol.test.ts +14 -0
  24. package/src/packlets/invitations/device-invitation-protocol.ts +14 -0
  25. package/src/packlets/invitations/invitation-protocol.ts +44 -6
  26. package/src/packlets/invitations/invitations-handler.ts +19 -17
  27. package/src/packlets/invitations/space-invitation-protocol.test.ts +28 -0
  28. package/src/packlets/invitations/space-invitation-protocol.ts +11 -0
  29. package/src/packlets/testing/invitation-utils.ts +2 -10
  30. package/src/version.ts +1 -1
  31. package/dist/lib/browser/chunk-DUTSCN4V.mjs.map +0 -7
  32. package/dist/lib/node/chunk-IRXK4VWQ.cjs.map +0 -7
@@ -31,10 +31,11 @@ __export(testing_exports, {
31
31
  syncItemsLocal: () => syncItemsLocal
32
32
  });
33
33
  module.exports = __toCommonJS(testing_exports);
34
- var import_chunk_IRXK4VWQ = require("../../chunk-IRXK4VWQ.cjs");
34
+ var import_chunk_H5EXDUBC = require("../../chunk-H5EXDUBC.cjs");
35
35
  var import_credentials = require("@dxos/credentials");
36
36
  var import_keys = require("@dxos/keys");
37
37
  var import_async = require("@dxos/async");
38
+ var import_client_protocol = require("@dxos/client-protocol");
38
39
  var import_invariant = require("@dxos/invariant");
39
40
  var import_services = require("@dxos/protocols/proto/dxos/client/services");
40
41
  var import_context = require("@dxos/context");
@@ -62,15 +63,7 @@ var createMockCredential = async ({ signer, issuer }) => (0, import_credentials.
62
63
  });
63
64
  var __dxlog_file = "/home/runner/work/dxos/dxos/packages/sdk/client-services/src/packlets/testing/invitation-utils.ts";
64
65
  var sanitizeInvitation = (invitation) => {
65
- return {
66
- invitationId: invitation.invitationId,
67
- type: invitation.type,
68
- kind: invitation.kind,
69
- authMethod: invitation.authMethod,
70
- swarmKey: invitation.swarmKey,
71
- state: invitation.state,
72
- timeout: invitation.timeout
73
- };
66
+ return import_client_protocol.InvitationEncoder.decode(import_client_protocol.InvitationEncoder.encode(invitation));
74
67
  };
75
68
  var performInvitation = ({ host, guest, options, hooks }) => {
76
69
  const hostComplete = new import_async.Trigger();
@@ -92,7 +85,7 @@ var performInvitation = ({ host, guest, options, hooks }) => {
92
85
  }
93
86
  (0, import_invariant.invariant)(hostInvitation.swarmKey.equals(guestInvitation.swarmKey), void 0, {
94
87
  F: __dxlog_file,
95
- L: 84,
88
+ L: 76,
96
89
  S: void 0,
97
90
  A: [
98
91
  "hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!)",
@@ -216,7 +209,7 @@ var createInvitation = (host, options) => {
216
209
  authMethod: import_services.Invitation.AuthMethod.NONE,
217
210
  ...options ?? {}
218
211
  };
219
- if (host instanceof import_chunk_IRXK4VWQ.ServiceContext) {
212
+ if (host instanceof import_chunk_H5EXDUBC.ServiceContext) {
220
213
  const hostHandler = host.getInvitationHandler({
221
214
  kind: import_services.Invitation.Kind.SPACE,
222
215
  ...options
@@ -227,7 +220,7 @@ var createInvitation = (host, options) => {
227
220
  };
228
221
  var acceptInvitation = (guest, invitation) => {
229
222
  invitation = sanitizeInvitation(invitation);
230
- if (guest instanceof import_chunk_IRXK4VWQ.ServiceContext) {
223
+ if (guest instanceof import_chunk_H5EXDUBC.ServiceContext) {
231
224
  const guestHandler = guest.getInvitationHandler({
232
225
  kind: invitation.kind
233
226
  });
@@ -236,7 +229,7 @@ var acceptInvitation = (guest, invitation) => {
236
229
  return guest.join(invitation);
237
230
  };
238
231
  var createServiceHost = (config, signalManagerContext) => {
239
- return new import_chunk_IRXK4VWQ.ClientServicesHost({
232
+ return new import_chunk_H5EXDUBC.ClientServicesHost({
240
233
  config,
241
234
  signalManager: new import_messaging.MemorySignalManager(signalManagerContext),
242
235
  transportFactory: import_network_manager.MemoryTransportFactory
@@ -250,8 +243,8 @@ var createServiceContext = ({ signalContext = new import_messaging.MemorySignalM
250
243
  signalManager,
251
244
  transportFactory: import_network_manager.MemoryTransportFactory
252
245
  });
253
- const modelFactory = (0, import_chunk_IRXK4VWQ.createDefaultModelFactory)();
254
- return new import_chunk_IRXK4VWQ.ServiceContext(storage, networkManager, signalManager, modelFactory);
246
+ const modelFactory = (0, import_chunk_H5EXDUBC.createDefaultModelFactory)();
247
+ return new import_chunk_H5EXDUBC.ServiceContext(storage, networkManager, signalManager, modelFactory);
255
248
  };
256
249
  var createPeers = async (numPeers) => {
257
250
  const signalContext = new import_messaging.MemorySignalManagerContext();
@@ -335,7 +328,7 @@ var TestPeer = class {
335
328
  feedStore: this.feedStore,
336
329
  networkManager: this.networkManager,
337
330
  metadataStore: this.metadataStore,
338
- modelFactory: (0, import_chunk_IRXK4VWQ.createDefaultModelFactory)(),
331
+ modelFactory: (0, import_chunk_H5EXDUBC.createDefaultModelFactory)(),
339
332
  snapshotStore: this.snapshotStore,
340
333
  blobStore: this.blobStore
341
334
  });
@@ -347,7 +340,7 @@ var TestPeer = class {
347
340
  return this._props.automergeHost ??= new import_echo_pipeline.AutomergeHost(this.storage.createDirectory("automerge"));
348
341
  }
349
342
  get dataSpaceManager() {
350
- return this._props.dataSpaceManager ??= new import_chunk_IRXK4VWQ.DataSpaceManager(this.spaceManager, this.metadataStore, new import_echo_pipeline.DataServiceSubscriptions(), this.keyring, this.identity, this.feedStore, this.automergeHost);
343
+ return this._props.dataSpaceManager ??= new import_chunk_H5EXDUBC.DataSpaceManager(this.spaceManager, this.metadataStore, new import_echo_pipeline.DataServiceSubscriptions(), this.keyring, this.identity, this.feedStore, this.automergeHost);
351
344
  }
352
345
  async createIdentity() {
353
346
  this._props.signingContext ??= await createSigningContext(this.keyring);
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/packlets/testing/credential-utils.ts", "../../../../../src/packlets/testing/invitation-utils.ts", "../../../../../src/packlets/testing/test-builder.ts"],
4
- "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport const createMockCredential = async ({\n signer,\n issuer,\n}: {\n signer: Signer;\n issuer: PublicKey;\n}): Promise<Credential> =>\n createCredential({\n signer,\n issuer,\n subject: new PublicKey(Buffer.from('test')),\n assertion: {\n '@type': 'example.testing.rpc.MessageWithAny',\n payload: {\n '@type': 'google.protobuf.Any',\n value: Buffer.from('test'),\n },\n },\n });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { type AuthenticatingInvitation, type CancellableInvitation } from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { ServiceContext } from '../services';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return {\n invitationId: invitation.invitationId,\n type: invitation.type,\n kind: invitation.kind,\n authMethod: invitation.authMethod,\n swarmKey: invitation.swarmKey,\n state: invitation.state,\n timeout: invitation.timeout,\n };\n};\n\nexport type InvitationHost = {\n share(options?: Partial<Invitation>): CancellableInvitation;\n};\n\nexport type InvitationGuest = {\n join(invitation: Invitation | string): AuthenticatingInvitation;\n};\n\nexport type PerformInvitationCallbacks<T> = {\n onConnecting?: (value: T) => boolean | void;\n onConnected?: (value: T) => boolean | void;\n onReady?: (value: T) => boolean | void;\n onAuthenticating?: (value: T) => boolean | void;\n onSuccess?: (value: T) => boolean | void;\n onCancelled?: (value: T) => boolean | void;\n onTimeout?: (value: T) => boolean | void;\n onError?: (value: T) => boolean | void;\n};\n\nexport type PerformInvitationParams = {\n host: ServiceContext | InvitationHost;\n guest: ServiceContext | InvitationGuest;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitation>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitation>;\n };\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\nexport const performInvitation = ({\n host,\n guest,\n options,\n hooks,\n}: PerformInvitationParams): [Promise<Result>, Promise<Result>] => {\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n const hostObservable = createInvitation(host, options);\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n const guestObservable = acceptInvitation(guest, hostInvitation);\n guestObservable.subscribe(\n async (guestInvitation: Invitation) => {\n switch (guestInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.guest?.onConnecting?.(guestObservable)) {\n break;\n }\n invariant(hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!));\n break;\n }\n\n case Invitation.State.CONNECTED: {\n hooks?.guest?.onConnected?.(guestObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.guest?.onReady?.(guestObservable)) {\n break;\n }\n await guestObservable.authenticate(await authCode.wait());\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.guest?.onAuthenticating?.(guestObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.guest?.onSuccess?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.guest?.onCancelled?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.guest?.onTimeout?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ invitation: guestInvitation });\n }\n }\n },\n (error: Error) => {\n if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n },\n );\n break;\n }\n\n case Invitation.State.CONNECTED: {\n hooks?.host?.onConnected?.(hostObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.host?.onReady?.(hostObservable)) {\n break;\n }\n if (hostInvitation.authCode) {\n authCode.wake(hostInvitation.authCode);\n }\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.host?.onAuthenticating?.(hostObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.host?.onSuccess?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.host?.onCancelled?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.host?.onTimeout?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n }\n },\n (error: Error) => {\n if (hooks?.host?.onError?.(hostObservable)) {\n return;\n }\n hostComplete.wake({ error });\n },\n );\n\n return [hostComplete.wait(), guestComplete.wait()];\n};\n\nconst createInvitation = (\n host: ServiceContext | InvitationHost,\n options?: Partial<Invitation>,\n): CancellableInvitation => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n const hostHandler = host.getInvitationHandler({ kind: Invitation.Kind.SPACE, ...options });\n return host.invitations.createInvitation(hostHandler, options);\n }\n\n return host.share(options);\n};\n\nconst acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n): AuthenticatingInvitation => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n const guestHandler = guest.getInvitationHandler({ kind: invitation.kind });\n return guest.invitations.acceptInvitation(guestHandler, invitation);\n }\n\n return guest.join(invitation);\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport {\n SnapshotStore,\n type DataPipeline,\n MetadataStore,\n SpaceManager,\n valueEncoding,\n DataServiceSubscriptions,\n AutomergeHost,\n} from '@dxos/echo-pipeline';\nimport { testLocalDatabase } from '@dxos/echo-pipeline/testing';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { createStorage, type Storage, StorageType } from '@dxos/random-access-storage';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\n\nimport { ClientServicesHost, createDefaultModelFactory, ServiceContext } from '../services';\nimport { DataSpaceManager, type SigningContext } from '../spaces';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n return new ClientServicesHost({\n config,\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory,\n });\n};\n\nexport const createServiceContext = ({\n signalContext = new MemorySignalManagerContext(),\n storage = createStorage({ type: StorageType.RAM }),\n}: {\n signalContext?: MemorySignalManagerContext;\n storage?: Storage;\n} = {}) => {\n const signalManager = new MemorySignalManager(signalContext);\n const networkManager = new NetworkManager({\n signalManager,\n transportFactory: MemoryTransportFactory,\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, signalManager, modelFactory);\n};\n\nexport const createPeers = async (numPeers: number) => {\n const signalContext = new MemorySignalManagerContext();\n\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = createServiceContext({ signalContext });\n await peer.open(new Context());\n return peer;\n }),\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\n// TODO(burdon): Remove @dxos/client-testing.\n// TODO(burdon): Create builder and make configurable.\nexport const syncItemsLocal = async (db1: DataPipeline, db2: DataPipeline) => {\n await testLocalDatabase(db1, db2);\n await testLocalDatabase(db2, db1);\n};\n\nexport class TestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n private readonly _ctx = new Context();\n\n createPeer(peerOptions?: TestPeerOpts): TestPeer {\n const peer = new TestPeer(this.signalContext, peerOptions);\n this._ctx.onDispose(async () => peer.destroy());\n return peer;\n }\n\n async destroy() {\n await this._ctx.dispose();\n }\n}\n\nexport type TestPeerOpts = {\n dataStore?: StorageType;\n};\n\nexport type TestPeerProps = {\n storage?: Storage;\n feedStore?: FeedStore<any>;\n metadataStore?: MetadataStore;\n keyring?: Keyring;\n networkManager?: NetworkManager;\n spaceManager?: SpaceManager;\n dataSpaceManager?: DataSpaceManager;\n snapshotStore?: SnapshotStore;\n signingContext?: SigningContext;\n blobStore?: BlobStore;\n automergeHost?: AutomergeHost;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n\n constructor(\n private readonly signalContext: MemorySignalManagerContext,\n private readonly opts: TestPeerOpts = { dataStore: StorageType.RAM },\n ) {}\n\n get props() {\n return this._props;\n }\n\n get storage() {\n return (this._props.storage ??= createStorage({ type: this.opts.dataStore }));\n }\n\n get keyring() {\n return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));\n }\n\n get feedStore() {\n return (this._props.feedStore ??= new FeedStore({\n factory: new FeedFactory({\n root: this.storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding,\n },\n }),\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n get blobStore() {\n return (this._props.blobStore ??= new BlobStore(this.storage.createDirectory('blobs')));\n }\n\n get snapshotStore() {\n return (this._props.snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new NetworkManager({\n signalManager: new MemorySignalManager(this.signalContext),\n transportFactory: MemoryTransportFactory,\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n modelFactory: createDefaultModelFactory(),\n snapshotStore: this.snapshotStore,\n blobStore: this.blobStore,\n }));\n }\n\n get identity() {\n return this._props.signingContext ?? failUndefined();\n }\n\n get automergeHost() {\n return (this._props.automergeHost ??= new AutomergeHost(this.storage.createDirectory('automerge')));\n }\n\n get dataSpaceManager() {\n return (this._props.dataSpaceManager ??= new DataSpaceManager(\n this.spaceManager,\n this.metadataStore,\n new DataServiceSubscriptions(),\n this.keyring,\n this.identity,\n this.feedStore,\n this.automergeHost,\n ));\n }\n\n async createIdentity() {\n this._props.signingContext ??= await createSigningContext(this.keyring);\n }\n\n async destroy() {\n await this.storage.reset();\n }\n}\n\nexport const createSigningContext = async (keyring: Keyring): Promise<SigningContext> => {\n const identityKey = await keyring.createKey();\n const deviceKey = await keyring.createKey();\n\n return {\n identityKey,\n deviceKey,\n credentialSigner: createCredentialSignerWithChain(\n keyring,\n {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey),\n },\n deviceKey,\n ),\n recordCredential: async () => {}, // No-op.\n getProfile: () => undefined,\n };\n};\n"],
5
- "mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,yBAAiC;AAEjC,kBAA0B;ACF1B,mBAAwB;AAExB,uBAA0B;AAC1B,sBAA2B;ACF3B,qBAAwB;AACxB,IAAAA,sBAAqE;AACrE,mBAA8B;AAC9B,2BAQO;AACP,qBAAkC;AAClC,wBAAuC;AACvC,qBAAwB;AACxB,uBAAgE;AAChE,6BAAuD;AACvD,mCAAyD;AACzD,4CAA0B;AFdnB,IAAMC,uBAAuB,OAAO,EACzCC,QACAC,OAAM,UAKNC,qCAAiB;EACfF;EACAC;EACAE,SAAS,IAAIC,sBAAUC,OAAOC,KAAK,MAAA,CAAA;EACnCC,WAAW;IACT,SAAS;IACTC,SAAS;MACP,SAAS;MACTC,OAAOJ,OAAOC,KAAK,MAAA;IACrB;EACF;AACF,CAAA;;ACbK,IAAMI,qBAAqB,CAACC,eAAAA;AACjC,SAAO;IACLC,cAAcD,WAAWC;IACzBC,MAAMF,WAAWE;IACjBC,MAAMH,WAAWG;IACjBC,YAAYJ,WAAWI;IACvBC,UAAUL,WAAWK;IACrBC,OAAON,WAAWM;IAClBC,SAASP,WAAWO;EACtB;AACF;AAiCO,IAAMC,oBAAoB,CAAC,EAChCC,MACAC,OACAC,SACAC,MAAK,MACmB;AACxB,QAAMC,eAAe,IAAIC,qBAAAA;AACzB,QAAMC,gBAAgB,IAAID,qBAAAA;AAC1B,QAAME,WAAW,IAAIF,qBAAAA;AAErB,QAAMG,iBAAiBC,iBAAiBT,MAAME,OAAAA;AAC9CM,iBAAeE,UACb,OAAOC,mBAAAA;AACL,YAAQA,eAAed,OAAK;MAC1B,KAAKe,2BAAWC,MAAMC,YAAY;AAChC,YAAIX,OAAOH,MAAMe,eAAeP,cAAAA,GAAiB;AAC/C;QACF;AACA,cAAMQ,kBAAkBC,iBAAiBhB,OAAOU,cAAAA;AAChDK,wBAAgBN,UACd,OAAOQ,oBAAAA;AACL,kBAAQA,gBAAgBrB,OAAK;YAC3B,KAAKe,2BAAWC,MAAMC,YAAY;AAChC,kBAAIX,OAAOF,OAAOc,eAAeC,eAAAA,GAAkB;AACjD;cACF;AACAG,8CAAUR,eAAef,SAAUwB,OAAOF,gBAAgBtB,QAAQ,GAAA,QAAA;;;;;;;;;AAClE;YACF;YAEA,KAAKgB,2BAAWC,MAAMQ,WAAW;AAC/BlB,qBAAOF,OAAOqB,cAAcN,eAAAA;AAC5B;YACF;YAEA,KAAKJ,2BAAWC,MAAMU,0BAA0B;AAC9C,kBAAIpB,OAAOF,OAAOuB,UAAUR,eAAAA,GAAkB;AAC5C;cACF;AACA,oBAAMA,gBAAgBS,aAAa,MAAMlB,SAASmB,KAAI,CAAA;AACtD;YACF;YAEA,KAAKd,2BAAWC,MAAMc,gBAAgB;AACpCxB,qBAAOF,OAAO2B,mBAAmBZ,eAAAA;AACjC;YACF;YAEA,KAAKJ,2BAAWC,MAAMgB,SAAS;AAC7B,kBAAI1B,OAAOF,OAAO6B,YAAYd,eAAAA,GAAkB;AAC9C;cACF;AACAV,4BAAcyB,KAAK;gBAAExC,YAAY2B;cAAgB,CAAA;AACjD;YACF;YAEA,KAAKN,2BAAWC,MAAMmB,WAAW;AAC/B,kBAAI7B,OAAOF,OAAOgC,cAAcjB,eAAAA,GAAkB;AAChD;cACF;AACAV,4BAAcyB,KAAK;gBAAExC,YAAY2B;cAAgB,CAAA;AACjD;YACF;YAEA,KAAKN,2BAAWC,MAAMqB,SAAS;AAC7B,kBAAI/B,OAAOF,OAAOkC,YAAYnB,eAAAA,GAAkB;AAC9C;cACF;AACAV,4BAAcyB,KAAK;gBAAExC,YAAY2B;cAAgB,CAAA;YACnD;UACF;QACF,GACA,CAACkB,UAAAA;AACC,cAAIjC,OAAOF,OAAOoC,UAAUrB,eAAAA,GAAkB;AAC5C;UACF;AACAV,wBAAcyB,KAAK;YAAEK;UAAM,CAAA;QAC7B,CAAA;AAEF;MACF;MAEA,KAAKxB,2BAAWC,MAAMQ,WAAW;AAC/BlB,eAAOH,MAAMsB,cAAcd,cAAAA;AAC3B;MACF;MAEA,KAAKI,2BAAWC,MAAMU,0BAA0B;AAC9C,YAAIpB,OAAOH,MAAMwB,UAAUhB,cAAAA,GAAiB;AAC1C;QACF;AACA,YAAIG,eAAeJ,UAAU;AAC3BA,mBAASwB,KAAKpB,eAAeJ,QAAQ;QACvC;AACA;MACF;MAEA,KAAKK,2BAAWC,MAAMc,gBAAgB;AACpCxB,eAAOH,MAAM4B,mBAAmBpB,cAAAA;AAChC;MACF;MAEA,KAAKI,2BAAWC,MAAMgB,SAAS;AAC7B,YAAI1B,OAAOH,MAAM8B,YAAYtB,cAAAA,GAAiB;AAC5C;QACF;AACAJ,qBAAa2B,KAAK;UAAExC,YAAYoB;QAAe,CAAA;AAC/C;MACF;MAEA,KAAKC,2BAAWC,MAAMmB,WAAW;AAC/B,YAAI7B,OAAOH,MAAMiC,cAAczB,cAAAA,GAAiB;AAC9C;QACF;AACAJ,qBAAa2B,KAAK;UAAExC,YAAYoB;QAAe,CAAA;AAC/C;MACF;MAEA,KAAKC,2BAAWC,MAAMqB,SAAS;AAC7B,YAAI/B,OAAOH,MAAMmC,YAAY3B,cAAAA,GAAiB;AAC5C;QACF;AACAJ,qBAAa2B,KAAK;UAAExC,YAAYoB;QAAe,CAAA;AAC/C;MACF;IACF;EACF,GACA,CAACyB,UAAAA;AACC,QAAIjC,OAAOH,MAAMqC,UAAU7B,cAAAA,GAAiB;AAC1C;IACF;AACAJ,iBAAa2B,KAAK;MAAEK;IAAM,CAAA;EAC5B,CAAA;AAGF,SAAO;IAAChC,aAAasB,KAAI;IAAIpB,cAAcoB,KAAI;;AACjD;AAEA,IAAMjB,mBAAmB,CACvBT,MACAE,YAAAA;AAEAA,cAAY;IACVP,YAAYiB,2BAAW0B,WAAWC;IAClC,GAAIrC,WAAW,CAAC;EAClB;AAEA,MAAIF,gBAAgBwC,sCAAgB;AAClC,UAAMC,cAAczC,KAAK0C,qBAAqB;MAAEhD,MAAMkB,2BAAW+B,KAAKC;MAAO,GAAG1C;IAAQ,CAAA;AACxF,WAAOF,KAAK6C,YAAYpC,iBAAiBgC,aAAavC,OAAAA;EACxD;AAEA,SAAOF,KAAK8C,MAAM5C,OAAAA;AACpB;AAEA,IAAMe,mBAAmB,CACvBhB,OACAV,eAAAA;AAEAA,eAAaD,mBAAmBC,UAAAA;AAEhC,MAAIU,iBAAiBuC,sCAAgB;AACnC,UAAMO,eAAe9C,MAAMyC,qBAAqB;MAAEhD,MAAMH,WAAWG;IAAK,CAAA;AACxE,WAAOO,MAAM4C,YAAY5B,iBAAiB8B,cAAcxD,UAAAA;EAC1D;AAEA,SAAOU,MAAM+C,KAAKzD,UAAAA;AACpB;AChMO,IAAM0D,oBAAoB,CAACC,QAAgBC,yBAAAA;AAChD,SAAO,IAAIC,yCAAmB;IAC5BF;IACAG,eAAe,IAAIC,qCAAoBH,oBAAAA;IACvCI,kBAAkBC;EACpB,CAAA;AACF;AAEO,IAAMC,uBAAuB,CAAC,EACnCC,gBAAgB,IAAIC,4CAAAA,GACpBC,cAAUC,4CAAc;EAAEpE,MAAMqE,yCAAYC;AAAI,CAAA,EAAE,IAIhD,CAAC,MAAC;AACJ,QAAMV,gBAAgB,IAAIC,qCAAoBI,aAAAA;AAC9C,QAAMM,iBAAiB,IAAIC,sCAAe;IACxCZ;IACAE,kBAAkBC;EACpB,CAAA;AAEA,QAAMU,mBAAeC,iDAAAA;AACrB,SAAO,IAAI3B,qCAAeoB,SAASI,gBAAgBX,eAAea,YAAAA;AACpE;AAEO,IAAME,cAAc,OAAOC,aAAAA;AAChC,QAAMX,gBAAgB,IAAIC,4CAAAA;AAE1B,SAAO,MAAMW,QAAQC,IACnBC,MAAMtF,KAAKsF,MAAMH,QAAAA,CAAAA,EAAWI,IAAI,YAAA;AAC9B,UAAMC,OAAOjB,qBAAqB;MAAEC;IAAc,CAAA;AAClD,UAAMgB,KAAKC,KAAK,IAAIC,uBAAAA,CAAAA;AACpB,WAAOF;EACT,CAAA,CAAA;AAEJ;AAEO,IAAMG,iBAAiB,OAAOH,SAAAA;AACnC,QAAMA,KAAKG,eAAc;AACzB,SAAOH;AACT;AAIO,IAAMI,iBAAiB,OAAOC,KAAmBC,QAAAA;AACtD,YAAMC,kCAAkBF,KAAKC,GAAAA;AAC7B,YAAMC,kCAAkBD,KAAKD,GAAAA;AAC/B;AAEO,IAAMG,cAAN,MAAMA;EAAN,cAAA;AACWxB,SAAAA,gBAAgB,IAAIC,4CAAAA;AACnBwB,SAAAA,OAAO,IAAIP,uBAAAA;;EAE5BQ,WAAWC,aAAsC;AAC/C,UAAMX,OAAO,IAAIY,SAAS,KAAK5B,eAAe2B,WAAAA;AAC9C,SAAKF,KAAKI,UAAU,YAAYb,KAAKc,QAAO,CAAA;AAC5C,WAAOd;EACT;EAEA,MAAMc,UAAU;AACd,UAAM,KAAKL,KAAKM,QAAO;EACzB;AACF;AAoBO,IAAMH,WAAN,MAAMA;EAGXI,YACmBhC,eACAiC,OAAqB;IAAEC,WAAW9B,yCAAYC;EAAI,GACnE;SAFiBL,gBAAAA;SACAiC,OAAAA;SAJXE,SAAwB,CAAC;EAK9B;EAEH,IAAIC,QAAQ;AACV,WAAO,KAAKD;EACd;EAEA,IAAIjC,UAAU;AACZ,WAAQ,KAAKiC,OAAOjC,gBAAYC,4CAAc;MAAEpE,MAAM,KAAKkG,KAAKC;IAAU,CAAA;EAC5E;EAEA,IAAIG,UAAU;AACZ,WAAQ,KAAKF,OAAOE,YAAY,IAAIC,uBAAQ,KAAKpC,QAAQqC,gBAAgB,SAAA,CAAA;EAC3E;EAEA,IAAIC,YAAY;AACd,WAAQ,KAAKL,OAAOK,cAAc,IAAIC,4BAAU;MAC9CC,SAAS,IAAIC,8BAAY;QACvBC,MAAM,KAAK1C,QAAQqC,gBAAgB,OAAA;QACnCrH,QAAQ,KAAKmH;QACbQ,WAAW;UACTC;QACF;MACF,CAAA;IACF,CAAA;EACF;EAEA,IAAIC,gBAAgB;AAClB,WAAQ,KAAKZ,OAAOY,kBAAkB,IAAIC,mCAAc,KAAK9C,QAAQqC,gBAAgB,UAAA,CAAA;EACvF;EAEA,IAAIU,YAAY;AACd,WAAQ,KAAKd,OAAOc,cAAc,IAAIC,gDAAU,KAAKhD,QAAQqC,gBAAgB,OAAA,CAAA;EAC/E;EAEA,IAAIY,gBAAgB;AAClB,WAAQ,KAAKhB,OAAOgB,kBAAkB,IAAIC,mCAAc,KAAKlD,QAAQqC,gBAAgB,WAAA,CAAA;EACvF;EAEA,IAAIjC,iBAAiB;AACnB,WAAQ,KAAK6B,OAAO7B,mBAAmB,IAAIC,sCAAe;MACxDZ,eAAe,IAAIC,qCAAoB,KAAKI,aAAa;MACzDH,kBAAkBC;IACpB,CAAA;EACF;EAEA,IAAIuD,eAAe;AACjB,WAAQ,KAAKlB,OAAOkB,iBAAiB,IAAIC,kCAAa;MACpDd,WAAW,KAAKA;MAChBlC,gBAAgB,KAAKA;MACrByC,eAAe,KAAKA;MACpBvC,kBAAcC,iDAAAA;MACd0C,eAAe,KAAKA;MACpBF,WAAW,KAAKA;IAClB,CAAA;EACF;EAEA,IAAIM,WAAW;AACb,WAAO,KAAKpB,OAAOqB,sBAAkBC,4BAAAA;EACvC;EAEA,IAAIC,gBAAgB;AAClB,WAAQ,KAAKvB,OAAOuB,kBAAkB,IAAIC,mCAAc,KAAKzD,QAAQqC,gBAAgB,WAAA,CAAA;EACvF;EAEA,IAAIqB,mBAAmB;AACrB,WAAQ,KAAKzB,OAAOyB,qBAAqB,IAAIC,uCAC3C,KAAKR,cACL,KAAKN,eACL,IAAIe,8CAAAA,GACJ,KAAKzB,SACL,KAAKkB,UACL,KAAKf,WACL,KAAKkB,aAAa;EAEtB;EAEA,MAAMvC,iBAAiB;AACrB,SAAKgB,OAAOqB,mBAAmB,MAAMO,qBAAqB,KAAK1B,OAAO;EACxE;EAEA,MAAMP,UAAU;AACd,UAAM,KAAK5B,QAAQ8D,MAAK;EAC1B;AACF;AAEO,IAAMD,uBAAuB,OAAO1B,YAAAA;AACzC,QAAM4B,cAAc,MAAM5B,QAAQ6B,UAAS;AAC3C,QAAMC,YAAY,MAAM9B,QAAQ6B,UAAS;AAEzC,SAAO;IACLD;IACAE;IACAC,sBAAkBC,qDAChBhC,SACA;MACEiC,YAAY,MAAM,IAAIC,wCAAoBlC,SAAS4B,aAAaE,SAAAA,EAAWK,0BAA0BL,SAAAA;IACvG,GACAA,SAAAA;IAEFM,kBAAkB,YAAA;IAAa;IAC/BC,YAAY,MAAMC;EACpB;AACF;",
6
- "names": ["import_credentials", "createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "sanitizeInvitation", "invitation", "invitationId", "type", "kind", "authMethod", "swarmKey", "state", "timeout", "performInvitation", "host", "guest", "options", "hooks", "hostComplete", "Trigger", "guestComplete", "authCode", "hostObservable", "createInvitation", "subscribe", "hostInvitation", "Invitation", "State", "CONNECTING", "onConnecting", "guestObservable", "acceptInvitation", "guestInvitation", "invariant", "equals", "CONNECTED", "onConnected", "READY_FOR_AUTHENTICATION", "onReady", "authenticate", "wait", "AUTHENTICATING", "onAuthenticating", "SUCCESS", "onSuccess", "wake", "CANCELLED", "onCancelled", "TIMEOUT", "onTimeout", "error", "onError", "AuthMethod", "NONE", "ServiceContext", "hostHandler", "getInvitationHandler", "Kind", "SPACE", "invitations", "share", "guestHandler", "join", "createServiceHost", "config", "signalManagerContext", "ClientServicesHost", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "StorageType", "RAM", "networkManager", "NetworkManager", "modelFactory", "createDefaultModelFactory", "createPeers", "numPeers", "Promise", "all", "Array", "map", "peer", "open", "Context", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "TestBuilder", "_ctx", "createPeer", "peerOptions", "TestPeer", "onDispose", "destroy", "dispose", "constructor", "opts", "dataStore", "_props", "props", "keyring", "Keyring", "createDirectory", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "hypercore", "valueEncoding", "metadataStore", "MetadataStore", "blobStore", "BlobStore", "snapshotStore", "SnapshotStore", "spaceManager", "SpaceManager", "identity", "signingContext", "failUndefined", "automergeHost", "AutomergeHost", "dataSpaceManager", "DataSpaceManager", "DataServiceSubscriptions", "createSigningContext", "reset", "identityKey", "createKey", "deviceKey", "credentialSigner", "createCredentialSignerWithChain", "credential", "CredentialGenerator", "createDeviceAuthorization", "recordCredential", "getProfile", "undefined"]
4
+ "sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { createCredential } from '@dxos/credentials';\nimport { type Signer } from '@dxos/crypto';\nimport { PublicKey } from '@dxos/keys';\nimport { type Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\n\nexport const createMockCredential = async ({\n signer,\n issuer,\n}: {\n signer: Signer;\n issuer: PublicKey;\n}): Promise<Credential> =>\n createCredential({\n signer,\n issuer,\n subject: new PublicKey(Buffer.from('test')),\n assertion: {\n '@type': 'example.testing.rpc.MessageWithAny',\n payload: {\n '@type': 'google.protobuf.Any',\n value: Buffer.from('test'),\n },\n },\n });\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { InvitationEncoder, type AuthenticatingInvitation, type CancellableInvitation } from '@dxos/client-protocol';\nimport { invariant } from '@dxos/invariant';\nimport { Invitation } from '@dxos/protocols/proto/dxos/client/services';\n\nimport { ServiceContext } from '../services';\n\n/**\n * Strip secrets from invitation before giving it to the peer.\n */\nexport const sanitizeInvitation = (invitation: Invitation): Invitation => {\n return InvitationEncoder.decode(InvitationEncoder.encode(invitation));\n};\n\nexport type InvitationHost = {\n share(options?: Partial<Invitation>): CancellableInvitation;\n};\n\nexport type InvitationGuest = {\n join(invitation: Invitation | string): AuthenticatingInvitation;\n};\n\nexport type PerformInvitationCallbacks<T> = {\n onConnecting?: (value: T) => boolean | void;\n onConnected?: (value: T) => boolean | void;\n onReady?: (value: T) => boolean | void;\n onAuthenticating?: (value: T) => boolean | void;\n onSuccess?: (value: T) => boolean | void;\n onCancelled?: (value: T) => boolean | void;\n onTimeout?: (value: T) => boolean | void;\n onError?: (value: T) => boolean | void;\n};\n\nexport type PerformInvitationParams = {\n host: ServiceContext | InvitationHost;\n guest: ServiceContext | InvitationGuest;\n options?: Partial<Invitation>;\n hooks?: {\n host?: PerformInvitationCallbacks<CancellableInvitation>;\n guest?: PerformInvitationCallbacks<AuthenticatingInvitation>;\n };\n};\n\nexport type Result = { invitation?: Invitation; error?: Error };\n\nexport const performInvitation = ({\n host,\n guest,\n options,\n hooks,\n}: PerformInvitationParams): [Promise<Result>, Promise<Result>] => {\n const hostComplete = new Trigger<Result>();\n const guestComplete = new Trigger<Result>();\n const authCode = new Trigger<string>();\n\n const hostObservable = createInvitation(host, options);\n hostObservable.subscribe(\n async (hostInvitation: Invitation) => {\n switch (hostInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.host?.onConnecting?.(hostObservable)) {\n break;\n }\n const guestObservable = acceptInvitation(guest, hostInvitation);\n guestObservable.subscribe(\n async (guestInvitation: Invitation) => {\n switch (guestInvitation.state) {\n case Invitation.State.CONNECTING: {\n if (hooks?.guest?.onConnecting?.(guestObservable)) {\n break;\n }\n invariant(hostInvitation.swarmKey!.equals(guestInvitation.swarmKey!));\n break;\n }\n\n case Invitation.State.CONNECTED: {\n hooks?.guest?.onConnected?.(guestObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.guest?.onReady?.(guestObservable)) {\n break;\n }\n await guestObservable.authenticate(await authCode.wait());\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.guest?.onAuthenticating?.(guestObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.guest?.onSuccess?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.guest?.onCancelled?.(guestObservable)) {\n break;\n }\n guestComplete.wake({ invitation: guestInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.guest?.onTimeout?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ invitation: guestInvitation });\n }\n }\n },\n (error: Error) => {\n if (hooks?.guest?.onError?.(guestObservable)) {\n return;\n }\n guestComplete.wake({ error });\n },\n );\n break;\n }\n\n case Invitation.State.CONNECTED: {\n hooks?.host?.onConnected?.(hostObservable);\n break;\n }\n\n case Invitation.State.READY_FOR_AUTHENTICATION: {\n if (hooks?.host?.onReady?.(hostObservable)) {\n break;\n }\n if (hostInvitation.authCode) {\n authCode.wake(hostInvitation.authCode);\n }\n break;\n }\n\n case Invitation.State.AUTHENTICATING: {\n hooks?.host?.onAuthenticating?.(hostObservable);\n break;\n }\n\n case Invitation.State.SUCCESS: {\n if (hooks?.host?.onSuccess?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.CANCELLED: {\n if (hooks?.host?.onCancelled?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n\n case Invitation.State.TIMEOUT: {\n if (hooks?.host?.onTimeout?.(hostObservable)) {\n break;\n }\n hostComplete.wake({ invitation: hostInvitation });\n break;\n }\n }\n },\n (error: Error) => {\n if (hooks?.host?.onError?.(hostObservable)) {\n return;\n }\n hostComplete.wake({ error });\n },\n );\n\n return [hostComplete.wait(), guestComplete.wait()];\n};\n\nconst createInvitation = (\n host: ServiceContext | InvitationHost,\n options?: Partial<Invitation>,\n): CancellableInvitation => {\n options ??= {\n authMethod: Invitation.AuthMethod.NONE,\n ...(options ?? {}),\n };\n\n if (host instanceof ServiceContext) {\n const hostHandler = host.getInvitationHandler({ kind: Invitation.Kind.SPACE, ...options });\n return host.invitations.createInvitation(hostHandler, options);\n }\n\n return host.share(options);\n};\n\nconst acceptInvitation = (\n guest: ServiceContext | InvitationGuest,\n invitation: Invitation,\n): AuthenticatingInvitation => {\n invitation = sanitizeInvitation(invitation);\n\n if (guest instanceof ServiceContext) {\n const guestHandler = guest.getInvitationHandler({ kind: invitation.kind });\n return guest.invitations.acceptInvitation(guestHandler, invitation);\n }\n\n return guest.join(invitation);\n};\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { type Config } from '@dxos/config';\nimport { Context } from '@dxos/context';\nimport { createCredentialSignerWithChain, CredentialGenerator } from '@dxos/credentials';\nimport { failUndefined } from '@dxos/debug';\nimport {\n SnapshotStore,\n type DataPipeline,\n MetadataStore,\n SpaceManager,\n valueEncoding,\n DataServiceSubscriptions,\n AutomergeHost,\n} from '@dxos/echo-pipeline';\nimport { testLocalDatabase } from '@dxos/echo-pipeline/testing';\nimport { FeedFactory, FeedStore } from '@dxos/feed-store';\nimport { Keyring } from '@dxos/keyring';\nimport { MemorySignalManager, MemorySignalManagerContext } from '@dxos/messaging';\nimport { MemoryTransportFactory, NetworkManager } from '@dxos/network-manager';\nimport { createStorage, type Storage, StorageType } from '@dxos/random-access-storage';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\n\nimport { ClientServicesHost, createDefaultModelFactory, ServiceContext } from '../services';\nimport { DataSpaceManager, type SigningContext } from '../spaces';\n\n//\n// TODO(burdon): Replace with test builder.\n//\n\nexport const createServiceHost = (config: Config, signalManagerContext: MemorySignalManagerContext) => {\n return new ClientServicesHost({\n config,\n signalManager: new MemorySignalManager(signalManagerContext),\n transportFactory: MemoryTransportFactory,\n });\n};\n\nexport const createServiceContext = ({\n signalContext = new MemorySignalManagerContext(),\n storage = createStorage({ type: StorageType.RAM }),\n}: {\n signalContext?: MemorySignalManagerContext;\n storage?: Storage;\n} = {}) => {\n const signalManager = new MemorySignalManager(signalContext);\n const networkManager = new NetworkManager({\n signalManager,\n transportFactory: MemoryTransportFactory,\n });\n\n const modelFactory = createDefaultModelFactory();\n return new ServiceContext(storage, networkManager, signalManager, modelFactory);\n};\n\nexport const createPeers = async (numPeers: number) => {\n const signalContext = new MemorySignalManagerContext();\n\n return await Promise.all(\n Array.from(Array(numPeers)).map(async () => {\n const peer = createServiceContext({ signalContext });\n await peer.open(new Context());\n return peer;\n }),\n );\n};\n\nexport const createIdentity = async (peer: ServiceContext) => {\n await peer.createIdentity();\n return peer;\n};\n\n// TODO(burdon): Remove @dxos/client-testing.\n// TODO(burdon): Create builder and make configurable.\nexport const syncItemsLocal = async (db1: DataPipeline, db2: DataPipeline) => {\n await testLocalDatabase(db1, db2);\n await testLocalDatabase(db2, db1);\n};\n\nexport class TestBuilder {\n public readonly signalContext = new MemorySignalManagerContext();\n private readonly _ctx = new Context();\n\n createPeer(peerOptions?: TestPeerOpts): TestPeer {\n const peer = new TestPeer(this.signalContext, peerOptions);\n this._ctx.onDispose(async () => peer.destroy());\n return peer;\n }\n\n async destroy() {\n await this._ctx.dispose();\n }\n}\n\nexport type TestPeerOpts = {\n dataStore?: StorageType;\n};\n\nexport type TestPeerProps = {\n storage?: Storage;\n feedStore?: FeedStore<any>;\n metadataStore?: MetadataStore;\n keyring?: Keyring;\n networkManager?: NetworkManager;\n spaceManager?: SpaceManager;\n dataSpaceManager?: DataSpaceManager;\n snapshotStore?: SnapshotStore;\n signingContext?: SigningContext;\n blobStore?: BlobStore;\n automergeHost?: AutomergeHost;\n};\n\nexport class TestPeer {\n private _props: TestPeerProps = {};\n\n constructor(\n private readonly signalContext: MemorySignalManagerContext,\n private readonly opts: TestPeerOpts = { dataStore: StorageType.RAM },\n ) {}\n\n get props() {\n return this._props;\n }\n\n get storage() {\n return (this._props.storage ??= createStorage({ type: this.opts.dataStore }));\n }\n\n get keyring() {\n return (this._props.keyring ??= new Keyring(this.storage.createDirectory('keyring')));\n }\n\n get feedStore() {\n return (this._props.feedStore ??= new FeedStore({\n factory: new FeedFactory({\n root: this.storage.createDirectory('feeds'),\n signer: this.keyring,\n hypercore: {\n valueEncoding,\n },\n }),\n }));\n }\n\n get metadataStore() {\n return (this._props.metadataStore ??= new MetadataStore(this.storage.createDirectory('metadata')));\n }\n\n get blobStore() {\n return (this._props.blobStore ??= new BlobStore(this.storage.createDirectory('blobs')));\n }\n\n get snapshotStore() {\n return (this._props.snapshotStore ??= new SnapshotStore(this.storage.createDirectory('snapshots')));\n }\n\n get networkManager() {\n return (this._props.networkManager ??= new NetworkManager({\n signalManager: new MemorySignalManager(this.signalContext),\n transportFactory: MemoryTransportFactory,\n }));\n }\n\n get spaceManager() {\n return (this._props.spaceManager ??= new SpaceManager({\n feedStore: this.feedStore,\n networkManager: this.networkManager,\n metadataStore: this.metadataStore,\n modelFactory: createDefaultModelFactory(),\n snapshotStore: this.snapshotStore,\n blobStore: this.blobStore,\n }));\n }\n\n get identity() {\n return this._props.signingContext ?? failUndefined();\n }\n\n get automergeHost() {\n return (this._props.automergeHost ??= new AutomergeHost(this.storage.createDirectory('automerge')));\n }\n\n get dataSpaceManager() {\n return (this._props.dataSpaceManager ??= new DataSpaceManager(\n this.spaceManager,\n this.metadataStore,\n new DataServiceSubscriptions(),\n this.keyring,\n this.identity,\n this.feedStore,\n this.automergeHost,\n ));\n }\n\n async createIdentity() {\n this._props.signingContext ??= await createSigningContext(this.keyring);\n }\n\n async destroy() {\n await this.storage.reset();\n }\n}\n\nexport const createSigningContext = async (keyring: Keyring): Promise<SigningContext> => {\n const identityKey = await keyring.createKey();\n const deviceKey = await keyring.createKey();\n\n return {\n identityKey,\n deviceKey,\n credentialSigner: createCredentialSignerWithChain(\n keyring,\n {\n credential: await new CredentialGenerator(keyring, identityKey, deviceKey).createDeviceAuthorization(deviceKey),\n },\n deviceKey,\n ),\n recordCredential: async () => {}, // No-op.\n getProfile: () => undefined,\n };\n};\n"],
5
+ "mappings": "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",
6
+ "names": ["import_credentials", "createMockCredential", "signer", "issuer", "createCredential", "subject", "PublicKey", "Buffer", "from", "assertion", "payload", "value", "sanitizeInvitation", "invitation", "InvitationEncoder", "decode", "encode", "performInvitation", "host", "guest", "options", "hooks", "hostComplete", "Trigger", "guestComplete", "authCode", "hostObservable", "createInvitation", "subscribe", "hostInvitation", "state", "Invitation", "State", "CONNECTING", "onConnecting", "guestObservable", "acceptInvitation", "guestInvitation", "invariant", "swarmKey", "equals", "CONNECTED", "onConnected", "READY_FOR_AUTHENTICATION", "onReady", "authenticate", "wait", "AUTHENTICATING", "onAuthenticating", "SUCCESS", "onSuccess", "wake", "CANCELLED", "onCancelled", "TIMEOUT", "onTimeout", "error", "onError", "authMethod", "AuthMethod", "NONE", "ServiceContext", "hostHandler", "getInvitationHandler", "kind", "Kind", "SPACE", "invitations", "share", "guestHandler", "join", "createServiceHost", "config", "signalManagerContext", "ClientServicesHost", "signalManager", "MemorySignalManager", "transportFactory", "MemoryTransportFactory", "createServiceContext", "signalContext", "MemorySignalManagerContext", "storage", "createStorage", "type", "StorageType", "RAM", "networkManager", "NetworkManager", "modelFactory", "createDefaultModelFactory", "createPeers", "numPeers", "Promise", "all", "Array", "map", "peer", "open", "Context", "createIdentity", "syncItemsLocal", "db1", "db2", "testLocalDatabase", "TestBuilder", "_ctx", "createPeer", "peerOptions", "TestPeer", "onDispose", "destroy", "dispose", "constructor", "opts", "dataStore", "_props", "props", "keyring", "Keyring", "createDirectory", "feedStore", "FeedStore", "factory", "FeedFactory", "root", "hypercore", "valueEncoding", "metadataStore", "MetadataStore", "blobStore", "BlobStore", "snapshotStore", "SnapshotStore", "spaceManager", "SpaceManager", "identity", "signingContext", "failUndefined", "automergeHost", "AutomergeHost", "dataSpaceManager", "DataSpaceManager", "DataServiceSubscriptions", "createSigningContext", "reset", "identityKey", "createKey", "deviceKey", "credentialSigner", "createCredentialSignerWithChain", "credential", "CredentialGenerator", "createDeviceAuthorization", "recordCredential", "getProfile", "undefined"]
7
7
  }
@@ -1,4 +1,5 @@
1
1
  import { type Keyring } from '@dxos/keyring';
2
+ import { AlreadyJoinedError } from '@dxos/protocols';
2
3
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
3
4
  import { type AdmissionRequest, type AdmissionResponse, type IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';
4
5
  import { type InvitationProtocol } from './invitation-protocol';
@@ -11,6 +12,7 @@ export declare class DeviceInvitationProtocol implements InvitationProtocol {
11
12
  toJSON(): object;
12
13
  getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'>;
13
14
  admit(request: AdmissionRequest): Promise<AdmissionResponse>;
15
+ checkInvitation(invitation: Partial<Invitation>): AlreadyJoinedError | undefined;
14
16
  createIntroduction(): IntroductionRequest;
15
17
  createAdmissionRequest(): Promise<AdmissionRequest>;
16
18
  accept(response: AdmissionResponse, request: AdmissionRequest): Promise<Partial<Invitation>>;
@@ -1 +1 @@
1
- {"version":3,"file":"device-invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/device-invitation-protocol.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,qBAAa,wBAAyB,YAAW,kBAAkB;IAE/D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAFf,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,MAAM,QAAQ,EAC5B,eAAe,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,QAAQ,CAAC;IAGvF,MAAM,IAAI,MAAM;IAIhB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAMhE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAelE,kBAAkB,IAAI,mBAAmB;IAInC,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAcnD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;CAmBnG"}
1
+ {"version":3,"file":"device-invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/device-invitation-protocol.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAErE,qBAAa,wBAAyB,YAAW,kBAAkB;IAE/D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,eAAe;gBAFf,QAAQ,EAAE,OAAO,EACjB,YAAY,EAAE,MAAM,QAAQ,EAC5B,eAAe,EAAE,CAAC,QAAQ,EAAE,kBAAkB,KAAK,OAAO,CAAC,QAAQ,CAAC;IAGvF,MAAM,IAAI,MAAM;IAIhB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAMhE,KAAK,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAelE,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;IAW/C,kBAAkB,IAAI,mBAAmB;IAInC,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAcnD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;CAqBnG"}
@@ -1,12 +1,37 @@
1
- import { type Invitation } from '@dxos/protocols/proto/dxos/client/services';
2
- import { type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
3
- import { type AdmissionRequest, type AdmissionResponse, type IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';
1
+ import type { ApiError } from '@dxos/protocols';
2
+ import type { Invitation } from '@dxos/protocols/proto/dxos/client/services';
3
+ import type { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
4
+ import type { AdmissionRequest, AdmissionResponse, IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';
4
5
  export interface InvitationProtocol {
6
+ /**
7
+ * Protocol-specific debug info to include in logs.
8
+ */
5
9
  toJSON(): object;
10
+ /**
11
+ * Protocol-specific information to include in the invitation.
12
+ */
6
13
  getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'>;
14
+ /**
15
+ * Once authentication is successful, the host can admit the guest to the requested resource.
16
+ */
7
17
  admit(request: AdmissionRequest, guestProfile?: ProfileDocument): Promise<AdmissionResponse>;
18
+ /**
19
+ * Check if the invitation is valid.
20
+ *
21
+ * For example, the guest may already be a member of the space.
22
+ */
23
+ checkInvitation(invitation: Partial<Invitation>): ApiError | undefined;
24
+ /**
25
+ * Get profile information to send to the host to identify the guest.
26
+ */
8
27
  createIntroduction(): IntroductionRequest;
28
+ /**
29
+ * Get key information to send to the host in order to create an admission credential for the guest.
30
+ */
9
31
  createAdmissionRequest(): Promise<AdmissionRequest>;
32
+ /**
33
+ * Redeem the admission credential.
34
+ */
10
35
  accept(response: AdmissionResponse, request: AdmissionRequest): Promise<Partial<Invitation>>;
11
36
  }
12
37
  //# sourceMappingURL=invitation-protocol.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-protocol.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,6CAA6C,CAAC;AAErD,MAAM,WAAW,kBAAkB;IAEjC,MAAM,IAAI,MAAM,CAAC;IAGjB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IACvE,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAG7F,kBAAkB,IAAI,mBAAmB,CAAC;IAC1C,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACpD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;CAC9F"}
1
+ {"version":3,"file":"invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-protocol.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,iBAAiB,CAAC;AAChD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAC7E,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,KAAK,EACV,gBAAgB,EAChB,iBAAiB,EACjB,mBAAmB,EACpB,MAAM,6CAA6C,CAAC;AAErD,MAAM,WAAW,kBAAkB;IAKjC;;OAEG;IACH,MAAM,IAAI,MAAM,CAAC;IAMjB;;OAEG;IACH,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAEvE;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;IAM7F;;;;OAIG;IACH,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,QAAQ,GAAG,SAAS,CAAC;IAEvE;;OAEG;IACH,kBAAkB,IAAI,mBAAmB,CAAC;IAE1C;;OAEG;IACH,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAEpD;;OAEG;IACH,MAAM,CAAC,QAAQ,EAAE,iBAAiB,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;CAC9F"}
@@ -1 +1 @@
1
- {"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,wBAAwB,EAExB,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AASxE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5C,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,qBAAqB;IAiJpG,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,GAAG,wBAAwB;CAgLjG"}
1
+ {"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,wBAAwB,EAExB,qBAAqB,EAEtB,MAAM,uBAAuB,CAAC;AAa/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AASxE,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,kBAAkB;IAIjB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAE5C,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,qBAAqB;IAiJpG,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,GAAG,wBAAwB;CAkLjG"}
@@ -1,5 +1,6 @@
1
1
  import { type Keyring } from '@dxos/keyring';
2
2
  import { type PublicKey } from '@dxos/keys';
3
+ import { AlreadyJoinedError } from '@dxos/protocols';
3
4
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
4
5
  import { type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
5
6
  import { type AdmissionRequest, type AdmissionResponse, type IntroductionRequest } from '@dxos/protocols/proto/dxos/halo/invitations';
@@ -14,6 +15,7 @@ export declare class SpaceInvitationProtocol implements InvitationProtocol {
14
15
  toJSON(): object;
15
16
  getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'>;
16
17
  admit(request: AdmissionRequest, guestProfile?: ProfileDocument | undefined): Promise<AdmissionResponse>;
18
+ checkInvitation(invitation: Partial<Invitation>): AlreadyJoinedError | undefined;
17
19
  createIntroduction(): IntroductionRequest;
18
20
  createAdmissionRequest(): Promise<AdmissionRequest>;
19
21
  accept(response: AdmissionResponse): Promise<Partial<Invitation>>;
@@ -1 +1 @@
1
- {"version":3,"file":"space-invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/space-invitation-protocol.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAExE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAEvE,qBAAa,uBAAwB,YAAW,kBAAkB;IAE9D,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAHV,aAAa,EAAE,gBAAgB,EAC/B,eAAe,EAAE,cAAc,EAC/B,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,uBAAW;IAGxC,MAAM,IAAI,MAAM;IAOhB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAOhE,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC9G,kBAAkB,IAAI,mBAAmB;IAMnC,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAenD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;CAmBxE"}
1
+ {"version":3,"file":"space-invitation-protocol.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/space-invitation-protocol.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,KAAK,OAAO,EAAE,MAAM,eAAe,CAAC;AAC7C,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAExE,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,6CAA6C,CAAC;AACnF,OAAO,EACL,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACzB,MAAM,6CAA6C,CAAC;AAErD,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAChE,OAAO,EAAE,KAAK,gBAAgB,EAAE,KAAK,cAAc,EAAE,MAAM,WAAW,CAAC;AAEvE,qBAAa,uBAAwB,YAAW,kBAAkB;IAE9D,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAHV,aAAa,EAAE,gBAAgB,EAC/B,eAAe,EAAE,cAAc,EAC/B,QAAQ,EAAE,OAAO,EACjB,SAAS,CAAC,uBAAW;IAGxC,MAAM,IAAI,MAAM;IAOhB,oBAAoB,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC;IAOhE,KAAK,CAAC,OAAO,EAAE,gBAAgB,EAAE,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,GAAG,OAAO,CAAC,iBAAiB,CAAC;IAkC9G,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,UAAU,CAAC;IAM/C,kBAAkB,IAAI,mBAAmB;IAMnC,sBAAsB,IAAI,OAAO,CAAC,gBAAgB,CAAC;IAenD,MAAM,CAAC,QAAQ,EAAE,iBAAiB,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;CAuBxE"}
@@ -1 +1 @@
1
- {"version":3,"file":"invitation-utils.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/testing/invitation-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAElG,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAgB,UAAU,KAAG,UAU3D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,qBAAqB,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,wBAAwB,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC1C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IACtC,KAAK,EAAE,cAAc,GAAG,eAAe,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;QACzD,KAAK,CAAC,EAAE,0BAA0B,CAAC,wBAAwB,CAAC,CAAC;KAC9D,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhE,eAAO,MAAM,iBAAiB,qCAK3B,uBAAuB,KAAG,CAAC,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAmI7D,CAAC"}
1
+ {"version":3,"file":"invitation-utils.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/testing/invitation-utils.ts"],"names":[],"mappings":"AAKA,OAAO,EAAqB,KAAK,wBAAwB,EAAE,KAAK,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAErH,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAExE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAE7C;;GAEG;AACH,eAAO,MAAM,kBAAkB,eAAgB,UAAU,KAAG,UAE3D,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,GAAG,qBAAqB,CAAC;CAC7D,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG;IAC5B,IAAI,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,GAAG,wBAAwB,CAAC;CACjE,CAAC;AAEF,MAAM,MAAM,0BAA0B,CAAC,CAAC,IAAI;IAC1C,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC5C,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACvC,gBAAgB,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAChD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACzC,WAAW,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IAC3C,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,IAAI,CAAC;CACxC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IACpC,IAAI,EAAE,cAAc,GAAG,cAAc,CAAC;IACtC,KAAK,EAAE,cAAc,GAAG,eAAe,CAAC;IACxC,OAAO,CAAC,EAAE,OAAO,CAAC,UAAU,CAAC,CAAC;IAC9B,KAAK,CAAC,EAAE;QACN,IAAI,CAAC,EAAE,0BAA0B,CAAC,qBAAqB,CAAC,CAAC;QACzD,KAAK,CAAC,EAAE,0BAA0B,CAAC,wBAAwB,CAAC,CAAC;KAC9D,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,MAAM,GAAG;IAAE,UAAU,CAAC,EAAE,UAAU,CAAC;IAAC,KAAK,CAAC,EAAE,KAAK,CAAA;CAAE,CAAC;AAEhE,eAAO,MAAM,iBAAiB,qCAK3B,uBAAuB,KAAG,CAAC,QAAQ,MAAM,CAAC,EAAE,QAAQ,MAAM,CAAC,CAmI7D,CAAC"}
@@ -1,2 +1,2 @@
1
- export declare const DXOS_VERSION = "0.3.11-main.d56f337";
1
+ export declare const DXOS_VERSION = "0.3.11-main.d8b8a39";
2
2
  //# sourceMappingURL=version.d.ts.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/client-services",
3
- "version": "0.3.11-main.d56f337",
3
+ "version": "0.3.11-main.d8b8a39",
4
4
  "description": "DXOS client services implementation",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -22,44 +22,44 @@
22
22
  ],
23
23
  "dependencies": {
24
24
  "platform": "^1.3.6",
25
- "@dxos/async": "0.3.11-main.d56f337",
26
- "@dxos/codec-protobuf": "0.3.11-main.d56f337",
27
- "@dxos/client-protocol": "0.3.11-main.d56f337",
28
- "@dxos/config": "0.3.11-main.d56f337",
29
- "@dxos/context": "0.3.11-main.d56f337",
30
- "@dxos/credentials": "0.3.11-main.d56f337",
31
- "@dxos/crypto": "0.3.11-main.d56f337",
32
- "@dxos/echo-db": "0.3.11-main.d56f337",
33
- "@dxos/document-model": "0.3.11-main.d56f337",
34
- "@dxos/debug": "0.3.11-main.d56f337",
35
- "@dxos/echo-pipeline": "0.3.11-main.d56f337",
36
- "@dxos/feed-store": "0.3.11-main.d56f337",
37
- "@dxos/invariant": "0.3.11-main.d56f337",
38
- "@dxos/echo-schema": "0.3.11-main.d56f337",
39
- "@dxos/keyring": "0.3.11-main.d56f337",
40
- "@dxos/lock-file": "0.3.11-main.d56f337",
41
- "@dxos/log": "0.3.11-main.d56f337",
42
- "@dxos/keys": "0.3.11-main.d56f337",
43
- "@dxos/model-factory": "0.3.11-main.d56f337",
44
- "@dxos/messaging": "0.3.11-main.d56f337",
45
- "@dxos/node-std": "0.3.11-main.d56f337",
46
- "@dxos/network-manager": "0.3.11-main.d56f337",
47
- "@dxos/random-access-storage": "0.3.11-main.d56f337",
48
- "@dxos/protocols": "0.3.11-main.d56f337",
49
- "@dxos/rpc": "0.3.11-main.d56f337",
50
- "@dxos/teleport-extension-gossip": "0.3.11-main.d56f337",
51
- "@dxos/teleport-extension-object-sync": "0.3.11-main.d56f337",
52
- "@dxos/teleport": "0.3.11-main.d56f337",
53
- "@dxos/text-model": "0.3.11-main.d56f337",
54
- "@dxos/timeframe": "0.3.11-main.d56f337",
55
- "@dxos/tracing": "0.3.11-main.d56f337",
56
- "@dxos/websocket-rpc": "0.3.11-main.d56f337",
57
- "@dxos/util": "0.3.11-main.d56f337"
25
+ "@dxos/async": "0.3.11-main.d8b8a39",
26
+ "@dxos/client-protocol": "0.3.11-main.d8b8a39",
27
+ "@dxos/config": "0.3.11-main.d8b8a39",
28
+ "@dxos/credentials": "0.3.11-main.d8b8a39",
29
+ "@dxos/context": "0.3.11-main.d8b8a39",
30
+ "@dxos/codec-protobuf": "0.3.11-main.d8b8a39",
31
+ "@dxos/crypto": "0.3.11-main.d8b8a39",
32
+ "@dxos/debug": "0.3.11-main.d8b8a39",
33
+ "@dxos/document-model": "0.3.11-main.d8b8a39",
34
+ "@dxos/echo-db": "0.3.11-main.d8b8a39",
35
+ "@dxos/echo-pipeline": "0.3.11-main.d8b8a39",
36
+ "@dxos/echo-schema": "0.3.11-main.d8b8a39",
37
+ "@dxos/feed-store": "0.3.11-main.d8b8a39",
38
+ "@dxos/invariant": "0.3.11-main.d8b8a39",
39
+ "@dxos/keyring": "0.3.11-main.d8b8a39",
40
+ "@dxos/lock-file": "0.3.11-main.d8b8a39",
41
+ "@dxos/log": "0.3.11-main.d8b8a39",
42
+ "@dxos/messaging": "0.3.11-main.d8b8a39",
43
+ "@dxos/model-factory": "0.3.11-main.d8b8a39",
44
+ "@dxos/keys": "0.3.11-main.d8b8a39",
45
+ "@dxos/network-manager": "0.3.11-main.d8b8a39",
46
+ "@dxos/node-std": "0.3.11-main.d8b8a39",
47
+ "@dxos/protocols": "0.3.11-main.d8b8a39",
48
+ "@dxos/rpc": "0.3.11-main.d8b8a39",
49
+ "@dxos/teleport": "0.3.11-main.d8b8a39",
50
+ "@dxos/random-access-storage": "0.3.11-main.d8b8a39",
51
+ "@dxos/teleport-extension-object-sync": "0.3.11-main.d8b8a39",
52
+ "@dxos/teleport-extension-gossip": "0.3.11-main.d8b8a39",
53
+ "@dxos/tracing": "0.3.11-main.d8b8a39",
54
+ "@dxos/timeframe": "0.3.11-main.d8b8a39",
55
+ "@dxos/text-model": "0.3.11-main.d8b8a39",
56
+ "@dxos/util": "0.3.11-main.d8b8a39",
57
+ "@dxos/websocket-rpc": "0.3.11-main.d8b8a39"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/platform": "^1.3.4",
61
61
  "@types/readable-stream": "^2.3.9",
62
- "@dxos/signal": "0.3.11-main.d56f337"
62
+ "@dxos/signal": "0.3.11-main.d8b8a39"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public"
@@ -6,6 +6,7 @@ import { expect } from 'chai';
6
6
 
7
7
  import { asyncChain } from '@dxos/async';
8
8
  import { Context } from '@dxos/context';
9
+ import { AlreadyJoinedError } from '@dxos/protocols';
9
10
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
10
11
  import { describe, test, afterTest } from '@dxos/test';
11
12
 
@@ -36,4 +37,17 @@ describe('services/device', () => {
36
37
  await Promise.all(performInvitation({ host, guest, options: { kind: Invitation.Kind.DEVICE } }));
37
38
  expect(guest.identityManager.identity?.identityKey).to.deep.eq(identity1.identityKey);
38
39
  });
40
+
41
+ test('invitation when already joined', async () => {
42
+ const [host, guest] = await asyncChain<ServiceContext>([closeAfterTest])(createPeers(2));
43
+
44
+ const identity1 = await host.createIdentity();
45
+ expect(host.identityManager.identity).to.eq(identity1);
46
+
47
+ await Promise.all(performInvitation({ host, guest, options: { kind: Invitation.Kind.DEVICE } }));
48
+ expect(guest.identityManager.identity?.identityKey).to.deep.eq(identity1.identityKey);
49
+
50
+ const [_, result] = performInvitation({ host, guest, options: { kind: Invitation.Kind.DEVICE } });
51
+ expect((await result).error).to.be.instanceOf(AlreadyJoinedError);
52
+ });
39
53
  });
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { invariant } from '@dxos/invariant';
6
6
  import { type Keyring } from '@dxos/keyring';
7
+ import { AlreadyJoinedError } from '@dxos/protocols';
7
8
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
8
9
  import {
9
10
  type AdmissionRequest,
@@ -46,6 +47,17 @@ export class DeviceInvitationProtocol implements InvitationProtocol {
46
47
  };
47
48
  }
48
49
 
50
+ checkInvitation(invitation: Partial<Invitation>) {
51
+ try {
52
+ const identity = this._getIdentity();
53
+ if (identity) {
54
+ return new AlreadyJoinedError('Currently only one identity per client is supported.');
55
+ }
56
+ } catch {
57
+ // No identity.
58
+ }
59
+ }
60
+
49
61
  createIntroduction(): IntroductionRequest {
50
62
  return {};
51
63
  }
@@ -71,6 +83,8 @@ export class DeviceInvitationProtocol implements InvitationProtocol {
71
83
  invariant(request.device);
72
84
  const { deviceKey, controlFeedKey, dataFeedKey } = request.device;
73
85
 
86
+ // TODO(wittjosiah): When multiple identities are supported, verify identity doesn't already exist before accepting.
87
+
74
88
  await this._acceptIdentity({
75
89
  identityKey,
76
90
  deviceKey,
@@ -2,24 +2,62 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { type Invitation } from '@dxos/protocols/proto/dxos/client/services';
6
- import { type ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
7
- import {
8
- type AdmissionRequest,
9
- type AdmissionResponse,
10
- type IntroductionRequest,
5
+ import type { ApiError } from '@dxos/protocols';
6
+ import type { Invitation } from '@dxos/protocols/proto/dxos/client/services';
7
+ import type { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
8
+ import type {
9
+ AdmissionRequest,
10
+ AdmissionResponse,
11
+ IntroductionRequest,
11
12
  } from '@dxos/protocols/proto/dxos/halo/invitations';
12
13
 
13
14
  export interface InvitationProtocol {
15
+ //
14
16
  // Debugging
17
+ //
18
+
19
+ /**
20
+ * Protocol-specific debug info to include in logs.
21
+ */
15
22
  toJSON(): object;
16
23
 
24
+ //
17
25
  // Host
26
+ //
27
+
28
+ /**
29
+ * Protocol-specific information to include in the invitation.
30
+ */
18
31
  getInvitationContext(): Partial<Invitation> & Pick<Invitation, 'kind'>;
32
+
33
+ /**
34
+ * Once authentication is successful, the host can admit the guest to the requested resource.
35
+ */
19
36
  admit(request: AdmissionRequest, guestProfile?: ProfileDocument): Promise<AdmissionResponse>;
20
37
 
38
+ //
21
39
  // Guest
40
+ //
41
+
42
+ /**
43
+ * Check if the invitation is valid.
44
+ *
45
+ * For example, the guest may already be a member of the space.
46
+ */
47
+ checkInvitation(invitation: Partial<Invitation>): ApiError | undefined;
48
+
49
+ /**
50
+ * Get profile information to send to the host to identify the guest.
51
+ */
22
52
  createIntroduction(): IntroductionRequest;
53
+
54
+ /**
55
+ * Get key information to send to the host in order to create an admission credential for the guest.
56
+ */
23
57
  createAdmissionRequest(): Promise<AdmissionRequest>;
58
+
59
+ /**
60
+ * Redeem the admission credential.
61
+ */
24
62
  accept(response: AdmissionResponse, request: AdmissionRequest): Promise<Partial<Invitation>>;
25
63
  }
@@ -303,9 +303,6 @@ export class InvitationsHandler {
303
303
  }
304
304
  }
305
305
  }
306
- } else {
307
- // Notify that introduction is complete even if auth is not required.
308
- setState({ state: Invitation.State.READY_FOR_AUTHENTICATION });
309
306
  }
310
307
 
311
308
  // 3. Send admission credentials to host (with local space keys).
@@ -355,20 +352,25 @@ export class InvitationsHandler {
355
352
  };
356
353
 
357
354
  scheduleTask(ctx, async () => {
358
- invariant(invitation.swarmKey);
359
- const topic = invitation.swarmKey;
360
- const swarmConnection = await this._networkManager.joinSwarm({
361
- topic,
362
- peerId: PublicKey.random(),
363
- protocolProvider: createTeleportProtocolFactory(async (teleport) => {
364
- teleport.addExtension('dxos.halo.invitations', createExtension());
365
- }),
366
- topology: new StarTopology(topic),
367
- label: 'invitation guest',
368
- });
369
- ctx.onDispose(() => swarmConnection.close());
370
-
371
- setState({ state: Invitation.State.CONNECTING });
355
+ const error = protocol.checkInvitation(invitation);
356
+ if (error) {
357
+ stream.error(error);
358
+ } else {
359
+ invariant(invitation.swarmKey);
360
+ const topic = invitation.swarmKey;
361
+ const swarmConnection = await this._networkManager.joinSwarm({
362
+ topic,
363
+ peerId: PublicKey.random(),
364
+ protocolProvider: createTeleportProtocolFactory(async (teleport) => {
365
+ teleport.addExtension('dxos.halo.invitations', createExtension());
366
+ }),
367
+ topology: new StarTopology(topic),
368
+ label: 'invitation guest',
369
+ });
370
+ ctx.onDispose(() => swarmConnection.close());
371
+
372
+ setState({ state: Invitation.State.CONNECTING });
373
+ }
372
374
  });
373
375
 
374
376
  const observable = new AuthenticatingInvitation({