@dxos/echo-pipeline 0.1.46 → 0.1.48-next.83f55fd

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 (31) hide show
  1. package/dist/lib/browser/{chunk-YFIFTFHQ.mjs → chunk-JEULF2QN.mjs} +52 -45
  2. package/dist/lib/browser/chunk-JEULF2QN.mjs.map +7 -0
  3. package/dist/lib/browser/index.mjs +1 -1
  4. package/dist/lib/browser/meta.json +1 -1
  5. package/dist/lib/browser/testing/index.mjs +2 -3
  6. package/dist/lib/browser/testing/index.mjs.map +2 -2
  7. package/dist/lib/node/index.cjs +51 -44
  8. package/dist/lib/node/index.cjs.map +3 -3
  9. package/dist/lib/node/meta.json +1 -1
  10. package/dist/lib/node/testing/index.cjs +52 -46
  11. package/dist/lib/node/testing/index.cjs.map +3 -3
  12. package/dist/types/src/dbhost/data-service-host.d.ts.map +1 -1
  13. package/dist/types/src/space/space-manager.d.ts +2 -1
  14. package/dist/types/src/space/space-manager.d.ts.map +1 -1
  15. package/dist/types/src/space/space-protocol.d.ts +6 -2
  16. package/dist/types/src/space/space-protocol.d.ts.map +1 -1
  17. package/dist/types/src/testing/database-test-rig.d.ts +2 -1
  18. package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
  19. package/dist/types/src/testing/test-agent-builder.d.ts +1 -1
  20. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  21. package/package.json +30 -30
  22. package/src/dbhost/data-service-host.ts +19 -14
  23. package/src/space/auth.ts +1 -1
  24. package/src/space/space-manager.ts +9 -1
  25. package/src/space/space-protocol.ts +12 -4
  26. package/src/space/space.test.ts +1 -1
  27. package/src/space/space.ts +1 -1
  28. package/src/testing/database-test-rig.ts +30 -7
  29. package/src/testing/test-agent-builder.ts +1 -1
  30. package/src/tests/database-unit.test.ts +58 -17
  31. package/dist/lib/browser/chunk-YFIFTFHQ.mjs.map +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"data-service-host.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/data-service-host.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAuB,WAAW,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAGnG;;;GAGG;AAEH,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAPhC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;gBAGiB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,WAAW,EACzB,YAAY,CAAC,qCAAyB;IAGzD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAuCxB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;CA8B7D"}
1
+ {"version":3,"file":"data-service-host.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/data-service-host.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAC9C,OAAO,EAAuB,WAAW,EAAE,WAAW,EAAuB,MAAM,eAAe,CAAC;AACnG,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AAEnE,OAAO,EAAE,SAAS,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,yCAAyC,CAAC;AAGnG;;;GAGG;AAEH,qBAAa,eAAe;IAMxB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC;IAPhC,OAAO,CAAC,QAAQ,CAAC,aAAa,CAE5B;gBAGiB,YAAY,EAAE,WAAW,EACzB,YAAY,EAAE,WAAW,EACzB,YAAY,CAAC,qCAAyB;IAGzD;;OAEG;IACH,SAAS,IAAI,MAAM,CAAC,SAAS,CAAC;IAwCxB,KAAK,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,eAAe,CAAC;CAoB7D"}
@@ -22,6 +22,7 @@ export type ConstructSpaceParams = {
22
22
  swarmIdentity: SwarmIdentity;
23
23
  memberKey: PublicKey;
24
24
  onNetworkConnection: (session: Teleport) => void;
25
+ onAuthFailure?: (session: Teleport) => void;
25
26
  };
26
27
  /**
27
28
  * Manages a collection of ECHO (Data) Spaces.
@@ -38,6 +39,6 @@ export declare class SpaceManager {
38
39
  get spaces(): ComplexMap<PublicKey, Space>;
39
40
  open(): Promise<void>;
40
41
  close(): Promise<void>;
41
- constructSpace({ metadata, swarmIdentity, onNetworkConnection, memberKey }: ConstructSpaceParams): Promise<Space>;
42
+ constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey, }: ConstructSpaceParams): Promise<Space>;
42
43
  }
43
44
  //# sourceMappingURL=space-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAmB,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,mBAAmB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CAClD,CAAC;AAEF;;GAEG;AACH,qBACa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,kBAAkB;IAUzG,IAAI,MAAM,iCAET;IAGK,IAAI;IAGJ,KAAK;IAIL,cAAc,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAE,SAAS,EAAE,EAAE,oBAAoB;CA8BvG"}
1
+ {"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAEvD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AACzE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAmB,aAAa,EAAE,MAAM,WAAW,CAAC;AAC3D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEhE,MAAM,MAAM,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;IAC/B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,SAAS,EAAE,SAAS,CAAC;IACrB,mBAAmB,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;IACjD,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,qBACa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAoD;IAC5E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IACpD,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,WAAW,CAA8B;gBAE9C,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,kBAAkB;IAUzG,IAAI,MAAM,iCAET;IAGK,IAAI;IAGJ,KAAK;IAIL,cAAc,CAAC,EACnB,QAAQ,EACR,aAAa,EACb,mBAAmB,EACnB,aAAa,EACb,SAAS,GACV,EAAE,oBAAoB;CA+BxB"}
@@ -22,6 +22,7 @@ export type SpaceProtocolOptions = {
22
22
  * Additional extensions can be added here.
23
23
  */
24
24
  onSessionAuth?: (session: Teleport) => void;
25
+ onAuthFailure?: (session: Teleport) => void;
25
26
  };
26
27
  /**
27
28
  * Manages Teleport protocol stream creation and joining swarms with replication and presence extensions.
@@ -30,6 +31,7 @@ export declare class SpaceProtocol {
30
31
  private readonly _networkManager;
31
32
  private readonly _swarmIdentity;
32
33
  private readonly _onSessionAuth?;
34
+ private readonly _onAuthFailure?;
33
35
  private readonly _topic;
34
36
  private readonly _feeds;
35
37
  private readonly _sessions;
@@ -37,7 +39,7 @@ export declare class SpaceProtocol {
37
39
  get sessions(): ReadonlyMap<PublicKey, SpaceProtocolSession>;
38
40
  get feeds(): ReadonlySet<FeedWrapper<FeedMessage>>;
39
41
  private get _ownPeerKey();
40
- constructor({ topic, swarmIdentity, networkManager, onSessionAuth }: SpaceProtocolOptions);
42
+ constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure }: SpaceProtocolOptions);
41
43
  addFeed(feed: FeedWrapper<FeedMessage>): void;
42
44
  start(): Promise<void>;
43
45
  stop(): Promise<void>;
@@ -51,6 +53,7 @@ export type SpaceProtocolSessionParams = {
51
53
  * Additional extensions can be added here.
52
54
  */
53
55
  onSessionAuth?: (session: Teleport) => void;
56
+ onAuthFailure?: (session: Teleport) => void;
54
57
  };
55
58
  export declare enum AuthStatus {
56
59
  INITIAL = "INITIAL",
@@ -63,12 +66,13 @@ export declare enum AuthStatus {
63
66
  export declare class SpaceProtocolSession implements WireProtocol {
64
67
  private readonly _wireParams;
65
68
  private readonly _onSessionAuth?;
69
+ private readonly _onAuthFailure?;
66
70
  private readonly _swarmIdentity;
67
71
  private readonly _teleport;
68
72
  readonly replicator: ReplicatorExtension;
69
73
  private _authStatus;
70
74
  get authStatus(): AuthStatus;
71
- constructor({ wireParams, swarmIdentity, onSessionAuth }: SpaceProtocolSessionParams);
75
+ constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure }: SpaceProtocolSessionParams);
72
76
  get stream(): import("stream").Duplex;
73
77
  initialize(): Promise<void>;
74
78
  destroy(): Promise<void>;
@@ -1 +1 @@
1
- {"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":";AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAEL,cAAc,EAEd,YAAY,EACZ,kBAAkB,EAEnB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,qCAAqC,CAAC;AAG1E,OAAO,EAAiB,YAAY,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEnE,eAAO,MAAM,kBAAkB,EAAE,YAA+D,CAAC;AACjG,eAAO,MAAM,kBAAkB,EAAE,YAAwE,CAAC;AAG1G,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,SAAS,CAAC;IACnB,kBAAkB,EAAE,YAAY,CAAC;IACjC,uBAAuB,EAAE,YAAY,CAAC;CACvC;AAED,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;IACjB,aAAa,EAAE,aAAa,CAAC;IAC7B,cAAc,EAAE,cAAc,CAAC;IAC/B;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAiB;IACjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAC/C,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA8B;IAG9D,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAuC;IAC9D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAmE;IAE7F,OAAO,CAAC,WAAW,CAAC,CAAkB;IAEtC,IAAI,QAAQ,IAAI,WAAW,CAAC,SAAS,EAAE,oBAAoB,CAAC,CAE3D;IAED,IAAI,KAAK,IAAI,WAAW,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAEjD;IAGD,OAAO,KAAK,WAAW,GAEtB;gBAEW,EAAE,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,aAAa,EAAE,EAAE,oBAAoB;IASzF,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAShC,KAAK;IA2BL,IAAI;IAQV,OAAO,CAAC,uBAAuB;CAgBhC;AAED,MAAM,MAAM,0BAA0B,GAAG;IACvC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,aAAa,EAAE,aAAa,CAAC;IAC7B;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,QAAQ,KAAK,IAAI,CAAC;CAC7C,CAAC;AAEF,oBAAY,UAAU;IACpB,OAAO,YAAY;IACnB,OAAO,YAAY;IACnB,OAAO,YAAY;CACpB;AAGD;;GAEG;AACH,qBAAa,oBAAqB,YAAW,YAAY;IAEvD,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IAEjD,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAC,CAA8B;IAC9D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAgB;IAE/C,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IAGrC,SAAgB,UAAU,sBAA0D;IAEpF,OAAO,CAAC,WAAW,CAAsB;IAEzC,IACI,UAAU,eAEb;gBAGW,EAAE,UAAU,EAAE,aAAa,EAAE,aAAa,EAAE,EAAE,0BAA0B;IAQpF,IAAI,MAAM,4BAET;IAEK,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAsB3B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;CAG/B"}
1
+ {"version":3,"file":"space-protocol.d.ts","sourceRoot":"","sources":["../../../../src/space/space-protocol.ts"],"names":[],"mappings":"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"}
@@ -29,13 +29,14 @@ export declare class DatabaseTestPeer {
29
29
  timeframe: Timeframe;
30
30
  snapshot: SpaceSnapshot | undefined;
31
31
  private readonly _onConfirm;
32
+ private readonly _writes;
32
33
  constructor(rig: DatabaseTestBuilder);
33
34
  open(): Promise<void>;
34
35
  /**
35
36
  * Confirm mutations written to the local feed.
36
37
  * @param seq Sequence number of the mutation to confirm. If not specified, all mutations will be confirmed.
37
38
  */
38
- confirm(seq?: number): void;
39
+ confirm(seq?: number): Promise<void>;
39
40
  /**
40
41
  * Replicate the database to the specified timeframe.
41
42
  * @param to Timeframe to replicate to. If not specified, the database will be replicated to the latest timeframe (based on all other peers).
@@ -1 +1 @@
1
- {"version":3,"file":"database-test-rig.d.ts","sourceRoot":"","sources":["../../../../src/testing/database-test-rig.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,qBAAa,mBAAmB;IAC9B,SAAgB,KAAK,0CAA+D;IAE9E,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAM9C;AAED,qBAAa,gBAAgB;aA+BC,GAAG,EAAE,mBAAmB;IA9BpD,SAAgB,YAAY,eAA4E;IAEjG,KAAK,EAAG,WAAW,CAAC;IACpB,KAAK,EAAG,aAAa,CAAC;IAEtB,IAAI,EAAG,YAAY,CAAC;IACpB,SAAS,EAAG,WAAW,CAAC;IAM/B,SAAgB,GAAG,YAAsB;IAElC,YAAY,EAAE,WAAW,EAAE,CAAM;IAExC;;OAEG;IACI,SAAS,SAAM;IAEtB;;OAEG;IACI,SAAS,YAAmB;IAE5B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;gBAEd,GAAG,EAAE,mBAAmB;IAE9C,IAAI;IA8BV;;;OAGG;IACH,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM;IAOpB;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS;IAUxB;;OAEG;IACG,MAAM;IAOZ;;OAEG;IACH,YAAY,IAAI,aAAa;IAS7B;;;OAGG;IACH,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,gBAAgB;CAmCzB"}
1
+ {"version":3,"file":"database-test-rig.d.ts","sourceRoot":"","sources":["../../../../src/testing/database-test-rig.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAE3D,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,UAAU,EAAwB,MAAM,YAAY,CAAC;AAE9D,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAIzC,qBAAa,mBAAmB;IAC9B,SAAgB,KAAK,0CAA+D;IAE9E,UAAU,IAAI,OAAO,CAAC,gBAAgB,CAAC;CAM9C;AAQD,qBAAa,gBAAgB;aAiCC,GAAG,EAAE,mBAAmB;IAhCpD,SAAgB,YAAY,eAA4E;IAEjG,KAAK,EAAG,WAAW,CAAC;IACpB,KAAK,EAAG,aAAa,CAAC;IAEtB,IAAI,EAAG,YAAY,CAAC;IACpB,SAAS,EAAG,WAAW,CAAC;IAM/B,SAAgB,GAAG,YAAsB;IAElC,YAAY,EAAE,WAAW,EAAE,CAAM;IAExC;;OAEG;IACI,SAAS,SAAM;IAEtB;;OAEG;IACI,SAAS,YAAmB;IAE5B,QAAQ,EAAE,aAAa,GAAG,SAAS,CAAC;IAE3C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAe;IAE1C,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA2B;gBAEvB,GAAG,EAAE,mBAAmB;IAE9C,IAAI;IAoCV;;;OAGG;IACG,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM;IAe1B;;;OAGG;IACH,SAAS,CAAC,EAAE,CAAC,EAAE,SAAS;IAUxB;;OAEG;IACG,MAAM;IAOZ;;OAEG;IACH,YAAY,IAAI,aAAa;IAS7B;;;OAGG;IACH,OAAO,CAAC,SAAS;IAgBjB,OAAO,CAAC,gBAAgB;CAmCzB"}
@@ -54,7 +54,7 @@ export declare class TestAgent {
54
54
  getSpace(spaceKey: PublicKey): Space | undefined;
55
55
  private _spaceManager?;
56
56
  get spaceManager(): SpaceManager;
57
- createSpace(identityKey?: PublicKey, spaceKey?: PublicKey, genesisKey?: PublicKey, dataKey?: PublicKey): Promise<Space>;
57
+ createSpace(identityKey?: PublicKey, spaceKey?: PublicKey, genesisKey?: PublicKey, dataKey?: PublicKey, saveMetadata?: boolean): Promise<Space>;
58
58
  createSpaceProtocol(topic: PublicKey, gossip?: Gossip): SpaceProtocol;
59
59
  createGossip(): Gossip;
60
60
  createPresence(gossip?: Gossip): Presence;
@@ -1 +1 @@
1
- {"version":3,"file":"test-agent-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-agent-builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"test-agent-builder.d.ts","sourceRoot":"","sources":["../../../../src/testing/test-agent-builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dxos/echo-pipeline",
3
- "version": "0.1.46",
3
+ "version": "0.1.48-next.83f55fd",
4
4
  "description": "ECHO database.",
5
5
  "homepage": "https://dxos.org",
6
6
  "bugs": "https://github.com/dxos/dxos/issues",
@@ -21,34 +21,34 @@
21
21
  "dependencies": {
22
22
  "crc-32": "^1.2.2",
23
23
  "debug": "^4.3.3",
24
- "@dxos/async": "0.1.46",
25
- "@dxos/codec-protobuf": "0.1.46",
26
- "@dxos/context": "0.1.46",
27
- "@dxos/credentials": "0.1.46",
28
- "@dxos/crypto": "0.1.46",
29
- "@dxos/debug": "0.1.46",
30
- "@dxos/document-model": "0.1.46",
31
- "@dxos/echo-db": "0.1.46",
32
- "@dxos/errors": "0.1.46",
33
- "@dxos/feed-store": "0.1.46",
34
- "@dxos/hypercore": "0.1.46",
35
- "@dxos/keyring": "0.1.46",
36
- "@dxos/keys": "0.1.46",
37
- "@dxos/log": "0.1.46",
38
- "@dxos/messaging": "0.1.46",
39
- "@dxos/model-factory": "0.1.46",
40
- "@dxos/network-manager": "0.1.46",
41
- "@dxos/node-std": "0.1.46",
42
- "@dxos/protocols": "0.1.46",
43
- "@dxos/random-access-storage": "0.1.46",
44
- "@dxos/rpc": "0.1.46",
45
- "@dxos/teleport": "0.1.46",
46
- "@dxos/teleport-extension-gossip": "0.1.46",
47
- "@dxos/teleport-extension-object-sync": "0.1.46",
48
- "@dxos/teleport-extension-replicator": "0.1.46",
49
- "@dxos/timeframe": "0.1.46",
50
- "@dxos/typings": "0.1.46",
51
- "@dxos/util": "0.1.46"
24
+ "@dxos/async": "0.1.48-next.83f55fd",
25
+ "@dxos/codec-protobuf": "0.1.48-next.83f55fd",
26
+ "@dxos/context": "0.1.48-next.83f55fd",
27
+ "@dxos/credentials": "0.1.48-next.83f55fd",
28
+ "@dxos/crypto": "0.1.48-next.83f55fd",
29
+ "@dxos/debug": "0.1.48-next.83f55fd",
30
+ "@dxos/document-model": "0.1.48-next.83f55fd",
31
+ "@dxos/echo-db": "0.1.48-next.83f55fd",
32
+ "@dxos/errors": "0.1.48-next.83f55fd",
33
+ "@dxos/feed-store": "0.1.48-next.83f55fd",
34
+ "@dxos/hypercore": "0.1.48-next.83f55fd",
35
+ "@dxos/keyring": "0.1.48-next.83f55fd",
36
+ "@dxos/keys": "0.1.48-next.83f55fd",
37
+ "@dxos/log": "0.1.48-next.83f55fd",
38
+ "@dxos/messaging": "0.1.48-next.83f55fd",
39
+ "@dxos/model-factory": "0.1.48-next.83f55fd",
40
+ "@dxos/network-manager": "0.1.48-next.83f55fd",
41
+ "@dxos/node-std": "0.1.48-next.83f55fd",
42
+ "@dxos/protocols": "0.1.48-next.83f55fd",
43
+ "@dxos/random-access-storage": "0.1.48-next.83f55fd",
44
+ "@dxos/rpc": "0.1.48-next.83f55fd",
45
+ "@dxos/teleport": "0.1.48-next.83f55fd",
46
+ "@dxos/teleport-extension-gossip": "0.1.48-next.83f55fd",
47
+ "@dxos/teleport-extension-object-sync": "0.1.48-next.83f55fd",
48
+ "@dxos/teleport-extension-replicator": "0.1.48-next.83f55fd",
49
+ "@dxos/timeframe": "0.1.48-next.83f55fd",
50
+ "@dxos/typings": "0.1.48-next.83f55fd",
51
+ "@dxos/util": "0.1.48-next.83f55fd"
52
52
  },
53
53
  "devDependencies": {
54
54
  "@types/debug": "^4.1.7",
@@ -56,7 +56,7 @@
56
56
  "hypercore-protocol": "^8.0.7",
57
57
  "source-map-support": "^0.5.12",
58
58
  "wait-for-expect": "^3.0.2",
59
- "@dxos/text-model": "0.1.46"
59
+ "@dxos/text-model": "0.1.48-next.83f55fd"
60
60
  },
61
61
  "publishConfig": {
62
62
  "access": "public"
@@ -10,6 +10,7 @@ import { FeedWriter } from '@dxos/feed-store';
10
10
  import { PublicKey } from '@dxos/keys';
11
11
  import { log } from '@dxos/log';
12
12
  import { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';
13
+ import { EchoObjectBatch } from '@dxos/protocols/proto/dxos/echo/object';
13
14
  import { EchoEvent, MutationReceipt, WriteRequest } from '@dxos/protocols/proto/dxos/echo/service';
14
15
  import { ComplexMap } from '@dxos/util';
15
16
 
@@ -46,6 +47,7 @@ export class DataServiceHost {
46
47
 
47
48
  this._itemDemuxer.mutation.on(ctx, (message) => {
48
49
  const { batch, meta } = message;
50
+ assert(!(meta as any).clientTag, 'Unexpected client tag in mutation message');
49
51
  log('message', { batch, meta });
50
52
 
51
53
  const clientTag = this._clientTagMap.get([message.meta.feedKey, message.meta.seq]);
@@ -53,12 +55,12 @@ export class DataServiceHost {
53
55
 
54
56
  // Assign feed metadata
55
57
  batch.objects?.forEach((object) => {
56
- setMetadataOnObject(object, meta);
58
+ setMetadataOnObject(object, { ...meta });
57
59
  });
58
60
 
59
61
  // Assign client tag metadata
60
62
  if (clientTag) {
61
- tagMutationsInBatch(batch, clientTag);
63
+ tagMutationsInBatch(batch, clientTag, 0);
62
64
  }
63
65
 
64
66
  next({
@@ -77,18 +79,8 @@ export class DataServiceHost {
77
79
  log('write', { clientTag: request.clientTag, objectCount: request.batch.objects?.length ?? 0 });
78
80
 
79
81
  // Clear client metadata.
80
- const message: DataMessage = {
81
- batch: {
82
- objects: request.batch.objects?.map((object) => ({
83
- ...object,
84
- mutations: object.mutations?.map((mutation) => ({
85
- ...mutation,
86
- meta: undefined,
87
- })),
88
- meta: undefined,
89
- })),
90
- },
91
- };
82
+ const message = createDataMessage(request.batch);
83
+
92
84
  const receipt = await this._writeStream.write(message, {
93
85
  afterWrite: async (receipt) => {
94
86
  // Runs before the mutation is read from the pipeline.
@@ -102,3 +94,16 @@ export class DataServiceHost {
102
94
  return receipt;
103
95
  }
104
96
  }
97
+
98
+ const createDataMessage = (batch: EchoObjectBatch) => ({
99
+ batch: {
100
+ objects: batch.objects?.map((object) => ({
101
+ ...object,
102
+ mutations: object.mutations?.map((mutation) => ({
103
+ ...mutation,
104
+ meta: undefined,
105
+ })),
106
+ meta: undefined,
107
+ })),
108
+ },
109
+ });
package/src/space/auth.ts CHANGED
@@ -72,7 +72,7 @@ export class AuthExtension extends RpcExtension<Services, Services> {
72
72
  assert(success, 'credential not verified');
73
73
  runInContext(this._ctx, () => this._authParams.onAuthSuccess());
74
74
  } catch (err) {
75
- log.warn('auth failed', err);
75
+ log('auth failed', err);
76
76
  this.close();
77
77
  this._authParams.onAuthFailure();
78
78
  }
@@ -33,6 +33,7 @@ export type ConstructSpaceParams = {
33
33
  swarmIdentity: SwarmIdentity;
34
34
  memberKey: PublicKey;
35
35
  onNetworkConnection: (session: Teleport) => void;
36
+ onAuthFailure?: (session: Teleport) => void;
36
37
  };
37
38
 
38
39
  /**
@@ -70,7 +71,13 @@ export class SpaceManager {
70
71
  await Promise.all([...this._spaces.values()].map((space) => space.close()));
71
72
  }
72
73
 
73
- async constructSpace({ metadata, swarmIdentity, onNetworkConnection, memberKey }: ConstructSpaceParams) {
74
+ async constructSpace({
75
+ metadata,
76
+ swarmIdentity,
77
+ onNetworkConnection,
78
+ onAuthFailure,
79
+ memberKey,
80
+ }: ConstructSpaceParams) {
74
81
  log.trace('dxos.echo.space-manager.construct-space', trace.begin({ id: this._instanceId }));
75
82
  log('constructing space...', { spaceKey: metadata.genesisFeedKey });
76
83
 
@@ -83,6 +90,7 @@ export class SpaceManager {
83
90
  swarmIdentity,
84
91
  networkManager: this._networkManager,
85
92
  onSessionAuth: onNetworkConnection,
93
+ onAuthFailure,
86
94
  });
87
95
  const snapshotManager = new SnapshotManager(this._snapshotStore);
88
96
 
@@ -40,6 +40,7 @@ export type SpaceProtocolOptions = {
40
40
  * Additional extensions can be added here.
41
41
  */
42
42
  onSessionAuth?: (session: Teleport) => void;
43
+ onAuthFailure?: (session: Teleport) => void;
43
44
  };
44
45
 
45
46
  /**
@@ -49,6 +50,7 @@ export class SpaceProtocol {
49
50
  private readonly _networkManager: NetworkManager;
50
51
  private readonly _swarmIdentity: SwarmIdentity;
51
52
  private readonly _onSessionAuth?: (session: Teleport) => void;
53
+ private readonly _onAuthFailure?: (session: Teleport) => void;
52
54
 
53
55
  @logInfo
54
56
  private readonly _topic: PublicKey;
@@ -71,10 +73,11 @@ export class SpaceProtocol {
71
73
  return this._swarmIdentity.peerKey;
72
74
  }
73
75
 
74
- constructor({ topic, swarmIdentity, networkManager, onSessionAuth }: SpaceProtocolOptions) {
76
+ constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure }: SpaceProtocolOptions) {
75
77
  this._networkManager = networkManager;
76
78
  this._swarmIdentity = swarmIdentity;
77
79
  this._onSessionAuth = onSessionAuth;
80
+ this._onAuthFailure = onAuthFailure;
78
81
 
79
82
  this._topic = PublicKey.from(discoveryKey(sha256(topic.toHex())));
80
83
  }
@@ -130,6 +133,7 @@ export class SpaceProtocol {
130
133
  wireParams,
131
134
  swarmIdentity: this._swarmIdentity,
132
135
  onSessionAuth: this._onSessionAuth,
136
+ onAuthFailure: this._onAuthFailure,
133
137
  });
134
138
  this._sessions.set(wireParams.remotePeerId, session);
135
139
 
@@ -150,6 +154,8 @@ export type SpaceProtocolSessionParams = {
150
154
  * Additional extensions can be added here.
151
155
  */
152
156
  onSessionAuth?: (session: Teleport) => void;
157
+
158
+ onAuthFailure?: (session: Teleport) => void;
153
159
  };
154
160
 
155
161
  export enum AuthStatus {
@@ -167,6 +173,7 @@ export class SpaceProtocolSession implements WireProtocol {
167
173
  private readonly _wireParams: WireProtocolParams;
168
174
 
169
175
  private readonly _onSessionAuth?: (session: Teleport) => void;
176
+ private readonly _onAuthFailure?: (session: Teleport) => void;
170
177
  private readonly _swarmIdentity: SwarmIdentity;
171
178
 
172
179
  private readonly _teleport: Teleport;
@@ -182,10 +189,11 @@ export class SpaceProtocolSession implements WireProtocol {
182
189
  }
183
190
 
184
191
  // TODO(dmaretskyi): Allow to pass in extra extensions.
185
- constructor({ wireParams, swarmIdentity, onSessionAuth }: SpaceProtocolSessionParams) {
192
+ constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure }: SpaceProtocolSessionParams) {
186
193
  this._wireParams = wireParams;
187
194
  this._swarmIdentity = swarmIdentity;
188
195
  this._onSessionAuth = onSessionAuth;
196
+ this._onAuthFailure = onAuthFailure;
189
197
 
190
198
  this._teleport = new Teleport(wireParams);
191
199
  }
@@ -202,14 +210,14 @@ export class SpaceProtocolSession implements WireProtocol {
202
210
  provider: this._swarmIdentity.credentialProvider,
203
211
  verifier: this._swarmIdentity.credentialAuthenticator,
204
212
  onAuthSuccess: () => {
205
- this._authStatus = AuthStatus.SUCCESS;
206
213
  log('Peer authenticated');
214
+ this._authStatus = AuthStatus.SUCCESS;
207
215
  this._onSessionAuth?.(this._teleport);
208
216
  // TODO(dmaretskyi): Configure replicator to upload.
209
217
  },
210
218
  onAuthFailure: () => {
211
- log.warn('Auth failed');
212
219
  this._authStatus = AuthStatus.FAILURE;
220
+ this._onAuthFailure?.(this._teleport);
213
221
  },
214
222
  }),
215
223
  );
@@ -70,7 +70,7 @@ describe('space/space', () => {
70
70
  const [agent2, space2] = await run(async () => {
71
71
  // NOTE: The genesisKey would be passed as part of the invitation.
72
72
  const agent = await builder.createPeer();
73
- const space = await agent.createSpace(agent.identityKey, space1.key, space1.genesisFeedKey);
73
+ const space = await agent.createSpace(agent.identityKey, space1.key, space1.genesisFeedKey, undefined, true);
74
74
 
75
75
  await space.open();
76
76
  expect(space.isOpen).toBeTruthy();
@@ -242,7 +242,7 @@ export class Space {
242
242
  }
243
243
 
244
244
  async initializeDataPipeline() {
245
- log.info('initializeDataPipeline');
245
+ log('initializeDataPipeline');
246
246
  assert(this._isOpen, 'Space must be open to initialize data pipeline.');
247
247
  await this._dataPipeline.open();
248
248
  await this._dataPipelineCredentialConsumer!.open();
@@ -2,9 +2,10 @@
2
2
  // Copyright 2023 DXOS.org
3
3
  //
4
4
 
5
- import { Event } from '@dxos/async';
5
+ import { Event, Trigger } from '@dxos/async';
6
6
  import { DocumentModel } from '@dxos/document-model';
7
7
  import { DatabaseProxy, ItemManager } from '@dxos/echo-db';
8
+ import { WriteOptions, WriteReceipt } from '@dxos/feed-store';
8
9
  import { PublicKey } from '@dxos/keys';
9
10
  import { ModelFactory } from '@dxos/model-factory';
10
11
  import { FeedMessageBlock } from '@dxos/protocols';
@@ -29,6 +30,12 @@ export class DatabaseTestBuilder {
29
30
  }
30
31
  }
31
32
 
33
+ type WriteRequest = {
34
+ receipt: WriteReceipt;
35
+ options: WriteOptions;
36
+ trigger: Trigger;
37
+ };
38
+
32
39
  export class DatabaseTestPeer {
33
40
  public readonly modelFactory = new ModelFactory().registerModel(DocumentModel).registerModel(TextModel);
34
41
 
@@ -60,12 +67,14 @@ export class DatabaseTestPeer {
60
67
 
61
68
  private readonly _onConfirm = new Event();
62
69
 
70
+ private readonly _writes = new Set<WriteRequest>();
71
+
63
72
  constructor(public readonly rig: DatabaseTestBuilder) {}
64
73
 
65
74
  async open() {
66
75
  this.hostItems = new ItemManager(this.modelFactory);
67
76
  this.host = new DatabaseHost({
68
- write: async (message) => {
77
+ write: async (message, { afterWrite }: WriteOptions) => {
69
78
  const seq =
70
79
  this.feedMessages.push({
71
80
  timeframe: this.timeframe,
@@ -74,11 +83,17 @@ export class DatabaseTestPeer {
74
83
  },
75
84
  }) - 1;
76
85
 
77
- await this._onConfirm.waitFor(() => this.confirmed >= seq);
78
- return {
79
- seq,
80
- feedKey: this.key,
86
+ const request: WriteRequest = {
87
+ receipt: {
88
+ seq,
89
+ feedKey: this.key,
90
+ },
91
+ options: { afterWrite },
92
+ trigger: new Trigger(),
81
93
  };
94
+ this._writes.add(request);
95
+ await request.trigger.wait();
96
+ return request.receipt;
82
97
  },
83
98
  });
84
99
 
@@ -96,10 +111,18 @@ export class DatabaseTestPeer {
96
111
  * Confirm mutations written to the local feed.
97
112
  * @param seq Sequence number of the mutation to confirm. If not specified, all mutations will be confirmed.
98
113
  */
99
- confirm(seq?: number) {
114
+ async confirm(seq?: number) {
100
115
  this.confirmed = seq ?? this.feedMessages.length - 1;
101
116
  this._onConfirm.emit();
102
117
 
118
+ for (const request of [...this._writes]) {
119
+ if (this.confirmed >= request.receipt.seq) {
120
+ this._writes.delete(request);
121
+ await request.options.afterWrite?.(request.receipt);
122
+ request.trigger.wake();
123
+ }
124
+ }
125
+
103
126
  this._processMessages(Timeframe.merge(this.timeframe, new Timeframe([[this.key, this.confirmed]])));
104
127
  }
105
128
 
@@ -146,8 +146,8 @@ export class TestAgent {
146
146
  spaceKey?: PublicKey,
147
147
  genesisKey?: PublicKey,
148
148
  dataKey?: PublicKey,
149
+ saveMetadata = false,
149
150
  ): Promise<Space> {
150
- let saveMetadata = false;
151
151
  if (!spaceKey) {
152
152
  saveMetadata = true;
153
153
  spaceKey = await this.keyring.createKey();
@@ -4,8 +4,8 @@
4
4
 
5
5
  import expect from 'expect';
6
6
 
7
- import { DocumentModel, MutationBuilder } from '@dxos/document-model';
8
- import { createModelMutation, encodeModelMutation, genesisMutation } from '@dxos/echo-db';
7
+ import { DocumentModel, MutationBuilder, OrderedArray } from '@dxos/document-model';
8
+ import { Item, createModelMutation, encodeModelMutation, genesisMutation } from '@dxos/echo-db';
9
9
  import { PublicKey } from '@dxos/keys';
10
10
  import { describe, test } from '@dxos/test';
11
11
  import { Timeframe } from '@dxos/timeframe';
@@ -23,7 +23,7 @@ describe('database (unit)', () => {
23
23
  createModelMutation(id, encodeModelMutation(DocumentModel.meta, new MutationBuilder().set('test', 42).build())),
24
24
  );
25
25
 
26
- peer.confirm();
26
+ await peer.confirm();
27
27
  expect(peer.confirmed).toEqual(1);
28
28
  expect(peer.timeframe).toEqual(new Timeframe([[peer.key, 1]]));
29
29
 
@@ -47,7 +47,7 @@ describe('database (unit)', () => {
47
47
  createModelMutation(id, encodeModelMutation(DocumentModel.meta, new MutationBuilder().set('test', 42).build())),
48
48
  );
49
49
 
50
- peer.confirm();
50
+ await peer.confirm();
51
51
  expect(peer.confirmed).toEqual(1);
52
52
  expect(peer.timeframe).toEqual(new Timeframe([[peer.key, 1]]));
53
53
  peer.makeSnapshot();
@@ -72,7 +72,7 @@ describe('database (unit)', () => {
72
72
  peer1.proxy.mutate(
73
73
  createModelMutation(id, encodeModelMutation(DocumentModel.meta, new MutationBuilder().set('test', 42).build())),
74
74
  );
75
- peer1.confirm();
75
+ await peer1.confirm();
76
76
 
77
77
  peer2.replicate(peer1.timeframe);
78
78
 
@@ -92,29 +92,70 @@ describe('database (unit)', () => {
92
92
  createModelMutation(id, encodeModelMutation(DocumentModel.meta, new MutationBuilder().set('test', 42).build())),
93
93
  );
94
94
 
95
- peer1.confirm();
95
+ await peer1.confirm();
96
96
  peer2.replicate(peer1.timeframe);
97
97
 
98
98
  expect(peer2.items.getItem(id)).toBeUndefined();
99
99
 
100
100
  peer1.proxy.commitBatch();
101
- peer1.confirm();
101
+ await peer1.confirm();
102
102
  peer2.replicate(peer1.timeframe);
103
103
 
104
104
  // TODO(dmaretskyi): Helper functions to compare state.
105
105
  expect(peer1.items.getItem(id)!.state).toEqual(peer1.items.getItem(id)!.state);
106
106
  });
107
107
 
108
- // TODO(dmaretskyi): Flush is broken in this test database fixture.
109
- test
110
- .skip('flush', async () => {
111
- const builder = new DatabaseTestBuilder();
112
- const peer = await builder.createPeer();
108
+ test('flush', async () => {
109
+ const builder = new DatabaseTestBuilder();
110
+ const peer = await builder.createPeer();
111
+
112
+ const id = PublicKey.random().toHex();
113
+ peer.proxy.mutate(genesisMutation(id, DocumentModel.meta.type));
114
+ await peer.confirm();
115
+ await peer.proxy.flush();
116
+ }).timeout(100);
113
117
 
118
+ describe('DocumentModel', () => {
119
+ test('array assign and push', async () => {
120
+ const builder = new DatabaseTestBuilder();
121
+ const peer1 = await builder.createPeer();
114
122
  const id = PublicKey.random().toHex();
115
- peer.proxy.mutate(genesisMutation(id, DocumentModel.meta.type));
116
- peer.confirm();
117
- await peer.proxy.flush();
118
- })
119
- .timeout(100);
123
+ const { objectsUpdated } = peer1.proxy.mutate(genesisMutation(id, DocumentModel.meta.type));
124
+ const item = objectsUpdated[0] as Item<DocumentModel>;
125
+ const model = new DocumentModel(DocumentModel.meta, item.id, () => item.state);
126
+
127
+ peer1.proxy.mutate(
128
+ createModelMutation(
129
+ id,
130
+ encodeModelMutation(
131
+ DocumentModel.meta,
132
+ model
133
+ .builder()
134
+ .set('tags', OrderedArray.fromValues(['red']))
135
+ .build(),
136
+ ),
137
+ ),
138
+ );
139
+ await peer1.confirm();
140
+ expect(model.get('tags').toArray()).toHaveLength(1);
141
+
142
+ peer1.proxy.mutate(
143
+ createModelMutation(
144
+ id,
145
+ encodeModelMutation(DocumentModel.meta, model.builder().set('tags', OrderedArray.fromValues([])).build()),
146
+ ),
147
+ );
148
+ await peer1.confirm();
149
+ expect(model.get('tags').toArray()).toHaveLength(0);
150
+
151
+ peer1.proxy.mutate(
152
+ createModelMutation(
153
+ id,
154
+ encodeModelMutation(DocumentModel.meta, model.builder().arrayPush('tags', ['green']).build()),
155
+ ),
156
+ );
157
+ await peer1.confirm();
158
+ expect(model.get('tags').toArray()).toHaveLength(1);
159
+ });
160
+ });
120
161
  });