@dxos/echo-pipeline 0.1.56-main.bf228a7 → 0.1.56-main.c19b7cd
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-7RPTJNLX.mjs → chunk-EJ35NHZV.mjs} +45 -37
- package/dist/lib/browser/chunk-EJ35NHZV.mjs.map +7 -0
- package/dist/lib/browser/index.mjs +1 -1
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +3 -2
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node/index.cjs +48 -40
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +50 -41
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/db-host/snapshot-manager.d.ts.map +1 -1
- package/dist/types/src/pipeline/pipeline.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts +2 -1
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
- package/package.json +32 -31
- package/src/db-host/snapshot-manager.ts +0 -2
- package/src/pipeline/pipeline.test.ts +37 -1
- package/src/pipeline/pipeline.ts +2 -0
- package/src/space/space.test.ts +10 -9
- package/src/space/space.ts +5 -1
- package/src/testing/test-agent-builder.ts +2 -1
- package/dist/lib/browser/chunk-7RPTJNLX.mjs.map +0 -7
|
@@ -215,7 +215,6 @@ var DatabaseHost = class {
|
|
|
215
215
|
// packages/core/echo/echo-pipeline/src/db-host/snapshot-manager.ts
|
|
216
216
|
import { trackLeaks } from "@dxos/async";
|
|
217
217
|
import { cancelWithContext } from "@dxos/context";
|
|
218
|
-
import { timed } from "@dxos/debug";
|
|
219
218
|
import { PublicKey } from "@dxos/keys";
|
|
220
219
|
import { schema as schema2 } from "@dxos/protocols";
|
|
221
220
|
import { BlobMeta } from "@dxos/protocols/proto/dxos/echo/blob";
|
|
@@ -260,9 +259,6 @@ var SnapshotManager = class SnapshotManager2 {
|
|
|
260
259
|
return PublicKey.from(id).toHex();
|
|
261
260
|
}
|
|
262
261
|
};
|
|
263
|
-
_ts_decorate([
|
|
264
|
-
timed(1e4)
|
|
265
|
-
], SnapshotManager.prototype, "load", null);
|
|
266
262
|
SnapshotManager = _ts_decorate([
|
|
267
263
|
trackLeaks("open", "close")
|
|
268
264
|
], SnapshotManager);
|
|
@@ -630,7 +626,7 @@ var fromBytesInt32 = (buf) => buf.readInt32LE(0);
|
|
|
630
626
|
|
|
631
627
|
// packages/core/echo/echo-pipeline/src/pipeline/timeframe-clock.ts
|
|
632
628
|
import { Event as Event2 } from "@dxos/async";
|
|
633
|
-
import { timed
|
|
629
|
+
import { timed } from "@dxos/debug";
|
|
634
630
|
import { log as log4 } from "@dxos/log";
|
|
635
631
|
import { Timeframe } from "@dxos/timeframe";
|
|
636
632
|
function _ts_decorate3(decorators, target, key, desc) {
|
|
@@ -723,7 +719,7 @@ var TimeframeClock = class {
|
|
|
723
719
|
}
|
|
724
720
|
};
|
|
725
721
|
_ts_decorate3([
|
|
726
|
-
|
|
722
|
+
timed(5e3)
|
|
727
723
|
], TimeframeClock.prototype, "waitUntilReached", null);
|
|
728
724
|
|
|
729
725
|
// packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts
|
|
@@ -947,10 +943,19 @@ var Pipeline = class {
|
|
|
947
943
|
}), feed.createFeedWriter());
|
|
948
944
|
}
|
|
949
945
|
async start() {
|
|
950
|
-
|
|
946
|
+
invariant6(!this._isStarted, "Pipeline is already started.", {
|
|
951
947
|
F: __dxlog_file7,
|
|
952
948
|
L: 267,
|
|
953
949
|
S: this,
|
|
950
|
+
A: [
|
|
951
|
+
"!this._isStarted",
|
|
952
|
+
"'Pipeline is already started.'"
|
|
953
|
+
]
|
|
954
|
+
});
|
|
955
|
+
log6("starting...", void 0, {
|
|
956
|
+
F: __dxlog_file7,
|
|
957
|
+
L: 268,
|
|
958
|
+
S: this,
|
|
954
959
|
C: (f, a) => f(...a)
|
|
955
960
|
});
|
|
956
961
|
await this._initIterator();
|
|
@@ -958,7 +963,7 @@ var Pipeline = class {
|
|
|
958
963
|
this._isStarted = true;
|
|
959
964
|
log6("started", void 0, {
|
|
960
965
|
F: __dxlog_file7,
|
|
961
|
-
L:
|
|
966
|
+
L: 272,
|
|
962
967
|
S: this,
|
|
963
968
|
C: (f, a) => f(...a)
|
|
964
969
|
});
|
|
@@ -967,7 +972,7 @@ var Pipeline = class {
|
|
|
967
972
|
var _a;
|
|
968
973
|
log6("stopping...", void 0, {
|
|
969
974
|
F: __dxlog_file7,
|
|
970
|
-
L:
|
|
975
|
+
L: 277,
|
|
971
976
|
S: this,
|
|
972
977
|
C: (f, a) => f(...a)
|
|
973
978
|
});
|
|
@@ -980,7 +985,7 @@ var Pipeline = class {
|
|
|
980
985
|
this._isStarted = false;
|
|
981
986
|
log6("stopped", void 0, {
|
|
982
987
|
F: __dxlog_file7,
|
|
983
|
-
L:
|
|
988
|
+
L: 285,
|
|
984
989
|
S: this,
|
|
985
990
|
C: (f, a) => f(...a)
|
|
986
991
|
});
|
|
@@ -992,7 +997,7 @@ var Pipeline = class {
|
|
|
992
997
|
async setCursor(timeframe) {
|
|
993
998
|
invariant6(!this._isStarted || this._isPaused, "Invalid state.", {
|
|
994
999
|
F: __dxlog_file7,
|
|
995
|
-
L:
|
|
1000
|
+
L: 294,
|
|
996
1001
|
S: this,
|
|
997
1002
|
A: [
|
|
998
1003
|
"!this._isStarted || this._isPaused",
|
|
@@ -1016,7 +1021,7 @@ var Pipeline = class {
|
|
|
1016
1021
|
async pause() {
|
|
1017
1022
|
invariant6(this._isStarted, "Pipeline is not open.", {
|
|
1018
1023
|
F: __dxlog_file7,
|
|
1019
|
-
L:
|
|
1024
|
+
L: 316,
|
|
1020
1025
|
S: this,
|
|
1021
1026
|
A: [
|
|
1022
1027
|
"this._isStarted",
|
|
@@ -1033,7 +1038,7 @@ var Pipeline = class {
|
|
|
1033
1038
|
async unpause() {
|
|
1034
1039
|
invariant6(this._isStarted, "Pipeline is not open.", {
|
|
1035
1040
|
F: __dxlog_file7,
|
|
1036
|
-
L:
|
|
1041
|
+
L: 328,
|
|
1037
1042
|
S: this,
|
|
1038
1043
|
A: [
|
|
1039
1044
|
"this._isStarted",
|
|
@@ -1042,7 +1047,7 @@ var Pipeline = class {
|
|
|
1042
1047
|
});
|
|
1043
1048
|
invariant6(this._isPaused, "Pipeline is not paused.", {
|
|
1044
1049
|
F: __dxlog_file7,
|
|
1045
|
-
L:
|
|
1050
|
+
L: 329,
|
|
1046
1051
|
S: this,
|
|
1047
1052
|
A: [
|
|
1048
1053
|
"this._isPaused",
|
|
@@ -1059,7 +1064,7 @@ var Pipeline = class {
|
|
|
1059
1064
|
async *consume() {
|
|
1060
1065
|
invariant6(!this._isOpen, "Pipeline is already being consumed.", {
|
|
1061
1066
|
F: __dxlog_file7,
|
|
1062
|
-
L:
|
|
1067
|
+
L: 340,
|
|
1063
1068
|
S: this,
|
|
1064
1069
|
A: [
|
|
1065
1070
|
"!this._isOpen",
|
|
@@ -1069,7 +1074,7 @@ var Pipeline = class {
|
|
|
1069
1074
|
this._isOpen = true;
|
|
1070
1075
|
invariant6(this._feedSetIterator, "Iterator not initialized.", {
|
|
1071
1076
|
F: __dxlog_file7,
|
|
1072
|
-
L:
|
|
1077
|
+
L: 343,
|
|
1073
1078
|
S: this,
|
|
1074
1079
|
A: [
|
|
1075
1080
|
"this._feedSetIterator",
|
|
@@ -1083,7 +1088,7 @@ var Pipeline = class {
|
|
|
1083
1088
|
if (lastFeedSetIterator !== this._feedSetIterator) {
|
|
1084
1089
|
invariant6(this._feedSetIterator, "Iterator not initialized.", {
|
|
1085
1090
|
F: __dxlog_file7,
|
|
1086
|
-
L:
|
|
1091
|
+
L: 352,
|
|
1087
1092
|
S: this,
|
|
1088
1093
|
A: [
|
|
1089
1094
|
"this._feedSetIterator",
|
|
@@ -1112,7 +1117,7 @@ var Pipeline = class {
|
|
|
1112
1117
|
feed.undownload({
|
|
1113
1118
|
callback: () => log6("undownload", void 0, {
|
|
1114
1119
|
F: __dxlog_file7,
|
|
1115
|
-
L:
|
|
1120
|
+
L: 377,
|
|
1116
1121
|
S: this,
|
|
1117
1122
|
C: (f, a) => f(...a)
|
|
1118
1123
|
})
|
|
@@ -1125,7 +1130,7 @@ var Pipeline = class {
|
|
|
1125
1130
|
err
|
|
1126
1131
|
}, {
|
|
1127
1132
|
F: __dxlog_file7,
|
|
1128
|
-
L:
|
|
1133
|
+
L: 379,
|
|
1129
1134
|
S: this,
|
|
1130
1135
|
C: (f, a) => f(...a)
|
|
1131
1136
|
});
|
|
@@ -1139,7 +1144,7 @@ var Pipeline = class {
|
|
|
1139
1144
|
this._feedSetIterator.stalled.on((iterator) => {
|
|
1140
1145
|
log6.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`, void 0, {
|
|
1141
1146
|
F: __dxlog_file7,
|
|
1142
|
-
L:
|
|
1147
|
+
L: 390,
|
|
1143
1148
|
S: this,
|
|
1144
1149
|
C: (f, a) => f(...a)
|
|
1145
1150
|
});
|
|
@@ -1692,6 +1697,7 @@ import { Event as Event5, synchronized as synchronized4, trackLeaks as trackLeak
|
|
|
1692
1697
|
import { invariant as invariant9 } from "@dxos/invariant";
|
|
1693
1698
|
import { log as log10, logInfo } from "@dxos/log";
|
|
1694
1699
|
import { AdmittedFeed as AdmittedFeed2 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
1700
|
+
import { trace } from "@dxos/tracing";
|
|
1695
1701
|
import { Callback as Callback2 } from "@dxos/util";
|
|
1696
1702
|
|
|
1697
1703
|
// packages/core/echo/echo-pipeline/src/space/control-pipeline.ts
|
|
@@ -1861,7 +1867,7 @@ var Space = class Space2 {
|
|
|
1861
1867
|
this._isOpen = false;
|
|
1862
1868
|
invariant9(params.spaceKey && params.feedProvider, void 0, {
|
|
1863
1869
|
F: __dxlog_file11,
|
|
1864
|
-
L:
|
|
1870
|
+
L: 73,
|
|
1865
1871
|
S: this,
|
|
1866
1872
|
A: [
|
|
1867
1873
|
"params.spaceKey && params.feedProvider",
|
|
@@ -1903,7 +1909,7 @@ var Space = class Space2 {
|
|
|
1903
1909
|
credential
|
|
1904
1910
|
}, {
|
|
1905
1911
|
F: __dxlog_file11,
|
|
1906
|
-
L:
|
|
1912
|
+
L: 109,
|
|
1907
1913
|
S: this,
|
|
1908
1914
|
C: (f, a) => f(...a)
|
|
1909
1915
|
});
|
|
@@ -1970,7 +1976,7 @@ var Space = class Space2 {
|
|
|
1970
1976
|
setControlFeed(feed) {
|
|
1971
1977
|
invariant9(!this._controlFeed, "Control feed already set.", {
|
|
1972
1978
|
F: __dxlog_file11,
|
|
1973
|
-
L:
|
|
1979
|
+
L: 183,
|
|
1974
1980
|
S: this,
|
|
1975
1981
|
A: [
|
|
1976
1982
|
"!this._controlFeed",
|
|
@@ -1985,7 +1991,7 @@ var Space = class Space2 {
|
|
|
1985
1991
|
var _a;
|
|
1986
1992
|
invariant9(!this._dataFeed, "Data feed already set.", {
|
|
1987
1993
|
F: __dxlog_file11,
|
|
1988
|
-
L:
|
|
1994
|
+
L: 190,
|
|
1989
1995
|
S: this,
|
|
1990
1996
|
A: [
|
|
1991
1997
|
"!this._dataFeed",
|
|
@@ -2008,10 +2014,10 @@ var Space = class Space2 {
|
|
|
2008
2014
|
// getDataFeeds(): FeedInfo[] {
|
|
2009
2015
|
// return this._dataPipeline?.getFeeds();
|
|
2010
2016
|
// }
|
|
2011
|
-
async open() {
|
|
2017
|
+
async open(ctx) {
|
|
2012
2018
|
log10("opening...", void 0, {
|
|
2013
2019
|
F: __dxlog_file11,
|
|
2014
|
-
L:
|
|
2020
|
+
L: 212,
|
|
2015
2021
|
S: this,
|
|
2016
2022
|
C: (f, a) => f(...a)
|
|
2017
2023
|
});
|
|
@@ -2024,7 +2030,7 @@ var Space = class Space2 {
|
|
|
2024
2030
|
this._isOpen = true;
|
|
2025
2031
|
log10("opened", void 0, {
|
|
2026
2032
|
F: __dxlog_file11,
|
|
2027
|
-
L:
|
|
2033
|
+
L: 223,
|
|
2028
2034
|
S: this,
|
|
2029
2035
|
C: (f, a) => f(...a)
|
|
2030
2036
|
});
|
|
@@ -2034,7 +2040,7 @@ var Space = class Space2 {
|
|
|
2034
2040
|
key: this._key
|
|
2035
2041
|
}, {
|
|
2036
2042
|
F: __dxlog_file11,
|
|
2037
|
-
L:
|
|
2043
|
+
L: 228,
|
|
2038
2044
|
S: this,
|
|
2039
2045
|
C: (f, a) => f(...a)
|
|
2040
2046
|
});
|
|
@@ -2048,7 +2054,7 @@ var Space = class Space2 {
|
|
|
2048
2054
|
this._isOpen = false;
|
|
2049
2055
|
log10("closed", void 0, {
|
|
2050
2056
|
F: __dxlog_file11,
|
|
2051
|
-
L:
|
|
2057
|
+
L: 241,
|
|
2052
2058
|
S: this,
|
|
2053
2059
|
C: (f, a) => f(...a)
|
|
2054
2060
|
});
|
|
@@ -2056,13 +2062,13 @@ var Space = class Space2 {
|
|
|
2056
2062
|
async initializeDataPipeline() {
|
|
2057
2063
|
log10("initializeDataPipeline", void 0, {
|
|
2058
2064
|
F: __dxlog_file11,
|
|
2059
|
-
L:
|
|
2065
|
+
L: 246,
|
|
2060
2066
|
S: this,
|
|
2061
2067
|
C: (f, a) => f(...a)
|
|
2062
2068
|
});
|
|
2063
2069
|
invariant9(this._isOpen, "Space must be open to initialize data pipeline.", {
|
|
2064
2070
|
F: __dxlog_file11,
|
|
2065
|
-
L:
|
|
2071
|
+
L: 247,
|
|
2066
2072
|
S: this,
|
|
2067
2073
|
A: [
|
|
2068
2074
|
"this._isOpen",
|
|
@@ -2076,7 +2082,8 @@ _ts_decorate6([
|
|
|
2076
2082
|
logInfo
|
|
2077
2083
|
], Space.prototype, "key", null);
|
|
2078
2084
|
_ts_decorate6([
|
|
2079
|
-
synchronized4
|
|
2085
|
+
synchronized4,
|
|
2086
|
+
trace.span()
|
|
2080
2087
|
], Space.prototype, "open", null);
|
|
2081
2088
|
_ts_decorate6([
|
|
2082
2089
|
synchronized4
|
|
@@ -2085,7 +2092,8 @@ _ts_decorate6([
|
|
|
2085
2092
|
synchronized4
|
|
2086
2093
|
], Space.prototype, "initializeDataPipeline", null);
|
|
2087
2094
|
Space = _ts_decorate6([
|
|
2088
|
-
trackLeaks3("open", "close")
|
|
2095
|
+
trackLeaks3("open", "close"),
|
|
2096
|
+
trace.resource()
|
|
2089
2097
|
], Space);
|
|
2090
2098
|
|
|
2091
2099
|
// packages/core/echo/echo-pipeline/src/space/space-protocol.ts
|
|
@@ -2291,7 +2299,7 @@ import { synchronized as synchronized5, trackLeaks as trackLeaks4 } from "@dxos/
|
|
|
2291
2299
|
import { failUndefined as failUndefined2 } from "@dxos/debug";
|
|
2292
2300
|
import { PublicKey as PublicKey6 } from "@dxos/keys";
|
|
2293
2301
|
import { log as log12 } from "@dxos/log";
|
|
2294
|
-
import { trace } from "@dxos/protocols";
|
|
2302
|
+
import { trace as trace2 } from "@dxos/protocols";
|
|
2295
2303
|
import { ComplexMap as ComplexMap5 } from "@dxos/util";
|
|
2296
2304
|
function _ts_decorate8(decorators, target, key, desc) {
|
|
2297
2305
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
@@ -2328,7 +2336,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
2328
2336
|
}
|
|
2329
2337
|
async constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey }) {
|
|
2330
2338
|
var _a;
|
|
2331
|
-
log12.trace("dxos.echo.space-manager.construct-space",
|
|
2339
|
+
log12.trace("dxos.echo.space-manager.construct-space", trace2.begin({
|
|
2332
2340
|
id: this._instanceId
|
|
2333
2341
|
}), {
|
|
2334
2342
|
F: __dxlog_file13,
|
|
@@ -2366,7 +2374,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
2366
2374
|
memberKey
|
|
2367
2375
|
});
|
|
2368
2376
|
this._spaces.set(space.key, space);
|
|
2369
|
-
log12.trace("dxos.echo.space-manager.construct-space",
|
|
2377
|
+
log12.trace("dxos.echo.space-manager.construct-space", trace2.end({
|
|
2370
2378
|
id: this._instanceId
|
|
2371
2379
|
}), {
|
|
2372
2380
|
F: __dxlog_file13,
|
|
@@ -2413,4 +2421,4 @@ export {
|
|
|
2413
2421
|
SpaceProtocolSession,
|
|
2414
2422
|
SpaceManager
|
|
2415
2423
|
};
|
|
2416
|
-
//# sourceMappingURL=chunk-
|
|
2424
|
+
//# sourceMappingURL=chunk-EJ35NHZV.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/common/codec.ts", "../../../src/common/feeds.ts", "../../../src/db-host/data-service-host.ts", "../../../src/db-host/database-host.ts", "../../../src/db-host/snapshot-manager.ts", "../../../src/db-host/snapshot-store.ts", "../../../src/db-host/data-service.ts", "../../../src/metadata/metadata-store.ts", "../../../src/pipeline/timeframe-clock.ts", "../../../src/pipeline/pipeline.ts", "../../../src/pipeline/message-selector.ts", "../../../src/space/auth.ts", "../../../src/space/data-pipeline.ts", "../../../src/space/space.ts", "../../../src/space/control-pipeline.ts", "../../../src/space/space-protocol.ts", "../../../src/space/space-manager.ts"],
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2022 DXOS.org\n//\n\nimport { Codec } from '@dxos/codec-protobuf';\nimport { createCodecEncoding } from '@dxos/hypercore';\nimport { schema } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\n/**\n * Codec for feed messages.\n */\nexport const codec: Codec<FeedMessage> = schema.getCodecForType('dxos.echo.feed.FeedMessage');\n\n/**\n * Value encoding used by feed store.\n */\nexport const valueEncoding = createCodecEncoding(codec);\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { FeedWriter } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { MaybePromise } from '@dxos/util';\n\n/**\n * Maps the written arguments onto a different message type.\n */\nexport const createMappedFeedWriter = <Source extends {}, Target extends {}>(\n mapper: (arg: Source) => MaybePromise<Target>,\n writer: FeedWriter<Target>,\n): FeedWriter<Source> => {\n invariant(mapper);\n invariant(writer);\n\n return {\n write: async (data: Source, options) => await writer.write(await mapper(data), options),\n };\n};\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { Context } from '@dxos/context';\nimport { tagMutationsInBatch, ItemDemuxer, ItemManager, setMetadataOnObject } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { EchoObjectBatch } from '@dxos/protocols/proto/dxos/echo/object';\nimport { EchoEvent, MutationReceipt, WriteRequest } from '@dxos/protocols/proto/dxos/echo/service';\nimport { ComplexMap } from '@dxos/util';\n\n/**\n * Provides methods for DataService for a single space.\n * A DataServiceRouter must be placed before it to route requests to different DataServiceHost instances based on space id.\n */\n// TODO(burdon): Move to client-services.\nexport class DataServiceHost {\n private readonly _ctx = new Context();\n\n private readonly _clientTagMap = new ComplexMap<[feedKey: PublicKey, seq: number], string>(\n ([feedKey, seq]) => `${feedKey.toHex()}:${seq}`,\n );\n\n constructor(\n private readonly _itemManager: ItemManager,\n private readonly _itemDemuxer: ItemDemuxer,\n private readonly _writeStream?: FeedWriter<DataMessage>,\n ) {}\n\n async open() {}\n\n async close() {\n await this._ctx.dispose();\n }\n\n /**\n * Real-time subscription to data objects in a space.\n */\n subscribe(): Stream<EchoEvent> {\n return new Stream(({ next, close, ctx }) => {\n // This looks ridiculous..\n ctx.onDispose(this._ctx.onDispose(close));\n\n // send current state\n const objects = Array.from(this._itemManager.entities.values()).map((entity) => entity.createSnapshot());\n next({\n batch: {\n objects,\n },\n });\n\n // subscribe to mutations\n\n this._itemDemuxer.mutation.on(ctx, (message) => {\n const { batch, meta } = message;\n invariant(!(meta as any).clientTag, 'Unexpected client tag in mutation message');\n log('message', { batch, meta });\n\n const clientTag = this._clientTagMap.get([message.meta.feedKey, message.meta.seq]);\n // TODO(dmaretskyi): Memory leak with _clientTagMap not getting cleared.\n\n // Assign feed metadata\n batch.objects?.forEach((object) => {\n setMetadataOnObject(object, { ...meta });\n });\n\n // Assign client tag metadata\n if (clientTag) {\n tagMutationsInBatch(batch, clientTag, 0);\n }\n\n next({\n clientTag,\n feedKey: message.meta.feedKey,\n seq: message.meta.seq,\n batch,\n });\n });\n });\n }\n\n async write(request: WriteRequest): Promise<MutationReceipt> {\n invariant(!this._ctx.disposed, 'Cannot write to closed DataServiceHost');\n invariant(this._writeStream, 'Cannot write mutations in readonly mode');\n\n log('write', { clientTag: request.clientTag, objectCount: request.batch.objects?.length ?? 0 });\n\n // Clear client metadata.\n const message = createDataMessage(request.batch);\n\n const receipt = await this._writeStream.write(message, {\n afterWrite: async (receipt) => {\n // Runs before the mutation is read from the pipeline.\n if (request.clientTag) {\n log('tag', { clientTag: request.clientTag, feedKey: receipt.feedKey, seq: receipt.seq });\n this._clientTagMap.set([receipt.feedKey, receipt.seq], request.clientTag);\n }\n },\n });\n\n return receipt;\n }\n}\n\nconst createDataMessage = (batch: EchoObjectBatch) => ({\n batch: {\n objects: batch.objects?.map((object) => ({\n ...object,\n mutations: object.mutations?.map((mutation) => ({\n ...mutation,\n meta: undefined,\n })),\n meta: undefined,\n })),\n },\n});\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { EchoProcessor, ItemDemuxer, ItemManager } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { DataServiceHost } from './data-service-host';\n\n/**\n * Database backend that operates on two streams: read and write.\n * Mutations are read from the incoming streams and applied to the ItemManager via ItemDemuxer.\n * Write operations result in mutations being written to the outgoing stream.\n */\nexport class DatabaseHost {\n private _echoProcessor!: EchoProcessor;\n private _itemManager!: ItemManager;\n public _itemDemuxer!: ItemDemuxer;\n\n constructor(private readonly _outboundStream: FeedWriter<DataMessage> | undefined) {}\n\n get isReadOnly(): boolean {\n return !!this._outboundStream;\n }\n\n get echoProcessor() {\n return this._echoProcessor;\n }\n\n async open(itemManager: ItemManager, modelFactory: ModelFactory) {\n this._itemManager = itemManager;\n this._itemManager._debugLabel = 'host';\n\n this._itemDemuxer = new ItemDemuxer(itemManager, modelFactory);\n this._echoProcessor = this._itemDemuxer.open();\n }\n\n async close() {}\n\n getWriteStream(): FeedWriter<DataMessage> | undefined {\n return this._outboundStream;\n }\n\n createSnapshot() {\n return this._itemDemuxer.createSnapshot();\n }\n\n createDataServiceHost() {\n return new DataServiceHost(this._itemManager, this._itemDemuxer, this._outboundStream ?? undefined);\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { trackLeaks } from '@dxos/async';\nimport { Context, cancelWithContext } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { schema } from '@dxos/protocols';\nimport { BlobMeta } from '@dxos/protocols/proto/dxos/echo/blob';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { BlobStore, BlobSync } from '@dxos/teleport-extension-object-sync';\n\nimport { SnapshotStore } from './snapshot-store';\n\nconst SpaceSnapshot = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot');\n\n/**\n * Snapshot manager for a specific space.\n */\n@trackLeaks('open', 'close')\nexport class SnapshotManager {\n // prettier-ignore\n constructor(\n private readonly _snapshotStore: SnapshotStore,\n private readonly _blobStore: BlobStore,\n private readonly _blobSync: BlobSync,\n ) {\n }\n\n private async _getBlob(blobId: Uint8Array): Promise<SpaceSnapshot> {\n const blob = await this._blobStore.get(blobId);\n return SpaceSnapshot.decode(blob);\n }\n\n async load(ctx: Context, id: string): Promise<SpaceSnapshot> {\n const blobId = PublicKey.fromHex(id).asUint8Array();\n const blobMeta = await this._blobStore.getMeta(blobId);\n if (blobMeta && blobMeta.state === BlobMeta.State.FULLY_PRESENT) {\n return this._getBlob(blobId);\n }\n\n // TODO(dmaretskyi): Remove once we fully migrate to blob store.\n const fallbackStore = await cancelWithContext(ctx, this._snapshotStore.loadSnapshot(id));\n if (fallbackStore) {\n return fallbackStore;\n }\n\n await this._blobSync.download(ctx, blobId);\n\n return this._getBlob(blobId);\n }\n\n async store(snapshot: SpaceSnapshot): Promise<string> {\n const { id } = await this._blobStore.set(SpaceSnapshot.encode(snapshot));\n await this._blobSync.notifyBlobAdded(id);\n return PublicKey.from(id).toHex();\n }\n}\n", "//\n// Copyright 2023 DXOS.org\n//\n\nimport { subtleCrypto } from '@dxos/crypto';\nimport { schema } from '@dxos/protocols';\nimport { StoredSnapshotInfo } from '@dxos/protocols/proto/dxos/devtools/host';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { Directory } from '@dxos/random-access-storage';\n\nconst SpaceSnapshot = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot');\n/**\n * @deprecated\n */\nexport class SnapshotStore {\n // prettier-ignore\n constructor(\n private readonly _directory: Directory\n ) { }\n\n async saveSnapshot(snapshot: SpaceSnapshot): Promise<string> {\n const encoded = SpaceSnapshot.encode(snapshot);\n const key = await subtleCrypto.digest('SHA-256', encoded);\n const keyString = Buffer.from(key).toString('hex');\n\n const file = await this._directory.getOrCreateFile(keyString);\n try {\n await file.write(0, Buffer.from(encoded));\n } finally {\n await file.close();\n }\n\n return keyString;\n }\n\n async loadSnapshot(key: string): Promise<SpaceSnapshot | undefined> {\n const file = await this._directory.getOrCreateFile(key);\n try {\n const { size } = await file.stat();\n if (size === 0) {\n return undefined;\n }\n\n const buffer = await file.read(0, size);\n return SpaceSnapshot.decode(buffer);\n } finally {\n await file.close();\n }\n }\n\n async listSnapshots(): Promise<StoredSnapshotInfo[]> {\n const entries = await this._directory.list();\n\n return await Promise.all(\n entries.map(async (key) => {\n const { size } = await this._directory.getOrCreateFile(key).stat();\n return {\n key,\n size,\n };\n }),\n );\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { raise } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n DataService,\n MutationReceipt,\n SubscribeRequest,\n EchoEvent,\n WriteRequest,\n} from '@dxos/protocols/proto/dxos/echo/service';\nimport { ComplexMap } from '@dxos/util';\n\nimport { DataServiceHost } from './data-service-host';\n\n// TODO(burdon): Clear on close.\nexport class DataServiceSubscriptions {\n private readonly _spaces = new ComplexMap<PublicKey, DataServiceHost>(PublicKey.hash);\n\n clear() {\n this._spaces.clear();\n }\n\n async registerSpace(spaceKey: PublicKey, host: DataServiceHost) {\n log('Registering space', { spaceKey });\n invariant(!this._spaces.has(spaceKey));\n await host.open();\n this._spaces.set(spaceKey, host);\n }\n\n async unregisterSpace(spaceKey: PublicKey) {\n log('Unregistering space', { spaceKey });\n const host = this._spaces.get(spaceKey);\n await host?.close();\n this._spaces.delete(spaceKey);\n }\n\n getDataService(spaceKey: PublicKey) {\n return this._spaces.get(spaceKey);\n }\n}\n\n/**\n * Routes DataService requests to different DataServiceHost instances based on space id.\n */\n// TODO(burdon): Move to client-services.\nexport class DataServiceImpl implements DataService {\n constructor(private readonly _subscriptions: DataServiceSubscriptions) {}\n\n subscribe(request: SubscribeRequest): Stream<EchoEvent> {\n invariant(request.spaceKey);\n const host =\n this._subscriptions.getDataService(request.spaceKey) ?? raise(new Error(`space not found: ${request.spaceKey}`));\n return host.subscribe();\n }\n\n write(request: WriteRequest): Promise<MutationReceipt> {\n invariant(request.spaceKey);\n invariant(request.batch);\n const host =\n this._subscriptions.getDataService(request.spaceKey) ?? raise(new Error(`space not found: ${request.spaceKey}`));\n return host.write(request);\n }\n}\n", "//\n// Copyright 2021 DXOS.org\n//\n\nimport CRC32 from 'crc-32';\n\nimport { synchronized, Event } from '@dxos/async';\nimport { DataCorruptionError } from '@dxos/errors';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { STORAGE_VERSION, schema } from '@dxos/protocols';\nimport { SpaceState } from '@dxos/protocols/proto/dxos/client/services';\nimport { EchoMetadata, SpaceMetadata, IdentityRecord, SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Directory } from '@dxos/random-access-storage';\nimport { Timeframe } from '@dxos/timeframe';\nimport { arrayToBuffer } from '@dxos/util';\n\nexport interface AddSpaceOptions {\n key: PublicKey;\n genesisFeed: PublicKey;\n}\n\nconst emptyEchoMetadata = (): EchoMetadata => ({\n version: STORAGE_VERSION,\n spaces: [],\n created: new Date(),\n updated: new Date(),\n});\n\nconst EchoMetadata = schema.getCodecForType('dxos.echo.metadata.EchoMetadata');\n\nexport class MetadataStore {\n private _metadata: EchoMetadata = emptyEchoMetadata();\n public readonly update = new Event<EchoMetadata>();\n\n // prettier-ignore\n constructor(\n private readonly _directory: Directory\n ) {}\n\n get metadata(): EchoMetadata {\n return this._metadata;\n }\n\n get version(): number {\n return this._metadata.version ?? 0;\n }\n\n /**\n * Returns a list of currently saved spaces. The list and objects in it can be modified addSpace and\n * addSpaceFeed functions.\n */\n get spaces(): SpaceMetadata[] {\n return this._metadata.spaces ?? [];\n }\n\n /**\n * Loads metadata from persistent storage.\n */\n @synchronized\n async load(): Promise<void> {\n const file = this._directory.getOrCreateFile('EchoMetadata');\n try {\n const { size: fileLength } = await file.stat();\n if (fileLength < 8) {\n return;\n }\n // Loading file size from first 4 bytes.\n const dataSize = fromBytesInt32(await file.read(0, 4));\n const checksum = fromBytesInt32(await file.read(4, 4));\n log('loaded', { size: dataSize, checksum });\n\n if (fileLength < dataSize + 8) {\n throw new DataCorruptionError('Metadata size is smaller than expected.');\n }\n\n const data = await file.read(8, dataSize);\n\n const calculatedChecksum = CRC32.buf(data);\n if (calculatedChecksum !== checksum) {\n throw new DataCorruptionError('Metadata checksum is invalid.');\n }\n\n this._metadata = EchoMetadata.decode(data);\n\n // post-processing\n this._metadata.spaces?.forEach((space) => {\n space.state ??= SpaceState.ACTIVE;\n });\n } catch (err: any) {\n log.error('failed to load metadata', { err });\n this._metadata = emptyEchoMetadata();\n } finally {\n await file.close();\n }\n }\n\n @synchronized\n private async _save(): Promise<void> {\n const data: EchoMetadata = {\n ...this._metadata,\n version: STORAGE_VERSION,\n created: this._metadata.created ?? new Date(),\n updated: new Date(),\n };\n this.update.emit(data);\n\n const file = this._directory.getOrCreateFile('EchoMetadata');\n\n try {\n const encoded = arrayToBuffer(EchoMetadata.encode(data));\n const checksum = CRC32.buf(encoded);\n\n const result = Buffer.alloc(8 + encoded.length);\n\n result.writeInt32LE(encoded.length, 0);\n result.writeInt32LE(checksum, 4);\n encoded.copy(result, 8);\n\n // NOTE: This must be done in one write operation, otherwise the file can be corrupted.\n await file.write(0, result);\n\n log('saved', { size: encoded.length, checksum });\n } finally {\n await file.close();\n }\n }\n\n _getSpace(spaceKey: PublicKey): SpaceMetadata {\n if (this._metadata.identity?.haloSpace.key.equals(spaceKey)) {\n // Check if the space is the identity space.\n return this._metadata.identity.haloSpace;\n }\n\n const space = this.spaces.find((space) => space.key === spaceKey);\n invariant(space, 'Space not found');\n return space;\n }\n\n /**\n * Clears storage - doesn't work for now.\n */\n async clear(): Promise<void> {\n log('clearing all metadata');\n await this._directory.delete();\n this._metadata = emptyEchoMetadata();\n }\n\n getIdentityRecord(): IdentityRecord | undefined {\n return this._metadata.identity;\n }\n\n async setIdentityRecord(record: IdentityRecord) {\n invariant(!this._metadata.identity, 'Cannot overwrite existing identity in metadata');\n\n this._metadata.identity = record;\n await this._save();\n }\n\n async addSpace(record: SpaceMetadata) {\n invariant(\n !(this._metadata.spaces ?? []).find((space) => space.key === record.key),\n 'Cannot overwrite existing space in metadata',\n );\n\n (this._metadata.spaces ??= []).push(record);\n await this._save();\n }\n\n async setSpaceDataLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {\n this._getSpace(spaceKey).dataTimeframe = timeframe;\n await this._save();\n }\n\n async setSpaceControlLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {\n this._getSpace(spaceKey).controlTimeframe = timeframe;\n await this._save();\n }\n\n async setCache(spaceKey: PublicKey, cache: SpaceCache) {\n this._getSpace(spaceKey).cache = cache;\n await this._save();\n }\n\n async setWritableFeedKeys(spaceKey: PublicKey, controlFeedKey: PublicKey, dataFeedKey: PublicKey) {\n const space = this._getSpace(spaceKey);\n space.controlFeedKey = controlFeedKey;\n space.dataFeedKey = dataFeedKey;\n await this._save();\n }\n\n async setSpaceState(spaceKey: PublicKey, state: SpaceState) {\n this._getSpace(spaceKey).state = state;\n await this._save();\n }\n}\n\nconst fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { timed } from '@dxos/debug';\nimport { FeedIndex } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { Timeframe } from '@dxos/timeframe';\n\nexport const mapTimeframeToFeedIndexes = (timeframe: Timeframe): FeedIndex[] =>\n timeframe.frames().map(([feedKey, index]) => ({ feedKey, index }));\n\nexport const mapFeedIndexesToTimeframe = (indexes: FeedIndex[]): Timeframe =>\n new Timeframe(indexes.map(({ feedKey, index }) => [feedKey, index]));\n\nexport const startAfter = (timeframe: Timeframe): FeedIndex[] =>\n timeframe.frames().map(([feedKey, index]) => ({ feedKey, index: index + 1 }));\n\n/**\n * Keeps state of the last timeframe that was processed by ECHO.\n */\nexport class TimeframeClock {\n readonly update = new Event<Timeframe>();\n\n private _pendingTimeframe: Timeframe;\n\n // prettier-ignore\n constructor(\n private _timeframe = new Timeframe()\n ) {\n this._pendingTimeframe = _timeframe;\n }\n\n /**\n * Timeframe that was processed by ECHO.\n */\n get timeframe() {\n return this._timeframe;\n }\n\n /**\n * Timeframe that is currently being processed by ECHO.\n * Will be equal to `timeframe` after the processing is complete.\n */\n get pendingTimeframe() {\n return this._pendingTimeframe;\n }\n\n setTimeframe(timeframe: Timeframe) {\n this._timeframe = timeframe;\n this._pendingTimeframe = timeframe;\n this.update.emit(this._timeframe);\n }\n\n updatePendingTimeframe(key: PublicKey, seq: number) {\n this._pendingTimeframe = Timeframe.merge(this._pendingTimeframe, new Timeframe([[key, seq]]));\n }\n\n updateTimeframe() {\n this._timeframe = this._pendingTimeframe;\n this.update.emit(this._timeframe);\n }\n\n hasGaps(timeframe: Timeframe) {\n const gaps = Timeframe.dependencies(timeframe, this._timeframe);\n return !gaps.isEmpty();\n }\n\n @timed(5_000)\n async waitUntilReached(target: Timeframe) {\n log('waitUntilReached', { target, current: this._timeframe });\n await this.update.waitForCondition(() => {\n log('check if reached', {\n target,\n current: this._timeframe,\n deps: Timeframe.dependencies(target, this._timeframe),\n });\n\n return Timeframe.dependencies(target, this._timeframe).isEmpty();\n });\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, sleep, synchronized, Trigger } from '@dxos/async';\nimport { Context, rejectOnDispose } from '@dxos/context';\nimport { failUndefined } from '@dxos/debug';\nimport { FeedSetIterator, FeedWrapper, FeedWriter } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { FeedMessageBlock } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { Timeframe } from '@dxos/timeframe';\nimport { ComplexMap } from '@dxos/util';\n\nimport { createMappedFeedWriter } from '../common';\nimport { createMessageSelector } from './message-selector';\nimport { mapFeedIndexesToTimeframe, startAfter, TimeframeClock } from './timeframe-clock';\n\nexport type WaitUntilReachedTargetParams = {\n /**\n * For cancellation.\n */\n ctx?: Context;\n timeout?: number;\n\n /**\n * @default true\n */\n breakOnStall?: boolean;\n};\n\n/**\n * External state accessor.\n */\nexport class PipelineState {\n /**\n * @internal\n */\n _ctx = new Context();\n\n // TODO(dmaretskyi): Remove?.\n public readonly timeframeUpdate = this._timeframeClock.update;\n\n public readonly stalled = new Event();\n\n /**\n * @internal\n */\n _startTimeframe: Timeframe = new Timeframe();\n\n /**\n * Target timeframe we are waiting to reach.\n */\n private _targetTimeframe: Timeframe | undefined;\n\n /**\n * @internal\n */\n _reachedTargetPromise: Promise<void> | undefined;\n\n // prettier-ignore\n constructor(\n private _feeds: ComplexMap<PublicKey, FeedWrapper<FeedMessage>>,\n private _timeframeClock: TimeframeClock\n ) { }\n\n /**\n * Latest theoretical timeframe based on the last mutation in each feed.\n * NOTE: This might never be reached if the mutation dependencies\n */\n // TODO(dmaretskyi): Rename `totalTimeframe`? or `lastTimeframe`.\n get endTimeframe() {\n return mapFeedIndexesToTimeframe(\n Array.from(this._feeds.values())\n .filter((feed) => feed.length > 0)\n .map((feed) => ({\n feedKey: feed.key,\n index: feed.length - 1,\n })),\n );\n }\n\n get startTimeframe() {\n return this._startTimeframe;\n }\n\n get timeframe() {\n return this._timeframeClock.timeframe;\n }\n\n get pendingTimeframe() {\n return this._timeframeClock.pendingTimeframe;\n }\n\n get targetTimeframe() {\n return this._targetTimeframe ? this._targetTimeframe : new Timeframe();\n }\n\n get feeds() {\n return Array.from(this._feeds.values());\n }\n\n async waitUntilTimeframe(target: Timeframe) {\n await this._timeframeClock.waitUntilReached(target);\n }\n\n setTargetTimeframe(target: Timeframe) {\n this._targetTimeframe = target;\n }\n\n /**\n * Wait until the pipeline processes all messages in the feed and reaches the target timeframe if that is set.\n *\n * This function will resolve immediately if the pipeline is stalled.\n *\n * @param timeout Timeout in milliseconds to specify the maximum wait time.\n */\n async waitUntilReachedTargetTimeframe({\n ctx = new Context(),\n timeout,\n breakOnStall = true,\n }: WaitUntilReachedTargetParams = {}) {\n log('waitUntilReachedTargetTimeframe', {\n timeout,\n current: this.timeframe,\n target: this.targetTimeframe,\n });\n\n this._reachedTargetPromise ??= Promise.race([\n this._timeframeClock.update.waitForCondition(() => {\n return Timeframe.dependencies(this.targetTimeframe, this.timeframe).isEmpty();\n }),\n ...(breakOnStall ? [this.stalled.discardParameter().waitForCount(1)] : []),\n ]);\n\n let done = false;\n\n if (timeout) {\n return Promise.race([\n rejectOnDispose(ctx),\n rejectOnDispose(this._ctx),\n this._reachedTargetPromise.then(() => {\n done = true;\n }),\n sleep(timeout).then(() => {\n if (done) {\n return;\n }\n\n log.warn('waitUntilReachedTargetTimeframe timed out', {\n timeout,\n current: this.timeframe,\n target: this.targetTimeframe,\n dependencies: Timeframe.dependencies(this.targetTimeframe, this.timeframe),\n });\n }),\n ]);\n } else {\n return this._reachedTargetPromise;\n }\n }\n}\n\nexport interface PipelineAccessor {\n state: PipelineState;\n writer: FeedWriter<FeedMessage.Payload>;\n}\n\n/**\n * A multi-reader pipeline that operates on feeds.\n * Might have a single writable feed.\n * Has a timeframe clock to handle message ordering.\n *\n * NOTE:\n * - Feeds passed in must have value encoding consistent with the type expected by the iterator/writer.\n *\n * # Usage examples\n *\n * ## Create a new space.\n *\n * 1. Generate space key, genesis feed key.\n * 2. Create and open pipeline reading from {}.\n * 3. Create and add the writable genesis feed.\n * 4. Write the initial sequence of control and credential messages.\n *\n * ## Load an existing space from storage\n *\n * 1. Load space key, genesis feed key, get starting timeframe from saved snapshot.\n * 2. Create and open pipeline reading from the initial timeframe.\n * 3. Open and add the genesis feed.\n * 4. Once the writable feed is added, the pipeline becomes writable.\n *\n * ## Join an existing space created by another agent/device.\n *\n * 1. Get the space key, genesis feed key from another agent.\n * 2. (optionally) Download the snapshot from another agent.\n * 3. Create and open pipeline.\n * 4. Generate the writable feed key.\n * 5. Wait for the writable feed to be added.\n */\nexport class Pipeline implements PipelineAccessor {\n private readonly _timeframeClock = new TimeframeClock(new Timeframe());\n private readonly _feeds = new ComplexMap<PublicKey, FeedWrapper<FeedMessage>>(PublicKey.hash);\n\n // Inbound feed stream.\n private _feedSetIterator?: FeedSetIterator<FeedMessage>;\n\n // External state accessor.\n private readonly _state: PipelineState = new PipelineState(this._feeds, this._timeframeClock);\n\n // Waits for the message consumer to process the message and yield control back to the pipeline.\n private readonly _processingTrigger = new Trigger().wake();\n private readonly _pauseTrigger = new Trigger().wake();\n\n private _isStopping = false;\n private _isStarted = false;\n private _isOpen = false;\n private _isPaused = false;\n\n // Outbound feed writer.\n private _writer: FeedWriter<FeedMessage.Payload> | undefined;\n\n get state() {\n return this._state;\n }\n\n get writer(): FeedWriter<FeedMessage.Payload> {\n invariant(this._writer, 'Writer not set.');\n return this._writer;\n }\n\n hasFeed(feedKey: PublicKey) {\n return this._feeds.has(feedKey);\n }\n\n getFeeds(): FeedWrapper<FeedMessage>[] {\n return this._feedSetIterator!.feeds;\n }\n\n // NOTE: This cannot be synchronized with `stop` because stop waits for the mutation processing to complete,\n // which might be opening feeds during the mutation processing, which w\n async addFeed(feed: FeedWrapper<FeedMessage>) {\n this._feeds.set(feed.key, feed);\n if (this._feedSetIterator) {\n await this._feedSetIterator.addFeed(feed);\n }\n this._setFeedDownloadState(feed);\n }\n\n setWriteFeed(feed: FeedWrapper<FeedMessage>) {\n invariant(!this._writer, 'Writer already set.');\n invariant(feed.properties.writable, 'Feed must be writable.');\n\n this._writer = createMappedFeedWriter<FeedMessage.Payload, FeedMessage>(\n (payload: FeedMessage.Payload) => ({\n timeframe: this._timeframeClock.timeframe,\n payload,\n }),\n feed.createFeedWriter(),\n );\n }\n\n @synchronized\n async start() {\n invariant(!this._isStarted, 'Pipeline is already started.');\n log('starting...');\n await this._initIterator();\n await this._feedSetIterator!.open();\n this._isStarted = true;\n log('started');\n }\n\n @synchronized\n async stop() {\n log('stopping...');\n this._isStopping = true;\n await this._feedSetIterator?.close();\n await this._processingTrigger.wait(); // Wait for the in-flight message to be processed.\n await this._state._ctx.dispose();\n this._state._ctx = new Context();\n this._state._reachedTargetPromise = undefined;\n this._isStarted = false;\n log('stopped');\n }\n\n /**\n * @param timeframe Timeframe of already processed messages.\n * The pipeline will start processing messages AFTER this timeframe.\n */\n @synchronized\n async setCursor(timeframe: Timeframe) {\n invariant(!this._isStarted || this._isPaused, 'Invalid state.');\n\n this._state._startTimeframe = timeframe;\n this._timeframeClock.setTimeframe(timeframe);\n\n // Cancel downloads of mutations before the cursor.\n for (const feed of this._feeds.values()) {\n this._setFeedDownloadState(feed);\n }\n\n if (this._feedSetIterator) {\n await this._feedSetIterator.close();\n await this._initIterator();\n await this._feedSetIterator.open();\n }\n }\n\n /**\n * Calling pause while processing will cause a deadlock.\n */\n @synchronized\n async pause() {\n invariant(this._isStarted, 'Pipeline is not open.');\n if (this._isPaused) {\n return;\n }\n\n this._pauseTrigger.reset();\n await this._processingTrigger.wait();\n this._isPaused = true;\n }\n\n @synchronized\n async unpause() {\n invariant(this._isStarted, 'Pipeline is not open.');\n invariant(this._isPaused, 'Pipeline is not paused.');\n\n this._pauseTrigger.wake();\n this._isPaused = false;\n }\n\n /**\n * Starts to iterate over the ordered messages from the added feeds.\n * Updates the timeframe clock after the message has bee processed.\n */\n async *consume(): AsyncIterable<FeedMessageBlock> {\n invariant(!this._isOpen, 'Pipeline is already being consumed.');\n this._isOpen = true;\n\n invariant(this._feedSetIterator, 'Iterator not initialized.');\n let lastFeedSetIterator = this._feedSetIterator;\n let iterable = lastFeedSetIterator[Symbol.asyncIterator]();\n\n while (!this._isStopping) {\n await this._pauseTrigger.wait();\n\n // Iterator might have been changed while we were waiting for the processing to complete.\n if (lastFeedSetIterator !== this._feedSetIterator) {\n invariant(this._feedSetIterator, 'Iterator not initialized.');\n lastFeedSetIterator = this._feedSetIterator;\n iterable = lastFeedSetIterator[Symbol.asyncIterator]();\n }\n\n // Will be canceled when the iterator gets closed.\n const { done, value } = await iterable.next();\n if (!done) {\n const block = value ?? failUndefined();\n this._processingTrigger.reset();\n this._timeframeClock.updatePendingTimeframe(PublicKey.from(block.feedKey), block.seq);\n yield block;\n this._processingTrigger.wake();\n this._timeframeClock.updateTimeframe();\n }\n }\n\n // TODO(burdon): Test re-entrant?\n this._isOpen = false;\n }\n\n private _setFeedDownloadState(feed: FeedWrapper<FeedMessage>) {\n const timeframe = this._state._startTimeframe;\n const seq = timeframe.get(feed.key) ?? 0;\n\n feed.undownload({ callback: () => log('undownload') });\n feed.download({ start: seq + 1, linear: true }).catch((err: Error) => {\n log('failed to download feed', { err });\n });\n }\n\n private async _initIterator() {\n this._feedSetIterator = new FeedSetIterator<FeedMessage>(createMessageSelector(this._timeframeClock), {\n start: startAfter(this._timeframeClock.timeframe),\n stallTimeout: 1000,\n });\n\n this._feedSetIterator.stalled.on((iterator) => {\n log.warn(`Stalled after ${iterator.options.stallTimeout}ms with ${iterator.size} feeds.`);\n this._state.stalled.emit();\n });\n\n for (const feed of this._feeds.values()) {\n await this._feedSetIterator.addFeed(feed);\n }\n }\n}\n", "//\n// Copyright 2020 DXOS.org\n//\n\nimport { FeedBlock, FeedBlockSelector } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { TimeframeClock } from './timeframe-clock';\n\n/**\n * The MessageSelector makes sure that we read in a trusted order.\n * The first message we wish to process is the SpaceGenesis, which will admit a Feed.\n * As we encounter and process FeedAdmit messages those are added to the Space's trust,\n * and we begin processing messages from them as well.\n */\nexport const createMessageSelector = (timeframeClock: TimeframeClock): FeedBlockSelector<FeedMessage> => {\n return (messages: FeedBlock<FeedMessage>[]) => {\n // Pick the first candidate with a valid timeframe that has no gaps.\n for (let i = 0; i < messages.length; i++) {\n const {\n data: { timeframe },\n } = messages[i];\n invariant(timeframe);\n\n if (!timeframeClock.hasGaps(timeframe)) {\n return i;\n }\n }\n\n // Not ready for this message yet.\n log('Skipping...');\n };\n};\n", "//\n// Copyright 2019 DXOS.org\n//\n\nimport { runInContext, scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { randomBytes } from '@dxos/crypto';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { AuthService } from '@dxos/protocols/proto/dxos/mesh/teleport/auth';\nimport { ExtensionContext, RpcExtension } from '@dxos/teleport';\n\nexport type AuthProvider = (nonce: Uint8Array) => Promise<Uint8Array | undefined>;\n\nexport type AuthVerifier = (nonce: Uint8Array, credential: Uint8Array) => Promise<boolean>;\n\nexport type AuthExtensionParams = {\n provider: AuthProvider;\n verifier: AuthVerifier;\n onAuthSuccess: () => void;\n onAuthFailure: () => void;\n};\n\nexport class AuthExtension extends RpcExtension<Services, Services> {\n private readonly _ctx = new Context({\n onError: (err) => {\n log.catch(err);\n },\n });\n\n constructor(private readonly _authParams: AuthExtensionParams) {\n super({\n requested: {\n AuthService: schema.getService('dxos.mesh.teleport.auth.AuthService'),\n },\n exposed: {\n AuthService: schema.getService('dxos.mesh.teleport.auth.AuthService'),\n },\n timeout: 60 * 1000, // Long timeout because auth can wait for sync in certain cases.\n });\n }\n\n protected async getHandlers(): Promise<Services> {\n return {\n AuthService: {\n authenticate: async ({ challenge }) => {\n try {\n const credential = await this._authParams.provider(challenge);\n if (!credential) {\n throw new Error('auth rejected');\n }\n return { credential };\n } catch (err) {\n log.error('failed to generate auth credentials', err);\n throw new Error('auth rejected');\n }\n },\n },\n };\n }\n\n override async onOpen(context: ExtensionContext): Promise<void> {\n await super.onOpen(context);\n scheduleTask(this._ctx, async () => {\n try {\n const challenge = randomBytes(32);\n const { credential } = await this.rpc.AuthService.authenticate({ challenge });\n invariant(credential?.length > 0, 'invalid credential');\n const success = await this._authParams.verifier(challenge, credential);\n invariant(success, 'credential not verified');\n runInContext(this._ctx, () => this._authParams.onAuthSuccess());\n } catch (err) {\n log('auth failed', err);\n this.close();\n this._authParams.onAuthFailure();\n }\n });\n }\n\n override async onClose(): Promise<void> {\n await this._ctx.dispose();\n await super.onClose();\n }\n}\n\ntype Services = { AuthService: AuthService };\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, scheduleTask, synchronized, trackLeaks } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { CredentialProcessor, FeedInfo, SpecificCredential, checkCredentialType } from '@dxos/credentials';\nimport { getStateMachineFromItem, ItemManager } from '@dxos/echo-db';\nimport { CancelledError } from '@dxos/errors';\nimport { FeedWriter } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { DataPipelineProcessed } from '@dxos/protocols';\nimport { DataMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { ObjectSnapshot } from '@dxos/protocols/proto/dxos/echo/model/document';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { Credential, Epoch } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { tracer } from '@dxos/util';\n\nimport { DatabaseHost, SnapshotManager } from '../db-host';\nimport { MetadataStore } from '../metadata';\nimport { Pipeline } from '../pipeline';\n\nexport interface PipelineFactory {\n openPipeline: (start: Timeframe) => Promise<Pipeline>;\n}\n\nexport type DataPipelineParams = {\n modelFactory: ModelFactory;\n snapshotManager: SnapshotManager;\n metadataStore: MetadataStore;\n memberKey: PublicKey;\n spaceKey: PublicKey;\n feedInfoProvider: (feedKey: PublicKey) => FeedInfo | undefined;\n snapshotId: string | undefined;\n\n /**\n * Called once.\n */\n onPipelineCreated: (pipeline: Pipeline) => Promise<void>;\n};\n\n/**\n * Number of mutations since the last snapshot before we automatically create another snapshot.\n */\nconst MESSAGES_PER_SNAPSHOT = 10;\n\n/**\n * Minimum time between automatic snapshots.\n */\nconst AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL = 5000;\n\n/**\n * Minimum time in MS between recording latest timeframe in metadata.\n */\nconst TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;\n\n/**\n * Controls data pipeline in the space.\n * Consumes the pipeline and updates the database.\n * Reacts to new epochs to restart the pipeline.\n */\n@trackLeaks('open', 'close')\nexport class DataPipeline implements CredentialProcessor {\n private _ctx = new Context();\n private _pipeline?: Pipeline = undefined;\n private _targetTimeframe?: Timeframe = undefined;\n\n private _lastAutomaticSnapshotTimeframe = new Timeframe();\n private _isOpen = false;\n\n private _lastTimeframeSaveTime = 0;\n private _lastSnapshotSaveTime = 0;\n private _lastProcessedEpoch = -1;\n private _epochCtx?: Context;\n\n constructor(private readonly _params: DataPipelineParams) {}\n\n public itemManager!: ItemManager;\n public databaseHost?: DatabaseHost;\n\n /**\n * Current epoch. Might be still processing.\n */\n public currentEpoch?: SpecificCredential<Epoch> = undefined;\n\n /**\n * Epoch currently applied.\n */\n public appliedEpoch?: SpecificCredential<Epoch> = undefined;\n\n public readonly onNewEpoch = new Event<Credential>();\n\n get isOpen() {\n return this._isOpen;\n }\n\n get pipeline() {\n return this._pipeline;\n }\n\n get pipelineState() {\n return this._pipeline?.state;\n }\n\n setTargetTimeframe(timeframe: Timeframe) {\n this._targetTimeframe = timeframe;\n this._pipeline?.state.setTargetTimeframe(timeframe);\n }\n\n async processCredential(credential: Credential) {\n if (!checkCredentialType(credential, 'dxos.halo.credentials.Epoch')) {\n return;\n }\n\n this.currentEpoch = credential;\n if (this._isOpen) {\n // process epoch\n await this._processEpochInSeparateTask(credential);\n }\n }\n\n @synchronized\n async open() {\n if (this._isOpen) {\n return;\n }\n\n this._pipeline = new Pipeline();\n await this._params.onPipelineCreated(this._pipeline);\n await this._pipeline.start();\n await this._pipeline.pause(); // Start paused until we have the first epoch.\n\n if (this._targetTimeframe) {\n this._pipeline.state.setTargetTimeframe(this._targetTimeframe);\n }\n\n // Create database backend.\n const feedWriter: FeedWriter<DataMessage> = {\n write: (data, options) => {\n invariant(this._pipeline, 'Pipeline is not initialized.');\n invariant(this.currentEpoch, 'Epoch is not initialized.');\n return this._pipeline.writer.write({ data }, options);\n },\n };\n\n this.databaseHost = new DatabaseHost(feedWriter);\n this.itemManager = new ItemManager(this._params.modelFactory);\n\n // Connect pipeline to the database.\n await this.databaseHost.open(this.itemManager, this._params.modelFactory);\n\n // Start message processing loop.\n scheduleTask(this._ctx, async () => {\n await this._consumePipeline();\n });\n\n this._isOpen = true;\n }\n\n @synchronized\n async close() {\n if (!this._isOpen) {\n return;\n }\n log('close');\n this._isOpen = false;\n\n await this._ctx.dispose();\n await this._pipeline?.stop();\n\n // NOTE: Make sure the processing is stopped BEFORE we save the snapshot.\n try {\n await this._saveCache();\n if (this._pipeline) {\n await this._saveTargetTimeframe(this._pipeline.state.timeframe);\n }\n } catch (err) {\n log.catch(err);\n }\n\n await this.databaseHost?.close();\n await this.itemManager?.destroy();\n\n this._ctx = new Context();\n this._pipeline = undefined;\n this._targetTimeframe = undefined;\n this._lastAutomaticSnapshotTimeframe = new Timeframe();\n this.currentEpoch = undefined;\n this.appliedEpoch = undefined;\n this._lastProcessedEpoch = -1;\n this._epochCtx = undefined;\n }\n\n private async _consumePipeline() {\n if (this.currentEpoch) {\n const waitForOneEpoch = this.onNewEpoch.waitForCount(1);\n await this._processEpochInSeparateTask(this.currentEpoch);\n await waitForOneEpoch;\n }\n\n invariant(this._pipeline, 'Pipeline is not initialized.');\n for await (const msg of this._pipeline.consume()) {\n const { feedKey, seq, data } = msg;\n log('processing message', { feedKey, seq });\n\n try {\n if (data.payload.data) {\n const feedInfo = this._params.feedInfoProvider(feedKey);\n if (!feedInfo) {\n log.warn('Could not find feed', { feedKey });\n continue;\n }\n\n const timer = tracer.mark('dxos.echo.pipeline.data'); // TODO(burdon): Add ID to params to filter.\n this.databaseHost!.echoProcessor({\n batch: data.payload.data.batch,\n meta: {\n feedKey,\n seq,\n timeframe: data.timeframe,\n memberKey: feedInfo.assertion.identityKey,\n },\n });\n\n timer.end();\n // TODO(burdon): Reconcile different tracer approaches.\n log.trace('dxos.echo.data-pipeline.processed', {\n feedKey: feedKey.toHex(), // TODO(burdon): Need to flatten?\n seq,\n spaceKey: this._params.spaceKey.toHex(),\n } satisfies DataPipelineProcessed);\n\n // Timeframe clock is not updated yet.\n await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);\n }\n } catch (err: any) {\n log.catch(err);\n }\n }\n }\n\n private _createSnapshot(): SpaceSnapshot {\n invariant(this.databaseHost, 'Database backend is not initialized.');\n return {\n spaceKey: this._params.spaceKey.asUint8Array(),\n timeframe: this._pipeline!.state.timeframe,\n database: this.databaseHost!.createSnapshot(),\n };\n }\n\n private async _saveTargetTimeframe(timeframe: Timeframe) {\n const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);\n await this._params.metadataStore.setSpaceDataLatestTimeframe(this._params.spaceKey, newTimeframe);\n this._targetTimeframe = newTimeframe;\n }\n\n private async _saveCache() {\n const cache: SpaceCache = {};\n\n try {\n // Add properties to cache.\n const propertiesItem = this.itemManager.items.find(\n (item) =>\n item.modelMeta?.type === 'dxos:model/document' &&\n // TODO(burdon): Document?\n (getStateMachineFromItem(item)?.snapshot() as ObjectSnapshot).type === 'dxos.sdk.client.Properties',\n );\n if (propertiesItem) {\n cache.properties = getStateMachineFromItem(propertiesItem)?.snapshot() as ObjectSnapshot;\n }\n } catch (err) {\n log.warn('Failed to cache properties', err);\n }\n\n // Save cache.\n await this._params.metadataStore.setCache(this._params.spaceKey, cache);\n }\n\n private async _noteTargetStateIfNeeded(timeframe: Timeframe) {\n // TODO(dmaretskyi): Replace this with a proper debounce/throttle.\n\n if (Date.now() - this._lastTimeframeSaveTime > TIMEFRAME_SAVE_DEBOUNCE_INTERVAL) {\n this._lastTimeframeSaveTime = Date.now();\n\n await this._saveTargetTimeframe(timeframe);\n }\n\n if (\n Date.now() - this._lastSnapshotSaveTime > AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL &&\n timeframe.totalMessages() - this._lastAutomaticSnapshotTimeframe.totalMessages() > MESSAGES_PER_SNAPSHOT\n ) {\n await this._saveCache();\n }\n }\n\n private async _processEpochInSeparateTask(epoch: SpecificCredential<Epoch>) {\n if (epoch.subject.assertion.number <= this._lastProcessedEpoch) {\n return;\n }\n await this._epochCtx?.dispose();\n const ctx = new Context({\n onError: (err) => {\n if (err instanceof CancelledError) {\n log('Epoch processing cancelled.');\n } else {\n log.catch(err);\n }\n },\n });\n this._epochCtx = ctx;\n scheduleTask(ctx, async () => {\n if (!this._isOpen) {\n // Space closed before we got to process the epoch.\n return;\n }\n log('process epoch', { epoch });\n await this._processEpoch(ctx, epoch.subject.assertion);\n\n this.appliedEpoch = epoch;\n this.onNewEpoch.emit(epoch);\n });\n }\n\n @synchronized\n private async _processEpoch(ctx: Context, epoch: Epoch) {\n invariant(this._isOpen, 'Space is closed.');\n invariant(this._pipeline);\n this._lastProcessedEpoch = epoch.number;\n\n log('Processing epoch', { epoch });\n if (epoch.snapshotCid) {\n const snapshot = await this._params.snapshotManager.load(ctx, epoch.snapshotCid);\n\n // TODO(dmaretskyi): Clearing old items + events.\n this.databaseHost!._itemDemuxer.restoreFromSnapshot(snapshot.database);\n }\n\n log('restarting pipeline for epoch');\n\n await this._pipeline.pause();\n await this._pipeline.setCursor(epoch.timeframe);\n await this._pipeline.unpause();\n }\n\n async waitUntilTimeframe(timeframe: Timeframe) {\n invariant(this._pipeline, 'Pipeline is not initialized.');\n await this._pipeline.state.waitUntilTimeframe(timeframe);\n }\n\n @synchronized\n async createEpoch(): Promise<Epoch> {\n invariant(this._pipeline);\n invariant(this.currentEpoch);\n\n await this._pipeline.pause();\n\n const snapshot = await this._createSnapshot();\n const snapshotCid = await this._params.snapshotManager.store(snapshot);\n\n const epoch: Epoch = {\n previousId: this.currentEpoch.id,\n timeframe: this._pipeline.state.timeframe,\n number: (this.currentEpoch.subject.assertion as Epoch).number + 1,\n snapshotCid,\n };\n\n await this._pipeline.unpause();\n\n return epoch;\n }\n\n async ensureEpochInitialized() {\n await this.onNewEpoch.waitForCondition(() => !!this.currentEpoch);\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event, synchronized, trackLeaks, Lock } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { FeedInfo } from '@dxos/credentials';\nimport { FeedOptions, FeedWrapper } from '@dxos/feed-store';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { trace } from '@dxos/tracing';\nimport { AsyncCallback, Callback } from '@dxos/util';\n\nimport { SnapshotManager } from '../db-host';\nimport { MetadataStore } from '../metadata';\nimport { PipelineAccessor } from '../pipeline';\nimport { ControlPipeline } from './control-pipeline';\nimport { DataPipeline } from './data-pipeline';\nimport { SpaceProtocol } from './space-protocol';\n\n// TODO(burdon): Factor out?\ntype FeedProvider = (feedKey: PublicKey, opts?: FeedOptions) => Promise<FeedWrapper<FeedMessage>>;\n\nexport type SpaceParams = {\n spaceKey: PublicKey;\n protocol: SpaceProtocol;\n genesisFeed: FeedWrapper<FeedMessage>;\n feedProvider: FeedProvider;\n modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n snapshotManager: SnapshotManager;\n memberKey: PublicKey;\n\n // TODO(dmaretskyi): Superseded by epochs.\n snapshotId?: string | undefined;\n};\n\nexport type CreatePipelineParams = {\n start: Timeframe;\n // designation: AdmittedFeed.Designation;\n};\n\n/**\n * Spaces are globally addressable databases with access control.\n */\n// TODO(dmaretskyi): Extract database stuff.\n@trackLeaks('open', 'close')\n@trace.resource()\nexport class Space {\n private readonly _addFeedLock = new Lock();\n\n public readonly onCredentialProcessed = new Callback<AsyncCallback<Credential>>();\n public readonly stateUpdate = new Event();\n public readonly protocol: SpaceProtocol;\n\n private readonly _key: PublicKey;\n private readonly _genesisFeedKey: PublicKey;\n private readonly _feedProvider: FeedProvider;\n private readonly _controlPipeline: ControlPipeline;\n private readonly _dataPipeline: DataPipeline;\n private readonly _snapshotManager: SnapshotManager;\n\n private _isOpen = false;\n private _controlFeed?: FeedWrapper<FeedMessage>;\n private _dataFeed?: FeedWrapper<FeedMessage>;\n\n constructor(params: SpaceParams) {\n invariant(params.spaceKey && params.feedProvider);\n this._key = params.spaceKey;\n this._genesisFeedKey = params.genesisFeed.key;\n this._feedProvider = params.feedProvider;\n this._snapshotManager = params.snapshotManager;\n\n this._controlPipeline = new ControlPipeline({\n spaceKey: params.spaceKey,\n genesisFeed: params.genesisFeed,\n feedProvider: params.feedProvider,\n metadataStore: params.metadataStore,\n });\n\n // TODO(dmaretskyi): Feed set abstraction.\n this._controlPipeline.onFeedAdmitted.set(async (info) => {\n // Enable sparse replication to not download mutations covered by prior epochs.\n const sparse = info.assertion.designation === AdmittedFeed.Designation.DATA;\n\n if (info.assertion.designation === AdmittedFeed.Designation.DATA) {\n // We will add all existing data feeds when the data pipeline is initialized.\n await this._addFeedLock.executeSynchronized(async () => {\n if (this._dataPipeline.pipeline) {\n if (!this._dataPipeline.pipeline.hasFeed(info.key)) {\n return this._dataPipeline.pipeline.addFeed(await this._feedProvider(info.key, { sparse }));\n }\n }\n });\n }\n\n if (!info.key.equals(params.genesisFeed.key)) {\n this.protocol.addFeed(await params.feedProvider(info.key, { sparse }));\n }\n });\n\n this._controlPipeline.onCredentialProcessed.set(async (credential) => {\n await this.onCredentialProcessed.callIfSet(credential);\n log('onCredentialProcessed', { credential });\n this.stateUpdate.emit();\n });\n\n // Start replicating the genesis feed.\n this.protocol = params.protocol;\n this.protocol.addFeed(params.genesisFeed);\n\n this._dataPipeline = new DataPipeline({\n modelFactory: params.modelFactory,\n metadataStore: params.metadataStore,\n snapshotManager: params.snapshotManager,\n memberKey: params.memberKey,\n spaceKey: this._key,\n feedInfoProvider: (feedKey) => this._controlPipeline.spaceState.feeds.get(feedKey),\n snapshotId: params.snapshotId,\n onPipelineCreated: async (pipeline) => {\n if (this._dataFeed) {\n pipeline.setWriteFeed(this._dataFeed);\n }\n\n // Add existing feeds.\n await this._addFeedLock.executeSynchronized(async () => {\n for (const feed of this._controlPipeline.spaceState.feeds.values()) {\n if (feed.assertion.designation === AdmittedFeed.Designation.DATA && !pipeline.hasFeed(feed.key)) {\n await pipeline.addFeed(await this._feedProvider(feed.key, { sparse: true }));\n }\n }\n });\n },\n });\n }\n\n @logInfo\n get key() {\n return this._key;\n }\n\n get isOpen() {\n return this._isOpen;\n }\n\n get genesisFeedKey(): PublicKey {\n return this._genesisFeedKey;\n }\n\n get controlFeedKey() {\n return this._controlFeed?.key;\n }\n\n get dataFeedKey() {\n return this._dataFeed?.key;\n }\n\n get spaceState() {\n return this._controlPipeline.spaceState;\n }\n\n /**\n * @test-only\n */\n get controlPipeline(): PipelineAccessor {\n return this._controlPipeline.pipeline;\n }\n\n get dataPipeline(): DataPipeline {\n return this._dataPipeline;\n }\n\n get snapshotManager(): SnapshotManager {\n return this._snapshotManager;\n }\n\n setControlFeed(feed: FeedWrapper<FeedMessage>) {\n invariant(!this._controlFeed, 'Control feed already set.');\n this._controlFeed = feed;\n this._controlPipeline.setWriteFeed(feed);\n return this;\n }\n\n setDataFeed(feed: FeedWrapper<FeedMessage>) {\n invariant(!this._dataFeed, 'Data feed already set.');\n this._dataFeed = feed;\n this._dataPipeline.pipeline?.setWriteFeed(feed);\n return this;\n }\n\n /**\n * Use for diagnostics.\n */\n getControlFeeds(): FeedInfo[] {\n return Array.from(this._controlPipeline.spaceState.feeds.values());\n }\n\n /**\n * Use for diagnostics.\n */\n // getDataFeeds(): FeedInfo[] {\n // return this._dataPipeline?.getFeeds();\n // }\n @synchronized\n @trace.span()\n async open(ctx: Context) {\n log('opening...');\n if (this._isOpen) {\n return;\n }\n\n // Order is important.\n await this._controlPipeline.start();\n await this.protocol.start();\n await this._controlPipeline.spaceState.addCredentialProcessor(this._dataPipeline);\n\n this._isOpen = true;\n log('opened');\n }\n\n @synchronized\n async close() {\n log('closing...', { key: this._key });\n if (!this._isOpen) {\n return;\n }\n await this._controlPipeline.spaceState.removeCredentialProcessor(this._dataPipeline);\n\n await this._dataPipeline.close();\n\n // Closes in reverse order to open.\n await this.protocol.stop();\n await this._controlPipeline.stop();\n\n this._isOpen = false;\n log('closed');\n }\n\n @synchronized\n async initializeDataPipeline() {\n log('initializeDataPipeline');\n invariant(this._isOpen, 'Space must be open to initialize data pipeline.');\n await this._dataPipeline.open();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { SpaceStateMachine, SpaceState, MemberInfo, FeedInfo } from '@dxos/credentials';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { AdmittedFeed, Credential } from '@dxos/protocols/proto/dxos/halo/credentials';\nimport { Timeframe } from '@dxos/timeframe';\nimport { AsyncCallback, Callback, tracer } from '@dxos/util';\n\nimport { MetadataStore } from '../metadata';\nimport { Pipeline, PipelineAccessor } from '../pipeline';\n\nexport type ControlPipelineParams = {\n spaceKey: PublicKey;\n genesisFeed: FeedWrapper<FeedMessage>;\n feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;\n metadataStore: MetadataStore;\n};\n\nconst TIMEFRAME_SAVE_DEBOUNCE_INTERVAL = 500;\n\n/**\n * Processes HALO credentials, which include genesis and invitations.\n */\nexport class ControlPipeline {\n private readonly _pipeline: Pipeline;\n private readonly _spaceStateMachine: SpaceStateMachine;\n\n private readonly _spaceKey: PublicKey;\n private readonly _metadata: MetadataStore;\n private _targetTimeframe?: Timeframe;\n private _lastTimeframeSaveTime: number = Date.now();\n\n public readonly onFeedAdmitted = new Callback<AsyncCallback<FeedInfo>>();\n public readonly onMemberAdmitted: Callback<AsyncCallback<MemberInfo>>;\n public readonly onCredentialProcessed: Callback<AsyncCallback<Credential>>;\n\n constructor({ spaceKey, genesisFeed, feedProvider, metadataStore }: ControlPipelineParams) {\n this._spaceKey = spaceKey;\n this._metadata = metadataStore;\n this._pipeline = new Pipeline();\n void this._pipeline.addFeed(genesisFeed); // TODO(burdon): Require async open/close?\n\n this._spaceStateMachine = new SpaceStateMachine(spaceKey);\n this._spaceStateMachine.onFeedAdmitted.set(async (info) => {\n // log('feed admitted', { info });\n log('feed admitted', { key: info.key });\n\n // TODO(burdon): Check not stopping.\n if (info.assertion.designation === AdmittedFeed.Designation.CONTROL && !info.key.equals(genesisFeed.key)) {\n try {\n const feed = await feedProvider(info.key);\n await this._pipeline.addFeed(feed);\n } catch (err: any) {\n log.catch(err);\n }\n }\n\n await this.onFeedAdmitted.callIfSet(info);\n });\n\n this.onMemberAdmitted = this._spaceStateMachine.onMemberAdmitted;\n this.onCredentialProcessed = this._spaceStateMachine.onCredentialProcessed;\n }\n\n get spaceState(): SpaceState {\n return this._spaceStateMachine;\n }\n\n get pipeline(): PipelineAccessor {\n return this._pipeline;\n }\n\n setWriteFeed(feed: FeedWrapper<FeedMessage>) {\n this._pipeline.setWriteFeed(feed);\n }\n\n async start() {\n log('starting...');\n setTimeout(async () => {\n for await (const msg of this._pipeline.consume()) {\n try {\n // log('processing', { msg });\n log('processing', { key: msg.feedKey, seq: msg.seq });\n if (msg.data.payload.credential) {\n const timer = tracer.mark('dxos.echo.pipeline.control');\n const result = await this._spaceStateMachine.process(\n msg.data.payload.credential.credential,\n PublicKey.from(msg.feedKey),\n );\n\n timer.end();\n if (!result) {\n log.warn('processing failed', { msg });\n } else {\n await this._noteTargetStateIfNeeded(this._pipeline.state.pendingTimeframe);\n }\n }\n } catch (err: any) {\n log.catch(err);\n }\n }\n });\n\n await this._pipeline.start();\n log('started');\n }\n\n private async _noteTargetStateIfNeeded(timeframe: Timeframe) {\n // TODO(dmaretskyi): Replace this with a proper debounce/throttle.\n\n if (Date.now() - this._lastTimeframeSaveTime > TIMEFRAME_SAVE_DEBOUNCE_INTERVAL) {\n this._lastTimeframeSaveTime = Date.now();\n\n await this._saveTargetTimeframe(timeframe);\n }\n }\n\n async stop() {\n log('stopping...');\n await this._pipeline.stop();\n await this._saveTargetTimeframe(this._pipeline.state.timeframe);\n log('stopped');\n }\n\n private async _saveTargetTimeframe(timeframe: Timeframe) {\n try {\n const newTimeframe = Timeframe.merge(this._targetTimeframe ?? new Timeframe(), timeframe);\n await this._metadata.setSpaceControlLatestTimeframe(this._spaceKey, newTimeframe);\n this._targetTimeframe = newTimeframe;\n } catch (err: any) {\n log(err);\n }\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { discoveryKey, subtleCrypto } from '@dxos/crypto';\nimport { FeedWrapper } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log, logInfo } from '@dxos/log';\nimport {\n MMSTTopology,\n NetworkManager,\n SwarmConnection,\n WireProtocol,\n WireProtocolParams,\n WireProtocolProvider,\n} from '@dxos/network-manager';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { MuxerStats, Teleport } from '@dxos/teleport';\nimport { BlobStore, BlobSync } from '@dxos/teleport-extension-object-sync';\nimport { ReplicatorExtension } from '@dxos/teleport-extension-replicator';\nimport { ComplexMap } from '@dxos/util';\n\nimport { AuthExtension, AuthProvider, AuthVerifier } from './auth';\n\nexport const MOCK_AUTH_PROVIDER: AuthProvider = async (nonce: Uint8Array) => Buffer.from('mock');\nexport const MOCK_AUTH_VERIFIER: AuthVerifier = async (nonce: Uint8Array, credential: Uint8Array) => true;\n\n// TODO(burdon): Reconcile with SigningContext (define types together).\nexport interface SwarmIdentity {\n peerKey: PublicKey;\n credentialProvider: AuthProvider;\n credentialAuthenticator: AuthVerifier;\n}\n\nexport type SpaceProtocolOptions = {\n topic: PublicKey; // TODO(burdon): Rename?\n swarmIdentity: SwarmIdentity;\n networkManager: NetworkManager;\n\n blobStore: BlobStore;\n\n /**\n * Called when new session is authenticated.\n * Additional extensions can be added here.\n */\n onSessionAuth?: (session: Teleport) => void;\n onAuthFailure?: (session: Teleport) => void;\n};\n\n/**\n * Manages Teleport protocol stream creation and joining swarms with replication and presence extensions.\n */\nexport class SpaceProtocol {\n private readonly _networkManager: NetworkManager;\n private readonly _swarmIdentity: SwarmIdentity;\n private readonly _onSessionAuth?: (session: Teleport) => void;\n private readonly _onAuthFailure?: (session: Teleport) => void;\n\n public readonly blobSync: BlobSync;\n\n @logInfo\n private readonly _topic: Promise<PublicKey>;\n\n private readonly _feeds = new Set<FeedWrapper<FeedMessage>>();\n private readonly _sessions = new ComplexMap<PublicKey, SpaceProtocolSession>(PublicKey.hash);\n\n private _connection?: SwarmConnection;\n\n get sessions(): ReadonlyMap<PublicKey, SpaceProtocolSession> {\n return this._sessions;\n }\n\n get feeds(): ReadonlySet<FeedWrapper<FeedMessage>> {\n return this._feeds;\n }\n\n @logInfo\n private get _ownPeerKey() {\n return this._swarmIdentity.peerKey;\n }\n\n constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure, blobStore }: SpaceProtocolOptions) {\n this._networkManager = networkManager;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\n this.blobSync = new BlobSync({ blobStore });\n\n this._topic = subtleCrypto.digest('SHA-256', topic.asBuffer()).then(discoveryKey).then(PublicKey.from);\n }\n\n // TODO(burdon): Create abstraction for Space (e.g., add keys and have provider).\n addFeed(feed: FeedWrapper<FeedMessage>) {\n log('addFeed', { key: feed.key });\n\n this._feeds.add(feed);\n for (const session of this._sessions.values()) {\n session.replicator.addFeed(feed);\n }\n }\n\n async start() {\n if (this._connection) {\n return;\n }\n\n // TODO(burdon): Document why empty buffer.\n const credentials = await this._swarmIdentity.credentialProvider(Buffer.from(''));\n\n // TODO(burdon): Move to config (with sensible defaults).\n const topologyConfig = {\n originateConnections: 4,\n maxPeers: 10,\n sampleSize: 20,\n };\n\n await this.blobSync.open();\n\n log('starting...');\n const topic = await this._topic;\n this._connection = await this._networkManager.joinSwarm({\n protocolProvider: this._createProtocolProvider(credentials),\n peerId: this._swarmIdentity.peerKey,\n topic,\n topology: new MMSTTopology(topologyConfig),\n label: `Protocol swarm: ${topic}`,\n });\n\n log('started');\n }\n\n async stop() {\n await this.blobSync.close();\n\n if (this._connection) {\n log('stopping...');\n await this._connection.close();\n log('stopped');\n }\n }\n\n private _createProtocolProvider(credentials: Uint8Array | undefined): WireProtocolProvider {\n return (wireParams) => {\n const session = new SpaceProtocolSession({\n wireParams,\n swarmIdentity: this._swarmIdentity,\n onSessionAuth: this._onSessionAuth,\n onAuthFailure: this._onAuthFailure,\n blobSync: this.blobSync,\n });\n this._sessions.set(wireParams.remotePeerId, session);\n\n for (const feed of this._feeds) {\n session.replicator.addFeed(feed);\n }\n\n return session;\n };\n }\n}\n\nexport type SpaceProtocolSessionParams = {\n wireParams: WireProtocolParams;\n swarmIdentity: SwarmIdentity;\n\n blobSync: BlobSync;\n\n /**\n * Called when new session is authenticated.\n * Additional extensions can be added here.\n */\n onSessionAuth?: (session: Teleport) => void;\n\n onAuthFailure?: (session: Teleport) => void;\n};\n\nexport enum AuthStatus {\n INITIAL = 'INITIAL',\n SUCCESS = 'SUCCESS',\n FAILURE = 'FAILURE',\n}\n\n// TODO(dmaretskyi): Move to a separate file.\n/**\n * Represents a single connection to a remote peer\n */\nexport class SpaceProtocolSession implements WireProtocol {\n @logInfo\n private readonly _wireParams: WireProtocolParams;\n\n private readonly _onSessionAuth?: (session: Teleport) => void;\n private readonly _onAuthFailure?: (session: Teleport) => void;\n private readonly _swarmIdentity: SwarmIdentity;\n private readonly _blobSync: BlobSync;\n\n private readonly _teleport: Teleport;\n\n // TODO(dmaretskyi): Start with upload=false when switching it on the fly works.\n public readonly replicator = new ReplicatorExtension().setOptions({ upload: true });\n\n private _authStatus = AuthStatus.INITIAL;\n\n @logInfo\n get authStatus() {\n return this._authStatus;\n }\n\n get stats(): Event<MuxerStats> {\n return this._teleport.stats;\n }\n\n // TODO(dmaretskyi): Allow to pass in extra extensions.\n constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure, blobSync }: SpaceProtocolSessionParams) {\n this._wireParams = wireParams;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\n this._blobSync = blobSync;\n\n this._teleport = new Teleport(wireParams);\n }\n\n get stream() {\n return this._teleport.stream;\n }\n\n async initialize(): Promise<void> {\n await this._teleport.open();\n this._teleport.addExtension(\n 'dxos.mesh.teleport.auth',\n new AuthExtension({\n provider: this._swarmIdentity.credentialProvider,\n verifier: this._swarmIdentity.credentialAuthenticator,\n onAuthSuccess: () => {\n log('Peer authenticated');\n this._authStatus = AuthStatus.SUCCESS;\n this._onSessionAuth?.(this._teleport);\n // TODO(dmaretskyi): Configure replicator to upload.\n },\n onAuthFailure: () => {\n this._authStatus = AuthStatus.FAILURE;\n this._onAuthFailure?.(this._teleport);\n },\n }),\n );\n this._teleport.addExtension('dxos.mesh.teleport.replicator', this.replicator);\n this._teleport.addExtension('dxos.mesh.teleport.blobsync', this._blobSync.createExtension());\n }\n\n async destroy(): Promise<void> {\n await this._teleport.close();\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { synchronized, trackLeaks } from '@dxos/async';\nimport { failUndefined } from '@dxos/debug';\nimport { FeedStore } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\nimport { NetworkManager } from '@dxos/network-manager';\nimport { trace } from '@dxos/protocols';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\nimport { SpaceMetadata } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Teleport } from '@dxos/teleport';\nimport { BlobStore } from '@dxos/teleport-extension-object-sync';\nimport { ComplexMap } from '@dxos/util';\n\nimport { SnapshotManager, SnapshotStore } from '../db-host';\nimport { MetadataStore } from '../metadata';\nimport { Space } from './space';\nimport { SpaceProtocol, SwarmIdentity } from './space-protocol';\n\nexport type SpaceManagerParams = {\n feedStore: FeedStore<FeedMessage>;\n networkManager: NetworkManager;\n modelFactory: ModelFactory;\n metadataStore: MetadataStore;\n\n /**\n * @deprecated Replaced by BlobStore.\n */\n snapshotStore: SnapshotStore;\n\n blobStore: BlobStore;\n};\n\nexport type ConstructSpaceParams = {\n metadata: SpaceMetadata;\n swarmIdentity: SwarmIdentity;\n memberKey: PublicKey;\n onNetworkConnection: (session: Teleport) => void;\n onAuthFailure?: (session: Teleport) => void;\n};\n\n/**\n * Manages a collection of ECHO (Data) Spaces.\n */\n@trackLeaks('open', 'close')\nexport class SpaceManager {\n private readonly _spaces = new ComplexMap<PublicKey, Space>(PublicKey.hash);\n private readonly _feedStore: FeedStore<FeedMessage>;\n private readonly _networkManager: NetworkManager;\n private readonly _modelFactory: ModelFactory;\n private readonly _metadataStore: MetadataStore;\n private readonly _snapshotStore: SnapshotStore;\n private readonly _blobStore: BlobStore;\n private readonly _instanceId = PublicKey.random().toHex();\n\n constructor({\n feedStore,\n networkManager,\n modelFactory,\n metadataStore,\n snapshotStore,\n blobStore,\n }: SpaceManagerParams) {\n // TODO(burdon): Assert.\n this._feedStore = feedStore;\n this._networkManager = networkManager;\n this._modelFactory = modelFactory;\n this._metadataStore = metadataStore;\n this._snapshotStore = snapshotStore;\n this._blobStore = blobStore;\n }\n\n // TODO(burdon): Remove.\n get spaces() {\n return this._spaces;\n }\n\n @synchronized\n async open() {}\n\n @synchronized\n async close() {\n await Promise.all([...this._spaces.values()].map((space) => space.close()));\n }\n\n async constructSpace({\n metadata,\n swarmIdentity,\n onNetworkConnection,\n onAuthFailure,\n memberKey,\n }: ConstructSpaceParams) {\n log.trace('dxos.echo.space-manager.construct-space', trace.begin({ id: this._instanceId }));\n log('constructing space...', { spaceKey: metadata.genesisFeedKey });\n\n // The genesis feed will be the same as the control feed if the space was created by the local agent.\n const genesisFeed = await this._feedStore.openFeed(metadata.genesisFeedKey ?? failUndefined());\n\n const spaceKey = metadata.key;\n const protocol = new SpaceProtocol({\n topic: spaceKey,\n swarmIdentity,\n networkManager: this._networkManager,\n onSessionAuth: onNetworkConnection,\n onAuthFailure,\n blobStore: this._blobStore,\n });\n const snapshotManager = new SnapshotManager(this._snapshotStore, this._blobStore, protocol.blobSync);\n\n const space = new Space({\n spaceKey,\n protocol,\n genesisFeed,\n feedProvider: (feedKey, opts) => this._feedStore.openFeed(feedKey, opts),\n modelFactory: this._modelFactory,\n metadataStore: this._metadataStore,\n snapshotManager,\n memberKey,\n });\n this._spaces.set(space.key, space);\n log.trace('dxos.echo.space-manager.construct-space', trace.end({ id: this._instanceId }));\n return space;\n }\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["createCodecEncoding", "schema", "codec", "schema", "getCodecForType", "valueEncoding", "createCodecEncoding", "invariant", "createMappedFeedWriter", "mapper", "writer", "write", "data", "options", "Stream", "Context", "tagMutationsInBatch", "setMetadataOnObject", "invariant", "log", "ComplexMap", "DataServiceHost", "constructor", "_itemManager", "_itemDemuxer", "_writeStream", "_ctx", "_clientTagMap", "feedKey", "seq", "toHex", "open", "close", "dispose", "subscribe", "next", "ctx", "onDispose", "objects", "Array", "from", "entities", "values", "map", "entity", "createSnapshot", "batch", "mutation", "on", "message", "meta", "clientTag", "get", "forEach", "object", "write", "request", "disposed", "objectCount", "length", "createDataMessage", "receipt", "afterWrite", "set", "_a", "mutations", "undefined", "ItemDemuxer", "DatabaseHost", "constructor", "_outboundStream", "isReadOnly", "echoProcessor", "_echoProcessor", "open", "itemManager", "modelFactory", "_itemManager", "_debugLabel", "_itemDemuxer", "ItemDemuxer", "close", "getWriteStream", "createSnapshot", "createDataServiceHost", "DataServiceHost", "undefined", "trackLeaks", "cancelWithContext", "PublicKey", "schema", "BlobMeta", "SpaceSnapshot", "schema", "getCodecForType", "SnapshotManager", "constructor", "_snapshotStore", "_blobStore", "_blobSync", "_getBlob", "blobId", "blob", "get", "decode", "load", "ctx", "id", "PublicKey", "fromHex", "asUint8Array", "blobMeta", "getMeta", "state", "BlobMeta", "State", "FULLY_PRESENT", "fallbackStore", "cancelWithContext", "loadSnapshot", "download", "store", "snapshot", "set", "encode", "notifyBlobAdded", "from", "toHex", "trackLeaks", "subtleCrypto", "schema", "SpaceSnapshot", "schema", "getCodecForType", "SnapshotStore", "constructor", "_directory", "saveSnapshot", "snapshot", "encoded", "encode", "key", "subtleCrypto", "digest", "keyString", "Buffer", "from", "toString", "file", "getOrCreateFile", "write", "close", "loadSnapshot", "size", "stat", "undefined", "buffer", "read", "decode", "listSnapshots", "entries", "list", "Promise", "all", "map", "raise", "invariant", "PublicKey", "log", "ComplexMap", "DataServiceSubscriptions", "_spaces", "hash", "clear", "registerSpace", "spaceKey", "host", "has", "open", "set", "unregisterSpace", "get", "close", "delete", "getDataService", "DataServiceImpl", "constructor", "_subscriptions", "subscribe", "request", "Error", "write", "batch", "CRC32", "synchronized", "Event", "DataCorruptionError", "invariant", "log", "STORAGE_VERSION", "schema", "SpaceState", "arrayToBuffer", "emptyEchoMetadata", "version", "spaces", "created", "Date", "updated", "EchoMetadata", "getCodecForType", "MetadataStore", "constructor", "_directory", "_metadata", "update", "metadata", "load", "file", "getOrCreateFile", "size", "fileLength", "stat", "dataSize", "fromBytesInt32", "read", "checksum", "data", "calculatedChecksum", "buf", "decode", "forEach", "space", "_a", "state", "ACTIVE", "err", "error", "close", "_save", "emit", "encoded", "encode", "result", "Buffer", "alloc", "length", "writeInt32LE", "copy", "write", "_getSpace", "spaceKey", "identity", "haloSpace", "key", "equals", "find", "clear", "delete", "getIdentityRecord", "setIdentityRecord", "record", "addSpace", "push", "setSpaceDataLatestTimeframe", "timeframe", "dataTimeframe", "setSpaceControlLatestTimeframe", "controlTimeframe", "setCache", "cache", "setWritableFeedKeys", "controlFeedKey", "dataFeedKey", "setSpaceState", "readInt32LE", "Event", "timed", "log", "Timeframe", "mapTimeframeToFeedIndexes", "timeframe", "frames", "map", "feedKey", "index", "mapFeedIndexesToTimeframe", "indexes", "startAfter", "TimeframeClock", "constructor", "_timeframe", "update", "_pendingTimeframe", "pendingTimeframe", "setTimeframe", "emit", "updatePendingTimeframe", "key", "seq", "merge", "updateTimeframe", "hasGaps", "gaps", "dependencies", "isEmpty", "waitUntilReached", "target", "current", "waitForCondition", "deps", "Event", "sleep", "synchronized", "Trigger", "Context", "rejectOnDispose", "failUndefined", "FeedSetIterator", "invariant", "PublicKey", "log", "Timeframe", "ComplexMap", "invariant", "log", "createMessageSelector", "timeframeClock", "messages", "i", "length", "data", "timeframe", "hasGaps", "PipelineState", "constructor", "_feeds", "_timeframeClock", "_ctx", "Context", "timeframeUpdate", "update", "stalled", "Event", "_startTimeframe", "Timeframe", "endTimeframe", "mapFeedIndexesToTimeframe", "Array", "from", "values", "filter", "feed", "length", "map", "feedKey", "key", "index", "startTimeframe", "timeframe", "pendingTimeframe", "targetTimeframe", "_targetTimeframe", "feeds", "waitUntilTimeframe", "target", "waitUntilReached", "setTargetTimeframe", "waitUntilReachedTargetTimeframe", "ctx", "timeout", "breakOnStall", "log", "current", "_reachedTargetPromise", "Promise", "race", "waitForCondition", "dependencies", "isEmpty", "discardParameter", "waitForCount", "done", "rejectOnDispose", "then", "sleep", "warn", "Pipeline", "TimeframeClock", "ComplexMap", "PublicKey", "hash", "_state", "_processingTrigger", "Trigger", "wake", "_pauseTrigger", "_isStopping", "_isStarted", "_isOpen", "_isPaused", "state", "writer", "invariant", "_writer", "hasFeed", "has", "getFeeds", "_feedSetIterator", "addFeed", "set", "_setFeedDownloadState", "setWriteFeed", "properties", "writable", "createMappedFeedWriter", "payload", "createFeedWriter", "start", "_initIterator", "open", "stop", "close", "wait", "dispose", "undefined", "setCursor", "setTimeframe", "pause", "reset", "unpause", "consume", "lastFeedSetIterator", "iterable", "Symbol", "asyncIterator", "value", "next", "block", "failUndefined", "updatePendingTimeframe", "seq", "updateTimeframe", "get", "undownload", "callback", "download", "linear", "catch", "err", "FeedSetIterator", "createMessageSelector", "startAfter", "stallTimeout", "on", "iterator", "options", "size", "emit", "synchronized", "runInContext", "scheduleTask", "Context", "randomBytes", "invariant", "log", "schema", "RpcExtension", "AuthExtension", "constructor", "_authParams", "requested", "AuthService", "getService", "exposed", "timeout", "_ctx", "onError", "err", "catch", "getHandlers", "authenticate", "challenge", "credential", "provider", "Error", "error", "onOpen", "context", "rpc", "length", "success", "verifier", "onAuthSuccess", "close", "onAuthFailure", "onClose", "dispose", "Event", "scheduleTask", "synchronized", "trackLeaks", "Context", "checkCredentialType", "getStateMachineFromItem", "ItemManager", "CancelledError", "invariant", "log", "Timeframe", "tracer", "MESSAGES_PER_SNAPSHOT", "AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL", "TIMEFRAME_SAVE_DEBOUNCE_INTERVAL", "DataPipeline", "constructor", "_params", "_ctx", "Context", "_pipeline", "undefined", "_targetTimeframe", "_lastAutomaticSnapshotTimeframe", "Timeframe", "_isOpen", "_lastTimeframeSaveTime", "_lastSnapshotSaveTime", "_lastProcessedEpoch", "currentEpoch", "appliedEpoch", "onNewEpoch", "Event", "isOpen", "pipeline", "pipelineState", "state", "setTargetTimeframe", "timeframe", "processCredential", "credential", "checkCredentialType", "_processEpochInSeparateTask", "open", "Pipeline", "onPipelineCreated", "start", "pause", "feedWriter", "write", "data", "options", "invariant", "writer", "databaseHost", "DatabaseHost", "itemManager", "ItemManager", "modelFactory", "scheduleTask", "_consumePipeline", "close", "log", "dispose", "stop", "_saveCache", "_saveTargetTimeframe", "err", "catch", "destroy", "_epochCtx", "waitForOneEpoch", "waitForCount", "msg", "consume", "feedKey", "seq", "payload", "feedInfo", "feedInfoProvider", "warn", "timer", "tracer", "mark", "echoProcessor", "batch", "meta", "memberKey", "assertion", "identityKey", "end", "trace", "toHex", "spaceKey", "_noteTargetStateIfNeeded", "pendingTimeframe", "_createSnapshot", "asUint8Array", "database", "createSnapshot", "newTimeframe", "merge", "metadataStore", "setSpaceDataLatestTimeframe", "cache", "propertiesItem", "items", "find", "item", "_a", "modelMeta", "type", "getStateMachineFromItem", "snapshot", "properties", "setCache", "Date", "now", "totalMessages", "epoch", "subject", "number", "ctx", "onError", "CancelledError", "_processEpoch", "emit", "snapshotCid", "snapshotManager", "load", "_itemDemuxer", "restoreFromSnapshot", "setCursor", "unpause", "waitUntilTimeframe", "createEpoch", "store", "previousId", "id", "ensureEpochInitialized", "waitForCondition", "synchronized", "trackLeaks", "Event", "synchronized", "trackLeaks", "Lock", "invariant", "log", "logInfo", "AdmittedFeed", "trace", "Callback", "SpaceStateMachine", "PublicKey", "log", "AdmittedFeed", "Timeframe", "Callback", "tracer", "TIMEFRAME_SAVE_DEBOUNCE_INTERVAL", "ControlPipeline", "constructor", "spaceKey", "genesisFeed", "feedProvider", "metadataStore", "_lastTimeframeSaveTime", "Date", "now", "onFeedAdmitted", "Callback", "_spaceKey", "_metadata", "_pipeline", "Pipeline", "addFeed", "_spaceStateMachine", "SpaceStateMachine", "set", "info", "log", "key", "assertion", "designation", "AdmittedFeed", "Designation", "CONTROL", "equals", "feed", "err", "catch", "callIfSet", "onMemberAdmitted", "onCredentialProcessed", "spaceState", "pipeline", "setWriteFeed", "start", "setTimeout", "msg", "consume", "feedKey", "seq", "data", "payload", "credential", "timer", "tracer", "mark", "result", "process", "PublicKey", "from", "end", "warn", "_noteTargetStateIfNeeded", "state", "pendingTimeframe", "timeframe", "_saveTargetTimeframe", "stop", "newTimeframe", "Timeframe", "merge", "_targetTimeframe", "setSpaceControlLatestTimeframe", "Space", "constructor", "params", "_addFeedLock", "Lock", "onCredentialProcessed", "Callback", "stateUpdate", "Event", "_isOpen", "invariant", "spaceKey", "feedProvider", "_key", "_genesisFeedKey", "genesisFeed", "key", "_feedProvider", "_snapshotManager", "snapshotManager", "_controlPipeline", "ControlPipeline", "metadataStore", "onFeedAdmitted", "set", "info", "sparse", "assertion", "designation", "AdmittedFeed", "Designation", "DATA", "executeSynchronized", "_dataPipeline", "pipeline", "hasFeed", "addFeed", "equals", "protocol", "credential", "callIfSet", "log", "emit", "DataPipeline", "modelFactory", "memberKey", "feedInfoProvider", "feedKey", "spaceState", "feeds", "get", "snapshotId", "onPipelineCreated", "_dataFeed", "setWriteFeed", "feed", "values", "isOpen", "genesisFeedKey", "controlFeedKey", "_controlFeed", "dataFeedKey", "controlPipeline", "dataPipeline", "setControlFeed", "setDataFeed", "getControlFeeds", "Array", "from", "open", "ctx", "start", "addCredentialProcessor", "close", "removeCredentialProcessor", "stop", "initializeDataPipeline", "logInfo", "synchronized", "trace", "span", "trackLeaks", "resource", "discoveryKey", "subtleCrypto", "PublicKey", "log", "logInfo", "MMSTTopology", "Teleport", "BlobSync", "ReplicatorExtension", "ComplexMap", "MOCK_AUTH_PROVIDER", "nonce", "Buffer", "from", "MOCK_AUTH_VERIFIER", "credential", "SpaceProtocol", "constructor", "topic", "swarmIdentity", "networkManager", "onSessionAuth", "onAuthFailure", "blobStore", "_feeds", "Set", "_sessions", "ComplexMap", "PublicKey", "hash", "_networkManager", "_swarmIdentity", "_onSessionAuth", "_onAuthFailure", "blobSync", "BlobSync", "_topic", "subtleCrypto", "digest", "asBuffer", "then", "discoveryKey", "sessions", "feeds", "_ownPeerKey", "peerKey", "addFeed", "feed", "log", "key", "add", "session", "values", "replicator", "start", "_connection", "credentials", "credentialProvider", "topologyConfig", "originateConnections", "maxPeers", "sampleSize", "open", "joinSwarm", "protocolProvider", "_createProtocolProvider", "peerId", "topology", "MMSTTopology", "label", "stop", "close", "wireParams", "SpaceProtocolSession", "set", "remotePeerId", "logInfo", "AuthStatus", "INITIAL", "SUCCESS", "FAILURE", "ReplicatorExtension", "setOptions", "upload", "_authStatus", "_wireParams", "_blobSync", "_teleport", "Teleport", "authStatus", "stats", "stream", "initialize", "addExtension", "AuthExtension", "provider", "verifier", "credentialAuthenticator", "onAuthSuccess", "createExtension", "destroy", "synchronized", "trackLeaks", "failUndefined", "PublicKey", "log", "trace", "ComplexMap", "SpaceManager", "constructor", "feedStore", "networkManager", "modelFactory", "metadataStore", "snapshotStore", "blobStore", "_spaces", "ComplexMap", "PublicKey", "hash", "_instanceId", "random", "toHex", "_feedStore", "_networkManager", "_modelFactory", "_metadataStore", "_snapshotStore", "_blobStore", "spaces", "open", "close", "Promise", "all", "values", "map", "space", "constructSpace", "metadata", "swarmIdentity", "onNetworkConnection", "onAuthFailure", "memberKey", "log", "trace", "begin", "id", "spaceKey", "genesisFeedKey", "genesisFeed", "openFeed", "failUndefined", "key", "protocol", "SpaceProtocol", "topic", "onSessionAuth", "snapshotManager", "SnapshotManager", "blobSync", "Space", "feedProvider", "feedKey", "opts", "set", "end", "synchronized", "trackLeaks"]
|
|
7
|
+
}
|