@dxos/client-services 0.1.46 → 0.1.47

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.
@@ -1 +1 @@
1
- {"version":3,"file":"identity-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,cAAc,EAAE,SAAS,CAAC;IAC1B,WAAW,EAAE,SAAS,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,QAAQ,CAAC,WAAW,cAAe;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;gBAKV,cAAc,EAAE,aAAa,EAC7B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,EAClC,aAAa,EAAE,YAAY;IAG9C,IAAI,QAAQ,yBAEX;IAEK,IAAI;IAoBJ,KAAK;IAIL,cAAc,CAAC,EAAE,WAAW,EAAE,GAAE,qBAA0B;IAmEhE;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,kBAAkB;YA+BjC,kBAAkB;YAwClB,eAAe;CAW9B"}
1
+ {"version":3,"file":"identity-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/identity/identity-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,aAAa,EAAE,YAAY,EAAiB,MAAM,qBAAqB,CAAC;AACjF,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAGnE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAQtC,MAAM,MAAM,kBAAkB,GAAG;IAC/B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,YAAY,EAAE,SAAS,CAAC;IACxB,kBAAkB,EAAE,SAAS,CAAC;IAC9B,cAAc,EAAE,SAAS,CAAC;IAC1B,WAAW,EAAE,SAAS,CAAC;IAEvB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB,CAAC;AAGF,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAVhC,QAAQ,CAAC,WAAW,cAAe;IAEnC,OAAO,CAAC,SAAS,CAAC,CAAW;gBAKV,cAAc,EAAE,aAAa,EAC7B,QAAQ,EAAE,OAAO,EACjB,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC,EAClC,aAAa,EAAE,YAAY;IAG9C,IAAI,QAAQ,yBAEX;IAEK,IAAI;IAoBJ,KAAK;IAIL,cAAc,CAAC,EAAE,WAAW,EAAE,GAAE,qBAA0B;IAmEhE;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,kBAAkB;YA+BjC,kBAAkB;YAwClB,eAAe;CAc9B"}
@@ -1,11 +1,16 @@
1
+ import { Trigger } from '@dxos/async';
1
2
  import { Context } from '@dxos/context';
2
- import { AdmissionRequest, AdmissionResponse, AuthenticationRequest, AuthenticationResponse, IntroductionRequest, IntroductionResponse, InvitationHostService } from '@dxos/protocols/proto/dxos/halo/invitations';
3
+ import { PublicKey } from '@dxos/keys';
4
+ import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
5
+ import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
6
+ import { AdmissionRequest, AdmissionResponse, IntroductionRequest, InvitationHostService } from '@dxos/protocols/proto/dxos/halo/invitations';
3
7
  import { ExtensionContext, RpcExtension } from '@dxos/teleport';
8
+ export declare const MAX_OTP_ATTEMPTS = 3;
4
9
  type InvitationHostExtensionCallbacks = {
5
10
  onOpen: () => void;
6
11
  onError: (error: Error) => void;
7
- introduce: (request: IntroductionRequest) => Promise<IntroductionResponse>;
8
- authenticate: (request: AuthenticationRequest) => Promise<AuthenticationResponse>;
12
+ onStateUpdate: (invitation: Invitation) => void;
13
+ resolveInvitation: (request: IntroductionRequest) => Promise<Invitation | undefined>;
9
14
  admit: (request: AdmissionRequest) => Promise<AdmissionResponse>;
10
15
  };
11
16
  /**
@@ -19,6 +24,17 @@ export declare class InvitationHostExtension extends RpcExtension<{
19
24
  private readonly _callbacks;
20
25
  private _remoteOptions?;
21
26
  private _remoteOptionsTrigger;
27
+ invitation?: Invitation;
28
+ guestProfile?: ProfileDocument;
29
+ authenticationPassed: boolean;
30
+ /**
31
+ * Retry counter for SHARED_SECRET authentication method.
32
+ */
33
+ authenticationRetry: number;
34
+ /**
35
+ * Resolved when admission is completed.
36
+ */
37
+ completedTrigger: Trigger<PublicKey>;
22
38
  constructor(_callbacks: InvitationHostExtensionCallbacks);
23
39
  protected getHandlers(): Promise<{
24
40
  InvitationHostService: InvitationHostService;
@@ -49,5 +65,6 @@ export declare class InvitationGuestExtension extends RpcExtension<{
49
65
  onOpen(context: ExtensionContext): Promise<void>;
50
66
  onClose(): Promise<void>;
51
67
  }
68
+ export declare const isAuthenticationRequired: (invitation: Invitation) => boolean;
52
69
  export {};
53
70
  //# sourceMappingURL=invitation-extension.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"invitation-extension.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-extension.ts"],"names":[],"mappings":"AAOA,OAAO,EAAqB,OAAO,EAAE,MAAM,eAAe,CAAC;AAK3D,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EACjB,qBAAqB,EACrB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACpB,qBAAqB,EAEtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKhE,KAAK,gCAAgC,GAAG;IAEtC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEhC,SAAS,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3E,YAAY,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClF,KAAK,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY,CACvD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAQa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAHvC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;gBAEjB,UAAU,EAAE,gCAAgC;cAWhD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAsClF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAmBhC,OAAO;CAGvB;AAED,KAAK,iCAAiC,GAAG;IAEvC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,YAAY,CACxD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAKa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJvC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;gBAEjB,UAAU,EAAE,iCAAiC;cAWjD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAqBlF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAsBhC,OAAO;CAIvB"}
1
+ {"version":3,"file":"invitation-extension.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitation-extension.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAqB,OAAO,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AACxE,OAAO,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EACL,gBAAgB,EAChB,iBAAiB,EAEjB,mBAAmB,EACnB,qBAAqB,EAEtB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAKhE,eAAO,MAAM,gBAAgB,IAAI,CAAC;AAElC,KAAK,gCAAgC,GAAG;IAEtC,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;IAEhC,aAAa,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,IAAI,CAAC;IAEhD,iBAAiB,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,OAAO,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC;IAErF,KAAK,EAAE,CAAC,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CAClE,CAAC;AAEF;;GAEG;AACH,qBAAa,uBAAwB,SAAQ,YAAY,CACvD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAwBa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAnBvC,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;IAEvC,UAAU,CAAC,EAAE,UAAU,CAAa;IAEpC,YAAY,CAAC,EAAE,eAAe,CAAa;IAE3C,oBAAoB,UAAS;IAEpC;;OAEG;IACI,mBAAmB,SAAK;IAE/B;;OAEG;IACI,gBAAgB,qBAA4B;gBAEtB,UAAU,EAAE,gCAAgC;cAWhD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAuGlF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAmBhC,OAAO;CAGvB;AAED,KAAK,iCAAiC,GAAG;IAEvC,MAAM,EAAE,CAAC,GAAG,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/B,OAAO,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CACjC,CAAC;AAEF;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,YAAY,CACxD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,EAChD;IAAE,qBAAqB,EAAE,qBAAqB,CAAA;CAAE,CACjD;IAKa,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJvC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,cAAc,CAAC,CAAU;IACjC,OAAO,CAAC,qBAAqB,CAAiB;gBAEjB,UAAU,EAAE,iCAAiC;cAWjD,WAAW,IAAI,OAAO,CAAC;QAAE,qBAAqB,EAAE,qBAAqB,CAAA;KAAE,CAAC;IAqBlF,MAAM,CAAC,OAAO,EAAE,gBAAgB;IAsBhC,OAAO;CAIvB;AAED,eAAO,MAAM,wBAAwB,eAAgB,UAAU,YACT,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kCAAkC,EAElC,+BAA+B,EAGhC,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAKxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAI3D;;;;;;;;;;;;;;;;;;;;;;;;;;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,+BAA+B;IAiM9G,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,GAAG,kCAAkC;CA2K3G"}
1
+ {"version":3,"file":"invitations-handler.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/invitations/invitations-handler.ts"],"names":[],"mappings":"AAOA,OAAO,EACL,kCAAkC,EAElC,+BAA+B,EAGhC,MAAM,uBAAuB,CAAC;AAQ/B,OAAO,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AASxE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;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,+BAA+B;IA8I9G,gBAAgB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,UAAU,EAAE,UAAU,GAAG,kCAAkC;CA2K3G"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-space-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA4B,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAS,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,SAAS,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,qBACa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAf7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,SAAgB,OAAO,cAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwD;IAEhF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,aAAa,EAAE,YAAY,EAC3B,cAAc,EAAE,aAAa,EAC7B,yBAAyB,EAAE,wBAAwB,EACnD,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAIrD,IAAI,MAAM,qCAET;IAGK,IAAI;IAsBJ,KAAK;IASX;;OAEG;IAEG,WAAW;IA8BX,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB/D;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,SAAS;YAU/B,eAAe;CA0E9B"}
1
+ {"version":3,"file":"data-space-manager.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA4B,MAAM,aAAa,CAAC;AAE9D,OAAO,EAAE,gBAAgB,EAA0B,MAAM,mBAAmB,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,aAAa,EAAS,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnG,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIvC,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAE1F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAiB,MAAM,YAAY,CAAC;AAGvD,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,EAAE,SAAS,CAAC;IACpB,cAAc,EAAE,SAAS,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,SAAS,CAAC;IAE7B;;;OAGG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC;CAC3B,CAAC;AAEF,qBACa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,UAAU;IAf7B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,SAAgB,OAAO,cAAe;IAEtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAwD;IAEhF,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAGvC,aAAa,EAAE,YAAY,EAC3B,cAAc,EAAE,aAAa,EAC7B,yBAAyB,EAAE,wBAAwB,EACnD,QAAQ,EAAE,OAAO,EACjB,eAAe,EAAE,cAAc,EAC/B,UAAU,EAAE,SAAS,CAAC,WAAW,CAAC;IAIrD,IAAI,MAAM,qCAET;IAGK,IAAI;IAsBJ,KAAK;IASX;;OAEG;IAEG,WAAW;IA8BX,WAAW,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB/D;;;;OAIG;IACG,mBAAmB,CAAC,QAAQ,EAAE,SAAS;YAU/B,eAAe;CA6E9B"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/client-services",
3
- "version": "0.1.46",
3
+ "version": "0.1.47",
4
4
  "description": "DXOS client services implementation",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -20,38 +20,38 @@
20
20
  "src"
21
21
  ],
22
22
  "dependencies": {
23
- "@dxos/async": "0.1.46",
24
- "@dxos/client-protocol": "0.1.46",
25
- "@dxos/codec-protobuf": "0.1.46",
26
- "@dxos/config": "0.1.46",
27
- "@dxos/context": "0.1.46",
28
- "@dxos/credentials": "0.1.46",
29
- "@dxos/crypto": "0.1.46",
30
- "@dxos/debug": "0.1.46",
31
- "@dxos/document-model": "0.1.46",
32
- "@dxos/echo-pipeline": "0.1.46",
33
- "@dxos/echo-db": "0.1.46",
34
- "@dxos/errors": "0.1.46",
35
- "@dxos/feed-store": "0.1.46",
36
- "@dxos/keyring": "0.1.46",
37
- "@dxos/keys": "0.1.46",
38
- "@dxos/log": "0.1.46",
39
- "@dxos/messaging": "0.1.46",
40
- "@dxos/model-factory": "0.1.46",
41
- "@dxos/network-manager": "0.1.46",
42
- "@dxos/node-std": "0.1.46",
43
- "@dxos/protocols": "0.1.46",
44
- "@dxos/random-access-storage": "0.1.46",
45
- "@dxos/rpc": "0.1.46",
46
- "@dxos/teleport": "0.1.46",
47
- "@dxos/teleport-extension-gossip": "0.1.46",
48
- "@dxos/text-model": "0.1.46",
49
- "@dxos/timeframe": "0.1.46",
50
- "@dxos/util": "0.1.46"
23
+ "@dxos/async": "0.1.47",
24
+ "@dxos/client-protocol": "0.1.47",
25
+ "@dxos/codec-protobuf": "0.1.47",
26
+ "@dxos/config": "0.1.47",
27
+ "@dxos/context": "0.1.47",
28
+ "@dxos/credentials": "0.1.47",
29
+ "@dxos/crypto": "0.1.47",
30
+ "@dxos/debug": "0.1.47",
31
+ "@dxos/document-model": "0.1.47",
32
+ "@dxos/echo-db": "0.1.47",
33
+ "@dxos/echo-pipeline": "0.1.47",
34
+ "@dxos/errors": "0.1.47",
35
+ "@dxos/feed-store": "0.1.47",
36
+ "@dxos/keyring": "0.1.47",
37
+ "@dxos/keys": "0.1.47",
38
+ "@dxos/log": "0.1.47",
39
+ "@dxos/messaging": "0.1.47",
40
+ "@dxos/model-factory": "0.1.47",
41
+ "@dxos/network-manager": "0.1.47",
42
+ "@dxos/node-std": "0.1.47",
43
+ "@dxos/protocols": "0.1.47",
44
+ "@dxos/random-access-storage": "0.1.47",
45
+ "@dxos/rpc": "0.1.47",
46
+ "@dxos/teleport": "0.1.47",
47
+ "@dxos/teleport-extension-gossip": "0.1.47",
48
+ "@dxos/text-model": "0.1.47",
49
+ "@dxos/timeframe": "0.1.47",
50
+ "@dxos/util": "0.1.47"
51
51
  },
52
52
  "devDependencies": {
53
53
  "@types/readable-stream": "^2.3.9",
54
- "@dxos/signal": "0.1.46"
54
+ "@dxos/signal": "0.1.47"
55
55
  },
56
56
  "publishConfig": {
57
57
  "access": "public"
@@ -238,6 +238,9 @@ export class IdentityManager {
238
238
  },
239
239
  swarmIdentity,
240
240
  onNetworkConnection: () => {},
241
+ onAuthFailure: () => {
242
+ log.warn('auth failure');
243
+ },
241
244
  memberKey: identityKey,
242
245
  });
243
246
  }
@@ -10,13 +10,13 @@ import { InvalidInvitationExtensionRoleError } from '@dxos/errors';
10
10
  import { PublicKey } from '@dxos/keys';
11
11
  import { log } from '@dxos/log';
12
12
  import { schema, trace } from '@dxos/protocols';
13
+ import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
14
+ import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
13
15
  import {
14
16
  AdmissionRequest,
15
17
  AdmissionResponse,
16
- AuthenticationRequest,
17
18
  AuthenticationResponse,
18
19
  IntroductionRequest,
19
- IntroductionResponse,
20
20
  InvitationHostService,
21
21
  Options,
22
22
  } from '@dxos/protocols/proto/dxos/halo/invitations';
@@ -25,13 +25,17 @@ import { ExtensionContext, RpcExtension } from '@dxos/teleport';
25
25
  /// Timeout for the options exchange.
26
26
  const OPTIONS_TIMEOUT = 10_000;
27
27
 
28
+ export const MAX_OTP_ATTEMPTS = 3;
29
+
28
30
  type InvitationHostExtensionCallbacks = {
29
31
  // Deliberately not async to not block the extensions opening.
30
32
  onOpen: () => void;
31
33
  onError: (error: Error) => void;
32
34
 
33
- introduce: (request: IntroductionRequest) => Promise<IntroductionResponse>;
34
- authenticate: (request: AuthenticationRequest) => Promise<AuthenticationResponse>;
35
+ onStateUpdate: (invitation: Invitation) => void;
36
+
37
+ resolveInvitation: (request: IntroductionRequest) => Promise<Invitation | undefined>;
38
+
35
39
  admit: (request: AdmissionRequest) => Promise<AdmissionResponse>;
36
40
  };
37
41
 
@@ -49,6 +53,22 @@ export class InvitationHostExtension extends RpcExtension<
49
53
  private _remoteOptions?: Options;
50
54
  private _remoteOptionsTrigger = new Trigger();
51
55
 
56
+ public invitation?: Invitation = undefined;
57
+
58
+ public guestProfile?: ProfileDocument = undefined;
59
+
60
+ public authenticationPassed = false;
61
+
62
+ /**
63
+ * Retry counter for SHARED_SECRET authentication method.
64
+ */
65
+ public authenticationRetry = 0;
66
+
67
+ /**
68
+ * Resolved when admission is completed.
69
+ */
70
+ public completedTrigger = new Trigger<PublicKey>();
71
+
52
72
  constructor(private readonly _callbacks: InvitationHostExtensionCallbacks) {
53
73
  super({
54
74
  requested: {
@@ -72,27 +92,92 @@ export class InvitationHostExtension extends RpcExtension<
72
92
  },
73
93
 
74
94
  introduce: async (request) => {
95
+ const { profile, invitationId } = request;
96
+
75
97
  const traceId = PublicKey.random().toHex();
76
98
  log.trace('dxos.sdk.invitation-handler.host.introduce', trace.begin({ id: traceId }));
77
- const response = await this._callbacks.introduce(request);
99
+
100
+ const invitation = await this._callbacks.resolveInvitation(request);
101
+ if (!invitation) {
102
+ log.warn('invitation not found', { invitationId });
103
+ this._callbacks.onError(new Error('Invitation not found.'));
104
+ // TODO(dmaretskyi): Better error handling.
105
+ return {
106
+ authMethod: Invitation.AuthMethod.NONE,
107
+ };
108
+ }
109
+ this.invitation = invitation;
110
+
111
+ log('guest introduced itself', {
112
+ guestProfile: profile,
113
+ });
114
+ this.guestProfile = profile;
115
+
116
+ this._callbacks.onStateUpdate({ ...this.invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });
117
+
78
118
  log.trace('dxos.sdk.invitation-handler.host.introduce', trace.end({ id: traceId }));
79
- return response;
119
+ return {
120
+ spaceKey: this.invitation.authMethod === Invitation.AuthMethod.NONE ? this.invitation.spaceKey : undefined,
121
+ authMethod: this.invitation.authMethod,
122
+ };
80
123
  },
81
124
 
82
- authenticate: async (request) => {
125
+ authenticate: async ({ authCode: code }) => {
83
126
  const traceId = PublicKey.random().toHex();
84
127
  log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.begin({ id: traceId }));
85
- const response = await this._callbacks.authenticate(request);
86
- log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.end({ id: traceId, data: { ...response } }));
87
- return response;
128
+ log('received authentication request', { authCode: code });
129
+ let status = AuthenticationResponse.Status.OK;
130
+
131
+ assert(this.invitation, 'Invitation is not set.');
132
+ switch (this.invitation.authMethod) {
133
+ case Invitation.AuthMethod.NONE: {
134
+ log('authentication not required');
135
+ return { status: AuthenticationResponse.Status.OK };
136
+ }
137
+
138
+ case Invitation.AuthMethod.SHARED_SECRET: {
139
+ if (this.invitation.authCode) {
140
+ if (this.authenticationRetry++ > MAX_OTP_ATTEMPTS) {
141
+ status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;
142
+ } else if (code !== this.invitation.authCode) {
143
+ status = AuthenticationResponse.Status.INVALID_OTP;
144
+ } else {
145
+ this.authenticationPassed = true;
146
+ }
147
+ }
148
+ break;
149
+ }
150
+
151
+ default: {
152
+ log.error('invalid authentication method', { authMethod: this.invitation.authMethod });
153
+ status = AuthenticationResponse.Status.INTERNAL_ERROR;
154
+ break;
155
+ }
156
+ }
157
+
158
+ log.trace('dxos.sdk.invitation-handler.host.authenticate', trace.end({ id: traceId, data: { status } }));
159
+ return { status };
88
160
  },
89
161
 
90
162
  admit: async (request) => {
91
163
  const traceId = PublicKey.random().toHex();
92
164
  log.trace('dxos.sdk.invitation-handler.host.admit', trace.begin({ id: traceId }));
93
- const response = await this._callbacks.admit(request);
94
- log.trace('dxos.sdk.invitation-handler.host.admit', trace.end({ id: traceId }));
95
- return response;
165
+
166
+ try {
167
+ assert(this.invitation, 'Invitation is not set.');
168
+ // Check authenticated.
169
+ if (isAuthenticationRequired(this.invitation) && !this.authenticationPassed) {
170
+ throw new Error('Not authenticated');
171
+ }
172
+
173
+ const response = await this._callbacks.admit(request);
174
+
175
+ log.trace('dxos.sdk.invitation-handler.host.admit', trace.end({ id: traceId }));
176
+ return response;
177
+ } catch (err: any) {
178
+ this._callbacks.onError(err);
179
+ throw err;
180
+ }
96
181
  },
97
182
  },
98
183
  };
@@ -198,3 +283,6 @@ export class InvitationGuestExtension extends RpcExtension<
198
283
  await this._ctx.dispose();
199
284
  }
200
285
  }
286
+
287
+ export const isAuthenticationRequired = (invitation: Invitation) =>
288
+ invitation.authMethod !== Invitation.AuthMethod.NONE;
@@ -20,14 +20,16 @@ import { log } from '@dxos/log';
20
20
  import { createTeleportProtocolFactory, NetworkManager, StarTopology } from '@dxos/network-manager';
21
21
  import { trace } from '@dxos/protocols';
22
22
  import { Invitation } from '@dxos/protocols/proto/dxos/client/services';
23
- import { ProfileDocument } from '@dxos/protocols/proto/dxos/halo/credentials';
24
23
  import { AuthenticationResponse } from '@dxos/protocols/proto/dxos/halo/invitations';
25
24
 
26
- import { InvitationGuestExtension, InvitationHostExtension } from './invitation-extension';
25
+ import {
26
+ InvitationGuestExtension,
27
+ InvitationHostExtension,
28
+ isAuthenticationRequired,
29
+ MAX_OTP_ATTEMPTS,
30
+ } from './invitation-extension';
27
31
  import { InvitationProtocol } from './invitation-protocol';
28
32
 
29
- const MAX_OTP_ATTEMPTS = 3;
30
-
31
33
  /**
32
34
  * Generic handler for Halo and Space invitations.
33
35
  * Handles the life-cycle of invitations between peers.
@@ -101,77 +103,26 @@ export class InvitationsHandler {
101
103
 
102
104
  // Called for every connecting peer.
103
105
  const createExtension = (): InvitationHostExtension => {
104
- const success = new Trigger<PublicKey>();
105
- let guestProfile: ProfileDocument | undefined;
106
- let authenticationPassed = false;
107
- let authenticationRetry = 0;
108
-
109
106
  const extension = new InvitationHostExtension({
110
- introduce: async ({ profile }) => {
111
- log('guest introduced itself', {
112
- guestProfile: profile,
113
- ...protocol.toJSON(),
114
- });
115
-
116
- guestProfile = profile;
117
-
118
- // TODO(dmaretskyi): Should we expose guest's profile in this callback?
107
+ onStateUpdate: (invitation) => {
119
108
  stream.next({ ...invitation, state: Invitation.State.READY_FOR_AUTHENTICATION });
120
-
121
- // TODO(wittjosiah): Make when the space details are revealed configurable.
122
- // Spaces may want to have public details (name, member count, etc.) or hide that until guest is authed.
123
- return {
124
- spaceKey: authMethod === Invitation.AuthMethod.NONE ? protocol.getInvitationContext().spaceKey : undefined,
125
- authMethod,
126
- };
127
109
  },
128
110
 
129
- authenticate: async ({ authCode: code }) => {
130
- log('received authentication request', { authCode: code });
131
- let status = AuthenticationResponse.Status.OK;
132
-
133
- switch (invitation.authMethod) {
134
- case Invitation.AuthMethod.NONE: {
135
- log('authentication not required');
136
- return { status: AuthenticationResponse.Status.OK };
137
- }
138
-
139
- case Invitation.AuthMethod.SHARED_SECRET: {
140
- if (invitation.authCode) {
141
- if (authenticationRetry++ > MAX_OTP_ATTEMPTS) {
142
- status = AuthenticationResponse.Status.INVALID_OPT_ATTEMPTS;
143
- } else if (code !== invitation.authCode) {
144
- status = AuthenticationResponse.Status.INVALID_OTP;
145
- } else {
146
- authenticationPassed = true;
147
- }
148
- }
149
- break;
150
- }
151
-
152
- default: {
153
- log.error('invalid authentication method', { authMethod: invitation.authMethod });
154
- status = AuthenticationResponse.Status.INTERNAL_ERROR;
155
- break;
156
- }
111
+ resolveInvitation: async ({ invitationId }) => {
112
+ if (invitationId && invitationId !== invitation.invitationId) {
113
+ return undefined;
157
114
  }
158
-
159
- return { status };
115
+ return invitation;
160
116
  },
161
117
 
162
118
  admit: async (admissionRequest) => {
163
119
  try {
164
- // Check authenticated.
165
- if (isAuthenticationRequired(invitation) && !authenticationPassed) {
166
- throw new Error('Not authenticated');
167
- }
168
-
169
120
  const deviceKey = admissionRequest.device?.deviceKey ?? admissionRequest.space?.deviceKey;
170
121
  assert(deviceKey);
171
- const admissionResponse = await protocol.admit(admissionRequest, guestProfile);
122
+ const admissionResponse = await protocol.admit(admissionRequest, extension.guestProfile);
172
123
 
173
124
  // Updating credentials complete.
174
- success.wake(deviceKey);
125
+ extension.completedTrigger.wake(deviceKey);
175
126
 
176
127
  return admissionResponse;
177
128
  } catch (err: any) {
@@ -188,7 +139,7 @@ export class InvitationsHandler {
188
139
  log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.begin({ id: traceId }));
189
140
  log('connected', { ...protocol.toJSON() });
190
141
  stream.next({ ...invitation, state: Invitation.State.CONNECTED });
191
- const deviceKey = await success.wait({ timeout });
142
+ const deviceKey = await extension.completedTrigger.wait({ timeout });
192
143
  log('admitted guest', { guest: deviceKey, ...protocol.toJSON() });
193
144
  stream.next({ ...invitation, state: Invitation.State.SUCCESS });
194
145
  log.trace('dxos.sdk.invitations-handler.host.onOpen', trace.end({ id: traceId }));
@@ -426,5 +377,3 @@ export class InvitationsHandler {
426
377
  return observable;
427
378
  }
428
379
  }
429
-
430
- const isAuthenticationRequired = (invitation: Invitation) => invitation.authMethod !== Invitation.AuthMethod.NONE;
@@ -208,6 +208,9 @@ export class DataSpaceManager {
208
208
  session.addExtension('dxos.mesh.teleport.objectsync', space.snapshotManager.objectSync.createExtension());
209
209
  session.addExtension('dxos.mesh.teleport.notarization', dataSpace.notarizationPlugin.createExtension());
210
210
  },
211
+ onAuthFailure: () => {
212
+ log.warn('auth failure');
213
+ },
211
214
  memberKey: this._signingContext.identityKey,
212
215
  });
213
216
  controlFeed && space.setControlFeed(controlFeed);