@fastnear/wallet-adapter
Version:
Wallet adapter implementations for Meteor Wallet and Near Mobile
1 lines • 4.07 kB
Source Map (JSON)
{"version":3,"sources":["../../src/polling.ts"],"sourcesContent":["import { TransportError } from \"./errors.js\";\n\nexport interface PollingOptions {\n delayMs: number;\n maxIterations: number;\n requestTimeoutMs: number;\n backgroundVisibilityCheckIntervalMs: number;\n backgroundVisibilityCheckTimeoutMs: number;\n requestCallTimeoutMs: number;\n}\n\nconst sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));\n\nconst waitUntilVisible = async (checkIntervalMs: number, timeoutMs: number): Promise<void> => {\n if (typeof document === \"undefined\") return;\n if (!document.hidden) return;\n\n const start = Date.now();\n while (document.hidden) {\n if (Date.now() - start >= timeoutMs) {\n throw new TransportError(\"VISIBILITY_TIMEOUT\", \"Browser tab stayed hidden for too long while polling\");\n }\n await sleep(checkIntervalMs);\n }\n};\n\nconst withTimeout = async <T>(promise: Promise<T>, timeoutMs: number, timeoutCode: string): Promise<T> => {\n let timeoutId: ReturnType<typeof setTimeout> | undefined;\n\n try {\n return await Promise.race([\n promise,\n new Promise<T>((_, reject) => {\n timeoutId = setTimeout(() => {\n reject(new TransportError(timeoutCode, `Operation timed out after ${timeoutMs}ms`));\n }, timeoutMs);\n }),\n ]);\n } finally {\n if (timeoutId != null) clearTimeout(timeoutId);\n }\n};\n\nexport const visibilityAwarePoll = async <T>(\n fn: () => Promise<T>,\n isPending: (value: T) => boolean,\n options: PollingOptions,\n): Promise<T> => {\n const start = Date.now();\n let iteration = 0;\n let delay = options.delayMs;\n\n while (true) {\n if (Date.now() - start > options.requestTimeoutMs) {\n throw new TransportError(\"POLLING_TIMEOUT\", \"Polling timed out\");\n }\n\n await waitUntilVisible(options.backgroundVisibilityCheckIntervalMs, options.backgroundVisibilityCheckTimeoutMs);\n\n const value = await withTimeout(fn(), options.requestCallTimeoutMs, \"POLLING_REQUEST_TIMEOUT\");\n if (!isPending(value)) return value;\n\n if (iteration >= options.maxIterations) {\n throw new TransportError(\"POLLING_MAX_ITERATIONS\", \"Polling reached the maximum number of iterations\");\n }\n\n await sleep(delay);\n delay = Math.min(5_000, Math.ceil(delay * 1.15));\n iteration += 1;\n }\n};\n\nexport const defaultPollingOptions: PollingOptions = {\n delayMs: 1000,\n maxIterations: 1000,\n requestTimeoutMs: 10 * 60 * 1000,\n backgroundVisibilityCheckIntervalMs: 1000,\n backgroundVisibilityCheckTimeoutMs: 10 * 60 * 1000,\n requestCallTimeoutMs: 30_000,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAA+B;AAW/B,MAAM,QAAQ,wBAAC,OAAe,IAAI,QAAc,CAAC,YAAY,WAAW,SAAS,EAAE,CAAC,GAAtE;AAEd,MAAM,mBAAmB,8BAAO,iBAAyB,cAAqC;AAC5F,MAAI,OAAO,aAAa,YAAa;AACrC,MAAI,CAAC,SAAS,OAAQ;AAEtB,QAAM,QAAQ,KAAK,IAAI;AACvB,SAAO,SAAS,QAAQ;AACtB,QAAI,KAAK,IAAI,IAAI,SAAS,WAAW;AACnC,YAAM,IAAI,6BAAe,sBAAsB,sDAAsD;AAAA,IACvG;AACA,UAAM,MAAM,eAAe;AAAA,EAC7B;AACF,GAXyB;AAazB,MAAM,cAAc,8BAAU,SAAqB,WAAmB,gBAAoC;AACxG,MAAI;AAEJ,MAAI;AACF,WAAO,MAAM,QAAQ,KAAK;AAAA,MACxB;AAAA,MACA,IAAI,QAAW,CAAC,GAAG,WAAW;AAC5B,oBAAY,WAAW,MAAM;AAC3B,iBAAO,IAAI,6BAAe,aAAa,6BAA6B,SAAS,IAAI,CAAC;AAAA,QACpF,GAAG,SAAS;AAAA,MACd,CAAC;AAAA,IACH,CAAC;AAAA,EACH,UAAE;AACA,QAAI,aAAa,KAAM,cAAa,SAAS;AAAA,EAC/C;AACF,GAfoB;AAiBb,MAAM,sBAAsB,8BACjC,IACA,WACA,YACe;AACf,QAAM,QAAQ,KAAK,IAAI;AACvB,MAAI,YAAY;AAChB,MAAI,QAAQ,QAAQ;AAEpB,SAAO,MAAM;AACX,QAAI,KAAK,IAAI,IAAI,QAAQ,QAAQ,kBAAkB;AACjD,YAAM,IAAI,6BAAe,mBAAmB,mBAAmB;AAAA,IACjE;AAEA,UAAM,iBAAiB,QAAQ,qCAAqC,QAAQ,kCAAkC;AAE9G,UAAM,QAAQ,MAAM,YAAY,GAAG,GAAG,QAAQ,sBAAsB,yBAAyB;AAC7F,QAAI,CAAC,UAAU,KAAK,EAAG,QAAO;AAE9B,QAAI,aAAa,QAAQ,eAAe;AACtC,YAAM,IAAI,6BAAe,0BAA0B,kDAAkD;AAAA,IACvG;AAEA,UAAM,MAAM,KAAK;AACjB,YAAQ,KAAK,IAAI,KAAO,KAAK,KAAK,QAAQ,IAAI,CAAC;AAC/C,iBAAa;AAAA,EACf;AACF,GA3BmC;AA6B5B,MAAM,wBAAwC;AAAA,EACnD,SAAS;AAAA,EACT,eAAe;AAAA,EACf,kBAAkB,KAAK,KAAK;AAAA,EAC5B,qCAAqC;AAAA,EACrC,oCAAoC,KAAK,KAAK;AAAA,EAC9C,sBAAsB;AACxB;","names":[]}