@dxos/echo-pipeline 0.5.0 → 0.5.1-main.2ed734f
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/index.mjs +47 -28
- package/dist/lib/browser/index.mjs.map +3 -3
- package/dist/lib/browser/meta.json +1 -1
- package/dist/lib/browser/testing/index.mjs +1 -1
- package/dist/lib/browser/testing/index.mjs.map +3 -3
- package/dist/lib/node/index.cjs +53 -34
- package/dist/lib/node/index.cjs.map +3 -3
- package/dist/lib/node/meta.json +1 -1
- package/dist/lib/node/testing/index.cjs +1 -1
- package/dist/lib/node/testing/index.cjs.map +3 -3
- package/dist/types/src/automerge/automerge-host.d.ts +1 -1
- package/dist/types/src/automerge/automerge-host.d.ts.map +1 -1
- package/dist/types/src/testing/level.d.ts +1 -1
- package/dist/types/src/testing/level.d.ts.map +1 -1
- package/package.json +30 -30
- package/src/automerge/automerge-host.test.ts +22 -13
- package/src/automerge/automerge-host.ts +45 -13
- package/src/automerge/automerge-repo.test.ts +38 -6
- package/src/testing/level.ts +2 -1
package/dist/lib/node/index.cjs
CHANGED
|
@@ -58,6 +58,7 @@ var import_async = require("@dxos/async");
|
|
|
58
58
|
var import_automerge = require("@dxos/automerge/automerge");
|
|
59
59
|
var import_automerge_repo = require("@dxos/automerge/automerge-repo");
|
|
60
60
|
var import_context = require("@dxos/context");
|
|
61
|
+
var import_invariant = require("@dxos/invariant");
|
|
61
62
|
var import_keys = require("@dxos/keys");
|
|
62
63
|
var import_log = require("@dxos/log");
|
|
63
64
|
var import_tracing = require("@dxos/tracing");
|
|
@@ -66,10 +67,10 @@ var import_context2 = require("@dxos/context");
|
|
|
66
67
|
var import_async2 = require("@dxos/async");
|
|
67
68
|
var import_automerge_repo2 = require("@dxos/automerge/automerge-repo");
|
|
68
69
|
var import_codec_protobuf = require("@dxos/codec-protobuf");
|
|
69
|
-
var
|
|
70
|
+
var import_invariant2 = require("@dxos/invariant");
|
|
70
71
|
var import_async3 = require("@dxos/async");
|
|
71
72
|
var import_automerge_repo3 = require("@dxos/automerge/automerge-repo");
|
|
72
|
-
var
|
|
73
|
+
var import_invariant3 = require("@dxos/invariant");
|
|
73
74
|
var import_log2 = require("@dxos/log");
|
|
74
75
|
var import_teleport_extension_automerge_replicator = require("@dxos/teleport-extension-automerge-replicator");
|
|
75
76
|
var import_automerge_repo_storage_indexeddb = require("@dxos/automerge/automerge-repo-storage-indexeddb");
|
|
@@ -79,7 +80,7 @@ var import_util2 = require("@dxos/util");
|
|
|
79
80
|
var import_async4 = require("@dxos/async");
|
|
80
81
|
var import_context3 = require("@dxos/context");
|
|
81
82
|
var import_debug = require("@dxos/debug");
|
|
82
|
-
var
|
|
83
|
+
var import_invariant4 = require("@dxos/invariant");
|
|
83
84
|
var import_log4 = require("@dxos/log");
|
|
84
85
|
var import_tracing2 = require("@dxos/tracing");
|
|
85
86
|
var import_echo_schema = require("@dxos/echo-schema");
|
|
@@ -203,7 +204,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
203
204
|
}
|
|
204
205
|
send(message) {
|
|
205
206
|
const peer = this._peers.get(message.targetId);
|
|
206
|
-
(0,
|
|
207
|
+
(0, import_invariant2.invariant)(peer, "Peer not found.", {
|
|
207
208
|
F: __dxlog_file,
|
|
208
209
|
L: 51,
|
|
209
210
|
S: this,
|
|
@@ -228,7 +229,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
228
229
|
syncRepo({ id, syncMessage }) {
|
|
229
230
|
const peerId = this._getPeerId(id);
|
|
230
231
|
return new import_codec_protobuf.Stream(({ next, close }) => {
|
|
231
|
-
(0,
|
|
232
|
+
(0, import_invariant2.invariant)(!this._peers.has(peerId), "Peer already connected.", {
|
|
232
233
|
F: __dxlog_file,
|
|
233
234
|
L: 73,
|
|
234
235
|
S: this,
|
|
@@ -252,7 +253,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
252
253
|
});
|
|
253
254
|
}
|
|
254
255
|
});
|
|
255
|
-
(0,
|
|
256
|
+
(0, import_invariant2.invariant)(this._isConnected, void 0, {
|
|
256
257
|
F: __dxlog_file,
|
|
257
258
|
L: 90,
|
|
258
259
|
S: this,
|
|
@@ -268,7 +269,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
268
269
|
});
|
|
269
270
|
}
|
|
270
271
|
async sendSyncMessage({ id, syncMessage }) {
|
|
271
|
-
(0,
|
|
272
|
+
(0, import_invariant2.invariant)(this._isConnected, void 0, {
|
|
272
273
|
F: __dxlog_file,
|
|
273
274
|
L: 99,
|
|
274
275
|
S: this,
|
|
@@ -281,7 +282,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
281
282
|
this.emit("message", message);
|
|
282
283
|
}
|
|
283
284
|
async getHostInfo() {
|
|
284
|
-
(0,
|
|
285
|
+
(0, import_invariant2.invariant)(this._isConnected, void 0, {
|
|
285
286
|
F: __dxlog_file,
|
|
286
287
|
L: 105,
|
|
287
288
|
S: this,
|
|
@@ -290,7 +291,7 @@ var LocalHostNetworkAdapter = class extends import_automerge_repo2.NetworkAdapte
|
|
|
290
291
|
""
|
|
291
292
|
]
|
|
292
293
|
});
|
|
293
|
-
(0,
|
|
294
|
+
(0, import_invariant2.invariant)(this.peerId, "Peer id not set.", {
|
|
294
295
|
F: __dxlog_file,
|
|
295
296
|
L: 106,
|
|
296
297
|
S: this,
|
|
@@ -329,7 +330,7 @@ var MeshNetworkAdapter = class extends import_automerge_repo3.NetworkAdapter {
|
|
|
329
330
|
send(message) {
|
|
330
331
|
const receiverId = message.targetId;
|
|
331
332
|
const extension = this._extensions.get(receiverId);
|
|
332
|
-
(0,
|
|
333
|
+
(0, import_invariant3.invariant)(extension, "Extension not found.", {
|
|
333
334
|
F: __dxlog_file2,
|
|
334
335
|
L: 38,
|
|
335
336
|
S: this,
|
|
@@ -350,7 +351,7 @@ var MeshNetworkAdapter = class extends import_automerge_repo3.NetworkAdapter {
|
|
|
350
351
|
disconnect() {
|
|
351
352
|
}
|
|
352
353
|
createExtension() {
|
|
353
|
-
(0,
|
|
354
|
+
(0, import_invariant3.invariant)(this.peerId, "Peer id not set.", {
|
|
354
355
|
F: __dxlog_file2,
|
|
355
356
|
L: 47,
|
|
356
357
|
S: this,
|
|
@@ -577,7 +578,7 @@ var AutomergeHost = class {
|
|
|
577
578
|
isRequested
|
|
578
579
|
}, {
|
|
579
580
|
F: __dxlog_file4,
|
|
580
|
-
L:
|
|
581
|
+
L: 108,
|
|
581
582
|
S: this,
|
|
582
583
|
C: (f, a) => f(...a)
|
|
583
584
|
});
|
|
@@ -591,7 +592,7 @@ var AutomergeHost = class {
|
|
|
591
592
|
documentId
|
|
592
593
|
}, {
|
|
593
594
|
F: __dxlog_file4,
|
|
594
|
-
L:
|
|
595
|
+
L: 115,
|
|
595
596
|
S: this,
|
|
596
597
|
C: (f, a) => f(...a)
|
|
597
598
|
});
|
|
@@ -605,7 +606,7 @@ var AutomergeHost = class {
|
|
|
605
606
|
documentId
|
|
606
607
|
}, {
|
|
607
608
|
F: __dxlog_file4,
|
|
608
|
-
L:
|
|
609
|
+
L: 124,
|
|
609
610
|
S: this,
|
|
610
611
|
C: (f, a) => f(...a)
|
|
611
612
|
});
|
|
@@ -622,7 +623,7 @@ var AutomergeHost = class {
|
|
|
622
623
|
isAuthorized
|
|
623
624
|
}, {
|
|
624
625
|
F: __dxlog_file4,
|
|
625
|
-
L:
|
|
626
|
+
L: 130,
|
|
626
627
|
S: this,
|
|
627
628
|
C: (f, a) => f(...a)
|
|
628
629
|
});
|
|
@@ -630,7 +631,7 @@ var AutomergeHost = class {
|
|
|
630
631
|
} catch (err) {
|
|
631
632
|
import_log.log.catch(err, void 0, {
|
|
632
633
|
F: __dxlog_file4,
|
|
633
|
-
L:
|
|
634
|
+
L: 140,
|
|
634
635
|
S: this,
|
|
635
636
|
C: (f, a) => f(...a)
|
|
636
637
|
});
|
|
@@ -678,21 +679,21 @@ var AutomergeHost = class {
|
|
|
678
679
|
//
|
|
679
680
|
// Methods for client-services.
|
|
680
681
|
//
|
|
681
|
-
async flush({
|
|
682
|
-
await Promise.all(
|
|
683
|
-
|
|
684
|
-
await (0, import_async.asyncTimeout)(this._repo.flush(documentIds), 500);
|
|
685
|
-
} catch (err) {
|
|
686
|
-
import_log.log.warn("flush error", {
|
|
687
|
-
documentIds,
|
|
688
|
-
err
|
|
689
|
-
}, {
|
|
682
|
+
async flush({ states }) {
|
|
683
|
+
await Promise.all(states?.map(async ({ heads, documentId }) => {
|
|
684
|
+
(0, import_invariant.invariant)(heads, "heads are required for flush", {
|
|
690
685
|
F: __dxlog_file4,
|
|
691
|
-
L:
|
|
686
|
+
L: 200,
|
|
692
687
|
S: this,
|
|
693
|
-
|
|
688
|
+
A: [
|
|
689
|
+
"heads",
|
|
690
|
+
"'heads are required for flush'"
|
|
691
|
+
]
|
|
694
692
|
});
|
|
695
|
-
|
|
693
|
+
const handle = this.repo.handles[documentId] ?? this._repo.find(documentId);
|
|
694
|
+
await waitForHeads(handle, heads);
|
|
695
|
+
}) ?? []);
|
|
696
|
+
await this._repo.flush(states?.map(({ documentId }) => documentId));
|
|
696
697
|
}
|
|
697
698
|
syncRepo(request) {
|
|
698
699
|
return this._clientNetwork.syncRepo(request);
|
|
@@ -715,7 +716,7 @@ var AutomergeHost = class {
|
|
|
715
716
|
deviceKey
|
|
716
717
|
}, {
|
|
717
718
|
F: __dxlog_file4,
|
|
718
|
-
L:
|
|
719
|
+
L: 230,
|
|
719
720
|
S: this,
|
|
720
721
|
C: (f, a) => f(...a)
|
|
721
722
|
});
|
|
@@ -750,6 +751,24 @@ var getSpaceKeyFromDoc = (doc) => {
|
|
|
750
751
|
}
|
|
751
752
|
return String(rawSpaceKey);
|
|
752
753
|
};
|
|
754
|
+
var waitForHeads = async (handle, heads) => {
|
|
755
|
+
await handle.whenReady();
|
|
756
|
+
const unavailableHeads = new Set(heads);
|
|
757
|
+
await import_async.Event.wrap(handle, "change").waitForCondition(() => {
|
|
758
|
+
for (const changeHash of unavailableHeads.values()) {
|
|
759
|
+
if (changeIsPresentInDoc(handle.docSync(), changeHash)) {
|
|
760
|
+
unavailableHeads.delete(changeHash);
|
|
761
|
+
}
|
|
762
|
+
}
|
|
763
|
+
if (unavailableHeads.size === 0) {
|
|
764
|
+
return true;
|
|
765
|
+
}
|
|
766
|
+
return false;
|
|
767
|
+
});
|
|
768
|
+
};
|
|
769
|
+
var changeIsPresentInDoc = (doc, changeHash) => {
|
|
770
|
+
return !!(0, import_automerge.getBackend)(doc).getChangeByHash(changeHash);
|
|
771
|
+
};
|
|
753
772
|
function _ts_decorate2(decorators, target, key, desc) {
|
|
754
773
|
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
755
774
|
if (typeof Reflect === "object" && typeof Reflect.decorate === "function")
|
|
@@ -792,7 +811,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
792
811
|
} else {
|
|
793
812
|
const existingDocHandle = await this._initDocHandle(ctx, spaceState.rootUrl);
|
|
794
813
|
const doc = existingDocHandle.docSync();
|
|
795
|
-
(0,
|
|
814
|
+
(0, import_invariant4.invariant)(doc, void 0, {
|
|
796
815
|
F: __dxlog_file5,
|
|
797
816
|
L: 74,
|
|
798
817
|
S: this,
|
|
@@ -808,7 +827,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
808
827
|
}
|
|
809
828
|
}
|
|
810
829
|
loadObjectDocument(objectId) {
|
|
811
|
-
(0,
|
|
830
|
+
(0, import_invariant4.invariant)(this._spaceRootDocHandle, void 0, {
|
|
812
831
|
F: __dxlog_file5,
|
|
813
832
|
L: 83,
|
|
814
833
|
S: this,
|
|
@@ -821,7 +840,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
821
840
|
return;
|
|
822
841
|
}
|
|
823
842
|
const spaceRootDoc = this._spaceRootDocHandle.docSync();
|
|
824
|
-
(0,
|
|
843
|
+
(0, import_invariant4.invariant)(spaceRootDoc, void 0, {
|
|
825
844
|
F: __dxlog_file5,
|
|
826
845
|
L: 88,
|
|
827
846
|
S: this,
|
|
@@ -856,7 +875,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
856
875
|
linksAwaitingLoad.forEach(([objectId]) => this._objectsPendingDocumentLoad.delete(objectId));
|
|
857
876
|
}
|
|
858
877
|
getSpaceRootDocHandle() {
|
|
859
|
-
(0,
|
|
878
|
+
(0, import_invariant4.invariant)(this._spaceRootDocHandle, void 0, {
|
|
860
879
|
F: __dxlog_file5,
|
|
861
880
|
L: 110,
|
|
862
881
|
S: this,
|
|
@@ -868,7 +887,7 @@ var AutomergeDocumentLoaderImpl = class {
|
|
|
868
887
|
return this._spaceRootDocHandle;
|
|
869
888
|
}
|
|
870
889
|
createDocumentForObject(objectId) {
|
|
871
|
-
(0,
|
|
890
|
+
(0, import_invariant4.invariant)(this._spaceRootDocHandle, void 0, {
|
|
872
891
|
F: __dxlog_file5,
|
|
873
892
|
L: 115,
|
|
874
893
|
S: this,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../src/automerge/automerge-host.ts", "../../../src/automerge/leveldb-storage-adapter.ts", "../../../src/automerge/local-host-network-adapter.ts", "../../../src/automerge/mesh-network-adapter.ts", "../../../src/automerge/migrations.ts", "../../../src/automerge/automerge-storage-adapter.ts", "../../../src/automerge/automerge-doc-loader.ts", "../../../src/automerge/reference.ts"],
|
|
4
|
-
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { asyncTimeout } from '@dxos/async';\nimport { next as automerge } from '@dxos/automerge/automerge';\nimport { Repo, type DocumentId, type PeerId, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';\nimport { type Stream } from '@dxos/codec-protobuf';\nimport { Context, type Lifecycle } from '@dxos/context';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n type FlushRequest,\n type HostInfo,\n type SyncRepoRequest,\n type SyncRepoResponse,\n} from '@dxos/protocols/proto/dxos/echo/service';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { type AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';\nimport { trace } from '@dxos/tracing';\nimport { ComplexMap, ComplexSet, defaultMap, mapValues } from '@dxos/util';\n\nimport { LevelDBStorageAdapter, type StorageCallbacks } from './leveldb-storage-adapter';\nimport { LocalHostNetworkAdapter } from './local-host-network-adapter';\nimport { MeshNetworkAdapter } from './mesh-network-adapter';\nimport { levelMigration } from './migrations';\nimport { type SubLevelDB } from './types';\n\n// TODO: Remove\nexport type { DocumentId };\n\nexport type AutomergeHostParams = {\n db: SubLevelDB;\n /**\n * For migration purposes.\n */\n directory?: Directory;\n storageCallbacks?: StorageCallbacks;\n};\n\n@trace.resource()\nexport class AutomergeHost {\n private readonly _ctx = new Context();\n private readonly _directory?: Directory;\n private readonly _db: SubLevelDB;\n private readonly _storageCallbacks?: StorageCallbacks;\n\n private _repo!: Repo;\n private _meshNetwork!: MeshNetworkAdapter;\n private _clientNetwork!: LocalHostNetworkAdapter;\n private _storage!: StorageAdapterInterface & Lifecycle;\n\n @trace.info()\n private _peerId!: string;\n\n /**\n * spaceKey -> deviceKey[]\n */\n private readonly _authorizedDevices = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n public _requestedDocs = new Set<string>();\n\n constructor({ directory, db, storageCallbacks }: AutomergeHostParams) {\n this._directory = directory;\n this._db = db;\n this._storageCallbacks = storageCallbacks;\n }\n\n async open() {\n // TODO(mykola): remove this before 0.6 release.\n this._directory && (await levelMigration({ db: this._db, directory: this._directory }));\n this._storage = new LevelDBStorageAdapter({\n db: this._db,\n callbacks: this._storageCallbacks,\n });\n await this._storage.open?.();\n this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;\n\n this._meshNetwork = new MeshNetworkAdapter();\n this._clientNetwork = new LocalHostNetworkAdapter();\n this._repo = new Repo({\n peerId: this._peerId as PeerId,\n network: [this._clientNetwork, this._meshNetwork],\n storage: this._storage,\n\n // TODO(dmaretskyi): Share based on HALO permissions and space affinity.\n // Hosts, running in the worker, don't share documents unless requested by other peers.\n sharePolicy: async (peerId /* device key */, documentId /* space key */) => {\n if (peerId.startsWith('client-')) {\n return false; // Only send docs to clients if they are requested.\n }\n\n if (!documentId) {\n return false;\n }\n\n const doc = this._repo.handles[documentId]?.docSync();\n if (!doc) {\n const isRequested = this._requestedDocs.has(`automerge:${documentId}`);\n log('doc share policy check', { peerId, documentId, isRequested });\n return isRequested;\n }\n\n try {\n const spaceKey = getSpaceKeyFromDoc(doc);\n if (!spaceKey) {\n log('space key not found for share policy check', { peerId, documentId });\n return false;\n }\n\n const authorizedDevices = this._authorizedDevices.get(PublicKey.from(spaceKey));\n\n // TODO(mykola): Hack, stop abusing `peerMetadata` field.\n const deviceKeyHex = (this.repo.peerMetadataByPeerId[peerId] as any)?.dxos_deviceKey;\n if (!deviceKeyHex) {\n log('device key not found for share policy check', { peerId, documentId });\n return false;\n }\n const deviceKey = PublicKey.from(deviceKeyHex);\n\n const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;\n log('share policy check', {\n localPeer: this._peerId,\n remotePeer: peerId,\n documentId,\n deviceKey,\n spaceKey,\n isAuthorized,\n });\n return isAuthorized;\n } catch (err) {\n log.catch(err);\n return false;\n }\n },\n });\n this._clientNetwork.ready();\n this._meshNetwork.ready();\n\n await this._clientNetwork.whenConnected();\n }\n\n async close() {\n await this._storage.close?.();\n await this._clientNetwork.close();\n await this._ctx.dispose();\n }\n\n get repo(): Repo {\n return this._repo;\n }\n\n @trace.info({ depth: null })\n private _automergeDocs() {\n return mapValues(this._repo.handles, (handle) => ({\n state: handle.state,\n hasDoc: !!handle.docSync(),\n heads: handle.docSync() ? automerge.getHeads(handle.docSync()) : null,\n data:\n handle.docSync() &&\n mapValues(handle.docSync(), (value, key) => {\n try {\n switch (key) {\n case 'access':\n case 'links':\n return value;\n case 'objects':\n return Object.keys(value as any);\n default:\n return `${value}`;\n }\n } catch (err) {\n return `${err}`;\n }\n }),\n }));\n }\n\n @trace.info({ depth: null })\n private _automergePeers() {\n return this._repo.peers;\n }\n\n //\n // Methods for client-services.\n //\n @trace.span({ showInBrowserTimeline: true })\n async flush({ documentIds }: FlushRequest): Promise<void> {\n // Note: Wait for all requested documents to be loaded/synced from thin-client.\n await Promise.all(documentIds?.map((id) => this._repo.find(id as DocumentId).whenReady()) ?? []);\n\n // TODO(dmaretskyi): Workaround until the flush issue gets resolved.\n try {\n await asyncTimeout(this._repo.flush(documentIds as DocumentId[]), 500);\n } catch (err) {\n log.warn('flush error', { documentIds, err });\n }\n }\n\n syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {\n return this._clientNetwork.syncRepo(request);\n }\n\n sendSyncMessage(request: SyncRepoRequest): Promise<void> {\n return this._clientNetwork.sendSyncMessage(request);\n }\n\n async getHostInfo(): Promise<HostInfo> {\n return this._clientNetwork.getHostInfo();\n }\n\n //\n // Mesh replication.\n //\n\n createExtension(): AutomergeReplicator {\n return this._meshNetwork.createExtension();\n }\n\n authorizeDevice(spaceKey: PublicKey, deviceKey: PublicKey) {\n log('authorizeDevice', { spaceKey, deviceKey });\n defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey.hash)).add(deviceKey);\n }\n}\n\nexport const getSpaceKeyFromDoc = (doc: any): string | null => {\n // experimental_spaceKey is set on old documents, new ones are created with doc.access.spaceKey\n const rawSpaceKey = doc.access?.spaceKey ?? doc.experimental_spaceKey;\n if (rawSpaceKey == null) {\n return null;\n }\n\n return String(rawSpaceKey);\n};\n", "//\n// Copyright 2024 DXOS.org\n// s\n\nimport { type MixedEncoding } from 'level-transcoder';\n\nimport { type StorageAdapterInterface, type Chunk, type StorageKey } from '@dxos/automerge/automerge-repo';\nimport { LifecycleState, Resource } from '@dxos/context';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { type BatchLevel, type SubLevelDB } from './types';\n\nexport type LevelDBStorageAdapterParams = {\n db: SubLevelDB;\n callbacks?: StorageCallbacks;\n};\n\nexport type BeforeSaveParams = { path: StorageKey; batch: BatchLevel };\n\nexport interface StorageCallbacks {\n beforeSave(params: BeforeSaveParams): MaybePromise<void>;\n afterSave(path: StorageKey): MaybePromise<void>;\n}\n\nexport class LevelDBStorageAdapter extends Resource implements StorageAdapterInterface {\n constructor(private readonly _params: LevelDBStorageAdapterParams) {\n super();\n }\n\n async load(keyArray: StorageKey): Promise<Uint8Array | undefined> {\n try {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n // TODO(mykola): this should be an error.\n return undefined;\n }\n return await this._params.db.get<StorageKey, Uint8Array>(keyArray, { ...encodingOptions });\n } catch (err: any) {\n if (isLevelDbNotFoundError(err)) {\n return undefined;\n }\n throw err;\n }\n }\n\n async save(keyArray: StorageKey, binary: Uint8Array): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n const batch = this._params.db.batch();\n\n await this._params.callbacks?.beforeSave?.({ path: keyArray, batch });\n batch.put<StorageKey, Uint8Array>(keyArray, Buffer.from(binary), {\n ...encodingOptions,\n });\n await batch.write();\n\n await this._params.callbacks?.afterSave?.(keyArray);\n }\n\n async remove(keyArray: StorageKey): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n await this._params.db.del<StorageKey>(keyArray, { ...encodingOptions });\n }\n\n async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return [];\n }\n const result: Chunk[] = [];\n for await (const [key, value] of this._params.db.iterator<StorageKey, Uint8Array>({\n gte: keyPrefix,\n lte: [...keyPrefix, '\\uffff'],\n ...encodingOptions,\n })) {\n result.push({\n key,\n data: value,\n });\n }\n return result;\n }\n\n async removeRange(keyPrefix: StorageKey): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n const batch = this._params.db.batch();\n\n for await (const [key] of this._params.db.iterator<StorageKey, Uint8Array>({\n gte: keyPrefix,\n lte: [...keyPrefix, '\\uffff'],\n ...encodingOptions,\n })) {\n batch.del<StorageKey>(key, { ...encodingOptions });\n }\n await batch.write();\n }\n}\n\nconst keyEncoder: MixedEncoding<StorageKey, Uint8Array, StorageKey> = {\n encode: (key: StorageKey): Uint8Array =>\n Buffer.from(key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-')),\n decode: (key: Uint8Array): StorageKey =>\n Buffer.from(key)\n .toString()\n .split('-')\n .map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%')),\n};\n\nexport const encodingOptions = {\n keyEncoding: keyEncoder,\n valueEncoding: 'buffer',\n};\n\nconst isLevelDbNotFoundError = (err: any): boolean => err.code === 'LEVEL_NOT_FOUND';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { NetworkAdapter, type Message, type PeerId, cbor } from '@dxos/automerge/automerge-repo';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { type HostInfo, type SyncRepoRequest, type SyncRepoResponse } from '@dxos/protocols/proto/dxos/echo/service';\n\ntype ClientSyncState = {\n connected: boolean;\n send: (message: Message) => void;\n disconnect: () => void;\n};\n\n/**\n * Used to replicate with apps running on the same device.\n */\nexport class LocalHostNetworkAdapter extends NetworkAdapter {\n private readonly _peers: Map<PeerId, ClientSyncState> = new Map();\n\n /**\n * Emits `ready` event. That signals to `Repo` that it can start using the adapter.\n */\n ready() {\n // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition\n // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.\n this.emit('ready', {\n network: this,\n });\n }\n\n private readonly _connected = new Trigger();\n private _isConnected: boolean = false;\n\n /**\n * Called by `Repo` to connect to the network.\n *\n * @param peerId Our peer Id.\n */\n override connect(peerId: PeerId): void {\n this.peerId = peerId;\n this._isConnected = true;\n this._connected.wake();\n // No-op. Client always connects first\n }\n\n override send(message: Message): void {\n const peer = this._peers.get(message.targetId);\n invariant(peer, 'Peer not found.');\n peer.send(message);\n }\n\n async close() {\n this._peers.forEach((peer) => peer.disconnect());\n this.emit('close');\n }\n\n override disconnect(): void {\n // TODO(mykola): `disconnect` is not used anywhere in `Repo` from `@automerge/automerge-repo`. Should we remove it?\n // No-op\n }\n\n async whenConnected(): Promise<void> {\n await this._connected.wait({ timeout: 10_000 });\n }\n\n syncRepo({ id, syncMessage }: SyncRepoRequest): Stream<SyncRepoResponse> {\n const peerId = this._getPeerId(id);\n\n return new Stream(({ next, close }) => {\n invariant(!this._peers.has(peerId), 'Peer already connected.');\n this._peers.set(peerId, {\n connected: true,\n send: (message) => {\n next({\n syncMessage: cbor.encode(message),\n });\n },\n disconnect: () => {\n this._peers.delete(peerId);\n close();\n this.emit('peer-disconnected', {\n peerId,\n });\n },\n });\n\n invariant(this._isConnected);\n this.emit('peer-candidate', {\n peerMetadata: {},\n peerId,\n });\n });\n }\n\n async sendSyncMessage({ id, syncMessage }: SyncRepoRequest): Promise<void> {\n invariant(this._isConnected);\n const message = cbor.decode(syncMessage!) as Message;\n this.emit('message', message);\n }\n\n async getHostInfo(): Promise<HostInfo> {\n invariant(this._isConnected);\n invariant(this.peerId, 'Peer id not set.');\n return {\n peerId: this.peerId,\n };\n }\n\n private _getPeerId(id: string): PeerId {\n return id as PeerId;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { NetworkAdapter, type Message, type PeerId, cbor } from '@dxos/automerge/automerge-repo';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type PeerInfo } from '@dxos/protocols/proto/dxos/mesh/teleport/automerge';\nimport { AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';\n\n/**\n * Used to replicate with other peers over the network.\n */\nexport class MeshNetworkAdapter extends NetworkAdapter {\n private readonly _extensions: Map<string, AutomergeReplicator> = new Map();\n private _connected = new Trigger();\n\n /**\n * Emits `ready` event. That signals to `Repo` that it can start using the adapter.\n */\n ready() {\n // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition\n // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.\n this.emit('ready', {\n network: this,\n });\n }\n\n override connect(peerId: PeerId): void {\n this.peerId = peerId;\n this._connected.wake();\n }\n\n override send(message: Message): void {\n const receiverId = message.targetId;\n const extension = this._extensions.get(receiverId);\n invariant(extension, 'Extension not found.');\n extension.sendSyncMessage({ payload: cbor.encode(message) }).catch((err) => log.catch(err));\n }\n\n override disconnect(): void {\n // No-op\n }\n\n createExtension(): AutomergeReplicator {\n invariant(this.peerId, 'Peer id not set.');\n\n let peerInfo: PeerInfo;\n const extension = new AutomergeReplicator(\n {\n peerId: this.peerId,\n },\n {\n onStartReplication: async (info, remotePeerId /** Teleport ID */) => {\n await this._connected.wait();\n\n // Note: We store only one extension per peer.\n // There can be a case where two connected peers have more than one teleport connection between them\n // and each of them uses different teleport connections to send messages.\n // It works because we receive messages from all teleport connections and Automerge Repo dedup them.\n // TODO(mykola): Use only one teleport connection per peer.\n\n // TODO(dmaretskyi): Critical bug.\n // - two peers get connected via swarm 1\n // - they get connected via swarm 2\n // - swarm 1 gets disconnected\n // - automerge repo thinks that peer 2 got disconnected even though swarm 2 is still active\n\n log('onStartReplication', { id: info.id, thisPeerId: this.peerId, remotePeerId: remotePeerId.toHex() });\n if (!this._extensions.has(info.id)) {\n peerInfo = info;\n // TODO(mykola): Fix race condition?\n this._extensions.set(info.id, extension);\n\n log('peer-candidate', { id: info.id, thisPeerId: this.peerId, remotePeerId: remotePeerId.toHex() });\n this.emit('peer-candidate', {\n // TODO(mykola): Hack, stop abusing `peerMetadata` field.\n peerMetadata: {\n dxos_deviceKey: remotePeerId.toHex(),\n } as any,\n peerId: info.id as PeerId,\n });\n }\n },\n onSyncMessage: async ({ payload }) => {\n if (!peerInfo) {\n return;\n }\n const message = cbor.decode(payload) as Message;\n // Note: automerge Repo dedup messages.\n this.emit('message', message);\n },\n onClose: async () => {\n if (!peerInfo) {\n return;\n }\n this.emit('peer-disconnected', {\n peerId: peerInfo.id as PeerId,\n });\n this._extensions.delete(peerInfo.id);\n },\n },\n );\n return extension;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type StorageKey } from '@dxos/automerge/automerge-repo';\nimport { IndexedDBStorageAdapter } from '@dxos/automerge/automerge-repo-storage-indexeddb';\nimport { log } from '@dxos/log';\nimport { StorageType, type Directory } from '@dxos/random-access-storage';\n\nimport { AutomergeStorageAdapter } from './automerge-storage-adapter';\nimport { encodingOptions } from './leveldb-storage-adapter';\nimport { type SubLevelDB } from './types';\n\nexport const levelMigration = async ({ db, directory }: { db: SubLevelDB; directory: Directory }) => {\n // Note: Make automigration from previous storage to leveldb here.\n const isNewLevel = !(await db\n .iterator<StorageKey, Uint8Array>({\n ...encodingOptions,\n })\n .next());\n\n if (!isNewLevel) {\n return;\n }\n\n const oldStorageAdapter =\n directory.type === StorageType.IDB\n ? new IndexedDBStorageAdapter(directory.path, 'data')\n : new AutomergeStorageAdapter(directory);\n\n const chunks = await oldStorageAdapter.loadRange([]);\n if (chunks.length === 0) {\n return;\n }\n const batch = db.batch();\n log.info('found chunks on old storage adapter', { chunks: chunks.length });\n for (const { key, data } of await oldStorageAdapter.loadRange([])) {\n data && batch.put<StorageKey, Uint8Array>(key, data, { ...encodingOptions });\n }\n await batch.write();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Chunk, type StorageKey, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { arrayToBuffer, bufferToArray } from '@dxos/util';\n\nexport class AutomergeStorageAdapter implements StorageAdapterInterface {\n // TODO(mykola): Hack for restricting automerge Repo to access storage if Host is `closed`.\n // Automerge Repo do not have any lifetime management.\n private _state: 'opened' | 'closed' = 'opened';\n\n constructor(private readonly _directory: Directory) {}\n\n async load(key: StorageKey): Promise<Uint8Array | undefined> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n const { size } = await file.stat();\n if (!size || size === 0) {\n return undefined;\n }\n const buffer = await file.read(0, size);\n return bufferToArray(buffer);\n }\n\n async save(key: StorageKey, data: Uint8Array): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n await file.write(0, arrayToBuffer(data));\n await file.truncate?.(data.length);\n\n await file.flush?.();\n }\n\n async remove(key: StorageKey): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n // TODO(dmaretskyi): Better deletion.\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n await file.destroy();\n }\n\n async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {\n if (this._state !== 'opened') {\n return [];\n }\n const filename = this._getFilename(keyPrefix);\n const entries = await this._directory.list();\n return Promise.all(\n entries\n .filter((entry) => entry.startsWith(filename))\n .map(async (entry): Promise<Chunk> => {\n const file = this._directory.getOrCreateFile(entry);\n const { size } = await file.stat();\n const buffer = await file.read(0, size);\n return {\n key: this._getKeyFromFilename(entry),\n data: bufferToArray(buffer),\n };\n }),\n );\n }\n\n async removeRange(keyPrefix: StorageKey): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(keyPrefix);\n const entries = await this._directory.list();\n await Promise.all(\n entries\n .filter((entry) => entry.startsWith(filename))\n .map(async (entry): Promise<void> => {\n const file = this._directory.getOrCreateFile(entry);\n await file.destroy();\n }),\n );\n }\n\n async close(): Promise<void> {\n this._state = 'closed';\n }\n\n private _getFilename(key: StorageKey): string {\n return key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-');\n }\n\n private _getKeyFromFilename(filename: string): StorageKey {\n return filename.split('-').map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%'));\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type DocHandle, type AutomergeUrl, type DocumentId, type Repo } from '@dxos/automerge/automerge-repo';\nimport { cancelWithContext, type Context } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type SpaceState, type SpaceDoc } from './types';\n\ntype SpaceDocumentLinks = SpaceDoc['links'];\n\nexport interface AutomergeDocumentLoader {\n onObjectDocumentLoaded: Event<ObjectDocumentLoaded>;\n\n getAllHandles(): DocHandle<SpaceDoc>[];\n\n loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void>;\n loadObjectDocument(objectId: string): void;\n getSpaceRootDocHandle(): DocHandle<SpaceDoc>;\n createDocumentForObject(objectId: string): DocHandle<SpaceDoc>;\n onObjectLinksUpdated(links: SpaceDocumentLinks): void;\n onObjectBoundToDocument(handle: DocHandle<SpaceDoc>, objectId: string): void;\n\n /**\n * @returns objectIds for which we had document handles or were loading one.\n */\n clearHandleReferences(): string[];\n}\n\n/**\n * Manages object <-> docHandle binding and automerge document loading.\n */\n@trace.resource()\nexport class AutomergeDocumentLoaderImpl implements AutomergeDocumentLoader {\n private _spaceRootDocHandle: DocHandle<SpaceDoc> | null = null;\n /**\n * An object id pointer to a handle of the document where the object is stored inline.\n */\n private readonly _objectDocumentHandles = new Map<string, DocHandle<SpaceDoc>>();\n /**\n * If object was requested via loadObjectDocument but root document links weren't updated yet\n * loading will be triggered in onObjectLinksUpdated callback.\n */\n private readonly _objectsPendingDocumentLoad = new Set<string>();\n\n public readonly onObjectDocumentLoaded = new Event<ObjectDocumentLoaded>();\n\n constructor(\n private readonly _spaceKey: PublicKey,\n private readonly _repo: Repo,\n ) {}\n\n getAllHandles(): DocHandle<SpaceDoc>[] {\n return [...new Set(this._objectDocumentHandles.values())];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n public async loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void> {\n if (this._spaceRootDocHandle != null) {\n return;\n }\n if (!spaceState.rootUrl) {\n log.error('Database opened with no rootUrl', { spaceKey: this._spaceKey });\n this._createContextBoundSpaceRootDocument(ctx);\n } else {\n const existingDocHandle = await this._initDocHandle(ctx, spaceState.rootUrl);\n const doc = existingDocHandle.docSync();\n invariant(doc);\n if (doc.access == null) {\n this._initDocAccess(existingDocHandle);\n }\n this._spaceRootDocHandle = existingDocHandle;\n }\n }\n\n public loadObjectDocument(objectId: string) {\n invariant(this._spaceRootDocHandle);\n if (this._objectDocumentHandles.has(objectId) || this._objectsPendingDocumentLoad.has(objectId)) {\n return;\n }\n const spaceRootDoc = this._spaceRootDocHandle.docSync();\n invariant(spaceRootDoc);\n const documentUrl = (spaceRootDoc.links ?? {})[objectId];\n if (documentUrl == null) {\n this._objectsPendingDocumentLoad.add(objectId);\n log.info('loading delayed until object links are initialized', { objectId });\n return;\n }\n this._loadLinkedObjects({ [objectId]: documentUrl });\n }\n\n public onObjectLinksUpdated(links: SpaceDocumentLinks) {\n if (!links) {\n return;\n }\n const linksAwaitingLoad = Object.entries(links).filter(([objectId]) =>\n this._objectsPendingDocumentLoad.has(objectId),\n );\n this._loadLinkedObjects(Object.fromEntries(linksAwaitingLoad));\n linksAwaitingLoad.forEach(([objectId]) => this._objectsPendingDocumentLoad.delete(objectId));\n }\n\n public getSpaceRootDocHandle(): DocHandle<SpaceDoc> {\n invariant(this._spaceRootDocHandle);\n return this._spaceRootDocHandle;\n }\n\n public createDocumentForObject(objectId: string): DocHandle<SpaceDoc> {\n invariant(this._spaceRootDocHandle);\n const spaceDocHandle = this._repo.create<SpaceDoc>();\n this._initDocAccess(spaceDocHandle);\n this.onObjectBoundToDocument(spaceDocHandle, objectId);\n this._spaceRootDocHandle.change((newDoc: SpaceDoc) => {\n newDoc.links ??= {};\n newDoc.links[objectId] = spaceDocHandle.url;\n });\n return spaceDocHandle;\n }\n\n public onObjectBoundToDocument(handle: DocHandle<SpaceDoc>, objectId: string) {\n this._objectDocumentHandles.set(objectId, handle);\n }\n\n public clearHandleReferences(): string[] {\n const objectsWithHandles = [...this._objectDocumentHandles.keys()];\n this._objectDocumentHandles.clear();\n this._spaceRootDocHandle = null;\n return objectsWithHandles;\n }\n\n private _loadLinkedObjects(links: SpaceDocumentLinks) {\n if (!links) {\n return;\n }\n for (const [objectId, automergeUrl] of Object.entries(links)) {\n const logMeta = { objectId, automergeUrl };\n const objectDocumentHandle = this._objectDocumentHandles.get(objectId);\n if (objectDocumentHandle != null && objectDocumentHandle.url !== automergeUrl) {\n log.warn('object already inlined in a different document, ignoring the link', {\n ...logMeta,\n actualDocumentUrl: objectDocumentHandle.url,\n });\n continue;\n }\n if (objectDocumentHandle?.url === automergeUrl) {\n log.warn('object document was already loaded', logMeta);\n continue;\n }\n const handle = this._repo.find<SpaceDoc>(automergeUrl as DocumentId);\n log.debug('document loading triggered', logMeta);\n this._objectDocumentHandles.set(objectId, handle);\n void this._createObjectOnDocumentLoad(handle, objectId);\n }\n }\n\n private async _initDocHandle(ctx: Context, url: string) {\n const docHandle = this._repo.find<SpaceDoc>(url as DocumentId);\n while (true) {\n try {\n await warnAfterTimeout(5_000, 'Automerge root doc load timeout (AutomergeDb)', async () => {\n await cancelWithContext(ctx, docHandle.whenReady()); // TODO(dmaretskyi): Temporary 5s timeout for debugging.\n });\n break;\n } catch (err) {\n if (`${err}`.includes('Timeout')) {\n log.info('wraparound', { id: docHandle.documentId, state: docHandle.state });\n continue;\n }\n\n throw err;\n }\n }\n\n if (docHandle.state === 'unavailable') {\n throw new Error('Automerge document is unavailable');\n }\n\n return docHandle;\n }\n\n private _createContextBoundSpaceRootDocument(ctx: Context) {\n const docHandle = this._repo.create<SpaceDoc>();\n this._spaceRootDocHandle = docHandle;\n ctx.onDispose(() => {\n docHandle.delete();\n this._spaceRootDocHandle = null;\n });\n }\n\n private _initDocAccess(handle: DocHandle<SpaceDoc>) {\n handle.change((newDoc: SpaceDoc) => {\n newDoc.access ??= { spaceKey: this._spaceKey.toHex() };\n newDoc.access.spaceKey = this._spaceKey.toHex();\n });\n }\n\n private async _createObjectOnDocumentLoad(handle: DocHandle<SpaceDoc>, objectId: string) {\n try {\n await handle.doc(['ready']);\n const logMeta = { objectId, docUrl: handle.url };\n if (this.onObjectDocumentLoaded.listenerCount() === 0) {\n log.info('document loaded after all listeners were removed', logMeta);\n return;\n }\n const objectDocHandle = this._objectDocumentHandles.get(objectId);\n if (objectDocHandle?.url !== handle.url) {\n log.warn('object was rebound while a document was loading, discarding handle', logMeta);\n return;\n }\n this.onObjectDocumentLoaded.emit({ handle, objectId });\n } catch (err) {\n const shouldRetryLoading = this.onObjectDocumentLoaded.listenerCount() > 0;\n log.warn('failed to load a document', {\n objectId,\n automergeUrl: handle.url,\n retryLoading: shouldRetryLoading,\n err,\n });\n if (shouldRetryLoading) {\n await this._createObjectOnDocumentLoad(handle, objectId);\n }\n }\n }\n}\n\nexport interface ObjectDocumentLoaded {\n handle: DocHandle<SpaceDoc>;\n objectId: string;\n}\n\nexport interface DocumentChanges {\n createdObjectIds: string[];\n updatedObjectIds: string[];\n objectsToRebind: string[];\n linkedDocuments: {\n [echoId: string]: AutomergeUrl;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Reference } from '@dxos/echo-schema';\n\nexport const REFERENCE_TYPE_TAG = 'dxos.echo.model.document.Reference';\n\n/**\n * Reference as it is stored in Automerge document.\n */\nexport type EncodedReferenceObject = {\n '@type': typeof REFERENCE_TYPE_TAG;\n itemId: string | null;\n protocol: string | null;\n host: string | null;\n};\n\nexport const encodeReference = (reference: Reference): EncodedReferenceObject => ({\n '@type': REFERENCE_TYPE_TAG,\n // NOTE: Automerge do not support undefined values, so we need to use null instead.\n itemId: reference.itemId ?? null,\n protocol: reference.protocol ?? null,\n host: reference.host ?? null,\n});\n\nexport const decodeReference = (value: any) =>\n new Reference(value.itemId, value.protocol ?? undefined, value.host ?? undefined);\n\nexport const isEncodedReferenceObject = (value: any): value is EncodedReferenceObject =>\n typeof value === 'object' && value !== null && value['@type'] === REFERENCE_TYPE_TAG;\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["import_context", "import_async", "import_automerge_repo", "import_invariant", "import_log", "import_util", "import_tracing", "LevelDBStorageAdapter", "Resource", "constructor", "_params", "load", "keyArray", "_lifecycleState", "LifecycleState", "OPEN", "undefined", "db", "get", "encodingOptions", "err", "isLevelDbNotFoundError", "save", "binary", "batch", "callbacks", "beforeSave", "path", "put", "Buffer", "from", "write", "afterSave", "remove", "del", "loadRange", "keyPrefix", "result", "key", "value", "iterator", "gte", "lte", "push", "data", "removeRange", "keyEncoder", "encode", "map", "k", "replaceAll", "join", "decode", "toString", "split", "keyEncoding", "valueEncoding", "code", "LocalHostNetworkAdapter", "NetworkAdapter", "_peers", "Map", "_connected", "Trigger", "_isConnected", "ready", "emit", "network", "connect", "peerId", "wake", "send", "message", "peer", "targetId", "invariant", "close", "forEach", "disconnect", "whenConnected", "wait", "timeout", "syncRepo", "id", "syncMessage", "_getPeerId", "Stream", "next", "has", "set", "connected", "cbor", "delete", "peerMetadata", "sendSyncMessage", "getHostInfo", "MeshNetworkAdapter", "_extensions", "receiverId", "extension", "payload", "catch", "log", "createExtension", "peerInfo", "AutomergeReplicator", "onStartReplication", "info", "remotePeerId", "thisPeerId", "toHex", "dxos_deviceKey", "onSyncMessage", "onClose", "AutomergeStorageAdapter", "_directory", "_state", "filename", "_getFilename", "file", "getOrCreateFile", "size", "stat", "buffer", "read", "bufferToArray", "arrayToBuffer", "truncate", "length", "flush", "destroy", "entries", "list", "Promise", "all", "filter", "entry", "startsWith", "_getKeyFromFilename", "levelMigration", "directory", "isNewLevel", "oldStorageAdapter", "type", "StorageType", "IDB", "IndexedDBStorageAdapter", "chunks", "AutomergeHost", "storageCallbacks", "_ctx", "Context", "ComplexMap", "PublicKey", "hash", "_requestedDocs", "Set", "_db", "_storageCallbacks", "open", "_storage", "_peerId", "random", "_meshNetwork", "_clientNetwork", "_repo", "Repo", "storage", "sharePolicy", "documentId", "doc", "handles", "docSync", "isRequested", "spaceKey", "getSpaceKeyFromDoc", "authorizedDevices", "_authorizedDevices", "deviceKeyHex", "repo", "peerMetadataByPeerId", "deviceKey", "isAuthorized", "localPeer", "remotePeer", "dispose", "_automergeDocs", "mapValues", "handle", "state", "hasDoc", "heads", "automerge", "getHeads", "Object", "keys", "_automergePeers", "peers", "
|
|
4
|
+
"sourcesContent": ["//\n// Copyright 2023 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type Doc, next as automerge, getBackend, type Heads } from '@dxos/automerge/automerge';\nimport {\n type DocHandle,\n Repo,\n type DocumentId,\n type PeerId,\n type StorageAdapterInterface,\n type DocHandleChangePayload,\n} from '@dxos/automerge/automerge-repo';\nimport { type Stream } from '@dxos/codec-protobuf';\nimport { Context, type Lifecycle } from '@dxos/context';\nimport { invariant } from '@dxos/invariant';\nimport { PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport {\n type FlushRequest,\n type HostInfo,\n type SyncRepoRequest,\n type SyncRepoResponse,\n} from '@dxos/protocols/proto/dxos/echo/service';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { type AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';\nimport { trace } from '@dxos/tracing';\nimport { ComplexMap, ComplexSet, defaultMap, mapValues } from '@dxos/util';\n\nimport { LevelDBStorageAdapter, type StorageCallbacks } from './leveldb-storage-adapter';\nimport { LocalHostNetworkAdapter } from './local-host-network-adapter';\nimport { MeshNetworkAdapter } from './mesh-network-adapter';\nimport { levelMigration } from './migrations';\nimport { type SpaceDoc, type SubLevelDB } from './types';\n\n// TODO: Remove\nexport type { DocumentId };\n\nexport type AutomergeHostParams = {\n db: SubLevelDB;\n /**\n * For migration purposes.\n */\n directory?: Directory;\n storageCallbacks?: StorageCallbacks;\n};\n\n@trace.resource()\nexport class AutomergeHost {\n private readonly _ctx = new Context();\n private readonly _directory?: Directory;\n private readonly _db: SubLevelDB;\n private readonly _storageCallbacks?: StorageCallbacks;\n\n private _repo!: Repo;\n private _meshNetwork!: MeshNetworkAdapter;\n private _clientNetwork!: LocalHostNetworkAdapter;\n private _storage!: StorageAdapterInterface & Lifecycle;\n\n @trace.info()\n private _peerId!: string;\n\n /**\n * spaceKey -> deviceKey[]\n */\n private readonly _authorizedDevices = new ComplexMap<PublicKey, ComplexSet<PublicKey>>(PublicKey.hash);\n\n public _requestedDocs = new Set<string>();\n\n constructor({ directory, db, storageCallbacks }: AutomergeHostParams) {\n this._directory = directory;\n this._db = db;\n this._storageCallbacks = storageCallbacks;\n }\n\n async open() {\n // TODO(mykola): remove this before 0.6 release.\n this._directory && (await levelMigration({ db: this._db, directory: this._directory }));\n this._storage = new LevelDBStorageAdapter({\n db: this._db,\n callbacks: this._storageCallbacks,\n });\n await this._storage.open?.();\n this._peerId = `host-${PublicKey.random().toHex()}` as PeerId;\n\n this._meshNetwork = new MeshNetworkAdapter();\n this._clientNetwork = new LocalHostNetworkAdapter();\n this._repo = new Repo({\n peerId: this._peerId as PeerId,\n network: [this._clientNetwork, this._meshNetwork],\n storage: this._storage,\n\n // TODO(dmaretskyi): Share based on HALO permissions and space affinity.\n // Hosts, running in the worker, don't share documents unless requested by other peers.\n sharePolicy: async (peerId /* device key */, documentId /* space key */) => {\n if (peerId.startsWith('client-')) {\n return false; // Only send docs to clients if they are requested.\n }\n\n if (!documentId) {\n return false;\n }\n\n const doc = this._repo.handles[documentId]?.docSync();\n if (!doc) {\n const isRequested = this._requestedDocs.has(`automerge:${documentId}`);\n log('doc share policy check', { peerId, documentId, isRequested });\n return isRequested;\n }\n\n try {\n const spaceKey = getSpaceKeyFromDoc(doc);\n if (!spaceKey) {\n log('space key not found for share policy check', { peerId, documentId });\n return false;\n }\n\n const authorizedDevices = this._authorizedDevices.get(PublicKey.from(spaceKey));\n\n // TODO(mykola): Hack, stop abusing `peerMetadata` field.\n const deviceKeyHex = (this.repo.peerMetadataByPeerId[peerId] as any)?.dxos_deviceKey;\n if (!deviceKeyHex) {\n log('device key not found for share policy check', { peerId, documentId });\n return false;\n }\n const deviceKey = PublicKey.from(deviceKeyHex);\n\n const isAuthorized = authorizedDevices?.has(deviceKey) ?? false;\n log('share policy check', {\n localPeer: this._peerId,\n remotePeer: peerId,\n documentId,\n deviceKey,\n spaceKey,\n isAuthorized,\n });\n return isAuthorized;\n } catch (err) {\n log.catch(err);\n return false;\n }\n },\n });\n this._clientNetwork.ready();\n this._meshNetwork.ready();\n\n await this._clientNetwork.whenConnected();\n }\n\n async close() {\n await this._storage.close?.();\n await this._clientNetwork.close();\n await this._ctx.dispose();\n }\n\n get repo(): Repo {\n return this._repo;\n }\n\n @trace.info({ depth: null })\n private _automergeDocs() {\n return mapValues(this._repo.handles, (handle) => ({\n state: handle.state,\n hasDoc: !!handle.docSync(),\n heads: handle.docSync() ? automerge.getHeads(handle.docSync()) : null,\n data:\n handle.docSync() &&\n mapValues(handle.docSync(), (value, key) => {\n try {\n switch (key) {\n case 'access':\n case 'links':\n return value;\n case 'objects':\n return Object.keys(value as any);\n default:\n return `${value}`;\n }\n } catch (err) {\n return `${err}`;\n }\n }),\n }));\n }\n\n @trace.info({ depth: null })\n private _automergePeers() {\n return this._repo.peers;\n }\n\n //\n // Methods for client-services.\n //\n @trace.span({ showInBrowserTimeline: true })\n async flush({ states }: FlushRequest): Promise<void> {\n // Note: Wait for all requested documents to be loaded/synced from thin-client.\n await Promise.all(\n states?.map(async ({ heads, documentId }) => {\n invariant(heads, 'heads are required for flush');\n const handle = this.repo.handles[documentId as DocumentId] ?? this._repo.find(documentId as DocumentId);\n await waitForHeads(handle, heads);\n }) ?? [],\n );\n\n await this._repo.flush(states?.map(({ documentId }) => documentId as DocumentId));\n }\n\n syncRepo(request: SyncRepoRequest): Stream<SyncRepoResponse> {\n return this._clientNetwork.syncRepo(request);\n }\n\n sendSyncMessage(request: SyncRepoRequest): Promise<void> {\n return this._clientNetwork.sendSyncMessage(request);\n }\n\n async getHostInfo(): Promise<HostInfo> {\n return this._clientNetwork.getHostInfo();\n }\n\n //\n // Mesh replication.\n //\n\n createExtension(): AutomergeReplicator {\n return this._meshNetwork.createExtension();\n }\n\n authorizeDevice(spaceKey: PublicKey, deviceKey: PublicKey) {\n log('authorizeDevice', { spaceKey, deviceKey });\n defaultMap(this._authorizedDevices, spaceKey, () => new ComplexSet(PublicKey.hash)).add(deviceKey);\n }\n}\n\nexport const getSpaceKeyFromDoc = (doc: any): string | null => {\n // experimental_spaceKey is set on old documents, new ones are created with doc.access.spaceKey\n const rawSpaceKey = doc.access?.spaceKey ?? doc.experimental_spaceKey;\n if (rawSpaceKey == null) {\n return null;\n }\n\n return String(rawSpaceKey);\n};\n\nconst waitForHeads = async (handle: DocHandle<SpaceDoc>, heads: Heads) => {\n await handle.whenReady();\n const unavailableHeads = new Set(heads);\n\n await Event.wrap<DocHandleChangePayload<SpaceDoc>>(handle, 'change').waitForCondition(() => {\n // Check if unavailable heads became available.\n for (const changeHash of unavailableHeads.values()) {\n if (changeIsPresentInDoc(handle.docSync(), changeHash)) {\n unavailableHeads.delete(changeHash);\n }\n }\n\n if (unavailableHeads.size === 0) {\n return true;\n }\n return false;\n });\n};\n\nconst changeIsPresentInDoc = (doc: Doc<any>, changeHash: string): boolean => {\n return !!getBackend(doc).getChangeByHash(changeHash);\n};\n", "//\n// Copyright 2024 DXOS.org\n// s\n\nimport { type MixedEncoding } from 'level-transcoder';\n\nimport { type StorageAdapterInterface, type Chunk, type StorageKey } from '@dxos/automerge/automerge-repo';\nimport { LifecycleState, Resource } from '@dxos/context';\nimport { type MaybePromise } from '@dxos/util';\n\nimport { type BatchLevel, type SubLevelDB } from './types';\n\nexport type LevelDBStorageAdapterParams = {\n db: SubLevelDB;\n callbacks?: StorageCallbacks;\n};\n\nexport type BeforeSaveParams = { path: StorageKey; batch: BatchLevel };\n\nexport interface StorageCallbacks {\n beforeSave(params: BeforeSaveParams): MaybePromise<void>;\n afterSave(path: StorageKey): MaybePromise<void>;\n}\n\nexport class LevelDBStorageAdapter extends Resource implements StorageAdapterInterface {\n constructor(private readonly _params: LevelDBStorageAdapterParams) {\n super();\n }\n\n async load(keyArray: StorageKey): Promise<Uint8Array | undefined> {\n try {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n // TODO(mykola): this should be an error.\n return undefined;\n }\n return await this._params.db.get<StorageKey, Uint8Array>(keyArray, { ...encodingOptions });\n } catch (err: any) {\n if (isLevelDbNotFoundError(err)) {\n return undefined;\n }\n throw err;\n }\n }\n\n async save(keyArray: StorageKey, binary: Uint8Array): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n const batch = this._params.db.batch();\n\n await this._params.callbacks?.beforeSave?.({ path: keyArray, batch });\n batch.put<StorageKey, Uint8Array>(keyArray, Buffer.from(binary), {\n ...encodingOptions,\n });\n await batch.write();\n\n await this._params.callbacks?.afterSave?.(keyArray);\n }\n\n async remove(keyArray: StorageKey): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n await this._params.db.del<StorageKey>(keyArray, { ...encodingOptions });\n }\n\n async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return [];\n }\n const result: Chunk[] = [];\n for await (const [key, value] of this._params.db.iterator<StorageKey, Uint8Array>({\n gte: keyPrefix,\n lte: [...keyPrefix, '\\uffff'],\n ...encodingOptions,\n })) {\n result.push({\n key,\n data: value,\n });\n }\n return result;\n }\n\n async removeRange(keyPrefix: StorageKey): Promise<void> {\n if (this._lifecycleState !== LifecycleState.OPEN) {\n return undefined;\n }\n const batch = this._params.db.batch();\n\n for await (const [key] of this._params.db.iterator<StorageKey, Uint8Array>({\n gte: keyPrefix,\n lte: [...keyPrefix, '\\uffff'],\n ...encodingOptions,\n })) {\n batch.del<StorageKey>(key, { ...encodingOptions });\n }\n await batch.write();\n }\n}\n\nconst keyEncoder: MixedEncoding<StorageKey, Uint8Array, StorageKey> = {\n encode: (key: StorageKey): Uint8Array =>\n Buffer.from(key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-')),\n decode: (key: Uint8Array): StorageKey =>\n Buffer.from(key)\n .toString()\n .split('-')\n .map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%')),\n};\n\nexport const encodingOptions = {\n keyEncoding: keyEncoder,\n valueEncoding: 'buffer',\n};\n\nconst isLevelDbNotFoundError = (err: any): boolean => err.code === 'LEVEL_NOT_FOUND';\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { NetworkAdapter, type Message, type PeerId, cbor } from '@dxos/automerge/automerge-repo';\nimport { Stream } from '@dxos/codec-protobuf';\nimport { invariant } from '@dxos/invariant';\nimport { type HostInfo, type SyncRepoRequest, type SyncRepoResponse } from '@dxos/protocols/proto/dxos/echo/service';\n\ntype ClientSyncState = {\n connected: boolean;\n send: (message: Message) => void;\n disconnect: () => void;\n};\n\n/**\n * Used to replicate with apps running on the same device.\n */\nexport class LocalHostNetworkAdapter extends NetworkAdapter {\n private readonly _peers: Map<PeerId, ClientSyncState> = new Map();\n\n /**\n * Emits `ready` event. That signals to `Repo` that it can start using the adapter.\n */\n ready() {\n // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition\n // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.\n this.emit('ready', {\n network: this,\n });\n }\n\n private readonly _connected = new Trigger();\n private _isConnected: boolean = false;\n\n /**\n * Called by `Repo` to connect to the network.\n *\n * @param peerId Our peer Id.\n */\n override connect(peerId: PeerId): void {\n this.peerId = peerId;\n this._isConnected = true;\n this._connected.wake();\n // No-op. Client always connects first\n }\n\n override send(message: Message): void {\n const peer = this._peers.get(message.targetId);\n invariant(peer, 'Peer not found.');\n peer.send(message);\n }\n\n async close() {\n this._peers.forEach((peer) => peer.disconnect());\n this.emit('close');\n }\n\n override disconnect(): void {\n // TODO(mykola): `disconnect` is not used anywhere in `Repo` from `@automerge/automerge-repo`. Should we remove it?\n // No-op\n }\n\n async whenConnected(): Promise<void> {\n await this._connected.wait({ timeout: 10_000 });\n }\n\n syncRepo({ id, syncMessage }: SyncRepoRequest): Stream<SyncRepoResponse> {\n const peerId = this._getPeerId(id);\n\n return new Stream(({ next, close }) => {\n invariant(!this._peers.has(peerId), 'Peer already connected.');\n this._peers.set(peerId, {\n connected: true,\n send: (message) => {\n next({\n syncMessage: cbor.encode(message),\n });\n },\n disconnect: () => {\n this._peers.delete(peerId);\n close();\n this.emit('peer-disconnected', {\n peerId,\n });\n },\n });\n\n invariant(this._isConnected);\n this.emit('peer-candidate', {\n peerMetadata: {},\n peerId,\n });\n });\n }\n\n async sendSyncMessage({ id, syncMessage }: SyncRepoRequest): Promise<void> {\n invariant(this._isConnected);\n const message = cbor.decode(syncMessage!) as Message;\n this.emit('message', message);\n }\n\n async getHostInfo(): Promise<HostInfo> {\n invariant(this._isConnected);\n invariant(this.peerId, 'Peer id not set.');\n return {\n peerId: this.peerId,\n };\n }\n\n private _getPeerId(id: string): PeerId {\n return id as PeerId;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Trigger } from '@dxos/async';\nimport { NetworkAdapter, type Message, type PeerId, cbor } from '@dxos/automerge/automerge-repo';\nimport { invariant } from '@dxos/invariant';\nimport { log } from '@dxos/log';\nimport { type PeerInfo } from '@dxos/protocols/proto/dxos/mesh/teleport/automerge';\nimport { AutomergeReplicator } from '@dxos/teleport-extension-automerge-replicator';\n\n/**\n * Used to replicate with other peers over the network.\n */\nexport class MeshNetworkAdapter extends NetworkAdapter {\n private readonly _extensions: Map<string, AutomergeReplicator> = new Map();\n private _connected = new Trigger();\n\n /**\n * Emits `ready` event. That signals to `Repo` that it can start using the adapter.\n */\n ready() {\n // NOTE: Emitting `ready` event in NetworkAdapter`s constructor causes a race condition\n // because `Repo` waits for `ready` event (which it never receives) before it starts using the adapter.\n this.emit('ready', {\n network: this,\n });\n }\n\n override connect(peerId: PeerId): void {\n this.peerId = peerId;\n this._connected.wake();\n }\n\n override send(message: Message): void {\n const receiverId = message.targetId;\n const extension = this._extensions.get(receiverId);\n invariant(extension, 'Extension not found.');\n extension.sendSyncMessage({ payload: cbor.encode(message) }).catch((err) => log.catch(err));\n }\n\n override disconnect(): void {\n // No-op\n }\n\n createExtension(): AutomergeReplicator {\n invariant(this.peerId, 'Peer id not set.');\n\n let peerInfo: PeerInfo;\n const extension = new AutomergeReplicator(\n {\n peerId: this.peerId,\n },\n {\n onStartReplication: async (info, remotePeerId /** Teleport ID */) => {\n await this._connected.wait();\n\n // Note: We store only one extension per peer.\n // There can be a case where two connected peers have more than one teleport connection between them\n // and each of them uses different teleport connections to send messages.\n // It works because we receive messages from all teleport connections and Automerge Repo dedup them.\n // TODO(mykola): Use only one teleport connection per peer.\n\n // TODO(dmaretskyi): Critical bug.\n // - two peers get connected via swarm 1\n // - they get connected via swarm 2\n // - swarm 1 gets disconnected\n // - automerge repo thinks that peer 2 got disconnected even though swarm 2 is still active\n\n log('onStartReplication', { id: info.id, thisPeerId: this.peerId, remotePeerId: remotePeerId.toHex() });\n if (!this._extensions.has(info.id)) {\n peerInfo = info;\n // TODO(mykola): Fix race condition?\n this._extensions.set(info.id, extension);\n\n log('peer-candidate', { id: info.id, thisPeerId: this.peerId, remotePeerId: remotePeerId.toHex() });\n this.emit('peer-candidate', {\n // TODO(mykola): Hack, stop abusing `peerMetadata` field.\n peerMetadata: {\n dxos_deviceKey: remotePeerId.toHex(),\n } as any,\n peerId: info.id as PeerId,\n });\n }\n },\n onSyncMessage: async ({ payload }) => {\n if (!peerInfo) {\n return;\n }\n const message = cbor.decode(payload) as Message;\n // Note: automerge Repo dedup messages.\n this.emit('message', message);\n },\n onClose: async () => {\n if (!peerInfo) {\n return;\n }\n this.emit('peer-disconnected', {\n peerId: peerInfo.id as PeerId,\n });\n this._extensions.delete(peerInfo.id);\n },\n },\n );\n return extension;\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { type StorageKey } from '@dxos/automerge/automerge-repo';\nimport { IndexedDBStorageAdapter } from '@dxos/automerge/automerge-repo-storage-indexeddb';\nimport { log } from '@dxos/log';\nimport { StorageType, type Directory } from '@dxos/random-access-storage';\n\nimport { AutomergeStorageAdapter } from './automerge-storage-adapter';\nimport { encodingOptions } from './leveldb-storage-adapter';\nimport { type SubLevelDB } from './types';\n\nexport const levelMigration = async ({ db, directory }: { db: SubLevelDB; directory: Directory }) => {\n // Note: Make automigration from previous storage to leveldb here.\n const isNewLevel = !(await db\n .iterator<StorageKey, Uint8Array>({\n ...encodingOptions,\n })\n .next());\n\n if (!isNewLevel) {\n return;\n }\n\n const oldStorageAdapter =\n directory.type === StorageType.IDB\n ? new IndexedDBStorageAdapter(directory.path, 'data')\n : new AutomergeStorageAdapter(directory);\n\n const chunks = await oldStorageAdapter.loadRange([]);\n if (chunks.length === 0) {\n return;\n }\n const batch = db.batch();\n log.info('found chunks on old storage adapter', { chunks: chunks.length });\n for (const { key, data } of await oldStorageAdapter.loadRange([])) {\n data && batch.put<StorageKey, Uint8Array>(key, data, { ...encodingOptions });\n }\n await batch.write();\n};\n", "//\n// Copyright 2024 DXOS.org\n//\n//\n// Copyright 2023 DXOS.org\n//\n\nimport { type Chunk, type StorageKey, type StorageAdapterInterface } from '@dxos/automerge/automerge-repo';\nimport { type Directory } from '@dxos/random-access-storage';\nimport { arrayToBuffer, bufferToArray } from '@dxos/util';\n\nexport class AutomergeStorageAdapter implements StorageAdapterInterface {\n // TODO(mykola): Hack for restricting automerge Repo to access storage if Host is `closed`.\n // Automerge Repo do not have any lifetime management.\n private _state: 'opened' | 'closed' = 'opened';\n\n constructor(private readonly _directory: Directory) {}\n\n async load(key: StorageKey): Promise<Uint8Array | undefined> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n const { size } = await file.stat();\n if (!size || size === 0) {\n return undefined;\n }\n const buffer = await file.read(0, size);\n return bufferToArray(buffer);\n }\n\n async save(key: StorageKey, data: Uint8Array): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n await file.write(0, arrayToBuffer(data));\n await file.truncate?.(data.length);\n\n await file.flush?.();\n }\n\n async remove(key: StorageKey): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n // TODO(dmaretskyi): Better deletion.\n const filename = this._getFilename(key);\n const file = this._directory.getOrCreateFile(filename);\n await file.destroy();\n }\n\n async loadRange(keyPrefix: StorageKey): Promise<Chunk[]> {\n if (this._state !== 'opened') {\n return [];\n }\n const filename = this._getFilename(keyPrefix);\n const entries = await this._directory.list();\n return Promise.all(\n entries\n .filter((entry) => entry.startsWith(filename))\n .map(async (entry): Promise<Chunk> => {\n const file = this._directory.getOrCreateFile(entry);\n const { size } = await file.stat();\n const buffer = await file.read(0, size);\n return {\n key: this._getKeyFromFilename(entry),\n data: bufferToArray(buffer),\n };\n }),\n );\n }\n\n async removeRange(keyPrefix: StorageKey): Promise<void> {\n if (this._state !== 'opened') {\n return undefined;\n }\n const filename = this._getFilename(keyPrefix);\n const entries = await this._directory.list();\n await Promise.all(\n entries\n .filter((entry) => entry.startsWith(filename))\n .map(async (entry): Promise<void> => {\n const file = this._directory.getOrCreateFile(entry);\n await file.destroy();\n }),\n );\n }\n\n async close(): Promise<void> {\n this._state = 'closed';\n }\n\n private _getFilename(key: StorageKey): string {\n return key.map((k) => k.replaceAll('%', '%25').replaceAll('-', '%2D')).join('-');\n }\n\n private _getKeyFromFilename(filename: string): StorageKey {\n return filename.split('-').map((k) => k.replaceAll('%2D', '-').replaceAll('%25', '%'));\n }\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Event } from '@dxos/async';\nimport { type DocHandle, type AutomergeUrl, type DocumentId, type Repo } from '@dxos/automerge/automerge-repo';\nimport { cancelWithContext, type Context } from '@dxos/context';\nimport { warnAfterTimeout } from '@dxos/debug';\nimport { invariant } from '@dxos/invariant';\nimport { type PublicKey } from '@dxos/keys';\nimport { log } from '@dxos/log';\nimport { trace } from '@dxos/tracing';\n\nimport { type SpaceState, type SpaceDoc } from './types';\n\ntype SpaceDocumentLinks = SpaceDoc['links'];\n\nexport interface AutomergeDocumentLoader {\n onObjectDocumentLoaded: Event<ObjectDocumentLoaded>;\n\n getAllHandles(): DocHandle<SpaceDoc>[];\n\n loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void>;\n loadObjectDocument(objectId: string): void;\n getSpaceRootDocHandle(): DocHandle<SpaceDoc>;\n createDocumentForObject(objectId: string): DocHandle<SpaceDoc>;\n onObjectLinksUpdated(links: SpaceDocumentLinks): void;\n onObjectBoundToDocument(handle: DocHandle<SpaceDoc>, objectId: string): void;\n\n /**\n * @returns objectIds for which we had document handles or were loading one.\n */\n clearHandleReferences(): string[];\n}\n\n/**\n * Manages object <-> docHandle binding and automerge document loading.\n */\n@trace.resource()\nexport class AutomergeDocumentLoaderImpl implements AutomergeDocumentLoader {\n private _spaceRootDocHandle: DocHandle<SpaceDoc> | null = null;\n /**\n * An object id pointer to a handle of the document where the object is stored inline.\n */\n private readonly _objectDocumentHandles = new Map<string, DocHandle<SpaceDoc>>();\n /**\n * If object was requested via loadObjectDocument but root document links weren't updated yet\n * loading will be triggered in onObjectLinksUpdated callback.\n */\n private readonly _objectsPendingDocumentLoad = new Set<string>();\n\n public readonly onObjectDocumentLoaded = new Event<ObjectDocumentLoaded>();\n\n constructor(\n private readonly _spaceKey: PublicKey,\n private readonly _repo: Repo,\n ) {}\n\n getAllHandles(): DocHandle<SpaceDoc>[] {\n return [...new Set(this._objectDocumentHandles.values())];\n }\n\n @trace.span({ showInBrowserTimeline: true })\n public async loadSpaceRootDocHandle(ctx: Context, spaceState: SpaceState): Promise<void> {\n if (this._spaceRootDocHandle != null) {\n return;\n }\n if (!spaceState.rootUrl) {\n log.error('Database opened with no rootUrl', { spaceKey: this._spaceKey });\n this._createContextBoundSpaceRootDocument(ctx);\n } else {\n const existingDocHandle = await this._initDocHandle(ctx, spaceState.rootUrl);\n const doc = existingDocHandle.docSync();\n invariant(doc);\n if (doc.access == null) {\n this._initDocAccess(existingDocHandle);\n }\n this._spaceRootDocHandle = existingDocHandle;\n }\n }\n\n public loadObjectDocument(objectId: string) {\n invariant(this._spaceRootDocHandle);\n if (this._objectDocumentHandles.has(objectId) || this._objectsPendingDocumentLoad.has(objectId)) {\n return;\n }\n const spaceRootDoc = this._spaceRootDocHandle.docSync();\n invariant(spaceRootDoc);\n const documentUrl = (spaceRootDoc.links ?? {})[objectId];\n if (documentUrl == null) {\n this._objectsPendingDocumentLoad.add(objectId);\n log.info('loading delayed until object links are initialized', { objectId });\n return;\n }\n this._loadLinkedObjects({ [objectId]: documentUrl });\n }\n\n public onObjectLinksUpdated(links: SpaceDocumentLinks) {\n if (!links) {\n return;\n }\n const linksAwaitingLoad = Object.entries(links).filter(([objectId]) =>\n this._objectsPendingDocumentLoad.has(objectId),\n );\n this._loadLinkedObjects(Object.fromEntries(linksAwaitingLoad));\n linksAwaitingLoad.forEach(([objectId]) => this._objectsPendingDocumentLoad.delete(objectId));\n }\n\n public getSpaceRootDocHandle(): DocHandle<SpaceDoc> {\n invariant(this._spaceRootDocHandle);\n return this._spaceRootDocHandle;\n }\n\n public createDocumentForObject(objectId: string): DocHandle<SpaceDoc> {\n invariant(this._spaceRootDocHandle);\n const spaceDocHandle = this._repo.create<SpaceDoc>();\n this._initDocAccess(spaceDocHandle);\n this.onObjectBoundToDocument(spaceDocHandle, objectId);\n this._spaceRootDocHandle.change((newDoc: SpaceDoc) => {\n newDoc.links ??= {};\n newDoc.links[objectId] = spaceDocHandle.url;\n });\n return spaceDocHandle;\n }\n\n public onObjectBoundToDocument(handle: DocHandle<SpaceDoc>, objectId: string) {\n this._objectDocumentHandles.set(objectId, handle);\n }\n\n public clearHandleReferences(): string[] {\n const objectsWithHandles = [...this._objectDocumentHandles.keys()];\n this._objectDocumentHandles.clear();\n this._spaceRootDocHandle = null;\n return objectsWithHandles;\n }\n\n private _loadLinkedObjects(links: SpaceDocumentLinks) {\n if (!links) {\n return;\n }\n for (const [objectId, automergeUrl] of Object.entries(links)) {\n const logMeta = { objectId, automergeUrl };\n const objectDocumentHandle = this._objectDocumentHandles.get(objectId);\n if (objectDocumentHandle != null && objectDocumentHandle.url !== automergeUrl) {\n log.warn('object already inlined in a different document, ignoring the link', {\n ...logMeta,\n actualDocumentUrl: objectDocumentHandle.url,\n });\n continue;\n }\n if (objectDocumentHandle?.url === automergeUrl) {\n log.warn('object document was already loaded', logMeta);\n continue;\n }\n const handle = this._repo.find<SpaceDoc>(automergeUrl as DocumentId);\n log.debug('document loading triggered', logMeta);\n this._objectDocumentHandles.set(objectId, handle);\n void this._createObjectOnDocumentLoad(handle, objectId);\n }\n }\n\n private async _initDocHandle(ctx: Context, url: string) {\n const docHandle = this._repo.find<SpaceDoc>(url as DocumentId);\n while (true) {\n try {\n await warnAfterTimeout(5_000, 'Automerge root doc load timeout (AutomergeDb)', async () => {\n await cancelWithContext(ctx, docHandle.whenReady()); // TODO(dmaretskyi): Temporary 5s timeout for debugging.\n });\n break;\n } catch (err) {\n if (`${err}`.includes('Timeout')) {\n log.info('wraparound', { id: docHandle.documentId, state: docHandle.state });\n continue;\n }\n\n throw err;\n }\n }\n\n if (docHandle.state === 'unavailable') {\n throw new Error('Automerge document is unavailable');\n }\n\n return docHandle;\n }\n\n private _createContextBoundSpaceRootDocument(ctx: Context) {\n const docHandle = this._repo.create<SpaceDoc>();\n this._spaceRootDocHandle = docHandle;\n ctx.onDispose(() => {\n docHandle.delete();\n this._spaceRootDocHandle = null;\n });\n }\n\n private _initDocAccess(handle: DocHandle<SpaceDoc>) {\n handle.change((newDoc: SpaceDoc) => {\n newDoc.access ??= { spaceKey: this._spaceKey.toHex() };\n newDoc.access.spaceKey = this._spaceKey.toHex();\n });\n }\n\n private async _createObjectOnDocumentLoad(handle: DocHandle<SpaceDoc>, objectId: string) {\n try {\n await handle.doc(['ready']);\n const logMeta = { objectId, docUrl: handle.url };\n if (this.onObjectDocumentLoaded.listenerCount() === 0) {\n log.info('document loaded after all listeners were removed', logMeta);\n return;\n }\n const objectDocHandle = this._objectDocumentHandles.get(objectId);\n if (objectDocHandle?.url !== handle.url) {\n log.warn('object was rebound while a document was loading, discarding handle', logMeta);\n return;\n }\n this.onObjectDocumentLoaded.emit({ handle, objectId });\n } catch (err) {\n const shouldRetryLoading = this.onObjectDocumentLoaded.listenerCount() > 0;\n log.warn('failed to load a document', {\n objectId,\n automergeUrl: handle.url,\n retryLoading: shouldRetryLoading,\n err,\n });\n if (shouldRetryLoading) {\n await this._createObjectOnDocumentLoad(handle, objectId);\n }\n }\n }\n}\n\nexport interface ObjectDocumentLoaded {\n handle: DocHandle<SpaceDoc>;\n objectId: string;\n}\n\nexport interface DocumentChanges {\n createdObjectIds: string[];\n updatedObjectIds: string[];\n objectsToRebind: string[];\n linkedDocuments: {\n [echoId: string]: AutomergeUrl;\n };\n}\n", "//\n// Copyright 2024 DXOS.org\n//\n\nimport { Reference } from '@dxos/echo-schema';\n\nexport const REFERENCE_TYPE_TAG = 'dxos.echo.model.document.Reference';\n\n/**\n * Reference as it is stored in Automerge document.\n */\nexport type EncodedReferenceObject = {\n '@type': typeof REFERENCE_TYPE_TAG;\n itemId: string | null;\n protocol: string | null;\n host: string | null;\n};\n\nexport const encodeReference = (reference: Reference): EncodedReferenceObject => ({\n '@type': REFERENCE_TYPE_TAG,\n // NOTE: Automerge do not support undefined values, so we need to use null instead.\n itemId: reference.itemId ?? null,\n protocol: reference.protocol ?? null,\n host: reference.host ?? null,\n});\n\nexport const decodeReference = (value: any) =>\n new Reference(value.itemId, value.protocol ?? undefined, value.host ?? undefined);\n\nexport const isEncodedReferenceObject = (value: any): value is EncodedReferenceObject =>\n typeof value === 'object' && value !== null && value['@type'] === REFERENCE_TYPE_TAG;\n"],
|
|
5
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,mBAAsB;AACtB,uBAAoE;AACpE,4BAOO;AAEP,qBAAwC;AACxC,uBAA0B;AAC1B,kBAA0B;AAC1B,iBAAoB;AASpB,qBAAsB;AACtB,kBAA8D;ACrB9D,IAAAA,kBAAyC;ACHzC,IAAAC,gBAAwB;AACxB,IAAAC,yBAAgE;AAChE,4BAAuB;AACvB,IAAAC,oBAA0B;ACH1B,IAAAF,gBAAwB;AACxB,IAAAC,yBAAgE;AAChE,IAAAC,oBAA0B;AAC1B,IAAAC,cAAoB;AAEpB,qDAAoC;ACJpC,8CAAwC;AACxC,IAAAA,cAAoB;AACpB,mCAA4C;ACE5C,IAAAC,eAA6C;ACL7C,IAAAJ,gBAAsB;AAEtB,IAAAD,kBAAgD;AAChD,mBAAiC;AACjC,IAAAG,oBAA0B;AAE1B,IAAAC,cAAoB;AACpB,IAAAE,kBAAsB;ACPtB,yBAA0B;ANoBnB,IAAMC,wBAAN,cAAoCC,yBAAAA;EACzCC,YAA6BC,SAAsC;AACjE,UAAK;SADsBA,UAAAA;EAE7B;EAEA,MAAMC,KAAKC,UAAuD;AAChE,QAAI;AACF,UAAI,KAAKC,oBAAoBC,+BAAeC,MAAM;AAEhD,eAAOC;MACT;AACA,aAAO,MAAM,KAAKN,QAAQO,GAAGC,IAA4BN,UAAU;QAAE,GAAGO;MAAgB,CAAA;IAC1F,SAASC,KAAU;AACjB,UAAIC,uBAAuBD,GAAAA,GAAM;AAC/B,eAAOJ;MACT;AACA,YAAMI;IACR;EACF;EAEA,MAAME,KAAKV,UAAsBW,QAAmC;AAClE,QAAI,KAAKV,oBAAoBC,+BAAeC,MAAM;AAChD,aAAOC;IACT;AACA,UAAMQ,QAAQ,KAAKd,QAAQO,GAAGO,MAAK;AAEnC,UAAM,KAAKd,QAAQe,WAAWC,aAAa;MAAEC,MAAMf;MAAUY;IAAM,CAAA;AACnEA,UAAMI,IAA4BhB,UAAUiB,OAAOC,KAAKP,MAAAA,GAAS;MAC/D,GAAGJ;IACL,CAAA;AACA,UAAMK,MAAMO,MAAK;AAEjB,UAAM,KAAKrB,QAAQe,WAAWO,YAAYpB,QAAAA;EAC5C;EAEA,MAAMqB,OAAOrB,UAAqC;AAChD,QAAI,KAAKC,oBAAoBC,+BAAeC,MAAM;AAChD,aAAOC;IACT;AACA,UAAM,KAAKN,QAAQO,GAAGiB,IAAgBtB,UAAU;MAAE,GAAGO;IAAgB,CAAA;EACvE;EAEA,MAAMgB,UAAUC,WAAyC;AACvD,QAAI,KAAKvB,oBAAoBC,+BAAeC,MAAM;AAChD,aAAO,CAAA;IACT;AACA,UAAMsB,SAAkB,CAAA;AACxB,qBAAiB,CAACC,KAAKC,KAAAA,KAAU,KAAK7B,QAAQO,GAAGuB,SAAiC;MAChFC,KAAKL;MACLM,KAAK;WAAIN;QAAW;;MACpB,GAAGjB;IACL,CAAA,GAAI;AACFkB,aAAOM,KAAK;QACVL;QACAM,MAAML;MACR,CAAA;IACF;AACA,WAAOF;EACT;EAEA,MAAMQ,YAAYT,WAAsC;AACtD,QAAI,KAAKvB,oBAAoBC,+BAAeC,MAAM;AAChD,aAAOC;IACT;AACA,UAAMQ,QAAQ,KAAKd,QAAQO,GAAGO,MAAK;AAEnC,qBAAiB,CAACc,GAAAA,KAAQ,KAAK5B,QAAQO,GAAGuB,SAAiC;MACzEC,KAAKL;MACLM,KAAK;WAAIN;QAAW;;MACpB,GAAGjB;IACL,CAAA,GAAI;AACFK,YAAMU,IAAgBI,KAAK;QAAE,GAAGnB;MAAgB,CAAA;IAClD;AACA,UAAMK,MAAMO,MAAK;EACnB;AACF;AAEA,IAAMe,aAAgE;EACpEC,QAAQ,CAACT,QACPT,OAAOC,KAAKQ,IAAIU,IAAI,CAACC,MAAMA,EAAEC,WAAW,KAAK,KAAA,EAAOA,WAAW,KAAK,KAAA,CAAA,EAAQC,KAAK,GAAA,CAAA;EACnFC,QAAQ,CAACd,QACPT,OAAOC,KAAKQ,GAAAA,EACTe,SAAQ,EACRC,MAAM,GAAA,EACNN,IAAI,CAACC,MAAMA,EAAEC,WAAW,OAAO,GAAA,EAAKA,WAAW,OAAO,GAAA,CAAA;AAC7D;AAEO,IAAM/B,kBAAkB;EAC7BoC,aAAaT;EACbU,eAAe;AACjB;AAEA,IAAMnC,yBAAyB,CAACD,QAAsBA,IAAIqC,SAAS;;ACjG5D,IAAMC,0BAAN,cAAsCC,sCAAAA;EAAtC,cAAA;;AACYC,SAAAA,SAAuC,oBAAIC,IAAAA;AAa3CC,SAAAA,aAAa,IAAIC,sBAAAA;AAC1BC,SAAAA,eAAwB;;;;;EAThCC,QAAQ;AAGN,SAAKC,KAAK,SAAS;MACjBC,SAAS;IACX,CAAA;EACF;;;;;;EAUSC,QAAQC,QAAsB;AACrC,SAAKA,SAASA;AACd,SAAKL,eAAe;AACpB,SAAKF,WAAWQ,KAAI;EAEtB;EAESC,KAAKC,SAAwB;AACpC,UAAMC,OAAO,KAAKb,OAAO1C,IAAIsD,QAAQE,QAAQ;AAC7CC,qCAAUF,MAAM,mBAAA;;;;;;;;;AAChBA,SAAKF,KAAKC,OAAAA;EACZ;EAEA,MAAMI,QAAQ;AACZ,SAAKhB,OAAOiB,QAAQ,CAACJ,SAASA,KAAKK,WAAU,CAAA;AAC7C,SAAKZ,KAAK,OAAA;EACZ;EAESY,aAAmB;EAG5B;EAEA,MAAMC,gBAA+B;AACnC,UAAM,KAAKjB,WAAWkB,KAAK;MAAEC,SAAS;IAAO,CAAA;EAC/C;EAEAC,SAAS,EAAEC,IAAIC,YAAW,GAA+C;AACvE,UAAMf,SAAS,KAAKgB,WAAWF,EAAAA;AAE/B,WAAO,IAAIG,6BAAO,CAAC,EAAEC,MAAMX,MAAK,MAAE;AAChCD,uCAAU,CAAC,KAAKf,OAAO4B,IAAInB,MAAAA,GAAS,2BAAA;;;;;;;;;AACpC,WAAKT,OAAO6B,IAAIpB,QAAQ;QACtBqB,WAAW;QACXnB,MAAM,CAACC,YAAAA;AACLe,eAAK;YACHH,aAAaO,4BAAK5C,OAAOyB,OAAAA;UAC3B,CAAA;QACF;QACAM,YAAY,MAAA;AACV,eAAKlB,OAAOgC,OAAOvB,MAAAA;AACnBO,gBAAAA;AACA,eAAKV,KAAK,qBAAqB;YAC7BG;UACF,CAAA;QACF;MACF,CAAA;AAEAM,uCAAU,KAAKX,cAAY,QAAA;;;;;;;;;AAC3B,WAAKE,KAAK,kBAAkB;QAC1B2B,cAAc,CAAC;QACfxB;MACF,CAAA;IACF,CAAA;EACF;EAEA,MAAMyB,gBAAgB,EAAEX,IAAIC,YAAW,GAAoC;AACzET,qCAAU,KAAKX,cAAY,QAAA;;;;;;;;;AAC3B,UAAMQ,UAAUmB,4BAAKvC,OAAOgC,WAAAA;AAC5B,SAAKlB,KAAK,WAAWM,OAAAA;EACvB;EAEA,MAAMuB,cAAiC;AACrCpB,qCAAU,KAAKX,cAAY,QAAA;;;;;;;;;AAC3BW,qCAAU,KAAKN,QAAQ,oBAAA;;;;;;;;;AACvB,WAAO;MACLA,QAAQ,KAAKA;IACf;EACF;EAEQgB,WAAWF,IAAoB;AACrC,WAAOA;EACT;AACF;;ACpGO,IAAMa,qBAAN,cAAiCrC,uBAAAA,eAAAA;EAAjC,cAAA;;AACYsC,SAAAA,cAAgD,oBAAIpC,IAAAA;AAC7DC,SAAAA,aAAa,IAAIC,cAAAA,QAAAA;;;;;EAKzBE,QAAQ;AAGN,SAAKC,KAAK,SAAS;MACjBC,SAAS;IACX,CAAA;EACF;EAESC,QAAQC,QAAsB;AACrC,SAAKA,SAASA;AACd,SAAKP,WAAWQ,KAAI;EACtB;EAESC,KAAKC,SAAwB;AACpC,UAAM0B,aAAa1B,QAAQE;AAC3B,UAAMyB,YAAY,KAAKF,YAAY/E,IAAIgF,UAAAA;AACvCvB,0BAAAA,WAAUwB,WAAW,wBAAA;;;;;;;;;AACrBA,cAAUL,gBAAgB;MAAEM,SAAST,uBAAAA,KAAK5C,OAAOyB,OAAAA;IAAS,CAAA,EAAG6B,MAAM,CAACjF,QAAQkF,gBAAID,MAAMjF,KAAAA,QAAAA;;;;;;EACxF;EAES0D,aAAmB;EAE5B;EAEAyB,kBAAuC;AACrC5B,0BAAAA,WAAU,KAAKN,QAAQ,oBAAA;;;;;;;;;AAEvB,QAAImC;AACJ,UAAML,YAAY,IAAIM,mEACpB;MACEpC,QAAQ,KAAKA;IACf,GACA;MACEqC,oBAAoB,OAAOC,MAAMC,iBAA6B;AAC5D,cAAM,KAAK9C,WAAWkB,KAAI;AAc1BsB,6BAAI,sBAAsB;UAAEnB,IAAIwB,KAAKxB;UAAI0B,YAAY,KAAKxC;UAAQuC,cAAcA,aAAaE,MAAK;QAAG,GAAA;;;;;;AACrG,YAAI,CAAC,KAAKb,YAAYT,IAAImB,KAAKxB,EAAE,GAAG;AAClCqB,qBAAWG;AAEX,eAAKV,YAAYR,IAAIkB,KAAKxB,IAAIgB,SAAAA;AAE9BG,+BAAI,kBAAkB;YAAEnB,IAAIwB,KAAKxB;YAAI0B,YAAY,KAAKxC;YAAQuC,cAAcA,aAAaE,MAAK;UAAG,GAAA;;;;;;AACjG,eAAK5C,KAAK,kBAAkB;;YAE1B2B,cAAc;cACZkB,gBAAgBH,aAAaE,MAAK;YACpC;YACAzC,QAAQsC,KAAKxB;UACf,CAAA;QACF;MACF;MACA6B,eAAe,OAAO,EAAEZ,QAAO,MAAE;AAC/B,YAAI,CAACI,UAAU;AACb;QACF;AACA,cAAMhC,UAAUmB,uBAAAA,KAAKvC,OAAOgD,OAAAA;AAE5B,aAAKlC,KAAK,WAAWM,OAAAA;MACvB;MACAyC,SAAS,YAAA;AACP,YAAI,CAACT,UAAU;AACb;QACF;AACA,aAAKtC,KAAK,qBAAqB;UAC7BG,QAAQmC,SAASrB;QACnB,CAAA;AACA,aAAKc,YAAYL,OAAOY,SAASrB,EAAE;MACrC;IACF,CAAA;AAEF,WAAOgB;EACT;AACF;AE/FO,IAAMe,0BAAN,MAAMA;EAKXzG,YAA6B0G,YAAuB;SAAvBA,aAAAA;SAFrBC,SAA8B;EAEe;EAErD,MAAMzG,KAAK2B,KAAkD;AAC3D,QAAI,KAAK8E,WAAW,UAAU;AAC5B,aAAOpG;IACT;AACA,UAAMqG,WAAW,KAAKC,aAAahF,GAAAA;AACnC,UAAMiF,OAAO,KAAKJ,WAAWK,gBAAgBH,QAAAA;AAC7C,UAAM,EAAEI,KAAI,IAAK,MAAMF,KAAKG,KAAI;AAChC,QAAI,CAACD,QAAQA,SAAS,GAAG;AACvB,aAAOzG;IACT;AACA,UAAM2G,SAAS,MAAMJ,KAAKK,KAAK,GAAGH,IAAAA;AAClC,eAAOI,4BAAcF,MAAAA;EACvB;EAEA,MAAMrG,KAAKgB,KAAiBM,MAAiC;AAC3D,QAAI,KAAKwE,WAAW,UAAU;AAC5B,aAAOpG;IACT;AACA,UAAMqG,WAAW,KAAKC,aAAahF,GAAAA;AACnC,UAAMiF,OAAO,KAAKJ,WAAWK,gBAAgBH,QAAAA;AAC7C,UAAME,KAAKxF,MAAM,OAAG+F,4BAAclF,IAAAA,CAAAA;AAClC,UAAM2E,KAAKQ,WAAWnF,KAAKoF,MAAM;AAEjC,UAAMT,KAAKU,QAAK;EAClB;EAEA,MAAMhG,OAAOK,KAAgC;AAC3C,QAAI,KAAK8E,WAAW,UAAU;AAC5B,aAAOpG;IACT;AAEA,UAAMqG,WAAW,KAAKC,aAAahF,GAAAA;AACnC,UAAMiF,OAAO,KAAKJ,WAAWK,gBAAgBH,QAAAA;AAC7C,UAAME,KAAKW,QAAO;EACpB;EAEA,MAAM/F,UAAUC,WAAyC;AACvD,QAAI,KAAKgF,WAAW,UAAU;AAC5B,aAAO,CAAA;IACT;AACA,UAAMC,WAAW,KAAKC,aAAalF,SAAAA;AACnC,UAAM+F,UAAU,MAAM,KAAKhB,WAAWiB,KAAI;AAC1C,WAAOC,QAAQC,IACbH,QACGI,OAAO,CAACC,UAAUA,MAAMC,WAAWpB,QAAAA,CAAAA,EACnCrE,IAAI,OAAOwF,UAAAA;AACV,YAAMjB,OAAO,KAAKJ,WAAWK,gBAAgBgB,KAAAA;AAC7C,YAAM,EAAEf,KAAI,IAAK,MAAMF,KAAKG,KAAI;AAChC,YAAMC,SAAS,MAAMJ,KAAKK,KAAK,GAAGH,IAAAA;AAClC,aAAO;QACLnF,KAAK,KAAKoG,oBAAoBF,KAAAA;QAC9B5F,UAAMiF,4BAAcF,MAAAA;MACtB;IACF,CAAA,CAAA;EAEN;EAEA,MAAM9E,YAAYT,WAAsC;AACtD,QAAI,KAAKgF,WAAW,UAAU;AAC5B,aAAOpG;IACT;AACA,UAAMqG,WAAW,KAAKC,aAAalF,SAAAA;AACnC,UAAM+F,UAAU,MAAM,KAAKhB,WAAWiB,KAAI;AAC1C,UAAMC,QAAQC,IACZH,QACGI,OAAO,CAACC,UAAUA,MAAMC,WAAWpB,QAAAA,CAAAA,EACnCrE,IAAI,OAAOwF,UAAAA;AACV,YAAMjB,OAAO,KAAKJ,WAAWK,gBAAgBgB,KAAAA;AAC7C,YAAMjB,KAAKW,QAAO;IACpB,CAAA,CAAA;EAEN;EAEA,MAAMtD,QAAuB;AAC3B,SAAKwC,SAAS;EAChB;EAEQE,aAAahF,KAAyB;AAC5C,WAAOA,IAAIU,IAAI,CAACC,MAAMA,EAAEC,WAAW,KAAK,KAAA,EAAOA,WAAW,KAAK,KAAA,CAAA,EAAQC,KAAK,GAAA;EAC9E;EAEQuF,oBAAoBrB,UAA8B;AACxD,WAAOA,SAAS/D,MAAM,GAAA,EAAKN,IAAI,CAACC,MAAMA,EAAEC,WAAW,OAAO,GAAA,EAAKA,WAAW,OAAO,GAAA,CAAA;EACnF;AACF;;ADzFO,IAAMyF,iBAAiB,OAAO,EAAE1H,IAAI2H,UAAS,MAA4C;AAE9F,QAAMC,aAAa,CAAE,MAAM5H,GACxBuB,SAAiC;IAChC,GAAGrB;EACL,CAAA,EACCoE,KAAI;AAEP,MAAI,CAACsD,YAAY;AACf;EACF;AAEA,QAAMC,oBACJF,UAAUG,SAASC,yCAAYC,MAC3B,IAAIC,gEAAwBN,UAAUjH,MAAM,MAAA,IAC5C,IAAIuF,wBAAwB0B,SAAAA;AAElC,QAAMO,SAAS,MAAML,kBAAkB3G,UAAU,CAAA,CAAE;AACnD,MAAIgH,OAAOnB,WAAW,GAAG;AACvB;EACF;AACA,QAAMxG,QAAQP,GAAGO,MAAK;AACtB8E,cAAAA,IAAIK,KAAK,uCAAuC;IAAEwC,QAAQA,OAAOnB;EAAO,GAAA;;;;;;AACxE,aAAW,EAAE1F,KAAKM,KAAI,KAAM,MAAMkG,kBAAkB3G,UAAU,CAAA,CAAE,GAAG;AACjES,YAAQpB,MAAMI,IAA4BU,KAAKM,MAAM;MAAE,GAAGzB;IAAgB,CAAA;EAC5E;AACA,QAAMK,MAAMO,MAAK;AACnB;;;;;;;;;;;;AJSO,IAAMqH,gBAAN,MAAMA;EAqBX3I,YAAY,EAAEmI,WAAW3H,IAAIoI,iBAAgB,GAAyB;AApBrDC,SAAAA,OAAO,IAAIC,uBAAAA;8BAgBU,IAAIC,uBAA6CC,sBAAUC,IAAI;AAE9FC,SAAAA,iBAAiB,oBAAIC,IAAAA;AAG1B,SAAKzC,aAAayB;AAClB,SAAKiB,MAAM5I;AACX,SAAK6I,oBAAoBT;EAC3B;EAEA,MAAMU,OAAO;AAEX,SAAK5C,cAAe,MAAMwB,eAAe;MAAE1H,IAAI,KAAK4I;MAAKjB,WAAW,KAAKzB;IAAW,CAAA;AACpF,SAAK6C,WAAW,IAAIzJ,sBAAsB;MACxCU,IAAI,KAAK4I;MACTpI,WAAW,KAAKqI;IAClB,CAAA;AACA,UAAM,KAAKE,SAASD,OAAI;AACxB,SAAKE,UAAU,QAAQR,sBAAUS,OAAM,EAAGpD,MAAK,CAAA;AAE/C,SAAKqD,eAAe,IAAInE,mBAAAA;AACxB,SAAKoE,iBAAiB,IAAI1G,wBAAAA;AAC1B,SAAK2G,QAAQ,IAAIC,2BAAK;MACpBjG,QAAQ,KAAK4F;MACb9F,SAAS;QAAC,KAAKiG;QAAgB,KAAKD;;MACpCI,SAAS,KAAKP;;;MAIdQ,aAAa,OAAOnG,QAAyBoG,eAAwB;AACnE,YAAIpG,OAAOoE,WAAW,SAAA,GAAY;AAChC,iBAAO;QACT;AAEA,YAAI,CAACgC,YAAY;AACf,iBAAO;QACT;AAEA,cAAMC,MAAM,KAAKL,MAAMM,QAAQF,UAAAA,GAAaG,QAAAA;AAC5C,YAAI,CAACF,KAAK;AACR,gBAAMG,cAAc,KAAKlB,eAAenE,IAAI,aAAaiF,UAAAA,EAAY;AACrEnE,yBAAAA,KAAI,0BAA0B;YAAEjC;YAAQoG;YAAYI;UAAY,GAAA;;;;;;AAChE,iBAAOA;QACT;AAEA,YAAI;AACF,gBAAMC,WAAWC,mBAAmBL,GAAAA;AACpC,cAAI,CAACI,UAAU;AACbxE,2BAAAA,KAAI,8CAA8C;cAAEjC;cAAQoG;YAAW,GAAA;;;;;;AACvE,mBAAO;UACT;AAEA,gBAAMO,oBAAoB,KAAKC,mBAAmB/J,IAAIuI,sBAAU3H,KAAKgJ,QAAAA,CAAAA;AAGrE,gBAAMI,eAAgB,KAAKC,KAAKC,qBAAqB/G,MAAAA,GAAiB0C;AACtE,cAAI,CAACmE,cAAc;AACjB5E,2BAAAA,KAAI,+CAA+C;cAAEjC;cAAQoG;YAAW,GAAA;;;;;;AACxE,mBAAO;UACT;AACA,gBAAMY,YAAY5B,sBAAU3H,KAAKoJ,YAAAA;AAEjC,gBAAMI,eAAeN,mBAAmBxF,IAAI6F,SAAAA,KAAc;AAC1D/E,yBAAAA,KAAI,sBAAsB;YACxBiF,WAAW,KAAKtB;YAChBuB,YAAYnH;YACZoG;YACAY;YACAP;YACAQ;UACF,GAAA;;;;;;AACA,iBAAOA;QACT,SAASlK,KAAK;AACZkF,qBAAAA,IAAID,MAAMjF,KAAAA,QAAAA;;;;;;AACV,iBAAO;QACT;MACF;IACF,CAAA;AACA,SAAKgJ,eAAenG,MAAK;AACzB,SAAKkG,aAAalG,MAAK;AAEvB,UAAM,KAAKmG,eAAerF,cAAa;EACzC;EAEA,MAAMH,QAAQ;AACZ,UAAM,KAAKoF,SAASpF,QAAK;AACzB,UAAM,KAAKwF,eAAexF,MAAK;AAC/B,UAAM,KAAK0E,KAAKmC,QAAO;EACzB;EAEA,IAAIN,OAAa;AACf,WAAO,KAAKd;EACd;EAGQqB,iBAAiB;AACvB,eAAOC,uBAAU,KAAKtB,MAAMM,SAAS,CAACiB,YAAY;MAChDC,OAAOD,OAAOC;MACdC,QAAQ,CAAC,CAACF,OAAOhB,QAAO;MACxBmB,OAAOH,OAAOhB,QAAO,IAAKoB,iBAAAA,KAAUC,SAASL,OAAOhB,QAAO,CAAA,IAAM;MACjEhI,MACEgJ,OAAOhB,QAAO,SACde,uBAAUC,OAAOhB,QAAO,GAAI,CAACrI,OAAOD,QAAAA;AAClC,YAAI;AACF,kBAAQA,KAAAA;YACN,KAAK;YACL,KAAK;AACH,qBAAOC;YACT,KAAK;AACH,qBAAO2J,OAAOC,KAAK5J,KAAAA;YACrB;AACE,qBAAO,GAAGA,KAAAA;UACd;QACF,SAASnB,KAAK;AACZ,iBAAO,GAAGA,GAAAA;QACZ;MACF,CAAA;IACJ,EAAA;EACF;EAGQgL,kBAAkB;AACxB,WAAO,KAAK/B,MAAMgC;EACpB;;;;EAKA,MACMpE,MAAM,EAAEqE,OAAM,GAAiC;AAEnD,UAAMjE,QAAQC,IACZgE,QAAQtJ,IAAI,OAAO,EAAE+I,OAAOtB,WAAU,MAAE;AACtC9F,2BAAAA,WAAUoH,OAAO,gCAAA;;;;;;;;;AACjB,YAAMH,SAAS,KAAKT,KAAKR,QAAQF,UAAAA,KAA6B,KAAKJ,MAAMkC,KAAK9B,UAAAA;AAC9E,YAAM+B,aAAaZ,QAAQG,KAAAA;IAC7B,CAAA,KAAM,CAAA,CAAE;AAGV,UAAM,KAAK1B,MAAMpC,MAAMqE,QAAQtJ,IAAI,CAAC,EAAEyH,WAAU,MAAOA,UAAAA,CAAAA;EACzD;EAEAvF,SAASuH,SAAoD;AAC3D,WAAO,KAAKrC,eAAelF,SAASuH,OAAAA;EACtC;EAEA3G,gBAAgB2G,SAAyC;AACvD,WAAO,KAAKrC,eAAetE,gBAAgB2G,OAAAA;EAC7C;EAEA,MAAM1G,cAAiC;AACrC,WAAO,KAAKqE,eAAerE,YAAW;EACxC;;;;EAMAQ,kBAAuC;AACrC,WAAO,KAAK4D,aAAa5D,gBAAe;EAC1C;EAEAmG,gBAAgB5B,UAAqBO,WAAsB;AACzD/E,mBAAAA,KAAI,mBAAmB;MAAEwE;MAAUO;IAAU,GAAA;;;;;;AAC7CsB,gCAAW,KAAK1B,oBAAoBH,UAAU,MAAM,IAAI8B,uBAAWnD,sBAAUC,IAAI,CAAA,EAAGmD,IAAIxB,SAAAA;EAC1F;AACF;;EA5KGyB,qBAAMnG,KAAI;GAXAyC,cAAAA,WAAAA,WAAAA,MAAAA;;EA+GV0D,qBAAMnG,KAAK;IAAEoG,OAAO;EAAK,CAAA;GA/Gf3D,cAAAA,WAAAA,kBAAAA,IAAAA;;EAyIV0D,qBAAMnG,KAAK;IAAEoG,OAAO;EAAK,CAAA;GAzIf3D,cAAAA,WAAAA,mBAAAA,IAAAA;;EAiJV0D,qBAAME,KAAK;IAAEC,uBAAuB;EAAK,CAAA;GAjJ/B7D,cAAAA,WAAAA,SAAAA,IAAAA;AAAAA,gBAAAA,aAAAA;EADZ0D,qBAAMI,SAAQ;GACF9D,aAAAA;AAyLN,IAAM2B,qBAAqB,CAACL,QAAAA;AAEjC,QAAMyC,cAAczC,IAAI0C,QAAQtC,YAAYJ,IAAI2C;AAChD,MAAIF,eAAe,MAAM;AACvB,WAAO;EACT;AAEA,SAAOG,OAAOH,WAAAA;AAChB;AAEA,IAAMX,eAAe,OAAOZ,QAA6BG,UAAAA;AACvD,QAAMH,OAAO2B,UAAS;AACtB,QAAMC,mBAAmB,IAAI5D,IAAImC,KAAAA;AAEjC,QAAM0B,mBAAMC,KAAuC9B,QAAQ,QAAA,EAAU+B,iBAAiB,MAAA;AAEpF,eAAWC,cAAcJ,iBAAiBK,OAAM,GAAI;AAClD,UAAIC,qBAAqBlC,OAAOhB,QAAO,GAAIgD,UAAAA,GAAa;AACtDJ,yBAAiB5H,OAAOgI,UAAAA;MAC1B;IACF;AAEA,QAAIJ,iBAAiB/F,SAAS,GAAG;AAC/B,aAAO;IACT;AACA,WAAO;EACT,CAAA;AACF;AAEA,IAAMqG,uBAAuB,CAACpD,KAAekD,eAAAA;AAC3C,SAAO,CAAC,KAACG,6BAAWrD,GAAAA,EAAKsD,gBAAgBJ,UAAAA;AAC3C;;;;;;;;;;;;AMlOO,IAAMK,8BAAN,MAAMA;EAcXxN,YACmByN,WACA7D,OACjB;SAFiB6D,YAAAA;SACA7D,QAAAA;SAfX8D,sBAAkD;SAIzCC,yBAAyB,oBAAIvK,IAAAA;SAK7BwK,8BAA8B,oBAAIzE,IAAAA;SAEnC0E,yBAAyB,IAAIb,cAAAA,MAAAA;EAK1C;EAEHc,gBAAuC;AACrC,WAAO;SAAI,IAAI3E,IAAI,KAAKwE,uBAAuBP,OAAM,CAAA;;EACvD;EAEA,MACaW,uBAAuBC,KAAcC,YAAuC;AACvF,QAAI,KAAKP,uBAAuB,MAAM;AACpC;IACF;AACA,QAAI,CAACO,WAAWC,SAAS;AACvBrI,kBAAAA,IAAIsI,MAAM,mCAAmC;QAAE9D,UAAU,KAAKoD;MAAU,GAAA;;;;;;AACxE,WAAKW,qCAAqCJ,GAAAA;IAC5C,OAAO;AACL,YAAMK,oBAAoB,MAAM,KAAKC,eAAeN,KAAKC,WAAWC,OAAO;AAC3E,YAAMjE,MAAMoE,kBAAkBlE,QAAO;AACrCjG,4BAAAA,WAAU+F,KAAAA,QAAAA;;;;;;;;;AACV,UAAIA,IAAI0C,UAAU,MAAM;AACtB,aAAK4B,eAAeF,iBAAAA;MACtB;AACA,WAAKX,sBAAsBW;IAC7B;EACF;EAEOG,mBAAmBC,UAAkB;AAC1CvK,0BAAAA,WAAU,KAAKwJ,qBAAmB,QAAA;;;;;;;;;AAClC,QAAI,KAAKC,uBAAuB5I,IAAI0J,QAAAA,KAAa,KAAKb,4BAA4B7I,IAAI0J,QAAAA,GAAW;AAC/F;IACF;AACA,UAAMC,eAAe,KAAKhB,oBAAoBvD,QAAO;AACrDjG,0BAAAA,WAAUwK,cAAAA,QAAAA;;;;;;;;;AACV,UAAMC,eAAeD,aAAaE,SAAS,CAAC,GAAGH,QAAAA;AAC/C,QAAIE,eAAe,MAAM;AACvB,WAAKf,4BAA4BxB,IAAIqC,QAAAA;AACrC5I,kBAAAA,IAAIK,KAAK,sDAAsD;QAAEuI;MAAS,GAAA;;;;;;AAC1E;IACF;AACA,SAAKI,mBAAmB;MAAE,CAACJ,QAAAA,GAAWE;IAAY,CAAA;EACpD;EAEOG,qBAAqBF,OAA2B;AACrD,QAAI,CAACA,OAAO;AACV;IACF;AACA,UAAMG,oBAAoBtD,OAAO/D,QAAQkH,KAAAA,EAAO9G,OAAO,CAAC,CAAC2G,QAAAA,MACvD,KAAKb,4BAA4B7I,IAAI0J,QAAAA,CAAAA;AAEvC,SAAKI,mBAAmBpD,OAAOuD,YAAYD,iBAAAA,CAAAA;AAC3CA,sBAAkB3K,QAAQ,CAAC,CAACqK,QAAAA,MAAc,KAAKb,4BAA4BzI,OAAOsJ,QAAAA,CAAAA;EACpF;EAEOQ,wBAA6C;AAClD/K,0BAAAA,WAAU,KAAKwJ,qBAAmB,QAAA;;;;;;;;;AAClC,WAAO,KAAKA;EACd;EAEOwB,wBAAwBT,UAAuC;AACpEvK,0BAAAA,WAAU,KAAKwJ,qBAAmB,QAAA;;;;;;;;;AAClC,UAAMyB,iBAAiB,KAAKvF,MAAMwF,OAAM;AACxC,SAAKb,eAAeY,cAAAA;AACpB,SAAKE,wBAAwBF,gBAAgBV,QAAAA;AAC7C,SAAKf,oBAAoB4B,OAAO,CAACC,WAAAA;AAC/BA,aAAOX,UAAU,CAAC;AAClBW,aAAOX,MAAMH,QAAAA,IAAYU,eAAeK;IAC1C,CAAA;AACA,WAAOL;EACT;EAEOE,wBAAwBlE,QAA6BsD,UAAkB;AAC5E,SAAKd,uBAAuB3I,IAAIyJ,UAAUtD,MAAAA;EAC5C;EAEOsE,wBAAkC;AACvC,UAAMC,qBAAqB;SAAI,KAAK/B,uBAAuBjC,KAAI;;AAC/D,SAAKiC,uBAAuBgC,MAAK;AACjC,SAAKjC,sBAAsB;AAC3B,WAAOgC;EACT;EAEQb,mBAAmBD,OAA2B;AACpD,QAAI,CAACA,OAAO;AACV;IACF;AACA,eAAW,CAACH,UAAUmB,YAAAA,KAAiBnE,OAAO/D,QAAQkH,KAAAA,GAAQ;AAC5D,YAAMiB,UAAU;QAAEpB;QAAUmB;MAAa;AACzC,YAAME,uBAAuB,KAAKnC,uBAAuBlN,IAAIgO,QAAAA;AAC7D,UAAIqB,wBAAwB,QAAQA,qBAAqBN,QAAQI,cAAc;AAC7E/J,oBAAAA,IAAIkK,KAAK,qEAAqE;UAC5E,GAAGF;UACHG,mBAAmBF,qBAAqBN;QAC1C,GAAA;;;;;;AACA;MACF;AACA,UAAIM,sBAAsBN,QAAQI,cAAc;AAC9C/J,oBAAAA,IAAIkK,KAAK,sCAAsCF,SAAAA;;;;;;AAC/C;MACF;AACA,YAAM1E,SAAS,KAAKvB,MAAMkC,KAAe8D,YAAAA;AACzC/J,kBAAAA,IAAIoK,MAAM,8BAA8BJ,SAAAA;;;;;;AACxC,WAAKlC,uBAAuB3I,IAAIyJ,UAAUtD,MAAAA;AAC1C,WAAK,KAAK+E,4BAA4B/E,QAAQsD,QAAAA;IAChD;EACF;EAEA,MAAcH,eAAeN,KAAcwB,KAAa;AACtD,UAAMW,YAAY,KAAKvG,MAAMkC,KAAe0D,GAAAA;AAC5C,WAAO,MAAM;AACX,UAAI;AACF,kBAAMY,+BAAiB,KAAO,iDAAiD,YAAA;AAC7E,oBAAMC,mCAAkBrC,KAAKmC,UAAUrD,UAAS,CAAA;QAClD,CAAA;AACA;MACF,SAASnM,KAAK;AACZ,YAAI,GAAGA,GAAAA,GAAM2P,SAAS,SAAA,GAAY;AAChCzK,sBAAAA,IAAIK,KAAK,cAAc;YAAExB,IAAIyL,UAAUnG;YAAYoB,OAAO+E,UAAU/E;UAAM,GAAA;;;;;;AAC1E;QACF;AAEA,cAAMzK;MACR;IACF;AAEA,QAAIwP,UAAU/E,UAAU,eAAe;AACrC,YAAM,IAAImF,MAAM,mCAAA;IAClB;AAEA,WAAOJ;EACT;EAEQ/B,qCAAqCJ,KAAc;AACzD,UAAMmC,YAAY,KAAKvG,MAAMwF,OAAM;AACnC,SAAK1B,sBAAsByC;AAC3BnC,QAAIwC,UAAU,MAAA;AACZL,gBAAUhL,OAAM;AAChB,WAAKuI,sBAAsB;IAC7B,CAAA;EACF;EAEQa,eAAepD,QAA6B;AAClDA,WAAOmE,OAAO,CAACC,WAAAA;AACbA,aAAO5C,WAAW;QAAEtC,UAAU,KAAKoD,UAAUpH,MAAK;MAAG;AACrDkJ,aAAO5C,OAAOtC,WAAW,KAAKoD,UAAUpH,MAAK;IAC/C,CAAA;EACF;EAEA,MAAc6J,4BAA4B/E,QAA6BsD,UAAkB;AACvF,QAAI;AACF,YAAMtD,OAAOlB,IAAI;QAAC;OAAQ;AAC1B,YAAM4F,UAAU;QAAEpB;QAAUgC,QAAQtF,OAAOqE;MAAI;AAC/C,UAAI,KAAK3B,uBAAuB6C,cAAa,MAAO,GAAG;AACrD7K,oBAAAA,IAAIK,KAAK,oDAAoD2J,SAAAA;;;;;;AAC7D;MACF;AACA,YAAMc,kBAAkB,KAAKhD,uBAAuBlN,IAAIgO,QAAAA;AACxD,UAAIkC,iBAAiBnB,QAAQrE,OAAOqE,KAAK;AACvC3J,oBAAAA,IAAIkK,KAAK,sEAAsEF,SAAAA;;;;;;AAC/E;MACF;AACA,WAAKhC,uBAAuBpK,KAAK;QAAE0H;QAAQsD;MAAS,CAAA;IACtD,SAAS9N,KAAK;AACZ,YAAMiQ,qBAAqB,KAAK/C,uBAAuB6C,cAAa,IAAK;AACzE7K,kBAAAA,IAAIkK,KAAK,6BAA6B;QACpCtB;QACAmB,cAAczE,OAAOqE;QACrBqB,cAAcD;QACdjQ;MACF,GAAA;;;;;;AACA,UAAIiQ,oBAAoB;AACtB,cAAM,KAAKV,4BAA4B/E,QAAQsD,QAAAA;MACjD;IACF;EACF;AACF;;EAvKGpC,gBAAAA,MAAME,KAAK;IAAEC,uBAAuB;EAAK,CAAA;GAvB/BgB,4BAAAA,WAAAA,0BAAAA,IAAAA;AAAAA,8BAAAA,cAAAA;EADZnB,gBAAAA,MAAMI,SAAQ;GACFe,2BAAAA;ACjCN,IAAMsD,qBAAqB;AAY3B,IAAMC,kBAAkB,CAACC,eAAkD;EAChF,SAASF;;EAETG,QAAQD,UAAUC,UAAU;EAC5BC,UAAUF,UAAUE,YAAY;EAChCC,MAAMH,UAAUG,QAAQ;AAC1B;AAEO,IAAMC,kBAAkB,CAACtP,UAC9B,IAAIuP,6BAAUvP,MAAMmP,QAAQnP,MAAMoP,YAAY3Q,QAAWuB,MAAMqP,QAAQ5Q,MAAAA;AAElE,IAAM+Q,2BAA2B,CAACxP,UACvC,OAAOA,UAAU,YAAYA,UAAU,QAAQA,MAAM,OAAA,MAAagP;",
|
|
6
|
+
"names": ["import_context", "import_async", "import_automerge_repo", "import_invariant", "import_log", "import_util", "import_tracing", "LevelDBStorageAdapter", "Resource", "constructor", "_params", "load", "keyArray", "_lifecycleState", "LifecycleState", "OPEN", "undefined", "db", "get", "encodingOptions", "err", "isLevelDbNotFoundError", "save", "binary", "batch", "callbacks", "beforeSave", "path", "put", "Buffer", "from", "write", "afterSave", "remove", "del", "loadRange", "keyPrefix", "result", "key", "value", "iterator", "gte", "lte", "push", "data", "removeRange", "keyEncoder", "encode", "map", "k", "replaceAll", "join", "decode", "toString", "split", "keyEncoding", "valueEncoding", "code", "LocalHostNetworkAdapter", "NetworkAdapter", "_peers", "Map", "_connected", "Trigger", "_isConnected", "ready", "emit", "network", "connect", "peerId", "wake", "send", "message", "peer", "targetId", "invariant", "close", "forEach", "disconnect", "whenConnected", "wait", "timeout", "syncRepo", "id", "syncMessage", "_getPeerId", "Stream", "next", "has", "set", "connected", "cbor", "delete", "peerMetadata", "sendSyncMessage", "getHostInfo", "MeshNetworkAdapter", "_extensions", "receiverId", "extension", "payload", "catch", "log", "createExtension", "peerInfo", "AutomergeReplicator", "onStartReplication", "info", "remotePeerId", "thisPeerId", "toHex", "dxos_deviceKey", "onSyncMessage", "onClose", "AutomergeStorageAdapter", "_directory", "_state", "filename", "_getFilename", "file", "getOrCreateFile", "size", "stat", "buffer", "read", "bufferToArray", "arrayToBuffer", "truncate", "length", "flush", "destroy", "entries", "list", "Promise", "all", "filter", "entry", "startsWith", "_getKeyFromFilename", "levelMigration", "directory", "isNewLevel", "oldStorageAdapter", "type", "StorageType", "IDB", "IndexedDBStorageAdapter", "chunks", "AutomergeHost", "storageCallbacks", "_ctx", "Context", "ComplexMap", "PublicKey", "hash", "_requestedDocs", "Set", "_db", "_storageCallbacks", "open", "_storage", "_peerId", "random", "_meshNetwork", "_clientNetwork", "_repo", "Repo", "storage", "sharePolicy", "documentId", "doc", "handles", "docSync", "isRequested", "spaceKey", "getSpaceKeyFromDoc", "authorizedDevices", "_authorizedDevices", "deviceKeyHex", "repo", "peerMetadataByPeerId", "deviceKey", "isAuthorized", "localPeer", "remotePeer", "dispose", "_automergeDocs", "mapValues", "handle", "state", "hasDoc", "heads", "automerge", "getHeads", "Object", "keys", "_automergePeers", "peers", "states", "find", "waitForHeads", "request", "authorizeDevice", "defaultMap", "ComplexSet", "add", "trace", "depth", "span", "showInBrowserTimeline", "resource", "rawSpaceKey", "access", "experimental_spaceKey", "String", "whenReady", "unavailableHeads", "Event", "wrap", "waitForCondition", "changeHash", "values", "changeIsPresentInDoc", "getBackend", "getChangeByHash", "AutomergeDocumentLoaderImpl", "_spaceKey", "_spaceRootDocHandle", "_objectDocumentHandles", "_objectsPendingDocumentLoad", "onObjectDocumentLoaded", "getAllHandles", "loadSpaceRootDocHandle", "ctx", "spaceState", "rootUrl", "error", "_createContextBoundSpaceRootDocument", "existingDocHandle", "_initDocHandle", "_initDocAccess", "loadObjectDocument", "objectId", "spaceRootDoc", "documentUrl", "links", "_loadLinkedObjects", "onObjectLinksUpdated", "linksAwaitingLoad", "fromEntries", "getSpaceRootDocHandle", "createDocumentForObject", "spaceDocHandle", "create", "onObjectBoundToDocument", "change", "newDoc", "url", "clearHandleReferences", "objectsWithHandles", "clear", "automergeUrl", "logMeta", "objectDocumentHandle", "warn", "actualDocumentUrl", "debug", "_createObjectOnDocumentLoad", "docHandle", "warnAfterTimeout", "cancelWithContext", "includes", "Error", "onDispose", "docUrl", "listenerCount", "objectDocHandle", "shouldRetryLoading", "retryLoading", "REFERENCE_TYPE_TAG", "encodeReference", "reference", "itemId", "protocol", "host", "decodeReference", "Reference", "isEncodedReferenceObject"]
|
|
7
7
|
}
|