@fairfox/polly 0.65.0 → 0.67.0
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/src/mesh.js +70 -8
- package/dist/src/mesh.js.map +4 -4
- package/dist/src/shared/lib/mesh-client.d.ts +76 -0
- package/package.json +1 -1
package/dist/src/mesh.js
CHANGED
|
@@ -2071,6 +2071,31 @@ function buildHandleFactory(repo, key, initialDoc) {
|
|
|
2071
2071
|
}
|
|
2072
2072
|
};
|
|
2073
2073
|
}
|
|
2074
|
+
var SEED_ACTOR_DOMAIN = "polly/meshState/seedActor/v1";
|
|
2075
|
+
function deriveSeedActor(documentId) {
|
|
2076
|
+
const docIdString = documentId;
|
|
2077
|
+
const digest = nacl3.hash(keyEncoder.encode(`${SEED_ACTOR_DOMAIN}:${docIdString}`));
|
|
2078
|
+
let hex = "";
|
|
2079
|
+
for (let i = 0;i < 16; i++) {
|
|
2080
|
+
hex += (digest[i] ?? 0).toString(16).padStart(2, "0");
|
|
2081
|
+
}
|
|
2082
|
+
return hex;
|
|
2083
|
+
}
|
|
2084
|
+
function seedDocumentBytes(documentId, initialDoc) {
|
|
2085
|
+
const disable = typeof process !== "undefined" && process.env?.["POLLY_113_DISABLE_FIX"] === "1";
|
|
2086
|
+
if (disable) {
|
|
2087
|
+
return Automerge.save(Automerge.from(initialDoc));
|
|
2088
|
+
}
|
|
2089
|
+
const actor = deriveSeedActor(documentId);
|
|
2090
|
+
const empty = Automerge.init({ actor });
|
|
2091
|
+
const seeded = Automerge.change(empty, { time: 0 }, (d) => {
|
|
2092
|
+
const source = initialDoc;
|
|
2093
|
+
for (const key of Object.keys(source)) {
|
|
2094
|
+
d[key] = source[key];
|
|
2095
|
+
}
|
|
2096
|
+
});
|
|
2097
|
+
return Automerge.save(seeded);
|
|
2098
|
+
}
|
|
2074
2099
|
async function loadOrSeed(repo, documentId, initialDoc, docIdString, setExitReason) {
|
|
2075
2100
|
const loadPromise = repo.storageSubsystem?.loadDoc(documentId);
|
|
2076
2101
|
const stored = loadPromise ? await withStorageTimeout("loadDoc", docIdString, loadPromise) : undefined;
|
|
@@ -2078,7 +2103,7 @@ async function loadOrSeed(repo, documentId, initialDoc, docIdString, setExitReas
|
|
|
2078
2103
|
setExitReason("loaded-from-storage");
|
|
2079
2104
|
return repo.find(documentId, { allowableStates: ["ready"] });
|
|
2080
2105
|
}
|
|
2081
|
-
const seeded =
|
|
2106
|
+
const seeded = seedDocumentBytes(documentId, initialDoc);
|
|
2082
2107
|
const handle = repo.import(seeded, { docId: documentId });
|
|
2083
2108
|
handle.doneLoading();
|
|
2084
2109
|
setExitReason("seeded-and-imported");
|
|
@@ -3261,14 +3286,49 @@ async function resolveIceServers(rtc) {
|
|
|
3261
3286
|
}
|
|
3262
3287
|
return rtc?.iceServers;
|
|
3263
3288
|
}
|
|
3264
|
-
function buildHandleEntry(state, wire) {
|
|
3289
|
+
function buildHandleEntry(state, wire, syncStateView) {
|
|
3265
3290
|
return {
|
|
3266
3291
|
state,
|
|
3267
3292
|
announcedToPeer: wire?.lastSyncMessageOutAt !== undefined,
|
|
3268
3293
|
lastSyncMessageOutAt: wire?.lastSyncMessageOutAt,
|
|
3269
3294
|
lastSyncMessageInAt: wire?.lastSyncMessageInAt,
|
|
3270
3295
|
lastSyncMessageOutSize: wire?.lastSyncMessageOutSize,
|
|
3271
|
-
lastSyncMessageOutType: wire?.lastSyncMessageOutType
|
|
3296
|
+
lastSyncMessageOutType: wire?.lastSyncMessageOutType,
|
|
3297
|
+
docSynchronizerExists: syncStateView.docSynchronizerExists,
|
|
3298
|
+
docSynchronizerKnowsPeer: syncStateView.docSynchronizerKnowsPeer,
|
|
3299
|
+
peerDocumentStatus: syncStateView.peerDocumentStatus
|
|
3300
|
+
};
|
|
3301
|
+
}
|
|
3302
|
+
var EMPTY_SYNC_VIEW = {
|
|
3303
|
+
docSynchronizerExists: false,
|
|
3304
|
+
docSynchronizerKnowsPeer: undefined,
|
|
3305
|
+
peerDocumentStatus: undefined
|
|
3306
|
+
};
|
|
3307
|
+
function getCollectionSynchronizer(repo) {
|
|
3308
|
+
const sync = repo.synchronizer;
|
|
3309
|
+
return sync && typeof sync === "object" ? sync : undefined;
|
|
3310
|
+
}
|
|
3311
|
+
function buildSyncView(synchronizer, docId, peerId) {
|
|
3312
|
+
const docSync = synchronizer?.docSynchronizers?.[docId];
|
|
3313
|
+
if (!docSync)
|
|
3314
|
+
return EMPTY_SYNC_VIEW;
|
|
3315
|
+
let knowsPeer;
|
|
3316
|
+
try {
|
|
3317
|
+
knowsPeer = typeof docSync.hasPeer === "function" ? docSync.hasPeer(peerId) : undefined;
|
|
3318
|
+
} catch {
|
|
3319
|
+
knowsPeer = undefined;
|
|
3320
|
+
}
|
|
3321
|
+
let status;
|
|
3322
|
+
try {
|
|
3323
|
+
const states = docSync.peerStates;
|
|
3324
|
+
status = states && typeof states === "object" ? states[peerId] : undefined;
|
|
3325
|
+
} catch {
|
|
3326
|
+
status = undefined;
|
|
3327
|
+
}
|
|
3328
|
+
return {
|
|
3329
|
+
docSynchronizerExists: true,
|
|
3330
|
+
docSynchronizerKnowsPeer: knowsPeer,
|
|
3331
|
+
peerDocumentStatus: status
|
|
3272
3332
|
};
|
|
3273
3333
|
}
|
|
3274
3334
|
function stringifyHandleState(handle) {
|
|
@@ -3276,18 +3336,19 @@ function stringifyHandleState(handle) {
|
|
|
3276
3336
|
return "unknown";
|
|
3277
3337
|
return typeof handle.state === "string" ? handle.state : String(handle.state ?? "unknown");
|
|
3278
3338
|
}
|
|
3279
|
-
function enrichPeerSlot(peer, knownHandleIds, repoHandles) {
|
|
3339
|
+
function enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer) {
|
|
3280
3340
|
if (!peer.slot) {
|
|
3281
3341
|
return { ...peer, slot: undefined };
|
|
3282
3342
|
}
|
|
3343
|
+
const peerIdString = peer.peerId;
|
|
3283
3344
|
const enriched = {};
|
|
3284
3345
|
for (const docId of knownHandleIds) {
|
|
3285
|
-
enriched[docId] = buildHandleEntry(stringifyHandleState(repoHandles[docId]), peer.slot.handles[docId]);
|
|
3346
|
+
enriched[docId] = buildHandleEntry(stringifyHandleState(repoHandles[docId]), peer.slot.handles[docId], buildSyncView(synchronizer, docId, peerIdString));
|
|
3286
3347
|
}
|
|
3287
3348
|
for (const docId of Object.keys(peer.slot.handles)) {
|
|
3288
3349
|
if (enriched[docId])
|
|
3289
3350
|
continue;
|
|
3290
|
-
enriched[docId] = buildHandleEntry("unknown", peer.slot.handles[docId]);
|
|
3351
|
+
enriched[docId] = buildHandleEntry("unknown", peer.slot.handles[docId], buildSyncView(synchronizer, docId, peerIdString));
|
|
3291
3352
|
}
|
|
3292
3353
|
return { ...peer, slot: { ...peer.slot, handles: enriched } };
|
|
3293
3354
|
}
|
|
@@ -3449,7 +3510,8 @@ async function createMeshClient(options) {
|
|
|
3449
3510
|
const base = webrtcAdapter.getPeerStateSnapshot();
|
|
3450
3511
|
const repoHandles = repo.handles;
|
|
3451
3512
|
const knownHandleIds = Object.keys(repoHandles);
|
|
3452
|
-
const
|
|
3513
|
+
const synchronizer = getCollectionSynchronizer(repo);
|
|
3514
|
+
const enrichedPeers = base.peers.map((peer) => enrichPeerSlot(peer, knownHandleIds, repoHandles, synchronizer));
|
|
3453
3515
|
const out = {
|
|
3454
3516
|
localPeerId: base.localPeerId,
|
|
3455
3517
|
knownPeerIds: base.knownPeerIds,
|
|
@@ -3903,4 +3965,4 @@ export {
|
|
|
3903
3965
|
$meshCounter
|
|
3904
3966
|
};
|
|
3905
3967
|
|
|
3906
|
-
//# debugId=
|
|
3968
|
+
//# debugId=4774A427A7ED246964756E2164756E21
|