{"version":3,"sources":["../src/library/Queue.ts"],"sourcesContent":["import { FetcherResponse } from \"../helpers/fetcher\";\n\ntype QueueItem<T> = {\n\tpromise: () => Promise<unknown>;\n\tresolve: (value: T) => void;\n\treject: (reason?: any) => void;\n};\n\nexport class Queue {\n\tprivate queue: QueueItem<any>[] = [];\n\tprivate promisePending = false;\n\tprivate stopped = false;\n\tprivate flushResolvers: Array<() => void> = [];\n\n\tadd<T>(\n\t\tpromise: () => Promise<FetcherResponse<T>>\n\t): Promise<FetcherResponse<T>> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.queue.push({\n\t\t\t\tpromise,\n\t\t\t\tresolve,\n\t\t\t\treject,\n\t\t\t});\n\t\t\tthis.handle();\n\t\t});\n\t}\n\n\tstop() {\n\t\tthis.stopped = true;\n\t}\n\n\trestart() {\n\t\tthis.stopped = false;\n\t\tthis.handle();\n\t}\n\n\t/**\n\t * Returns a promise that resolves when all queued items have been processed.\n\t * Useful for ensuring all pending requests complete before session invalidation.\n\t *\n\t * @param {number} [timeoutMs] - Optional timeout in milliseconds. If not provided, waits indefinitely.\n\t * @returns {Promise<void>} Resolves when queue is empty or timeout is reached.\n\t */\n\tflush(timeoutMs?: number): Promise<void> {\n\t\t// If queue is empty and no promise pending, resolve immediately\n\t\tif (this.queue.length === 0 && !this.promisePending) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\treturn new Promise((resolve) => {\n\t\t\t// Add resolver to be called when queue empties\n\t\t\tthis.flushResolvers.push(resolve);\n\n\t\t\t// Optional timeout\n\t\t\tif (timeoutMs !== undefined) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\tconst index = this.flushResolvers.indexOf(resolve);\n\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\tthis.flushResolvers.splice(index, 1);\n\t\t\t\t\t\tresolve();\n\t\t\t\t\t}\n\t\t\t\t}, timeoutMs);\n\t\t\t}\n\t\t});\n\t}\n\n\t/**\n\t * Returns the number of items currently in the queue.\n\t */\n\tget length(): number {\n\t\treturn this.queue.length;\n\t}\n\n\t/**\n\t * Returns true if a promise is currently being processed.\n\t */\n\tget isPending(): boolean {\n\t\treturn this.promisePending;\n\t}\n\n\tprivate handle(): void {\n\t\tif (this.promisePending || this.stopped) {\n\t\t\treturn;\n\t\t}\n\t\tconst item = this.queue.shift();\n\t\tif (!item) {\n\t\t\treturn;\n\t\t}\n\t\ttry {\n\t\t\tthis.promisePending = true;\n\t\t\titem.promise()\n\t\t\t\t.then((value) => this.resolve(() => item.resolve(value)))\n\t\t\t\t.catch((err) => this.resolve(() => item.reject(err)));\n\t\t} catch (err) {\n\t\t\tthis.resolve(() => item.reject(err));\n\t\t}\n\t}\n\n\tprivate resolve(callback: () => void): void {\n\t\tthis.promisePending = false;\n\t\tcallback();\n\n\t\t// If queue is now empty, resolve all flush waiters\n\t\tif (this.queue.length === 0) {\n\t\t\tthis.flushResolvers.forEach((resolver) => resolver());\n\t\t\tthis.flushResolvers = [];\n\t\t}\n\n\t\tthis.handle();\n\t}\n}\n"],"mappings":";AAQO,IAAM,QAAN,MAAY;AAAA,EACV,QAA0B,CAAC;AAAA,EAC3B,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,iBAAoC,CAAC;AAAA,EAE7C,IACC,SAC8B;AAC9B,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACvC,WAAK,MAAM,KAAK;AAAA,QACf;AAAA,QACA;AAAA,QACA;AAAA,MACD,CAAC;AACD,WAAK,OAAO;AAAA,IACb,CAAC;AAAA,EACF;AAAA,EAEA,OAAO;AACN,SAAK,UAAU;AAAA,EAChB;AAAA,EAEA,UAAU;AACT,SAAK,UAAU;AACf,SAAK,OAAO;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,MAAM,WAAmC;AAExC,QAAI,KAAK,MAAM,WAAW,KAAK,CAAC,KAAK,gBAAgB;AACpD,aAAO,QAAQ,QAAQ;AAAA,IACxB;AAEA,WAAO,IAAI,QAAQ,CAAC,YAAY;AAE/B,WAAK,eAAe,KAAK,OAAO;AAGhC,UAAI,cAAc,QAAW;AAC5B,mBAAW,MAAM;AAChB,gBAAM,QAAQ,KAAK,eAAe,QAAQ,OAAO;AACjD,cAAI,QAAQ,IAAI;AACf,iBAAK,eAAe,OAAO,OAAO,CAAC;AACnC,oBAAQ;AAAA,UACT;AAAA,QACD,GAAG,SAAS;AAAA,MACb;AAAA,IACD,CAAC;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAiB;AACpB,WAAO,KAAK,MAAM;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAqB;AACxB,WAAO,KAAK;AAAA,EACb;AAAA,EAEQ,SAAe;AACtB,QAAI,KAAK,kBAAkB,KAAK,SAAS;AACxC;AAAA,IACD;AACA,UAAM,OAAO,KAAK,MAAM,MAAM;AAC9B,QAAI,CAAC,MAAM;AACV;AAAA,IACD;AACA,QAAI;AACH,WAAK,iBAAiB;AACtB,WAAK,QAAQ,EACX,KAAK,CAAC,UAAU,KAAK,QAAQ,MAAM,KAAK,QAAQ,KAAK,CAAC,CAAC,EACvD,MAAM,CAAC,QAAQ,KAAK,QAAQ,MAAM,KAAK,OAAO,GAAG,CAAC,CAAC;AAAA,IACtD,SAAS,KAAK;AACb,WAAK,QAAQ,MAAM,KAAK,OAAO,GAAG,CAAC;AAAA,IACpC;AAAA,EACD;AAAA,EAEQ,QAAQ,UAA4B;AAC3C,SAAK,iBAAiB;AACtB,aAAS;AAGT,QAAI,KAAK,MAAM,WAAW,GAAG;AAC5B,WAAK,eAAe,QAAQ,CAAC,aAAa,SAAS,CAAC;AACpD,WAAK,iBAAiB,CAAC;AAAA,IACxB;AAEA,SAAK,OAAO;AAAA,EACb;AACD;","names":[]}