{"version":3,"sources":["../../src/utils/becomingOnline.ts","../../src/utils/createLoader.ts"],"names":["RESOLVED_PROMISE","_isFetchInProgress","_tickStart","_parent","_promise"],"mappings":";;;;;AAEA,IAAI,mBAAA;AAEJ,IAAM,cAAA,GAAiB,MACrB,SAAA,CAAU,MACN,GAAAA,kCAAA,GACA,wBACC,mBAAsB,GAAA,IAAI,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAC1C,EAAO,MAAA,CAAA,gBAAA;AAAA,IACL,QAAA;AAAA,IACA,MAAM;AACJ,MAAsB,mBAAA,GAAA,KAAA;AAEtB,MAAI,GAAA,EAAA;AAAA,KACN;AAAA,IACA,EAAE,MAAM,IAAK;AAAA,GACf;AACF,CAAC,CAAA,CAAA;AAEP,IAAO,sBAAQ,GAAA;;;ACZf,IAAM,YAAA,GAAe,CACnB,UAKA,EAAA,EAAE,OAAO,kBAAmB,EAAA,KAE5B,YAA+C,IAAa,EAAA;AAC1D,EAAA,MAAM,IAAO,GAAA,IAAA;AAEb,EAAA,IAAI,OAAU,GAAA,CAAA;AAEd,EAAA,IAAI,SAAY,GAAA,IAAA;AAEhB,EAAI,IAAA,MAAA;AAEJ,EAAA,MAAM,aAAgB,GAAA,IAAI,OAAc,CAAA,CAAC,GAAQ,KAAA;AAC/C,IAAA,MAAA,GAAS,MAAM;AACb,MAAY,SAAA,GAAA,KAAA;AAEZ,MAAI,GAAA,EAAA;AAAA,KACN;AAAA,GACD,CAAA;AAED,EAAA,MAAM,mBAAmB,MACvB,SAAA,GACI,KAAM,CAAA,GAAG,IAAI,CAAE,CAAA,IAAA;AAAA,IACb,CAAC,KAAU,KAAA;AACT,MAAU,OAAA,GAAA,CAAA;AAEV,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,IAAA,CAAK,IAAI,KAAK,CAAA;AAEd,QAAO,OAAA,IAAA;AAAA;AACT,KACF;AAAA,IACA,CAAC,GAAQ,KAAA;AACP,MAAA,IAAI,SAAW,EAAA;AACb,QAAI,IAAA,CAAC,UAAU,MAAQ,EAAA;AACrB,UAAO,OAAA,sBAAA,EAAiB,CAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAG/C,QAAA,IAAI,kBAAoB,EAAA;AACtB,UAAM,MAAA,KAAA,GAAQ,kBAAmB,CAAA,GAAA,EAAK,OAAO,CAAA;AAE7C,UAAA,IAAI,KAAO,EAAA;AACT,YAAA,OAAA,EAAA;AAEA,YAAO,OAAA,IAAI,OAAQ,CAAA,CAAC,GAAQ,KAAA;AAC1B,cAAA,UAAA,CAAW,KAAK,KAAK,CAAA;AAAA,aACtB,CAAE,CAAA,IAAA,CAAK,gBAAgB,CAAA;AAAA;AAC1B;AAGF,QAAK,IAAA,CAAA,KAAA,CAAM,IAAI,GAAG,CAAA;AAAA;AACpB;AACF,GAEF,GAAAA,kCAAA;AAEN,EAAA,UAAA;AAAA,IACE,aAAA;AAAA,IACA,YAAY;AACV,MAAA,IAAI,SAAW,EAAA;AACb,QAAA,IAAA,CAAKC,CAAqB,GAAA,IAAA;AAE1B,QAAA,IAAA,CAAKC,CAAW,EAAA;AAAA;AAGlB,MAAM,MAAA,GAAA,GAAM,MAAM,gBAAiB,EAAA;AAEnC,MAAA,IAAA,CAAKD,CAAqB,GAAA,KAAA;AAE1B,MAAA,IAAI,KAAKE,CAAS,EAAA;AAChB,QAAA,MAAM,KAAKA,CAAQC,CAAAA,CAAAA;AAAA;AAGrB,MAAO,OAAA,GAAA;AAAA,KACT;AAAA,IACA;AAAA,GACF;AAEA,EAAO,OAAA,MAAA;AACT,CAAA;AAEF,IAAO,oBAAQ,GAAA","file":"chunk-SIM6WMML.cjs","sourcesContent":["import { RESOLVED_PROMISE } from './constants';\n\nlet becomeOnlinePromise: Promise<void> | undefined | false;\n\nconst becomingOnline = () =>\n  navigator.onLine\n    ? RESOLVED_PROMISE\n    : becomeOnlinePromise ||\n      (becomeOnlinePromise = new Promise((res) => {\n        window.addEventListener(\n          'online',\n          () => {\n            becomeOnlinePromise = false;\n\n            res();\n          },\n          { once: true }\n        );\n      }));\n\nexport default becomingOnline;\n","import type {\n  LoadableState,\n  LoadableStateOptions,\n  RequestableStateOptions,\n} from '../types';\nimport becomingOnline from './becomingOnline';\nimport { RESOLVED_PROMISE } from './constants';\n\nconst createLoader = <U extends Record<string, any> = never>(\n  handleLoad: (\n    cancelPromise: Promise<void>,\n    fetch: () => Promise<true | void>,\n    self: LoadableState<any, any, U>\n  ) => void | Promise<void>,\n  { fetch, shouldRetryOnError }: RequestableStateOptions<any, any, any[]>\n) =>\n  function (this: LoadableState<any, any, U>, ...args: any[]) {\n    const self = this;\n\n    let attempt = 0;\n\n    let isRunning = true;\n\n    let cancel!: () => void;\n\n    const cancelPromise = new Promise<void>((res) => {\n      cancel = () => {\n        isRunning = false;\n\n        res();\n      };\n    });\n\n    const retriableFetcher = (): Promise<true | void> =>\n      isRunning\n        ? fetch(...args).then(\n            (value) => {\n              attempt = 0;\n\n              if (isRunning) {\n                self.set(value);\n\n                return true;\n              }\n            },\n            (err) => {\n              if (isRunning) {\n                if (!navigator.onLine) {\n                  return becomingOnline().then(retriableFetcher);\n                }\n\n                if (shouldRetryOnError) {\n                  const delay = shouldRetryOnError(err, attempt);\n\n                  if (delay) {\n                    attempt++;\n\n                    return new Promise((res) => {\n                      setTimeout(res, delay);\n                    }).then(retriableFetcher);\n                  }\n                }\n\n                self.error.set(err);\n              }\n            }\n          )\n        : RESOLVED_PROMISE;\n\n    handleLoad(\n      cancelPromise,\n      async () => {\n        if (isRunning) {\n          self._isFetchInProgress = true;\n\n          self._tickStart();\n        }\n\n        const res = await retriableFetcher();\n\n        self._isFetchInProgress = false;\n\n        if (self._parent) {\n          await self._parent._promise;\n        }\n\n        return res;\n      },\n      self\n    );\n\n    return cancel;\n  } as LoadableStateOptions<any, any>['load'];\n\nexport default createLoader;\n"]}