@dxos/client-services 0.4.7-next.f4b92be → 0.4.8-main.ac78619

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 (37) hide show
  1. package/dist/lib/browser/{chunk-NTKD4OQC.mjs → chunk-5DNT7O4B.mjs} +303 -136
  2. package/dist/lib/browser/chunk-5DNT7O4B.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3 -1
  4. package/dist/lib/browser/index.mjs.map +1 -1
  5. package/dist/lib/browser/meta.json +1 -1
  6. package/dist/lib/browser/packlets/testing/index.mjs +1 -1
  7. package/dist/lib/node/{chunk-GCIW4VHF.cjs → chunk-IIMBD24E.cjs} +273 -105
  8. package/dist/lib/node/chunk-IIMBD24E.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +39 -37
  10. package/dist/lib/node/index.cjs.map +1 -1
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/packlets/testing/index.cjs +8 -8
  13. package/dist/types/src/packlets/invitations/invitations-handler.d.ts +1 -0
  14. package/dist/types/src/packlets/invitations/invitations-handler.d.ts.map +1 -1
  15. package/dist/types/src/packlets/invitations/invitations-service.d.ts +9 -1
  16. package/dist/types/src/packlets/invitations/invitations-service.d.ts.map +1 -1
  17. package/dist/types/src/packlets/logging/logging-service.d.ts +1 -0
  18. package/dist/types/src/packlets/logging/logging-service.d.ts.map +1 -1
  19. package/dist/types/src/packlets/services/service-host.d.ts.map +1 -1
  20. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts +2 -0
  21. package/dist/types/src/packlets/spaces/automerge-space-state.d.ts.map +1 -1
  22. package/dist/types/src/packlets/spaces/data-space.d.ts.map +1 -1
  23. package/dist/types/src/packlets/spaces/spaces-service.d.ts +1 -1
  24. package/dist/types/src/packlets/spaces/spaces-service.d.ts.map +1 -1
  25. package/dist/types/src/version.d.ts +1 -1
  26. package/package.json +35 -35
  27. package/src/packlets/identity/identity-manager.ts +1 -1
  28. package/src/packlets/invitations/invitations-handler.ts +37 -2
  29. package/src/packlets/invitations/invitations-service.ts +83 -5
  30. package/src/packlets/logging/logging-service.ts +9 -2
  31. package/src/packlets/services/service-host.ts +9 -2
  32. package/src/packlets/spaces/automerge-space-state.ts +15 -0
  33. package/src/packlets/spaces/data-space.ts +33 -11
  34. package/src/packlets/spaces/spaces-service.ts +2 -2
  35. package/src/version.ts +1 -1
  36. package/dist/lib/browser/chunk-NTKD4OQC.mjs.map +0 -7
  37. package/dist/lib/node/chunk-GCIW4VHF.cjs.map +0 -7
@@ -6,6 +6,7 @@ import { type LogEntry, type LoggingService, QueryLogsRequest, type ControlMetri
6
6
  export declare class LoggingServiceImpl implements LoggingService {
7
7
  private readonly _logs;
8
8
  private readonly _started;
9
+ private readonly _sessionId;
9
10
  open(): Promise<void>;
10
11
  close(): Promise<void>;
11
12
  controlMetrics({ reset, record }: ControlMetricsRequest): Promise<ControlMetricsResponse>;
@@ -1 +1 @@
1
- {"version":3,"file":"logging-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/logging/logging-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAQ9C,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,cAAc,EAEnB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,4CAA4C,CAAC;AAGpD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IAEjC,IAAI;IAIJ,KAAK;IAKL,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAc/F;;OAEG;IACH,YAAY,CAAC,EAAE,QAAgB,EAAE,EAAE,mBAAmB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IA+BrF,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;IA4CtD,OAAO,CAAC,aAAa,CAEnB;CACH"}
1
+ {"version":3,"file":"logging-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/logging/logging-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAS9C,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,cAAc,EAEnB,gBAAgB,EAChB,KAAK,qBAAqB,EAC1B,KAAK,sBAAsB,EAC3B,KAAK,mBAAmB,EACxB,KAAK,oBAAoB,EAC1B,MAAM,4CAA4C,CAAC;AAGpD;;GAEG;AACH,qBAAa,kBAAmB,YAAW,cAAc;IACvD,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;IACtD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAc;IACvC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA8B;IAEnD,IAAI;IAIJ,KAAK;IAKL,cAAc,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,qBAAqB,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAc/F;;OAEG;IACH,YAAY,CAAC,EAAE,QAAgB,EAAE,EAAE,mBAAmB,GAAG,MAAM,CAAC,oBAAoB,CAAC;IA+BrF,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC;IAiDtD,OAAO,CAAC,aAAa,CAEnB;CACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"service-host.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-host.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"service-host.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/services/service-host.ts"],"names":[],"mappings":"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"}
@@ -4,7 +4,9 @@ export declare class AutomergeSpaceState implements CredentialProcessor {
4
4
  private readonly _onNewRoot;
5
5
  rootUrl: string | undefined;
6
6
  lastEpoch: SpecificCredential<Epoch> | undefined;
7
+ private _isProcessingRootDocs;
7
8
  constructor(_onNewRoot: (rootUrl: string) => void);
8
9
  processCredential(credential: Credential): Promise<void>;
10
+ startProcessingRootDocs(): void;
9
11
  }
10
12
  //# sourceMappingURL=automerge-space-state.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"automerge-space-state.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/automerge-space-state.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,6CAA6C,CAAC;AAE1F,qBAAa,mBAAoB,YAAW,mBAAmB;IAIjD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAHhC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IACxC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAa;gBAEvC,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAE5D,iBAAiB,CAAC,UAAU,EAAE,UAAU;CAY/C"}
1
+ {"version":3,"file":"automerge-space-state.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/automerge-space-state.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,mBAAmB,EAAE,KAAK,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,6CAA6C,CAAC;AAE1F,qBAAa,mBAAoB,YAAW,mBAAmB;IAMjD,OAAO,CAAC,QAAQ,CAAC,UAAU;IALhC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAa;IACxC,SAAS,EAAE,kBAAkB,CAAC,KAAK,CAAC,GAAG,SAAS,CAAa;IAEpE,OAAO,CAAC,qBAAqB,CAAS;gBAET,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI;IAE5D,iBAAiB,CAAC,UAAU,EAAE,UAAU;IAe9C,uBAAuB;CAUxB"}
@@ -1 +1 @@
1
- {"version":3,"file":"data-space.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"data-space.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/data-space.ts"],"names":[],"mappings":"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"}
@@ -19,7 +19,7 @@ export declare class SpacesServiceImpl implements SpacesService {
19
19
  subscribeMessages({ spaceKey, channel }: SubscribeMessagesRequest): Stream<GossipMessage>;
20
20
  queryCredentials({ spaceKey, noTail }: QueryCredentialsRequest): Stream<Credential>;
21
21
  writeCredentials({ spaceKey, credentials }: WriteCredentialsRequest): Promise<void>;
22
- createEpoch({ spaceKey }: CreateEpochRequest): Promise<void>;
22
+ createEpoch({ spaceKey, migration }: CreateEpochRequest): Promise<void>;
23
23
  private _serializeSpace;
24
24
  }
25
25
  //# sourceMappingURL=spaces-service.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"spaces-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/spaces-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIvF,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,KAAK,EAGV,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,qBAAa,iBAAkB,YAAW,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAHpB,gBAAgB,EAAE,eAAe,EACjC,aAAa,EAAE,YAAY,EAC3B,yBAAyB,EAAE,wBAAwB,EACnD,oBAAoB,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAGtE,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAU7B,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,kBAAkB;IAmBzD,WAAW,IAAI,MAAM,CAAC,mBAAmB,CAAC;IAqDpC,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB;IAMpE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,wBAAwB;IAajE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,uBAAuB,GAAG,MAAM,CAAC,UAAU,CAAC;IAmB7E,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,uBAAuB;IAmBnE,WAAW,CAAC,EAAE,QAAQ,EAAE,EAAE,kBAAkB;IAMlD,OAAO,CAAC,eAAe;CA8CxB"}
1
+ {"version":3,"file":"spaces-service.d.ts","sourceRoot":"","sources":["../../../../../src/packlets/spaces/spaces-service.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAG9C,OAAO,EAAE,KAAK,wBAAwB,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAIvF,OAAO,EACL,KAAK,kBAAkB,EACvB,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC5B,KAAK,mBAAmB,EACxB,KAAK,KAAK,EAGV,KAAK,aAAa,EAClB,KAAK,wBAAwB,EAC7B,KAAK,kBAAkB,EACvB,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAC9E,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iDAAiD,CAAC;AACrF,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAG3C,OAAO,EAAE,KAAK,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAC7D,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,qBAAa,iBAAkB,YAAW,aAAa;IAEnD,OAAO,CAAC,QAAQ,CAAC,gBAAgB;IACjC,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,yBAAyB;IAC1C,OAAO,CAAC,QAAQ,CAAC,oBAAoB;gBAHpB,gBAAgB,EAAE,eAAe,EACjC,aAAa,EAAE,YAAY,EAC3B,yBAAyB,EAAE,wBAAwB,EACnD,oBAAoB,EAAE,QAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC;IAGtE,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAU7B,WAAW,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,kBAAkB;IAmBzD,WAAW,IAAI,MAAM,CAAC,mBAAmB,CAAC;IAqDpC,WAAW,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE,EAAE,kBAAkB;IAMpE,iBAAiB,CAAC,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,wBAAwB;IAajE,gBAAgB,CAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,uBAAuB,GAAG,MAAM,CAAC,UAAU,CAAC;IAmB7E,gBAAgB,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,uBAAuB;IAmBnE,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,kBAAkB;IAM7D,OAAO,CAAC,eAAe;CA8CxB"}
@@ -1,2 +1,2 @@
1
- export declare const DXOS_VERSION = "0.4.7-next.f4b92be";
1
+ export declare const DXOS_VERSION = "0.4.8-main.ac78619";
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.4.7-next.f4b92be",
3
+ "version": "0.4.8-main.ac78619",
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.4.7-next.f4b92be",
26
- "@dxos/client-protocol": "0.4.7-next.f4b92be",
27
- "@dxos/codec-protobuf": "0.4.7-next.f4b92be",
28
- "@dxos/config": "0.4.7-next.f4b92be",
29
- "@dxos/context": "0.4.7-next.f4b92be",
30
- "@dxos/credentials": "0.4.7-next.f4b92be",
31
- "@dxos/crypto": "0.4.7-next.f4b92be",
32
- "@dxos/debug": "0.4.7-next.f4b92be",
33
- "@dxos/echo-pipeline": "0.4.7-next.f4b92be",
34
- "@dxos/document-model": "0.4.7-next.f4b92be",
35
- "@dxos/echo-db": "0.4.7-next.f4b92be",
36
- "@dxos/echo-schema": "0.4.7-next.f4b92be",
37
- "@dxos/feed-store": "0.4.7-next.f4b92be",
38
- "@dxos/invariant": "0.4.7-next.f4b92be",
39
- "@dxos/keyring": "0.4.7-next.f4b92be",
40
- "@dxos/keys": "0.4.7-next.f4b92be",
41
- "@dxos/lock-file": "0.4.7-next.f4b92be",
42
- "@dxos/log": "0.4.7-next.f4b92be",
43
- "@dxos/messaging": "0.4.7-next.f4b92be",
44
- "@dxos/network-manager": "0.4.7-next.f4b92be",
45
- "@dxos/node-std": "0.4.7-next.f4b92be",
46
- "@dxos/model-factory": "0.4.7-next.f4b92be",
47
- "@dxos/protocols": "0.4.7-next.f4b92be",
48
- "@dxos/random-access-storage": "0.4.7-next.f4b92be",
49
- "@dxos/rpc": "0.4.7-next.f4b92be",
50
- "@dxos/teleport": "0.4.7-next.f4b92be",
51
- "@dxos/teleport-extension-gossip": "0.4.7-next.f4b92be",
52
- "@dxos/teleport-extension-object-sync": "0.4.7-next.f4b92be",
53
- "@dxos/text-model": "0.4.7-next.f4b92be",
54
- "@dxos/timeframe": "0.4.7-next.f4b92be",
55
- "@dxos/tracing": "0.4.7-next.f4b92be",
56
- "@dxos/websocket-rpc": "0.4.7-next.f4b92be",
57
- "@dxos/util": "0.4.7-next.f4b92be"
25
+ "@dxos/async": "0.4.8-main.ac78619",
26
+ "@dxos/client-protocol": "0.4.8-main.ac78619",
27
+ "@dxos/codec-protobuf": "0.4.8-main.ac78619",
28
+ "@dxos/config": "0.4.8-main.ac78619",
29
+ "@dxos/context": "0.4.8-main.ac78619",
30
+ "@dxos/credentials": "0.4.8-main.ac78619",
31
+ "@dxos/crypto": "0.4.8-main.ac78619",
32
+ "@dxos/debug": "0.4.8-main.ac78619",
33
+ "@dxos/document-model": "0.4.8-main.ac78619",
34
+ "@dxos/echo-db": "0.4.8-main.ac78619",
35
+ "@dxos/echo-pipeline": "0.4.8-main.ac78619",
36
+ "@dxos/feed-store": "0.4.8-main.ac78619",
37
+ "@dxos/invariant": "0.4.8-main.ac78619",
38
+ "@dxos/echo-schema": "0.4.8-main.ac78619",
39
+ "@dxos/keyring": "0.4.8-main.ac78619",
40
+ "@dxos/keys": "0.4.8-main.ac78619",
41
+ "@dxos/lock-file": "0.4.8-main.ac78619",
42
+ "@dxos/messaging": "0.4.8-main.ac78619",
43
+ "@dxos/log": "0.4.8-main.ac78619",
44
+ "@dxos/model-factory": "0.4.8-main.ac78619",
45
+ "@dxos/node-std": "0.4.8-main.ac78619",
46
+ "@dxos/network-manager": "0.4.8-main.ac78619",
47
+ "@dxos/protocols": "0.4.8-main.ac78619",
48
+ "@dxos/random-access-storage": "0.4.8-main.ac78619",
49
+ "@dxos/rpc": "0.4.8-main.ac78619",
50
+ "@dxos/teleport": "0.4.8-main.ac78619",
51
+ "@dxos/teleport-extension-gossip": "0.4.8-main.ac78619",
52
+ "@dxos/teleport-extension-object-sync": "0.4.8-main.ac78619",
53
+ "@dxos/text-model": "0.4.8-main.ac78619",
54
+ "@dxos/tracing": "0.4.8-main.ac78619",
55
+ "@dxos/util": "0.4.8-main.ac78619",
56
+ "@dxos/timeframe": "0.4.8-main.ac78619",
57
+ "@dxos/websocket-rpc": "0.4.8-main.ac78619"
58
58
  },
59
59
  "devDependencies": {
60
60
  "@types/platform": "^1.3.4",
61
61
  "@types/readable-stream": "^2.3.9",
62
- "@dxos/signal": "0.4.7-next.f4b92be"
62
+ "@dxos/signal": "0.4.8-main.ac78619"
63
63
  },
64
64
  "publishConfig": {
65
65
  "access": "public"
@@ -348,7 +348,7 @@ export class IdentityManager {
348
348
  identityKey: identityRecord.identityKey,
349
349
  });
350
350
  await space.setControlFeed(controlFeed);
351
- void space.setDataFeed(dataFeed); // TODO(dmaretskyi): Should this be awaited?
351
+ await space.setDataFeed(dataFeed);
352
352
 
353
353
  const identity: Identity = new Identity({
354
354
  space,
@@ -74,6 +74,9 @@ export class InvitationsHandler {
74
74
  state = Invitation.State.INIT,
75
75
  timeout = INVITATION_TIMEOUT,
76
76
  swarmKey = PublicKey.random(),
77
+ persistent = true,
78
+ created = new Date(),
79
+ lifetime = 86400, // 1 day
77
80
  } = options ?? {};
78
81
  const authCode =
79
82
  options?.authCode ??
@@ -88,14 +91,17 @@ export class InvitationsHandler {
88
91
  swarmKey,
89
92
  authCode,
90
93
  timeout,
94
+ persistent,
95
+ created,
96
+ lifetime,
91
97
  ...protocol.getInvitationContext(),
92
98
  };
93
99
 
94
100
  const stream = new PushStream<Invitation>();
95
101
  const ctx = new Context({
96
102
  onError: (err) => {
97
- void ctx.dispose();
98
103
  stream.error(err);
104
+ void ctx.dispose();
99
105
  },
100
106
  });
101
107
 
@@ -181,7 +187,27 @@ export class InvitationsHandler {
181
187
  return extension;
182
188
  };
183
189
 
190
+ if (invitation.lifetime && invitation.created && invitation.lifetime !== 0) {
191
+ if (invitation.created.getTime() + invitation.lifetime * 1000 < Date.now()) {
192
+ log.warn('invitation has already expired');
193
+ } else {
194
+ scheduleTask(
195
+ ctx,
196
+ async () => {
197
+ // ensure the swarm is closed before changing state and closing the stream.
198
+ await swarmConnection.close();
199
+ stream.next({ ...invitation, state: Invitation.State.EXPIRED });
200
+ await ctx.dispose();
201
+ },
202
+ invitation.created.getTime() + invitation.lifetime * 1000 - Date.now(),
203
+ );
204
+ }
205
+ }
206
+
184
207
  let swarmConnection: SwarmConnection;
208
+ const invitationLabel =
209
+ 'invitation host for ' +
210
+ (invitation.kind === Invitation.Kind.DEVICE ? 'device' : `space ${invitation.spaceKey?.truncate()}`);
185
211
  scheduleTask(ctx, async () => {
186
212
  const topic = invitation.swarmKey!;
187
213
  swarmConnection = await this._networkManager.joinSwarm({
@@ -191,7 +217,7 @@ export class InvitationsHandler {
191
217
  teleport.addExtension('dxos.halo.invitations', createExtension());
192
218
  }),
193
219
  topology: new StarTopology(topic),
194
- label: 'invitation host',
220
+ label: invitationLabel,
195
221
  });
196
222
  ctx.onDispose(() => swarmConnection.close());
197
223
 
@@ -398,3 +424,12 @@ export class InvitationsHandler {
398
424
  return observable;
399
425
  }
400
426
  }
427
+
428
+ export const invitationExpired = (invitation: Invitation) => {
429
+ return (
430
+ invitation.created &&
431
+ invitation.lifetime &&
432
+ invitation.lifetime !== 0 &&
433
+ invitation.created.getTime() + invitation.lifetime * 1000 < Date.now()
434
+ );
435
+ };
@@ -2,9 +2,11 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { Event } from '@dxos/async';
5
+ import { Event, scheduleTask } from '@dxos/async';
6
6
  import { type AuthenticatingInvitation, type CancellableInvitation } from '@dxos/client-protocol';
7
7
  import { Stream } from '@dxos/codec-protobuf';
8
+ import { Context } from '@dxos/context';
9
+ import { type MetadataStore } from '@dxos/echo-pipeline';
8
10
  import { invariant } from '@dxos/invariant';
9
11
  import { log } from '@dxos/log';
10
12
  import {
@@ -16,7 +18,7 @@ import {
16
18
  } from '@dxos/protocols/proto/dxos/client/services';
17
19
 
18
20
  import { type InvitationProtocol } from './invitation-protocol';
19
- import { type InvitationsHandler } from './invitations-handler';
21
+ import { invitationExpired, type InvitationsHandler } from './invitations-handler';
20
22
 
21
23
  /**
22
24
  * Adapts invitation service observable to client/service stream.
@@ -28,10 +30,14 @@ export class InvitationsServiceImpl implements InvitationsService {
28
30
  private readonly _invitationAccepted = new Event<Invitation>();
29
31
  private readonly _removedCreated = new Event<Invitation>();
30
32
  private readonly _removedAccepted = new Event<Invitation>();
33
+ private readonly _saved = new Event<Invitation>();
34
+ private readonly _persistentInvitationsLoadedEvent = new Event();
35
+ private _persistentInvitationsLoaded = false;
31
36
 
32
37
  constructor(
33
38
  private readonly _invitationsHandler: InvitationsHandler,
34
39
  private readonly _getHandler: (invitation: Invitation) => InvitationProtocol,
40
+ private readonly _metadataStore: MetadataStore,
35
41
  ) {}
36
42
 
37
43
  // TODO(burdon): Guest/host label.
@@ -44,6 +50,7 @@ export class InvitationsServiceImpl implements InvitationsService {
44
50
  createInvitation(options: Invitation): Stream<Invitation> {
45
51
  let invitation: CancellableInvitation;
46
52
 
53
+ const savePersistentInvitationCtx = new Context();
47
54
  const existingInvitation = this._createInvitations.get(options.invitationId);
48
55
  if (existingInvitation) {
49
56
  invitation = existingInvitation;
@@ -55,15 +62,34 @@ export class InvitationsServiceImpl implements InvitationsService {
55
62
  }
56
63
 
57
64
  return new Stream<Invitation>(({ next, close }) => {
65
+ if (invitation.get().persistent) {
66
+ scheduleTask(savePersistentInvitationCtx, async () => {
67
+ try {
68
+ await this._metadataStore.addInvitation(invitation.get());
69
+ this._saved.emit(invitation.get());
70
+ } catch (err: any) {
71
+ close(err);
72
+ }
73
+ });
74
+ }
58
75
  invitation.subscribe(
59
76
  (invitation) => {
60
77
  next(invitation);
61
78
  },
62
- (err: Error) => {
79
+ async (err: Error) => {
80
+ await savePersistentInvitationCtx.dispose();
81
+
82
+ // TODO(nf): also remove from storage?
63
83
  close(err);
64
84
  },
65
- () => {
85
+ async () => {
66
86
  close();
87
+ if (invitation.get().persistent) {
88
+ await savePersistentInvitationCtx.dispose();
89
+ // TODO(nf): remove on all complete conditions?
90
+ await this._metadataStore.removeInvitation(invitation.get().invitationId);
91
+ }
92
+
67
93
  this._createInvitations.delete(invitation.get().invitationId);
68
94
  if (invitation.get().type !== Invitation.Type.MULTIUSE) {
69
95
  this._removedCreated.emit(invitation.get());
@@ -73,6 +99,26 @@ export class InvitationsServiceImpl implements InvitationsService {
73
99
  });
74
100
  }
75
101
 
102
+ async loadPersistentInvitations() {
103
+ const persistentInvitations = this._metadataStore.getInvitations();
104
+
105
+ // get saved persistent invitations, filter and remove from storage those that have expired.
106
+ const freshInvitations = persistentInvitations.filter(async (invitation) => !invitationExpired(invitation));
107
+
108
+ const cInvitations = freshInvitations.map((persistentInvitation) => {
109
+ invariant(!this._createInvitations.get(persistentInvitation.invitationId), 'invitation already exists');
110
+
111
+ const handler = this._getHandler(persistentInvitation);
112
+ const invitation = this._invitationsHandler.createInvitation(handler, persistentInvitation);
113
+ this._createInvitations.set(invitation.get().invitationId, invitation);
114
+ this._invitationCreated.emit(invitation.get());
115
+ return persistentInvitation;
116
+ });
117
+ this._persistentInvitationsLoadedEvent.emit();
118
+ this._persistentInvitationsLoaded = true;
119
+ return { invitations: cInvitations };
120
+ }
121
+
76
122
  acceptInvitation({ invitation: options, deviceProfile }: AcceptInvitationRequest): Stream<Invitation> {
77
123
  let invitation: AuthenticatingInvitation;
78
124
 
@@ -122,7 +168,7 @@ export class InvitationsServiceImpl implements InvitationsService {
122
168
  }
123
169
 
124
170
  async cancelInvitation({ invitationId }: { invitationId: string }): Promise<void> {
125
- log('deleting...');
171
+ log('cancelInvitation...', { invitationId });
126
172
  invariant(invitationId);
127
173
  const created = this._createInvitations.get(invitationId);
128
174
  const accepted = this._acceptInvitations.get(invitationId);
@@ -130,6 +176,9 @@ export class InvitationsServiceImpl implements InvitationsService {
130
176
  await created.cancel();
131
177
  this._createInvitations.delete(invitationId);
132
178
  this._removedCreated.emit(created.get());
179
+ if (created.get().persistent) {
180
+ await this._metadataStore.removeInvitation(created.get().invitationId);
181
+ }
133
182
  } else if (accepted) {
134
183
  await accepted.cancel();
135
184
  this._acceptInvitations.delete(invitationId);
@@ -173,18 +222,47 @@ export class InvitationsServiceImpl implements InvitationsService {
173
222
  });
174
223
  });
175
224
 
225
+ // used only for testing
226
+ this._saved.on(ctx, (invitation) => {
227
+ next({
228
+ action: QueryInvitationsResponse.Action.SAVED,
229
+ type: QueryInvitationsResponse.Type.CREATED,
230
+ invitations: [invitation],
231
+ });
232
+ });
233
+
176
234
  // Push existing invitations to the stream.
177
235
  next({
178
236
  action: QueryInvitationsResponse.Action.ADDED,
179
237
  type: QueryInvitationsResponse.Type.CREATED,
180
238
  invitations: Array.from(this._createInvitations.values()).map((invitation) => invitation.get()),
239
+ existing: true,
181
240
  });
182
241
 
183
242
  next({
184
243
  action: QueryInvitationsResponse.Action.ADDED,
185
244
  type: QueryInvitationsResponse.Type.ACCEPTED,
186
245
  invitations: Array.from(this._acceptInvitations.values()).map((invitation) => invitation.get()),
246
+ existing: true,
187
247
  });
248
+
249
+ if (this._persistentInvitationsLoaded) {
250
+ next({
251
+ action: QueryInvitationsResponse.Action.LOAD_COMPLETE,
252
+ type: QueryInvitationsResponse.Type.CREATED,
253
+ // TODO(nf): populate with invitations
254
+ });
255
+ } else {
256
+ this._persistentInvitationsLoadedEvent.on(ctx, () => {
257
+ next({
258
+ action: QueryInvitationsResponse.Action.LOAD_COMPLETE,
259
+ type: QueryInvitationsResponse.Type.CREATED,
260
+ // TODO(nf): populate with invitations
261
+ });
262
+ });
263
+ }
264
+
265
+ // TODO(nf): expired invitations?
188
266
  });
189
267
  }
190
268
  }
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { Event } from '@dxos/async';
6
6
  import { Stream } from '@dxos/codec-protobuf';
7
+ import { PublicKey } from '@dxos/keys';
7
8
  import {
8
9
  type LogLevel,
9
10
  type LogProcessor,
@@ -21,14 +22,15 @@ import {
21
22
  type QueryMetricsRequest,
22
23
  type QueryMetricsResponse,
23
24
  } from '@dxos/protocols/proto/dxos/client/services';
24
- import { jsonify, numericalValues, tracer } from '@dxos/util';
25
+ import { getDebugName, jsonify, numericalValues, tracer } from '@dxos/util';
25
26
 
26
27
  /**
27
28
  * Logging service used to spy on logs of the host.
28
29
  */
29
30
  export class LoggingServiceImpl implements LoggingService {
30
31
  private readonly _logs = new Event<NaturalLogEntry>();
31
- private readonly _started = new Date();
32
+ private readonly _started = Date.now();
33
+ private readonly _sessionId = PublicKey.random().toHex();
32
34
 
33
35
  async open() {
34
36
  log.runtimeConfig.processors.push(this._logProcessor);
@@ -116,6 +118,11 @@ export class LoggingServiceImpl implements LoggingService {
116
118
  // TODO(dmaretskyi): Fix proto.
117
119
  file: entry.meta?.F ?? '',
118
120
  line: entry.meta?.L ?? 0,
121
+ scope: {
122
+ hostSessionId: this._sessionId,
123
+ uptimeSeconds: (Date.now() - this._started) / 1000,
124
+ name: getDebugName(entry.meta?.S),
125
+ },
119
126
  },
120
127
  };
121
128
 
@@ -256,8 +256,10 @@ export class ClientServicesHost {
256
256
  (profile) => this._serviceContext.broadcastProfileUpdate(profile),
257
257
  ),
258
258
 
259
- InvitationsService: new InvitationsServiceImpl(this._serviceContext.invitations, (invitation) =>
260
- this._serviceContext.getInvitationHandler(invitation),
259
+ InvitationsService: new InvitationsServiceImpl(
260
+ this._serviceContext.invitations,
261
+ (invitation) => this._serviceContext.getInvitationHandler(invitation),
262
+ this._serviceContext.metadataStore,
261
263
  ),
262
264
 
263
265
  DevicesService: new DevicesServiceImpl(this._serviceContext.identityManager),
@@ -291,6 +293,11 @@ export class ClientServicesHost {
291
293
  });
292
294
 
293
295
  await this._serviceContext.open(ctx);
296
+ // TODO(nf): move to InvitationManager in ServiceContext?
297
+ invariant(this.serviceRegistry.services.InvitationsService);
298
+ const loadedInvitations = await this.serviceRegistry.services.InvitationsService.loadPersistentInvitations();
299
+
300
+ log('loaded persistent invitations', { count: loadedInvitations.invitations?.length });
294
301
 
295
302
  const devtoolsProxy = this._config?.get('runtime.client.devtoolsProxy');
296
303
  if (devtoolsProxy) {
@@ -9,6 +9,8 @@ export class AutomergeSpaceState implements CredentialProcessor {
9
9
  public rootUrl: string | undefined = undefined;
10
10
  public lastEpoch: SpecificCredential<Epoch> | undefined = undefined;
11
11
 
12
+ private _isProcessingRootDocs = false;
13
+
12
14
  constructor(private readonly _onNewRoot: (rootUrl: string) => void) {}
13
15
 
14
16
  async processCredential(credential: Credential) {
@@ -20,7 +22,20 @@ export class AutomergeSpaceState implements CredentialProcessor {
20
22
  if (credential.subject.assertion.automergeRoot) {
21
23
  this.rootUrl = credential.subject.assertion.automergeRoot;
22
24
 
25
+ if (this._isProcessingRootDocs) {
26
+ this._onNewRoot(this.rootUrl);
27
+ }
28
+ }
29
+ }
30
+
31
+ startProcessingRootDocs() {
32
+ if (this._isProcessingRootDocs) {
33
+ return;
34
+ }
35
+
36
+ if (this.rootUrl) {
23
37
  this._onNewRoot(this.rootUrl);
24
38
  }
39
+ this._isProcessingRootDocs = true;
25
40
  }
26
41
  }
@@ -2,7 +2,7 @@
2
2
  // Copyright 2022 DXOS.org
3
3
  //
4
4
 
5
- import { Event, scheduleTask, sleep, synchronized, trackLeaks } from '@dxos/async';
5
+ import { Event, asyncTimeout, scheduleTask, sleep, synchronized, trackLeaks } from '@dxos/async';
6
6
  import { AUTH_TIMEOUT } from '@dxos/client-protocol';
7
7
  import { cancelWithContext, Context, ContextDisposedError } from '@dxos/context';
8
8
  import { timed, warnAfterTimeout } from '@dxos/debug';
@@ -15,7 +15,7 @@ import {
15
15
  type AutomergeHost,
16
16
  } from '@dxos/echo-pipeline';
17
17
  import { type FeedStore } from '@dxos/feed-store';
18
- import { failedInvariant } from '@dxos/invariant';
18
+ import { failedInvariant, invariant } from '@dxos/invariant';
19
19
  import { type Keyring } from '@dxos/keyring';
20
20
  import { PublicKey } from '@dxos/keys';
21
21
  import { log } from '@dxos/log';
@@ -276,6 +276,8 @@ export class DataSpace {
276
276
  // Allow other tasks to run before loading the data pipeline.
277
277
  await sleep(1);
278
278
 
279
+ this._automergeSpaceState.startProcessingRootDocs();
280
+
279
281
  await this._inner.initializeDataPipeline();
280
282
 
281
283
  this.metrics.dataPipelineOpen = new Date();
@@ -423,18 +425,38 @@ export class DataSpace {
423
425
  case undefined:
424
426
  case CreateEpochRequest.Migration.NONE:
425
427
  {
428
+ // TODO(dmaretskyi): Unify epoch construction.
426
429
  epoch = await this.dataPipeline.createEpoch();
427
430
  }
428
431
  break;
429
- case CreateEpochRequest.Migration.INIT_AUTOMERGE: {
430
- const document = this._automergeHost.repo.create();
431
- epoch = {
432
- previousId: this._automergeSpaceState.lastEpoch?.id,
433
- number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
434
- timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe(),
435
- automergeRoot: document.url,
436
- };
437
- }
432
+ case CreateEpochRequest.Migration.INIT_AUTOMERGE:
433
+ {
434
+ const document = this._automergeHost.repo.create();
435
+ // TODO(dmaretskyi): Unify epoch construction.
436
+ epoch = {
437
+ previousId: this._automergeSpaceState.lastEpoch?.id,
438
+ number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
439
+ timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe(),
440
+ automergeRoot: document.url,
441
+ };
442
+ }
443
+ break;
444
+ case CreateEpochRequest.Migration.PRUNE_AUTOMERGE_ROOT_HISTORY:
445
+ {
446
+ const currentRootUrl = this._automergeSpaceState.rootUrl;
447
+ const rootHandle = this._automergeHost.repo.find(currentRootUrl as any);
448
+ await cancelWithContext(this._ctx, asyncTimeout(rootHandle.whenReady(), 10_000));
449
+ const newRoot = this._automergeHost.repo.create(rootHandle.docSync());
450
+ invariant(typeof newRoot.url === 'string' && newRoot.url.length > 0);
451
+ // TODO(dmaretskyi): Unify epoch construction.
452
+ epoch = {
453
+ previousId: this._automergeSpaceState.lastEpoch?.id,
454
+ number: (this._automergeSpaceState.lastEpoch?.subject.assertion.number ?? -1) + 1,
455
+ timeframe: this._automergeSpaceState.lastEpoch?.subject.assertion.timeframe ?? new Timeframe(),
456
+ automergeRoot: newRoot.url,
457
+ };
458
+ }
459
+ break;
438
460
  }
439
461
 
440
462
  if (!epoch) {
@@ -178,10 +178,10 @@ export class SpacesServiceImpl implements SpacesService {
178
178
  }
179
179
  }
180
180
 
181
- async createEpoch({ spaceKey }: CreateEpochRequest) {
181
+ async createEpoch({ spaceKey, migration }: CreateEpochRequest) {
182
182
  const dataSpaceManager = await this._getDataSpaceManager();
183
183
  const space = dataSpaceManager.spaces.get(spaceKey) ?? raise(new SpaceNotFoundError(spaceKey));
184
- await space.createEpoch();
184
+ await space.createEpoch({ migration });
185
185
  }
186
186
 
187
187
  private _serializeSpace(space: DataSpace): Space {
package/src/version.ts CHANGED
@@ -1 +1 @@
1
- export const DXOS_VERSION = "0.4.7-next.f4b92be";
1
+ export const DXOS_VERSION = "0.4.8-main.ac78619";