@glyphteck/veyl 0.74.2 → 0.75.1

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/index.js CHANGED
@@ -5855,7 +5855,7 @@ var init_canonical = __esm(() => {
5855
5855
  });
5856
5856
 
5857
5857
  // ../../core/config.js
5858
- var MS_PER_SECOND = 1000, MINUTE_MS, HOUR_MS, DAY_MS, KIB_BYTES = 1024, MIB_BYTES, SATS_PER_BITCOIN = 100000000n, USERNAME_MAX_CHARS = 12, PASSWORD_MIN_CHARS = 15, PASSWORD_MAX_CHARS = 64, PASSWORD_MAX_BYTES, ACCOUNT_CONNECTION_SLOW_MS, ACCOUNT_CONNECTION_UNAVAILABLE_MS, ACCOUNT_CONNECTION_RETRY_MIN_MS, ACCOUNT_CONNECTION_RETRY_MAX_MS, AUTOLOCK_MIN_MINUTES = 1, AUTOLOCK_MAX_MINUTES = 60, BTC_PRICE_FALLBACK = 80000, CHAT_MESSAGE_EDIT_WINDOW_MS, CHAT_SEND_CONNECTION_WAIT_MS, CALL_SPEAKING_THRESHOLD = 0.02, CALL_SPEAKING_HOLD_MS = 320, LOCAL_CACHE_WRITE_DELAY_MS = 350, LOCAL_MEDIA_CACHE_MAX_BYTES, LOCAL_MEDIA_CACHE_MAX_ITEMS = 1000, LOCAL_MEDIA_ACCESS_TOUCH_MIN_MS, LOCAL_PROFILE_CACHE_MAX_ITEMS = 500, LOCAL_PROFILE_CACHE_MAX_AGE_MS, LOCAL_CHAT_CACHE_MAX_ITEMS = 1000, LOCAL_CHAT_MESSAGE_CACHE_MAX_VISIBLE = 1000, LOCAL_CHAT_MESSAGE_CACHE_WRITE_DELAY_MS = 2500, LOCAL_AVATAR_CACHE_MAX_BYTES, LOCAL_AVATAR_CACHE_MAX_AGE_MS, AVATAR_IMAGE_MAX_BYTES, AVATAR_IMAGE_QUALITY_ATTEMPTS, CHAT_AVATAR_IMAGE_MAX_BYTES, CHAT_AVATAR_REF_MAX_CHARS = 256, CHAT_MESSAGE_FILE_CACHE_MAX_BYTES, IDLE_CALLBACK_MIN_TIMEOUT_MS = 50, ATTACHMENT_CACHE_IDLE_TIMEOUT_MS = 2500, ATTACHMENT_CACHE_FALLBACK_DELAY_MS = 250, CHAT_UNSAVED_TTL_DAYS = 21, CHAT_UNSAVED_TTL_MS, CHAT_AFTER_SEEN_MS, CHAT_MEDIA_TTL_DAYS, CHAT_MEDIA_TTL_MS, CHAT_UPLOAD_MAX_BYTES, CHAT_AUDIO_TRANSCODE_BITRATE_BPS = 128000, CHAT_VIDEO_TRANSCODE_VIDEO_BITRATE_BPS = 3000000, CHAT_VIDEO_TRANSCODE_AUDIO_BITRATE_BPS, CHAT_MESSAGE_BATCH_SIZE = 40, CHAT_MESSAGE_QUERY_MAX_DOCS = 120, CHAT_MESSAGE_MUTATION_MAX_ITEMS = 256, CHAT_TTL_CLIENT_DELETE_GRACE_MS, CHAT_BATCH_CLEANUP_IDLE_TIMEOUT_MS = 1500, CHAT_BATCH_CLEANUP_IDLE_DELAY_MS = 250, CHAT_LIST_PAGE_SIZE = 20, CHAT_ADMISSION_CACHE_PEERS = 1024, CHAT_LIST_LIVE_COUNT, CHAT_INBOX_PING_PAGE_SIZE = 25, CHAT_INBOX_DISCOVERY_PARALLEL_CHATS, CHAT_INBOX_SETTLEMENT_PARALLEL_CHATS = 4, CHAT_INBOX_CURSOR_OVERLAP_MS, CHAT_LIST_CACHE_WRITE_DELAY_MS = 1500, CHAT_LIST_SNAPSHOT_COALESCE_MS = 80, CHAT_LIST_COMPLETE_SYNC_DELAY_MS = 250, CHAT_LIST_LISTENER_RETRY_MS = 1000, CHAT_TOP_WARM_COUNT = 0, CHAT_EAGER_WARM_COUNT = 0, CHAT_WARM_DELAY_MS = 3000, CHAT_WARM_BATCH_SIZE, CHAT_MESSAGE_VIEW_CACHE_SIZE = 30, CHAT_MEDIA_WARM_MESSAGES_PER_CHAT, CHAT_MEDIA_WARM_START_DELAY_MS = 600, CHAT_MEDIA_WARM_STEP_DELAY_MS = 120, CHAT_MEDIA_WARM_TYPES, CHAT_MEDIA_WARM_MAX_BYTES = 0, CHAT_READ_WRITE_INTERVAL_MS, CHAT_READ_WRITE_MAX_WAIT_MS, CHAT_LIVE_PING_INTERVAL_MS, CHAT_LIVE_SWEEP_INTERVAL_MS, CHAT_LIVE_STALE_AFTER_MS, LIVE_RECONNECT_MIN_MS = 500, LIVE_RECONNECT_MAX_MS, LIVE_RECONNECT_STABLE_MS, LIVE_READY_TIMEOUT_MS, CHAT_LIVE_TYPING_IDLE_MS, CHAT_LIVE_TYPING_RENEW_MS, CHAT_LIVE_COMPOSITION_HANDOFF_MS, CHAT_LIVE_READ_SEND_INTERVAL_MS = 120, CHAT_LIVE_READ_SEND_MAX_WAIT_MS = 500, CHAT_LIVE_READ_WRITE_INTERVAL_MS, CHAT_LIVE_READ_WRITE_MAX_WAIT_MS, CHAT_SEND_QUEUE_RATE_LIMIT_COUNT = 12, CHAT_SEND_QUEUE_RATE_LIMIT_WINDOW_MS, CHAT_SETTINGS_BODY_MAX_BYTES, CHAT_TITLE_STATE_MAX_CHARS = 128, CHAT_MANIFEST_MAX_BYTES, CHAT_RECEIPT_MAX_MEMBERS = 32, CHAT_ORDINARY_DELIVERY_MAX_MEMBERS = 128, CHAT_MAX_MEMBERS = 256, CHAT_LARGE_GROUP_MENTION_MAX_TARGETS = 16, CHAT_MAX_TEXT_CHARS = 2048, CHAT_TITLE_INPUT_MAX_CHARS = 16, CHAT_MAX_REACTIONS, SEARCH_DEBOUNCE_MS = 300, SEARCH_USERNAME_LIMIT = 15, SEARCH_ROLE_LIMIT = 15, RECENT_PEER_REFRESH_LIMIT = 50, RECENT_PEER_REFRESH_DELAY_MS = 250, RECENT_PEER_REFRESH_THROTTLE_MS = 120, BAN_REFRESH_GRACE_MS = 50, REQUEST_MONEY_MAX_SATS, WALLET_TRANSFER_POLL_MS, WALLET_ACTIVE_TRANSFER_REFRESH_MS, WALLET_CACHE_HYDRATE_DELAY_MS = 0, WALLET_BOOT_REFRESH_DELAY_MS = 500, WALLET_BOOT_CACHED_REFRESH_DELAY_MS = 2500, WALLET_REGTEST_DEPOSIT_CLAIM_POLL_MS, WALLET_MAINNET_DEPOSIT_CLAIM_POLL_MS, WALLET_BALANCE_EVENT_COALESCE_MS, WALLET_INCOMING_UPDATE_COALESCE_MS = 250, WALLET_AUTO_CLAIM_MAX_FEE_SATS = 5000, WALLET_CLAIM_PAGE_SIZE = 100, WALLET_PENDING_TRANSFER_CLAIM_BATCH_SIZE = 50, WALLET_PENDING_TRANSFER_STATUS_BATCH_SIZE = 2, WALLET_PENDING_TRANSFER_COLD_REFRESH_BATCH_SIZE = 50, WALLET_PENDING_TRANSFER_COLD_REFRESH_INTERVAL_MS, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_SMALL_QUEUE = 3, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_LARGE_QUEUE = 10, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_SMALL_SIZE = 2, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_LARGE_SIZE = 3, WALLET_PENDING_TRANSFER_SLOW_CLAIM_MS, WALLET_PENDING_TRANSFER_CLAIM_COOLDOWN_MS, WALLET_SDK_BACKGROUND_QUIET_MS, WALLET_RECENT_TRANSFER_LIMIT = 100, WALLET_TRANSFER_PAGE_LIMIT = 100, WALLET_TRANSFER_FETCH_THROTTLE_MS = 150, WALLET_PENDING_TRANSFER_CLAIM_RETRY_MS, WALLET_SENT_TRANSFER_REFRESH_DELAY_MS, WALLET_PENDING_TRANSFER_BOOT_GRACE_MS, WALLET_PENDING_TRANSFER_HOT_AGE_MS, WALLET_PENDING_TRANSFER_WARM_AGE_MS, WALLET_PENDING_TRANSFER_WARM_RETRY_MS, WALLET_PENDING_TRANSFER_STALE_RETRY_MS, WALLET_PENDING_TRANSFER_STUCK_RETRY_MS, WALLET_PENDING_TRANSFER_DORMANT_RETRY_MS, WALLET_TRANSFER_CACHE_WRITE_DELAY_MS, BITCOIN_POLL_MS = 60000, BITCOIN_FETCH_TIMEOUT_MS = 8000, BITCOIN_FEES_MAX_AGE_MS;
5858
+ var MS_PER_SECOND = 1000, MINUTE_MS, HOUR_MS, DAY_MS, KIB_BYTES = 1024, MIB_BYTES, SATS_PER_BITCOIN = 100000000n, USERNAME_MAX_CHARS = 12, PASSWORD_MIN_CHARS = 15, PASSWORD_MAX_CHARS = 64, PASSWORD_MAX_BYTES, ACCOUNT_CONNECTION_SLOW_MS, ACCOUNT_CONNECTION_UNAVAILABLE_MS, ACCOUNT_CONNECTION_RETRY_MIN_MS, ACCOUNT_CONNECTION_RETRY_MAX_MS, AUTOLOCK_MIN_MINUTES = 1, AUTOLOCK_MAX_MINUTES = 60, BTC_PRICE_FALLBACK = 80000, CHAT_MESSAGE_EDIT_WINDOW_MS, CHAT_SEND_CONNECTION_WAIT_MS, CALL_SPEAKING_THRESHOLD = 0.02, CALL_SPEAKING_HOLD_MS = 320, LOCAL_CACHE_WRITE_DELAY_MS = 350, LOCAL_MEDIA_CACHE_MAX_BYTES, LOCAL_MEDIA_CACHE_MAX_ITEMS = 1000, LOCAL_MEDIA_ACCESS_TOUCH_MIN_MS, LOCAL_PROFILE_CACHE_MAX_ITEMS = 500, LOCAL_PROFILE_CACHE_MAX_AGE_MS, LOCAL_CHAT_CACHE_MAX_ITEMS = 1000, LOCAL_CHAT_MESSAGE_CACHE_MAX_VISIBLE = 1000, LOCAL_CHAT_MESSAGE_CACHE_WRITE_DELAY_MS = 2500, LOCAL_AVATAR_CACHE_MAX_BYTES, LOCAL_AVATAR_CACHE_MAX_AGE_MS, AVATAR_IMAGE_MAX_BYTES, AVATAR_IMAGE_QUALITY_ATTEMPTS, CHAT_AVATAR_IMAGE_MAX_BYTES, CHAT_AVATAR_REF_MAX_CHARS = 256, CHAT_MESSAGE_FILE_CACHE_MAX_BYTES, IDLE_CALLBACK_MIN_TIMEOUT_MS = 50, ATTACHMENT_CACHE_IDLE_TIMEOUT_MS = 2500, ATTACHMENT_CACHE_FALLBACK_DELAY_MS = 250, CHAT_UNSAVED_TTL_DAYS = 21, CHAT_UNSAVED_TTL_MS, CHAT_AFTER_SEEN_MS, CHAT_MEDIA_TTL_DAYS, CHAT_MEDIA_TTL_MS, CHAT_UPLOAD_MAX_BYTES, CHAT_AUDIO_TRANSCODE_BITRATE_BPS = 128000, CHAT_VIDEO_TRANSCODE_VIDEO_BITRATE_BPS = 3000000, CHAT_VIDEO_TRANSCODE_AUDIO_BITRATE_BPS, CHAT_MESSAGE_BATCH_SIZE = 40, CHAT_MESSAGE_QUERY_MAX_DOCS = 120, CHAT_MESSAGE_MUTATION_MAX_ITEMS = 256, CHAT_TTL_CLIENT_DELETE_GRACE_MS, CHAT_BATCH_CLEANUP_IDLE_TIMEOUT_MS = 1500, CHAT_BATCH_CLEANUP_IDLE_DELAY_MS = 250, CHAT_LIST_PAGE_SIZE = 20, CHAT_ADMISSION_CACHE_PEERS = 1024, CHAT_LIST_LIVE_COUNT, CHAT_INBOX_PING_PAGE_SIZE = 25, CHAT_INBOX_DISCOVERY_PARALLEL_CHATS, CHAT_INBOX_SETTLEMENT_PARALLEL_CHATS = 4, CHAT_INBOX_CURSOR_OVERLAP_MS, CHAT_LIST_CACHE_WRITE_DELAY_MS = 1500, CHAT_LIST_SNAPSHOT_COALESCE_MS = 80, CHAT_LIST_COMPLETE_SYNC_DELAY_MS = 250, CHAT_LIST_LISTENER_RETRY_MS = 1000, CHAT_TOP_WARM_COUNT = 0, CHAT_EAGER_WARM_COUNT = 0, CHAT_WARM_DELAY_MS = 3000, CHAT_WARM_BATCH_SIZE, CHAT_MESSAGE_VIEW_CACHE_SIZE = 30, CHAT_MEDIA_WARM_MESSAGES_PER_CHAT, CHAT_MEDIA_WARM_START_DELAY_MS = 600, CHAT_MEDIA_WARM_STEP_DELAY_MS = 120, CHAT_MEDIA_WARM_TYPES, CHAT_MEDIA_WARM_MAX_BYTES = 0, CHAT_READ_WRITE_INTERVAL_MS, CHAT_READ_WRITE_MAX_WAIT_MS, CHAT_LIVE_PING_INTERVAL_MS, CHAT_LIVE_SWEEP_INTERVAL_MS, CHAT_LIVE_STALE_AFTER_MS, LIVE_RECONNECT_MIN_MS = 500, LIVE_RECONNECT_MAX_MS, LIVE_RECONNECT_STABLE_MS, LIVE_READY_TIMEOUT_MS, CHAT_LIVE_TYPING_IDLE_MS, CHAT_LIVE_TYPING_RENEW_MS, CHAT_LIVE_COMPOSITION_HANDOFF_MS, CHAT_LIVE_READ_SEND_INTERVAL_MS = 120, CHAT_LIVE_READ_SEND_MAX_WAIT_MS = 500, CHAT_LIVE_READ_WRITE_INTERVAL_MS, CHAT_LIVE_READ_WRITE_MAX_WAIT_MS, CHAT_SEND_QUEUE_RATE_LIMIT_COUNT = 12, CHAT_SEND_QUEUE_RATE_LIMIT_WINDOW_MS, CHAT_SETTINGS_BODY_MAX_BYTES, CHAT_TITLE_STATE_MAX_CHARS = 128, CHAT_MANIFEST_MAX_BYTES, CHAT_RECEIPT_MAX_MEMBERS = 32, CHAT_ORDINARY_DELIVERY_MAX_MEMBERS = 128, CHAT_MAX_MEMBERS = 256, CHAT_LARGE_GROUP_MENTION_MAX_TARGETS = 16, CHAT_MAX_TEXT_CHARS = 2048, CHAT_TITLE_INPUT_MAX_CHARS = 16, CHAT_MAX_REACTIONS, SEARCH_DEBOUNCE_MS = 300, SEARCH_USERNAME_LIMIT = 15, SEARCH_ROLE_LIMIT = 15, RECENT_PEER_REFRESH_LIMIT = 50, RECENT_PEER_REFRESH_DELAY_MS = 250, RECENT_PEER_REFRESH_THROTTLE_MS = 120, BAN_REFRESH_GRACE_MS = 50, REQUEST_MONEY_MAX_SATS, WALLET_TRANSFER_POLL_MS, WALLET_TRANSFER_REPAIR_MS, WALLET_CACHE_HYDRATE_DELAY_MS = 0, WALLET_BOOT_REFRESH_DELAY_MS = 500, WALLET_BOOT_CACHED_REFRESH_DELAY_MS = 2500, WALLET_REGTEST_DEPOSIT_CLAIM_POLL_MS, WALLET_MAINNET_DEPOSIT_CLAIM_POLL_MS, WALLET_BALANCE_EVENT_COALESCE_MS = 100, WALLET_INCOMING_UPDATE_COALESCE_MS = 250, WALLET_AUTO_CLAIM_MAX_FEE_SATS = 5000, WALLET_CLAIM_PAGE_SIZE = 100, WALLET_PENDING_TRANSFER_CLAIM_BATCH_SIZE = 50, WALLET_PENDING_TRANSFER_STATUS_BATCH_SIZE = 2, WALLET_PENDING_TRANSFER_COLD_REFRESH_BATCH_SIZE = 50, WALLET_PENDING_TRANSFER_COLD_REFRESH_INTERVAL_MS, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_SMALL_QUEUE = 3, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_LARGE_QUEUE = 10, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_SMALL_SIZE = 2, WALLET_PENDING_TRANSFER_ADAPTIVE_BATCH_LARGE_SIZE = 3, WALLET_PENDING_TRANSFER_SLOW_CLAIM_MS, WALLET_PENDING_TRANSFER_CLAIM_COOLDOWN_MS, WALLET_SDK_BACKGROUND_QUIET_MS, WALLET_RECENT_TRANSFER_LIMIT = 100, WALLET_TRANSFER_PAGE_LIMIT = 100, WALLET_TRANSFER_FETCH_THROTTLE_MS = 150, WALLET_PENDING_TRANSFER_CLAIM_RETRY_MS, WALLET_SENT_TRANSFER_REFRESH_DELAY_MS, WALLET_PENDING_TRANSFER_BOOT_GRACE_MS, WALLET_PENDING_TRANSFER_HOT_AGE_MS, WALLET_PENDING_TRANSFER_WARM_AGE_MS, WALLET_PENDING_TRANSFER_WARM_RETRY_MS, WALLET_PENDING_TRANSFER_STALE_RETRY_MS, WALLET_PENDING_TRANSFER_STUCK_RETRY_MS, WALLET_PENDING_TRANSFER_DORMANT_RETRY_MS, WALLET_TRANSFER_CACHE_WRITE_DELAY_MS, BITCOIN_POLL_MS = 60000, BITCOIN_FETCH_TIMEOUT_MS = 8000, BITCOIN_FEES_MAX_AGE_MS;
5859
5859
  var init_config = __esm(() => {
5860
5860
  MINUTE_MS = 60 * MS_PER_SECOND;
5861
5861
  HOUR_MS = 60 * MINUTE_MS;
@@ -5909,10 +5909,9 @@ var init_config = __esm(() => {
5909
5909
  CHAT_MAX_REACTIONS = CHAT_MAX_MEMBERS;
5910
5910
  REQUEST_MONEY_MAX_SATS = SATS_PER_BITCOIN * 100000n;
5911
5911
  WALLET_TRANSFER_POLL_MS = 3 * MS_PER_SECOND;
5912
- WALLET_ACTIVE_TRANSFER_REFRESH_MS = MS_PER_SECOND;
5912
+ WALLET_TRANSFER_REPAIR_MS = 30 * MS_PER_SECOND;
5913
5913
  WALLET_REGTEST_DEPOSIT_CLAIM_POLL_MS = 20 * MS_PER_SECOND;
5914
5914
  WALLET_MAINNET_DEPOSIT_CLAIM_POLL_MS = MINUTE_MS;
5915
- WALLET_BALANCE_EVENT_COALESCE_MS = 2 * MS_PER_SECOND;
5916
5915
  WALLET_PENDING_TRANSFER_COLD_REFRESH_INTERVAL_MS = 15 * MS_PER_SECOND;
5917
5916
  WALLET_PENDING_TRANSFER_SLOW_CLAIM_MS = 4 * MS_PER_SECOND;
5918
5917
  WALLET_PENDING_TRANSFER_CLAIM_COOLDOWN_MS = 15 * MS_PER_SECOND;
@@ -58733,56 +58732,25 @@ function createIncomingTransferClaims({ wallet, claim, batchSize = null, getTran
58733
58732
  }
58734
58733
  });
58735
58734
  }
58736
- async function queryPendingTransferIds(wallet, ids = [], diag) {
58737
- if (!ids.length || typeof wallet?.transferService?.queryPendingTransfers !== "function") {
58738
- return new Set;
58739
- }
58740
- const startedAt = Date.now();
58741
- markDiag(diag, "wallet.pendingTxs.claim.verify.start", { count: ids.length });
58742
- const requestedIds = new Set(ids);
58743
- try {
58744
- const page = await wallet.transferService.queryPendingTransfers.call(wallet.transferService, ids);
58745
- const pendingTransfers = (Array.isArray(page?.transfers) ? page.transfers : []).filter((transfer) => requestedIds.has(String(transfer?.id || "")));
58746
- markDone(diag, "wallet.pendingTxs.claim.verify", startedAt, { count: ids.length, pending: pendingTransfers.length });
58747
- return new Set(pendingTransfers.map((transfer) => String(transfer?.id || "")).filter(Boolean));
58748
- } catch (error) {
58749
- markError(diag, "wallet.pendingTxs.claim.verify", startedAt, error, { count: ids.length });
58750
- throw error;
58751
- }
58752
- }
58753
- async function claimIncomingTransfersById(wallet, transfers = [], { onClaimed, emitClaimEvents = false, drainAll = true, diag } = {}) {
58735
+ async function claimIncomingTransfersById(wallet, transfers = [], { onClaimed, emitClaimEvents = false, diag } = {}) {
58754
58736
  const ids = transferIds(transfers);
58755
- if (!ids.length || typeof wallet?.transferService?.queryPendingTransfers !== "function" || typeof wallet?.claimTransfers !== "function" && typeof wallet?.claimTransfer !== "function") {
58737
+ if (!ids.length || typeof wallet?.transferService?.queryPendingTransfers !== "function" || typeof wallet?.claimTransfer !== "function") {
58756
58738
  return [];
58757
58739
  }
58758
58740
  const requestedIds = new Set(ids);
58759
58741
  const activeClaim = activeWalletClaims.get(wallet);
58760
58742
  if (activeClaim) {
58761
- const claimedIds = transferIds(await activeClaim).filter((id) => requestedIds.has(id));
58743
+ const claimedIds = transferIds(await activeClaim.catch(() => [])).filter((id) => requestedIds.has(id));
58762
58744
  if (claimedIds.length) {
58763
58745
  onClaimed?.(claimedIds);
58764
58746
  }
58765
- return claimedIds;
58747
+ const remaining = ids.filter((id) => !claimedIds.includes(id));
58748
+ if (!remaining.length)
58749
+ return claimedIds;
58750
+ const next = await claimIncomingTransfersById(wallet, remaining, { onClaimed, emitClaimEvents, diag });
58751
+ return [...claimedIds, ...next];
58766
58752
  }
58767
58753
  const claimPromise = (async () => {
58768
- if (drainAll !== false && typeof wallet?.claimTransfers === "function") {
58769
- const claimedIds2 = [];
58770
- const claimStartedAt = Date.now();
58771
- markDiag(diag, "wallet.pendingTxs.claim.sdk.start", { count: ids.length, mode: "all" });
58772
- try {
58773
- claimedIds2.push(...transferIds(await wallet.claimTransfers(undefined, emitClaimEvents === true)));
58774
- markDone(diag, "wallet.pendingTxs.claim.sdk", claimStartedAt, { count: ids.length, mode: "all", claimed: claimedIds2.length });
58775
- } catch (error) {
58776
- markError(diag, "wallet.pendingTxs.claim.sdk", claimStartedAt, error, { count: ids.length, mode: "all" });
58777
- }
58778
- const pendingIds2 = await queryPendingTransferIds(wallet, ids, diag).catch(() => new Set);
58779
- claimedIds2.push(...ids.filter((id) => !pendingIds2.has(id)));
58780
- const uniqueClaimedIds = [...new Set(claimedIds2)];
58781
- if (uniqueClaimedIds.length) {
58782
- onClaimed?.(uniqueClaimedIds);
58783
- }
58784
- return uniqueClaimedIds;
58785
- }
58786
58754
  const queryStartedAt = Date.now();
58787
58755
  markDiag(diag, "wallet.pendingTxs.claim.query.start", { count: ids.length });
58788
58756
  let page;
@@ -58794,13 +58762,7 @@ async function claimIncomingTransfersById(wallet, transfers = [], { onClaimed, e
58794
58762
  }
58795
58763
  const pendingTransfers = (Array.isArray(page?.transfers) ? page.transfers : []).filter((transfer) => requestedIds.has(String(transfer?.id || "")));
58796
58764
  markDone(diag, "wallet.pendingTxs.claim.query", queryStartedAt, { count: ids.length, pending: pendingTransfers.length });
58797
- const pendingIds = new Set(pendingTransfers.map((transfer) => String(transfer?.id || "")).filter(Boolean));
58798
58765
  const claimedIds = [];
58799
- const alreadySettledIds = ids.filter((id) => !pendingIds.has(id));
58800
- if (alreadySettledIds.length) {
58801
- claimedIds.push(...alreadySettledIds);
58802
- onClaimed?.(alreadySettledIds);
58803
- }
58804
58766
  for (const transfer of pendingTransfers) {
58805
58767
  if (!isClaimablePendingTransfer(transfer)) {
58806
58768
  continue;
@@ -58833,7 +58795,7 @@ async function claimIncomingTransfersById(wallet, transfers = [], { onClaimed, e
58833
58795
  }
58834
58796
  }
58835
58797
  }
58836
- async function claimPendingIncomingTransfers(wallet, { limit = WALLET_PENDING_TRANSFER_CLAIM_BATCH_SIZE, onClaimed, emitClaimEvents = false, drainAll = true, diag } = {}) {
58798
+ async function claimPendingIncomingTransfers(wallet, { limit = WALLET_PENDING_TRANSFER_CLAIM_BATCH_SIZE, onClaimed, emitClaimEvents = false, diag } = {}) {
58837
58799
  if (typeof wallet?.transferService?.queryPendingTransfers !== "function") {
58838
58800
  return [];
58839
58801
  }
@@ -58858,7 +58820,6 @@ async function claimPendingIncomingTransfers(wallet, { limit = WALLET_PENDING_TR
58858
58820
  return claimIncomingTransfersById(wallet, pendingTransfers, {
58859
58821
  onClaimed,
58860
58822
  emitClaimEvents,
58861
- drainAll,
58862
58823
  diag
58863
58824
  });
58864
58825
  }
@@ -59121,7 +59082,7 @@ var init_deposits = __esm(() => {
59121
59082
  });
59122
59083
 
59123
59084
  // ../../core/wallet/claims.js
59124
- function createDepositClaims({ wallet, updateWalletData, diag }) {
59085
+ function createDepositClaims({ wallet, diag }) {
59125
59086
  let claimPromise = null;
59126
59087
  let closed = false;
59127
59088
  const claimDeposits = async () => {
@@ -59147,27 +59108,8 @@ function createDepositClaims({ wallet, updateWalletData, diag }) {
59147
59108
  claimPromise = request2;
59148
59109
  return request2;
59149
59110
  };
59150
- const refresh = async () => {
59151
- const startedAt = Date.now();
59152
- markDiag(diag, "wallet.refresh.start", {});
59153
- const claimed = await claimDeposits();
59154
- if (!closed) {
59155
- await updateWalletData({ force: true, reason: "deposit-refresh" });
59156
- }
59157
- markDone(diag, "wallet.refresh", startedAt, { claimed: !!claimed });
59158
- };
59159
- const refreshClaims = async () => {
59160
- const claimed = await claimDeposits();
59161
- if (!claimed || closed) {
59162
- return false;
59163
- }
59164
- await updateWalletData({ force: true, reason: "deposit-claim" });
59165
- return true;
59166
- };
59167
59111
  return {
59168
59112
  claimDeposits,
59169
- refresh,
59170
- refreshClaims,
59171
59113
  close() {
59172
59114
  closed = true;
59173
59115
  claimPromise = null;
@@ -59382,7 +59324,7 @@ function createWalletData({ wallet, getBalance, getRecentTxs, diag }) {
59382
59324
  tasks.push(getBalance());
59383
59325
  }
59384
59326
  if (currentRequest.transfers) {
59385
- tasks.push(getRecentTxs({ force: currentRequest.force, reason: currentRequest.reason }));
59327
+ tasks.push(getRecentTxs({ force: currentRequest.force, reason: currentRequest.reason, includePending: false }));
59386
59328
  }
59387
59329
  await Promise.all(tasks);
59388
59330
  markDone(diag, "wallet.update", startedAt, {
@@ -59417,353 +59359,240 @@ function createWalletData({ wallet, getBalance, getRecentTxs, diag }) {
59417
59359
  };
59418
59360
  return updateWalletData;
59419
59361
  }
59420
- function createWalletEvents({ wallet, updateWalletData, getTransferState, setBalance, setTokenBalances, setSatsBalanceResult, diag }) {
59421
- const balanceEvent = { timer: null, value: null };
59422
- const incomingEvent = { timer: null, balance: null };
59423
- const claimedEvent = { timer: null, balance: null, transfers: [], ids: [] };
59424
- if (!wallet || typeof wallet.on !== "function" || typeof wallet.off !== "function") {
59425
- return { close() {} };
59426
- }
59427
- const flushBalanceEvent = () => {
59428
- balanceEvent.timer = null;
59429
- const value = balanceEvent.value;
59430
- balanceEvent.value = null;
59431
- if (value) {
59432
- if (getTransferState().hasActivePendingClaim?.() === true) {
59433
- return;
59434
- }
59435
- markDiag(diag, "wallet.events.balance.flush", {});
59436
- setSatsBalanceResult(value);
59437
- }
59438
- };
59439
- const flushIncomingEvent = () => {
59440
- incomingEvent.timer = null;
59441
- const balance = incomingEvent.balance;
59442
- incomingEvent.balance = null;
59443
- if (balance != null) {
59444
- setBalance(balance);
59445
- }
59446
- markDiag(diag, "wallet.events.incoming.flush", { hasBalance: balance != null });
59447
- updateWalletData({ transfers: true, balance: false, reason: "incoming" });
59362
+ function createWalletEvents({ wallet, getTransferState, setTokenBalances, setSatsBalanceResult, reconcile, sync, diag }) {
59363
+ let closed = false;
59364
+ let balanceTimer = null;
59365
+ let claimTimer = null;
59366
+ let balanceValue = null;
59367
+ const claimedIds = new Set;
59368
+ const handleBalanceUpdate = (value) => {
59369
+ if (closed || !value || typeof value !== "object")
59370
+ return;
59371
+ balanceValue = value;
59372
+ if (balanceTimer)
59373
+ return;
59374
+ balanceTimer = setTimeout(() => {
59375
+ balanceTimer = null;
59376
+ if (!closed)
59377
+ setSatsBalanceResult(balanceValue);
59378
+ }, BALANCE_EVENT_COALESCE_MS);
59448
59379
  };
59449
- const flushClaimedEvent = () => {
59450
- claimedEvent.timer = null;
59451
- const balance = claimedEvent.balance;
59452
- const transfers = claimedEvent.transfers;
59453
- const ids = claimedEvent.ids;
59454
- claimedEvent.balance = null;
59455
- claimedEvent.transfers = [];
59456
- claimedEvent.ids = [];
59457
- if (balance != null) {
59458
- setBalance(balance);
59459
- }
59460
- markDiag(diag, "wallet.events.transfer.claimed.flush", { count: transfers.length, ids: ids.length, hasBalance: balance != null });
59461
- const transferState = getTransferState();
59462
- if (transfers.length) {
59463
- transferState.rememberTransfer?.(transfers, { completed: true, incoming: true });
59464
- }
59465
- if (ids.length) {
59466
- const completedIds = new Set(transferState.markTransfersCompleted?.(ids) || []);
59467
- const unknownIds = ids.filter((id) => !completedIds.has(String(id)));
59468
- if (unknownIds.length) {
59469
- transferState.refreshPendingTransfers?.(unknownIds);
59470
- }
59471
- }
59380
+ const handleTransferClaimed = (id) => {
59381
+ if (closed || !id)
59382
+ return;
59383
+ claimedIds.add(String(id));
59384
+ if (claimTimer)
59385
+ return;
59386
+ claimTimer = setTimeout(() => {
59387
+ claimTimer = null;
59388
+ const ids = [...claimedIds];
59389
+ claimedIds.clear();
59390
+ if (closed)
59391
+ return;
59392
+ const transfers = getTransferState();
59393
+ transfers.markTransfersCompleted(ids);
59394
+ transfers.refreshPendingTransfers(ids).finally(sync);
59395
+ sync();
59396
+ markDiag(diag, "wallet.events.transfer.claimed.flush", { count: ids.length });
59397
+ }, INCOMING_UPDATE_COALESCE_MS);
59472
59398
  };
59473
59399
  const handleTokenBalanceUpdate = (event) => {
59474
- if (event?.tokenBalances instanceof Map) {
59400
+ if (!closed && event?.tokenBalances instanceof Map)
59475
59401
  setTokenBalances(new Map(event.tokenBalances));
59476
- }
59477
59402
  };
59478
- const handleBalanceUpdate = (nextSatsBalance) => {
59479
- if (!nextSatsBalance || typeof nextSatsBalance !== "object") {
59480
- return;
59481
- }
59482
- balanceEvent.value = nextSatsBalance;
59483
- if (!balanceEvent.timer) {
59484
- balanceEvent.timer = setTimeout(flushBalanceEvent, BALANCE_EVENT_COALESCE_MS);
59485
- }
59403
+ const handleDepositConfirmed = () => {
59404
+ if (!closed)
59405
+ reconcile({ history: true, reason: "deposit-confirmed" });
59486
59406
  };
59487
- const handleIncomingBalance = (updatedBalance) => {
59488
- if (updatedBalance != null) {
59489
- incomingEvent.balance = updatedBalance;
59490
- }
59491
- if (!incomingEvent.timer) {
59492
- incomingEvent.timer = setTimeout(flushIncomingEvent, INCOMING_UPDATE_COALESCE_MS);
59493
- }
59407
+ const handleConnected = () => {
59408
+ if (!closed)
59409
+ reconcile({ history: true, pending: true, reason: "stream-connected" });
59494
59410
  };
59495
- const handleTransferClaimed = (transferId, updatedBalance, transfer) => {
59496
- if (updatedBalance != null) {
59497
- claimedEvent.balance = updatedBalance;
59498
- }
59499
- if (transfer) {
59500
- claimedEvent.transfers.push(transfer);
59501
- } else if (transferId) {
59502
- claimedEvent.ids.push(String(transferId));
59503
- }
59504
- if (!claimedEvent.timer) {
59505
- claimedEvent.timer = setTimeout(flushClaimedEvent, INCOMING_UPDATE_COALESCE_MS);
59506
- }
59411
+ const handleReconnecting = () => {
59412
+ markDiag(diag, "wallet.stream.reconnecting", {});
59507
59413
  };
59508
- const handleDepositConfirmed = (_id, updatedBalance) => {
59509
- handleIncomingBalance(updatedBalance);
59414
+ const handlers = {
59415
+ [WALLET_EVENTS.balance]: handleBalanceUpdate,
59416
+ [WALLET_EVENTS.tokenBalance]: handleTokenBalanceUpdate,
59417
+ [WALLET_EVENTS.transferClaimed]: handleTransferClaimed,
59418
+ [WALLET_EVENTS.depositConfirmed]: handleDepositConfirmed,
59419
+ "stream:connected": handleConnected,
59420
+ "stream:reconnecting": handleReconnecting
59510
59421
  };
59511
- wallet.on(WALLET_EVENTS.balance, handleBalanceUpdate);
59512
- wallet.on(WALLET_EVENTS.tokenBalance, handleTokenBalanceUpdate);
59513
- wallet.on(WALLET_EVENTS.depositConfirmed, handleDepositConfirmed);
59514
- wallet.on(WALLET_EVENTS.transferClaimed, handleTransferClaimed);
59422
+ for (const [name2, handler] of Object.entries(handlers))
59423
+ wallet.on(name2, handler);
59515
59424
  return {
59516
59425
  close() {
59517
- wallet.off(WALLET_EVENTS.balance, handleBalanceUpdate);
59518
- wallet.off(WALLET_EVENTS.tokenBalance, handleTokenBalanceUpdate);
59519
- wallet.off(WALLET_EVENTS.depositConfirmed, handleDepositConfirmed);
59520
- wallet.off(WALLET_EVENTS.transferClaimed, handleTransferClaimed);
59521
- for (const event of [balanceEvent, incomingEvent, claimedEvent]) {
59522
- if (event.timer) {
59523
- clearTimeout(event.timer);
59524
- event.timer = null;
59525
- }
59526
- }
59426
+ closed = true;
59427
+ clearTimeout(balanceTimer);
59428
+ clearTimeout(claimTimer);
59429
+ claimedIds.clear();
59430
+ for (const [name2, handler] of Object.entries(handlers))
59431
+ wallet.off(name2, handler);
59527
59432
  }
59528
59433
  };
59529
59434
  }
59530
- function createWalletPolling({ wallet, network, appState, getTransferState, getBalanceState, refreshClaims, activeTransferRefreshMs = ACTIVE_TRANSFER_REFRESH_RATE, diag }) {
59531
- let pollInterval = null;
59532
- let activeRefreshInterval = null;
59533
- let activeRefreshPromise = null;
59534
- let pendingPollPromise = null;
59535
- let activeRefreshLastAt = 0;
59536
- let transferDiscoveryVisible = false;
59435
+ function createWalletReconciliation({ network, appState, getTransferState, updateWalletData, claimDeposits, deferBackgroundWork = null, backgroundSignal = null, diag }) {
59436
+ const waits = createOwnedWaits();
59437
+ const depositRate = getDepositClaimPollMs(network);
59438
+ let started = false;
59439
+ let starting = false;
59537
59440
  let closed = false;
59538
- const depositClaimRate = getDepositClaimPollMs(network);
59539
- const activeRefreshPollMs = Math.max(500, Number(activeTransferRefreshMs) || ACTIVE_TRANSFER_REFRESH_RATE);
59540
- const isActive = () => !appState?.currentState || appState.currentState === "active";
59541
- const isTxReady = () => getTransferState().txReady === true && getBalanceState().balanceReady === true;
59542
- const hasActivePendingClaim = () => getTransferState().hasActivePendingClaim?.() === true;
59543
- const hasFastActiveRefreshWork = () => transferDiscoveryVisible || hasActivePendingClaim();
59544
- const activeRefreshDue = () => {
59545
- if (!hasFastActiveRefreshWork())
59546
- return false;
59547
- return hasActivePendingClaim() || !activeRefreshLastAt || Date.now() - activeRefreshLastAt >= activeRefreshPollMs;
59548
- };
59549
- const runActiveRefresh = (reason = "active-poll") => {
59550
- if (closed || !wallet || !isActive()) {
59551
- return Promise.resolve([]);
59552
- }
59553
- if (activeRefreshPromise) {
59554
- return activeRefreshPromise;
59555
- }
59556
- const promise = (async () => {
59557
- activeRefreshLastAt = Date.now();
59558
- const transferState = getTransferState();
59559
- const transfers = typeof transferState.claimPendingIncomingTransfers === "function" ? await transferState.claimPendingIncomingTransfers(reason) : [];
59560
- const claimActive = hasActivePendingClaim();
59561
- if (isTxReady() && typeof transferState.refreshPendingTransfers === "function" && !transferDiscoveryVisible && !claimActive) {
59562
- transferState.refreshPendingTransfers(null, { cold: true, reason });
59563
- }
59564
- return transfers;
59565
- })().finally(() => {
59566
- if (activeRefreshPromise === promise) {
59567
- activeRefreshPromise = null;
59568
- }
59569
- });
59570
- activeRefreshPromise = promise;
59571
- return promise;
59572
- };
59573
- const stopActiveRefreshPoll = () => {
59574
- if (!activeRefreshInterval)
59575
- return;
59576
- clearInterval(activeRefreshInterval);
59577
- activeRefreshInterval = null;
59441
+ let timer = null;
59442
+ let promise = null;
59443
+ let queued = null;
59444
+ const waiters = [];
59445
+ const finishWaiters = () => {
59446
+ for (const resolve of waiters.splice(0))
59447
+ resolve();
59578
59448
  };
59579
- const runObservedActiveRefresh = () => {
59580
- if (!hasFastActiveRefreshWork()) {
59581
- stopActiveRefreshPoll();
59582
- return;
59583
- }
59584
- if (activeRefreshDue()) {
59585
- runActiveRefresh();
59586
- }
59449
+ let pendingAt = 0;
59450
+ let repairAt = 0;
59451
+ let depositAt = 0;
59452
+ const isActive = () => !appState?.currentState || appState.currentState === "active";
59453
+ const isOpen = () => !closed && !backgroundSignal?.aborted;
59454
+ const hasPending = () => {
59455
+ const state = getTransferState();
59456
+ return state.hasPendingTxs || state.hasRequestedTransfers();
59587
59457
  };
59588
- const startActiveRefreshPoll = () => {
59589
- if (closed || !appState || activeRefreshInterval || !wallet || !isActive() || !hasFastActiveRefreshWork() || typeof getTransferState().claimPendingIncomingTransfers !== "function") {
59458
+ function sync() {
59459
+ clearTimeout(timer);
59460
+ timer = null;
59461
+ if (!isOpen() || !started || !isActive() || promise)
59590
59462
  return;
59591
- }
59592
- markDiag(diag, "wallet.pendingTxs.active.start", {});
59593
- activeRefreshInterval = setInterval(() => {
59594
- if (!isActive()) {
59595
- return;
59596
- }
59597
- runObservedActiveRefresh();
59598
- }, activeRefreshPollMs);
59599
- runObservedActiveRefresh();
59600
- };
59601
- const runPendingPoll = () => {
59602
- if (pendingPollPromise) {
59603
- return pendingPollPromise;
59604
- }
59605
- const promise = Promise.resolve().then(() => getTransferState().refreshPendingTransfers?.()).finally(() => {
59606
- if (pendingPollPromise === promise) {
59607
- pendingPollPromise = null;
59463
+ const next = Math.min(repairAt, depositAt, hasPending() ? pendingAt : Infinity);
59464
+ timer = setTimeout(tick, Math.max(0, next - Date.now()));
59465
+ }
59466
+ function request2(options = {}) {
59467
+ if (!isOpen())
59468
+ return Promise.resolve();
59469
+ queued = {
59470
+ history: queued?.history || options.history === true,
59471
+ incoming: queued?.incoming || options.incoming === true,
59472
+ pending: queued?.pending || options.pending === true,
59473
+ deposits: queued?.deposits || options.deposits === true,
59474
+ forcePending: queued?.forcePending || options.pending === true && options.reason !== "scheduled",
59475
+ reason: queued?.reason && queued.reason !== options.reason ? "merged" : options.reason || "manual"
59476
+ };
59477
+ const result = new Promise((resolve) => waiters.push(resolve));
59478
+ if (!started || !isActive() || promise)
59479
+ return result;
59480
+ clearTimeout(timer);
59481
+ const run2 = async () => {
59482
+ while (queued && isOpen() && isActive()) {
59483
+ const work = queued;
59484
+ queued = null;
59485
+ const startedAt = Date.now();
59486
+ try {
59487
+ if (work.incoming) {
59488
+ repairAt = Date.now() + WALLET_TRANSFER_REPAIR_MS;
59489
+ await getTransferState().claimPendingIncomingTransfers(work.reason);
59490
+ }
59491
+ if (!isOpen())
59492
+ break;
59493
+ if (!isActive()) {
59494
+ request2(work);
59495
+ break;
59496
+ }
59497
+ if (work.deposits) {
59498
+ depositAt = Date.now() + depositRate;
59499
+ if (await claimDeposits())
59500
+ work.history = true;
59501
+ }
59502
+ if (!isOpen())
59503
+ break;
59504
+ if (!isActive()) {
59505
+ request2(work);
59506
+ break;
59507
+ }
59508
+ if (work.history)
59509
+ await updateWalletData({ force: true, reason: work.reason });
59510
+ if (!isOpen())
59511
+ break;
59512
+ if (!isActive()) {
59513
+ request2(work);
59514
+ break;
59515
+ }
59516
+ if (work.pending) {
59517
+ pendingAt = Date.now() + POLL_TXS_RATE;
59518
+ await getTransferState().refreshPendingTransfers(null, { force: work.forcePending, reason: work.reason });
59519
+ }
59520
+ if (!isOpen())
59521
+ break;
59522
+ if (!isActive()) {
59523
+ request2(work);
59524
+ break;
59525
+ }
59526
+ markDone(diag, "wallet.reconcile", startedAt, work);
59527
+ } catch (error) {
59528
+ markError(diag, "wallet.reconcile", startedAt, error, { reason: work.reason });
59529
+ }
59608
59530
  }
59531
+ };
59532
+ const running = Promise.resolve().then(run2).finally(() => {
59533
+ if (promise === running)
59534
+ promise = null;
59535
+ if (!queued)
59536
+ finishWaiters();
59537
+ sync();
59609
59538
  });
59610
- pendingPollPromise = promise;
59611
- return promise;
59612
- };
59613
- const startPoll = () => {
59614
- const transferState = getTransferState();
59615
- if (closed || pollInterval || !wallet || !transferState.hasPendingTxs || !isTxReady() || !isActive()) {
59616
- return;
59617
- }
59618
- runPendingPoll();
59619
- pollInterval = setInterval(() => {
59620
- if (isActive()) {
59621
- runPendingPoll();
59622
- }
59623
- }, POLL_TXS_RATE);
59624
- };
59625
- const stopPoll = () => {
59626
- if (!pollInterval)
59627
- return;
59628
- clearInterval(pollInterval);
59629
- pollInterval = null;
59630
- };
59631
- const sync = () => {
59632
- if (closed || !wallet) {
59633
- stopPoll();
59634
- stopActiveRefreshPoll();
59635
- return;
59636
- }
59637
- if (isActive() && hasFastActiveRefreshWork()) {
59638
- startActiveRefreshPoll();
59639
- } else {
59640
- stopActiveRefreshPoll();
59641
- }
59642
- if (getTransferState().hasPendingTxs && isActive()) {
59643
- startPoll();
59644
- } else {
59645
- stopPoll();
59539
+ promise = running;
59540
+ return result;
59541
+ }
59542
+ function tick() {
59543
+ timer = null;
59544
+ const now = Date.now();
59545
+ const incoming = now >= repairAt;
59546
+ const deposits = now >= depositAt;
59547
+ const pending = hasPending() && now >= pendingAt;
59548
+ if (incoming)
59549
+ repairAt = now + WALLET_TRANSFER_REPAIR_MS;
59550
+ if (deposits)
59551
+ depositAt = now + depositRate;
59552
+ if (pending)
59553
+ pendingAt = now + POLL_TXS_RATE;
59554
+ request2({ incoming, deposits, pending, reason: "scheduled" });
59555
+ }
59556
+ const subscription = appState?.addEventListener?.("change", (state) => {
59557
+ if (state === "active") {
59558
+ request2({ incoming: true, history: true, pending: true, deposits: true, reason: "resume" });
59646
59559
  }
59647
- };
59648
- const setTransferDiscoveryVisible = (visible) => {
59649
- const next = visible === true;
59650
- if (transferDiscoveryVisible === next)
59651
- return;
59652
- transferDiscoveryVisible = next;
59653
- if (next)
59654
- activeRefreshLastAt = 0;
59655
59560
  sync();
59656
- };
59657
- const appStateSubscription = appState?.addEventListener?.("change", (nextState2) => {
59658
- if (nextState2 === "active") {
59659
- runActiveRefresh("focus");
59660
- startActiveRefreshPoll();
59661
- if (getTransferState().hasPendingTxs) {
59662
- startPoll();
59663
- runPendingPoll();
59664
- }
59665
- refreshClaims();
59666
- return;
59667
- }
59668
- stopPoll();
59669
- stopActiveRefreshPoll();
59670
59561
  });
59671
- const depositClaimInterval = setInterval(() => {
59672
- if (isActive()) {
59673
- refreshClaims();
59674
- }
59675
- }, depositClaimRate);
59676
- sync();
59677
59562
  return {
59678
- setTransferDiscoveryVisible,
59679
- stopPoll,
59563
+ request: request2,
59564
+ refresh: () => request2({ incoming: true, history: true, pending: true, deposits: true, reason: "manual" }),
59680
59565
  sync,
59681
- close() {
59682
- if (closed)
59566
+ async start() {
59567
+ if (starting || !isOpen())
59683
59568
  return;
59684
- closed = true;
59685
- stopPoll();
59686
- stopActiveRefreshPoll();
59687
- clearInterval(depositClaimInterval);
59688
- appStateSubscription?.remove?.();
59689
- }
59690
- };
59691
- }
59692
- function createWalletBoot({ wallet, getTransferState, getBalance, getRecentTxs, deferBackgroundWork = null, backgroundSignal = null, stopPoll, diag }) {
59693
- let closed = false;
59694
- const waits = createOwnedWaits();
59695
- const boot = async () => {
59696
- const startedAt = Date.now();
59697
- markDiag(diag, "wallet.provider.boot.start", {});
59698
- await waits.delay(BOOT_CACHE_DECISION_DELAY_MS);
59699
- await waits.idle({ timeout: BOOT_REFRESH_DELAY_MS, delay: BOOT_REFRESH_DELAY_MS });
59700
- if (closed) {
59701
- markDone(diag, "wallet.provider.boot", startedAt, { cancelled: true });
59702
- return;
59703
- }
59704
- const transferState = getTransferState();
59705
- if (transferState.txReady) {
59706
- const cachedTransferCount = transferState.transferCount;
59707
- markDone(diag, "wallet.provider.boot", startedAt, {
59708
- cancelled: false,
59709
- cachedTxReady: true,
59710
- deferredTxRefresh: true,
59711
- deferredBalanceRefresh: true,
59712
- firstTxCount: cachedTransferCount
59713
- });
59714
- await waits.delay(BOOT_CACHED_REFRESH_DELAY_MS);
59715
- if (closed)
59569
+ starting = true;
59570
+ await waits.delay(BOOT_CACHE_DECISION_DELAY_MS);
59571
+ await waits.idle({ timeout: BOOT_REFRESH_DELAY_MS, delay: BOOT_REFRESH_DELAY_MS });
59572
+ if (!isOpen())
59716
59573
  return;
59717
- if (typeof deferBackgroundWork === "function") {
59574
+ if (getTransferState().txReady)
59575
+ await waits.delay(BOOT_CACHED_REFRESH_DELAY_MS);
59576
+ if (!isOpen())
59577
+ return;
59578
+ if (deferBackgroundWork)
59718
59579
  await deferBackgroundWork("wallet.boot.refresh", { signal: backgroundSignal });
59719
- } else {
59720
- await waits.idle({ timeout: BOOT_REFRESH_DELAY_MS, delay: BOOT_REFRESH_DELAY_MS });
59721
- }
59722
- if (closed)
59580
+ if (!isOpen())
59723
59581
  return;
59724
- const refreshStartedAt = Date.now();
59725
- markDiag(diag, "wallet.provider.boot.refresh.start", { balance: true, transfers: true });
59726
- try {
59727
- const [, recent] = await Promise.all([getBalance(), getRecentTxs({ force: true, includePending: false, reason: "boot-cache" })]);
59728
- markDone(diag, "wallet.provider.boot.refresh", refreshStartedAt, {
59729
- balance: true,
59730
- transfers: true,
59731
- count: recent?.transfers?.length || 0
59732
- });
59733
- } catch (error) {
59734
- markError(diag, "wallet.provider.boot.refresh", refreshStartedAt, error);
59735
- }
59736
- return;
59737
- }
59738
- if (typeof deferBackgroundWork === "function") {
59739
- await deferBackgroundWork("wallet.boot.initial", { signal: backgroundSignal });
59740
- }
59741
- if (closed) {
59742
- markDone(diag, "wallet.provider.boot", startedAt, { cancelled: true });
59743
- return;
59744
- }
59745
- const [, firstTxPage] = await Promise.all([getBalance(), getRecentTxs({ reason: "boot", includePending: false })]);
59746
- markDone(diag, "wallet.provider.boot", startedAt, {
59747
- cancelled: closed,
59748
- cachedTxReady: false,
59749
- deferredTxRefresh: false,
59750
- firstTxCount: firstTxPage?.transfers?.length || 0,
59751
- firstTxHasMore: !!firstTxPage?.hasMore,
59752
- cachedHistoryComplete: firstTxPage?.cachedHistoryComplete === true,
59753
- reconcileCount: Array.isArray(firstTxPage?.reconcileIds) ? firstTxPage.reconcileIds.length : 0
59754
- });
59755
- };
59756
- if (wallet) {
59757
- boot();
59758
- }
59759
- return {
59582
+ started = true;
59583
+ const now = Date.now();
59584
+ pendingAt = now + POLL_TXS_RATE;
59585
+ repairAt = now + WALLET_TRANSFER_REPAIR_MS;
59586
+ depositAt = now + depositRate;
59587
+ await request2({ history: true, pending: true, reason: "boot" });
59588
+ },
59760
59589
  close() {
59761
- if (closed)
59762
- return;
59763
59590
  closed = true;
59591
+ queued = null;
59592
+ finishWaiters();
59764
59593
  waits.close();
59765
- markDiag(diag, "wallet.provider.boot.stop", {});
59766
- stopPoll();
59594
+ clearTimeout(timer);
59595
+ subscription?.remove?.();
59767
59596
  }
59768
59597
  };
59769
59598
  }
@@ -59789,13 +59618,12 @@ function createWalletReadyDiag({ wallet, getBalanceState, getTransferState, diag
59789
59618
  }
59790
59619
  };
59791
59620
  }
59792
- var POLL_TXS_RATE, ACTIVE_TRANSFER_REFRESH_RATE, BOOT_REFRESH_DELAY_MS, BOOT_CACHED_REFRESH_DELAY_MS, BOOT_CACHE_DECISION_DELAY_MS, BALANCE_EVENT_COALESCE_MS, INCOMING_UPDATE_COALESCE_MS, WALLET_EVENTS;
59621
+ var POLL_TXS_RATE, BOOT_REFRESH_DELAY_MS, BOOT_CACHED_REFRESH_DELAY_MS, BOOT_CACHE_DECISION_DELAY_MS, BALANCE_EVENT_COALESCE_MS, INCOMING_UPDATE_COALESCE_MS, WALLET_EVENTS;
59793
59622
  var init_lifecycle = __esm(() => {
59794
59623
  init_config();
59795
59624
  init_network();
59796
59625
  init_async();
59797
59626
  POLL_TXS_RATE = WALLET_TRANSFER_POLL_MS;
59798
- ACTIVE_TRANSFER_REFRESH_RATE = WALLET_ACTIVE_TRANSFER_REFRESH_MS;
59799
59627
  BOOT_REFRESH_DELAY_MS = WALLET_BOOT_REFRESH_DELAY_MS;
59800
59628
  BOOT_CACHED_REFRESH_DELAY_MS = WALLET_BOOT_CACHED_REFRESH_DELAY_MS;
59801
59629
  BOOT_CACHE_DECISION_DELAY_MS = BOOT_REFRESH_DELAY_MS + Math.max(0, WALLET_CACHE_HYDRATE_DELAY_MS) + 250;
@@ -60251,18 +60079,6 @@ var init_privacy = __esm(() => {
60251
60079
  PRIVACY_SYNC_DELAY_MS = WALLET_BOOT_CACHED_REFRESH_DELAY_MS * 2;
60252
60080
  });
60253
60081
 
60254
- // ../../core/wallet/history.js
60255
- function transferPage(page, currentOffset, limit) {
60256
- const transfers = Array.isArray(page?.transfers) ? page.transfers : [];
60257
- const returnedOffset = Number(page?.offset);
60258
- const nextOffset = Number.isFinite(returnedOffset) && returnedOffset > currentOffset ? returnedOffset : currentOffset + transfers.length;
60259
- return {
60260
- transfers,
60261
- nextOffset,
60262
- hasMore: transfers.length >= limit
60263
- };
60264
- }
60265
-
60266
60082
  // ../../core/wallet/transferdata.js
60267
60083
  function compareRecentTransfer(a, b) {
60268
60084
  const delta = txCreatedMs(b) - txCreatedMs(a);
@@ -60403,16 +60219,6 @@ function getOldestTransferMs(transfers = []) {
60403
60219
  }
60404
60220
  return oldest;
60405
60221
  }
60406
- function getOldestAnyTransferMs(transfers = []) {
60407
- let oldest = null;
60408
- for (const tx of transfers) {
60409
- const ms = txCreatedMs(tx);
60410
- if (!ms)
60411
- continue;
60412
- oldest = oldest == null ? ms : Math.min(oldest, ms);
60413
- }
60414
- return oldest;
60415
- }
60416
60222
  function shouldReplaceTransfer(current, next) {
60417
60223
  return isPendingTransfer(current) && (!isPendingTransfer(next) || current?.status !== next?.status || txUpdatedMs(next) > txUpdatedMs(current));
60418
60224
  }
@@ -60706,14 +60512,6 @@ function reconciliationDue(owner, transfer, id, now) {
60706
60512
  const retryMs = getPendingTransferRetryMs(transfer, ageMs, owner.unresolvedCount.get(id) || 0);
60707
60513
  return retryMs <= 0 || now - lastAttemptAt >= retryMs;
60708
60514
  }
60709
- async function stillPendingTransferIds(wallet, ids = []) {
60710
- const selectedIds = transferIds2(ids);
60711
- if (!selectedIds.length || typeof wallet?.transferService?.queryPendingTransfers !== "function")
60712
- return new Set;
60713
- const requestedIds = new Set(selectedIds);
60714
- const page = await wallet.transferService.queryPendingTransfers.call(wallet.transferService, selectedIds);
60715
- return new Set((Array.isArray(page?.transfers) ? page.transfers : []).map((transfer) => String(transfer?.id || "")).filter((id) => id && requestedIds.has(id)));
60716
- }
60717
60515
  function normalizeCursor(owner, transfers = owner.snapshot.getTransfers()) {
60718
60516
  const count = pendingTransferIds(transfers).length;
60719
60517
  if (!count) {
@@ -60814,8 +60612,10 @@ async function refreshRequestedTransfers(owner, ids = []) {
60814
60612
  const requestedIds = transferIds2(ids);
60815
60613
  if (!requestedIds.length)
60816
60614
  return [];
60817
- for (const id of requestedIds)
60615
+ for (const id of requestedIds) {
60818
60616
  owner.requestedIds.add(id);
60617
+ owner.hydrationDue.set(id, Date.now() + WALLET_TRANSFER_POLL_MS);
60618
+ }
60819
60619
  if (owner.requestedPromise) {
60820
60620
  markDiag(owner.diag, "wallet.pendingTxs.requested.queue", { count: requestedIds.length });
60821
60621
  return owner.requestedPromise;
@@ -60823,56 +60623,44 @@ async function refreshRequestedTransfers(owner, ids = []) {
60823
60623
  const run2 = async () => {
60824
60624
  let latestTransfers = [];
60825
60625
  while (isCurrentGeneration(owner, generation) && owner.requestedIds.size) {
60826
- const batchIds = [...owner.requestedIds];
60827
- owner.requestedIds.clear();
60626
+ const batchIds = [...owner.requestedIds].slice(0, COLD_BATCH_SIZE);
60627
+ for (const id of batchIds)
60628
+ owner.requestedIds.delete(id);
60828
60629
  const batchIdSet = new Set(batchIds);
60829
60630
  const startedAt = Date.now();
60830
60631
  markDiag(owner.diag, "wallet.pendingTxs.requested.start", { requested: batchIds.length });
60831
60632
  try {
60832
60633
  const baseTransfers = owner.snapshot.getTransfers();
60833
60634
  const baseById = new Map(baseTransfers.map((transfer) => [String(transfer?.id || ""), transfer]));
60834
- let pages = 0;
60835
- let pageTransfers = [];
60836
- let fetchedTransfers = await owner.reads.byIds(batchIds);
60837
- if (!isCurrentGeneration(owner, generation))
60838
- return [];
60839
- if (!fetchedTransfers) {
60840
- if (batchIds.length === 1) {
60841
- const transfer = await owner.reads.byId(batchIds[0]);
60842
- fetchedTransfers = transfer ? [transfer] : [];
60843
- } else {
60844
- const result = await owner.reads.recentPages(batchIds, baseTransfers);
60845
- pages = result.pages;
60846
- pageTransfers = result.transfers;
60847
- fetchedTransfers = pageTransfers;
60848
- }
60849
- }
60635
+ const fetchedTransfers = await owner.reads.byIds(batchIds);
60850
60636
  if (!isCurrentGeneration(owner, generation))
60851
60637
  return [];
60852
- const updates = fetchedTransfers.map((transfer) => {
60638
+ const updates = fetchedTransfers.filter((transfer) => batchIdSet.has(String(transfer?.id)) && transferBelongsToWallet(compactTransfer(transfer), owner.walletPK)).map((transfer) => {
60853
60639
  const id = String(transfer?.id || "");
60854
60640
  const current = id ? baseById.get(id) : null;
60855
60641
  return current?.transferDirection && !transfer?.transferDirection ? { ...transfer, transferDirection: current.transferDirection } : transfer;
60856
60642
  });
60857
60643
  forgetResolvedFetched(owner, updates);
60858
- const nextTransfers = updates.length ? mergeTransferPageForWallet(baseTransfers, updates, owner.walletPK, "append") : baseTransfers;
60644
+ const currentTransfers = owner.snapshot.getTransfers();
60645
+ const nextTransfers = updates.length ? overlayPending(owner, mergeTransferPageForWallet(currentTransfers, updates, owner.walletPK, "append")) : currentTransfers;
60859
60646
  const requestedTransfers = nextTransfers.filter((transfer) => batchIdSet.has(String(transfer?.id || "")));
60860
60647
  const claimCandidates = owner.claims.candidates(pendingIncomingTransfers(requestedTransfers));
60861
60648
  const resolvedIds = requestedTransfers.filter((transfer) => !isPendingTransfer(transfer)).map((transfer) => String(transfer.id));
60862
60649
  forgetPending(owner, resolvedIds);
60863
- if (nextTransfers !== baseTransfers) {
60650
+ if (nextTransfers !== currentTransfers) {
60864
60651
  await owner.snapshot.commitConfirmed(requestedTransfers.filter((transfer) => !isPendingTransfer(transfer)), { position: "prepend" });
60865
60652
  if (!isCurrentGeneration(owner, generation))
60866
60653
  return [];
60867
- owner.snapshot.replace(nextTransfers);
60654
+ owner.snapshot.replace(mergeTransferPageForWallet(owner.snapshot.getTransfers(), updates, owner.walletPK, "append"));
60868
60655
  owner.snapshot.setReady();
60869
60656
  }
60657
+ for (const transfer of updates)
60658
+ owner.hydrationDue.delete(String(transfer.id));
60870
60659
  if (claimCandidates.length)
60871
60660
  owner.claims.enqueue(claimCandidates, "requested");
60872
60661
  markDone(owner.diag, "wallet.pendingTxs.requested", startedAt, {
60873
60662
  requested: batchIds.length,
60874
- pages,
60875
- pageCount: pageTransfers.length,
60663
+ pages: 0,
60876
60664
  updateCount: updates.length,
60877
60665
  found: requestedTransfers.length,
60878
60666
  resolved: resolvedIds.length,
@@ -60897,7 +60685,7 @@ async function refreshRequestedTransfers(owner, ids = []) {
60897
60685
  owner.requestedPromise = request2;
60898
60686
  return request2;
60899
60687
  }
60900
- function planPendingReconciliation(owner, { startedAt, cold, reason }) {
60688
+ function planPendingReconciliation(owner, { startedAt, cold, reason, force }) {
60901
60689
  const previousTransfers = owner.snapshot.getTransfers();
60902
60690
  const pendingList = pendingTransfers(previousTransfers);
60903
60691
  const pendingById = syncReconciliationAges(owner, pendingList, startedAt);
@@ -60909,11 +60697,13 @@ function planPendingReconciliation(owner, { startedAt, cold, reason }) {
60909
60697
  const transfer = pendingById.get(id);
60910
60698
  if (cold && transfer && isIncomingTransfer(transfer))
60911
60699
  return false;
60700
+ if (force)
60701
+ return true;
60912
60702
  if (bootGraceActive && transfer && !owner.rememberedIds.has(id) && !isIncomingTransfer(transfer))
60913
60703
  return false;
60914
60704
  return reconciliationDue(owner, transfer, id, startedAt);
60915
60705
  });
60916
- const limit = Math.min(cold ? COLD_BATCH_SIZE : STATUS_BATCH_SIZE, candidateIds.length);
60706
+ const limit = Math.min(cold || force ? COLD_BATCH_SIZE : STATUS_BATCH_SIZE, candidateIds.length);
60917
60707
  const selectedIds = rotateIds(candidateIds, owner.cursor, limit);
60918
60708
  if (candidateIds.length)
60919
60709
  owner.cursor = (owner.cursor + selectedIds.length) % candidateIds.length;
@@ -60942,58 +60732,45 @@ async function readPendingReconciliation(owner, plan, generation) {
60942
60732
  const baseTransfers = currentTransfers.length ? currentTransfers : plan.previousTransfers;
60943
60733
  const baseById = new Map(baseTransfers.map((transfer) => [String(transfer?.id || ""), transfer]));
60944
60734
  const resolvedIds = [];
60945
- const completedOverlayIds = [];
60946
60735
  const updates = [];
60947
- let actualChecked = 0;
60948
60736
  let unresolvedOutgoing = 0;
60949
60737
  let maxUnresolvedCount = 0;
60950
- if (plan.incomingIds.length) {
60951
- const stillPending = await stillPendingTransferIds(owner.wallet, plan.incomingIds);
60952
- if (!isCurrentGeneration(owner, generation))
60953
- return null;
60954
- const resolvedIncoming = plan.incomingIds.filter((id) => !stillPending.has(id));
60955
- resolvedIds.push(...resolvedIncoming);
60956
- completedOverlayIds.push(...resolvedIncoming);
60957
- }
60958
- if (plan.outgoingIds.length) {
60959
- const fetched = await owner.reads.byIds(plan.outgoingIds, { fallbackToSingles: true }) || [];
60960
- if (!isCurrentGeneration(owner, generation))
60961
- return null;
60962
- actualChecked = fetched.length;
60963
- const fetchedById = new Map(fetched.map((transfer) => [String(transfer?.id || ""), transfer]));
60964
- for (const id of plan.outgoingIds) {
60965
- const transfer = fetchedById.get(id);
60966
- if (!transfer)
60967
- continue;
60968
- const current = baseById.get(id);
60969
- const update = current?.transferDirection && !transfer?.transferDirection ? { ...transfer, transferDirection: current.transferDirection } : transfer;
60970
- updates.push(update);
60971
- if (!isPendingTransfer(update)) {
60972
- resolvedIds.push(id);
60973
- owner.unresolvedCount.delete(id);
60974
- } else {
60975
- const count = (owner.unresolvedCount.get(id) || 0) + 1;
60976
- owner.unresolvedCount.set(id, count);
60977
- unresolvedOutgoing += 1;
60978
- maxUnresolvedCount = Math.max(maxUnresolvedCount, count);
60979
- }
60738
+ const fetched = await owner.reads.byIds(plan.selectedIds);
60739
+ if (!isCurrentGeneration(owner, generation))
60740
+ return null;
60741
+ const actualChecked = fetched.length;
60742
+ const selected = new Set(plan.selectedIds);
60743
+ for (const transfer of fetched) {
60744
+ const id = String(transfer?.id || "");
60745
+ if (!selected.has(id) || !transferBelongsToWallet(compactTransfer(transfer), owner.walletPK))
60746
+ continue;
60747
+ const current = baseById.get(id);
60748
+ const update = current?.transferDirection && !transfer?.transferDirection ? { ...transfer, transferDirection: current.transferDirection } : transfer;
60749
+ updates.push(update);
60750
+ if (!isPendingTransfer(update)) {
60751
+ resolvedIds.push(id);
60752
+ owner.unresolvedCount.delete(id);
60753
+ } else if (!isIncomingTransfer(update)) {
60754
+ const count = (owner.unresolvedCount.get(id) || 0) + 1;
60755
+ owner.unresolvedCount.set(id, count);
60756
+ unresolvedOutgoing += 1;
60757
+ maxUnresolvedCount = Math.max(maxUnresolvedCount, count);
60980
60758
  }
60981
60759
  }
60982
- return { baseTransfers, resolvedIds, completedOverlayIds, updates, actualChecked, unresolvedOutgoing, maxUnresolvedCount };
60760
+ return { resolvedIds, updates, actualChecked, unresolvedOutgoing, maxUnresolvedCount };
60983
60761
  }
60984
60762
  async function commitPendingReconciliation(owner, plan, result, generation) {
60985
60763
  if (!result || !isCurrentGeneration(owner, generation))
60986
60764
  return null;
60987
- let nextTransfers = result.updates.length ? mergeTransferPageForWallet(result.baseTransfers, result.updates, owner.walletPK, "append") : result.baseTransfers;
60765
+ const current = owner.snapshot.getTransfers();
60766
+ const nextTransfers = result.updates.length ? overlayPending(owner, mergeTransferPageForWallet(current, result.updates, owner.walletPK, "append")) : current;
60988
60767
  forgetPending(owner, result.resolvedIds);
60989
- if (result.completedOverlayIds.length)
60990
- nextTransfers = markClaimedTransfersCompleted(nextTransfers, result.completedOverlayIds);
60991
- if (nextTransfers !== result.baseTransfers) {
60768
+ if (nextTransfers !== current) {
60992
60769
  const selectedIds = new Set(plan.selectedIds);
60993
60770
  await owner.snapshot.commitConfirmed(nextTransfers.filter((transfer) => selectedIds.has(String(transfer?.id)) && !isPendingTransfer(transfer)), { position: "prepend" });
60994
60771
  if (!isCurrentGeneration(owner, generation))
60995
60772
  return null;
60996
- owner.snapshot.replace(nextTransfers);
60773
+ owner.snapshot.replace(mergeTransferPageForWallet(owner.snapshot.getTransfers(), result.updates, owner.walletPK, "append"));
60997
60774
  owner.snapshot.setReady();
60998
60775
  }
60999
60776
  markDone(owner.diag, "wallet.pendingTxs.reconcile", plan.startedAt, {
@@ -61030,7 +60807,7 @@ async function reconcilePendingTransfers(owner, options = {}, generation = owner
61030
60807
  }
61031
60808
  if (cold)
61032
60809
  owner.coldRefreshAt = startedAt;
61033
- const plan = planPendingReconciliation(owner, { startedAt, cold, reason });
60810
+ const plan = planPendingReconciliation(owner, { startedAt, cold, reason, force: options.force === true });
61034
60811
  if (!plan.selectedIds.length)
61035
60812
  return [];
61036
60813
  if (!await owner.waitForWork("pending-reconcile", plan.eagerOutgoing ? { waitForSdkQuiet: false, idleMs: 0 } : undefined) || !isCurrentGeneration(owner, generation))
@@ -61064,29 +60841,38 @@ function refreshPending(owner, ids = null, options = {}) {
61064
60841
  const requestedIds = transferIds2(ids);
61065
60842
  if (requestedIds.length)
61066
60843
  return refreshRequestedTransfers(owner, requestedIds);
61067
- if (owner.claims.isActive())
61068
- return Promise.resolve([]);
61069
- const queuedClaims = owner.claims.queuedCount();
61070
- if (owner.isPendingQuery() || queuedClaims) {
61071
- markDiag(owner.diag, "wallet.pendingTxs.reconcile.defer", {
61072
- reason: owner.isPendingQuery() ? "pending-query" : "claim-queue",
61073
- queued: queuedClaims
61074
- });
61075
- return Promise.resolve([]);
61076
- }
61077
60844
  if (owner.promise) {
61078
60845
  owner.queuedAll = true;
60846
+ owner.queuedForce ||= options.force === true;
61079
60847
  return owner.promise;
61080
60848
  }
61081
- const request2 = reconcilePendingTransfers(owner, options, generation).finally(() => {
60849
+ const run2 = async () => {
60850
+ const dueIds = [...owner.hydrationDue].filter(([, due]) => options.force === true || due <= Date.now()).map(([id]) => id);
60851
+ if (dueIds.length)
60852
+ await refreshRequestedTransfers(owner, dueIds);
60853
+ if (!isCurrentGeneration(owner, generation) || owner.claims.isActive())
60854
+ return [];
60855
+ const queuedClaims = owner.claims.queuedCount();
60856
+ if (owner.isPendingQuery() || queuedClaims) {
60857
+ markDiag(owner.diag, "wallet.pendingTxs.reconcile.defer", {
60858
+ reason: owner.isPendingQuery() ? "pending-query" : "claim-queue",
60859
+ queued: queuedClaims
60860
+ });
60861
+ return [];
60862
+ }
60863
+ return reconcilePendingTransfers(owner, options, generation);
60864
+ };
60865
+ const request2 = run2().finally(() => {
61082
60866
  if (owner.promise === request2)
61083
60867
  owner.promise = null;
61084
60868
  if (!isCurrentGeneration(owner, generation))
61085
60869
  return;
61086
60870
  const queuedAll = owner.queuedAll;
60871
+ const force = owner.queuedForce;
61087
60872
  owner.queuedAll = false;
60873
+ owner.queuedForce = false;
61088
60874
  if (queuedAll)
61089
- refreshPending(owner);
60875
+ refreshPending(owner, null, { force });
61090
60876
  });
61091
60877
  owner.promise = request2;
61092
60878
  return request2;
@@ -61111,9 +60897,11 @@ function createPendingTransferReconciliation({ wallet, walletPK, outgoingSettleM
61111
60897
  attemptAt: new Map,
61112
60898
  unresolvedCount: new Map,
61113
60899
  requestedIds: new Set,
60900
+ hydrationDue: new Map,
61114
60901
  requestedPromise: null,
61115
60902
  promise: null,
61116
60903
  queuedAll: false,
60904
+ queuedForce: false,
61117
60905
  cursor: 0,
61118
60906
  coldRefreshAt: 0,
61119
60907
  graceUntil: 0,
@@ -61126,9 +60914,11 @@ function createPendingTransferReconciliation({ wallet, walletPK, outgoingSettleM
61126
60914
  owner.attemptAt.clear();
61127
60915
  owner.unresolvedCount.clear();
61128
60916
  owner.requestedIds.clear();
60917
+ owner.hydrationDue.clear();
61129
60918
  owner.requestedPromise = null;
61130
60919
  owner.promise = null;
61131
60920
  owner.queuedAll = false;
60921
+ owner.queuedForce = false;
61132
60922
  owner.cursor = 0;
61133
60923
  owner.coldRefreshAt = 0;
61134
60924
  owner.graceUntil = 0;
@@ -61144,6 +60934,7 @@ function createPendingTransferReconciliation({ wallet, walletPK, outgoingSettleM
61144
60934
  startBootGrace() {
61145
60935
  owner.graceUntil = Date.now() + WALLET_PENDING_TRANSFER_BOOT_GRACE_MS;
61146
60936
  },
60937
+ hasRequestedTransfers: () => owner.hydrationDue.size > 0,
61147
60938
  refresh: (ids, options) => refreshPending(owner, ids, options),
61148
60939
  reset
61149
60940
  });
@@ -61158,6 +60949,18 @@ var init_transferpending = __esm(() => {
61158
60949
  COLD_REFRESH_INTERVAL_MS = Math.max(0, WALLET_PENDING_TRANSFER_COLD_REFRESH_INTERVAL_MS);
61159
60950
  });
61160
60951
 
60952
+ // ../../core/wallet/history.js
60953
+ function transferPage(page, currentOffset, limit) {
60954
+ const transfers = Array.isArray(page?.transfers) ? page.transfers : [];
60955
+ const returnedOffset = Number(page?.offset);
60956
+ const nextOffset = Number.isFinite(returnedOffset) && returnedOffset > currentOffset ? returnedOffset : currentOffset + transfers.length;
60957
+ return {
60958
+ transfers,
60959
+ nextOffset,
60960
+ hasMore: transfers.length >= limit
60961
+ };
60962
+ }
60963
+
61161
60964
  // ../../core/wallet/transferhistorysync.js
61162
60965
  function isCurrentGeneration2(owner, generation) {
61163
60966
  return owner.generation === generation && !owner.isClosed();
@@ -62735,72 +62538,16 @@ function createWalletTransferSession({ wallet, walletPK, claimIncomingTransfers,
62735
62538
  }
62736
62539
  return queueWalletFetch(() => wallet.getTransfer(String(transferId2)));
62737
62540
  };
62738
- const fetchTransfersByIds = async (ids, { fallbackToSingles = false } = {}) => {
62541
+ const fetchTransfersByIds = async (ids) => {
62739
62542
  const transferIds3 = uniqueIds(ids);
62740
- if (!transferIds3.length) {
62543
+ if (!transferIds3.length)
62741
62544
  return [];
62742
- }
62743
- if (typeof wallet?.transferService?.getTransfersByIds !== "function") {
62744
- if (!fallbackToSingles) {
62745
- return null;
62746
- }
62747
- const transfers = [];
62748
- for (const transferId2 of transferIds3) {
62749
- const tx = await fetchTransferById(transferId2);
62750
- if (tx) {
62751
- transfers.push(tx);
62752
- }
62753
- }
62754
- return transfers;
62755
- }
62756
62545
  return queueWalletFetch(async () => {
62757
- const fetched = await wallet.transferService.getTransfersByIds.call(wallet.transferService, transferIds3);
62758
- if (typeof wallet.constructTransfersWithUserRequest === "function") {
62759
- return wallet.constructTransfersWithUserRequest(fetched);
62760
- }
62761
- return Array.isArray(fetched) ? fetched : [];
62546
+ const client = await wallet.connectionManager.createSparkClient(wallet.config.getCoordinatorAddress());
62547
+ const result = await client.query_transfers_by_id({ transferIds: transferIds3, network: wallet.config.getNetworkProto() });
62548
+ return wallet.constructTransfersWithUserRequest(result.transfers);
62762
62549
  });
62763
62550
  };
62764
- const fetchRecentTransferPagesForIds = async (ids, baseTransfers = [], { maxPages = PENDING_TRANSFER_RECONCILE_MAX_PAGES, pageSize = PENDING_TRANSFER_RECONCILE_PAGE_SIZE } = {}) => {
62765
- const requestedIds = uniqueIds(ids);
62766
- if (!requestedIds.length) {
62767
- return { transfers: [], foundIds: [], pages: 0, pageCount: 0 };
62768
- }
62769
- const requestedSet = new Set(requestedIds);
62770
- const baseById = new Map(baseTransfers.map((tx) => [String(tx?.id || ""), tx]));
62771
- const targetTransfers = requestedIds.map((id) => baseById.get(id)).filter(Boolean);
62772
- const oldestTargetMs = getOldestAnyTransferMs(targetTransfers);
62773
- const foundIds = new Set;
62774
- const transfers = [];
62775
- let offset = 0;
62776
- let pages = 0;
62777
- let pageCount = 0;
62778
- while (pages < maxPages && foundIds.size < requestedSet.size) {
62779
- const page = transferPage(await fetchTransfersPage(pageSize, offset), offset, pageSize);
62780
- const pageTransfers = page.transfers;
62781
- pages += 1;
62782
- pageCount += pageTransfers.length;
62783
- transfers.push(...pageTransfers);
62784
- for (const tx of pageTransfers) {
62785
- const id = String(tx?.id || "");
62786
- if (requestedSet.has(id)) {
62787
- foundIds.add(id);
62788
- }
62789
- }
62790
- if (!page.hasMore) {
62791
- break;
62792
- }
62793
- const oldestPageMs = getOldestAnyTransferMs(pageTransfers);
62794
- if (oldestTargetMs != null && oldestPageMs != null && oldestPageMs < oldestTargetMs) {
62795
- break;
62796
- }
62797
- if (page.nextOffset <= offset) {
62798
- break;
62799
- }
62800
- offset = page.nextOffset;
62801
- }
62802
- return { transfers, foundIds: [...foundIds], pages, pageCount };
62803
- };
62804
62551
  const getPendingTransfersSnapshot = () => {
62805
62552
  if (!wallet) {
62806
62553
  return Promise.resolve([]);
@@ -62855,9 +62602,7 @@ function createWalletTransferSession({ wallet, walletPK, claimIncomingTransfers,
62855
62602
  setReady: () => setTxReadyValue(true)
62856
62603
  },
62857
62604
  reads: {
62858
- byId: fetchTransferById,
62859
- byIds: fetchTransfersByIds,
62860
- recentPages: fetchRecentTransferPagesForIds
62605
+ byIds: fetchTransfersByIds
62861
62606
  },
62862
62607
  claims: incomingClaims,
62863
62608
  waitForWork: waitForBackgroundWorkSlot,
@@ -63050,6 +62795,7 @@ function createWalletTransferSession({ wallet, walletPK, claimIncomingTransfers,
63050
62795
  serverHistoryComplete: historyComplete,
63051
62796
  hasMoreTxs: !historyComplete,
63052
62797
  hasPendingTxs,
62798
+ hasRequestedTransfers: pendingReconciliation.hasRequestedTransfers,
63053
62799
  hasPendingIncomingTxs: pendingIncomingTransfers(transfers).length > 0,
63054
62800
  beginSdkActivity,
63055
62801
  getRecentTxs,
@@ -63095,7 +62841,7 @@ function createWalletTransferSession({ wallet, walletPK, claimIncomingTransfers,
63095
62841
  }
63096
62842
  };
63097
62843
  }
63098
- var TRANSFER_FETCH_THROTTLE_MS, PENDING_TRANSFER_QUERY_PAGE_SIZE, PENDING_TRANSFER_RECONCILE_PAGE_SIZE, SDK_BACKGROUND_QUIET_MS, PENDING_TRANSFER_RECONCILE_MAX_PAGES = 5, PENDING_TRANSFER_CLAIM_RETRY_MS, PENDING_TRANSFER_OUTGOING_SETTLE_MS;
62844
+ var TRANSFER_FETCH_THROTTLE_MS, PENDING_TRANSFER_QUERY_PAGE_SIZE, SDK_BACKGROUND_QUIET_MS, PENDING_TRANSFER_CLAIM_RETRY_MS, PENDING_TRANSFER_OUTGOING_SETTLE_MS;
63099
62845
  var init_transfers = __esm(() => {
63100
62846
  init_config();
63101
62847
  init_async();
@@ -63107,7 +62853,6 @@ var init_transfers = __esm(() => {
63107
62853
  init_transferdata();
63108
62854
  TRANSFER_FETCH_THROTTLE_MS = WALLET_TRANSFER_FETCH_THROTTLE_MS;
63109
62855
  PENDING_TRANSFER_QUERY_PAGE_SIZE = TRANSFER_PAGE_LIMIT;
63110
- PENDING_TRANSFER_RECONCILE_PAGE_SIZE = TRANSFER_PAGE_LIMIT;
63111
62856
  SDK_BACKGROUND_QUIET_MS = Math.max(0, WALLET_SDK_BACKGROUND_QUIET_MS);
63112
62857
  PENDING_TRANSFER_CLAIM_RETRY_MS = WALLET_PENDING_TRANSFER_CLAIM_RETRY_MS;
63113
62858
  PENDING_TRANSFER_OUTGOING_SETTLE_MS = PENDING_TRANSFER_CLAIM_RETRY_MS;
@@ -63160,7 +62905,6 @@ function createEmptyWalletSessionSnapshot(network, transferSnapshot = null, cach
63160
62905
  isWalletDataReady: false,
63161
62906
  isWalletDataLoaded: cachedDataReady || cachedBalance != null,
63162
62907
  refresh: ASYNC_NOOP,
63163
- setTransferDiscoveryVisible: NOOP5,
63164
62908
  claimDeposits: ASYNC_FALSE,
63165
62909
  getFundingAddress: ASYNC_NOOP,
63166
62910
  preparePayment: WALLET_NOT_READY,
@@ -63193,7 +62937,6 @@ function createWalletSession({
63193
62937
  network,
63194
62938
  claimIncomingTransfers = null,
63195
62939
  pendingClaimBatchSize = null,
63196
- activeTransferRefreshMs = null,
63197
62940
  eagerOutgoingStatusRefresh = false,
63198
62941
  sentTransferRefreshDelayMs = null,
63199
62942
  deferBackgroundWork = null,
@@ -63216,7 +62959,7 @@ function createWalletSession({
63216
62959
  let publishedSnapshot = null;
63217
62960
  const valueSubscriptions = createFieldSubscriptions(() => publishedSnapshot?.value);
63218
62961
  const txSubscriptions = createFieldSubscriptions(() => publishedSnapshot?.txValue);
63219
- let polling = null;
62962
+ let reconciliation = null;
63220
62963
  let readyDiag = null;
63221
62964
  let refreshWalletBalance = null;
63222
62965
  const transferSession = createWalletTransferSession({
@@ -63238,7 +62981,7 @@ function createWalletSession({
63238
62981
  return;
63239
62982
  const nextSnapshot = buildSnapshot();
63240
62983
  readyDiag?.sync();
63241
- polling?.sync();
62984
+ reconciliation?.sync();
63242
62985
  if (publishedSnapshot && nextSnapshot.value === publishedSnapshot.value && nextSnapshot.txValue === publishedSnapshot.txValue) {
63243
62986
  return;
63244
62987
  }
@@ -63268,17 +63011,16 @@ function createWalletSession({
63268
63011
  });
63269
63012
  const claims = createDepositClaims({
63270
63013
  wallet,
63271
- updateWalletData,
63272
63014
  diag
63273
63015
  });
63274
- polling = createWalletPolling({
63275
- wallet,
63016
+ reconciliation = createWalletReconciliation({
63276
63017
  network,
63277
63018
  appState,
63278
63019
  getTransferState,
63279
- getBalanceState: balance.getSnapshot,
63280
- refreshClaims: claims.refreshClaims,
63281
- activeTransferRefreshMs,
63020
+ updateWalletData,
63021
+ deferBackgroundWork,
63022
+ backgroundSignal: backgroundAbort.signal,
63023
+ claimDeposits: claims.claimDeposits,
63282
63024
  diag
63283
63025
  });
63284
63026
  readyDiag = createWalletReadyDiag({
@@ -63289,9 +63031,9 @@ function createWalletSession({
63289
63031
  });
63290
63032
  const events = createWalletEvents({
63291
63033
  wallet,
63292
- updateWalletData,
63293
63034
  getTransferState,
63294
- setBalance: balance.setBalance,
63035
+ reconcile: reconciliation.request,
63036
+ sync: reconciliation.sync,
63295
63037
  setTokenBalances: balance.setTokenBalances,
63296
63038
  setSatsBalanceResult: balance.setSatsBalanceResult,
63297
63039
  diag
@@ -63335,8 +63077,7 @@ function createWalletSession({
63335
63077
  isBalanceLoading: balanceState.isBalanceLoading,
63336
63078
  isWalletDataReady: true,
63337
63079
  isWalletDataLoaded: balanceState.balanceReady || currentTransferState.txReady,
63338
- refresh: claims.refresh,
63339
- setTransferDiscoveryVisible: polling.setTransferDiscoveryVisible,
63080
+ refresh: reconciliation.refresh,
63340
63081
  claimDeposits: claims.claimDeposits,
63341
63082
  getFundingAddress: funding.getFundingAddress,
63342
63083
  preparePayment: mutationActions.preparePayment,
@@ -63368,17 +63109,8 @@ function createWalletSession({
63368
63109
  const unsubscribeTransfers = transferSession.subscribe(publish);
63369
63110
  publishedSnapshot = buildSnapshot();
63370
63111
  readyDiag.sync();
63371
- polling.sync();
63372
- const boot = createWalletBoot({
63373
- wallet,
63374
- getTransferState,
63375
- getBalance: balance.getBalance,
63376
- getRecentTxs: transferState.getRecentTxs,
63377
- deferBackgroundWork,
63378
- backgroundSignal: backgroundAbort.signal,
63379
- stopPoll: polling.stopPoll,
63380
- diag
63381
- });
63112
+ reconciliation.sync();
63113
+ reconciliation.start();
63382
63114
  return {
63383
63115
  wallet,
63384
63116
  walletPK,
@@ -63402,9 +63134,8 @@ function createWalletSession({
63402
63134
  return;
63403
63135
  closed = true;
63404
63136
  backgroundAbort.abort();
63405
- boot.close();
63406
63137
  events.close();
63407
- polling.close();
63138
+ reconciliation.close();
63408
63139
  privacy.close();
63409
63140
  mutations.close();
63410
63141
  payment.close();
@@ -63419,7 +63150,7 @@ function createWalletSession({
63419
63150
  }
63420
63151
  };
63421
63152
  }
63422
- var NOOP5 = () => {}, ASYNC_NOOP = async () => null, ASYNC_FALSE = async () => false, EMPTY_COVERAGE = async () => ({ loaded: 0, historyComplete: false }), WALLET_NOT_READY = async () => {
63153
+ var ASYNC_NOOP = async () => null, ASYNC_FALSE = async () => false, EMPTY_COVERAGE = async () => ({ loaded: 0, historyComplete: false }), WALLET_NOT_READY = async () => {
63423
63154
  throw new Error("wallet not ready");
63424
63155
  };
63425
63156
  var init_session7 = __esm(() => {
@@ -63920,8 +63651,8 @@ function createTxData({ transferStore, historyStore, diag = null, deferAggregati
63920
63651
  let snapshot = null;
63921
63652
  let observedStoreSnapshot = null;
63922
63653
  let observedHistorySnapshot = null;
63923
- let unsubscribeStore = NOOP6;
63924
- let unsubscribeHistory = NOOP6;
63654
+ let unsubscribeStore = NOOP5;
63655
+ let unsubscribeHistory = NOOP5;
63925
63656
  let closed = false;
63926
63657
  function readCurrentAggregatedData(walletPK) {
63927
63658
  const transfers = transferStore.getSnapshot().transfers;
@@ -64256,7 +63987,7 @@ function createTxData({ transferStore, historyStore, diag = null, deferAggregati
64256
63987
  },
64257
63988
  subscribe(listener) {
64258
63989
  if (closed || typeof listener !== "function")
64259
- return NOOP6;
63990
+ return NOOP5;
64260
63991
  if (!listeners.size) {
64261
63992
  if (!deferAggregation) {
64262
63993
  unsubscribeStore = transferStore.subscribe(() => rebuild());
@@ -64276,8 +64007,8 @@ function createTxData({ transferStore, historyStore, diag = null, deferAggregati
64276
64007
  return;
64277
64008
  unsubscribeStore();
64278
64009
  unsubscribeHistory();
64279
- unsubscribeStore = NOOP6;
64280
- unsubscribeHistory = NOOP6;
64010
+ unsubscribeStore = NOOP5;
64011
+ unsubscribeHistory = NOOP5;
64281
64012
  };
64282
64013
  },
64283
64014
  setSources,
@@ -64287,8 +64018,8 @@ function createTxData({ transferStore, historyStore, diag = null, deferAggregati
64287
64018
  closed = true;
64288
64019
  unsubscribeStore();
64289
64020
  unsubscribeHistory();
64290
- unsubscribeStore = NOOP6;
64291
- unsubscribeHistory = NOOP6;
64021
+ unsubscribeStore = NOOP5;
64022
+ unsubscribeHistory = NOOP5;
64292
64023
  listeners.clear();
64293
64024
  seriesCache.current.clear();
64294
64025
  historySeriesCache.current.clear();
@@ -64416,7 +64147,7 @@ var byRecentTx = (a, b) => {
64416
64147
  txById,
64417
64148
  peerTxsByPK
64418
64149
  };
64419
- }, EMPTY_AGG, EMPTY_TXS2, EMPTY_PEER_DATA, RECENT_WALLET_PEER_SCAN_LIMIT, TX_SEARCH_DEFAULT_LIMIT = 5, TX_SEARCH_EXACT_MIN_LENGTH = 12, NOOP6 = () => {}, EMPTY_TX_DATA_SOURCES, TX_DATA_SOURCE_KEYS;
64150
+ }, EMPTY_AGG, EMPTY_TXS2, EMPTY_PEER_DATA, RECENT_WALLET_PEER_SCAN_LIMIT, TX_SEARCH_DEFAULT_LIMIT = 5, TX_SEARCH_EXACT_MIN_LENGTH = 12, NOOP5 = () => {}, EMPTY_TX_DATA_SOURCES, TX_DATA_SOURCE_KEYS;
64420
64151
  var init_txdata = __esm(() => {
64421
64152
  init_config();
64422
64153
  init_time();
@@ -64502,8 +64233,8 @@ function openWallet(options = {}) {
64502
64233
  let cachedBalance = null;
64503
64234
  let peerCache = { transfers: null, historyGeneration: -1, walletPK: "", value: {} };
64504
64235
  let sessionOwner = null;
64505
- let releaseSessionOwner = NOOP7;
64506
- let stopSessionOwner = NOOP7;
64236
+ let releaseSessionOwner = NOOP6;
64237
+ let stopSessionOwner = NOOP6;
64507
64238
  let snapshot = createEmptyWalletSessionSnapshot(initialNetwork, transferStore.getSnapshot(), null, historyStore.getSnapshot());
64508
64239
  function syncTransactions() {
64509
64240
  transactions.setSources({
@@ -64537,8 +64268,8 @@ function openWallet(options = {}) {
64537
64268
  function detachSessionOwner() {
64538
64269
  const stop = stopSessionOwner;
64539
64270
  const release = releaseSessionOwner;
64540
- stopSessionOwner = NOOP7;
64541
- releaseSessionOwner = NOOP7;
64271
+ stopSessionOwner = NOOP6;
64272
+ releaseSessionOwner = NOOP6;
64542
64273
  sessionOwner = null;
64543
64274
  stop();
64544
64275
  release();
@@ -64554,7 +64285,6 @@ function openWallet(options = {}) {
64554
64285
  network: sources.network,
64555
64286
  claimIncomingTransfers: options.claimIncomingTransfers || claimIncomingTransfersById,
64556
64287
  pendingClaimBatchSize: options.pendingClaimBatchSize,
64557
- activeTransferRefreshMs: options.activeTransferRefreshMs,
64558
64288
  eagerOutgoingStatusRefresh: options.eagerOutgoingStatusRefresh === true,
64559
64289
  sentTransferRefreshDelayMs: options.sentTransferRefreshDelayMs,
64560
64290
  deferBackgroundWork: options.deferBackgroundWork || null,
@@ -64615,7 +64345,7 @@ function openWallet(options = {}) {
64615
64345
  },
64616
64346
  subscribe(listener) {
64617
64347
  if (closed || typeof listener !== "function")
64618
- return NOOP7;
64348
+ return NOOP6;
64619
64349
  listeners.add(listener);
64620
64350
  return () => listeners.delete(listener);
64621
64351
  },
@@ -64673,7 +64403,7 @@ function openWallet(options = {}) {
64673
64403
  };
64674
64404
  return Object.freeze(wallet);
64675
64405
  }
64676
- var NOOP7 = () => {}, ACTIVE_APP_STATE;
64406
+ var NOOP6 = () => {}, ACTIVE_APP_STATE;
64677
64407
  var init_wallet = __esm(() => {
64678
64408
  init_localdata();
64679
64409
  init_claiming();
@@ -64850,7 +64580,7 @@ function openAccount(options = {}) {
64850
64580
  let closed = false;
64851
64581
  let attempt = 0;
64852
64582
  let foreground = true;
64853
- let stopVault = NOOP8;
64583
+ let stopVault = NOOP7;
64854
64584
  let syncingUser = false;
64855
64585
  let closePromise = null;
64856
64586
  let state;
@@ -64877,7 +64607,7 @@ function openAccount(options = {}) {
64877
64607
  revokedUid = accountUid;
64878
64608
  bootstrapGeneration += 1;
64879
64609
  if (accountUid && options.bootstrapStorage) {
64880
- bootstrapWriteTail = bootstrapWriteTail.catch(NOOP8).then(() => options.bootstrapStorage.remove(accountUid));
64610
+ bootstrapWriteTail = bootstrapWriteTail.catch(NOOP7).then(() => options.bootstrapStorage.remove(accountUid));
64881
64611
  bootstrapWriteTail.catch((error) => diag?.("account.bootstrap.remove.error", { code: error?.code || "" }));
64882
64612
  }
64883
64613
  let callback;
@@ -65263,7 +64993,7 @@ function openAccount(options = {}) {
65263
64993
  }
65264
64994
  function watchVault(uid) {
65265
64995
  stopVault();
65266
- stopVault = NOOP8;
64996
+ stopVault = NOOP7;
65267
64997
  if (!uid)
65268
64998
  return;
65269
64999
  const startedAt = Date.now();
@@ -65341,11 +65071,11 @@ function openAccount(options = {}) {
65341
65071
  bootstrapGeneration += 1;
65342
65072
  lastBootstrap = "";
65343
65073
  if (previousUid && !uid && options.bootstrapStorage) {
65344
- bootstrapWriteTail = bootstrapWriteTail.catch(NOOP8).then(() => options.bootstrapStorage.remove(previousUid));
65074
+ bootstrapWriteTail = bootstrapWriteTail.catch(NOOP7).then(() => options.bootstrapStorage.remove(previousUid));
65345
65075
  bootstrapWriteTail.catch((error) => diag?.("account.bootstrap.remove.error", { code: error?.code || "" }));
65346
65076
  }
65347
65077
  stopVault();
65348
- stopVault = NOOP8;
65078
+ stopVault = NOOP7;
65349
65079
  closeSession({ notify: false });
65350
65080
  user.setNetwork(defaultNetwork);
65351
65081
  const currentUser = user.getSnapshot();
@@ -65410,7 +65140,7 @@ function openAccount(options = {}) {
65410
65140
  lastBootstrap = serialized;
65411
65141
  const uid = state.uid;
65412
65142
  const generation = bootstrapGeneration;
65413
- bootstrapWriteTail = bootstrapWriteTail.catch(NOOP8).then(() => {
65143
+ bootstrapWriteTail = bootstrapWriteTail.catch(NOOP7).then(() => {
65414
65144
  if (closed || generation !== bootstrapGeneration || state.uid !== uid)
65415
65145
  return;
65416
65146
  return options.bootstrapStorage.write(uid, value);
@@ -65835,7 +65565,7 @@ function openAccount(options = {}) {
65835
65565
  getSnapshot: () => state,
65836
65566
  subscribe(listener) {
65837
65567
  if (typeof listener !== "function")
65838
- return NOOP8;
65568
+ return NOOP7;
65839
65569
  listeners.add(listener);
65840
65570
  return () => listeners.delete(listener);
65841
65571
  },
@@ -65854,7 +65584,7 @@ function openAccount(options = {}) {
65854
65584
  close
65855
65585
  });
65856
65586
  }
65857
- var NOOP8 = () => {};
65587
+ var NOOP7 = () => {};
65858
65588
  var init_account = __esm(() => {
65859
65589
  init_session();
65860
65590
  init_user();
@@ -76214,7 +75944,7 @@ var package_default;
76214
75944
  var init_package2 = __esm(() => {
76215
75945
  package_default = {
76216
75946
  name: "veyl",
76217
- version: "0.74.2",
75947
+ version: "0.75.1",
76218
75948
  packageManager: "bun@1.4.0",
76219
75949
  private: true,
76220
75950
  license: "UNLICENSED",
@@ -100044,7 +99774,7 @@ var require_sender = __commonJS(function(exports, module) {
100044
99774
  types: { isUint8Array }
100045
99775
  } = __require("util");
100046
99776
  var PerMessageDeflate = require_permessage_deflate();
100047
- var { EMPTY_BUFFER: EMPTY_BUFFER3, kWebSocket, NOOP: NOOP9 } = require_constants();
99777
+ var { EMPTY_BUFFER: EMPTY_BUFFER3, kWebSocket, NOOP: NOOP8 } = require_constants();
100048
99778
  var { isBlob, isValidStatusCode } = require_validation();
100049
99779
  var { mask: applyMask, toBuffer } = require_buffer_util();
100050
99780
  var kByteLength = Symbol("kByteLength");
@@ -100069,7 +99799,7 @@ var require_sender = __commonJS(function(exports, module) {
100069
99799
  this._bufferedBytes = 0;
100070
99800
  this._queue = [];
100071
99801
  this._state = DEFAULT;
100072
- this.onerror = NOOP9;
99802
+ this.onerror = NOOP8;
100073
99803
  this[kWebSocket] = undefined;
100074
99804
  }
100075
99805
  static frame(data, options) {
@@ -100734,7 +100464,7 @@ var require_websocket = __commonJS(function(exports, module) {
100734
100464
  kListener,
100735
100465
  kStatusCode,
100736
100466
  kWebSocket,
100737
- NOOP: NOOP9
100467
+ NOOP: NOOP8
100738
100468
  } = require_constants();
100739
100469
  var {
100740
100470
  EventTarget: { addEventListener, removeEventListener }
@@ -101415,7 +101145,7 @@ var require_websocket = __commonJS(function(exports, module) {
101415
101145
  function receiverOnPing(data) {
101416
101146
  const websocket = this[kWebSocket];
101417
101147
  if (websocket._autoPong)
101418
- websocket.pong(data, !this._isServer, NOOP9);
101148
+ websocket.pong(data, !this._isServer, NOOP8);
101419
101149
  websocket.emit("ping", data);
101420
101150
  }
101421
101151
  function receiverOnPong(data) {
@@ -101475,7 +101205,7 @@ var require_websocket = __commonJS(function(exports, module) {
101475
101205
  function socketOnError() {
101476
101206
  const websocket = this[kWebSocket];
101477
101207
  this.removeListener("error", socketOnError);
101478
- this.on("error", NOOP9);
101208
+ this.on("error", NOOP8);
101479
101209
  if (websocket) {
101480
101210
  websocket._readyState = WebSocket2.CLOSING;
101481
101211
  this.destroy();