@dxos/echo-pipeline 0.1.35 → 0.1.36
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.
- package/dist/lib/browser/{chunk-6CRSMR4G.mjs → chunk-4YAT2XJW.mjs} +221 -160
- package/dist/lib/browser/chunk-4YAT2XJW.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +5 -3
- package/dist/lib/browser/index.mjs.map +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +5 -5
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node/index.cjs +212 -150
- package/dist/lib/node/index.cjs.map +4 -4
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +208 -152
- package/dist/lib/node/testing/index.cjs.map +4 -4
- package/dist/types/src/dbhost/data-service-host.d.ts.map +1 -1
- package/dist/types/src/dbhost/{database-backend.d.ts → database-host.d.ts} +2 -2
- package/dist/types/src/dbhost/database-host.d.ts.map +1 -0
- package/dist/types/src/dbhost/index.d.ts +1 -1
- package/dist/types/src/dbhost/index.d.ts.map +1 -1
- package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
- package/dist/types/src/pipeline/pipeline.d.ts +2 -0
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/pipeline/timeframe-clock.d.ts +12 -1
- package/dist/types/src/pipeline/timeframe-clock.d.ts.map +1 -1
- package/dist/types/src/space/data-pipeline.d.ts +8 -9
- package/dist/types/src/space/data-pipeline.d.ts.map +1 -1
- package/dist/types/src/space/data-pipeline.test.d.ts +1 -0
- package/dist/types/src/space/data-pipeline.test.d.ts.map +1 -0
- package/dist/types/src/space/space-manager.d.ts +1 -0
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/testing/database-test-rig.d.ts +4 -4
- package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
- package/dist/types/src/testing/util.d.ts +4 -4
- package/dist/types/src/testing/util.d.ts.map +1 -1
- package/package.json +32 -29
- package/src/common/feeds.ts +1 -1
- package/src/dbhost/data-service-host.ts +16 -9
- package/src/dbhost/{database-backend.ts → database-host.ts} +1 -1
- package/src/dbhost/index.ts +1 -1
- package/src/metadata/metadata-store.ts +24 -20
- package/src/pipeline/pipeline.test.ts +214 -0
- package/src/pipeline/pipeline.ts +20 -6
- package/src/pipeline/timeframe-clock.ts +26 -4
- package/src/space/data-pipeline.test.ts +3 -0
- package/src/space/data-pipeline.ts +65 -66
- package/src/space/space-manager.ts +2 -1
- package/src/testing/database-test-rig.ts +6 -6
- package/src/testing/util.ts +4 -4
- package/src/tests/database-unit.test.ts +13 -0
- package/src/tests/database.test.ts +39 -1
- package/dist/lib/browser/chunk-6CRSMR4G.mjs.map +0 -7
- package/dist/types/src/dbhost/database-backend.d.ts.map +0 -1
|
@@ -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;
|
|
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"}
|
|
@@ -9,7 +9,7 @@ import { DataServiceHost } from './data-service-host';
|
|
|
9
9
|
* Mutations are read from the incoming streams and applied to the ItemManager via ItemDemuxer.
|
|
10
10
|
* Write operations result in mutations being written to the outgoing stream.
|
|
11
11
|
*/
|
|
12
|
-
export declare class
|
|
12
|
+
export declare class DatabaseHost {
|
|
13
13
|
private readonly _outboundStream;
|
|
14
14
|
private readonly _snapshot?;
|
|
15
15
|
private _echoProcessor;
|
|
@@ -24,4 +24,4 @@ export declare class DatabaseBackendHost {
|
|
|
24
24
|
createSnapshot(): EchoSnapshot;
|
|
25
25
|
createDataServiceHost(): DataServiceHost;
|
|
26
26
|
}
|
|
27
|
-
//# sourceMappingURL=database-
|
|
27
|
+
//# sourceMappingURL=database-host.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"database-host.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/database-host.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,0CAA0C,CAAC;AAExE,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD;;;;GAIG;AACH,qBAAa,YAAY;IAMrB,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC;IAN7B,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,YAAY,CAAe;IAC5B,YAAY,EAAG,WAAW,CAAC;gBAGf,eAAe,EAAE,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS,EACpD,SAAS,CAAC,0BAAc;IAG3C,IAAI,UAAU,IAAI,OAAO,CAExB;IAED,IAAI,aAAa,kBAEhB;IAEK,IAAI,CAAC,WAAW,EAAE,WAAW,EAAE,YAAY,EAAE,YAAY;IAYzD,KAAK;IAEX,cAAc,IAAI,UAAU,CAAC,WAAW,CAAC,GAAG,SAAS;IAIrD,cAAc;IAId,qBAAqB;CAGtB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/index.ts"],"names":[],"mappings":"AAIA,cAAc,qBAAqB,CAAC;AACpC,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/dbhost/index.ts"],"names":[],"mappings":"AAIA,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"metadata-store.d.ts","sourceRoot":"","sources":["../../../../src/metadata/metadata-store.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"metadata-store.d.ts","sourceRoot":"","sources":["../../../../src/metadata/metadata-store.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAGvC,OAAO,EAAgB,aAAa,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AACvG,OAAO,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C;;;;GAIG;AACH,eAAO,MAAM,eAAe,IAAI,CAAC;AAEjC,MAAM,WAAW,eAAe;IAC9B,GAAG,EAAE,SAAS,CAAC;IACf,WAAW,EAAE,SAAS,CAAC;CACxB;AASD,qBAAa,aAAa;IAKtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAJ7B,OAAO,CAAC,SAAS,CAAqC;gBAInC,UAAU,EAAE,SAAS;IAGxC,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;IA6BnB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAK5B,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;IAQjE,gBAAgB,CAAC,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM;IAQtD,mBAAmB,CAAC,QAAQ,EAAE,SAAS,EAAE,cAAc,EAAE,SAAS,EAAE,WAAW,EAAE,SAAS;CAQjG"}
|
|
@@ -35,7 +35,9 @@ export declare class PipelineState {
|
|
|
35
35
|
*/
|
|
36
36
|
get endTimeframe(): Timeframe;
|
|
37
37
|
get timeframe(): Timeframe;
|
|
38
|
+
get pendingTimeframe(): Timeframe;
|
|
38
39
|
get targetTimeframe(): Timeframe;
|
|
40
|
+
get feeds(): FeedWrapper<any>[];
|
|
39
41
|
waitUntilTimeframe(target: Timeframe): Promise<void>;
|
|
40
42
|
setTargetTimeframe(target: Timeframe): void;
|
|
41
43
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAmB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,
|
|
1
|
+
{"version":3,"file":"pipeline.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/pipeline.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,OAAO,EAAmB,MAAM,eAAe,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sCAAsC,CAAC;AACxE,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAI5C,OAAO,EAAyC,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAE1F,oBAAY,4BAA4B,GAAG;IACzC;;OAEG;IACH,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;OAEG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB,CAAC;AAEF;;GAEG;AACH,qBAAa,aAAa;IAatB,OAAO,CAAC,SAAS;IACjB,OAAO,CAAC,eAAe;IAZzB,SAAgB,eAAe,yCAA+B;IAE9D;;OAEG;IACH,OAAO,CAAC,gBAAgB,CAAwB;IAEhD,OAAO,CAAC,qBAAqB,CAA4B;gBAI/C,SAAS,EAAE,eAAe,CAAC,GAAG,CAAC,EAC/B,eAAe,EAAE,cAAc;IAGzC;;;OAGG;IAEH,IAAI,YAAY,cASf;IAED,IAAI,SAAS,cAEZ;IAED,IAAI,gBAAgB,cAEnB;IAED,IAAI,eAAe,cAElB;IAED,IAAI,KAAK,uBAER;IAEK,kBAAkB,CAAC,MAAM,EAAE,SAAS;IAI1C,kBAAkB,CAAC,MAAM,EAAE,SAAS;IAIpC;;;;;;OAMG;IACG,+BAA+B,CAAC,EACpC,GAAmB,EACnB,OAAO,EACP,YAAmB,EACpB,GAAE,4BAAiC;CAuCrC;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;CACzC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,qBAAa,QAAS,YAAW,gBAAgB;IAsB7C,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IArBpC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAA8C;IAG9E,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAG9B;IAGH,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiF;IAGxG,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAwB;IAG3D,OAAO,CAAC,OAAO,CAA8C;IAE7D,OAAO,CAAC,OAAO,CAAS;gBAIL,iBAAiB,GAAE,SAA2B;IAOjE,IAAI,KAAK,kBAER;IAED,IAAI,MAAM,IAAI,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,CAG5C;IAED,QAAQ,IAAI,WAAW,CAAC,WAAW,CAAC,EAAE;IAMhC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAI5C,OAAO,CAAC,OAAO,EAAE,SAAS;IAI1B,YAAY,CAAC,IAAI,EAAE,WAAW,CAAC,WAAW,CAAC;IAcrC,KAAK;IAOL,IAAI;IAOV;;;OAGG;IACI,OAAO,IAAI,aAAa,CAAC,gBAAgB,CAAC;CAgBlD"}
|
|
@@ -4,15 +4,26 @@ import { PublicKey } from '@dxos/keys';
|
|
|
4
4
|
import { Timeframe } from '@dxos/timeframe';
|
|
5
5
|
export declare const mapTimeframeToFeedIndexes: (timeframe: Timeframe) => FeedIndex[];
|
|
6
6
|
export declare const mapFeedIndexesToTimeframe: (indexes: FeedIndex[]) => Timeframe;
|
|
7
|
+
export declare const startAfter: (timeframe: Timeframe) => FeedIndex[];
|
|
7
8
|
/**
|
|
8
9
|
* Keeps state of the last timeframe that was processed by ECHO.
|
|
9
10
|
*/
|
|
10
11
|
export declare class TimeframeClock {
|
|
11
12
|
private _timeframe;
|
|
12
13
|
readonly update: Event<Timeframe>;
|
|
14
|
+
private _pendingTimeframe;
|
|
13
15
|
constructor(_timeframe?: Timeframe);
|
|
16
|
+
/**
|
|
17
|
+
* Timeframe that was processed by ECHO.
|
|
18
|
+
*/
|
|
14
19
|
get timeframe(): Timeframe;
|
|
15
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Timeframe that is currently being processed by ECHO.
|
|
22
|
+
* Will be equal to `timeframe` after the processing is complete.
|
|
23
|
+
*/
|
|
24
|
+
get pendingTimeframe(): Timeframe;
|
|
25
|
+
updatePendingTimeframe(key: PublicKey, seq: number): void;
|
|
26
|
+
updateTimeframe(): void;
|
|
16
27
|
hasGaps(timeframe: Timeframe): boolean;
|
|
17
28
|
waitUntilReached(target: Timeframe): Promise<void>;
|
|
18
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"timeframe-clock.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/timeframe-clock.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,eAAO,MAAM,yBAAyB,cAAe,SAAS,KAAG,SAAS,EACN,CAAC;AAErE,eAAO,MAAM,yBAAyB,YAAa,SAAS,EAAE,KAAG,SACK,CAAC;AAEvE;;GAEG;AACH,qBAAa,cAAc;
|
|
1
|
+
{"version":3,"file":"timeframe-clock.d.ts","sourceRoot":"","sources":["../../../../src/pipeline/timeframe-clock.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAEpC,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,eAAO,MAAM,yBAAyB,cAAe,SAAS,KAAG,SAAS,EACN,CAAC;AAErE,eAAO,MAAM,yBAAyB,YAAa,SAAS,EAAE,KAAG,SACK,CAAC;AAEvE,eAAO,MAAM,UAAU,cAAe,SAAS,KAAG,SAAS,EACoB,CAAC;AAEhF;;GAEG;AACH,qBAAa,cAAc;IAOvB,OAAO,CAAC,UAAU;IANpB,QAAQ,CAAC,MAAM,mBAA0B;IAEzC,OAAO,CAAC,iBAAiB,CAAY;gBAI3B,UAAU,YAAkB;IAKtC;;OAEG;IACH,IAAI,SAAS,cAEZ;IAED;;;OAGG;IACH,IAAI,gBAAgB,cAEnB;IAED,sBAAsB,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,EAAE,MAAM;IAIlD,eAAe;IAKf,OAAO,CAAC,SAAS,EAAE,SAAS;IAMtB,gBAAgB,CAAC,MAAM,EAAE,SAAS;CAYzC"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { Event } from '@dxos/async';
|
|
2
1
|
import { FeedInfo } from '@dxos/credentials';
|
|
3
2
|
import { ItemManager } from '@dxos/echo-db';
|
|
4
3
|
import { PublicKey } from '@dxos/keys';
|
|
5
4
|
import { ModelFactory } from '@dxos/model-factory';
|
|
6
|
-
import { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';
|
|
7
5
|
import { Timeframe } from '@dxos/timeframe';
|
|
8
|
-
import {
|
|
6
|
+
import { DatabaseHost, SnapshotManager } from '../dbhost';
|
|
9
7
|
import { MetadataStore } from '../metadata';
|
|
10
8
|
import { Pipeline } from '../pipeline';
|
|
11
9
|
export interface PipelineFactory {
|
|
@@ -34,22 +32,23 @@ export declare class DataPipeline {
|
|
|
34
32
|
private _targetTimeframe?;
|
|
35
33
|
private _lastAutomaticSnapshotTimeframe;
|
|
36
34
|
private _isOpen;
|
|
37
|
-
|
|
35
|
+
private _lastTimeframeSaveTime;
|
|
36
|
+
private _lastSnapshotSaveTime;
|
|
38
37
|
constructor(_params: DataPipelineParams);
|
|
39
38
|
_itemManager: ItemManager;
|
|
40
|
-
databaseBackend?:
|
|
39
|
+
databaseBackend?: DatabaseHost;
|
|
41
40
|
get isOpen(): boolean;
|
|
42
41
|
get pipelineState(): import("../pipeline/pipeline").PipelineState | undefined;
|
|
43
42
|
get snapshotTimeframe(): Timeframe | undefined;
|
|
44
43
|
getStartTimeframe(): Timeframe;
|
|
45
44
|
setTargetTimeframe(timeframe: Timeframe): void;
|
|
46
45
|
open(spaceContext: PipelineFactory): Promise<void>;
|
|
47
|
-
private _createPeriodicSnapshots;
|
|
48
|
-
private _saveSnapshot;
|
|
49
|
-
private _saveLatestTimeframe;
|
|
50
46
|
close(): Promise<void>;
|
|
51
|
-
createSnapshot(): SpaceSnapshot;
|
|
52
47
|
private _consumePipeline;
|
|
48
|
+
private _createSnapshot;
|
|
49
|
+
private _saveSnapshot;
|
|
50
|
+
private _saveTargetTimeframe;
|
|
51
|
+
private _noteTargetStateIfNeeded;
|
|
53
52
|
waitUntilTimeframe(timeframe: Timeframe): Promise<void>;
|
|
54
53
|
}
|
|
55
54
|
//# sourceMappingURL=data-pipeline.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"data-pipeline.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAG5C,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,oBAAY,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;CAChC,CAAC;AAsBF;;;;GAIG;AACH,qBACa,YAAY;IAaX,OAAO,CAAC,QAAQ,CAAC,OAAO;IAZpC,OAAO,CAAC,IAAI,CAAiB;IAC7B,OAAO,CAAC,aAAa,CAAmB;IACxC,OAAO,CAAC,SAAS,CAAC,CAAW;IAC7B,OAAO,CAAC,SAAS,CAAC,CAAgB;IAClC,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,YAAY,EAAG,WAAW,CAAC;IAC3B,eAAe,CAAC,EAAE,YAAY,CAAC;IAEtC,IAAI,MAAM,YAET;IAED,IAAI,aAAa,6DAEhB;IAED,IAAI,iBAAiB,0BAEpB;IAED,iBAAiB,IAAI,SAAS;IAI9B,kBAAkB,CAAC,SAAS,EAAE,SAAS;IAMjC,IAAI,CAAC,YAAY,EAAE,eAAe;IAqClC,KAAK;YA2BG,gBAAgB;IAiC9B,OAAO,CAAC,eAAe;YAST,aAAa;YAOb,oBAAoB;YAMpB,wBAAwB;IAoBhC,kBAAkB,CAAC,SAAS,EAAE,SAAS;CAI9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
//# sourceMappingURL=data-pipeline.test.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-pipeline.test.d.ts","sourceRoot":"","sources":["../../../../src/space/data-pipeline.test.ts"],"names":[],"mappings":""}
|
|
@@ -33,6 +33,7 @@ export declare class SpaceManager {
|
|
|
33
33
|
private readonly _feedStore;
|
|
34
34
|
private readonly _networkManager;
|
|
35
35
|
private readonly _instanceId;
|
|
36
|
+
_traceParent?: string;
|
|
36
37
|
constructor({ feedStore, networkManager }: SpaceManagerParams);
|
|
37
38
|
get spaces(): ComplexMap<PublicKey, Space>;
|
|
38
39
|
open(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,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,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGhE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,oBAAY,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,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,WAAW,CAA8B;
|
|
1
|
+
{"version":3,"file":"space-manager.d.ts","sourceRoot":"","sources":["../../../../src/space/space-manager.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAErD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAEvC,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,UAAU,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAC1F,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAExC,OAAO,EAAE,KAAK,EAAE,MAAM,SAAS,CAAC;AAChC,OAAO,EAAiB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGhE,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,SAAS,CAAC;IACvB,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,gBAAgB,CAAC;IACnC,gBAAgB,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC5D,OAAO,CAAC,EAAE,eAAe,CAAC;CAC3B;AAED,oBAAY,kBAAkB,GAAG;IAC/B,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,cAAc,EAAE,cAAc,CAAC;CAChC,CAAC;AAEF,oBAAY,oBAAoB,GAAG;IACjC,QAAQ,EAAE,aAAa,CAAC;IACxB,aAAa,EAAE,aAAa,CAAC;IAC7B,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,WAAW,CAA8B;IACnD,YAAY,CAAC,EAAE,MAAM,CAAC;gBAEjB,EAAE,SAAS,EAAE,cAAc,EAAE,EAAE,kBAAkB;IAO7D,IAAI,MAAM,iCAET;IAGK,IAAI;IAKJ,KAAK;IAKL,cAAc,CAAC,EAAE,QAAQ,EAAE,aAAa,EAAE,mBAAmB,EAAE,EAAE,oBAAoB;CAuB5F"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DatabaseProxy, ItemManager } from '@dxos/echo-db';
|
|
2
2
|
import { PublicKey } from '@dxos/keys';
|
|
3
3
|
import { ModelFactory } from '@dxos/model-factory';
|
|
4
4
|
import { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';
|
|
5
5
|
import { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';
|
|
6
6
|
import { Timeframe } from '@dxos/timeframe';
|
|
7
7
|
import { ComplexMap } from '@dxos/util';
|
|
8
|
-
import {
|
|
8
|
+
import { DatabaseHost } from '../dbhost';
|
|
9
9
|
export declare class DatabaseTestBuilder {
|
|
10
10
|
readonly peers: ComplexMap<PublicKey, DatabaseTestPeer>;
|
|
11
11
|
createPeer(): Promise<DatabaseTestPeer>;
|
|
@@ -14,8 +14,8 @@ export declare class DatabaseTestPeer {
|
|
|
14
14
|
readonly rig: DatabaseTestBuilder;
|
|
15
15
|
readonly modelFactory: ModelFactory;
|
|
16
16
|
items: ItemManager;
|
|
17
|
-
proxy:
|
|
18
|
-
host:
|
|
17
|
+
proxy: DatabaseProxy;
|
|
18
|
+
host: DatabaseHost;
|
|
19
19
|
hostItems: ItemManager;
|
|
20
20
|
readonly key: PublicKey;
|
|
21
21
|
feedMessages: FeedMessage[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"database-test-rig.d.ts","sourceRoot":"","sources":["../../../../src/testing/database-test-rig.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,
|
|
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;IA6BV;;;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,14 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { DatabaseProxy, ItemManager } from '@dxos/echo-db';
|
|
2
2
|
import { ModelFactory } from '@dxos/model-factory';
|
|
3
|
-
import {
|
|
3
|
+
import { DatabaseHost, DataServiceHost } from '../dbhost';
|
|
4
4
|
import { DataPipeline } from '../space';
|
|
5
5
|
export declare const createMemoryDatabase: (modelFactory: ModelFactory) => Promise<{
|
|
6
|
-
backend:
|
|
6
|
+
backend: DatabaseHost;
|
|
7
7
|
itemManager: ItemManager;
|
|
8
8
|
}>;
|
|
9
9
|
export declare const createRemoteDatabaseFromDataServiceHost: (modelFactory: ModelFactory, dataServiceHost: DataServiceHost) => Promise<{
|
|
10
10
|
itemManager: ItemManager;
|
|
11
|
-
backend:
|
|
11
|
+
backend: DatabaseProxy;
|
|
12
12
|
}>;
|
|
13
13
|
export declare const testLocalDatabase: (create: DataPipeline, check?: DataPipeline) => Promise<void>;
|
|
14
14
|
//# sourceMappingURL=util.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../../../../src/testing/util.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,
|
|
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,eAAe,EAA6C,MAAM,WAAW,CAAC;AACrG,OAAO,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAExC,eAAO,MAAM,oBAAoB,iBAAwB,YAAY;;;EAqBpE,CAAC;AAEF,eAAO,MAAM,uCAAuC,iBACpC,YAAY,mBACT,eAAe;;;EAejC,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.1.
|
|
3
|
+
"version": "0.1.36",
|
|
4
4
|
"description": "ECHO database.",
|
|
5
5
|
"homepage": "https://dxos.org",
|
|
6
6
|
"bugs": "https://github.com/dxos/dxos/issues",
|
|
@@ -19,41 +19,44 @@
|
|
|
19
19
|
"src"
|
|
20
20
|
],
|
|
21
21
|
"dependencies": {
|
|
22
|
+
"crc-32": "^1.2.2",
|
|
22
23
|
"debug": "^4.3.3",
|
|
23
|
-
"@dxos/async": "0.1.
|
|
24
|
-
"@dxos/
|
|
25
|
-
"@dxos/
|
|
26
|
-
"@dxos/credentials": "0.1.
|
|
27
|
-
"@dxos/crypto": "0.1.
|
|
28
|
-
"@dxos/debug": "0.1.
|
|
29
|
-
"@dxos/document-model": "0.1.
|
|
30
|
-
"@dxos/echo-db": "0.1.
|
|
31
|
-
"@dxos/
|
|
32
|
-
"@dxos/
|
|
33
|
-
"@dxos/
|
|
34
|
-
"@dxos/
|
|
35
|
-
"@dxos/
|
|
36
|
-
"@dxos/
|
|
37
|
-
"@dxos/
|
|
38
|
-
"@dxos/
|
|
39
|
-
"@dxos/
|
|
40
|
-
"@dxos/
|
|
41
|
-
"@dxos/
|
|
42
|
-
"@dxos/
|
|
43
|
-
"@dxos/
|
|
44
|
-
"@dxos/teleport
|
|
45
|
-
"@dxos/teleport-extension-
|
|
46
|
-
"@dxos/teleport-extension-
|
|
47
|
-
"@dxos/
|
|
48
|
-
"@dxos/
|
|
49
|
-
"@dxos/
|
|
24
|
+
"@dxos/async": "0.1.36",
|
|
25
|
+
"@dxos/codec-protobuf": "0.1.36",
|
|
26
|
+
"@dxos/context": "0.1.36",
|
|
27
|
+
"@dxos/credentials": "0.1.36",
|
|
28
|
+
"@dxos/crypto": "0.1.36",
|
|
29
|
+
"@dxos/debug": "0.1.36",
|
|
30
|
+
"@dxos/document-model": "0.1.36",
|
|
31
|
+
"@dxos/echo-db": "0.1.36",
|
|
32
|
+
"@dxos/errors": "0.1.36",
|
|
33
|
+
"@dxos/feed-store": "0.1.36",
|
|
34
|
+
"@dxos/hypercore": "0.1.36",
|
|
35
|
+
"@dxos/keyring": "0.1.36",
|
|
36
|
+
"@dxos/keys": "0.1.36",
|
|
37
|
+
"@dxos/log": "0.1.36",
|
|
38
|
+
"@dxos/messaging": "0.1.36",
|
|
39
|
+
"@dxos/model-factory": "0.1.36",
|
|
40
|
+
"@dxos/network-manager": "0.1.36",
|
|
41
|
+
"@dxos/node-std": "0.1.36",
|
|
42
|
+
"@dxos/protocols": "0.1.36",
|
|
43
|
+
"@dxos/random-access-storage": "0.1.36",
|
|
44
|
+
"@dxos/rpc": "0.1.36",
|
|
45
|
+
"@dxos/teleport": "0.1.36",
|
|
46
|
+
"@dxos/teleport-extension-gossip": "0.1.36",
|
|
47
|
+
"@dxos/teleport-extension-object-sync": "0.1.36",
|
|
48
|
+
"@dxos/teleport-extension-replicator": "0.1.36",
|
|
49
|
+
"@dxos/timeframe": "0.1.36",
|
|
50
|
+
"@dxos/typings": "0.1.36",
|
|
51
|
+
"@dxos/util": "0.1.36"
|
|
50
52
|
},
|
|
51
53
|
"devDependencies": {
|
|
52
54
|
"@types/debug": "^4.1.7",
|
|
55
|
+
"fast-check": "~3.3.0",
|
|
53
56
|
"hypercore-protocol": "^8.0.7",
|
|
54
57
|
"source-map-support": "^0.5.12",
|
|
55
58
|
"wait-for-expect": "^3.0.2",
|
|
56
|
-
"@dxos/text-model": "0.1.
|
|
59
|
+
"@dxos/text-model": "0.1.36"
|
|
57
60
|
},
|
|
58
61
|
"publishConfig": {
|
|
59
62
|
"access": "public"
|
package/src/common/feeds.ts
CHANGED
|
@@ -18,6 +18,6 @@ export const createMappedFeedWriter = <Source extends {}, Target extends {}>(
|
|
|
18
18
|
assert(writer);
|
|
19
19
|
|
|
20
20
|
return {
|
|
21
|
-
write: async (data: Source) => await writer.write(await mapper(data))
|
|
21
|
+
write: async (data: Source, options) => await writer.write(await mapper(data), options)
|
|
22
22
|
};
|
|
23
23
|
};
|
|
@@ -36,7 +36,6 @@ export class DataServiceHost {
|
|
|
36
36
|
return new Stream(({ next, ctx }) => {
|
|
37
37
|
// send current state
|
|
38
38
|
const objects = Array.from(this._itemManager.entities.values()).map((entity) => entity.createSnapshot());
|
|
39
|
-
|
|
40
39
|
next({
|
|
41
40
|
batch: {
|
|
42
41
|
objects
|
|
@@ -47,10 +46,10 @@ export class DataServiceHost {
|
|
|
47
46
|
|
|
48
47
|
this._itemDemuxer.mutation.on(ctx, (message) => {
|
|
49
48
|
const { batch, meta } = message;
|
|
50
|
-
log('
|
|
49
|
+
log('message', { batch, meta });
|
|
51
50
|
|
|
52
51
|
const clientTag = this._clientTagMap.get([message.meta.feedKey, message.meta.seq]);
|
|
53
|
-
// TODO(dmaretskyi):
|
|
52
|
+
// TODO(dmaretskyi): Memory leak with _clientTagMap not getting cleared.
|
|
54
53
|
|
|
55
54
|
// Assign feed metadata
|
|
56
55
|
batch.objects?.forEach((object) => {
|
|
@@ -75,22 +74,30 @@ export class DataServiceHost {
|
|
|
75
74
|
async write(request: WriteRequest): Promise<MutationReceipt> {
|
|
76
75
|
assert(this._writeStream, 'Cannot write mutations in readonly mode');
|
|
77
76
|
|
|
77
|
+
log('write', { clientTag: request.clientTag, objectCount: request.batch.objects?.length ?? 0 });
|
|
78
|
+
|
|
78
79
|
// Clear client metadata.
|
|
79
|
-
const
|
|
80
|
+
const message: DataMessage = {
|
|
80
81
|
batch: {
|
|
81
82
|
objects: request.batch.objects?.map((object) => ({
|
|
82
83
|
...object,
|
|
83
|
-
mutations: object.mutations?.map((
|
|
84
|
-
...
|
|
84
|
+
mutations: object.mutations?.map((mutation) => ({
|
|
85
|
+
...mutation,
|
|
85
86
|
meta: undefined
|
|
86
87
|
})),
|
|
87
88
|
meta: undefined
|
|
88
89
|
}))
|
|
89
90
|
}
|
|
91
|
+
};
|
|
92
|
+
const receipt = await this._writeStream.write(message, {
|
|
93
|
+
afterWrite: async (receipt) => {
|
|
94
|
+
// Runs before the mutation is read from the pipeline.
|
|
95
|
+
if (request.clientTag) {
|
|
96
|
+
log('tag', { clientTag: request.clientTag, feedKey: receipt.feedKey, seq: receipt.seq });
|
|
97
|
+
this._clientTagMap.set([receipt.feedKey, receipt.seq], request.clientTag);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
90
100
|
});
|
|
91
|
-
if (request.clientTag) {
|
|
92
|
-
this._clientTagMap.set([receipt.feedKey, receipt.seq], request.clientTag);
|
|
93
|
-
}
|
|
94
101
|
|
|
95
102
|
return receipt;
|
|
96
103
|
}
|
|
@@ -17,7 +17,7 @@ import { DataServiceHost } from './data-service-host';
|
|
|
17
17
|
* Mutations are read from the incoming streams and applied to the ItemManager via ItemDemuxer.
|
|
18
18
|
* Write operations result in mutations being written to the outgoing stream.
|
|
19
19
|
*/
|
|
20
|
-
export class
|
|
20
|
+
export class DatabaseHost {
|
|
21
21
|
private _echoProcessor!: EchoProcessor;
|
|
22
22
|
private _itemManager!: ItemManager;
|
|
23
23
|
public _itemDemuxer!: ItemDemuxer;
|
package/src/dbhost/index.ts
CHANGED
|
@@ -2,9 +2,11 @@
|
|
|
2
2
|
// Copyright 2021 DXOS.org
|
|
3
3
|
//
|
|
4
4
|
|
|
5
|
+
import CRC32 from 'crc-32';
|
|
5
6
|
import assert from 'node:assert';
|
|
6
7
|
|
|
7
8
|
import { synchronized } from '@dxos/async';
|
|
9
|
+
import { DataCorruptionError } from '@dxos/errors';
|
|
8
10
|
import { PublicKey } from '@dxos/keys';
|
|
9
11
|
import { log } from '@dxos/log';
|
|
10
12
|
import { schema } from '@dxos/protocols';
|
|
@@ -59,21 +61,25 @@ export class MetadataStore {
|
|
|
59
61
|
const file = this._directory.getOrCreateFile('EchoMetadata');
|
|
60
62
|
try {
|
|
61
63
|
const { size: fileLength } = await file.stat();
|
|
62
|
-
if (fileLength <
|
|
64
|
+
if (fileLength < 8) {
|
|
63
65
|
return;
|
|
64
66
|
}
|
|
65
67
|
// Loading file size from first 4 bytes.
|
|
66
68
|
const dataSize = fromBytesInt32(await file.read(0, 4));
|
|
67
|
-
|
|
69
|
+
const checksum = fromBytesInt32(await file.read(4, 4));
|
|
70
|
+
log('loaded', { size: dataSize, checksum });
|
|
68
71
|
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
if (fileLength < dataSize + 8) {
|
|
73
|
+
throw new DataCorruptionError('Metadata size is smaller than expected.');
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
const data = await file.read(8, dataSize);
|
|
77
|
+
|
|
78
|
+
const calculatedChecksum = CRC32.buf(data);
|
|
79
|
+
if (calculatedChecksum !== checksum) {
|
|
80
|
+
throw new DataCorruptionError('Metadata checksum is invalid.');
|
|
74
81
|
}
|
|
75
82
|
|
|
76
|
-
const data = await file.read(4, dataSize);
|
|
77
83
|
this._metadata = schema.getCodecForType('dxos.echo.metadata.EchoMetadata').decode(data);
|
|
78
84
|
} catch (err: any) {
|
|
79
85
|
log.error('failed to load metadata', { err });
|
|
@@ -96,13 +102,18 @@ export class MetadataStore {
|
|
|
96
102
|
|
|
97
103
|
try {
|
|
98
104
|
const encoded = Buffer.from(schema.getCodecForType('dxos.echo.metadata.EchoMetadata').encode(data));
|
|
105
|
+
const checksum = CRC32.buf(encoded);
|
|
106
|
+
|
|
107
|
+
const result = Buffer.alloc(8 + encoded.length);
|
|
99
108
|
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
109
|
+
result.writeInt32LE(encoded.length, 0);
|
|
110
|
+
result.writeInt32LE(checksum, 4);
|
|
111
|
+
encoded.copy(result, 8);
|
|
103
112
|
|
|
104
|
-
//
|
|
105
|
-
await file.write(
|
|
113
|
+
// NOTE: This must be done in one write operation, otherwise the file can be corrupted.
|
|
114
|
+
await file.write(0, result);
|
|
115
|
+
|
|
116
|
+
log('saved', { size: encoded.length, checksum });
|
|
106
117
|
} finally {
|
|
107
118
|
await file.close();
|
|
108
119
|
}
|
|
@@ -162,11 +173,4 @@ export class MetadataStore {
|
|
|
162
173
|
await this._save();
|
|
163
174
|
}
|
|
164
175
|
}
|
|
165
|
-
|
|
166
|
-
const toBytesInt32 = (num: number) => {
|
|
167
|
-
const buf = Buffer.alloc(4);
|
|
168
|
-
buf.writeInt32LE(num, 0);
|
|
169
|
-
return buf;
|
|
170
|
-
};
|
|
171
|
-
|
|
172
176
|
const fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);
|