@dxos/echo-pipeline 0.1.50 → 0.1.51-main.04cd027

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-CSFWTLPD.mjs → chunk-KTQITKUX.mjs} +191 -60
  2. package/dist/lib/browser/chunk-KTQITKUX.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 +4 -3
  6. package/dist/lib/browser/testing/index.mjs.map +3 -3
  7. package/dist/lib/node/index.cjs +197 -66
  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 +207 -75
  11. package/dist/lib/node/testing/index.cjs.map +3 -3
  12. package/dist/types/src/dbhost/snapshot-manager.d.ts +2 -1
  13. package/dist/types/src/dbhost/snapshot-manager.d.ts.map +1 -1
  14. package/dist/types/src/metadata/metadata-store.d.ts +2 -1
  15. package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
  16. package/dist/types/src/pipeline/pipeline.d.ts +1 -0
  17. package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
  18. package/dist/types/src/space/control-pipeline.d.ts +9 -1
  19. package/dist/types/src/space/control-pipeline.d.ts.map +1 -1
  20. package/dist/types/src/space/data-pipeline.d.ts +10 -0
  21. package/dist/types/src/space/data-pipeline.d.ts.map +1 -1
  22. package/dist/types/src/space/space.d.ts +2 -2
  23. package/dist/types/src/space/space.d.ts.map +1 -1
  24. package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
  25. package/package.json +30 -30
  26. package/src/dbhost/snapshot-manager.ts +4 -3
  27. package/src/metadata/metadata-store.ts +12 -1
  28. package/src/pipeline/pipeline.ts +24 -0
  29. package/src/space/control-pipeline.test.ts +4 -0
  30. package/src/space/control-pipeline.ts +36 -1
  31. package/src/space/data-pipeline.ts +62 -8
  32. package/src/space/space-manager.ts +1 -1
  33. package/src/space/space.test.ts +2 -5
  34. package/src/space/space.ts +11 -7
  35. package/src/testing/test-agent-builder.ts +4 -1
  36. package/src/testing/util.ts +1 -1
  37. package/dist/lib/browser/chunk-CSFWTLPD.mjs.map +0 -7
@@ -1,3 +1,4 @@
1
+ import { Context } from '@dxos/context';
1
2
  import { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';
2
3
  import { ObjectSync } from '@dxos/teleport-extension-object-sync';
3
4
  import { SnapshotStore } from './snapshot-store';
@@ -11,7 +12,7 @@ export declare class SnapshotManager {
11
12
  get objectSync(): ObjectSync;
12
13
  open(): Promise<void>;
13
14
  close(): Promise<void>;
14
- load(id: string): Promise<SpaceSnapshot>;
15
+ load(ctx: Context, id: string): Promise<SpaceSnapshot>;
15
16
  store(snapshot: SpaceSnapshot): Promise<string>;
16
17
  }
17
18
  //# sourceMappingURL=snapshot-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"snapshot-manager.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/snapshot-manager.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,qBACa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAItB,cAAc,EAAE,aAAa;IAsBhD,IAAI,UAAU,eAEb;IAEK,IAAI;IAIJ,KAAK;IAKL,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUxC,KAAK,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;CAItD"}
1
+ {"version":3,"file":"snapshot-manager.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/snapshot-manager.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,OAAO,EAAqB,MAAM,eAAe,CAAC;AAI3D,OAAO,EAAE,aAAa,EAAE,MAAM,0CAA0C,CAAC;AAEzE,OAAO,EAAE,UAAU,EAAE,MAAM,sCAAsC,CAAC;AAElE,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEjD;;GAEG;AACH,qBACa,eAAe;IAKxB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAJjC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAa;gBAItB,cAAc,EAAE,aAAa;IAsBhD,IAAI,UAAU,eAEb;IAEK,IAAI;IAIJ,KAAK;IAKL,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAUtD,KAAK,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;CAItD"}
@@ -32,7 +32,8 @@ export declare class MetadataStore {
32
32
  getIdentityRecord(): IdentityRecord | undefined;
33
33
  setIdentityRecord(record: IdentityRecord): Promise<void>;
34
34
  addSpace(record: SpaceMetadata): Promise<void>;
35
- setSpaceLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe): Promise<void>;
35
+ setSpaceDataLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe): Promise<void>;
36
+ setSpaceControlLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe): Promise<void>;
36
37
  setCache(spaceKey: PublicKey, cache: SpaceCache): Promise<void>;
37
38
  setWritableFeedKeys(spaceKey: PublicKey, controlFeedKey: PublicKey, dataFeedKey: PublicKey): Promise<void>;
38
39
  }
@@ -1 +1 @@
1
- {"version":3,"file":"metadata-store.d.ts","sourceRoot":"","sources":["../../../../src/metadata/metadata-store.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACnH,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,SAAS,CAAC;CACxB;AASD,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,SAAS,CAAqC;IACtD,SAAgB,MAAM,sBAA6B;gBAIhC,UAAU,EAAE,SAAS;IAGxC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,EAAE,CAE5B;IAED;;OAEG;IAEG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAiCb,KAAK;IA8BnB,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,aAAa;IAM7C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,iBAAiB,IAAI,cAAc,GAAG,SAAS;IAIzC,iBAAiB,CAAC,MAAM,EAAE,cAAc;IAOxC,QAAQ,CAAC,MAAM,EAAE,aAAa;IAU9B,uBAAuB,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAKjE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU;IAK/C,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;CAMjG"}
1
+ {"version":3,"file":"metadata-store.d.ts","sourceRoot":"","sources":["../../../../src/metadata/metadata-store.ts"],"names":[],"mappings":"AAOA,OAAO,EAAgB,KAAK,EAAE,MAAM,aAAa,CAAC;AAElD,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,0CAA0C,CAAC;AACnH,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,SAAS,CAAC;CACxB;AASD,qBAAa,aAAa;IAMtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAL7B,OAAO,CAAC,SAAS,CAAqC;IACtD,SAAgB,MAAM,sBAA6B;gBAIhC,UAAU,EAAE,SAAS;IAGxC,IAAI,QAAQ,IAAI,YAAY,CAE3B;IAED,IAAI,OAAO,IAAI,MAAM,CAEpB;IAED;;;OAGG;IACH,IAAI,MAAM,IAAI,aAAa,EAAE,CAE5B;IAED;;OAEG;IAEG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAiCb,KAAK;IA8BnB,SAAS,CAAC,QAAQ,EAAE,SAAS,GAAG,aAAa;IAW7C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,iBAAiB,IAAI,cAAc,GAAG,SAAS;IAIzC,iBAAiB,CAAC,MAAM,EAAE,cAAc;IAOxC,QAAQ,CAAC,MAAM,EAAE,aAAa;IAU9B,2BAA2B,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAKrE,8BAA8B,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS;IAKxE,QAAQ,CAAC,QAAQ,EAAE,SAAS,EAAE,KAAK,EAAE,UAAU;IAK/C,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;CAMjG"}
@@ -37,6 +37,7 @@ export declare class PipelineState {
37
37
  * NOTE: This might never be reached if the mutation dependencies
38
38
  */
39
39
  get endTimeframe(): Timeframe;
40
+ get startTimeframe(): Timeframe;
40
41
  get timeframe(): Timeframe;
41
42
  get pendingTimeframe(): Timeframe;
42
43
  get targetTimeframe(): Timeframe;
@@ -1 +1 @@
1
- {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"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"}
@@ -4,11 +4,13 @@ import { PublicKey } from '@dxos/keys';
4
4
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
5
5
  import { Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
6
6
  import { AsyncCallback, Callback } from '@dxos/util';
7
+ import { MetadataStore } from '../metadata';
7
8
  import { PipelineAccessor } from '../pipeline';
8
9
  export type ControlPipelineParams = {
9
10
  spaceKey: PublicKey;
10
11
  genesisFeed: FeedWrapper<FeedMessage>;
11
12
  feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;
13
+ metadataStore: MetadataStore;
12
14
  };
13
15
  /**
14
16
  * Processes HALO credentials, which include genesis and invitations.
@@ -16,14 +18,20 @@ export type ControlPipelineParams = {
16
18
  export declare class ControlPipeline {
17
19
  private readonly _pipeline;
18
20
  private readonly _spaceStateMachine;
21
+ private readonly _spaceKey;
22
+ private readonly _metadata;
23
+ private _targetTimeframe?;
24
+ private _lastTimeframeSaveTime;
19
25
  readonly onFeedAdmitted: Callback<AsyncCallback<FeedInfo>>;
20
26
  readonly onMemberAdmitted: Callback<AsyncCallback<MemberInfo>>;
21
27
  readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;
22
- constructor({ spaceKey, genesisFeed, feedProvider }: ControlPipelineParams);
28
+ constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineParams);
23
29
  get spaceState(): SpaceState;
24
30
  get pipeline(): PipelineAccessor;
25
31
  setWriteFeed(feed: FeedWrapper<FeedMessage>): void;
26
32
  start(): Promise<void>;
33
+ private _noteTargetStateIfNeeded;
27
34
  stop(): Promise<void>;
35
+ private _saveTargetTimeframe;
28
36
  }
29
37
  //# sourceMappingURL=control-pipeline.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"control-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/control-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAgB,UAAU,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAY,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;CACzE,CAAC;AAEF;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAEvD,SAAgB,cAAc,oCAA2C;IACzE,SAAgB,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,SAAgB,qBAAqB,EAAE,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;gBAE/D,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,EAAE,qBAAqB;IA0B1E,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;IAED,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAIrC,KAAK;IA0BL,IAAI;CAKX"}
1
+ {"version":3,"file":"control-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/control-pipeline.ts"],"names":[],"mappings":"AAIA,OAAO,EAAqB,UAAU,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACxF,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAgB,UAAU,EAAE,MAAM,6CAA6C,CAAC;AAEvF,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAY,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAEzD,MAAM,MAAM,qBAAqB,GAAG;IAClC,QAAQ,EAAE,SAAS,CAAC;IACpB,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;IACxE,aAAa,EAAE,aAAa,CAAC;CAC9B,CAAC;AAIF;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAW;IACrC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAoB;IAEvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAY;IACtC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAgB;IAC1C,OAAO,CAAC,gBAAgB,CAAC,CAAY;IACrC,OAAO,CAAC,sBAAsB,CAAsB;IAEpD,SAAgB,cAAc,oCAA2C;IACzE,SAAgB,gBAAgB,EAAE,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;IACtE,SAAgB,qBAAqB,EAAE,QAAQ,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC,CAAC;gBAE/D,EAAE,QAAQ,EAAE,WAAW,EAAE,YAAY,EAAE,aAAa,EAAE,EAAE,qBAAqB;IA4BzF,IAAI,UAAU,IAAI,UAAU,CAE3B;IAED,IAAI,QAAQ,IAAI,gBAAgB,CAE/B;IAED,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAIrC,KAAK;YA4BG,wBAAwB;IAUhC,IAAI;YAOI,oBAAoB;CASnC"}
@@ -41,8 +41,17 @@ export declare class DataPipeline {
41
41
  constructor(_params: DataPipelineParams);
42
42
  itemManager: ItemManager;
43
43
  databaseHost?: DatabaseHost;
44
+ /**
45
+ * Current epoch. Might be still processing.
46
+ */
44
47
  currentEpoch?: SpecificCredential<Epoch>;
48
+ /**
49
+ * Epoch currently applied.
50
+ */
51
+ appliedEpoch?: SpecificCredential<Epoch>;
52
+ private _lastProcessedEpoch;
45
53
  onNewEpoch: Event<Credential>;
54
+ private _epochCtx?;
46
55
  get isOpen(): boolean;
47
56
  get pipeline(): Pipeline | undefined;
48
57
  get pipelineState(): import("../pipeline/pipeline").PipelineState | undefined;
@@ -55,6 +64,7 @@ export declare class DataPipeline {
55
64
  private _saveTargetTimeframe;
56
65
  private _saveCache;
57
66
  private _noteTargetStateIfNeeded;
67
+ private _processEpochInSeparateTask;
58
68
  private _processEpoch;
59
69
  waitUntilTimeframe(timeframe: Timeframe): Promise<void>;
60
70
  createEpoch(): Promise<Epoch>;
@@ -1 +1 @@
1
- {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA0C,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAA2B,WAAW,EAAE,MAAM,eAAe,CAAC;AAErE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAKnD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,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,qBACa,YAAY;IAWX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAY;IAErC,OAAO,CAAC,+BAA+B,CAAmB;IAC1D,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,qBAAqB,CAAK;gBAEL,OAAO,EAAE,kBAAkB;IAEjD,WAAW,EAAG,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAE5B,YAAY,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACzC,UAAU,oBAA2B;IAE5C,IAAI,MAAM,YAET;IAED,IAAI,QAAQ,yBAEX;IAED,IAAI,aAAa,6DAEhB;IAED,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAKvC,yBAAyB,IAAI,mBAAmB;IAiB1C,IAAI;IAsCJ,KAAK;YAyBG,gBAAgB;IAiC9B,OAAO,CAAC,eAAe;YAST,oBAAoB;YAMpB,UAAU;YAqBV,wBAAwB;YAkBxB,aAAa;IAmBrB,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAMvC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAqB7B,sBAAsB;CAG7B"}
1
+ {"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAA0C,MAAM,aAAa,CAAC;AAE5E,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,kBAAkB,EAAuB,MAAM,mBAAmB,CAAC;AAC3G,OAAO,EAA2B,WAAW,EAAE,MAAM,eAAe,CAAC;AAGrE,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMnD,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,6CAA6C,CAAC;AAChF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,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,qBACa,YAAY;IAWX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAVpC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,gBAAgB,CAAC,CAAY;IAErC,OAAO,CAAC,+BAA+B,CAAmB;IAC1D,OAAO,CAAC,OAAO,CAAS;IAExB,OAAO,CAAC,sBAAsB,CAAK;IACnC,OAAO,CAAC,qBAAqB,CAAK;gBAEL,OAAO,EAAE,kBAAkB;IAEjD,WAAW,EAAG,WAAW,CAAC;IAC1B,YAAY,CAAC,EAAE,YAAY,CAAC;IAEnC;;OAEG;IACI,YAAY,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEhD;;OAEG;IACI,YAAY,CAAC,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAEhD,OAAO,CAAC,mBAAmB,CAAM;IAC1B,UAAU,oBAA2B;IAC5C,OAAO,CAAC,SAAS,CAAC,CAAU;IAE5B,IAAI,MAAM,YAET;IAED,IAAI,QAAQ,yBAEX;IAED,IAAI,aAAa,6DAEhB;IAED,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAKvC,yBAAyB,IAAI,mBAAmB;IAiB1C,IAAI;IAsCJ,KAAK;YAyBG,gBAAgB;IA6C9B,OAAO,CAAC,eAAe;YAST,oBAAoB;YAMpB,UAAU;YAqBV,wBAAwB;YAiBxB,2BAA2B;YA6B3B,aAAa;IAoBrB,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAMvC,WAAW,IAAI,OAAO,CAAC,KAAK,CAAC;IAqB7B,sBAAsB;CAG7B"}
@@ -1,6 +1,6 @@
1
1
  import { Event } from '@dxos/async';
2
2
  import { FeedInfo } from '@dxos/credentials';
3
- import { FeedWrapper } from '@dxos/feed-store';
3
+ import { FeedOptions, FeedWrapper } from '@dxos/feed-store';
4
4
  import { PublicKey } from '@dxos/keys';
5
5
  import { ModelFactory } from '@dxos/model-factory';
6
6
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
@@ -12,7 +12,7 @@ import { MetadataStore } from '../metadata';
12
12
  import { PipelineAccessor } from '../pipeline';
13
13
  import { DataPipeline } from './data-pipeline';
14
14
  import { SpaceProtocol } from './space-protocol';
15
- type FeedProvider = (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;
15
+ type FeedProvider = (feedKey: PublicKey, opts?: FeedOptions) => Promise<FeedWrapper<FeedMessage>>;
16
16
  export type SpaceParams = {
17
17
  spaceKey: PublicKey;
18
18
  protocol: SpaceProtocol;
@@ -1 +1 @@
1
- {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../../src/space/space.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,KAAK,EAAkC,MAAM,aAAa,CAAC;AACpE,OAAO,EAAsB,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AACjE,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAgB,UAAU,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAErD,OAAO,EAAE,eAAe,EAAE,MAAM,WAAW,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,KAAK,YAAY,GAAG,CAAC,OAAO,EAAE,SAAS,KAAK,OAAO,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,CAAC;AAE9E,MAAM,MAAM,WAAW,GAAG;IACxB,QAAQ,EAAE,SAAS,CAAC;IACpB,QAAQ,EAAE,aAAa,CAAC;IACxB,WAAW,EAAE,WAAW,CAAC,WAAW,CAAC,CAAC;IACtC,YAAY,EAAE,YAAY,CAAC;IAC3B,YAAY,EAAE,YAAY,CAAC;IAC3B,aAAa,EAAE,aAAa,CAAC;IAC7B,eAAe,EAAE,eAAe,CAAC;IACjC,SAAS,EAAE,SAAS,CAAC;IAGrB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,KAAK,EAAE,SAAS,CAAC;CAElB,CAAC;AAEF;;GAEG;AAEH,qBACa,KAAK;IAChB,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAc;IAE3C,SAAgB,qBAAqB,sCAA6C;IAClF,SAAgB,WAAW,cAAe;IAC1C,SAAgB,QAAQ,EAAE,aAAa,CAAC;IAExC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAY;IACjC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAY;IAC5C,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IACnD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAe;IAC7C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAkB;IAGnD,OAAO,CAAC,+BAA+B,CAAC,CAAsC;IAE9E,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,YAAY,CAAC,CAA2B;IAChD,OAAO,CAAC,SAAS,CAAC,CAA2B;gBAEjC,MAAM,EAAE,WAAW;IAkE/B,IACI,GAAG,cAEN;IAED,IAAI,MAAM,YAET;IAED,IAAI,cAAc,IAAI,SAAS,CAE9B;IAED,IAAI,cAAc,0BAEjB;IAED,IAAI,WAAW,0BAEd;IAED,IAAI,UAAU,2CAEb;IAED;;OAEG;IACH,IAAI,eAAe,IAAI,gBAAgB,CAEtC;IAED,IAAI,YAAY,IAAI,YAAY,CAE/B;IAED,IAAI,eAAe,IAAI,eAAe,CAErC;IAED,cAAc,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAO7C,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAO1C;;OAEG;IACH,eAAe,IAAI,QAAQ,EAAE;IAI7B;;OAEG;IAKG,IAAI;IAmBJ,KAAK;IAmBL,sBAAsB;CAO7B"}
1
+ {"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../../../src/space/space.ts"],"names":[],"mappings":"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"}
@@ -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.50",
3
+ "version": "0.1.51-main.04cd027",
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.50",
25
- "@dxos/codec-protobuf": "0.1.50",
26
- "@dxos/context": "0.1.50",
27
- "@dxos/credentials": "0.1.50",
28
- "@dxos/crypto": "0.1.50",
29
- "@dxos/debug": "0.1.50",
30
- "@dxos/document-model": "0.1.50",
31
- "@dxos/echo-db": "0.1.50",
32
- "@dxos/errors": "0.1.50",
33
- "@dxos/feed-store": "0.1.50",
34
- "@dxos/hypercore": "0.1.50",
35
- "@dxos/keyring": "0.1.50",
36
- "@dxos/keys": "0.1.50",
37
- "@dxos/log": "0.1.50",
38
- "@dxos/messaging": "0.1.50",
39
- "@dxos/model-factory": "0.1.50",
40
- "@dxos/network-manager": "0.1.50",
41
- "@dxos/node-std": "0.1.50",
42
- "@dxos/protocols": "0.1.50",
43
- "@dxos/random-access-storage": "0.1.50",
44
- "@dxos/teleport": "0.1.50",
45
- "@dxos/rpc": "0.1.50",
46
- "@dxos/teleport-extension-gossip": "0.1.50",
47
- "@dxos/teleport-extension-object-sync": "0.1.50",
48
- "@dxos/teleport-extension-replicator": "0.1.50",
49
- "@dxos/timeframe": "0.1.50",
50
- "@dxos/typings": "0.1.50",
51
- "@dxos/util": "0.1.50"
24
+ "@dxos/async": "0.1.51-main.04cd027",
25
+ "@dxos/codec-protobuf": "0.1.51-main.04cd027",
26
+ "@dxos/context": "0.1.51-main.04cd027",
27
+ "@dxos/credentials": "0.1.51-main.04cd027",
28
+ "@dxos/crypto": "0.1.51-main.04cd027",
29
+ "@dxos/debug": "0.1.51-main.04cd027",
30
+ "@dxos/document-model": "0.1.51-main.04cd027",
31
+ "@dxos/echo-db": "0.1.51-main.04cd027",
32
+ "@dxos/errors": "0.1.51-main.04cd027",
33
+ "@dxos/feed-store": "0.1.51-main.04cd027",
34
+ "@dxos/hypercore": "0.1.51-main.04cd027",
35
+ "@dxos/keyring": "0.1.51-main.04cd027",
36
+ "@dxos/keys": "0.1.51-main.04cd027",
37
+ "@dxos/log": "0.1.51-main.04cd027",
38
+ "@dxos/messaging": "0.1.51-main.04cd027",
39
+ "@dxos/model-factory": "0.1.51-main.04cd027",
40
+ "@dxos/network-manager": "0.1.51-main.04cd027",
41
+ "@dxos/node-std": "0.1.51-main.04cd027",
42
+ "@dxos/protocols": "0.1.51-main.04cd027",
43
+ "@dxos/random-access-storage": "0.1.51-main.04cd027",
44
+ "@dxos/rpc": "0.1.51-main.04cd027",
45
+ "@dxos/teleport": "0.1.51-main.04cd027",
46
+ "@dxos/teleport-extension-gossip": "0.1.51-main.04cd027",
47
+ "@dxos/teleport-extension-object-sync": "0.1.51-main.04cd027",
48
+ "@dxos/teleport-extension-replicator": "0.1.51-main.04cd027",
49
+ "@dxos/timeframe": "0.1.51-main.04cd027",
50
+ "@dxos/typings": "0.1.51-main.04cd027",
51
+ "@dxos/util": "0.1.51-main.04cd027"
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.50"
59
+ "@dxos/text-model": "0.1.51-main.04cd027"
60
60
  },
61
61
  "publishConfig": {
62
62
  "access": "public"
@@ -4,6 +4,7 @@
4
4
 
5
5
  import { trackLeaks } from '@dxos/async';
6
6
  import { Any } from '@dxos/codec-protobuf';
7
+ import { Context, cancelWithContext } from '@dxos/context';
7
8
  import { timed } from '@dxos/debug';
8
9
  import { log } from '@dxos/log';
9
10
  import { schema } from '@dxos/protocols';
@@ -57,13 +58,13 @@ export class SnapshotManager {
57
58
  }
58
59
 
59
60
  @timed(10_000)
60
- async load(id: string): Promise<SpaceSnapshot> {
61
- const local = await this._snapshotStore.loadSnapshot(id);
61
+ async load(ctx: Context, id: string): Promise<SpaceSnapshot> {
62
+ const local = await cancelWithContext(ctx, this._snapshotStore.loadSnapshot(id));
62
63
  if (local) {
63
64
  return local;
64
65
  }
65
66
 
66
- const remote = await this._objectSync.download(id);
67
+ const remote = await cancelWithContext(ctx, this._objectSync.download(ctx, id));
67
68
  return schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode((remote.payload as Any).value);
68
69
  }
69
70
 
@@ -119,6 +119,11 @@ export class MetadataStore {
119
119
  }
120
120
 
121
121
  _getSpace(spaceKey: PublicKey): SpaceMetadata {
122
+ if (this._metadata.identity?.haloSpace.key.equals(spaceKey)) {
123
+ // Check if the space is the identity space.
124
+ return this._metadata.identity.haloSpace;
125
+ }
126
+
122
127
  const space = this.spaces.find((space) => space.key === spaceKey);
123
128
  assert(space, 'Space not found');
124
129
  return space;
@@ -154,11 +159,16 @@ export class MetadataStore {
154
159
  await this._save();
155
160
  }
156
161
 
157
- async setSpaceLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {
162
+ async setSpaceDataLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {
158
163
  this._getSpace(spaceKey).dataTimeframe = timeframe;
159
164
  await this._save();
160
165
  }
161
166
 
167
+ async setSpaceControlLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {
168
+ this._getSpace(spaceKey).controlTimeframe = timeframe;
169
+ await this._save();
170
+ }
171
+
162
172
  async setCache(spaceKey: PublicKey, cache: SpaceCache) {
163
173
  this._getSpace(spaceKey).cache = cache;
164
174
  await this._save();
@@ -171,4 +181,5 @@ export class MetadataStore {
171
181
  await this._save();
172
182
  }
173
183
  }
184
+
174
185
  const fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);
@@ -41,6 +41,11 @@ export class PipelineState {
41
41
 
42
42
  public readonly stalled = new Event();
43
43
 
44
+ /**
45
+ * @internal
46
+ */
47
+ _startTimeframe: Timeframe = new Timeframe();
48
+
44
49
  /**
45
50
  * Target timeframe we are waiting to reach.
46
51
  */
@@ -70,6 +75,10 @@ export class PipelineState {
70
75
  );
71
76
  }
72
77
 
78
+ get startTimeframe() {
79
+ return this._startTimeframe;
80
+ }
81
+
73
82
  get timeframe() {
74
83
  return this._timeframeClock.timeframe;
75
84
  }
@@ -275,8 +284,23 @@ export class Pipeline implements PipelineAccessor {
275
284
  async setCursor(timeframe: Timeframe) {
276
285
  assert(!this._isStarted || this._isPaused, 'Invalid state.');
277
286
 
287
+ this._state._startTimeframe = timeframe;
278
288
  this._timeframeClock.setTimeframe(timeframe);
279
289
 
290
+ // Cancel downloads of mutations before the cursor.
291
+ for (const [key, seq] of timeframe.frames()) {
292
+ const feed = this._feeds.get(key);
293
+ if (!feed) {
294
+ throw new Error('Feed not found');
295
+ }
296
+
297
+ feed.undownload({ callback: () => log('Undownloaded') });
298
+
299
+ feed.download({ start: seq + 1, linear: true }).catch((err: Error) => {
300
+ log('failed to download feed', { err });
301
+ });
302
+ }
303
+
280
304
  if (this._feedSetIterator) {
281
305
  await this._feedSetIterator.close();
282
306
  await this._initIterator();
@@ -16,6 +16,7 @@ import { describe, test, afterTest } from '@dxos/test';
16
16
  import { Timeframe } from '@dxos/timeframe';
17
17
 
18
18
  import { valueEncoding } from '../common';
19
+ import { MetadataStore } from '../metadata';
19
20
  import { ControlPipeline } from './control-pipeline';
20
21
 
21
22
  describe('space/control-pipeline', () => {
@@ -42,10 +43,13 @@ describe('space/control-pipeline', () => {
42
43
 
43
44
  // TODO(dmaretskyi): Separate test for cold start after genesis.
44
45
  const genesisFeed = await createFeed();
46
+ const metadata = new MetadataStore(createStorage({ type: StorageType.RAM }).createDirectory());
47
+ await metadata.addSpace({ key: spaceKey, genesisFeedKey: genesisFeed.key, controlFeedKey: genesisFeed.key });
45
48
  const controlPipeline = new ControlPipeline({
46
49
  spaceKey,
47
50
  genesisFeed,
48
51
  feedProvider: (key) => feedStore.openFeed(key),
52
+ metadataStore: metadata,
49
53
  });
50
54
 
51
55
  const admittedFeeds: PublicKey[] = [];
@@ -8,16 +8,21 @@ import { PublicKey } from '@dxos/keys';
8
8
  import { log } from '@dxos/log';
9
9
  import type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
10
10
  import { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';
11
+ import { Timeframe } from '@dxos/timeframe';
11
12
  import { AsyncCallback, Callback } from '@dxos/util';
12
13
 
14
+ import { MetadataStore } from '../metadata';
13
15
  import { Pipeline, PipelineAccessor } from '../pipeline';
14
16
 
15
17
  export type ControlPipelineParams = {
16
18
  spaceKey: PublicKey;
17
19
  genesisFeed: FeedWrapper<FeedMessage>;
18
20
  feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;
21
+ metadataStore: MetadataStore;
19
22
  };
20
23
 
24
+ const TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;
25
+
21
26
  /**
22
27
  * Processes HALO credentials, which include genesis and invitations.
23
28
  */
@@ -25,11 +30,18 @@ export class ControlPipeline {
25
30
  private readonly _pipeline: Pipeline;
26
31
  private readonly _spaceStateMachine: SpaceStateMachine;
27
32
 
33
+ private readonly _spaceKey: PublicKey;
34
+ private readonly _metadata: MetadataStore;
35
+ private _targetTimeframe?: Timeframe;
36
+ private _lastTimeframeSaveTime: number = Date.now();
37
+
28
38
  public readonly onFeedAdmitted = new Callback<AsyncCallback<FeedInfo>>();
29
39
  public readonly onMemberAdmitted: Callback<AsyncCallback<MemberInfo>>;
30
40
  public readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;
31
41
 
32
- constructor({ spaceKey, genesisFeed, feedProvider }: ControlPipelineParams) {
42
+ constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineParams) {
43
+ this._spaceKey = spaceKey;
44
+ this._metadata = metadataStore;
33
45
  this._pipeline = new Pipeline();
34
46
  void this._pipeline.addFeed(genesisFeed); // TODO(burdon): Require async open/close?
35
47
 
@@ -81,6 +93,8 @@ export class ControlPipeline {
81
93
  );
82
94
  if (!result) {
83
95
  log.warn('processing failed', { msg });
96
+ } else {
97
+ await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);
84
98
  }
85
99
  }
86
100
  } catch (err: any) {
@@ -93,9 +107,30 @@ export class ControlPipeline {
93
107
  log('started');
94
108
  }
95
109
 
110
+ private async _noteTargetStateIfNeeded(timeframe: Timeframe) {
111
+ // TODO(dmaretskyi): Replace this with a proper debounce/throttle.
112
+
113
+ if (Date.now() - this._lastTimeframeSaveTime > TIMEFRAME_SAVE_DEBOUNCE_INTERVAL) {
114
+ this._lastTimeframeSaveTime = Date.now();
115
+
116
+ await this._saveTargetTimeframe(timeframe);
117
+ }
118
+ }
119
+
96
120
  async stop() {
97
121
  log('stopping...');
98
122
  await this._pipeline.stop();
123
+ await this._saveTargetTimeframe(this._pipeline.state.timeframe);
99
124
  log('stopped');
100
125
  }
126
+
127
+ private async _saveTargetTimeframe(timeframe: Timeframe) {
128
+ try {
129
+ const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);
130
+ await this._metadata.setSpaceControlLatestTimeframe(this._spaceKey, newTimeframe);
131
+ this._targetTimeframe = newTimeframe;
132
+ } catch (err: any) {
133
+ log(err);
134
+ }
135
+ }
101
136
  }
@@ -8,10 +8,12 @@ import { Event, scheduleTask, synchronized, trackLeaks } from '@dxos/async';
8
8
  import { Context } from '@dxos/context';
9
9
  import { CredentialProcessor, FeedInfo, SpecificCredential, checkCredentialType } from '@dxos/credentials';
10
10
  import { getStateMachineFromItem, ItemManager } from '@dxos/echo-db';
11
+ import { CancelledError } from '@dxos/errors';
11
12
  import { FeedWriter } from '@dxos/feed-store';
12
13
  import { PublicKey } from '@dxos/keys';
13
14
  import { log } from '@dxos/log';
14
15
  import { ModelFactory } from '@dxos/model-factory';
16
+ import { DataPipelineProcessed } from '@dxos/protocols';
15
17
  import { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';
16
18
  import { SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';
17
19
  import { ObjectSnapshot } from '@dxos/protocols/proto/dxos/echo/model/document';
@@ -79,8 +81,19 @@ export class DataPipeline {
79
81
  public itemManager!: ItemManager;
80
82
  public databaseHost?: DatabaseHost;
81
83
 
84
+ /**
85
+ * Current epoch. Might be still processing.
86
+ */
82
87
  public currentEpoch?: SpecificCredential<Epoch>;
88
+
89
+ /**
90
+ * Epoch currently applied.
91
+ */
92
+ public appliedEpoch?: SpecificCredential<Epoch>;
93
+
94
+ private _lastProcessedEpoch = -1;
83
95
  public onNewEpoch = new Event<Credential>();
96
+ private _epochCtx?: Context;
84
97
 
85
98
  get isOpen() {
86
99
  return this._isOpen;
@@ -106,11 +119,11 @@ export class DataPipeline {
106
119
  return;
107
120
  }
108
121
 
109
- log('new epoch', { credential });
110
- await this._processEpoch(credential.subject.assertion);
111
-
112
122
  this.currentEpoch = credential;
113
- this.onNewEpoch.emit(credential);
123
+ if (this._isOpen) {
124
+ // process epoch
125
+ await this._processEpochInSeparateTask(credential);
126
+ }
114
127
  },
115
128
  };
116
129
  }
@@ -180,6 +193,12 @@ export class DataPipeline {
180
193
  }
181
194
 
182
195
  private async _consumePipeline() {
196
+ if (this.currentEpoch) {
197
+ const waitForOneEpoch = this.onNewEpoch.waitForCount(1);
198
+ await this._processEpochInSeparateTask(this.currentEpoch);
199
+ await waitForOneEpoch;
200
+ }
201
+
183
202
  assert(this._pipeline, 'Pipeline is not initialized.');
184
203
  for await (const msg of this._pipeline.consume()) {
185
204
  const { feedKey, seq, data } = msg;
@@ -203,6 +222,12 @@ export class DataPipeline {
203
222
  },
204
223
  });
205
224
 
225
+ log.trace('dxos.echo.data-pipeline.processed', {
226
+ feedKey: feedKey.toHex(),
227
+ seq,
228
+ spaceKey: this._params.spaceKey.toHex(),
229
+ } satisfies DataPipelineProcessed);
230
+
206
231
  // Timeframe clock is not updated yet
207
232
  await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);
208
233
  }
@@ -223,7 +248,7 @@ export class DataPipeline {
223
248
 
224
249
  private async _saveTargetTimeframe(timeframe: Timeframe) {
225
250
  const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);
226
- await this._params.metadataStore.setSpaceLatestTimeframe(this._params.spaceKey, newTimeframe);
251
+ await this._params.metadataStore.setSpaceDataLatestTimeframe(this._params.spaceKey, newTimeframe);
227
252
  this._targetTimeframe = newTimeframe;
228
253
  }
229
254
 
@@ -265,14 +290,43 @@ export class DataPipeline {
265
290
  }
266
291
  }
267
292
 
293
+ private async _processEpochInSeparateTask(epoch: SpecificCredential<Epoch>) {
294
+ if (epoch.subject.assertion.number <= this._lastProcessedEpoch) {
295
+ return;
296
+ }
297
+ await this._epochCtx?.dispose();
298
+ const ctx = new Context({
299
+ onError: (err) => {
300
+ if (err instanceof CancelledError) {
301
+ log('Epoch processing cancelled.');
302
+ } else {
303
+ log.catch(err);
304
+ }
305
+ },
306
+ });
307
+ this._epochCtx = ctx;
308
+ scheduleTask(ctx, async () => {
309
+ if (!this._isOpen) {
310
+ // Space closed before we got to process the epoch.
311
+ return;
312
+ }
313
+ log('process epoch', { epoch });
314
+ await this._processEpoch(ctx, epoch.subject.assertion);
315
+
316
+ this.appliedEpoch = epoch;
317
+ this.onNewEpoch.emit(epoch);
318
+ });
319
+ }
320
+
268
321
  @synchronized
269
- private async _processEpoch(epoch: Epoch) {
270
- assert(this._isOpen); // TODO: In the future we might process epochs before we are open so that data pipeline starts from the last one.
322
+ private async _processEpoch(ctx: Context, epoch: Epoch) {
323
+ assert(this._isOpen, 'Space is closed.');
271
324
  assert(this._pipeline);
325
+ this._lastProcessedEpoch = epoch.number;
272
326
 
273
327
  log('Processing epoch', { epoch });
274
328
  if (epoch.snapshotCid) {
275
- const snapshot = await this._params.snapshotManager.load(epoch.snapshotCid);
329
+ const snapshot = await this._params.snapshotManager.load(ctx, epoch.snapshotCid);
276
330
 
277
331
  // TODO(dmaretskyi): Clearing old items + events.
278
332
  this.databaseHost!._itemDemuxer.restoreFromSnapshot(snapshot.database);
@@ -98,7 +98,7 @@ export class SpaceManager {
98
98
  spaceKey,
99
99
  protocol,
100
100
  genesisFeed,
101
- feedProvider: (feedKey) => this._feedStore.openFeed(feedKey),
101
+ feedProvider: (feedKey, opts) => this._feedStore.openFeed(feedKey, opts),
102
102
  modelFactory: this._modelFactory,
103
103
  metadataStore: this._metadataStore,
104
104
  snapshotManager,