@dxos/echo-pipeline 0.1.49-next.fdd6c88 → 0.1.50-main.cab6083
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-JEULF2QN.mjs → chunk-CSFWTLPD.mjs} +36 -28
- package/dist/lib/browser/chunk-CSFWTLPD.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 -3
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/node/index.cjs +25 -17
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +27 -19
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/metadata/metadata-store.d.ts +4 -1
- package/dist/types/src/metadata/metadata-store.d.ts.map +1 -1
- package/dist/types/src/space/data-pipeline.d.ts +2 -2
- package/dist/types/src/space/data-pipeline.d.ts.map +1 -1
- package/dist/types/src/space/space.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/metadata/metadata-store.ts +7 -1
- package/src/space/data-pipeline.ts +4 -5
- package/src/space/space.ts +3 -1
- package/src/testing/database-test-rig.ts +2 -2
- package/src/testing/util.ts +2 -2
- package/src/tests/database.test.ts +2 -2
- package/dist/lib/browser/chunk-JEULF2QN.mjs.map +0 -7
|
@@ -3,7 +3,7 @@ import "@dxos/node-std/globals"
|
|
|
3
3
|
// packages/core/echo/echo-pipeline/src/metadata/metadata-store.ts
|
|
4
4
|
import CRC32 from "crc-32";
|
|
5
5
|
import assert from "@dxos/node-std/assert";
|
|
6
|
-
import { synchronized } from "@dxos/async";
|
|
6
|
+
import { synchronized, Event } from "@dxos/async";
|
|
7
7
|
import { DataCorruptionError } from "@dxos/errors";
|
|
8
8
|
import { log } from "@dxos/log";
|
|
9
9
|
import { STORAGE_VERSION, schema } from "@dxos/protocols";
|
|
@@ -28,6 +28,10 @@ var MetadataStore = class {
|
|
|
28
28
|
constructor(_directory) {
|
|
29
29
|
this._directory = _directory;
|
|
30
30
|
this._metadata = emptyEchoMetadata();
|
|
31
|
+
this.update = new Event();
|
|
32
|
+
}
|
|
33
|
+
get metadata() {
|
|
34
|
+
return this._metadata;
|
|
31
35
|
}
|
|
32
36
|
get version() {
|
|
33
37
|
var _a;
|
|
@@ -58,7 +62,7 @@ var MetadataStore = class {
|
|
|
58
62
|
checksum
|
|
59
63
|
}, {
|
|
60
64
|
file: "metadata-store.ts",
|
|
61
|
-
line:
|
|
65
|
+
line: 68,
|
|
62
66
|
scope: this,
|
|
63
67
|
callSite: (f, a) => f(...a)
|
|
64
68
|
});
|
|
@@ -76,7 +80,7 @@ var MetadataStore = class {
|
|
|
76
80
|
err
|
|
77
81
|
}, {
|
|
78
82
|
file: "metadata-store.ts",
|
|
79
|
-
line:
|
|
83
|
+
line: 83,
|
|
80
84
|
scope: this,
|
|
81
85
|
callSite: (f, a) => f(...a)
|
|
82
86
|
});
|
|
@@ -93,6 +97,7 @@ var MetadataStore = class {
|
|
|
93
97
|
created: (_a = this._metadata.created) != null ? _a : new Date(),
|
|
94
98
|
updated: new Date()
|
|
95
99
|
};
|
|
100
|
+
this.update.emit(data);
|
|
96
101
|
const file = this._directory.getOrCreateFile("EchoMetadata");
|
|
97
102
|
try {
|
|
98
103
|
const encoded = Buffer.from(schema.getCodecForType("dxos.echo.metadata.EchoMetadata").encode(data));
|
|
@@ -107,7 +112,7 @@ var MetadataStore = class {
|
|
|
107
112
|
checksum
|
|
108
113
|
}, {
|
|
109
114
|
file: "metadata-store.ts",
|
|
110
|
-
line:
|
|
115
|
+
line: 115,
|
|
111
116
|
scope: this,
|
|
112
117
|
callSite: (f, a) => f(...a)
|
|
113
118
|
});
|
|
@@ -126,7 +131,7 @@ var MetadataStore = class {
|
|
|
126
131
|
async clear() {
|
|
127
132
|
log("clearing all metadata", {}, {
|
|
128
133
|
file: "metadata-store.ts",
|
|
129
|
-
line:
|
|
134
|
+
line: 131,
|
|
130
135
|
scope: this,
|
|
131
136
|
callSite: (f, a) => f(...a)
|
|
132
137
|
});
|
|
@@ -187,7 +192,7 @@ var createMappedFeedWriter = (mapper, writer) => {
|
|
|
187
192
|
};
|
|
188
193
|
|
|
189
194
|
// packages/core/echo/echo-pipeline/src/pipeline/timeframe-clock.ts
|
|
190
|
-
import { Event } from "@dxos/async";
|
|
195
|
+
import { Event as Event2 } from "@dxos/async";
|
|
191
196
|
import { timed } from "@dxos/debug";
|
|
192
197
|
import { log as log2 } from "@dxos/log";
|
|
193
198
|
import { Timeframe } from "@dxos/timeframe";
|
|
@@ -217,7 +222,7 @@ var TimeframeClock = class {
|
|
|
217
222
|
// prettier-ignore
|
|
218
223
|
constructor(_timeframe = new Timeframe()) {
|
|
219
224
|
this._timeframe = _timeframe;
|
|
220
|
-
this.update = new
|
|
225
|
+
this.update = new Event2();
|
|
221
226
|
this._pendingTimeframe = _timeframe;
|
|
222
227
|
}
|
|
223
228
|
/**
|
|
@@ -285,7 +290,7 @@ __decorate2([
|
|
|
285
290
|
|
|
286
291
|
// packages/core/echo/echo-pipeline/src/pipeline/pipeline.ts
|
|
287
292
|
import assert4 from "@dxos/node-std/assert";
|
|
288
|
-
import { Event as
|
|
293
|
+
import { Event as Event3, sleep, synchronized as synchronized2, Trigger } from "@dxos/async";
|
|
289
294
|
import { Context, rejectOnDispose } from "@dxos/context";
|
|
290
295
|
import { failUndefined } from "@dxos/debug";
|
|
291
296
|
import { FeedSetIterator } from "@dxos/feed-store";
|
|
@@ -328,7 +333,7 @@ var PipelineState = class {
|
|
|
328
333
|
this._feeds = _feeds;
|
|
329
334
|
this._timeframeClock = _timeframeClock;
|
|
330
335
|
this.timeframeUpdate = this._timeframeClock.update;
|
|
331
|
-
this.stalled = new
|
|
336
|
+
this.stalled = new Event3();
|
|
332
337
|
}
|
|
333
338
|
/**
|
|
334
339
|
* Latest theoretical timeframe based on the last mutation in each feed.
|
|
@@ -1008,9 +1013,9 @@ var DataServiceImpl = class {
|
|
|
1008
1013
|
|
|
1009
1014
|
// packages/core/echo/echo-pipeline/src/space/data-pipeline.ts
|
|
1010
1015
|
import assert8 from "@dxos/node-std/assert";
|
|
1011
|
-
import { Event as
|
|
1016
|
+
import { Event as Event4, scheduleTask as scheduleTask2, synchronized as synchronized3, trackLeaks as trackLeaks2 } from "@dxos/async";
|
|
1012
1017
|
import { Context as Context3 } from "@dxos/context";
|
|
1013
|
-
import {
|
|
1018
|
+
import { checkCredentialType } from "@dxos/credentials";
|
|
1014
1019
|
import { getStateMachineFromItem, ItemManager } from "@dxos/echo-db";
|
|
1015
1020
|
import { log as log9 } from "@dxos/log";
|
|
1016
1021
|
import { Timeframe as Timeframe3 } from "@dxos/timeframe";
|
|
@@ -1035,7 +1040,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1035
1040
|
this._isOpen = false;
|
|
1036
1041
|
this._lastTimeframeSaveTime = 0;
|
|
1037
1042
|
this._lastSnapshotSaveTime = 0;
|
|
1038
|
-
this.onNewEpoch = new
|
|
1043
|
+
this.onNewEpoch = new Event4();
|
|
1039
1044
|
}
|
|
1040
1045
|
get isOpen() {
|
|
1041
1046
|
return this._isOpen;
|
|
@@ -1055,19 +1060,18 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1055
1060
|
createCredentialProcessor() {
|
|
1056
1061
|
return {
|
|
1057
1062
|
process: async (credential) => {
|
|
1058
|
-
|
|
1059
|
-
if (assertion["@type"] !== "dxos.halo.credentials.Epoch") {
|
|
1063
|
+
if (!checkCredentialType(credential, "dxos.halo.credentials.Epoch")) {
|
|
1060
1064
|
return;
|
|
1061
1065
|
}
|
|
1062
1066
|
log9("new epoch", {
|
|
1063
1067
|
credential
|
|
1064
1068
|
}, {
|
|
1065
1069
|
file: "data-pipeline.ts",
|
|
1066
|
-
line:
|
|
1070
|
+
line: 109,
|
|
1067
1071
|
scope: this,
|
|
1068
1072
|
callSite: (f, a) => f(...a)
|
|
1069
1073
|
});
|
|
1070
|
-
await this._processEpoch(assertion);
|
|
1074
|
+
await this._processEpoch(credential.subject.assertion);
|
|
1071
1075
|
this.currentEpoch = credential;
|
|
1072
1076
|
this.onNewEpoch.emit(credential);
|
|
1073
1077
|
}
|
|
@@ -1108,7 +1112,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1108
1112
|
}
|
|
1109
1113
|
log9("close", {}, {
|
|
1110
1114
|
file: "data-pipeline.ts",
|
|
1111
|
-
line:
|
|
1115
|
+
line: 161,
|
|
1112
1116
|
scope: this,
|
|
1113
1117
|
callSite: (f, a) => f(...a)
|
|
1114
1118
|
});
|
|
@@ -1123,7 +1127,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1123
1127
|
} catch (err) {
|
|
1124
1128
|
log9.catch(err, {}, {
|
|
1125
1129
|
file: "data-pipeline.ts",
|
|
1126
|
-
line:
|
|
1130
|
+
line: 174,
|
|
1127
1131
|
scope: this,
|
|
1128
1132
|
callSite: (f, a) => f(...a)
|
|
1129
1133
|
});
|
|
@@ -1141,7 +1145,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1141
1145
|
seq
|
|
1142
1146
|
}, {
|
|
1143
1147
|
file: "data-pipeline.ts",
|
|
1144
|
-
line:
|
|
1148
|
+
line: 186,
|
|
1145
1149
|
scope: this,
|
|
1146
1150
|
callSite: (f, a) => f(...a)
|
|
1147
1151
|
});
|
|
@@ -1153,7 +1157,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1153
1157
|
feedKey
|
|
1154
1158
|
}, {
|
|
1155
1159
|
file: "data-pipeline.ts",
|
|
1156
|
-
line:
|
|
1160
|
+
line: 192,
|
|
1157
1161
|
scope: this,
|
|
1158
1162
|
callSite: (f, a) => f(...a)
|
|
1159
1163
|
});
|
|
@@ -1173,7 +1177,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1173
1177
|
} catch (err) {
|
|
1174
1178
|
log9.catch(err, {}, {
|
|
1175
1179
|
file: "data-pipeline.ts",
|
|
1176
|
-
line:
|
|
1180
|
+
line: 210,
|
|
1177
1181
|
scope: this,
|
|
1178
1182
|
callSite: (f, a) => f(...a)
|
|
1179
1183
|
});
|
|
@@ -1208,7 +1212,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1208
1212
|
} catch (err) {
|
|
1209
1213
|
log9.warn("Failed to cache properties", err, {
|
|
1210
1214
|
file: "data-pipeline.ts",
|
|
1211
|
-
line:
|
|
1215
|
+
line: 244,
|
|
1212
1216
|
scope: this,
|
|
1213
1217
|
callSite: (f, a) => f(...a)
|
|
1214
1218
|
});
|
|
@@ -1231,7 +1235,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1231
1235
|
epoch
|
|
1232
1236
|
}, {
|
|
1233
1237
|
file: "data-pipeline.ts",
|
|
1234
|
-
line:
|
|
1238
|
+
line: 273,
|
|
1235
1239
|
scope: this,
|
|
1236
1240
|
callSite: (f, a) => f(...a)
|
|
1237
1241
|
});
|
|
@@ -1241,7 +1245,7 @@ var DataPipeline = class DataPipeline2 {
|
|
|
1241
1245
|
}
|
|
1242
1246
|
log9("restarting pipeline for epoch", {}, {
|
|
1243
1247
|
file: "data-pipeline.ts",
|
|
1244
|
-
line:
|
|
1248
|
+
line: 281,
|
|
1245
1249
|
scope: this,
|
|
1246
1250
|
callSite: (f, a) => f(...a)
|
|
1247
1251
|
});
|
|
@@ -1290,7 +1294,7 @@ DataPipeline = __decorate5([
|
|
|
1290
1294
|
|
|
1291
1295
|
// packages/core/echo/echo-pipeline/src/space/space.ts
|
|
1292
1296
|
import assert9 from "@dxos/node-std/assert";
|
|
1293
|
-
import { Event as
|
|
1297
|
+
import { Event as Event5, synchronized as synchronized4, trackLeaks as trackLeaks3, Lock } from "@dxos/async";
|
|
1294
1298
|
import { log as log11, logInfo } from "@dxos/log";
|
|
1295
1299
|
import { AdmittedFeed as AdmittedFeed2 } from "@dxos/protocols/proto/dxos/halo/credentials";
|
|
1296
1300
|
import { Callback as Callback2 } from "@dxos/util";
|
|
@@ -1425,7 +1429,7 @@ var Space = class Space2 {
|
|
|
1425
1429
|
constructor(params) {
|
|
1426
1430
|
this._addFeedLock = new Lock();
|
|
1427
1431
|
this.onCredentialProcessed = new Callback2();
|
|
1428
|
-
this.stateUpdate = new
|
|
1432
|
+
this.stateUpdate = new Event5();
|
|
1429
1433
|
// Processes epoch credentials.
|
|
1430
1434
|
this._dataPipelineCredentialConsumer = void 0;
|
|
1431
1435
|
this._isOpen = false;
|
|
@@ -1596,12 +1600,13 @@ var Space = class Space2 {
|
|
|
1596
1600
|
async initializeDataPipeline() {
|
|
1597
1601
|
log11("initializeDataPipeline", {}, {
|
|
1598
1602
|
file: "space.ts",
|
|
1599
|
-
line:
|
|
1603
|
+
line: 246,
|
|
1600
1604
|
scope: this,
|
|
1601
1605
|
callSite: (f, a) => f(...a)
|
|
1602
1606
|
});
|
|
1603
1607
|
assert9(this._isOpen, "Space must be open to initialize data pipeline.");
|
|
1604
1608
|
await this._dataPipeline.open();
|
|
1609
|
+
assert9(this._dataPipelineCredentialConsumer);
|
|
1605
1610
|
await this._dataPipelineCredentialConsumer.open();
|
|
1606
1611
|
}
|
|
1607
1612
|
};
|
|
@@ -1614,6 +1619,9 @@ __decorate6([
|
|
|
1614
1619
|
__decorate6([
|
|
1615
1620
|
synchronized4
|
|
1616
1621
|
], Space.prototype, "close", null);
|
|
1622
|
+
__decorate6([
|
|
1623
|
+
synchronized4
|
|
1624
|
+
], Space.prototype, "initializeDataPipeline", null);
|
|
1617
1625
|
Space = __decorate6([
|
|
1618
1626
|
trackLeaks3("open", "close")
|
|
1619
1627
|
], Space);
|
|
@@ -1926,4 +1934,4 @@ export {
|
|
|
1926
1934
|
SpaceProtocolSession,
|
|
1927
1935
|
SpaceManager
|
|
1928
1936
|
};
|
|
1929
|
-
//# sourceMappingURL=chunk-
|
|
1937
|
+
//# sourceMappingURL=chunk-CSFWTLPD.mjs.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/metadata/metadata-store.ts", "../../../src/common/codec.ts", "../../../src/common/feeds.ts", "../../../src/pipeline/timeframe-clock.ts", "../../../src/pipeline/pipeline.ts", "../../../src/pipeline/message-selector.ts", "../../../src/space/auth.ts", "../../../src/dbhost/data-service-host.ts", "../../../src/dbhost/database-host.ts", "../../../src/dbhost/snapshot-manager.ts", "../../../src/dbhost/snapshot-store.ts", "../../../src/dbhost/data-service.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 2021 DXOS.org\n//\n\nimport CRC32 from 'crc-32';\nimport assert from 'node:assert';\n\nimport { synchronized, Event } from '@dxos/async';\nimport { DataCorruptionError } from '@dxos/errors';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { STORAGE_VERSION, schema } from '@dxos/protocols';\nimport { EchoMetadata, SpaceMetadata, IdentityRecord, SpaceCache } from '@dxos/protocols/proto/dxos/echo/metadata';\nimport { Directory } from '@dxos/random-access-storage';\nimport { Timeframe } from '@dxos/timeframe';\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\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 = schema.getCodecForType('dxos.echo.metadata.EchoMetadata').decode(data);\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 = Buffer.from(schema.getCodecForType('dxos.echo.metadata.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 const space = this.spaces.find((space) => space.key === spaceKey);\n assert(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 assert(!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 assert(\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 setSpaceLatestTimeframe(spaceKey: PublicKey, timeframe: Timeframe) {\n this._getSpace(spaceKey).dataTimeframe = 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}\nconst fromBytesInt32 = (buf: Buffer) => buf.readInt32LE(0);\n", "//\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 assert from 'node:assert';\n\nimport { FeedWriter } from '@dxos/feed-store';\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 assert(mapper);\n assert(writer);\n\n return {\n write: async (data: Source, options) => await writer.write(await mapper(data), options),\n };\n};\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 assert from 'node:assert';\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 { 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 // TODO(dmaretskyi): Remove?.\n public readonly timeframeUpdate = this._timeframeClock.update;\n\n public readonly stalled = new Event();\n\n /**\n * Target timeframe we are waiting to reach.\n */\n private _targetTimeframe: Timeframe | undefined;\n\n private _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 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 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\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\n private readonly _pauseTrigger = new Trigger().wake();\n\n private _isStopping = false;\n\n private _isStarted = false;\n\n private _isOpen = false;\n\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 assert(this._writer, 'Writer not set.');\n return this._writer;\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 }\n\n hasFeed(feedKey: PublicKey) {\n return this._feeds.has(feedKey);\n }\n\n setWriteFeed(feed: FeedWrapper<FeedMessage>) {\n assert(!this._writer, 'Writer already set.');\n assert(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 log('starting...', {});\n await this._initIterator();\n await this._feedSetIterator!.open();\n log('started');\n this._isStarted = true;\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 log('stopped');\n this._isStarted = false;\n }\n\n /**\n * @param timeframe Timeframe of already processed messages. The pipeline will start processing messages AFTER this timeframe.\n */\n @synchronized\n async setCursor(timeframe: Timeframe) {\n assert(!this._isStarted || this._isPaused, 'Invalid state.');\n\n this._timeframeClock.setTimeframe(timeframe);\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 assert(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 assert(this._isStarted, 'Pipeline is not open.');\n assert(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 assert(!this._isOpen, 'Pipeline is already being consumed.');\n this._isOpen = true;\n\n assert(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 assert(this._feedSetIterator, 'Iterator not initialized.');\n lastFeedSetIterator = this._feedSetIterator;\n iterable = lastFeedSetIterator[Symbol.asyncIterator]();\n }\n\n const { done, value } = await iterable.next();\n if (done) {\n continue;\n }\n\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\n this._timeframeClock.updateTimeframe();\n }\n\n // TODO(burdon): Test re-entrant?\n this._isOpen = false;\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 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 debug from 'debug';\nimport assert from 'node:assert';\n\nimport { FeedBlock, FeedBlockSelector } from '@dxos/feed-store';\nimport type { FeedMessage } from '@dxos/protocols/proto/dxos/echo/feed';\n\nimport { TimeframeClock } from './timeframe-clock';\n\nconst log = debug('dxos:echo-db:message-selector');\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 assert(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 assert from 'node:assert';\n\nimport { runInContext, scheduleTask } from '@dxos/async';\nimport { Context } from '@dxos/context';\nimport { randomBytes } from '@dxos/crypto';\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 assert(credential?.length > 0, 'invalid credential');\n const success = await this._authParams.verifier(challenge, credential);\n assert(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 2021 DXOS.org\n//\n\nimport assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { tagMutationsInBatch, ItemDemuxer, ItemManager, setMetadataOnObject } from '@dxos/echo-db';\nimport { FeedWriter } from '@dxos/feed-store';\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 _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 /**\n * Real-time subscription to data objects in a space.\n */\n subscribe(): Stream<EchoEvent> {\n return new Stream(({ next, ctx }) => {\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 assert(!(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 assert(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\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 { Any } from '@dxos/codec-protobuf';\nimport { timed } from '@dxos/debug';\nimport { log } from '@dxos/log';\nimport { schema } from '@dxos/protocols';\nimport { SpaceSnapshot } from '@dxos/protocols/proto/dxos/echo/snapshot';\nimport { DataObject } from '@dxos/protocols/proto/dxos/mesh/teleport/objectsync';\nimport { ObjectSync } from '@dxos/teleport-extension-object-sync';\n\nimport { SnapshotStore } from './snapshot-store';\n\n/**\n * Snapshot manager for a specific space.\n */\n@trackLeaks('open', 'close')\nexport class SnapshotManager {\n private readonly _objectSync: ObjectSync;\n\n // prettier-ignore\n constructor(\n private readonly _snapshotStore: SnapshotStore\n ) {\n this._objectSync = new ObjectSync({\n getObject: async (id: string) => {\n const snapshot = await this._snapshotStore.loadSnapshot(id);\n log('getObject', { id, snapshot });\n if (!snapshot) {\n return undefined;\n }\n return {\n id,\n payload: schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').encodeAsAny(snapshot)\n };\n },\n setObject: async (data: DataObject) => {\n log('setObject', { data });\n const snapshot = schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode((data.payload as Any).value);\n await this._snapshotStore.saveSnapshot(snapshot);\n }\n });\n }\n\n get objectSync() {\n return this._objectSync;\n }\n\n async open() {\n await this._objectSync.open();\n }\n\n async close() {\n await this._objectSync.close();\n }\n\n @timed(10_000)\n async load(id: string): Promise<SpaceSnapshot> {\n const local = await this._snapshotStore.loadSnapshot(id);\n if (local) {\n return local;\n }\n\n const remote = await this._objectSync.download(id);\n return schema.getCodecForType('dxos.echo.snapshot.SpaceSnapshot').decode((remote.payload as Any).value);\n }\n\n async store(snapshot: SpaceSnapshot): Promise<string> {\n const id = await this._snapshotStore.saveSnapshot(snapshot);\n return id;\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\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 = schema.getCodecForType('dxos.echo.snapshot.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 schema.getCodecForType('dxos.echo.snapshot.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 assert from 'node:assert';\n\nimport { Stream } from '@dxos/codec-protobuf';\nimport { raise } from '@dxos/debug';\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 registerSpace(spaceKey: PublicKey, host: DataServiceHost) {\n log('Registering space', { spaceKey });\n this._spaces.set(spaceKey, host);\n }\n\n unregisterSpace(spaceKey: PublicKey) {\n log('Unregistering space', { spaceKey });\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 assert(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 assert(request.spaceKey);\n assert(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 2022 DXOS.org\n//\n\nimport assert from 'node:assert';\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 { FeedWriter } from '@dxos/feed-store';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { ModelFactory } from '@dxos/model-factory';\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';\n\nimport { DatabaseHost, SnapshotManager } from '../dbhost';\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 {\n private _ctx = new Context();\n private _pipeline?: Pipeline;\n private _targetTimeframe?: Timeframe;\n\n private _lastAutomaticSnapshotTimeframe = new Timeframe();\n private _isOpen = false;\n\n private _lastTimeframeSaveTime = 0;\n private _lastSnapshotSaveTime = 0;\n\n constructor(private readonly _params: DataPipelineParams) {}\n\n public itemManager!: ItemManager;\n public databaseHost?: DatabaseHost;\n\n public currentEpoch?: SpecificCredential<Epoch>;\n public 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 createCredentialProcessor(): CredentialProcessor {\n return {\n process: async (credential) => {\n if (!checkCredentialType(credential, 'dxos.halo.credentials.Epoch')) {\n return;\n }\n\n log('new epoch', { credential });\n await this._processEpoch(credential.subject.assertion);\n\n this.currentEpoch = credential;\n this.onNewEpoch.emit(credential);\n },\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 assert(this._pipeline, 'Pipeline is not initialized.');\n assert(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 await this._params.snapshotManager.close();\n }\n\n private async _consumePipeline() {\n assert(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.error('Could not find feed.', { feedKey });\n continue;\n }\n\n await 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 // 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 assert(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.setSpaceLatestTimeframe(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 (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 @synchronized\n private async _processEpoch(epoch: Epoch) {\n assert(this._isOpen); // TODO: In the future we might process epochs before we are open so that data pipeline starts from the last one.\n assert(this._pipeline);\n\n log('Processing epoch', { epoch });\n if (epoch.snapshotCid) {\n const snapshot = await this._params.snapshotManager.load(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 assert(this._pipeline, 'Pipeline is not initialized.');\n await this._pipeline.state.waitUntilTimeframe(timeframe);\n }\n\n @synchronized\n async createEpoch(): Promise<Epoch> {\n assert(this._pipeline);\n assert(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 assert from 'node:assert';\n\nimport { Event, synchronized, trackLeaks, Lock } from '@dxos/async';\nimport { CredentialConsumer, FeedInfo } from '@dxos/credentials';\nimport { FeedWrapper } from '@dxos/feed-store';\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 { AsyncCallback, Callback } from '@dxos/util';\n\nimport { SnapshotManager } from '../dbhost';\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) => 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')\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 // Processes epoch credentials.\n private _dataPipelineCredentialConsumer?: CredentialConsumer<any> = undefined;\n\n private _isOpen = false;\n private _controlFeed?: FeedWrapper<FeedMessage>;\n private _dataFeed?: FeedWrapper<FeedMessage>;\n\n constructor(params: SpaceParams) {\n assert(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 });\n\n // TODO(dmaretskyi): Feed set abstraction.\n this._controlPipeline.onFeedAdmitted.set(async (info) => {\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));\n }\n }\n });\n }\n\n if (!info.key.equals(params.genesisFeed.key)) {\n this.protocol.addFeed(await params.feedProvider(info.key));\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));\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 assert(!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 assert(!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 async open() {\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\n this._dataPipelineCredentialConsumer = this._controlPipeline.spaceState.registerProcessor(\n this._dataPipeline.createCredentialProcessor(),\n );\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._dataPipelineCredentialConsumer?.close();\n this._dataPipelineCredentialConsumer = undefined;\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 assert(this._isOpen, 'Space must be open to initialize data pipeline.');\n await this._dataPipeline.open();\n assert(this._dataPipelineCredentialConsumer);\n await this._dataPipelineCredentialConsumer.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 { AsyncCallback, Callback } from '@dxos/util';\n\nimport { Pipeline, PipelineAccessor } from '../pipeline';\n\nexport type ControlPipelineParams = {\n spaceKey: PublicKey;\n genesisFeed: FeedWrapper<FeedMessage>;\n feedProvider: (feedKey: PublicKey) => Promise<FeedWrapper<FeedMessage>>;\n};\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 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 }: ControlPipelineParams) {\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 result = await this._spaceStateMachine.process(\n msg.data.payload.credential.credential,\n PublicKey.from(msg.feedKey),\n );\n if (!result) {\n log.warn('processing failed', { msg });\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 async stop() {\n log('stopping...');\n await this._pipeline.stop();\n log('stopped');\n }\n}\n", "//\n// Copyright 2022 DXOS.org\n//\n\nimport { discoveryKey, sha256 } 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 { Teleport } from '@dxos/teleport';\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 * 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 @logInfo\n private readonly _topic: 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 }: SpaceProtocolOptions) {\n this._networkManager = networkManager;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\n\n this._topic = PublicKey.from(discoveryKey(sha256(topic.toHex())));\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 log('starting...');\n this._connection = await this._networkManager.joinSwarm({\n protocolProvider: this._createProtocolProvider(credentials),\n peerId: this._swarmIdentity.peerKey,\n topic: this._topic,\n topology: new MMSTTopology(topologyConfig),\n label: `Protocol swarm: ${this._topic}`,\n });\n\n log('started');\n }\n\n async stop() {\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 });\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 * 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\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 // TODO(dmaretskyi): Allow to pass in extra extensions.\n constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure }: SpaceProtocolSessionParams) {\n this._wireParams = wireParams;\n this._swarmIdentity = swarmIdentity;\n this._onSessionAuth = onSessionAuth;\n this._onAuthFailure = onAuthFailure;\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 }\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 { ComplexMap } from '@dxos/util';\n\nimport { SnapshotManager, SnapshotStore } from '../dbhost';\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 snapshotStore: SnapshotStore;\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 _instanceId = PublicKey.random().toHex();\n\n constructor({ feedStore, networkManager, modelFactory, metadataStore, snapshotStore }: 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 }\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 });\n const snapshotManager = new SnapshotManager(this._snapshotStore);\n\n const space = new Space({\n spaceKey,\n protocol,\n genesisFeed,\n feedProvider: (feedKey) => this._feedStore.openFeed(feedKey),\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": ["CRC32", "assert", "synchronized", "Event", "DataCorruptionError", "log", "STORAGE_VERSION", "schema", "emptyEchoMetadata", "version", "spaces", "created", "Date", "updated", "MetadataStore", "constructor", "_directory", "_metadata", "update", "metadata", "load", "file", "getOrCreateFile", "size", "fileLength", "stat", "dataSize", "fromBytesInt32", "read", "checksum", "data", "calculatedChecksum", "buf", "getCodecForType", "decode", "err", "error", "close", "_save", "emit", "encoded", "Buffer", "from", "encode", "result", "alloc", "length", "writeInt32LE", "copy", "write", "_getSpace", "spaceKey", "space", "find", "key", "clear", "delete", "getIdentityRecord", "identity", "setIdentityRecord", "record", "addSpace", "push", "setSpaceLatestTimeframe", "timeframe", "dataTimeframe", "setCache", "cache", "setWritableFeedKeys", "controlFeedKey", "dataFeedKey", "readInt32LE", "createCodecEncoding", "schema", "codec", "getCodecForType", "valueEncoding", "assert", "createMappedFeedWriter", "mapper", "writer", "write", "data", "options", "Event", "timed", "log", "Timeframe", "__decorate", "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", "assert", "Event", "sleep", "synchronized", "Trigger", "Context", "rejectOnDispose", "failUndefined", "FeedSetIterator", "PublicKey", "log", "Timeframe", "ComplexMap", "debug", "assert", "log", "createMessageSelector", "timeframeClock", "messages", "i", "length", "data", "timeframe", "hasGaps", "__decorate", "PipelineState", "constructor", "_feeds", "_timeframeClock", "timeframeUpdate", "update", "stalled", "Event", "endTimeframe", "mapFeedIndexesToTimeframe", "Array", "from", "values", "filter", "feed", "length", "map", "feedKey", "key", "index", "timeframe", "pendingTimeframe", "targetTimeframe", "_targetTimeframe", "Timeframe", "feeds", "waitUntilTimeframe", "target", "waitUntilReached", "setTargetTimeframe", "waitUntilReachedTargetTimeframe", "ctx", "Context", "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", "assert", "_writer", "getFeeds", "_feedSetIterator", "addFeed", "set", "hasFeed", "has", "setWriteFeed", "properties", "writable", "createMappedFeedWriter", "payload", "createFeedWriter", "start", "_initIterator", "open", "stop", "close", "wait", "setCursor", "setTimeframe", "pause", "reset", "unpause", "consume", "lastFeedSetIterator", "iterable", "Symbol", "asyncIterator", "value", "next", "block", "failUndefined", "updatePendingTimeframe", "seq", "updateTimeframe", "FeedSetIterator", "createMessageSelector", "startAfter", "stallTimeout", "on", "iterator", "options", "size", "emit", "synchronized", "assert", "runInContext", "scheduleTask", "Context", "randomBytes", "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", "assert", "Stream", "tagMutationsInBatch", "setMetadataOnObject", "log", "ComplexMap", "DataServiceHost", "constructor", "_itemManager", "_itemDemuxer", "_writeStream", "_clientTagMap", "feedKey", "seq", "toHex", "subscribe", "next", "ctx", "objects", "Array", "from", "entities", "values", "map", "entity", "createSnapshot", "batch", "mutation", "on", "message", "meta", "clientTag", "get", "forEach", "object", "write", "request", "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", "timed", "log", "schema", "ObjectSync", "__decorate", "SnapshotManager", "constructor", "_snapshotStore", "_objectSync", "getObject", "id", "snapshot", "loadSnapshot", "undefined", "payload", "getCodecForType", "encodeAsAny", "setObject", "data", "decode", "value", "saveSnapshot", "objectSync", "open", "close", "load", "local", "remote", "download", "store", "subtleCrypto", "schema", "SnapshotStore", "constructor", "_directory", "saveSnapshot", "snapshot", "encoded", "getCodecForType", "encode", "key", "digest", "keyString", "Buffer", "from", "toString", "file", "getOrCreateFile", "write", "close", "loadSnapshot", "size", "stat", "undefined", "buffer", "read", "decode", "listSnapshots", "entries", "list", "Promise", "all", "map", "assert", "raise", "PublicKey", "log", "ComplexMap", "DataServiceSubscriptions", "_spaces", "hash", "clear", "registerSpace", "spaceKey", "host", "set", "unregisterSpace", "delete", "getDataService", "get", "DataServiceImpl", "constructor", "_subscriptions", "subscribe", "request", "Error", "write", "batch", "assert", "Event", "scheduleTask", "synchronized", "trackLeaks", "Context", "checkCredentialType", "getStateMachineFromItem", "ItemManager", "log", "Timeframe", "__decorate", "MESSAGES_PER_SNAPSHOT", "AUTOMATIC_SNAPSHOT_DEBOUNCE_INTERVAL", "TIMEFRAME_SAVE_DEBOUNCE_INTERVAL", "DataPipeline", "constructor", "_params", "_ctx", "Context", "_lastAutomaticSnapshotTimeframe", "Timeframe", "_isOpen", "_lastTimeframeSaveTime", "_lastSnapshotSaveTime", "onNewEpoch", "Event", "isOpen", "pipeline", "_pipeline", "pipelineState", "state", "setTargetTimeframe", "timeframe", "_targetTimeframe", "createCredentialProcessor", "process", "credential", "checkCredentialType", "log", "_processEpoch", "subject", "assertion", "currentEpoch", "emit", "open", "Pipeline", "onPipelineCreated", "start", "pause", "feedWriter", "write", "data", "options", "assert", "writer", "databaseHost", "DatabaseHost", "itemManager", "ItemManager", "modelFactory", "scheduleTask", "_consumePipeline", "close", "dispose", "stop", "_saveCache", "_saveTargetTimeframe", "err", "catch", "destroy", "snapshotManager", "msg", "consume", "feedKey", "seq", "payload", "feedInfo", "feedInfoProvider", "error", "echoProcessor", "batch", "meta", "memberKey", "identityKey", "_noteTargetStateIfNeeded", "pendingTimeframe", "_createSnapshot", "spaceKey", "asUint8Array", "database", "createSnapshot", "newTimeframe", "merge", "metadataStore", "setSpaceLatestTimeframe", "cache", "propertiesItem", "items", "find", "item", "_a", "modelMeta", "type", "getStateMachineFromItem", "snapshot", "properties", "warn", "setCache", "Date", "now", "totalMessages", "epoch", "snapshotCid", "load", "_itemDemuxer", "restoreFromSnapshot", "setCursor", "unpause", "waitUntilTimeframe", "createEpoch", "store", "previousId", "id", "number", "ensureEpochInitialized", "waitForCondition", "synchronized", "trackLeaks", "assert", "Event", "synchronized", "trackLeaks", "Lock", "log", "logInfo", "AdmittedFeed", "Callback", "SpaceStateMachine", "PublicKey", "log", "AdmittedFeed", "Callback", "ControlPipeline", "constructor", "spaceKey", "genesisFeed", "feedProvider", "onFeedAdmitted", "Callback", "_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", "result", "process", "PublicKey", "from", "warn", "stop", "__decorate", "Space", "constructor", "params", "_addFeedLock", "Lock", "onCredentialProcessed", "Callback", "stateUpdate", "Event", "_dataPipelineCredentialConsumer", "undefined", "_isOpen", "assert", "spaceKey", "feedProvider", "_key", "_genesisFeedKey", "genesisFeed", "key", "_feedProvider", "_snapshotManager", "snapshotManager", "_controlPipeline", "ControlPipeline", "onFeedAdmitted", "set", "info", "assertion", "designation", "AdmittedFeed", "Designation", "DATA", "executeSynchronized", "_dataPipeline", "pipeline", "hasFeed", "addFeed", "equals", "protocol", "credential", "callIfSet", "log", "emit", "DataPipeline", "modelFactory", "metadataStore", "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", "start", "registerProcessor", "createCredentialProcessor", "close", "stop", "initializeDataPipeline", "logInfo", "synchronized", "trackLeaks", "discoveryKey", "sha256", "PublicKey", "log", "logInfo", "MMSTTopology", "Teleport", "ReplicatorExtension", "ComplexMap", "__decorate", "MOCK_AUTH_PROVIDER", "nonce", "Buffer", "from", "MOCK_AUTH_VERIFIER", "credential", "SpaceProtocol", "constructor", "topic", "swarmIdentity", "networkManager", "onSessionAuth", "onAuthFailure", "_feeds", "Set", "_sessions", "ComplexMap", "PublicKey", "hash", "_networkManager", "_swarmIdentity", "_onSessionAuth", "_onAuthFailure", "_topic", "discoveryKey", "sha256", "toHex", "sessions", "feeds", "_ownPeerKey", "peerKey", "addFeed", "feed", "log", "key", "add", "session", "values", "replicator", "start", "_connection", "credentials", "credentialProvider", "topologyConfig", "originateConnections", "maxPeers", "sampleSize", "joinSwarm", "protocolProvider", "_createProtocolProvider", "peerId", "topology", "MMSTTopology", "label", "stop", "close", "wireParams", "SpaceProtocolSession", "set", "remotePeerId", "logInfo", "AuthStatus", "INITIAL", "SUCCESS", "FAILURE", "ReplicatorExtension", "setOptions", "upload", "_authStatus", "_wireParams", "_teleport", "Teleport", "authStatus", "stream", "initialize", "open", "addExtension", "AuthExtension", "provider", "verifier", "credentialAuthenticator", "onAuthSuccess", "destroy", "synchronized", "trackLeaks", "failUndefined", "PublicKey", "log", "trace", "ComplexMap", "__decorate", "SpaceManager", "constructor", "feedStore", "networkManager", "modelFactory", "metadataStore", "snapshotStore", "_spaces", "ComplexMap", "PublicKey", "hash", "_instanceId", "random", "toHex", "_feedStore", "_networkManager", "_modelFactory", "_metadataStore", "_snapshotStore", "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", "Space", "feedProvider", "feedKey", "set", "end", "synchronized", "trackLeaks"]
|
|
7
|
+
}
|