@dxos/echo-pipeline 0.3.9-main.b7e6a67 → 0.3.9-main.c7cd0ec

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 (43) hide show
  1. package/dist/lib/browser/{chunk-MPEQ7BV3.mjs → chunk-RV3JOJQ4.mjs} +266 -49
  2. package/dist/lib/browser/chunk-RV3JOJQ4.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +3 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +7 -2
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/node/{chunk-YJAADRTG.cjs → chunk-QIIIHTAB.cjs} +260 -51
  8. package/dist/lib/node/chunk-QIIIHTAB.cjs.map +7 -0
  9. package/dist/lib/node/index.cjs +27 -25
  10. package/dist/lib/node/index.cjs.map +2 -2
  11. package/dist/lib/node/meta.json +1 -1
  12. package/dist/lib/node/testing/index.cjs +18 -14
  13. package/dist/lib/node/testing/index.cjs.map +3 -3
  14. package/dist/types/src/automerge/automerge-host.d.ts +17 -0
  15. package/dist/types/src/automerge/automerge-host.d.ts.map +1 -0
  16. package/dist/types/src/automerge/automerge-host.test.d.ts +2 -0
  17. package/dist/types/src/automerge/automerge-host.test.d.ts.map +1 -0
  18. package/dist/types/src/automerge/index.d.ts +2 -0
  19. package/dist/types/src/automerge/index.d.ts.map +1 -0
  20. package/dist/types/src/db-host/data-service-host.d.ts +2 -1
  21. package/dist/types/src/db-host/data-service-host.d.ts.map +1 -1
  22. package/dist/types/src/db-host/data-service.d.ts +5 -2
  23. package/dist/types/src/db-host/data-service.d.ts.map +1 -1
  24. package/dist/types/src/index.d.ts +1 -0
  25. package/dist/types/src/index.d.ts.map +1 -1
  26. package/dist/types/src/space/data-pipeline.d.ts +4 -0
  27. package/dist/types/src/space/data-pipeline.d.ts.map +1 -1
  28. package/dist/types/src/space/space-protocol.d.ts +2 -1
  29. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  30. package/dist/types/src/testing/util.d.ts.map +1 -1
  31. package/package.json +32 -31
  32. package/src/automerge/automerge-host.test.ts +122 -0
  33. package/src/automerge/automerge-host.ts +245 -0
  34. package/src/automerge/index.ts +5 -0
  35. package/src/db-host/data-service-host.ts +5 -0
  36. package/src/db-host/data-service.ts +14 -3
  37. package/src/index.ts +1 -0
  38. package/src/space/data-pipeline.ts +10 -0
  39. package/src/space/space-protocol.ts +6 -3
  40. package/src/testing/util.ts +4 -1
  41. package/src/tests/database.test.ts +4 -1
  42. package/dist/lib/browser/chunk-MPEQ7BV3.mjs.map +0 -7
  43. package/dist/lib/node/chunk-YJAADRTG.cjs.map +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"data-service-host.d.ts","sourceRoot":"","sources":["../../../../src/db-host/data-service-host.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAuB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAuB,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAMjD,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AAEH,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAXxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;gBAGiB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,WAAW,EACzB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,EACjD,KAAK,GAAE,sBAA2B;IAG/C,IAAI;IAEJ,KAAK;IAIX,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAmHxB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAI5D,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
1
+ {"version":3,"file":"data-service-host.d.ts","sourceRoot":"","sources":["../../../../src/db-host/data-service-host.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAE9C,OAAO,EAAuB,KAAK,WAAW,EAAE,KAAK,WAAW,EAAuB,MAAM,eAAe,CAAC;AAC7G,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAInD,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAExE,OAAO,EACL,SAAS,EACT,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,yCAAyC,CAAC;AAMjD,MAAM,MAAM,sBAAsB,GAAG;IACnC;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,CAAC;AAEF;;;GAGG;AAEH,qBAAa,eAAe;IAQxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,KAAK;IAXxB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAiB;IAEtC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;gBAGiB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,WAAW,EACzB,MAAM,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,EAC3B,YAAY,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,EACjD,KAAK,GAAE,sBAA2B;IAG/C,IAAI;IAEJ,KAAK;IAIX,OAAO,KAAK,YAAY,GAEvB;IAED;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAmHxB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAsBtD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAI5B,WAAW,IAAI,OAAO,CAAC,QAAQ,CAAC;IAIhC,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAI5D,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
@@ -1,7 +1,8 @@
1
1
  import { type Stream } from '@dxos/codec-protobuf';
2
2
  import { PublicKey } from '@dxos/keys';
3
- import { type DataService, type MutationReceipt, type SubscribeRequest, type EchoEvent, type WriteRequest, type FlushRequest, type SyncRepoRequest, type SyncRepoResponse } from '@dxos/protocols/proto/dxos/echo/service';
3
+ import { type DataService, type MutationReceipt, type SubscribeRequest, type EchoEvent, type WriteRequest, type FlushRequest, type SyncRepoRequest, type SyncRepoResponse, type HostInfo } from '@dxos/protocols/proto/dxos/echo/service';
4
4
  import { type DataServiceHost } from './data-service-host';
5
+ import { type AutomergeHost } from '../automerge';
5
6
  export declare class DataServiceSubscriptions {
6
7
  private readonly _spaces;
7
8
  clear(): void;
@@ -14,10 +15,12 @@ export declare class DataServiceSubscriptions {
14
15
  */
15
16
  export declare class DataServiceImpl implements DataService {
16
17
  private readonly _subscriptions;
17
- constructor(_subscriptions: DataServiceSubscriptions);
18
+ private readonly _automergeHost;
19
+ constructor(_subscriptions: DataServiceSubscriptions, _automergeHost: AutomergeHost);
18
20
  subscribe(request: SubscribeRequest): Stream<EchoEvent>;
19
21
  write(request: WriteRequest): Promise<MutationReceipt>;
20
22
  flush(request: FlushRequest): Promise<void>;
23
+ getHostInfo(request: void): Promise<HostInfo>;
21
24
  syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse>;
22
25
  sendSyncMessage(request: SyncRepoRequest): Promise<void>;
23
26
  }
@@ -1 +1 @@
1
- {"version":3,"file":"data-service.d.ts","sourceRoot":"","sources":["../../../../src/db-host/data-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACtB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAG3D,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;IAEtF,KAAK;IAIC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe;IAOxD,eAAe,CAAC,QAAQ,EAAE,SAAS;IAOzC,cAAc,CAAC,QAAQ,EAAE,SAAS;CAGnC;AAED;;GAEG;AAEH,qBAAa,eAAgB,YAAW,WAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,cAAc;gBAAd,cAAc,EAAE,wBAAwB;IAErE,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC;IAOvD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAQtD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAO3C,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAI5D,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
1
+ {"version":3,"file":"data-service.d.ts","sourceRoot":"","sources":["../../../../src/db-host/data-service.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EACL,KAAK,WAAW,EAChB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,SAAS,EACd,KAAK,YAAY,EACjB,KAAK,YAAY,EACjB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,QAAQ,EACd,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EAAE,KAAK,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,cAAc,CAAC;AAGlD,qBAAa,wBAAwB;IACnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8D;IAEtF,KAAK;IAIC,aAAa,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,EAAE,eAAe;IAOxD,eAAe,CAAC,QAAQ,EAAE,SAAS;IAOzC,cAAc,CAAC,QAAQ,EAAE,SAAS;CAGnC;AAED;;GAEG;AAEH,qBAAa,eAAgB,YAAW,WAAW;IAE/C,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,cAAc;gBADd,cAAc,EAAE,wBAAwB,EACxC,cAAc,EAAE,aAAa;IAGhD,SAAS,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAAC,SAAS,CAAC;IAOvD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;IAQtD,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IASrC,WAAW,CAAC,OAAO,EAAE,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC;IAInD,QAAQ,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CAAC,gBAAgB,CAAC;IAI5D,eAAe,CAAC,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC;CAGzD"}
@@ -3,4 +3,5 @@ export * from './db-host';
3
3
  export * from './metadata';
4
4
  export * from './pipeline';
5
5
  export * from './space';
6
+ export * from './automerge';
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAIA,cAAc,UAAU,CAAC;AACzB,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,SAAS,CAAC;AACxB,cAAc,aAAa,CAAC"}
@@ -3,6 +3,7 @@ import { type CredentialProcessor, type FeedInfo, type SpecificCredential } from
3
3
  import { ItemManager } from '@dxos/echo-db';
4
4
  import { type PublicKey } from '@dxos/keys';
5
5
  import { type ModelFactory } from '@dxos/model-factory';
6
+ import { type CreateEpochRequest } from '@dxos/protocols/proto/dxos/client/services';
6
7
  import { type Credential, type Epoch } from '@dxos/protocols/proto/dxos/halo/credentials';
7
8
  import { Timeframe } from '@dxos/timeframe';
8
9
  import { DatabaseHost, type SnapshotManager } from '../db-host';
@@ -24,6 +25,9 @@ export type DataPipelineParams = {
24
25
  */
25
26
  onPipelineCreated: (pipeline: Pipeline) => Promise<void>;
26
27
  };
28
+ export type CreateEpochOptions = {
29
+ migration?: CreateEpochRequest.Migration;
30
+ };
27
31
  /**
28
32
  * Controls data pipeline in the space.
29
33
  * Consumes the pipeline and updates the database.
@@ -1 +1 @@
1
- {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAiD,MAAM,aAAa,CAAC;AAEnF,OAAO,EACL,KAAK,mBAAmB,EACxB,KAAK,QAAQ,EACb,KAAK,kBAAkB,EAExB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAA2B,WAAW,EAAmB,MAAM,eAAe,CAAC;AAGtF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD,OAAO,EAAE,KAAK,UAAU,EAAE,KAAK,KAAK,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAChE,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC,MAAM,WAAW,eAAe;IAC9B,YAAY,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACvD;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,eAAe,EAAE,eAAe,CAAC;IACjC,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,QAAQ,EAAE,SAAS,CAAC;IACpB,gBAAgB,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,QAAQ,GAAG,SAAS,CAAC;IAC/D,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAE/B;;OAEG;IACH,iBAAiB,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1D,CAAC;AAiBF;;;;GAIG;AACH,qBAEa,YAAa,YAAW,mBAAmB;IAmC1C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAlCpC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAuB;IACzC,OAAO,CAAC,gBAAgB,CAAC,CAAwB;IAEjD,OAAO,CAAC,+BAA+B,CAAmB;IAC1D,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,qBAAqB,CAAK;IAClC,OAAO,CAAC,mBAAmB,CAAM;IACjC,OAAO,CAAC,SAAS,CAAC,CAAU;IAG5B,OAAO,CAAC,MAAM,CAA0B;IAGxC,OAAO,CAAC,UAAU,CAA2B;IAEtC,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,WAAW,EAAG,WAAW,CAAC;IAEjC;;OAEG;IACI,YAAY,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAa;IAE5D;;OAEG;IACI,YAAY,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAa;IAE5D,SAAgB,UAAU,oBAA2B;gBAExB,OAAO,EAAE,kBAAkB;IAExD,IAAI,MAAM,YAET;IAED,IAAI,QAAQ,yBAEX;IAED,IAAI,aAAa,6DAEhB;IAED,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAKjC,iBAAiB,CAAC,UAAU,EAAE,UAAU;IAaxC,IAAI;IAuCJ,KAAK;YAiCG,gBAAgB;IA8D9B,OAAO,CAAC,eAAe;YAST,oBAAoB;YAMpB,UAAU;YAsBV,wBAAwB;YAqBxB,2BAA2B;YA4B3B,aAAa;IAiBrB,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAMvC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAqB7B,sBAAsB;YAId,MAAM;CAYrB"}
1
+ {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"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"}
@@ -37,6 +37,7 @@ export declare class SpaceProtocol {
37
37
  private readonly _onAuthFailure?;
38
38
  readonly blobSync: BlobSync;
39
39
  private readonly _topic;
40
+ private readonly _spaceKey;
40
41
  private readonly _feeds;
41
42
  private readonly _sessions;
42
43
  private _connection?;
@@ -81,7 +82,7 @@ export declare class SpaceProtocolSession implements WireProtocol {
81
82
  get stats(): Event<MuxerStats>;
82
83
  constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure, blobSync }: SpaceProtocolSessionParams);
83
84
  get stream(): import("stream").Duplex;
84
- open(): Promise<void>;
85
+ open(sessionId?: PublicKey): Promise<void>;
85
86
  close(): Promise<void>;
86
87
  abort(): Promise<void>;
87
88
  }
@@ -1 +1 @@
1
- {"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/testing/util.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAInD,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAA6C,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,oBAAoB,iBAAwB,YAAY;;;EAuBpE,CAAC;AAEF,eAAO,MAAM,uCAAuC,iBACpC,YAAY,mBACT,eAAe;;;EAejC,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAkB,YAAY,UAAS,YAAY,kBAmBhF,CAAC"}
1
+ {"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/testing/util.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAG3D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,EAAE,YAAY,EAAE,KAAK,eAAe,EAA6C,MAAM,YAAY,CAAC;AAC3G,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C,eAAO,MAAM,oBAAoB,iBAAwB,YAAY;;;EAuBpE,CAAC;AAEF,eAAO,MAAM,uCAAuC,iBACpC,YAAY,mBACT,eAAe;;;EAgBjC,CAAC;AAEF,eAAO,MAAM,iBAAiB,WAAkB,YAAY,UAAS,YAAY,kBAmBhF,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/echo-pipeline",
3
- "version": "0.3.9-main.b7e6a67",
3
+ "version": "0.3.9-main.c7cd0ec",
4
4
  "description": "ECHO database.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -36,36 +36,37 @@
36
36
  ],
37
37
  "dependencies": {
38
38
  "crc-32": "^1.2.2",
39
- "@dxos/context": "0.3.9-main.b7e6a67",
40
- "@dxos/async": "0.3.9-main.b7e6a67",
41
- "@dxos/codec-protobuf": "0.3.9-main.b7e6a67",
42
- "@dxos/credentials": "0.3.9-main.b7e6a67",
43
- "@dxos/debug": "0.3.9-main.b7e6a67",
44
- "@dxos/crypto": "0.3.9-main.b7e6a67",
45
- "@dxos/echo-db": "0.3.9-main.b7e6a67",
46
- "@dxos/feed-store": "0.3.9-main.b7e6a67",
47
- "@dxos/hypercore": "0.3.9-main.b7e6a67",
48
- "@dxos/document-model": "0.3.9-main.b7e6a67",
49
- "@dxos/invariant": "0.3.9-main.b7e6a67",
50
- "@dxos/keys": "0.3.9-main.b7e6a67",
51
- "@dxos/keyring": "0.3.9-main.b7e6a67",
52
- "@dxos/log": "0.3.9-main.b7e6a67",
53
- "@dxos/messaging": "0.3.9-main.b7e6a67",
54
- "@dxos/network-manager": "0.3.9-main.b7e6a67",
55
- "@dxos/node-std": "0.3.9-main.b7e6a67",
56
- "@dxos/model-factory": "0.3.9-main.b7e6a67",
57
- "@dxos/random-access-storage": "0.3.9-main.b7e6a67",
58
- "@dxos/protocols": "0.3.9-main.b7e6a67",
59
- "@dxos/rpc": "0.3.9-main.b7e6a67",
60
- "@dxos/teleport": "0.3.9-main.b7e6a67",
61
- "@dxos/teleport-extension-gossip": "0.3.9-main.b7e6a67",
62
- "@dxos/teleport-extension-object-sync": "0.3.9-main.b7e6a67",
63
- "@dxos/teleport-extension-replicator": "0.3.9-main.b7e6a67",
64
- "@dxos/text-model": "0.3.9-main.b7e6a67",
65
- "@dxos/tracing": "0.3.9-main.b7e6a67",
66
- "@dxos/timeframe": "0.3.9-main.b7e6a67",
67
- "@dxos/typings": "0.3.9-main.b7e6a67",
68
- "@dxos/util": "0.3.9-main.b7e6a67"
39
+ "@dxos/automerge": "0.3.9-main.c7cd0ec",
40
+ "@dxos/crypto": "0.3.9-main.c7cd0ec",
41
+ "@dxos/codec-protobuf": "0.3.9-main.c7cd0ec",
42
+ "@dxos/context": "0.3.9-main.c7cd0ec",
43
+ "@dxos/credentials": "0.3.9-main.c7cd0ec",
44
+ "@dxos/document-model": "0.3.9-main.c7cd0ec",
45
+ "@dxos/debug": "0.3.9-main.c7cd0ec",
46
+ "@dxos/async": "0.3.9-main.c7cd0ec",
47
+ "@dxos/echo-db": "0.3.9-main.c7cd0ec",
48
+ "@dxos/feed-store": "0.3.9-main.c7cd0ec",
49
+ "@dxos/invariant": "0.3.9-main.c7cd0ec",
50
+ "@dxos/hypercore": "0.3.9-main.c7cd0ec",
51
+ "@dxos/keyring": "0.3.9-main.c7cd0ec",
52
+ "@dxos/keys": "0.3.9-main.c7cd0ec",
53
+ "@dxos/log": "0.3.9-main.c7cd0ec",
54
+ "@dxos/network-manager": "0.3.9-main.c7cd0ec",
55
+ "@dxos/model-factory": "0.3.9-main.c7cd0ec",
56
+ "@dxos/messaging": "0.3.9-main.c7cd0ec",
57
+ "@dxos/node-std": "0.3.9-main.c7cd0ec",
58
+ "@dxos/protocols": "0.3.9-main.c7cd0ec",
59
+ "@dxos/random-access-storage": "0.3.9-main.c7cd0ec",
60
+ "@dxos/teleport": "0.3.9-main.c7cd0ec",
61
+ "@dxos/rpc": "0.3.9-main.c7cd0ec",
62
+ "@dxos/teleport-extension-gossip": "0.3.9-main.c7cd0ec",
63
+ "@dxos/teleport-extension-replicator": "0.3.9-main.c7cd0ec",
64
+ "@dxos/text-model": "0.3.9-main.c7cd0ec",
65
+ "@dxos/tracing": "0.3.9-main.c7cd0ec",
66
+ "@dxos/teleport-extension-object-sync": "0.3.9-main.c7cd0ec",
67
+ "@dxos/timeframe": "0.3.9-main.c7cd0ec",
68
+ "@dxos/typings": "0.3.9-main.c7cd0ec",
69
+ "@dxos/util": "0.3.9-main.c7cd0ec"
69
70
  },
70
71
  "devDependencies": {
71
72
  "fast-check": "~3.3.0",
@@ -0,0 +1,122 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import expect from 'expect';
6
+
7
+ import { Trigger, asyncTimeout, sleep } from '@dxos/async';
8
+ import { type Message, NetworkAdapter, type PeerId, Repo } from '@dxos/automerge/automerge-repo';
9
+ import { invariant } from '@dxos/invariant';
10
+ import { log } from '@dxos/log';
11
+ import { StorageType, createStorage } from '@dxos/random-access-storage';
12
+ import { describe, test } from '@dxos/test';
13
+
14
+ import { AutomergeHost } from './automerge-host';
15
+
16
+ describe('AutomergeHost', () => {
17
+ test('can create documents', () => {
18
+ const host = new AutomergeHost(createStorage({ type: StorageType.RAM }).createDirectory());
19
+
20
+ const handle = host.repo.create();
21
+ handle.change((doc: any) => {
22
+ doc.text = 'Hello world';
23
+ });
24
+ expect(handle.docSync().text).toEqual('Hello world');
25
+ });
26
+
27
+ test('changes are preserved in storage', async () => {
28
+ const storageDirectory = createStorage({ type: StorageType.RAM }).createDirectory();
29
+
30
+ const host = new AutomergeHost(storageDirectory);
31
+ const handle = host.repo.create();
32
+ handle.change((doc: any) => {
33
+ doc.text = 'Hello world';
34
+ });
35
+ const url = handle.url;
36
+
37
+ // TODO(dmaretskyi): Is there a way to know when automerge has finished saving?
38
+ await sleep(100);
39
+
40
+ const host2 = new AutomergeHost(storageDirectory);
41
+ const handle2 = host2.repo.find(url);
42
+ await handle2.whenReady();
43
+ expect(handle2.docSync().text).toEqual('Hello world');
44
+ });
45
+
46
+ test('basic networking', async () => {
47
+ type Context = { client: Trigger<TestAdapter>; host: Trigger<TestAdapter> };
48
+ const context: Context = {
49
+ client: new Trigger<TestAdapter>(),
50
+ host: new Trigger<TestAdapter>(),
51
+ };
52
+
53
+ class TestAdapter extends NetworkAdapter {
54
+ constructor(public readonly context: Context, public readonly role: 'host' | 'client') {
55
+ super();
56
+ }
57
+
58
+ // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition
59
+ // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.
60
+ ready() {
61
+ this.emit('ready', { network: this });
62
+ }
63
+
64
+ override connect(peerId: PeerId) {
65
+ this.peerId = peerId;
66
+ context[this.role].wake(this);
67
+ context[this.role === 'host' ? 'client' : 'host']
68
+ .wait()
69
+ .then((adapter) => {
70
+ invariant(adapter.peerId, 'Peer id is not set');
71
+ this.emit('peer-candidate', { peerId: adapter.peerId });
72
+ })
73
+ .catch((error) => {
74
+ log.catch(error);
75
+ });
76
+ }
77
+
78
+ override send(message: Message) {
79
+ context[this.role === 'host' ? 'client' : 'host']
80
+ .wait()
81
+ .then((adapter) => {
82
+ adapter.receive(message);
83
+ })
84
+ .catch((error) => {
85
+ log.catch(error);
86
+ });
87
+ }
88
+
89
+ override disconnect() {
90
+ this.peerId = undefined;
91
+ this.context[this.role].reset();
92
+ }
93
+
94
+ receive(message: Message) {
95
+ invariant(this.peerId, 'Peer id is not set');
96
+ this.emit('message', message);
97
+ }
98
+ }
99
+
100
+ const hostAdapter = new TestAdapter(context, 'host');
101
+ const clientAdapter = new TestAdapter(context, 'client');
102
+
103
+ const host = new Repo({
104
+ network: [hostAdapter],
105
+ });
106
+ const client = new Repo({
107
+ network: [clientAdapter],
108
+ });
109
+ hostAdapter.ready();
110
+ clientAdapter.ready();
111
+
112
+ const handle = host.create();
113
+ const text = 'Hello world';
114
+ handle.change((doc: any) => {
115
+ doc.text = text;
116
+ });
117
+
118
+ const docOnClient = client.find(handle.url);
119
+ await asyncTimeout(docOnClient.whenReady(), 3_000);
120
+ expect(docOnClient.docSync().text).toEqual(text);
121
+ });
122
+ });
@@ -0,0 +1,245 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ import {
6
+ Repo,
7
+ NetworkAdapter,
8
+ StorageAdapter,
9
+ type Message,
10
+ type PeerId,
11
+ type Chunk,
12
+ type StorageKey,
13
+ cbor,
14
+ } from '@dxos/automerge/automerge-repo';
15
+ import { Stream } from '@dxos/codec-protobuf';
16
+ import { invariant } from '@dxos/invariant';
17
+ import { type HostInfo, type SyncRepoRequest, type SyncRepoResponse } from '@dxos/protocols/proto/dxos/echo/service';
18
+ import { type Directory } from '@dxos/random-access-storage';
19
+ import { arrayToBuffer, bufferToArray } from '@dxos/util';
20
+
21
+ export class AutomergeHost {
22
+ private readonly _repo: Repo;
23
+ private readonly _meshNetwork: MeshNetworkAdapter;
24
+ private readonly _clientNetwork: LocalHostNetworkAdapter;
25
+ private readonly _storage: AutomergeStorageAdapter;
26
+
27
+ constructor(storageDirectory: Directory) {
28
+ this._meshNetwork = new MeshNetworkAdapter();
29
+ this._clientNetwork = new LocalHostNetworkAdapter();
30
+ this._storage = new AutomergeStorageAdapter(storageDirectory);
31
+ this._repo = new Repo({
32
+ network: [
33
+ // this._meshNetwork,
34
+ this._clientNetwork,
35
+ ],
36
+
37
+ storage: this._storage,
38
+
39
+ // TODO(dmaretskyi): Share based on HALO permissions and space affinity.
40
+ sharePolicy: async (peerId, documentId) => true, // Share everything.
41
+ });
42
+ this._clientNetwork.ready();
43
+ }
44
+
45
+ get repo(): Repo {
46
+ return this._repo;
47
+ }
48
+
49
+ async close() {
50
+ await this._clientNetwork.close();
51
+ }
52
+
53
+ //
54
+ // Methods for client-services.
55
+ //
56
+
57
+ syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {
58
+ return this._clientNetwork.syncRepo(request);
59
+ }
60
+
61
+ sendSyncMessage(request: SyncRepoRequest): Promise<void> {
62
+ return this._clientNetwork.sendSyncMessage(request);
63
+ }
64
+
65
+ getHostInfo(): HostInfo {
66
+ return this._clientNetwork.getHostInfo();
67
+ }
68
+ }
69
+
70
+ type ClientSyncState = {
71
+ connected: boolean;
72
+ send: (message: Message) => void;
73
+ disconnect: () => void;
74
+ };
75
+
76
+ /**
77
+ * Used to replicate with apps running on the same device.
78
+ */
79
+ class LocalHostNetworkAdapter extends NetworkAdapter {
80
+ private readonly _peers: Map<PeerId, ClientSyncState> = new Map();
81
+
82
+ /**
83
+ * Emits `ready` event. That signals to `Repo` that it can start using the adapter.
84
+ */
85
+ ready() {
86
+ // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition
87
+ // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.
88
+ this.emit('ready', {
89
+ network: this,
90
+ });
91
+ }
92
+
93
+ override connect(peerId: PeerId): void {
94
+ this.peerId = peerId;
95
+ // No-op. Client always connects first
96
+ }
97
+
98
+ override send(message: Message): void {
99
+ const peer = this._peers.get(message.targetId);
100
+ invariant(peer, 'Peer not found.');
101
+ peer.send(message);
102
+ }
103
+
104
+ async close() {
105
+ this._peers.forEach((peer) => peer.disconnect());
106
+ this.emit('close');
107
+ }
108
+
109
+ override disconnect(): void {
110
+ // TODO(mykola): `disconnect` is not used anywhere in `Repo` from `@automerge/automerge-repo`. Should we remove it?
111
+ // No-op
112
+ }
113
+
114
+ syncRepo({ id, syncMessage }: SyncRepoRequest): Stream<SyncRepoResponse> {
115
+ const peerId = this._getPeerId(id);
116
+
117
+ return new Stream(({ next, close }) => {
118
+ invariant(!this._peers.has(peerId), 'Peer already connected.');
119
+ this._peers.set(peerId, {
120
+ connected: true,
121
+ send: (message) => {
122
+ next({
123
+ syncMessage: cbor.encode(message),
124
+ });
125
+ },
126
+ disconnect: () => {
127
+ this._peers.delete(peerId);
128
+ close();
129
+ this.emit('peer-disconnected', {
130
+ peerId,
131
+ });
132
+ },
133
+ });
134
+
135
+ this.emit('peer-candidate', {
136
+ peerId,
137
+ });
138
+ });
139
+ }
140
+
141
+ async sendSyncMessage({ id, syncMessage }: SyncRepoRequest): Promise<void> {
142
+ const message = cbor.decode(syncMessage!) as Message;
143
+ this.emit('message', message);
144
+ }
145
+
146
+ getHostInfo(): HostInfo {
147
+ invariant(this.peerId, 'Peer id not set.');
148
+ return {
149
+ peerId: this.peerId,
150
+ };
151
+ }
152
+
153
+ private _getPeerId(id: string): PeerId {
154
+ return id as PeerId;
155
+ }
156
+ }
157
+
158
+ /**
159
+ * Used to replicate with other peers over the network.
160
+ */
161
+ class MeshNetworkAdapter extends NetworkAdapter {
162
+ override connect(peerId: PeerId): void {
163
+ throw new Error('Method not implemented.');
164
+ }
165
+
166
+ override send(message: Message): void {
167
+ throw new Error('Method not implemented.');
168
+ }
169
+
170
+ override disconnect(): void {
171
+ throw new Error('Method not implemented.');
172
+ }
173
+ }
174
+
175
+ class AutomergeStorageAdapter extends StorageAdapter {
176
+ constructor(private readonly _directory: Directory) {
177
+ super();
178
+ }
179
+
180
+ override async load(key: StorageKey): Promise<Uint8Array | undefined> {
181
+ const filename = this._getFilename(key);
182
+ const file = this._directory.getOrCreateFile(filename);
183
+ const { size } = await file.stat();
184
+ if (!size || size === 0) {
185
+ return undefined;
186
+ }
187
+ const buffer = await file.read(0, size);
188
+ return bufferToArray(buffer);
189
+ }
190
+
191
+ override async save(key: StorageKey, data: Uint8Array): Promise<void> {
192
+ const filename = this._getFilename(key);
193
+ const file = this._directory.getOrCreateFile(filename);
194
+ await file.write(0, arrayToBuffer(data));
195
+ await file.truncate?.(data.length);
196
+
197
+ await file.flush?.();
198
+ }
199
+
200
+ override async remove(key: StorageKey): Promise<void> {
201
+ // TODO(dmaretskyi): Better deletion.
202
+ const filename = this._getFilename(key);
203
+ const file = this._directory.getOrCreateFile(filename);
204
+ await file.truncate?.(0);
205
+ }
206
+
207
+ override async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {
208
+ const filename = this._getFilename(keyPrefix);
209
+ const entries = await this._directory.list();
210
+ return Promise.all(
211
+ entries
212
+ .filter((entry) => entry.startsWith(filename))
213
+ .map(async (entry): Promise<Chunk> => {
214
+ const file = this._directory.getOrCreateFile(entry);
215
+ const { size } = await file.stat();
216
+ const buffer = await file.read(0, size);
217
+ return {
218
+ key: this._getKeyFromFilename(entry),
219
+ data: bufferToArray(buffer),
220
+ };
221
+ }),
222
+ );
223
+ }
224
+
225
+ override async removeRange(keyPrefix: StorageKey): Promise<void> {
226
+ const filename = this._getFilename(keyPrefix);
227
+ const entries = await this._directory.list();
228
+ await Promise.all(
229
+ entries
230
+ .filter((entry) => entry.startsWith(filename))
231
+ .map(async (entry): Promise<void> => {
232
+ const file = this._directory.getOrCreateFile(filename);
233
+ await file.truncate?.(0);
234
+ }),
235
+ );
236
+ }
237
+
238
+ private _getFilename(key: StorageKey): string {
239
+ return key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-');
240
+ }
241
+
242
+ private _getKeyFromFilename(filename: string): StorageKey {
243
+ return filename.split('-').map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%'));
244
+ }
245
+ }
@@ -0,0 +1,5 @@
1
+ //
2
+ // Copyright 2023 DXOS.org
3
+ //
4
+
5
+ export * from './automerge-host';
@@ -18,6 +18,7 @@ import {
18
18
  type MutationReceipt,
19
19
  type WriteRequest,
20
20
  type SyncRepoResponse,
21
+ type HostInfo,
21
22
  } from '@dxos/protocols/proto/dxos/echo/service';
22
23
  import { ComplexMap } from '@dxos/util';
23
24
 
@@ -205,6 +206,10 @@ export class DataServiceHost {
205
206
  await this._flush();
206
207
  }
207
208
 
209
+ getHostInfo(): Promise<HostInfo> {
210
+ throw new Error('Method not implemented.');
211
+ }
212
+
208
213
  syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {
209
214
  throw new Error('Method not implemented.');
210
215
  }
@@ -16,10 +16,12 @@ import {
16
16
  type FlushRequest,
17
17
  type SyncRepoRequest,
18
18
  type SyncRepoResponse,
19
+ type HostInfo,
19
20
  } from '@dxos/protocols/proto/dxos/echo/service';
20
21
  import { ComplexMap } from '@dxos/util';
21
22
 
22
23
  import { type DataServiceHost } from './data-service-host';
24
+ import { type AutomergeHost } from '../automerge';
23
25
 
24
26
  // TODO(burdon): Clear on close.
25
27
  export class DataServiceSubscriptions {
@@ -53,7 +55,10 @@ export class DataServiceSubscriptions {
53
55
  */
54
56
  // TODO(burdon): Move to client-services.
55
57
  export class DataServiceImpl implements DataService {
56
- constructor(private readonly _subscriptions: DataServiceSubscriptions) {}
58
+ constructor(
59
+ private readonly _subscriptions: DataServiceSubscriptions,
60
+ private readonly _automergeHost: AutomergeHost,
61
+ ) {}
57
62
 
58
63
  subscribe(request: SubscribeRequest): Stream<EchoEvent> {
59
64
  invariant(request.spaceKey);
@@ -77,11 +82,17 @@ export class DataServiceImpl implements DataService {
77
82
  return host.flush();
78
83
  }
79
84
 
85
+ // Automerge specific.
86
+
87
+ async getHostInfo(request: void): Promise<HostInfo> {
88
+ return this._automergeHost.getHostInfo();
89
+ }
90
+
80
91
  syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {
81
- throw new Error('Method not implemented.');
92
+ return this._automergeHost.syncRepo(request);
82
93
  }
83
94
 
84
95
  sendSyncMessage(request: SyncRepoRequest): Promise<void> {
85
- throw new Error('Method not implemented.');
96
+ return this._automergeHost.sendSyncMessage(request);
86
97
  }
87
98
  }
package/src/index.ts CHANGED
@@ -7,3 +7,4 @@ export * from './db-host';
7
7
  export * from './metadata';
8
8
  export * from './pipeline';
9
9
  export * from './space';
10
+ export * from './automerge';