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