@unicitylabs/sphere-sdk 0.14.11-dev.3 → 0.14.11-dev.5

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.
@@ -2844,6 +2844,12 @@ var InventoryView = class {
2844
2844
  release(tokenId) {
2845
2845
  if (this.inFlight.delete(tokenId)) this.deps.emit("inventory:updated");
2846
2846
  }
2847
+ /** Release a whole set as ONE change (per-token emitted 54 events per send). */
2848
+ releaseMany(tokenIds) {
2849
+ let changed = false;
2850
+ for (const tokenId of tokenIds) if (this.inFlight.delete(tokenId)) changed = true;
2851
+ if (changed) this.deps.emit("inventory:updated");
2852
+ }
2847
2853
  pinned(tokenId) {
2848
2854
  return this.deps.isPinned?.(tokenId) ?? false;
2849
2855
  }
@@ -3153,7 +3159,7 @@ var logger = {
3153
3159
 
3154
3160
  // modules/payments-v2/receive/Receive.ts
3155
3161
  var ACK_BATCH_SIZE = 200;
3156
- var REFRESH_INTERVAL_MS = 750;
3162
+ var REFRESH_INTERVAL_MS = 2500;
3157
3163
  var POLL_INTERVAL_MS = 3e4;
3158
3164
  var ATTENTION_CLAIM_CONFLICT = "claim:conflict";
3159
3165
  function receivedDedupKey(tokenId, stateHash) {
@@ -4082,6 +4088,16 @@ function parseAmount(raw) {
4082
4088
  function supportsDeterministicMint(engine) {
4083
4089
  return engine.deterministicMint === true;
4084
4090
  }
4091
+ function makeSingleFlightRefresh(refresh) {
4092
+ let inFlight = false;
4093
+ return () => {
4094
+ if (inFlight) return;
4095
+ inFlight = true;
4096
+ void refresh().catch(() => void 0).finally(() => {
4097
+ inFlight = false;
4098
+ });
4099
+ };
4100
+ }
4085
4101
  function composeFacadeParts(deps, hooks) {
4086
4102
  const ownPubkeyBytes = hexToBytes(deps.ownPubkey);
4087
4103
  const ledger = new ReservationLedger();
@@ -4203,11 +4219,10 @@ function buildReceive(deps, hooks, historyStore, heldStates, view) {
4203
4219
  registry: deps.registry,
4204
4220
  recordReceived: (record) => recordReceived(historyStore, record),
4205
4221
  emit: (event, transfer) => deps.emit(event, transfer),
4206
- // The mirror is the balance the wallet renders; refresh it as the drain runs
4207
- // so a multi-token receive lands progressively instead of all at the end.
4208
- refreshView: () => {
4209
- void view.delta().catch(() => void 0);
4210
- },
4222
+ // Single-flight: view.delta() enqueues on a strict-FIFO SerialChain, so
4223
+ // firing per throttle tick regardless of the last one builds a queue that
4224
+ // drains in a burst at the END — a slower version of the bug being fixed.
4225
+ refreshView: makeSingleFlightRefresh(() => view.delta()),
4211
4226
  attention: (transferId, code, detail) => {
4212
4227
  deps.emit(
4213
4228
  "transfer:attention",
@@ -4652,7 +4667,7 @@ var PaymentsFacade = class {
4652
4667
  settleFailure(transferId, coinId, releaseIds) {
4653
4668
  this.ledger.cancel(transferId);
4654
4669
  this.queue.clearExpectedChange(transferId);
4655
- for (const tokenId of releaseIds) this.view.release(tokenId);
4670
+ this.view.releaseMany(releaseIds);
4656
4671
  this.queue.notifyChange(coinId);
4657
4672
  }
4658
4673
  /** Open intent: sources stay reserved + in-flight (§5.2) until resume adopts them. */
@@ -4677,7 +4692,7 @@ var PaymentsFacade = class {
4677
4692
  async refreshThenRelease(coinId, spentIds) {
4678
4693
  try {
4679
4694
  await this.view.delta();
4680
- for (const tokenId of spentIds) this.view.release(tokenId);
4695
+ this.view.releaseMany(spentIds);
4681
4696
  } finally {
4682
4697
  this.queue.notifyChange(coinId);
4683
4698
  }