{"version":3,"file":"use-async-queue.modern.mjs","sources":["../use-async-queue.ts"],"sourcesContent":["import { useState, useRef, useCallback, useEffect } from \"react\";\nimport nextTick from \"next-tick\";\n\ninterface QueueStats {\n  numPending: number;\n  numInFlight: number;\n  numDone: number;\n}\n\nexport interface QueueTaskResult {\n  id: unknown;\n  task(): Promise<unknown>;\n  result?: Promise<unknown>;\n  stats?: QueueStats;\n}\n\ninterface Queue {\n  add: (task: QueueTaskResult) => void;\n  stats: QueueStats;\n}\n\ninterface QueueOpts {\n  concurrency?: number;\n  done?: (result: QueueTaskResult) => void;\n  drain?: () => void;\n  inflight?: (task: QueueTaskResult) => void;\n}\n\nfunction useAsyncQueue(opts: QueueOpts): Queue {\n  const { done, drain, inflight } = opts;\n  let { concurrency } = opts;\n  concurrency = concurrency || Infinity;\n  if (concurrency < 1) concurrency = Infinity;\n\n  const [stats, setStats] = useState({\n    numPending: 0,\n    numInFlight: 0,\n    numDone: 0,\n  });\n\n  const drained = useRef(true);\n  const inFlight = useRef([] as QueueTaskResult[]);\n  const pending = useRef([] as QueueTaskResult[]);\n\n  useEffect(() => {\n    if (\n      stats.numDone > 0 &&\n      drain &&\n      inFlight.current.length === 0 &&\n      pending.current.length === 0 &&\n      !drained.current\n    ) {\n      drained.current = true;\n      return nextTick(drain);\n    }\n\n    while (\n      inFlight.current.length < concurrency! &&\n      pending.current.length > 0\n    ) {\n      drained.current = false;\n      const task = pending.current.shift();\n      if (task) {\n        inFlight.current.push(task);\n        setStats((stats) => {\n          return {\n            ...stats,\n            numPending: stats.numPending - 1,\n            numInFlight: stats.numInFlight + 1,\n          };\n        });\n        inflight && inflight({ ...task, stats });\n        const result = task.task();\n        result\n          .then(() => {\n            inFlight.current.pop();\n            setStats((stats) => {\n              return {\n                ...stats,\n                numInFlight: stats.numInFlight - 1,\n                numDone: stats.numDone + 1,\n              };\n            });\n            done && done({ ...task, result, stats });\n          })\n          .catch(() => {\n            inFlight.current.pop();\n            setStats((stats) => {\n              return {\n                ...stats,\n                numInFlight: stats.numInFlight - 1,\n                numDone: stats.numDone + 1,\n              };\n            });\n            done && done({ ...task, result, stats });\n          });\n      }\n    }\n  }, [concurrency, done, drain, inflight, stats]);\n\n  const add = useCallback((task: QueueTaskResult) => {\n    if (\n      !pending.current.find((t) => {\n        return t.id === task.id;\n      }) &&\n      !inFlight.current.find((t) => {\n        return t.id === task.id;\n      })\n    ) {\n      pending.current.push(task);\n      setStats((stats) => {\n        return {\n          ...stats,\n          numPending: stats.numPending + 1,\n        };\n      });\n    }\n  }, []);\n\n  return { add, stats };\n}\n\nexport default useAsyncQueue;\n"],"names":["useAsyncQueue","opts","done","drain","inflight","concurrency","Infinity","stats","setStats","useState","numPending","numInFlight","numDone","drained","useRef","inFlight","pending","useEffect","current","length","nextTick","task","shift","push","_extends","result","then","pop","catch","add","useCallback","find","t","id"],"mappings":"8TA4BA,SAASA,EAAcC,GACrB,MAAMC,KAAEA,EAAIC,MAAEA,EAAKC,SAAEA,GAAaH,EAClC,IAAII,YAAEA,GAAgBJ,EACtBI,EAAcA,GAAeC,SACzBD,EAAc,IAAGA,EAAcC,UAEnC,MAAOC,EAAOC,GAAYC,EAAS,CACjCC,WAAY,EACZC,YAAa,EACbC,QAAS,IAGLC,EAAUC,GAAO,GACjBC,EAAWD,EAAO,IAClBE,EAAUF,EAAO,IAEvBG,EAAU,KACR,GACEV,EAAMK,QAAU,GAChBT,GAC4B,IAA5BY,EAASG,QAAQC,QACU,IAA3BH,EAAQE,QAAQC,SACfN,EAAQK,QAGT,OADAL,EAAQK,SAAU,EACXE,EAASjB,GAGlB,KACEY,EAASG,QAAQC,OAASd,GAC1BW,EAAQE,QAAQC,OAAS,GACzB,CACAN,EAAQK,SAAU,EAClB,MAAMG,EAAOL,EAAQE,QAAQI,QAC7B,GAAID,EAAM,CACRN,EAASG,QAAQK,KAAKF,GACtBb,EAAUD,GACRiB,EAAA,CAAA,EACKjB,EACHG,CAAAA,WAAYH,EAAMG,WAAa,EAC/BC,YAAaJ,EAAMI,YAAc,KAGrCP,GAAYA,EAAQoB,EAAA,CAAA,EAAMH,EAAI,CAAEd,WAChC,MAAMkB,EAASJ,EAAKA,OACpBI,EACGC,KAAK,KACJX,EAASG,QAAQS,MACjBnB,EAAUD,GACRiB,EACKjB,CAAAA,EAAAA,EACHI,CAAAA,YAAaJ,EAAMI,YAAc,EACjCC,QAASL,EAAMK,QAAU,KAG7BV,GAAQA,EAAIsB,EAAA,CAAA,EAAMH,EAAMI,CAAAA,SAAQlB,aAEjCqB,MAAM,KACLb,EAASG,QAAQS,MACjBnB,EAAUD,GACRiB,EAAA,CAAA,EACKjB,EACHI,CAAAA,YAAaJ,EAAMI,YAAc,EACjCC,QAASL,EAAMK,QAAU,KAG7BV,GAAQA,EAAIsB,EAAA,CAAA,EAAMH,EAAI,CAAEI,SAAQlB,UAClC,EACJ,CACF,GACC,CAACF,EAAaH,EAAMC,EAAOC,EAAUG,IAExC,MAAMsB,EAAMC,EAAaT,IAEpBL,EAAQE,QAAQa,KAAMC,GACdA,EAAEC,KAAOZ,EAAKY,KAEtBlB,EAASG,QAAQa,KAAMC,GACfA,EAAEC,KAAOZ,EAAKY,MAGvBjB,EAAQE,QAAQK,KAAKF,GACrBb,EAAUD,GACRiB,EACKjB,CAAAA,EAAAA,EACHG,CAAAA,WAAYH,EAAMG,WAAa,KAGrC,EACC,IAEH,MAAO,CAAEmB,MAAKtB,QAChB"}