@dxos/echo-pipeline 0.1.46 → 0.1.48-next.4b7ebc3
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-YFIFTFHQ.mjs → chunk-JEULF2QN.mjs} +52 -45
- package/dist/lib/browser/chunk-JEULF2QN.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 +2 -3
- package/dist/lib/browser/testing/index.mjs.map +2 -2
- package/dist/lib/node/index.cjs +51 -44
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +52 -46
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/dbhost/data-service-host.d.ts.map +1 -1
- package/dist/types/src/space/space-manager.d.ts +2 -1
- package/dist/types/src/space/space-manager.d.ts.map +1 -1
- package/dist/types/src/space/space-protocol.d.ts +6 -2
- package/dist/types/src/space/space-protocol.d.ts.map +1 -1
- package/dist/types/src/testing/database-test-rig.d.ts +2 -1
- package/dist/types/src/testing/database-test-rig.d.ts.map +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts +1 -1
- package/dist/types/src/testing/test-agent-builder.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/dbhost/data-service-host.ts +19 -14
- package/src/space/auth.ts +1 -1
- package/src/space/space-manager.ts +9 -1
- package/src/space/space-protocol.ts +12 -4
- package/src/space/space.test.ts +1 -1
- package/src/space/space.ts +1 -1
- package/src/testing/database-test-rig.ts +30 -7
- package/src/testing/test-agent-builder.ts +1 -1
- package/src/tests/database-unit.test.ts +58 -17
- package/dist/lib/browser/chunk-YFIFTFHQ.mjs.map +0 -7
|
@@ -658,7 +658,7 @@ var AuthExtension = class extends RpcExtension {
|
|
|
658
658
|
assert5(success, "credential not verified");
|
|
659
659
|
runInContext(this._ctx, () => this._authParams.onAuthSuccess());
|
|
660
660
|
} catch (err) {
|
|
661
|
-
log5
|
|
661
|
+
log5("auth failed", err, {
|
|
662
662
|
file: "auth.ts",
|
|
663
663
|
line: 75,
|
|
664
664
|
scope: this,
|
|
@@ -702,12 +702,13 @@ var DataServiceHost = class {
|
|
|
702
702
|
this._itemDemuxer.mutation.on(ctx, (message) => {
|
|
703
703
|
var _a;
|
|
704
704
|
const { batch, meta } = message;
|
|
705
|
+
assert6(!meta.clientTag, "Unexpected client tag in mutation message");
|
|
705
706
|
log6("message", {
|
|
706
707
|
batch,
|
|
707
708
|
meta
|
|
708
709
|
}, {
|
|
709
710
|
file: "data-service-host.ts",
|
|
710
|
-
line:
|
|
711
|
+
line: 51,
|
|
711
712
|
scope: this,
|
|
712
713
|
callSite: (f, a) => f(...a)
|
|
713
714
|
});
|
|
@@ -716,10 +717,12 @@ var DataServiceHost = class {
|
|
|
716
717
|
message.meta.seq
|
|
717
718
|
]);
|
|
718
719
|
(_a = batch.objects) == null ? void 0 : _a.forEach((object) => {
|
|
719
|
-
setMetadataOnObject(object,
|
|
720
|
+
setMetadataOnObject(object, {
|
|
721
|
+
...meta
|
|
722
|
+
});
|
|
720
723
|
});
|
|
721
724
|
if (clientTag) {
|
|
722
|
-
tagMutationsInBatch(batch, clientTag);
|
|
725
|
+
tagMutationsInBatch(batch, clientTag, 0);
|
|
723
726
|
}
|
|
724
727
|
next({
|
|
725
728
|
clientTag,
|
|
@@ -731,32 +734,18 @@ var DataServiceHost = class {
|
|
|
731
734
|
});
|
|
732
735
|
}
|
|
733
736
|
async write(request) {
|
|
734
|
-
var _a, _b
|
|
737
|
+
var _a, _b;
|
|
735
738
|
assert6(this._writeStream, "Cannot write mutations in readonly mode");
|
|
736
739
|
log6("write", {
|
|
737
740
|
clientTag: request.clientTag,
|
|
738
741
|
objectCount: (_b = (_a = request.batch.objects) == null ? void 0 : _a.length) != null ? _b : 0
|
|
739
742
|
}, {
|
|
740
743
|
file: "data-service-host.ts",
|
|
741
|
-
line:
|
|
744
|
+
line: 79,
|
|
742
745
|
scope: this,
|
|
743
746
|
callSite: (f, a) => f(...a)
|
|
744
747
|
});
|
|
745
|
-
const message =
|
|
746
|
-
batch: {
|
|
747
|
-
objects: (_c = request.batch.objects) == null ? void 0 : _c.map((object) => {
|
|
748
|
-
var _a2;
|
|
749
|
-
return {
|
|
750
|
-
...object,
|
|
751
|
-
mutations: (_a2 = object.mutations) == null ? void 0 : _a2.map((mutation) => ({
|
|
752
|
-
...mutation,
|
|
753
|
-
meta: void 0
|
|
754
|
-
})),
|
|
755
|
-
meta: void 0
|
|
756
|
-
};
|
|
757
|
-
})
|
|
758
|
-
}
|
|
759
|
-
};
|
|
748
|
+
const message = createDataMessage(request.batch);
|
|
760
749
|
const receipt = await this._writeStream.write(message, {
|
|
761
750
|
afterWrite: async (receipt2) => {
|
|
762
751
|
if (request.clientTag) {
|
|
@@ -766,7 +755,7 @@ var DataServiceHost = class {
|
|
|
766
755
|
seq: receipt2.seq
|
|
767
756
|
}, {
|
|
768
757
|
file: "data-service-host.ts",
|
|
769
|
-
line:
|
|
758
|
+
line: 88,
|
|
770
759
|
scope: this,
|
|
771
760
|
callSite: (f, a) => f(...a)
|
|
772
761
|
});
|
|
@@ -780,6 +769,24 @@ var DataServiceHost = class {
|
|
|
780
769
|
return receipt;
|
|
781
770
|
}
|
|
782
771
|
};
|
|
772
|
+
var createDataMessage = (batch) => {
|
|
773
|
+
var _a;
|
|
774
|
+
return {
|
|
775
|
+
batch: {
|
|
776
|
+
objects: (_a = batch.objects) == null ? void 0 : _a.map((object) => {
|
|
777
|
+
var _a2;
|
|
778
|
+
return {
|
|
779
|
+
...object,
|
|
780
|
+
mutations: (_a2 = object.mutations) == null ? void 0 : _a2.map((mutation) => ({
|
|
781
|
+
...mutation,
|
|
782
|
+
meta: void 0
|
|
783
|
+
})),
|
|
784
|
+
meta: void 0
|
|
785
|
+
};
|
|
786
|
+
})
|
|
787
|
+
}
|
|
788
|
+
};
|
|
789
|
+
};
|
|
783
790
|
|
|
784
791
|
// packages/core/echo/echo-pipeline/src/dbhost/database-host.ts
|
|
785
792
|
import { ItemDemuxer } from "@dxos/echo-db";
|
|
@@ -1587,7 +1594,7 @@ var Space = class Space2 {
|
|
|
1587
1594
|
});
|
|
1588
1595
|
}
|
|
1589
1596
|
async initializeDataPipeline() {
|
|
1590
|
-
log11
|
|
1597
|
+
log11("initializeDataPipeline", {}, {
|
|
1591
1598
|
file: "space.ts",
|
|
1592
1599
|
line: 245,
|
|
1593
1600
|
scope: this,
|
|
@@ -1632,12 +1639,13 @@ var __decorate7 = function(decorators, target, key, desc) {
|
|
|
1632
1639
|
var MOCK_AUTH_PROVIDER = async (nonce) => Buffer.from("mock");
|
|
1633
1640
|
var MOCK_AUTH_VERIFIER = async (nonce, credential) => true;
|
|
1634
1641
|
var SpaceProtocol = class {
|
|
1635
|
-
constructor({ topic, swarmIdentity, networkManager, onSessionAuth }) {
|
|
1642
|
+
constructor({ topic, swarmIdentity, networkManager, onSessionAuth, onAuthFailure }) {
|
|
1636
1643
|
this._feeds = /* @__PURE__ */ new Set();
|
|
1637
1644
|
this._sessions = new ComplexMap4(PublicKey4.hash);
|
|
1638
1645
|
this._networkManager = networkManager;
|
|
1639
1646
|
this._swarmIdentity = swarmIdentity;
|
|
1640
1647
|
this._onSessionAuth = onSessionAuth;
|
|
1648
|
+
this._onAuthFailure = onAuthFailure;
|
|
1641
1649
|
this._topic = PublicKey4.from(discoveryKey(sha256(topic.toHex())));
|
|
1642
1650
|
}
|
|
1643
1651
|
get sessions() {
|
|
@@ -1655,7 +1663,7 @@ var SpaceProtocol = class {
|
|
|
1655
1663
|
key: feed.key
|
|
1656
1664
|
}, {
|
|
1657
1665
|
file: "space-protocol.ts",
|
|
1658
|
-
line:
|
|
1666
|
+
line: 87,
|
|
1659
1667
|
scope: this,
|
|
1660
1668
|
callSite: (f, a) => f(...a)
|
|
1661
1669
|
});
|
|
@@ -1676,7 +1684,7 @@ var SpaceProtocol = class {
|
|
|
1676
1684
|
};
|
|
1677
1685
|
log12("starting...", {}, {
|
|
1678
1686
|
file: "space-protocol.ts",
|
|
1679
|
-
line:
|
|
1687
|
+
line: 110,
|
|
1680
1688
|
scope: this,
|
|
1681
1689
|
callSite: (f, a) => f(...a)
|
|
1682
1690
|
});
|
|
@@ -1689,7 +1697,7 @@ var SpaceProtocol = class {
|
|
|
1689
1697
|
});
|
|
1690
1698
|
log12("started", {}, {
|
|
1691
1699
|
file: "space-protocol.ts",
|
|
1692
|
-
line:
|
|
1700
|
+
line: 119,
|
|
1693
1701
|
scope: this,
|
|
1694
1702
|
callSite: (f, a) => f(...a)
|
|
1695
1703
|
});
|
|
@@ -1698,14 +1706,14 @@ var SpaceProtocol = class {
|
|
|
1698
1706
|
if (this._connection) {
|
|
1699
1707
|
log12("stopping...", {}, {
|
|
1700
1708
|
file: "space-protocol.ts",
|
|
1701
|
-
line:
|
|
1709
|
+
line: 124,
|
|
1702
1710
|
scope: this,
|
|
1703
1711
|
callSite: (f, a) => f(...a)
|
|
1704
1712
|
});
|
|
1705
1713
|
await this._connection.close();
|
|
1706
1714
|
log12("stopped", {}, {
|
|
1707
1715
|
file: "space-protocol.ts",
|
|
1708
|
-
line:
|
|
1716
|
+
line: 126,
|
|
1709
1717
|
scope: this,
|
|
1710
1718
|
callSite: (f, a) => f(...a)
|
|
1711
1719
|
});
|
|
@@ -1716,7 +1724,8 @@ var SpaceProtocol = class {
|
|
|
1716
1724
|
const session = new SpaceProtocolSession({
|
|
1717
1725
|
wireParams,
|
|
1718
1726
|
swarmIdentity: this._swarmIdentity,
|
|
1719
|
-
onSessionAuth: this._onSessionAuth
|
|
1727
|
+
onSessionAuth: this._onSessionAuth,
|
|
1728
|
+
onAuthFailure: this._onAuthFailure
|
|
1720
1729
|
});
|
|
1721
1730
|
this._sessions.set(wireParams.remotePeerId, session);
|
|
1722
1731
|
for (const feed of this._feeds) {
|
|
@@ -1740,7 +1749,7 @@ var AuthStatus;
|
|
|
1740
1749
|
})(AuthStatus || (AuthStatus = {}));
|
|
1741
1750
|
var SpaceProtocolSession = class {
|
|
1742
1751
|
// TODO(dmaretskyi): Allow to pass in extra extensions.
|
|
1743
|
-
constructor({ wireParams, swarmIdentity, onSessionAuth }) {
|
|
1752
|
+
constructor({ wireParams, swarmIdentity, onSessionAuth, onAuthFailure }) {
|
|
1744
1753
|
// TODO(dmaretskyi): Start with upload=false when switching it on the fly works.
|
|
1745
1754
|
this.replicator = new ReplicatorExtension().setOptions({
|
|
1746
1755
|
upload: true
|
|
@@ -1749,6 +1758,7 @@ var SpaceProtocolSession = class {
|
|
|
1749
1758
|
this._wireParams = wireParams;
|
|
1750
1759
|
this._swarmIdentity = swarmIdentity;
|
|
1751
1760
|
this._onSessionAuth = onSessionAuth;
|
|
1761
|
+
this._onAuthFailure = onAuthFailure;
|
|
1752
1762
|
this._teleport = new Teleport(wireParams);
|
|
1753
1763
|
}
|
|
1754
1764
|
get authStatus() {
|
|
@@ -1764,23 +1774,19 @@ var SpaceProtocolSession = class {
|
|
|
1764
1774
|
verifier: this._swarmIdentity.credentialAuthenticator,
|
|
1765
1775
|
onAuthSuccess: () => {
|
|
1766
1776
|
var _a;
|
|
1767
|
-
this._authStatus = AuthStatus.SUCCESS;
|
|
1768
1777
|
log12("Peer authenticated", {}, {
|
|
1769
1778
|
file: "space-protocol.ts",
|
|
1770
|
-
line:
|
|
1779
|
+
line: 213,
|
|
1771
1780
|
scope: this,
|
|
1772
1781
|
callSite: (f, a) => f(...a)
|
|
1773
1782
|
});
|
|
1783
|
+
this._authStatus = AuthStatus.SUCCESS;
|
|
1774
1784
|
(_a = this._onSessionAuth) == null ? void 0 : _a.call(this, this._teleport);
|
|
1775
1785
|
},
|
|
1776
1786
|
onAuthFailure: () => {
|
|
1777
|
-
|
|
1778
|
-
file: "space-protocol.ts",
|
|
1779
|
-
line: 211,
|
|
1780
|
-
scope: this,
|
|
1781
|
-
callSite: (f, a) => f(...a)
|
|
1782
|
-
});
|
|
1787
|
+
var _a;
|
|
1783
1788
|
this._authStatus = AuthStatus.FAILURE;
|
|
1789
|
+
(_a = this._onAuthFailure) == null ? void 0 : _a.call(this, this._teleport);
|
|
1784
1790
|
}
|
|
1785
1791
|
}));
|
|
1786
1792
|
this._teleport.addExtension("dxos.mesh.teleport.replicator", this.replicator);
|
|
@@ -1834,13 +1840,13 @@ var SpaceManager = class SpaceManager2 {
|
|
|
1834
1840
|
...this._spaces.values()
|
|
1835
1841
|
].map((space) => space.close()));
|
|
1836
1842
|
}
|
|
1837
|
-
async constructSpace({ metadata, swarmIdentity, onNetworkConnection, memberKey }) {
|
|
1843
|
+
async constructSpace({ metadata, swarmIdentity, onNetworkConnection, onAuthFailure, memberKey }) {
|
|
1838
1844
|
var _a;
|
|
1839
1845
|
log13.trace("dxos.echo.space-manager.construct-space", trace.begin({
|
|
1840
1846
|
id: this._instanceId
|
|
1841
1847
|
}), {
|
|
1842
1848
|
file: "space-manager.ts",
|
|
1843
|
-
line:
|
|
1849
|
+
line: 81,
|
|
1844
1850
|
scope: this,
|
|
1845
1851
|
callSite: (f, a) => f(...a)
|
|
1846
1852
|
});
|
|
@@ -1848,7 +1854,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
1848
1854
|
spaceKey: metadata.genesisFeedKey
|
|
1849
1855
|
}, {
|
|
1850
1856
|
file: "space-manager.ts",
|
|
1851
|
-
line:
|
|
1857
|
+
line: 82,
|
|
1852
1858
|
scope: this,
|
|
1853
1859
|
callSite: (f, a) => f(...a)
|
|
1854
1860
|
});
|
|
@@ -1858,7 +1864,8 @@ var SpaceManager = class SpaceManager2 {
|
|
|
1858
1864
|
topic: spaceKey,
|
|
1859
1865
|
swarmIdentity,
|
|
1860
1866
|
networkManager: this._networkManager,
|
|
1861
|
-
onSessionAuth: onNetworkConnection
|
|
1867
|
+
onSessionAuth: onNetworkConnection,
|
|
1868
|
+
onAuthFailure
|
|
1862
1869
|
});
|
|
1863
1870
|
const snapshotManager = new SnapshotManager(this._snapshotStore);
|
|
1864
1871
|
const space = new Space({
|
|
@@ -1876,7 +1883,7 @@ var SpaceManager = class SpaceManager2 {
|
|
|
1876
1883
|
id: this._instanceId
|
|
1877
1884
|
}), {
|
|
1878
1885
|
file: "space-manager.ts",
|
|
1879
|
-
line:
|
|
1886
|
+
line: 108,
|
|
1880
1887
|
scope: this,
|
|
1881
1888
|
callSite: (f, a) => f(...a)
|
|
1882
1889
|
});
|
|
@@ -1919,4 +1926,4 @@ export {
|
|
|
1919
1926
|
SpaceProtocolSession,
|
|
1920
1927
|
SpaceManager
|
|
1921
1928
|
};
|
|
1922
|
-
//# sourceMappingURL=chunk-
|
|
1929
|
+
//# sourceMappingURL=chunk-JEULF2QN.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 } 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\n // prettier-ignore\n constructor(\n private readonly _directory: Directory\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\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, getCredentialAssertion } 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?: Credential;\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 const assertion = getCredentialAssertion(credential);\n if (assertion['@type'] !== 'dxos.halo.credentials.Epoch') {\n return;\n }\n\n log('new epoch', { credential });\n await this._processEpoch(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 async initializeDataPipeline() {\n log('initializeDataPipeline');\n assert(this._isOpen, 'Space must be open to initialize data pipeline.');\n await this._dataPipeline.open();\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", "DataCorruptionError", "log", "STORAGE_VERSION", "schema", "emptyEchoMetadata", "version", "spaces", "created", "Date", "updated", "MetadataStore", "constructor", "_directory", "_metadata", "load", "file", "getOrCreateFile", "size", "fileLength", "stat", "dataSize", "fromBytesInt32", "read", "checksum", "data", "calculatedChecksum", "buf", "getCodecForType", "decode", "err", "error", "close", "_save", "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", "getCredentialAssertion", "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", "assertion", "getCredentialAssertion", "log", "_processEpoch", "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", "subject", "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
|
+
}
|