@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 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 = Automerge.save(Automerge.from(initialDoc));
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 enrichedPeers = base.peers.map((peer) => enrichPeerSlot(peer, knownHandleIds, repoHandles));
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=9FE5660EB3793A1964756E2164756E21
3968
+ //# debugId=4774A427A7ED246964756E2164756E21