@bquery/bquery 1.11.0 → 1.12.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.
Files changed (110) hide show
  1. package/README.md +79 -59
  2. package/dist/{a11y-DgUQ8-fI.js → a11y-IV_bfLyn.js} +3 -3
  3. package/dist/{a11y-DgUQ8-fI.js.map → a11y-IV_bfLyn.js.map} +1 -1
  4. package/dist/a11y.es.mjs +1 -1
  5. package/dist/{component-D8ydhe58.js → component-BtsRbf6c.js} +7 -7
  6. package/dist/{component-D8ydhe58.js.map → component-BtsRbf6c.js.map} +1 -1
  7. package/dist/component.es.mjs +1 -1
  8. package/dist/{concurrency-BU1wPEsZ.js → concurrency-kycgAZvW.js} +3 -3
  9. package/dist/{concurrency-BU1wPEsZ.js.map → concurrency-kycgAZvW.js.map} +1 -1
  10. package/dist/concurrency.es.mjs +1 -1
  11. package/dist/{config-DhT9auRm.js → config-BP7KwiR5.js} +1 -1
  12. package/dist/{config-DhT9auRm.js.map → config-BP7KwiR5.js.map} +1 -1
  13. package/dist/constraints-Dlbx_m1b.js.map +1 -1
  14. package/dist/core-tOP6QOrY.js.map +1 -1
  15. package/dist/{core-CongXJuo.js → core-yg9rJXiR.js} +1 -1
  16. package/dist/{core-CongXJuo.js.map → core-yg9rJXiR.js.map} +1 -1
  17. package/dist/custom-directives-5DlKqvd2.js.map +1 -1
  18. package/dist/devtools-QosAqo0T.js.map +1 -1
  19. package/dist/dnd-d2OU4len.js.map +1 -1
  20. package/dist/{effect-Cc51IH91.js → effect-v8OIEmPs.js} +2 -2
  21. package/dist/{effect-Cc51IH91.js.map → effect-v8OIEmPs.js.map} +1 -1
  22. package/dist/env-PvwYHnJq.js.map +1 -1
  23. package/dist/{forms-BLx4ZzT7.js → forms-DYcdlk_h.js} +8 -8
  24. package/dist/{forms-BLx4ZzT7.js.map → forms-DYcdlk_h.js.map} +1 -1
  25. package/dist/forms.es.mjs +1 -1
  26. package/dist/full.d.ts +11 -11
  27. package/dist/full.d.ts.map +1 -1
  28. package/dist/full.es.mjs +324 -279
  29. package/dist/full.iife.js +26 -26
  30. package/dist/full.iife.js.map +1 -1
  31. package/dist/full.umd.js +26 -26
  32. package/dist/full.umd.js.map +1 -1
  33. package/dist/function-Cybd57JV.js.map +1 -1
  34. package/dist/{i18n--p7PM-9r.js → i18n-unHU1jMo.js} +3 -3
  35. package/dist/{i18n--p7PM-9r.js.map → i18n-unHU1jMo.js.map} +1 -1
  36. package/dist/i18n.es.mjs +1 -1
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.es.mjs +198 -196
  39. package/dist/match-CrZRVC4z.js.map +1 -1
  40. package/dist/{media-gjbWNq50.js → media-Chh6mA0v.js} +3 -3
  41. package/dist/{media-gjbWNq50.js.map → media-Chh6mA0v.js.map} +1 -1
  42. package/dist/media.es.mjs +1 -1
  43. package/dist/{motion-BBMso9Ir.js → motion-27Od9aFE.js} +2 -2
  44. package/dist/{motion-BBMso9Ir.js.map → motion-27Od9aFE.js.map} +1 -1
  45. package/dist/motion.es.mjs +1 -1
  46. package/dist/{mount-0A9qtcRJ.js → mount-DwUFujZ_.js} +4 -4
  47. package/dist/{mount-0A9qtcRJ.js.map → mount-DwUFujZ_.js.map} +1 -1
  48. package/dist/object-BCk-1c8T.js.map +1 -1
  49. package/dist/{platform-BPHIXbw8.js → platform-2YkFA11t.js} +4 -4
  50. package/dist/{platform-BPHIXbw8.js.map → platform-2YkFA11t.js.map} +1 -1
  51. package/dist/platform.es.mjs +2 -2
  52. package/dist/plugin-SZEirbwq.js.map +1 -1
  53. package/dist/reactive/index.d.ts +2 -2
  54. package/dist/reactive/index.d.ts.map +1 -1
  55. package/dist/reactive/signal.d.ts +7 -7
  56. package/dist/reactive/signal.d.ts.map +1 -1
  57. package/dist/reactive/websocket.d.ts +15 -3
  58. package/dist/reactive/websocket.d.ts.map +1 -1
  59. package/dist/{reactive-BAd2hfl8.js → reactive-BvPR_FYA.js} +10 -10
  60. package/dist/{reactive-BAd2hfl8.js.map → reactive-BvPR_FYA.js.map} +1 -1
  61. package/dist/reactive.es.mjs +40 -40
  62. package/dist/{readonly-C0ZwS1Tf.js → readonly-Br-6pAgj.js} +2 -2
  63. package/dist/{readonly-C0ZwS1Tf.js.map → readonly-Br-6pAgj.js.map} +1 -1
  64. package/dist/registry-jpUQHf4E.js.map +1 -1
  65. package/dist/{router-C4weu0QL.js → router-CbnWKprL.js} +7 -7
  66. package/dist/{router-C4weu0QL.js.map → router-CbnWKprL.js.map} +1 -1
  67. package/dist/router.es.mjs +1 -1
  68. package/dist/sanitize-DOMkRO9G.js.map +1 -1
  69. package/dist/server/create-server.d.ts.map +1 -1
  70. package/dist/server/types.d.ts.map +1 -1
  71. package/dist/{server-QdyKtCS1.js → server-Dwiq_F49.js} +2 -2
  72. package/dist/server-Dwiq_F49.js.map +1 -0
  73. package/dist/server.es.mjs +1 -1
  74. package/dist/ssr/context.d.ts.map +1 -1
  75. package/dist/ssr/renderer.d.ts.map +1 -1
  76. package/dist/ssr/suspense.d.ts.map +1 -1
  77. package/dist/{ssr-Bt6BQA3J.js → ssr-CqJU1Ogp.js} +8 -8
  78. package/dist/ssr-CqJU1Ogp.js.map +1 -0
  79. package/dist/ssr.es.mjs +1 -1
  80. package/dist/store/index.d.ts +1 -1
  81. package/dist/store/index.d.ts.map +1 -1
  82. package/dist/store/plugins.d.ts +38 -0
  83. package/dist/store/plugins.d.ts.map +1 -1
  84. package/dist/{store-DnXuu6Li.js → store-DzrhVQ29.js} +69 -62
  85. package/dist/store-DzrhVQ29.js.map +1 -0
  86. package/dist/store.es.mjs +13 -11
  87. package/dist/storybook.es.mjs.map +1 -1
  88. package/dist/{testing-CeMUwrRD.js → testing-ByjwS2_D.js} +3 -3
  89. package/dist/{testing-CeMUwrRD.js.map → testing-ByjwS2_D.js.map} +1 -1
  90. package/dist/testing.es.mjs +1 -1
  91. package/dist/type-guards-BMX2c0LP.js.map +1 -1
  92. package/dist/{untrack-bjWDNdyE.js → untrack-uzz3JDNK.js} +3 -3
  93. package/dist/{untrack-bjWDNdyE.js.map → untrack-uzz3JDNK.js.map} +1 -1
  94. package/dist/view.es.mjs +8 -8
  95. package/package.json +12 -11
  96. package/src/full.ts +75 -6
  97. package/src/index.ts +2 -2
  98. package/src/reactive/index.ts +5 -4
  99. package/src/reactive/signal.ts +7 -6
  100. package/src/reactive/websocket.ts +15 -2
  101. package/src/server/create-server.ts +10 -5
  102. package/src/server/types.ts +1 -5
  103. package/src/ssr/context.ts +6 -2
  104. package/src/ssr/renderer.ts +5 -2
  105. package/src/ssr/suspense.ts +17 -8
  106. package/src/store/index.ts +1 -1
  107. package/src/store/plugins.ts +48 -1
  108. package/dist/server-QdyKtCS1.js.map +0 -1
  109. package/dist/ssr-Bt6BQA3J.js.map +0 -1
  110. package/dist/store-DnXuu6Li.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"concurrency-BU1wPEsZ.js","names":[],"sources":["../src/concurrency/errors.ts","../src/concurrency/internal.ts","../src/concurrency/support.ts","../src/concurrency/rpc.ts","../src/concurrency/task.ts","../src/concurrency/pool.ts","../src/concurrency/high-level.ts","../src/concurrency/pipeline.ts","../src/concurrency/reactive.ts"],"sourcesContent":["/**\n * Error types for the concurrency module.\n *\n * @module bquery/concurrency\n */\n\nimport type { TaskWorkerErrorCode } from './types';\n\n/** Base error for concurrency task failures. */\nexport class TaskWorkerError extends Error {\n /** Stable error code for programmatic handling. */\n code: TaskWorkerErrorCode;\n\n constructor(message: string, code: TaskWorkerErrorCode, cause?: unknown) {\n super(message);\n this.name = 'TaskWorkerError';\n this.code = code;\n if (cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = cause;\n }\n }\n}\n\n/** Thrown when the environment cannot create inline Web Workers. */\nexport class TaskWorkerUnsupportedError extends TaskWorkerError {\n constructor(\n message = 'Concurrency tasks are not supported in this environment.',\n cause?: unknown\n ) {\n super(message, 'UNSUPPORTED', cause);\n this.name = 'TaskWorkerUnsupportedError';\n }\n}\n\n/** Thrown when the task handler or payload cannot be serialized safely. */\nexport class TaskWorkerSerializationError extends TaskWorkerError {\n constructor(message: string, cause?: unknown) {\n super(message, 'SERIALIZATION', cause);\n this.name = 'TaskWorkerSerializationError';\n }\n}\n\n/** Thrown when a task exceeds its configured timeout. */\nexport class TaskWorkerTimeoutError extends TaskWorkerError {\n constructor(message: string, cause?: unknown) {\n super(message, 'TIMEOUT', cause);\n this.name = 'TaskWorkerTimeoutError';\n }\n}\n\n/** Thrown when a task is aborted via `AbortSignal`. */\nexport class TaskWorkerAbortError extends TaskWorkerError {\n constructor(message = 'The worker task was aborted.', cause?: unknown) {\n super(message, 'ABORT', cause);\n this.name = 'TaskWorkerAbortError';\n }\n}\n","/**\n * Internal helpers shared across concurrency implementations.\n *\n * @internal\n */\n\nimport { TaskWorkerError, TaskWorkerSerializationError, TaskWorkerTimeoutError } from './errors';\nimport type { TaskWorkerErrorCode, WorkerTaskHandler } from './types';\n\n/** @internal */\nexport interface SerializedWorkerError {\n /** Untrusted serialized worker payload; validate against TaskWorkerErrorCode before use. */\n code?: string;\n message?: string;\n name?: string;\n stack?: string;\n}\n\nconst TASK_WORKER_ERROR_CODES = new Set<TaskWorkerErrorCode>([\n 'ABORT',\n 'BUSY',\n 'METHOD_NOT_FOUND',\n 'QUEUE_CLEARED',\n 'QUEUE_FULL',\n 'SERIALIZATION',\n 'TERMINATED',\n 'TIMEOUT',\n 'UNSUPPORTED',\n 'WORKER',\n]);\n\nconst NATIVE_FUNCTION_SOURCE_RE = /\\{\\s*\\[native code\\]\\s*\\}$/u;\n\n/** @internal */\nexport const isTaskWorkerErrorCode = (code: string | undefined): code is TaskWorkerErrorCode => {\n return typeof code === 'string' && TASK_WORKER_ERROR_CODES.has(code as TaskWorkerErrorCode);\n};\n\n/** @internal */\nexport const normalizeTimeout = (timeout?: number): number | undefined => {\n if (typeof timeout !== 'number' || !Number.isFinite(timeout) || timeout <= 0) {\n return undefined;\n }\n\n return timeout;\n};\n\n/** @internal */\nexport const validateTaskHandler = <TInput, TResult>(\n handler: WorkerTaskHandler<TInput, TResult>\n): string => {\n const source = Function.prototype.toString.call(handler).trim();\n\n if (!source || NATIVE_FUNCTION_SOURCE_RE.test(source)) {\n throw new TaskWorkerSerializationError(\n 'Task handlers must be standalone user-defined functions or arrow functions.'\n );\n }\n\n try {\n const revived = new Function(`return (${source});`)() as unknown;\n if (typeof revived !== 'function') {\n throw new TypeError('Task handler did not revive as a function.');\n }\n } catch (error) {\n throw new TaskWorkerSerializationError(\n 'Task handlers must be standalone functions that can be reconstructed in a worker context.',\n error\n );\n }\n\n return source;\n};\n\n/** @internal */\nexport const createWorkerInstance = (scriptSource: string, name?: string): Worker => {\n const blob = new Blob([scriptSource], { type: 'text/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n\n try {\n return new Worker(scriptUrl, name ? { name } : undefined);\n } finally {\n URL.revokeObjectURL(scriptUrl);\n }\n};\n\n/** @internal */\nexport const restoreWorkerError = (payload: SerializedWorkerError | undefined): TaskWorkerError => {\n const message = payload?.message || 'Worker task failed.';\n const code = isTaskWorkerErrorCode(payload?.code) ? payload.code : 'WORKER';\n const error =\n code === 'TIMEOUT' ? new TaskWorkerTimeoutError(message) : new TaskWorkerError(message, code);\n\n error.name = payload?.name || error.name;\n if (payload?.stack) {\n error.stack = payload.stack;\n }\n\n return error;\n};\n","/**\n * Runtime support checks for the concurrency module.\n *\n * @module bquery/concurrency\n */\n\nimport type { ConcurrencySupport } from './types';\n\n/**\n * Returns a feature snapshot for zero-build inline worker execution.\n *\n * @example\n * ```ts\n * if (!isConcurrencySupported()) {\n * console.warn('Worker tasks are unavailable in this environment.');\n * }\n * ```\n */\nexport function getConcurrencySupport(): ConcurrencySupport {\n const worker = typeof globalThis.Worker === 'function';\n const blob = typeof globalThis.Blob === 'function';\n const hasUrl = typeof globalThis.URL !== 'undefined' && globalThis.URL !== null;\n const objectUrl =\n hasUrl &&\n typeof globalThis.URL.createObjectURL === 'function' &&\n typeof globalThis.URL.revokeObjectURL === 'function';\n const abortController = typeof globalThis.AbortController === 'function';\n\n return {\n worker,\n blob,\n objectUrl,\n abortController,\n supported: worker && blob && objectUrl,\n };\n}\n\n/**\n * Returns `true` when bQuery can create inline worker tasks in the current\n * environment.\n */\nexport function isConcurrencySupported(): boolean {\n return getConcurrencySupport().supported;\n}\n","/**\n * RPC-style worker communication helpers.\n *\n * @module bquery/concurrency\n */\n\nimport {\n TaskWorkerAbortError,\n TaskWorkerError,\n TaskWorkerSerializationError,\n TaskWorkerTimeoutError,\n TaskWorkerUnsupportedError,\n} from './errors';\nimport {\n createWorkerInstance,\n normalizeTimeout,\n restoreWorkerError,\n validateTaskHandler,\n type SerializedWorkerError,\n} from './internal';\nimport { isConcurrencySupported } from './support';\nimport type {\n CallWorkerMethodOptions,\n CreateRpcWorkerOptions,\n RpcWorker,\n TaskRunOptions,\n TaskWorkerState,\n WorkerRpcHandlers,\n} from './types';\n\ninterface WorkerSuccessMessage<TResult> {\n id: number;\n result: TResult;\n type: 'bq:result';\n}\n\ninterface WorkerErrorMessage {\n error: SerializedWorkerError;\n id: number;\n type: 'bq:error';\n}\n\ntype WorkerResponse<TResult> = WorkerSuccessMessage<TResult> | WorkerErrorMessage;\n\ninterface PendingRun<TResult> {\n abortHandler?: () => void;\n id: number;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\nconst WORKER_RPC_MESSAGE = 'bq:rpc';\n\nconst validateRpcHandlers = <TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes\n): Array<[keyof TRoutes & string, string]> => {\n const methodNames = Object.keys(handlers) as Array<keyof TRoutes & string>;\n\n if (methodNames.length === 0) {\n throw new TaskWorkerSerializationError(\n 'RPC workers require at least one standalone method handler.'\n );\n }\n\n return methodNames.map((method) => {\n const handler = handlers[method];\n if (typeof handler !== 'function') {\n throw new TaskWorkerSerializationError(\n `RPC handler \"${method}\" must be a standalone function.`\n );\n }\n\n return [method, validateTaskHandler(handler)];\n });\n};\n\nconst createRpcWorkerScript = (handlerSources: Array<[string, string]>): string => {\n const assignments = handlerSources\n .map(([method, source]) => `handlers[${JSON.stringify(method)}] = (${source});`)\n .join('\\n');\n\n return `'use strict';\nconst serializeError = (error) => {\n if (error && typeof error === 'object') {\n return {\n code: typeof error.code === 'string' ? error.code : undefined,\n message: typeof error.message === 'string' ? error.message : 'Worker RPC call failed.',\n name: typeof error.name === 'string' ? error.name : 'Error',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n return {\n message: typeof error === 'string' ? error : 'Worker RPC call failed.',\n name: 'Error',\n };\n};\n\nconst handlers = Object.create(null);\n${assignments}\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nself.onmessage = async (event) => {\n const message = event.data;\n if (!message || message.type !== '${WORKER_RPC_MESSAGE}') {\n return;\n }\n\n const method = typeof message.method === 'string' ? message.method : '';\n if (!hasOwn.call(handlers, method)) {\n self.postMessage({\n error: {\n code: 'METHOD_NOT_FOUND',\n message: 'Unknown RPC method \"' + String(method) + '\".',\n name: 'TaskWorkerError',\n },\n id: message.id,\n type: 'bq:error',\n });\n return;\n }\n\n try {\n const result = await handlers[method](message.payload);\n self.postMessage({ id: message.id, result, type: 'bq:result' });\n } catch (error) {\n self.postMessage({ error: serializeError(error), id: message.id, type: 'bq:error' });\n }\n};`;\n};\n\n/**\n * Creates a reusable RPC-style worker with explicit named method dispatch.\n *\n * The worker processes one request at a time to keep lifecycle, timeout, abort,\n * and cleanup semantics aligned with the minimal Milestone 1 task API.\n *\n * @example\n * ```ts\n * import { createRpcWorker } from '@bquery/bquery/concurrency';\n *\n * const rpc = createRpcWorker({\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * double: (value: number) => value * 2,\n * });\n *\n * const total = await rpc.call('sum', { values: [1, 2, 3] });\n * rpc.terminate();\n * ```\n */\nexport function createRpcWorker<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcWorkerOptions = {}\n): RpcWorker<TRoutes> {\n if (!isConcurrencySupported()) {\n throw new TaskWorkerUnsupportedError();\n }\n\n const handlerSources = validateRpcHandlers(handlers);\n const scriptSource = createRpcWorkerScript(handlerSources);\n const defaultTimeout = normalizeTimeout(options.timeout);\n let disposed = false;\n let worker: Worker | null = null;\n let pending: PendingRun<unknown> | null = null;\n let nextRunId = 0;\n let pendingAbortSignal: AbortSignal | undefined;\n\n const cleanupPending = (): void => {\n if (!pending) {\n return;\n }\n\n if (pending.timeoutId !== undefined) {\n clearTimeout(pending.timeoutId);\n }\n\n if (pending.abortHandler) {\n pendingAbortSignal?.removeEventListener('abort', pending.abortHandler);\n }\n\n pending = null;\n pendingAbortSignal = undefined;\n };\n\n const detachWorker = (): void => {\n if (!worker) {\n return;\n }\n\n worker.onmessage = null;\n worker.onerror = null;\n worker.terminate();\n worker = null;\n };\n\n const rejectPending = (error: Error): void => {\n if (!pending) {\n return;\n }\n\n const current = pending;\n cleanupPending();\n current.reject(error);\n };\n\n const ensureWorker = (): Worker => {\n if (disposed) {\n throw new TaskWorkerError('The RPC worker has already been terminated.', 'TERMINATED');\n }\n\n if (worker) {\n return worker;\n }\n\n const instance = createWorkerInstance(scriptSource, options.name);\n instance.onmessage = (event: MessageEvent<WorkerResponse<unknown>>) => {\n const current = pending;\n if (!current) {\n return;\n }\n\n const message = event.data;\n if (!message || message.id !== current.id) {\n return;\n }\n\n cleanupPending();\n\n if (message.type === 'bq:error') {\n current.reject(restoreWorkerError(message.error));\n return;\n }\n\n current.resolve(message.result);\n };\n\n instance.onerror = (event: ErrorEvent) => {\n const error = new TaskWorkerError(event.message || 'Worker RPC execution failed.', 'WORKER');\n detachWorker();\n rejectPending(error);\n };\n\n worker = instance;\n return instance;\n };\n\n const resetAfterInterruptedRun = (error: Error): void => {\n detachWorker();\n rejectPending(error);\n };\n\n return {\n get busy(): boolean {\n return pending !== null;\n },\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return pending ? 'running' : 'idle';\n },\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n if (disposed) {\n return Promise.reject(\n new TaskWorkerError('The RPC worker has already been terminated.', 'TERMINATED')\n );\n }\n\n if (pending) {\n return Promise.reject(\n new TaskWorkerError(\n 'This RPC worker is already processing a request. Wait for the current call to finish or create another worker.',\n 'BUSY'\n )\n );\n }\n\n if (runOptions.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n const activeWorker = ensureWorker();\n const timeout = normalizeTimeout(runOptions.timeout) ?? defaultTimeout;\n const runId = nextRunId++;\n\n return new Promise<Awaited<ReturnType<TRoutes[TMethod]>>>((resolve, reject) => {\n const current: PendingRun<Awaited<ReturnType<TRoutes[TMethod]>>> = {\n id: runId,\n reject,\n resolve,\n };\n\n if (runOptions.signal) {\n current.abortHandler = () => {\n resetAfterInterruptedRun(new TaskWorkerAbortError());\n };\n pendingAbortSignal = runOptions.signal;\n runOptions.signal.addEventListener('abort', current.abortHandler, { once: true });\n }\n\n if (timeout !== undefined) {\n current.timeoutId = setTimeout(() => {\n resetAfterInterruptedRun(\n new TaskWorkerTimeoutError(`Worker RPC call exceeded the timeout of ${timeout}ms.`)\n );\n }, timeout);\n }\n\n pending = current as PendingRun<unknown>;\n\n try {\n activeWorker.postMessage(\n { id: runId, method, payload: input, type: WORKER_RPC_MESSAGE },\n runOptions.transfer ?? []\n );\n } catch (error) {\n detachWorker();\n rejectPending(\n new TaskWorkerSerializationError(\n 'Failed to serialize the RPC payload or transfer list for worker execution.',\n error\n )\n );\n }\n });\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n detachWorker();\n rejectPending(new TaskWorkerError('The RPC worker was terminated.', 'TERMINATED'));\n },\n };\n}\n\n/**\n * Executes a single named RPC method in a fresh worker and tears it down after\n * the response is received.\n *\n * @example\n * ```ts\n * import { callWorkerMethod } from '@bquery/bquery/concurrency';\n *\n * const total = await callWorkerMethod(\n * {\n * sum: ({ values }: { values: number[] }) =>\n * values.reduce((result, value) => result + value, 0),\n * },\n * 'sum',\n * { values: [1, 2, 3] }\n * );\n * ```\n */\nexport async function callWorkerMethod<\n TRoutes extends WorkerRpcHandlers,\n TMethod extends keyof TRoutes & string,\n>(\n handlers: TRoutes,\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n options: CallWorkerMethodOptions = {}\n): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n const worker = createRpcWorker(handlers, options);\n\n try {\n return await worker.call(method, input, options);\n } finally {\n worker.terminate();\n }\n}\n","/**\n * Zero-build worker task helpers.\n *\n * @module bquery/concurrency\n */\n\nimport {\n TaskWorkerAbortError,\n TaskWorkerError,\n TaskWorkerSerializationError,\n TaskWorkerTimeoutError,\n TaskWorkerUnsupportedError,\n} from './errors';\nimport {\n createWorkerInstance,\n normalizeTimeout,\n restoreWorkerError,\n validateTaskHandler,\n type SerializedWorkerError,\n} from './internal';\nimport { isConcurrencySupported } from './support';\nimport type {\n CreateTaskWorkerOptions,\n RunTaskOptions,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerTaskHandler,\n} from './types';\n\ninterface WorkerSuccessMessage<TResult> {\n id: number;\n result: TResult;\n type: 'bq:result';\n}\n\ninterface WorkerErrorMessage {\n error: SerializedWorkerError;\n id: number;\n type: 'bq:error';\n}\n\ntype WorkerResponse<TResult> = WorkerSuccessMessage<TResult> | WorkerErrorMessage;\n\ninterface PendingRun<TResult> {\n abortHandler?: () => void;\n id: number;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\nconst WORKER_RUN_MESSAGE = 'bq:run';\n\nconst createWorkerScript = (handlerSource: string): string => {\n return `'use strict';\nconst serializeError = (error) => {\n if (error && typeof error === 'object') {\n return {\n code: typeof error.code === 'string' ? error.code : undefined,\n message: typeof error.message === 'string' ? error.message : 'Worker task failed.',\n name: typeof error.name === 'string' ? error.name : 'Error',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n return {\n message: typeof error === 'string' ? error : 'Worker task failed.',\n name: 'Error',\n };\n};\n\nconst handler = (${handlerSource});\n\nif (typeof handler !== 'function') {\n throw new TypeError('The worker task handler must evaluate to a function.');\n}\n\nself.onmessage = async (event) => {\n const message = event.data;\n if (!message || message.type !== '${WORKER_RUN_MESSAGE}') {\n return;\n }\n\n try {\n const result = await handler(message.payload);\n self.postMessage({ id: message.id, result, type: 'bq:result' });\n } catch (error) {\n self.postMessage({ error: serializeError(error), id: message.id, type: 'bq:error' });\n }\n};`;\n};\n\n/**\n * Creates a reusable worker task handle around a standalone function.\n *\n * @example\n * ```ts\n * import { createTaskWorker } from '@bquery/bquery/concurrency';\n *\n * const worker = createTaskWorker((value: number) => value * value, { name: 'square-worker' });\n * const result = await worker.run(12);\n * worker.terminate();\n * ```\n */\nexport function createTaskWorker<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskWorkerOptions = {}\n): TaskWorker<TInput, TResult> {\n if (!isConcurrencySupported()) {\n throw new TaskWorkerUnsupportedError();\n }\n\n const handlerSource = validateTaskHandler(handler);\n const scriptSource = createWorkerScript(handlerSource);\n const defaultTimeout = normalizeTimeout(options.timeout);\n let disposed = false;\n let worker: Worker | null = null;\n let pending: PendingRun<TResult> | null = null;\n let nextRunId = 0;\n\n const cleanupPending = (): void => {\n if (!pending) {\n return;\n }\n\n if (pending.timeoutId !== undefined) {\n clearTimeout(pending.timeoutId);\n }\n\n if (pending.abortHandler) {\n pendingAbortSignal?.removeEventListener('abort', pending.abortHandler);\n }\n\n pending = null;\n pendingAbortSignal = undefined;\n };\n\n let pendingAbortSignal: AbortSignal | undefined;\n\n const detachWorker = (): void => {\n if (!worker) {\n return;\n }\n\n worker.onmessage = null;\n worker.onerror = null;\n worker.terminate();\n worker = null;\n };\n\n const rejectPending = (error: Error): void => {\n if (!pending) {\n return;\n }\n\n const current = pending;\n cleanupPending();\n current.reject(error);\n };\n\n const ensureWorker = (): Worker => {\n if (disposed) {\n throw new TaskWorkerError('The task worker has already been terminated.', 'TERMINATED');\n }\n\n if (worker) {\n return worker;\n }\n\n const instance = createWorkerInstance(scriptSource, options.name);\n instance.onmessage = (event: MessageEvent<WorkerResponse<TResult>>) => {\n const current = pending;\n if (!current) {\n return;\n }\n\n const message = event.data;\n if (!message || message.id !== current.id) {\n return;\n }\n\n cleanupPending();\n\n if (message.type === 'bq:error') {\n current.reject(restoreWorkerError(message.error));\n return;\n }\n\n current.resolve(message.result);\n };\n\n instance.onerror = (event: ErrorEvent) => {\n const error = new TaskWorkerError(event.message || 'Worker execution failed.', 'WORKER');\n detachWorker();\n rejectPending(error);\n };\n\n worker = instance;\n return instance;\n };\n\n const resetAfterInterruptedRun = (error: Error): void => {\n detachWorker();\n rejectPending(error);\n };\n\n return {\n get busy(): boolean {\n return pending !== null;\n },\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return pending ? 'running' : 'idle';\n },\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n if (disposed) {\n return Promise.reject(\n new TaskWorkerError('The task worker has already been terminated.', 'TERMINATED')\n );\n }\n\n if (pending) {\n return Promise.reject(\n new TaskWorkerError(\n 'This task worker is already running a task. Create another worker or wait for the current task to finish.',\n 'BUSY'\n )\n );\n }\n\n if (runOptions.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n const activeWorker = ensureWorker();\n const timeout = normalizeTimeout(runOptions.timeout) ?? defaultTimeout;\n const runId = nextRunId++;\n\n return new Promise<TResult>((resolve, reject) => {\n const current: PendingRun<TResult> = {\n id: runId,\n reject,\n resolve,\n };\n\n if (runOptions.signal) {\n current.abortHandler = () => {\n resetAfterInterruptedRun(new TaskWorkerAbortError());\n };\n pendingAbortSignal = runOptions.signal;\n runOptions.signal.addEventListener('abort', current.abortHandler, { once: true });\n }\n\n if (timeout !== undefined) {\n current.timeoutId = setTimeout(() => {\n resetAfterInterruptedRun(\n new TaskWorkerTimeoutError(`Worker task exceeded the timeout of ${timeout}ms.`)\n );\n }, timeout);\n }\n\n pending = current;\n\n try {\n activeWorker.postMessage(\n { id: runId, payload: input, type: WORKER_RUN_MESSAGE },\n runOptions.transfer ?? []\n );\n } catch (error) {\n detachWorker();\n rejectPending(\n new TaskWorkerSerializationError(\n 'Failed to serialize the task input or transfer list for worker execution.',\n error\n )\n );\n }\n });\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n detachWorker();\n rejectPending(new TaskWorkerError('The task worker was terminated.', 'TERMINATED'));\n },\n };\n}\n\n/**\n * Executes a single task in a fresh worker and tears it down afterwards.\n *\n * @example\n * ```ts\n * import { runTask } from '@bquery/bquery/concurrency';\n *\n * const result = await runTask((value: number) => value * 2, 21);\n * ```\n */\nexport async function runTask<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n input: TInput,\n options: RunTaskOptions = {}\n): Promise<TResult> {\n const worker = createTaskWorker(handler, options);\n\n try {\n return await worker.run(input, options);\n } finally {\n worker.terminate();\n }\n}\n","/**\n * Worker pools with bounded concurrency and explicit queueing.\n *\n * @module bquery/concurrency\n */\n\nimport { TaskWorkerAbortError, TaskWorkerError } from './errors';\nimport { createRpcWorker } from './rpc';\nimport { createTaskWorker } from './task';\nimport type {\n CreateRpcPoolOptions,\n CreateTaskPoolOptions,\n RpcPool,\n RpcWorker,\n TaskPool,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerRpcHandlers,\n WorkerTaskHandler,\n} from './types';\n\nconst DEFAULT_POOL_CONCURRENCY = 4;\n\ninterface QueueEntry<TJob, TResult> {\n abortHandler?: () => void;\n job: TJob;\n options: TaskRunOptions;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n signal?: AbortSignal;\n}\n\ninterface PoolRuntime<TJob, TResult> {\n readonly state: TaskWorkerState;\n readonly busy: boolean;\n readonly concurrency: number;\n readonly pending: number;\n readonly size: number;\n enqueue(job: TJob, options?: TaskRunOptions): Promise<TResult>;\n clear(): void;\n terminate(): void;\n}\n\ninterface CreatePoolRuntimeOptions<TWorker extends { busy: boolean }, TJob, TResult> {\n abortedWhileQueuedMessage: string;\n clearMessage: string;\n concurrency: number;\n createWorkers: (concurrency: number) => TWorker[];\n queueFullMessage: string;\n terminatedMessage: string;\n workerTerminatedMessage: string;\n runWorker: (worker: TWorker, job: TJob, options: TaskRunOptions) => Promise<TResult>;\n maxQueue: number;\n}\n\nconst normalizeConcurrency = (concurrency: number | undefined, label: string): number => {\n if (concurrency === undefined) {\n return DEFAULT_POOL_CONCURRENCY;\n }\n\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError(`${label} concurrency must be a positive integer.`);\n }\n\n return concurrency;\n};\n\nconst normalizeMaxQueue = (maxQueue: number | undefined, label: string): number => {\n if (maxQueue === undefined) {\n return Number.POSITIVE_INFINITY;\n }\n\n if (maxQueue === Number.POSITIVE_INFINITY) {\n return maxQueue;\n }\n\n if (!Number.isInteger(maxQueue) || maxQueue < 0) {\n throw new RangeError(`${label} maxQueue must be a non-negative integer or Infinity.`);\n }\n\n return maxQueue;\n};\n\nconst detachAbortListener = <TJob, TResult>(entry: QueueEntry<TJob, TResult>): void => {\n if (entry.abortHandler && entry.signal) {\n entry.signal.removeEventListener('abort', entry.abortHandler);\n }\n\n entry.abortHandler = undefined;\n entry.signal = undefined;\n};\n\nconst createPoolRuntime = <TWorker extends { busy: boolean }, TJob, TResult>({\n abortedWhileQueuedMessage,\n clearMessage,\n concurrency,\n createWorkers,\n queueFullMessage,\n terminatedMessage,\n workerTerminatedMessage,\n runWorker,\n maxQueue,\n}: CreatePoolRuntimeOptions<TWorker, TJob, TResult>): PoolRuntime<TJob, TResult> => {\n const queue: Array<QueueEntry<TJob, TResult>> = [];\n const workers = createWorkers(concurrency);\n let disposed = false;\n let running = 0;\n\n const drain = (): void => {\n if (disposed || queue.length === 0) {\n return;\n }\n\n for (const worker of workers) {\n if (queue.length === 0) {\n return;\n }\n\n if (worker.busy) {\n continue;\n }\n\n const entry = queue.shift()!;\n if (entry.signal?.aborted) {\n detachAbortListener(entry);\n entry.reject(new TaskWorkerAbortError(abortedWhileQueuedMessage));\n continue;\n }\n\n detachAbortListener(entry);\n running++;\n void runWorker(worker, entry.job, entry.options)\n .then(entry.resolve, entry.reject)\n .finally(() => {\n running--;\n drain();\n });\n }\n };\n\n const rejectQueued = (error: TaskWorkerError): void => {\n const queued = queue.splice(0);\n for (const entry of queued) {\n detachAbortListener(entry);\n entry.reject(error);\n }\n };\n\n return {\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return running > 0 || queue.length > 0 ? 'running' : 'idle';\n },\n get busy(): boolean {\n return running > 0 || queue.length > 0;\n },\n concurrency,\n get pending(): number {\n return running;\n },\n get size(): number {\n return queue.length;\n },\n enqueue(job: TJob, options: TaskRunOptions = {}): Promise<TResult> {\n if (disposed) {\n return Promise.reject(new TaskWorkerError(workerTerminatedMessage, 'TERMINATED'));\n }\n\n if (options.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n return new Promise<TResult>((resolve, reject) => {\n const entry: QueueEntry<TJob, TResult> = {\n job,\n options,\n reject,\n resolve,\n };\n\n const idleWorker = workers.find((worker) => !worker.busy);\n if (idleWorker) {\n running++;\n void runWorker(idleWorker, job, options)\n .then(resolve, reject)\n .finally(() => {\n running--;\n drain();\n });\n return;\n }\n\n if (queue.length >= maxQueue) {\n reject(new TaskWorkerError(queueFullMessage, 'QUEUE_FULL'));\n return;\n }\n\n if (options.signal) {\n entry.signal = options.signal;\n entry.abortHandler = () => {\n const index = queue.indexOf(entry);\n if (index === -1) {\n return;\n }\n\n queue.splice(index, 1);\n detachAbortListener(entry);\n reject(new TaskWorkerAbortError(abortedWhileQueuedMessage));\n };\n options.signal.addEventListener('abort', entry.abortHandler, { once: true });\n }\n\n queue.push(entry);\n });\n },\n clear(): void {\n if (disposed || queue.length === 0) {\n return;\n }\n\n rejectQueued(new TaskWorkerError(clearMessage, 'QUEUE_CLEARED'));\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n rejectQueued(new TaskWorkerError(terminatedMessage, 'TERMINATED'));\n for (const worker of workers) {\n if ('terminate' in worker && typeof worker.terminate === 'function') {\n worker.terminate();\n }\n }\n },\n };\n};\n\nconst createWorkerNames = (\n name: string | undefined,\n concurrency: number\n): Array<string | undefined> => {\n if (!name) {\n return Array.from({ length: concurrency }, () => undefined);\n }\n\n if (concurrency === 1) {\n return [name];\n }\n\n return Array.from({ length: concurrency }, (_, index) => `${name}-${index + 1}`);\n};\n\n/**\n * Creates a reusable pool of task workers with bounded concurrency and FIFO queueing.\n *\n * @example\n * ```ts\n * import { createTaskPool } from '@bquery/bquery/concurrency';\n *\n * const pool = createTaskPool(\n * ({ value }: { value: number }) => value * 2,\n * { concurrency: 4, maxQueue: 16, name: 'double-pool' }\n * );\n *\n * const results = await Promise.all([\n * pool.run({ value: 1 }),\n * pool.run({ value: 2 }),\n * pool.run({ value: 3 }),\n * ]);\n *\n * pool.terminate();\n * ```\n */\nexport function createTaskPool<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskPoolOptions = {}\n): TaskPool<TInput, TResult> {\n const { concurrency: concurrencyOption, maxQueue: maxQueueOption, ...workerOptions } = options;\n const concurrency = normalizeConcurrency(concurrencyOption, 'Task pool');\n const maxQueue = normalizeMaxQueue(maxQueueOption, 'Task pool');\n\n const runtime = createPoolRuntime<TaskWorker<TInput, TResult>, TInput, TResult>({\n abortedWhileQueuedMessage: 'The queued task was aborted before execution started.',\n clearMessage: 'The task pool queue was cleared.',\n concurrency,\n createWorkers(poolConcurrency) {\n const workers: Array<TaskWorker<TInput, TResult>> = [];\n const names = createWorkerNames(workerOptions.name, poolConcurrency);\n\n try {\n for (let index = 0; index < poolConcurrency; index++) {\n workers.push(\n createTaskWorker(handler, {\n ...workerOptions,\n name: names[index],\n })\n );\n }\n } catch (error) {\n for (const worker of workers) {\n worker.terminate();\n }\n throw error;\n }\n\n return workers;\n },\n queueFullMessage:\n 'The task pool queue is full. Increase maxQueue, wait for pending tasks, or raise pool concurrency.',\n terminatedMessage: 'The task pool was terminated.',\n workerTerminatedMessage: 'The task pool has already been terminated.',\n runWorker(worker, job, runOptions) {\n return worker.run(job, runOptions);\n },\n maxQueue,\n });\n\n return {\n get state(): TaskWorkerState {\n return runtime.state;\n },\n get busy(): boolean {\n return runtime.busy;\n },\n get concurrency(): number {\n return runtime.concurrency;\n },\n get pending(): number {\n return runtime.pending;\n },\n get size(): number {\n return runtime.size;\n },\n run(input: TInput, runOptions?: TaskRunOptions): Promise<TResult> {\n return runtime.enqueue(input, runOptions);\n },\n clear(): void {\n runtime.clear();\n },\n terminate(): void {\n runtime.terminate();\n },\n };\n}\n\n/**\n * Creates a reusable pool of RPC workers with bounded concurrency and FIFO queueing.\n *\n * @example\n * ```ts\n * import { createRpcPool } from '@bquery/bquery/concurrency';\n *\n * const pool = createRpcPool(\n * {\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * },\n * { concurrency: 2, maxQueue: 8 }\n * );\n *\n * const total = await pool.call('sum', { values: [1, 2, 3] });\n * pool.terminate();\n * ```\n */\nexport function createRpcPool<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcPoolOptions = {}\n): RpcPool<TRoutes> {\n const { concurrency: concurrencyOption, maxQueue: maxQueueOption, ...workerOptions } = options;\n const concurrency = normalizeConcurrency(concurrencyOption, 'RPC pool');\n const maxQueue = normalizeMaxQueue(maxQueueOption, 'RPC pool');\n\n type RpcJob = {\n input: unknown;\n method: keyof TRoutes & string;\n };\n\n const runtime = createPoolRuntime<RpcWorker<TRoutes>, RpcJob, unknown>({\n abortedWhileQueuedMessage: 'The queued RPC call was aborted before execution started.',\n clearMessage: 'The RPC pool queue was cleared.',\n concurrency,\n createWorkers(poolConcurrency) {\n const workers: Array<RpcWorker<TRoutes>> = [];\n const names = createWorkerNames(workerOptions.name, poolConcurrency);\n\n try {\n for (let index = 0; index < poolConcurrency; index++) {\n workers.push(\n createRpcWorker(handlers, {\n ...workerOptions,\n name: names[index],\n })\n );\n }\n } catch (error) {\n for (const worker of workers) {\n worker.terminate();\n }\n throw error;\n }\n\n return workers;\n },\n queueFullMessage:\n 'The RPC pool queue is full. Increase maxQueue, wait for pending calls, or raise pool concurrency.',\n terminatedMessage: 'The RPC pool was terminated.',\n workerTerminatedMessage: 'The RPC pool has already been terminated.',\n runWorker(worker, job, runOptions) {\n return worker.call(job.method, job.input as never, runOptions);\n },\n maxQueue,\n });\n\n return {\n get state(): TaskWorkerState {\n return runtime.state;\n },\n get busy(): boolean {\n return runtime.busy;\n },\n get concurrency(): number {\n return runtime.concurrency;\n },\n get pending(): number {\n return runtime.pending;\n },\n get size(): number {\n return runtime.size;\n },\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions?: TaskRunOptions\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return runtime.enqueue({ input, method }, runOptions) as Promise<\n Awaited<ReturnType<TRoutes[TMethod]>>\n >;\n },\n clear(): void {\n runtime.clear();\n },\n terminate(): void {\n runtime.terminate();\n },\n };\n}\n","/**\n * Thin high-level helpers layered on top of the explicit worker primitives.\n *\n * @module bquery/concurrency\n */\n\nimport { createTaskPool } from './pool';\nimport { runTask } from './task';\nimport { validateTaskHandler } from './internal';\nimport type {\n ParallelCollectionOptions,\n ParallelMapHandler,\n ParallelMapOptions,\n ParallelOptions,\n ParallelPredicateHandler,\n ParallelReduceHandler,\n ParallelResults,\n ParallelTask,\n TaskPool,\n TaskRunOptions,\n WorkerTaskHandler,\n} from './types';\n\ninterface SerializedParallelTask {\n handlerSource: string;\n input: unknown;\n}\n\ninterface SerializedChunk<TInput = unknown> {\n items: Array<{\n index: number;\n value: TInput;\n }>;\n handlerSource: string;\n}\n\ninterface IndexedMapResult<TResult> {\n index: number;\n value: TResult;\n}\n\nconst executeSerializedTask = async (job: SerializedParallelTask): Promise<unknown> => {\n const revive = new Function(`return (${job.handlerSource});`);\n const handler = revive() as ((input: unknown) => unknown | Promise<unknown>) | undefined;\n\n if (typeof handler !== 'function') {\n throw new TypeError('The serialized task handler did not revive as a function.');\n }\n\n return await handler(job.input);\n};\n\ninterface SerializedReduceJob<TInput = unknown, TAccumulator = unknown> {\n initialValue: TAccumulator;\n reducerSource: string;\n values: readonly TInput[];\n}\n\nconst executeSerializedChunk = async (\n job: SerializedChunk\n): Promise<Array<IndexedMapResult<unknown>>> => {\n const revive = new Function(`return (${job.handlerSource});`);\n const handler = revive() as\n | ((value: unknown, index: number) => unknown | Promise<unknown>)\n | undefined;\n\n if (typeof handler !== 'function') {\n throw new TypeError('The serialized collection handler did not revive as a function.');\n }\n\n const results: Array<IndexedMapResult<unknown>> = [];\n for (const item of job.items) {\n results.push({\n index: item.index,\n value: await handler(item.value, item.index),\n });\n }\n\n return results;\n};\n\nconst executeSerializedReduce = async (job: SerializedReduceJob): Promise<unknown> => {\n const revive = new Function(`return (${job.reducerSource});`);\n const reducer = revive() as\n | ((accumulator: unknown, value: unknown, index: number) => unknown | Promise<unknown>)\n | undefined;\n\n if (typeof reducer !== 'function') {\n throw new TypeError('The serialized reducer did not revive as a function.');\n }\n\n let accumulator = job.initialValue;\n for (let index = 0; index < job.values.length; index++) {\n accumulator = await reducer(accumulator, job.values[index], index);\n }\n\n return accumulator;\n};\n\nconst normalizeBatchSize = (batchSize: number | undefined, label: string): number => {\n if (batchSize === undefined) {\n return 1;\n }\n\n if (!Number.isInteger(batchSize) || batchSize < 1) {\n throw new RangeError(`${label} batchSize must be a positive integer.`);\n }\n\n return batchSize;\n};\n\nconst createSerializedTaskPool = (\n options: ParallelOptions\n): TaskPool<SerializedParallelTask, unknown> => {\n return createTaskPool(executeSerializedTask, options);\n};\n\nconst serializeTask = <TInput, TResult>(\n task: ParallelTask<TInput, TResult>\n): SerializedParallelTask => ({\n handlerSource: validateTaskHandler(task.handler),\n input: task.input,\n});\n\nconst runChunkedHandler = async <TInput, TResult>(\n values: readonly TInput[],\n handler: (value: TInput, index: number) => TResult | Promise<TResult>,\n options: ParallelCollectionOptions = {},\n label: string\n): Promise<TResult[]> => {\n if (values.length === 0) {\n return [];\n }\n\n const handlerSource = validateTaskHandler(\n handler as unknown as WorkerTaskHandler<TInput, TResult>\n );\n const { batchSize, signal, ...poolOptions } = options;\n const normalizedBatchSize = normalizeBatchSize(batchSize, label);\n const pool = createTaskPool(executeSerializedChunk, poolOptions);\n const chunks: Array<SerializedChunk<TInput>> = [];\n\n for (let index = 0; index < values.length; index += normalizedBatchSize) {\n const end = Math.min(index + normalizedBatchSize, values.length);\n const items: SerializedChunk<TInput>['items'] = [];\n\n for (let itemIndex = index; itemIndex < end; itemIndex += 1) {\n items.push({\n index: itemIndex,\n value: values[itemIndex],\n });\n }\n\n chunks.push({ items, handlerSource });\n }\n\n try {\n const chunkResults = await Promise.all(\n chunks.map((chunk) => pool.run(chunk, signal ? { signal } : undefined))\n );\n const mapped = new Array<TResult>(values.length);\n\n for (const chunk of chunkResults) {\n for (const item of chunk) {\n mapped[item.index] = item.value as TResult;\n }\n }\n\n return mapped;\n } finally {\n pool.terminate();\n }\n};\n\n/**\n * Executes multiple standalone tasks in parallel using a bounded worker pool.\n *\n * @example\n * ```ts\n * import { parallel } from '@bquery/bquery/concurrency';\n *\n * const results = await parallel([\n * { handler: (value: number) => value * 2, input: 5 },\n * { handler: ({ a, b }: { a: number; b: number }) => a + b, input: { a: 1, b: 2 } },\n * ]);\n * ```\n */\nexport async function parallel<TTasks extends readonly ParallelTask[]>(\n tasks: TTasks,\n options: ParallelOptions = {}\n): Promise<ParallelResults<TTasks>> {\n if (tasks.length === 0) {\n return [] as unknown as ParallelResults<TTasks>;\n }\n\n const pool = createSerializedTaskPool(options);\n\n try {\n const results = await Promise.all(\n tasks.map((task) => pool.run(serializeTask(task), task.options))\n );\n return results as ParallelResults<TTasks>;\n } finally {\n pool.terminate();\n }\n}\n\n/**\n * Executes tasks in sequential batches while each batch still uses parallel workers.\n *\n * This adapts `threadts-universal`'s batch helper to bQuery without colliding\n * with the reactive module's existing `batch()` export.\n *\n * @example\n * ```ts\n * import { batchTasks } from '@bquery/bquery/concurrency';\n *\n * const results = await batchTasks(\n * [\n * { handler: (value: number) => value * 2, input: 1 },\n * { handler: (value: number) => value * 2, input: 2 },\n * { handler: (value: number) => value * 2, input: 3 },\n * ],\n * 2\n * );\n * ```\n */\nexport async function batchTasks<TTasks extends readonly ParallelTask[]>(\n tasks: TTasks,\n batchSize?: number,\n options: ParallelOptions = {}\n): Promise<ParallelResults<TTasks>> {\n if (tasks.length === 0) {\n return [] as unknown as ParallelResults<TTasks>;\n }\n\n const normalizedBatchSize = normalizeBatchSize(batchSize, 'batchTasks');\n const pool = createSerializedTaskPool(options);\n const results: unknown[] = [];\n\n try {\n for (let index = 0; index < tasks.length; index += normalizedBatchSize) {\n const batch = tasks.slice(index, index + normalizedBatchSize);\n const batchResults = await Promise.all(\n batch.map((task) => pool.run(serializeTask(task), task.options))\n );\n results.push(...batchResults);\n }\n\n return results as ParallelResults<TTasks>;\n } finally {\n pool.terminate();\n }\n}\n\n/**\n * Maps an array in parallel using optional chunking on top of `createTaskPool()`.\n *\n * @example\n * ```ts\n * import { map } from '@bquery/bquery/concurrency';\n *\n * const results = await map([1, 2, 3], (value, index) => value + index, {\n * batchSize: 2,\n * concurrency: 2,\n * });\n * ```\n */\nexport async function map<TInput, TResult>(\n values: readonly TInput[],\n mapper: ParallelMapHandler<TInput, TResult>,\n options: ParallelMapOptions = {}\n): Promise<TResult[]> {\n return runChunkedHandler(values, mapper, options, 'map');\n}\n\n/**\n * Filters an array in parallel using a standalone predicate with optional chunking.\n */\nexport async function filter<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<TInput[]> {\n const matches = await runChunkedHandler(values, predicate, options, 'filter');\n const filtered: TInput[] = [];\n\n for (let index = 0; index < values.length; index += 1) {\n if (!matches[index]) {\n continue;\n }\n\n if (index in values) {\n filtered.push(values[index] as TInput);\n } else {\n filtered.length += 1;\n }\n }\n\n return filtered;\n}\n\n/**\n * Returns whether at least one array item matches a standalone predicate.\n *\n * The current implementation evaluates predicate chunks explicitly and reduces\n * the final boolean result on the main thread instead of using hidden globals\n * or speculative worker cancellation.\n */\nexport async function some<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<boolean> {\n if (values.length === 0) {\n return false;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'some');\n return matches.some(Boolean);\n}\n\n/**\n * Returns whether every array item matches a standalone predicate.\n *\n * The current implementation evaluates predicate chunks explicitly and reduces\n * the final boolean result on the main thread instead of using hidden globals\n * or speculative worker cancellation.\n */\nexport async function every<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<boolean> {\n if (values.length === 0) {\n return true;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'every');\n return matches.every(Boolean);\n}\n\n/**\n * Finds the first array item that matches a standalone predicate.\n */\nexport async function find<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<TInput | undefined> {\n if (values.length === 0) {\n return undefined;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'find');\n const index = matches.findIndex(Boolean);\n return index === -1 ? undefined : values[index];\n}\n\n/**\n * Reduces an array inside one isolated worker while preserving standard\n * left-to-right accumulator semantics.\n */\nexport async function reduce<TInput, TAccumulator>(\n values: readonly TInput[],\n reducer: ParallelReduceHandler<TAccumulator, TInput>,\n initialValue: TAccumulator,\n options: TaskRunOptions = {}\n): Promise<TAccumulator> {\n if (values.length === 0) {\n return initialValue;\n }\n\n const reducerSource = validateTaskHandler(\n reducer as unknown as WorkerTaskHandler<unknown, unknown>\n );\n\n return runTask(\n executeSerializedReduce,\n {\n initialValue,\n reducerSource,\n values,\n },\n options\n ) as Promise<TAccumulator>;\n}\n","/**\n * Optional fluent pipeline helpers layered on top of the explicit collection helpers.\n *\n * @module bquery/concurrency\n */\n\nimport { every, filter, find, map, reduce, some } from './high-level';\nimport type {\n ConcurrencyPipeline,\n ConcurrencyPipelineOptions,\n ParallelCollectionOptions,\n ParallelMapHandler,\n ParallelPredicateHandler,\n ParallelReduceHandler,\n TaskRunOptions,\n} from './types';\n\nconst mergeCollectionOptions = (\n defaults: ConcurrencyPipelineOptions,\n overrides: ParallelCollectionOptions = {}\n): ParallelCollectionOptions => ({\n ...defaults,\n ...overrides,\n});\n\nconst mergeTaskRunOptions = (\n defaults: ConcurrencyPipelineOptions,\n overrides: TaskRunOptions = {}\n): TaskRunOptions => ({\n signal: 'signal' in overrides ? overrides.signal : defaults.signal,\n timeout: 'timeout' in overrides ? overrides.timeout : defaults.timeout,\n transfer: overrides.transfer,\n});\n\nclass FluentConcurrencyPipeline<TValue> implements ConcurrencyPipeline<TValue> {\n constructor(\n private readonly valuesPromise: Promise<readonly TValue[]>,\n private readonly defaults: ConcurrencyPipelineOptions\n ) {}\n\n private createNext<TNext>(\n transform: (values: readonly TValue[]) => Promise<readonly TNext[]>\n ): ConcurrencyPipeline<TNext> {\n return new FluentConcurrencyPipeline(\n this.valuesPromise.then((values) => transform(values)),\n this.defaults\n );\n }\n\n map<TResult>(\n mapper: ParallelMapHandler<TValue, TResult>,\n options?: ParallelCollectionOptions\n ): ConcurrencyPipeline<TResult> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.createNext((values) => map(values, mapper, resolvedOptions));\n }\n\n filter(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): ConcurrencyPipeline<TValue> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.createNext((values) => filter(values, predicate, resolvedOptions));\n }\n\n toArray(): Promise<TValue[]> {\n return this.valuesPromise.then((values) => values.slice());\n }\n\n some(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<boolean> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => some(values, predicate, resolvedOptions));\n }\n\n every(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<boolean> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => every(values, predicate, resolvedOptions));\n }\n\n find(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<TValue | undefined> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => find(values, predicate, resolvedOptions));\n }\n\n reduce<TAccumulator>(\n reducer: ParallelReduceHandler<TAccumulator, TValue>,\n initialValue: TAccumulator,\n options?: TaskRunOptions\n ): Promise<TAccumulator> {\n const resolvedOptions = mergeTaskRunOptions(this.defaults, options);\n return this.valuesPromise.then((values) =>\n reduce(values, reducer, initialValue, resolvedOptions)\n );\n }\n}\n\n/**\n * Creates an optional fluent pipeline over the existing concurrency collection helpers.\n *\n * The pipeline itself does not create hidden global workers or proxies. Each stage\n * delegates to the already explicit `map()`, `filter()`, `some()`, `every()`,\n * `find()`, and `reduce()` helpers when the pipeline is executed.\n *\n * @example\n * ```ts\n * import { pipeline } from '@bquery/bquery/concurrency';\n *\n * const results = await pipeline([1, 2, 3, 4], {\n * batchSize: 2,\n * concurrency: 2,\n * })\n * .map((value) => value * 2)\n * .filter((value) => value > 4)\n * .toArray();\n *\n * console.log(results); // [6, 8]\n * ```\n */\nexport function pipeline<TValue>(\n values: readonly TValue[],\n options: ConcurrencyPipelineOptions = {}\n): ConcurrencyPipeline<TValue> {\n return new FluentConcurrencyPipeline(Promise.resolve(values.slice()), options);\n}\n","/**\n * Reactive wrappers around reusable concurrency primitives.\n *\n * @module bquery/concurrency\n */\n\nimport { batch } from '../reactive/batch';\nimport { signal, type Signal } from '../reactive/core';\nimport { readonly } from '../reactive/readonly';\nimport { createRpcPool, createTaskPool } from './pool';\nimport { createRpcWorker } from './rpc';\nimport { createTaskWorker } from './task';\nimport type {\n CreateRpcPoolOptions,\n CreateRpcWorkerOptions,\n CreateTaskPoolOptions,\n CreateTaskWorkerOptions,\n ReactiveRpcPool,\n ReactiveRpcWorker,\n ReactiveTaskPool,\n ReactiveTaskWorker,\n TaskPool,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerRpcHandlers,\n WorkerTaskHandler,\n} from './types';\n\ninterface WorkerSignalMirror {\n busy: Signal<boolean>;\n state: Signal<TaskWorkerState>;\n}\n\ninterface PoolSignalMirror extends WorkerSignalMirror {\n concurrency: Signal<number>;\n pending: Signal<number>;\n size: Signal<number>;\n}\n\ntype WorkerStateSource = Pick<TaskWorker<unknown, unknown>, 'busy' | 'state'>;\ntype PoolStateSource = Pick<\n TaskPool<unknown, unknown>,\n 'busy' | 'concurrency' | 'pending' | 'size' | 'state'\n>;\n\nconst syncWorkerSignals = (source: WorkerStateSource, mirror: WorkerSignalMirror): void => {\n batch(() => {\n mirror.state.value = source.state;\n mirror.busy.value = source.busy;\n });\n};\n\nconst syncPoolSignals = (source: PoolStateSource, mirror: PoolSignalMirror): void => {\n batch(() => {\n mirror.state.value = source.state;\n mirror.busy.value = source.busy;\n mirror.concurrency.value = source.concurrency;\n mirror.pending.value = source.pending;\n mirror.size.value = source.size;\n });\n};\n\nconst createWorkerSignalMirror = (source: WorkerStateSource): WorkerSignalMirror => {\n return {\n busy: signal(source.busy),\n state: signal(source.state),\n };\n};\n\nconst createPoolSignalMirror = (source: PoolStateSource): PoolSignalMirror => {\n return {\n busy: signal(source.busy),\n concurrency: signal(source.concurrency),\n pending: signal(source.pending),\n size: signal(source.size),\n state: signal(source.state),\n };\n};\n\nconst attachRunSync = <TResult>(run: Promise<TResult>, sync: () => void): Promise<TResult> => {\n sync();\n return run.finally(() => {\n sync();\n queueMicrotask(sync);\n });\n};\n\n/**\n * Creates a reactive wrapper around a reusable task worker.\n *\n * The returned wrapper preserves the standard `run()` / `terminate()` API and\n * adds readonly signals such as `state$` and `busy$` for UI bindings.\n *\n * @example\n * ```ts\n * import { createReactiveTaskWorker } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const worker = createReactiveTaskWorker((value: number) => value * 2);\n *\n * effect(() => {\n * console.log(worker.state$.value, worker.busy$.value);\n * });\n *\n * await worker.run(21);\n * worker.terminate();\n * ```\n */\nexport function createReactiveTaskWorker<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskWorkerOptions = {}\n): ReactiveTaskWorker<TInput, TResult> {\n const worker = createTaskWorker(handler, options);\n const mirror = createWorkerSignalMirror(worker as WorkerStateSource);\n const sync = (): void => {\n syncWorkerSignals(worker as WorkerStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return worker.busy;\n },\n get state(): TaskWorkerState {\n return worker.state;\n },\n busy$: readonly(mirror.busy),\n state$: readonly(mirror.state),\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n return attachRunSync(worker.run(input, runOptions), sync);\n },\n terminate(): void {\n worker.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable RPC worker.\n *\n * The returned wrapper preserves the standard `call()` / `terminate()` API and\n * adds readonly signals such as `state$` and `busy$` for UI bindings.\n *\n * @example\n * ```ts\n * import { createReactiveRpcWorker } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const rpc = createReactiveRpcWorker({\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * });\n *\n * effect(() => {\n * console.log(rpc.state$.value, rpc.busy$.value);\n * });\n *\n * await rpc.call('sum', { values: [1, 2, 3] });\n * rpc.terminate();\n * ```\n */\nexport function createReactiveRpcWorker<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcWorkerOptions = {}\n): ReactiveRpcWorker<TRoutes> {\n const worker = createRpcWorker(handlers, options);\n const mirror = createWorkerSignalMirror(worker as WorkerStateSource);\n const sync = (): void => {\n syncWorkerSignals(worker as WorkerStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return worker.busy;\n },\n get state(): TaskWorkerState {\n return worker.state;\n },\n busy$: readonly(mirror.busy),\n state$: readonly(mirror.state),\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return attachRunSync(worker.call(method, input, runOptions), sync);\n },\n terminate(): void {\n worker.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable task pool.\n *\n * The returned wrapper preserves the standard `run()` / `clear()` /\n * `terminate()` API and adds readonly signals for pool state and queue load.\n *\n * @example\n * ```ts\n * import { createReactiveTaskPool } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const pool = createReactiveTaskPool((value: number) => value * 2, { concurrency: 2 });\n *\n * effect(() => {\n * console.log(pool.pending$.value, pool.size$.value, pool.state$.value);\n * });\n *\n * await Promise.all([pool.run(1), pool.run(2), pool.run(3)]);\n * pool.terminate();\n * ```\n */\nexport function createReactiveTaskPool<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskPoolOptions = {}\n): ReactiveTaskPool<TInput, TResult> {\n const pool = createTaskPool(handler, options);\n const mirror = createPoolSignalMirror(pool as PoolStateSource);\n const sync = (): void => {\n syncPoolSignals(pool as PoolStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return pool.busy;\n },\n get concurrency(): number {\n return pool.concurrency;\n },\n get pending(): number {\n return pool.pending;\n },\n get size(): number {\n return pool.size;\n },\n get state(): TaskWorkerState {\n return pool.state;\n },\n busy$: readonly(mirror.busy),\n concurrency$: readonly(mirror.concurrency),\n pending$: readonly(mirror.pending),\n size$: readonly(mirror.size),\n state$: readonly(mirror.state),\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n return attachRunSync(pool.run(input, runOptions), sync);\n },\n clear(): void {\n pool.clear();\n sync();\n },\n terminate(): void {\n pool.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable RPC pool.\n *\n * The returned wrapper preserves the standard `call()` / `clear()` /\n * `terminate()` API and adds readonly signals for pool state and queue load.\n *\n * @example\n * ```ts\n * import { createReactiveRpcPool } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const pool = createReactiveRpcPool(\n * {\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * },\n * { concurrency: 2 }\n * );\n *\n * effect(() => {\n * console.log(pool.pending$.value, pool.size$.value, pool.state$.value);\n * });\n *\n * await Promise.all([\n * pool.call('sum', { values: [1, 2] }),\n * pool.call('sum', { values: [3, 4] }),\n * pool.call('sum', { values: [5, 6] }),\n * ]);\n *\n * pool.terminate();\n * ```\n */\nexport function createReactiveRpcPool<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcPoolOptions = {}\n): ReactiveRpcPool<TRoutes> {\n const pool = createRpcPool(handlers, options);\n const mirror = createPoolSignalMirror(pool as PoolStateSource);\n const sync = (): void => {\n syncPoolSignals(pool as PoolStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return pool.busy;\n },\n get concurrency(): number {\n return pool.concurrency;\n },\n get pending(): number {\n return pool.pending;\n },\n get size(): number {\n return pool.size;\n },\n get state(): TaskWorkerState {\n return pool.state;\n },\n busy$: readonly(mirror.busy),\n concurrency$: readonly(mirror.concurrency),\n pending$: readonly(mirror.pending),\n size$: readonly(mirror.size),\n state$: readonly(mirror.state),\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return attachRunSync(pool.call(method, input, runOptions), sync);\n },\n clear(): void {\n pool.clear();\n sync();\n },\n terminate(): void {\n pool.terminate();\n sync();\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"concurrency-kycgAZvW.js","names":[],"sources":["../src/concurrency/errors.ts","../src/concurrency/internal.ts","../src/concurrency/support.ts","../src/concurrency/rpc.ts","../src/concurrency/task.ts","../src/concurrency/pool.ts","../src/concurrency/high-level.ts","../src/concurrency/pipeline.ts","../src/concurrency/reactive.ts"],"sourcesContent":["/**\n * Error types for the concurrency module.\n *\n * @module bquery/concurrency\n */\n\nimport type { TaskWorkerErrorCode } from './types';\n\n/** Base error for concurrency task failures. */\nexport class TaskWorkerError extends Error {\n /** Stable error code for programmatic handling. */\n code: TaskWorkerErrorCode;\n\n constructor(message: string, code: TaskWorkerErrorCode, cause?: unknown) {\n super(message);\n this.name = 'TaskWorkerError';\n this.code = code;\n if (cause !== undefined) {\n (this as Error & { cause?: unknown }).cause = cause;\n }\n }\n}\n\n/** Thrown when the environment cannot create inline Web Workers. */\nexport class TaskWorkerUnsupportedError extends TaskWorkerError {\n constructor(\n message = 'Concurrency tasks are not supported in this environment.',\n cause?: unknown\n ) {\n super(message, 'UNSUPPORTED', cause);\n this.name = 'TaskWorkerUnsupportedError';\n }\n}\n\n/** Thrown when the task handler or payload cannot be serialized safely. */\nexport class TaskWorkerSerializationError extends TaskWorkerError {\n constructor(message: string, cause?: unknown) {\n super(message, 'SERIALIZATION', cause);\n this.name = 'TaskWorkerSerializationError';\n }\n}\n\n/** Thrown when a task exceeds its configured timeout. */\nexport class TaskWorkerTimeoutError extends TaskWorkerError {\n constructor(message: string, cause?: unknown) {\n super(message, 'TIMEOUT', cause);\n this.name = 'TaskWorkerTimeoutError';\n }\n}\n\n/** Thrown when a task is aborted via `AbortSignal`. */\nexport class TaskWorkerAbortError extends TaskWorkerError {\n constructor(message = 'The worker task was aborted.', cause?: unknown) {\n super(message, 'ABORT', cause);\n this.name = 'TaskWorkerAbortError';\n }\n}\n","/**\n * Internal helpers shared across concurrency implementations.\n *\n * @internal\n */\n\nimport { TaskWorkerError, TaskWorkerSerializationError, TaskWorkerTimeoutError } from './errors';\nimport type { TaskWorkerErrorCode, WorkerTaskHandler } from './types';\n\n/** @internal */\nexport interface SerializedWorkerError {\n /** Untrusted serialized worker payload; validate against TaskWorkerErrorCode before use. */\n code?: string;\n message?: string;\n name?: string;\n stack?: string;\n}\n\nconst TASK_WORKER_ERROR_CODES = new Set<TaskWorkerErrorCode>([\n 'ABORT',\n 'BUSY',\n 'METHOD_NOT_FOUND',\n 'QUEUE_CLEARED',\n 'QUEUE_FULL',\n 'SERIALIZATION',\n 'TERMINATED',\n 'TIMEOUT',\n 'UNSUPPORTED',\n 'WORKER',\n]);\n\nconst NATIVE_FUNCTION_SOURCE_RE = /\\{\\s*\\[native code\\]\\s*\\}$/u;\n\n/** @internal */\nexport const isTaskWorkerErrorCode = (code: string | undefined): code is TaskWorkerErrorCode => {\n return typeof code === 'string' && TASK_WORKER_ERROR_CODES.has(code as TaskWorkerErrorCode);\n};\n\n/** @internal */\nexport const normalizeTimeout = (timeout?: number): number | undefined => {\n if (typeof timeout !== 'number' || !Number.isFinite(timeout) || timeout <= 0) {\n return undefined;\n }\n\n return timeout;\n};\n\n/** @internal */\nexport const validateTaskHandler = <TInput, TResult>(\n handler: WorkerTaskHandler<TInput, TResult>\n): string => {\n const source = Function.prototype.toString.call(handler).trim();\n\n if (!source || NATIVE_FUNCTION_SOURCE_RE.test(source)) {\n throw new TaskWorkerSerializationError(\n 'Task handlers must be standalone user-defined functions or arrow functions.'\n );\n }\n\n try {\n const revived = new Function(`return (${source});`)() as unknown;\n if (typeof revived !== 'function') {\n throw new TypeError('Task handler did not revive as a function.');\n }\n } catch (error) {\n throw new TaskWorkerSerializationError(\n 'Task handlers must be standalone functions that can be reconstructed in a worker context.',\n error\n );\n }\n\n return source;\n};\n\n/** @internal */\nexport const createWorkerInstance = (scriptSource: string, name?: string): Worker => {\n const blob = new Blob([scriptSource], { type: 'text/javascript' });\n const scriptUrl = URL.createObjectURL(blob);\n\n try {\n return new Worker(scriptUrl, name ? { name } : undefined);\n } finally {\n URL.revokeObjectURL(scriptUrl);\n }\n};\n\n/** @internal */\nexport const restoreWorkerError = (payload: SerializedWorkerError | undefined): TaskWorkerError => {\n const message = payload?.message || 'Worker task failed.';\n const code = isTaskWorkerErrorCode(payload?.code) ? payload.code : 'WORKER';\n const error =\n code === 'TIMEOUT' ? new TaskWorkerTimeoutError(message) : new TaskWorkerError(message, code);\n\n error.name = payload?.name || error.name;\n if (payload?.stack) {\n error.stack = payload.stack;\n }\n\n return error;\n};\n","/**\n * Runtime support checks for the concurrency module.\n *\n * @module bquery/concurrency\n */\n\nimport type { ConcurrencySupport } from './types';\n\n/**\n * Returns a feature snapshot for zero-build inline worker execution.\n *\n * @example\n * ```ts\n * if (!isConcurrencySupported()) {\n * console.warn('Worker tasks are unavailable in this environment.');\n * }\n * ```\n */\nexport function getConcurrencySupport(): ConcurrencySupport {\n const worker = typeof globalThis.Worker === 'function';\n const blob = typeof globalThis.Blob === 'function';\n const hasUrl = typeof globalThis.URL !== 'undefined' && globalThis.URL !== null;\n const objectUrl =\n hasUrl &&\n typeof globalThis.URL.createObjectURL === 'function' &&\n typeof globalThis.URL.revokeObjectURL === 'function';\n const abortController = typeof globalThis.AbortController === 'function';\n\n return {\n worker,\n blob,\n objectUrl,\n abortController,\n supported: worker && blob && objectUrl,\n };\n}\n\n/**\n * Returns `true` when bQuery can create inline worker tasks in the current\n * environment.\n */\nexport function isConcurrencySupported(): boolean {\n return getConcurrencySupport().supported;\n}\n","/**\n * RPC-style worker communication helpers.\n *\n * @module bquery/concurrency\n */\n\nimport {\n TaskWorkerAbortError,\n TaskWorkerError,\n TaskWorkerSerializationError,\n TaskWorkerTimeoutError,\n TaskWorkerUnsupportedError,\n} from './errors';\nimport {\n createWorkerInstance,\n normalizeTimeout,\n restoreWorkerError,\n validateTaskHandler,\n type SerializedWorkerError,\n} from './internal';\nimport { isConcurrencySupported } from './support';\nimport type {\n CallWorkerMethodOptions,\n CreateRpcWorkerOptions,\n RpcWorker,\n TaskRunOptions,\n TaskWorkerState,\n WorkerRpcHandlers,\n} from './types';\n\ninterface WorkerSuccessMessage<TResult> {\n id: number;\n result: TResult;\n type: 'bq:result';\n}\n\ninterface WorkerErrorMessage {\n error: SerializedWorkerError;\n id: number;\n type: 'bq:error';\n}\n\ntype WorkerResponse<TResult> = WorkerSuccessMessage<TResult> | WorkerErrorMessage;\n\ninterface PendingRun<TResult> {\n abortHandler?: () => void;\n id: number;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\nconst WORKER_RPC_MESSAGE = 'bq:rpc';\n\nconst validateRpcHandlers = <TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes\n): Array<[keyof TRoutes & string, string]> => {\n const methodNames = Object.keys(handlers) as Array<keyof TRoutes & string>;\n\n if (methodNames.length === 0) {\n throw new TaskWorkerSerializationError(\n 'RPC workers require at least one standalone method handler.'\n );\n }\n\n return methodNames.map((method) => {\n const handler = handlers[method];\n if (typeof handler !== 'function') {\n throw new TaskWorkerSerializationError(\n `RPC handler \"${method}\" must be a standalone function.`\n );\n }\n\n return [method, validateTaskHandler(handler)];\n });\n};\n\nconst createRpcWorkerScript = (handlerSources: Array<[string, string]>): string => {\n const assignments = handlerSources\n .map(([method, source]) => `handlers[${JSON.stringify(method)}] = (${source});`)\n .join('\\n');\n\n return `'use strict';\nconst serializeError = (error) => {\n if (error && typeof error === 'object') {\n return {\n code: typeof error.code === 'string' ? error.code : undefined,\n message: typeof error.message === 'string' ? error.message : 'Worker RPC call failed.',\n name: typeof error.name === 'string' ? error.name : 'Error',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n return {\n message: typeof error === 'string' ? error : 'Worker RPC call failed.',\n name: 'Error',\n };\n};\n\nconst handlers = Object.create(null);\n${assignments}\n\nconst hasOwn = Object.prototype.hasOwnProperty;\n\nself.onmessage = async (event) => {\n const message = event.data;\n if (!message || message.type !== '${WORKER_RPC_MESSAGE}') {\n return;\n }\n\n const method = typeof message.method === 'string' ? message.method : '';\n if (!hasOwn.call(handlers, method)) {\n self.postMessage({\n error: {\n code: 'METHOD_NOT_FOUND',\n message: 'Unknown RPC method \"' + String(method) + '\".',\n name: 'TaskWorkerError',\n },\n id: message.id,\n type: 'bq:error',\n });\n return;\n }\n\n try {\n const result = await handlers[method](message.payload);\n self.postMessage({ id: message.id, result, type: 'bq:result' });\n } catch (error) {\n self.postMessage({ error: serializeError(error), id: message.id, type: 'bq:error' });\n }\n};`;\n};\n\n/**\n * Creates a reusable RPC-style worker with explicit named method dispatch.\n *\n * The worker processes one request at a time to keep lifecycle, timeout, abort,\n * and cleanup semantics aligned with the minimal Milestone 1 task API.\n *\n * @example\n * ```ts\n * import { createRpcWorker } from '@bquery/bquery/concurrency';\n *\n * const rpc = createRpcWorker({\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * double: (value: number) => value * 2,\n * });\n *\n * const total = await rpc.call('sum', { values: [1, 2, 3] });\n * rpc.terminate();\n * ```\n */\nexport function createRpcWorker<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcWorkerOptions = {}\n): RpcWorker<TRoutes> {\n if (!isConcurrencySupported()) {\n throw new TaskWorkerUnsupportedError();\n }\n\n const handlerSources = validateRpcHandlers(handlers);\n const scriptSource = createRpcWorkerScript(handlerSources);\n const defaultTimeout = normalizeTimeout(options.timeout);\n let disposed = false;\n let worker: Worker | null = null;\n let pending: PendingRun<unknown> | null = null;\n let nextRunId = 0;\n let pendingAbortSignal: AbortSignal | undefined;\n\n const cleanupPending = (): void => {\n if (!pending) {\n return;\n }\n\n if (pending.timeoutId !== undefined) {\n clearTimeout(pending.timeoutId);\n }\n\n if (pending.abortHandler) {\n pendingAbortSignal?.removeEventListener('abort', pending.abortHandler);\n }\n\n pending = null;\n pendingAbortSignal = undefined;\n };\n\n const detachWorker = (): void => {\n if (!worker) {\n return;\n }\n\n worker.onmessage = null;\n worker.onerror = null;\n worker.terminate();\n worker = null;\n };\n\n const rejectPending = (error: Error): void => {\n if (!pending) {\n return;\n }\n\n const current = pending;\n cleanupPending();\n current.reject(error);\n };\n\n const ensureWorker = (): Worker => {\n if (disposed) {\n throw new TaskWorkerError('The RPC worker has already been terminated.', 'TERMINATED');\n }\n\n if (worker) {\n return worker;\n }\n\n const instance = createWorkerInstance(scriptSource, options.name);\n instance.onmessage = (event: MessageEvent<WorkerResponse<unknown>>) => {\n const current = pending;\n if (!current) {\n return;\n }\n\n const message = event.data;\n if (!message || message.id !== current.id) {\n return;\n }\n\n cleanupPending();\n\n if (message.type === 'bq:error') {\n current.reject(restoreWorkerError(message.error));\n return;\n }\n\n current.resolve(message.result);\n };\n\n instance.onerror = (event: ErrorEvent) => {\n const error = new TaskWorkerError(event.message || 'Worker RPC execution failed.', 'WORKER');\n detachWorker();\n rejectPending(error);\n };\n\n worker = instance;\n return instance;\n };\n\n const resetAfterInterruptedRun = (error: Error): void => {\n detachWorker();\n rejectPending(error);\n };\n\n return {\n get busy(): boolean {\n return pending !== null;\n },\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return pending ? 'running' : 'idle';\n },\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n if (disposed) {\n return Promise.reject(\n new TaskWorkerError('The RPC worker has already been terminated.', 'TERMINATED')\n );\n }\n\n if (pending) {\n return Promise.reject(\n new TaskWorkerError(\n 'This RPC worker is already processing a request. Wait for the current call to finish or create another worker.',\n 'BUSY'\n )\n );\n }\n\n if (runOptions.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n const activeWorker = ensureWorker();\n const timeout = normalizeTimeout(runOptions.timeout) ?? defaultTimeout;\n const runId = nextRunId++;\n\n return new Promise<Awaited<ReturnType<TRoutes[TMethod]>>>((resolve, reject) => {\n const current: PendingRun<Awaited<ReturnType<TRoutes[TMethod]>>> = {\n id: runId,\n reject,\n resolve,\n };\n\n if (runOptions.signal) {\n current.abortHandler = () => {\n resetAfterInterruptedRun(new TaskWorkerAbortError());\n };\n pendingAbortSignal = runOptions.signal;\n runOptions.signal.addEventListener('abort', current.abortHandler, { once: true });\n }\n\n if (timeout !== undefined) {\n current.timeoutId = setTimeout(() => {\n resetAfterInterruptedRun(\n new TaskWorkerTimeoutError(`Worker RPC call exceeded the timeout of ${timeout}ms.`)\n );\n }, timeout);\n }\n\n pending = current as PendingRun<unknown>;\n\n try {\n activeWorker.postMessage(\n { id: runId, method, payload: input, type: WORKER_RPC_MESSAGE },\n runOptions.transfer ?? []\n );\n } catch (error) {\n detachWorker();\n rejectPending(\n new TaskWorkerSerializationError(\n 'Failed to serialize the RPC payload or transfer list for worker execution.',\n error\n )\n );\n }\n });\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n detachWorker();\n rejectPending(new TaskWorkerError('The RPC worker was terminated.', 'TERMINATED'));\n },\n };\n}\n\n/**\n * Executes a single named RPC method in a fresh worker and tears it down after\n * the response is received.\n *\n * @example\n * ```ts\n * import { callWorkerMethod } from '@bquery/bquery/concurrency';\n *\n * const total = await callWorkerMethod(\n * {\n * sum: ({ values }: { values: number[] }) =>\n * values.reduce((result, value) => result + value, 0),\n * },\n * 'sum',\n * { values: [1, 2, 3] }\n * );\n * ```\n */\nexport async function callWorkerMethod<\n TRoutes extends WorkerRpcHandlers,\n TMethod extends keyof TRoutes & string,\n>(\n handlers: TRoutes,\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n options: CallWorkerMethodOptions = {}\n): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n const worker = createRpcWorker(handlers, options);\n\n try {\n return await worker.call(method, input, options);\n } finally {\n worker.terminate();\n }\n}\n","/**\n * Zero-build worker task helpers.\n *\n * @module bquery/concurrency\n */\n\nimport {\n TaskWorkerAbortError,\n TaskWorkerError,\n TaskWorkerSerializationError,\n TaskWorkerTimeoutError,\n TaskWorkerUnsupportedError,\n} from './errors';\nimport {\n createWorkerInstance,\n normalizeTimeout,\n restoreWorkerError,\n validateTaskHandler,\n type SerializedWorkerError,\n} from './internal';\nimport { isConcurrencySupported } from './support';\nimport type {\n CreateTaskWorkerOptions,\n RunTaskOptions,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerTaskHandler,\n} from './types';\n\ninterface WorkerSuccessMessage<TResult> {\n id: number;\n result: TResult;\n type: 'bq:result';\n}\n\ninterface WorkerErrorMessage {\n error: SerializedWorkerError;\n id: number;\n type: 'bq:error';\n}\n\ntype WorkerResponse<TResult> = WorkerSuccessMessage<TResult> | WorkerErrorMessage;\n\ninterface PendingRun<TResult> {\n abortHandler?: () => void;\n id: number;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n timeoutId?: ReturnType<typeof setTimeout>;\n}\n\nconst WORKER_RUN_MESSAGE = 'bq:run';\n\nconst createWorkerScript = (handlerSource: string): string => {\n return `'use strict';\nconst serializeError = (error) => {\n if (error && typeof error === 'object') {\n return {\n code: typeof error.code === 'string' ? error.code : undefined,\n message: typeof error.message === 'string' ? error.message : 'Worker task failed.',\n name: typeof error.name === 'string' ? error.name : 'Error',\n stack: typeof error.stack === 'string' ? error.stack : undefined,\n };\n }\n\n return {\n message: typeof error === 'string' ? error : 'Worker task failed.',\n name: 'Error',\n };\n};\n\nconst handler = (${handlerSource});\n\nif (typeof handler !== 'function') {\n throw new TypeError('The worker task handler must evaluate to a function.');\n}\n\nself.onmessage = async (event) => {\n const message = event.data;\n if (!message || message.type !== '${WORKER_RUN_MESSAGE}') {\n return;\n }\n\n try {\n const result = await handler(message.payload);\n self.postMessage({ id: message.id, result, type: 'bq:result' });\n } catch (error) {\n self.postMessage({ error: serializeError(error), id: message.id, type: 'bq:error' });\n }\n};`;\n};\n\n/**\n * Creates a reusable worker task handle around a standalone function.\n *\n * @example\n * ```ts\n * import { createTaskWorker } from '@bquery/bquery/concurrency';\n *\n * const worker = createTaskWorker((value: number) => value * value, { name: 'square-worker' });\n * const result = await worker.run(12);\n * worker.terminate();\n * ```\n */\nexport function createTaskWorker<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskWorkerOptions = {}\n): TaskWorker<TInput, TResult> {\n if (!isConcurrencySupported()) {\n throw new TaskWorkerUnsupportedError();\n }\n\n const handlerSource = validateTaskHandler(handler);\n const scriptSource = createWorkerScript(handlerSource);\n const defaultTimeout = normalizeTimeout(options.timeout);\n let disposed = false;\n let worker: Worker | null = null;\n let pending: PendingRun<TResult> | null = null;\n let nextRunId = 0;\n\n const cleanupPending = (): void => {\n if (!pending) {\n return;\n }\n\n if (pending.timeoutId !== undefined) {\n clearTimeout(pending.timeoutId);\n }\n\n if (pending.abortHandler) {\n pendingAbortSignal?.removeEventListener('abort', pending.abortHandler);\n }\n\n pending = null;\n pendingAbortSignal = undefined;\n };\n\n let pendingAbortSignal: AbortSignal | undefined;\n\n const detachWorker = (): void => {\n if (!worker) {\n return;\n }\n\n worker.onmessage = null;\n worker.onerror = null;\n worker.terminate();\n worker = null;\n };\n\n const rejectPending = (error: Error): void => {\n if (!pending) {\n return;\n }\n\n const current = pending;\n cleanupPending();\n current.reject(error);\n };\n\n const ensureWorker = (): Worker => {\n if (disposed) {\n throw new TaskWorkerError('The task worker has already been terminated.', 'TERMINATED');\n }\n\n if (worker) {\n return worker;\n }\n\n const instance = createWorkerInstance(scriptSource, options.name);\n instance.onmessage = (event: MessageEvent<WorkerResponse<TResult>>) => {\n const current = pending;\n if (!current) {\n return;\n }\n\n const message = event.data;\n if (!message || message.id !== current.id) {\n return;\n }\n\n cleanupPending();\n\n if (message.type === 'bq:error') {\n current.reject(restoreWorkerError(message.error));\n return;\n }\n\n current.resolve(message.result);\n };\n\n instance.onerror = (event: ErrorEvent) => {\n const error = new TaskWorkerError(event.message || 'Worker execution failed.', 'WORKER');\n detachWorker();\n rejectPending(error);\n };\n\n worker = instance;\n return instance;\n };\n\n const resetAfterInterruptedRun = (error: Error): void => {\n detachWorker();\n rejectPending(error);\n };\n\n return {\n get busy(): boolean {\n return pending !== null;\n },\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return pending ? 'running' : 'idle';\n },\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n if (disposed) {\n return Promise.reject(\n new TaskWorkerError('The task worker has already been terminated.', 'TERMINATED')\n );\n }\n\n if (pending) {\n return Promise.reject(\n new TaskWorkerError(\n 'This task worker is already running a task. Create another worker or wait for the current task to finish.',\n 'BUSY'\n )\n );\n }\n\n if (runOptions.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n const activeWorker = ensureWorker();\n const timeout = normalizeTimeout(runOptions.timeout) ?? defaultTimeout;\n const runId = nextRunId++;\n\n return new Promise<TResult>((resolve, reject) => {\n const current: PendingRun<TResult> = {\n id: runId,\n reject,\n resolve,\n };\n\n if (runOptions.signal) {\n current.abortHandler = () => {\n resetAfterInterruptedRun(new TaskWorkerAbortError());\n };\n pendingAbortSignal = runOptions.signal;\n runOptions.signal.addEventListener('abort', current.abortHandler, { once: true });\n }\n\n if (timeout !== undefined) {\n current.timeoutId = setTimeout(() => {\n resetAfterInterruptedRun(\n new TaskWorkerTimeoutError(`Worker task exceeded the timeout of ${timeout}ms.`)\n );\n }, timeout);\n }\n\n pending = current;\n\n try {\n activeWorker.postMessage(\n { id: runId, payload: input, type: WORKER_RUN_MESSAGE },\n runOptions.transfer ?? []\n );\n } catch (error) {\n detachWorker();\n rejectPending(\n new TaskWorkerSerializationError(\n 'Failed to serialize the task input or transfer list for worker execution.',\n error\n )\n );\n }\n });\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n detachWorker();\n rejectPending(new TaskWorkerError('The task worker was terminated.', 'TERMINATED'));\n },\n };\n}\n\n/**\n * Executes a single task in a fresh worker and tears it down afterwards.\n *\n * @example\n * ```ts\n * import { runTask } from '@bquery/bquery/concurrency';\n *\n * const result = await runTask((value: number) => value * 2, 21);\n * ```\n */\nexport async function runTask<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n input: TInput,\n options: RunTaskOptions = {}\n): Promise<TResult> {\n const worker = createTaskWorker(handler, options);\n\n try {\n return await worker.run(input, options);\n } finally {\n worker.terminate();\n }\n}\n","/**\n * Worker pools with bounded concurrency and explicit queueing.\n *\n * @module bquery/concurrency\n */\n\nimport { TaskWorkerAbortError, TaskWorkerError } from './errors';\nimport { createRpcWorker } from './rpc';\nimport { createTaskWorker } from './task';\nimport type {\n CreateRpcPoolOptions,\n CreateTaskPoolOptions,\n RpcPool,\n RpcWorker,\n TaskPool,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerRpcHandlers,\n WorkerTaskHandler,\n} from './types';\n\nconst DEFAULT_POOL_CONCURRENCY = 4;\n\ninterface QueueEntry<TJob, TResult> {\n abortHandler?: () => void;\n job: TJob;\n options: TaskRunOptions;\n reject: (reason?: unknown) => void;\n resolve: (value: TResult | PromiseLike<TResult>) => void;\n signal?: AbortSignal;\n}\n\ninterface PoolRuntime<TJob, TResult> {\n readonly state: TaskWorkerState;\n readonly busy: boolean;\n readonly concurrency: number;\n readonly pending: number;\n readonly size: number;\n enqueue(job: TJob, options?: TaskRunOptions): Promise<TResult>;\n clear(): void;\n terminate(): void;\n}\n\ninterface CreatePoolRuntimeOptions<TWorker extends { busy: boolean }, TJob, TResult> {\n abortedWhileQueuedMessage: string;\n clearMessage: string;\n concurrency: number;\n createWorkers: (concurrency: number) => TWorker[];\n queueFullMessage: string;\n terminatedMessage: string;\n workerTerminatedMessage: string;\n runWorker: (worker: TWorker, job: TJob, options: TaskRunOptions) => Promise<TResult>;\n maxQueue: number;\n}\n\nconst normalizeConcurrency = (concurrency: number | undefined, label: string): number => {\n if (concurrency === undefined) {\n return DEFAULT_POOL_CONCURRENCY;\n }\n\n if (!Number.isInteger(concurrency) || concurrency < 1) {\n throw new RangeError(`${label} concurrency must be a positive integer.`);\n }\n\n return concurrency;\n};\n\nconst normalizeMaxQueue = (maxQueue: number | undefined, label: string): number => {\n if (maxQueue === undefined) {\n return Number.POSITIVE_INFINITY;\n }\n\n if (maxQueue === Number.POSITIVE_INFINITY) {\n return maxQueue;\n }\n\n if (!Number.isInteger(maxQueue) || maxQueue < 0) {\n throw new RangeError(`${label} maxQueue must be a non-negative integer or Infinity.`);\n }\n\n return maxQueue;\n};\n\nconst detachAbortListener = <TJob, TResult>(entry: QueueEntry<TJob, TResult>): void => {\n if (entry.abortHandler && entry.signal) {\n entry.signal.removeEventListener('abort', entry.abortHandler);\n }\n\n entry.abortHandler = undefined;\n entry.signal = undefined;\n};\n\nconst createPoolRuntime = <TWorker extends { busy: boolean }, TJob, TResult>({\n abortedWhileQueuedMessage,\n clearMessage,\n concurrency,\n createWorkers,\n queueFullMessage,\n terminatedMessage,\n workerTerminatedMessage,\n runWorker,\n maxQueue,\n}: CreatePoolRuntimeOptions<TWorker, TJob, TResult>): PoolRuntime<TJob, TResult> => {\n const queue: Array<QueueEntry<TJob, TResult>> = [];\n const workers = createWorkers(concurrency);\n let disposed = false;\n let running = 0;\n\n const drain = (): void => {\n if (disposed || queue.length === 0) {\n return;\n }\n\n for (const worker of workers) {\n if (queue.length === 0) {\n return;\n }\n\n if (worker.busy) {\n continue;\n }\n\n const entry = queue.shift()!;\n if (entry.signal?.aborted) {\n detachAbortListener(entry);\n entry.reject(new TaskWorkerAbortError(abortedWhileQueuedMessage));\n continue;\n }\n\n detachAbortListener(entry);\n running++;\n void runWorker(worker, entry.job, entry.options)\n .then(entry.resolve, entry.reject)\n .finally(() => {\n running--;\n drain();\n });\n }\n };\n\n const rejectQueued = (error: TaskWorkerError): void => {\n const queued = queue.splice(0);\n for (const entry of queued) {\n detachAbortListener(entry);\n entry.reject(error);\n }\n };\n\n return {\n get state(): TaskWorkerState {\n if (disposed) {\n return 'terminated';\n }\n\n return running > 0 || queue.length > 0 ? 'running' : 'idle';\n },\n get busy(): boolean {\n return running > 0 || queue.length > 0;\n },\n concurrency,\n get pending(): number {\n return running;\n },\n get size(): number {\n return queue.length;\n },\n enqueue(job: TJob, options: TaskRunOptions = {}): Promise<TResult> {\n if (disposed) {\n return Promise.reject(new TaskWorkerError(workerTerminatedMessage, 'TERMINATED'));\n }\n\n if (options.signal?.aborted) {\n return Promise.reject(new TaskWorkerAbortError());\n }\n\n return new Promise<TResult>((resolve, reject) => {\n const entry: QueueEntry<TJob, TResult> = {\n job,\n options,\n reject,\n resolve,\n };\n\n const idleWorker = workers.find((worker) => !worker.busy);\n if (idleWorker) {\n running++;\n void runWorker(idleWorker, job, options)\n .then(resolve, reject)\n .finally(() => {\n running--;\n drain();\n });\n return;\n }\n\n if (queue.length >= maxQueue) {\n reject(new TaskWorkerError(queueFullMessage, 'QUEUE_FULL'));\n return;\n }\n\n if (options.signal) {\n entry.signal = options.signal;\n entry.abortHandler = () => {\n const index = queue.indexOf(entry);\n if (index === -1) {\n return;\n }\n\n queue.splice(index, 1);\n detachAbortListener(entry);\n reject(new TaskWorkerAbortError(abortedWhileQueuedMessage));\n };\n options.signal.addEventListener('abort', entry.abortHandler, { once: true });\n }\n\n queue.push(entry);\n });\n },\n clear(): void {\n if (disposed || queue.length === 0) {\n return;\n }\n\n rejectQueued(new TaskWorkerError(clearMessage, 'QUEUE_CLEARED'));\n },\n terminate(): void {\n if (disposed) {\n return;\n }\n\n disposed = true;\n rejectQueued(new TaskWorkerError(terminatedMessage, 'TERMINATED'));\n for (const worker of workers) {\n if ('terminate' in worker && typeof worker.terminate === 'function') {\n worker.terminate();\n }\n }\n },\n };\n};\n\nconst createWorkerNames = (\n name: string | undefined,\n concurrency: number\n): Array<string | undefined> => {\n if (!name) {\n return Array.from({ length: concurrency }, () => undefined);\n }\n\n if (concurrency === 1) {\n return [name];\n }\n\n return Array.from({ length: concurrency }, (_, index) => `${name}-${index + 1}`);\n};\n\n/**\n * Creates a reusable pool of task workers with bounded concurrency and FIFO queueing.\n *\n * @example\n * ```ts\n * import { createTaskPool } from '@bquery/bquery/concurrency';\n *\n * const pool = createTaskPool(\n * ({ value }: { value: number }) => value * 2,\n * { concurrency: 4, maxQueue: 16, name: 'double-pool' }\n * );\n *\n * const results = await Promise.all([\n * pool.run({ value: 1 }),\n * pool.run({ value: 2 }),\n * pool.run({ value: 3 }),\n * ]);\n *\n * pool.terminate();\n * ```\n */\nexport function createTaskPool<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskPoolOptions = {}\n): TaskPool<TInput, TResult> {\n const { concurrency: concurrencyOption, maxQueue: maxQueueOption, ...workerOptions } = options;\n const concurrency = normalizeConcurrency(concurrencyOption, 'Task pool');\n const maxQueue = normalizeMaxQueue(maxQueueOption, 'Task pool');\n\n const runtime = createPoolRuntime<TaskWorker<TInput, TResult>, TInput, TResult>({\n abortedWhileQueuedMessage: 'The queued task was aborted before execution started.',\n clearMessage: 'The task pool queue was cleared.',\n concurrency,\n createWorkers(poolConcurrency) {\n const workers: Array<TaskWorker<TInput, TResult>> = [];\n const names = createWorkerNames(workerOptions.name, poolConcurrency);\n\n try {\n for (let index = 0; index < poolConcurrency; index++) {\n workers.push(\n createTaskWorker(handler, {\n ...workerOptions,\n name: names[index],\n })\n );\n }\n } catch (error) {\n for (const worker of workers) {\n worker.terminate();\n }\n throw error;\n }\n\n return workers;\n },\n queueFullMessage:\n 'The task pool queue is full. Increase maxQueue, wait for pending tasks, or raise pool concurrency.',\n terminatedMessage: 'The task pool was terminated.',\n workerTerminatedMessage: 'The task pool has already been terminated.',\n runWorker(worker, job, runOptions) {\n return worker.run(job, runOptions);\n },\n maxQueue,\n });\n\n return {\n get state(): TaskWorkerState {\n return runtime.state;\n },\n get busy(): boolean {\n return runtime.busy;\n },\n get concurrency(): number {\n return runtime.concurrency;\n },\n get pending(): number {\n return runtime.pending;\n },\n get size(): number {\n return runtime.size;\n },\n run(input: TInput, runOptions?: TaskRunOptions): Promise<TResult> {\n return runtime.enqueue(input, runOptions);\n },\n clear(): void {\n runtime.clear();\n },\n terminate(): void {\n runtime.terminate();\n },\n };\n}\n\n/**\n * Creates a reusable pool of RPC workers with bounded concurrency and FIFO queueing.\n *\n * @example\n * ```ts\n * import { createRpcPool } from '@bquery/bquery/concurrency';\n *\n * const pool = createRpcPool(\n * {\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * },\n * { concurrency: 2, maxQueue: 8 }\n * );\n *\n * const total = await pool.call('sum', { values: [1, 2, 3] });\n * pool.terminate();\n * ```\n */\nexport function createRpcPool<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcPoolOptions = {}\n): RpcPool<TRoutes> {\n const { concurrency: concurrencyOption, maxQueue: maxQueueOption, ...workerOptions } = options;\n const concurrency = normalizeConcurrency(concurrencyOption, 'RPC pool');\n const maxQueue = normalizeMaxQueue(maxQueueOption, 'RPC pool');\n\n type RpcJob = {\n input: unknown;\n method: keyof TRoutes & string;\n };\n\n const runtime = createPoolRuntime<RpcWorker<TRoutes>, RpcJob, unknown>({\n abortedWhileQueuedMessage: 'The queued RPC call was aborted before execution started.',\n clearMessage: 'The RPC pool queue was cleared.',\n concurrency,\n createWorkers(poolConcurrency) {\n const workers: Array<RpcWorker<TRoutes>> = [];\n const names = createWorkerNames(workerOptions.name, poolConcurrency);\n\n try {\n for (let index = 0; index < poolConcurrency; index++) {\n workers.push(\n createRpcWorker(handlers, {\n ...workerOptions,\n name: names[index],\n })\n );\n }\n } catch (error) {\n for (const worker of workers) {\n worker.terminate();\n }\n throw error;\n }\n\n return workers;\n },\n queueFullMessage:\n 'The RPC pool queue is full. Increase maxQueue, wait for pending calls, or raise pool concurrency.',\n terminatedMessage: 'The RPC pool was terminated.',\n workerTerminatedMessage: 'The RPC pool has already been terminated.',\n runWorker(worker, job, runOptions) {\n return worker.call(job.method, job.input as never, runOptions);\n },\n maxQueue,\n });\n\n return {\n get state(): TaskWorkerState {\n return runtime.state;\n },\n get busy(): boolean {\n return runtime.busy;\n },\n get concurrency(): number {\n return runtime.concurrency;\n },\n get pending(): number {\n return runtime.pending;\n },\n get size(): number {\n return runtime.size;\n },\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions?: TaskRunOptions\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return runtime.enqueue({ input, method }, runOptions) as Promise<\n Awaited<ReturnType<TRoutes[TMethod]>>\n >;\n },\n clear(): void {\n runtime.clear();\n },\n terminate(): void {\n runtime.terminate();\n },\n };\n}\n","/**\n * Thin high-level helpers layered on top of the explicit worker primitives.\n *\n * @module bquery/concurrency\n */\n\nimport { createTaskPool } from './pool';\nimport { runTask } from './task';\nimport { validateTaskHandler } from './internal';\nimport type {\n ParallelCollectionOptions,\n ParallelMapHandler,\n ParallelMapOptions,\n ParallelOptions,\n ParallelPredicateHandler,\n ParallelReduceHandler,\n ParallelResults,\n ParallelTask,\n TaskPool,\n TaskRunOptions,\n WorkerTaskHandler,\n} from './types';\n\ninterface SerializedParallelTask {\n handlerSource: string;\n input: unknown;\n}\n\ninterface SerializedChunk<TInput = unknown> {\n items: Array<{\n index: number;\n value: TInput;\n }>;\n handlerSource: string;\n}\n\ninterface IndexedMapResult<TResult> {\n index: number;\n value: TResult;\n}\n\nconst executeSerializedTask = async (job: SerializedParallelTask): Promise<unknown> => {\n const revive = new Function(`return (${job.handlerSource});`);\n const handler = revive() as ((input: unknown) => unknown | Promise<unknown>) | undefined;\n\n if (typeof handler !== 'function') {\n throw new TypeError('The serialized task handler did not revive as a function.');\n }\n\n return await handler(job.input);\n};\n\ninterface SerializedReduceJob<TInput = unknown, TAccumulator = unknown> {\n initialValue: TAccumulator;\n reducerSource: string;\n values: readonly TInput[];\n}\n\nconst executeSerializedChunk = async (\n job: SerializedChunk\n): Promise<Array<IndexedMapResult<unknown>>> => {\n const revive = new Function(`return (${job.handlerSource});`);\n const handler = revive() as\n | ((value: unknown, index: number) => unknown | Promise<unknown>)\n | undefined;\n\n if (typeof handler !== 'function') {\n throw new TypeError('The serialized collection handler did not revive as a function.');\n }\n\n const results: Array<IndexedMapResult<unknown>> = [];\n for (const item of job.items) {\n results.push({\n index: item.index,\n value: await handler(item.value, item.index),\n });\n }\n\n return results;\n};\n\nconst executeSerializedReduce = async (job: SerializedReduceJob): Promise<unknown> => {\n const revive = new Function(`return (${job.reducerSource});`);\n const reducer = revive() as\n | ((accumulator: unknown, value: unknown, index: number) => unknown | Promise<unknown>)\n | undefined;\n\n if (typeof reducer !== 'function') {\n throw new TypeError('The serialized reducer did not revive as a function.');\n }\n\n let accumulator = job.initialValue;\n for (let index = 0; index < job.values.length; index++) {\n accumulator = await reducer(accumulator, job.values[index], index);\n }\n\n return accumulator;\n};\n\nconst normalizeBatchSize = (batchSize: number | undefined, label: string): number => {\n if (batchSize === undefined) {\n return 1;\n }\n\n if (!Number.isInteger(batchSize) || batchSize < 1) {\n throw new RangeError(`${label} batchSize must be a positive integer.`);\n }\n\n return batchSize;\n};\n\nconst createSerializedTaskPool = (\n options: ParallelOptions\n): TaskPool<SerializedParallelTask, unknown> => {\n return createTaskPool(executeSerializedTask, options);\n};\n\nconst serializeTask = <TInput, TResult>(\n task: ParallelTask<TInput, TResult>\n): SerializedParallelTask => ({\n handlerSource: validateTaskHandler(task.handler),\n input: task.input,\n});\n\nconst runChunkedHandler = async <TInput, TResult>(\n values: readonly TInput[],\n handler: (value: TInput, index: number) => TResult | Promise<TResult>,\n options: ParallelCollectionOptions = {},\n label: string\n): Promise<TResult[]> => {\n if (values.length === 0) {\n return [];\n }\n\n const handlerSource = validateTaskHandler(\n handler as unknown as WorkerTaskHandler<TInput, TResult>\n );\n const { batchSize, signal, ...poolOptions } = options;\n const normalizedBatchSize = normalizeBatchSize(batchSize, label);\n const pool = createTaskPool(executeSerializedChunk, poolOptions);\n const chunks: Array<SerializedChunk<TInput>> = [];\n\n for (let index = 0; index < values.length; index += normalizedBatchSize) {\n const end = Math.min(index + normalizedBatchSize, values.length);\n const items: SerializedChunk<TInput>['items'] = [];\n\n for (let itemIndex = index; itemIndex < end; itemIndex += 1) {\n items.push({\n index: itemIndex,\n value: values[itemIndex],\n });\n }\n\n chunks.push({ items, handlerSource });\n }\n\n try {\n const chunkResults = await Promise.all(\n chunks.map((chunk) => pool.run(chunk, signal ? { signal } : undefined))\n );\n const mapped = new Array<TResult>(values.length);\n\n for (const chunk of chunkResults) {\n for (const item of chunk) {\n mapped[item.index] = item.value as TResult;\n }\n }\n\n return mapped;\n } finally {\n pool.terminate();\n }\n};\n\n/**\n * Executes multiple standalone tasks in parallel using a bounded worker pool.\n *\n * @example\n * ```ts\n * import { parallel } from '@bquery/bquery/concurrency';\n *\n * const results = await parallel([\n * { handler: (value: number) => value * 2, input: 5 },\n * { handler: ({ a, b }: { a: number; b: number }) => a + b, input: { a: 1, b: 2 } },\n * ]);\n * ```\n */\nexport async function parallel<TTasks extends readonly ParallelTask[]>(\n tasks: TTasks,\n options: ParallelOptions = {}\n): Promise<ParallelResults<TTasks>> {\n if (tasks.length === 0) {\n return [] as unknown as ParallelResults<TTasks>;\n }\n\n const pool = createSerializedTaskPool(options);\n\n try {\n const results = await Promise.all(\n tasks.map((task) => pool.run(serializeTask(task), task.options))\n );\n return results as ParallelResults<TTasks>;\n } finally {\n pool.terminate();\n }\n}\n\n/**\n * Executes tasks in sequential batches while each batch still uses parallel workers.\n *\n * This adapts `threadts-universal`'s batch helper to bQuery without colliding\n * with the reactive module's existing `batch()` export.\n *\n * @example\n * ```ts\n * import { batchTasks } from '@bquery/bquery/concurrency';\n *\n * const results = await batchTasks(\n * [\n * { handler: (value: number) => value * 2, input: 1 },\n * { handler: (value: number) => value * 2, input: 2 },\n * { handler: (value: number) => value * 2, input: 3 },\n * ],\n * 2\n * );\n * ```\n */\nexport async function batchTasks<TTasks extends readonly ParallelTask[]>(\n tasks: TTasks,\n batchSize?: number,\n options: ParallelOptions = {}\n): Promise<ParallelResults<TTasks>> {\n if (tasks.length === 0) {\n return [] as unknown as ParallelResults<TTasks>;\n }\n\n const normalizedBatchSize = normalizeBatchSize(batchSize, 'batchTasks');\n const pool = createSerializedTaskPool(options);\n const results: unknown[] = [];\n\n try {\n for (let index = 0; index < tasks.length; index += normalizedBatchSize) {\n const batch = tasks.slice(index, index + normalizedBatchSize);\n const batchResults = await Promise.all(\n batch.map((task) => pool.run(serializeTask(task), task.options))\n );\n results.push(...batchResults);\n }\n\n return results as ParallelResults<TTasks>;\n } finally {\n pool.terminate();\n }\n}\n\n/**\n * Maps an array in parallel using optional chunking on top of `createTaskPool()`.\n *\n * @example\n * ```ts\n * import { map } from '@bquery/bquery/concurrency';\n *\n * const results = await map([1, 2, 3], (value, index) => value + index, {\n * batchSize: 2,\n * concurrency: 2,\n * });\n * ```\n */\nexport async function map<TInput, TResult>(\n values: readonly TInput[],\n mapper: ParallelMapHandler<TInput, TResult>,\n options: ParallelMapOptions = {}\n): Promise<TResult[]> {\n return runChunkedHandler(values, mapper, options, 'map');\n}\n\n/**\n * Filters an array in parallel using a standalone predicate with optional chunking.\n */\nexport async function filter<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<TInput[]> {\n const matches = await runChunkedHandler(values, predicate, options, 'filter');\n const filtered: TInput[] = [];\n\n for (let index = 0; index < values.length; index += 1) {\n if (!matches[index]) {\n continue;\n }\n\n if (index in values) {\n filtered.push(values[index] as TInput);\n } else {\n filtered.length += 1;\n }\n }\n\n return filtered;\n}\n\n/**\n * Returns whether at least one array item matches a standalone predicate.\n *\n * The current implementation evaluates predicate chunks explicitly and reduces\n * the final boolean result on the main thread instead of using hidden globals\n * or speculative worker cancellation.\n */\nexport async function some<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<boolean> {\n if (values.length === 0) {\n return false;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'some');\n return matches.some(Boolean);\n}\n\n/**\n * Returns whether every array item matches a standalone predicate.\n *\n * The current implementation evaluates predicate chunks explicitly and reduces\n * the final boolean result on the main thread instead of using hidden globals\n * or speculative worker cancellation.\n */\nexport async function every<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<boolean> {\n if (values.length === 0) {\n return true;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'every');\n return matches.every(Boolean);\n}\n\n/**\n * Finds the first array item that matches a standalone predicate.\n */\nexport async function find<TInput>(\n values: readonly TInput[],\n predicate: ParallelPredicateHandler<TInput>,\n options: ParallelCollectionOptions = {}\n): Promise<TInput | undefined> {\n if (values.length === 0) {\n return undefined;\n }\n\n const matches = await runChunkedHandler(values, predicate, options, 'find');\n const index = matches.findIndex(Boolean);\n return index === -1 ? undefined : values[index];\n}\n\n/**\n * Reduces an array inside one isolated worker while preserving standard\n * left-to-right accumulator semantics.\n */\nexport async function reduce<TInput, TAccumulator>(\n values: readonly TInput[],\n reducer: ParallelReduceHandler<TAccumulator, TInput>,\n initialValue: TAccumulator,\n options: TaskRunOptions = {}\n): Promise<TAccumulator> {\n if (values.length === 0) {\n return initialValue;\n }\n\n const reducerSource = validateTaskHandler(\n reducer as unknown as WorkerTaskHandler<unknown, unknown>\n );\n\n return runTask(\n executeSerializedReduce,\n {\n initialValue,\n reducerSource,\n values,\n },\n options\n ) as Promise<TAccumulator>;\n}\n","/**\n * Optional fluent pipeline helpers layered on top of the explicit collection helpers.\n *\n * @module bquery/concurrency\n */\n\nimport { every, filter, find, map, reduce, some } from './high-level';\nimport type {\n ConcurrencyPipeline,\n ConcurrencyPipelineOptions,\n ParallelCollectionOptions,\n ParallelMapHandler,\n ParallelPredicateHandler,\n ParallelReduceHandler,\n TaskRunOptions,\n} from './types';\n\nconst mergeCollectionOptions = (\n defaults: ConcurrencyPipelineOptions,\n overrides: ParallelCollectionOptions = {}\n): ParallelCollectionOptions => ({\n ...defaults,\n ...overrides,\n});\n\nconst mergeTaskRunOptions = (\n defaults: ConcurrencyPipelineOptions,\n overrides: TaskRunOptions = {}\n): TaskRunOptions => ({\n signal: 'signal' in overrides ? overrides.signal : defaults.signal,\n timeout: 'timeout' in overrides ? overrides.timeout : defaults.timeout,\n transfer: overrides.transfer,\n});\n\nclass FluentConcurrencyPipeline<TValue> implements ConcurrencyPipeline<TValue> {\n constructor(\n private readonly valuesPromise: Promise<readonly TValue[]>,\n private readonly defaults: ConcurrencyPipelineOptions\n ) {}\n\n private createNext<TNext>(\n transform: (values: readonly TValue[]) => Promise<readonly TNext[]>\n ): ConcurrencyPipeline<TNext> {\n return new FluentConcurrencyPipeline(\n this.valuesPromise.then((values) => transform(values)),\n this.defaults\n );\n }\n\n map<TResult>(\n mapper: ParallelMapHandler<TValue, TResult>,\n options?: ParallelCollectionOptions\n ): ConcurrencyPipeline<TResult> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.createNext((values) => map(values, mapper, resolvedOptions));\n }\n\n filter(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): ConcurrencyPipeline<TValue> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.createNext((values) => filter(values, predicate, resolvedOptions));\n }\n\n toArray(): Promise<TValue[]> {\n return this.valuesPromise.then((values) => values.slice());\n }\n\n some(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<boolean> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => some(values, predicate, resolvedOptions));\n }\n\n every(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<boolean> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => every(values, predicate, resolvedOptions));\n }\n\n find(\n predicate: ParallelPredicateHandler<TValue>,\n options?: ParallelCollectionOptions\n ): Promise<TValue | undefined> {\n const resolvedOptions = mergeCollectionOptions(this.defaults, options);\n return this.valuesPromise.then((values) => find(values, predicate, resolvedOptions));\n }\n\n reduce<TAccumulator>(\n reducer: ParallelReduceHandler<TAccumulator, TValue>,\n initialValue: TAccumulator,\n options?: TaskRunOptions\n ): Promise<TAccumulator> {\n const resolvedOptions = mergeTaskRunOptions(this.defaults, options);\n return this.valuesPromise.then((values) =>\n reduce(values, reducer, initialValue, resolvedOptions)\n );\n }\n}\n\n/**\n * Creates an optional fluent pipeline over the existing concurrency collection helpers.\n *\n * The pipeline itself does not create hidden global workers or proxies. Each stage\n * delegates to the already explicit `map()`, `filter()`, `some()`, `every()`,\n * `find()`, and `reduce()` helpers when the pipeline is executed.\n *\n * @example\n * ```ts\n * import { pipeline } from '@bquery/bquery/concurrency';\n *\n * const results = await pipeline([1, 2, 3, 4], {\n * batchSize: 2,\n * concurrency: 2,\n * })\n * .map((value) => value * 2)\n * .filter((value) => value > 4)\n * .toArray();\n *\n * console.log(results); // [6, 8]\n * ```\n */\nexport function pipeline<TValue>(\n values: readonly TValue[],\n options: ConcurrencyPipelineOptions = {}\n): ConcurrencyPipeline<TValue> {\n return new FluentConcurrencyPipeline(Promise.resolve(values.slice()), options);\n}\n","/**\n * Reactive wrappers around reusable concurrency primitives.\n *\n * @module bquery/concurrency\n */\n\nimport { batch } from '../reactive/batch';\nimport { signal, type Signal } from '../reactive/core';\nimport { readonly } from '../reactive/readonly';\nimport { createRpcPool, createTaskPool } from './pool';\nimport { createRpcWorker } from './rpc';\nimport { createTaskWorker } from './task';\nimport type {\n CreateRpcPoolOptions,\n CreateRpcWorkerOptions,\n CreateTaskPoolOptions,\n CreateTaskWorkerOptions,\n ReactiveRpcPool,\n ReactiveRpcWorker,\n ReactiveTaskPool,\n ReactiveTaskWorker,\n TaskPool,\n TaskRunOptions,\n TaskWorker,\n TaskWorkerState,\n WorkerRpcHandlers,\n WorkerTaskHandler,\n} from './types';\n\ninterface WorkerSignalMirror {\n busy: Signal<boolean>;\n state: Signal<TaskWorkerState>;\n}\n\ninterface PoolSignalMirror extends WorkerSignalMirror {\n concurrency: Signal<number>;\n pending: Signal<number>;\n size: Signal<number>;\n}\n\ntype WorkerStateSource = Pick<TaskWorker<unknown, unknown>, 'busy' | 'state'>;\ntype PoolStateSource = Pick<\n TaskPool<unknown, unknown>,\n 'busy' | 'concurrency' | 'pending' | 'size' | 'state'\n>;\n\nconst syncWorkerSignals = (source: WorkerStateSource, mirror: WorkerSignalMirror): void => {\n batch(() => {\n mirror.state.value = source.state;\n mirror.busy.value = source.busy;\n });\n};\n\nconst syncPoolSignals = (source: PoolStateSource, mirror: PoolSignalMirror): void => {\n batch(() => {\n mirror.state.value = source.state;\n mirror.busy.value = source.busy;\n mirror.concurrency.value = source.concurrency;\n mirror.pending.value = source.pending;\n mirror.size.value = source.size;\n });\n};\n\nconst createWorkerSignalMirror = (source: WorkerStateSource): WorkerSignalMirror => {\n return {\n busy: signal(source.busy),\n state: signal(source.state),\n };\n};\n\nconst createPoolSignalMirror = (source: PoolStateSource): PoolSignalMirror => {\n return {\n busy: signal(source.busy),\n concurrency: signal(source.concurrency),\n pending: signal(source.pending),\n size: signal(source.size),\n state: signal(source.state),\n };\n};\n\nconst attachRunSync = <TResult>(run: Promise<TResult>, sync: () => void): Promise<TResult> => {\n sync();\n return run.finally(() => {\n sync();\n queueMicrotask(sync);\n });\n};\n\n/**\n * Creates a reactive wrapper around a reusable task worker.\n *\n * The returned wrapper preserves the standard `run()` / `terminate()` API and\n * adds readonly signals such as `state$` and `busy$` for UI bindings.\n *\n * @example\n * ```ts\n * import { createReactiveTaskWorker } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const worker = createReactiveTaskWorker((value: number) => value * 2);\n *\n * effect(() => {\n * console.log(worker.state$.value, worker.busy$.value);\n * });\n *\n * await worker.run(21);\n * worker.terminate();\n * ```\n */\nexport function createReactiveTaskWorker<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskWorkerOptions = {}\n): ReactiveTaskWorker<TInput, TResult> {\n const worker = createTaskWorker(handler, options);\n const mirror = createWorkerSignalMirror(worker as WorkerStateSource);\n const sync = (): void => {\n syncWorkerSignals(worker as WorkerStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return worker.busy;\n },\n get state(): TaskWorkerState {\n return worker.state;\n },\n busy$: readonly(mirror.busy),\n state$: readonly(mirror.state),\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n return attachRunSync(worker.run(input, runOptions), sync);\n },\n terminate(): void {\n worker.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable RPC worker.\n *\n * The returned wrapper preserves the standard `call()` / `terminate()` API and\n * adds readonly signals such as `state$` and `busy$` for UI bindings.\n *\n * @example\n * ```ts\n * import { createReactiveRpcWorker } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const rpc = createReactiveRpcWorker({\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * });\n *\n * effect(() => {\n * console.log(rpc.state$.value, rpc.busy$.value);\n * });\n *\n * await rpc.call('sum', { values: [1, 2, 3] });\n * rpc.terminate();\n * ```\n */\nexport function createReactiveRpcWorker<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcWorkerOptions = {}\n): ReactiveRpcWorker<TRoutes> {\n const worker = createRpcWorker(handlers, options);\n const mirror = createWorkerSignalMirror(worker as WorkerStateSource);\n const sync = (): void => {\n syncWorkerSignals(worker as WorkerStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return worker.busy;\n },\n get state(): TaskWorkerState {\n return worker.state;\n },\n busy$: readonly(mirror.busy),\n state$: readonly(mirror.state),\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return attachRunSync(worker.call(method, input, runOptions), sync);\n },\n terminate(): void {\n worker.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable task pool.\n *\n * The returned wrapper preserves the standard `run()` / `clear()` /\n * `terminate()` API and adds readonly signals for pool state and queue load.\n *\n * @example\n * ```ts\n * import { createReactiveTaskPool } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const pool = createReactiveTaskPool((value: number) => value * 2, { concurrency: 2 });\n *\n * effect(() => {\n * console.log(pool.pending$.value, pool.size$.value, pool.state$.value);\n * });\n *\n * await Promise.all([pool.run(1), pool.run(2), pool.run(3)]);\n * pool.terminate();\n * ```\n */\nexport function createReactiveTaskPool<TInput = void, TResult = unknown>(\n handler: WorkerTaskHandler<TInput, TResult>,\n options: CreateTaskPoolOptions = {}\n): ReactiveTaskPool<TInput, TResult> {\n const pool = createTaskPool(handler, options);\n const mirror = createPoolSignalMirror(pool as PoolStateSource);\n const sync = (): void => {\n syncPoolSignals(pool as PoolStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return pool.busy;\n },\n get concurrency(): number {\n return pool.concurrency;\n },\n get pending(): number {\n return pool.pending;\n },\n get size(): number {\n return pool.size;\n },\n get state(): TaskWorkerState {\n return pool.state;\n },\n busy$: readonly(mirror.busy),\n concurrency$: readonly(mirror.concurrency),\n pending$: readonly(mirror.pending),\n size$: readonly(mirror.size),\n state$: readonly(mirror.state),\n run(input: TInput, runOptions: TaskRunOptions = {}): Promise<TResult> {\n return attachRunSync(pool.run(input, runOptions), sync);\n },\n clear(): void {\n pool.clear();\n sync();\n },\n terminate(): void {\n pool.terminate();\n sync();\n },\n };\n}\n\n/**\n * Creates a reactive wrapper around a reusable RPC pool.\n *\n * The returned wrapper preserves the standard `call()` / `clear()` /\n * `terminate()` API and adds readonly signals for pool state and queue load.\n *\n * @example\n * ```ts\n * import { createReactiveRpcPool } from '@bquery/bquery/concurrency';\n * import { effect } from '@bquery/bquery/reactive';\n *\n * const pool = createReactiveRpcPool(\n * {\n * sum: ({ values }: { values: number[] }) => values.reduce((total, value) => total + value, 0),\n * },\n * { concurrency: 2 }\n * );\n *\n * effect(() => {\n * console.log(pool.pending$.value, pool.size$.value, pool.state$.value);\n * });\n *\n * await Promise.all([\n * pool.call('sum', { values: [1, 2] }),\n * pool.call('sum', { values: [3, 4] }),\n * pool.call('sum', { values: [5, 6] }),\n * ]);\n *\n * pool.terminate();\n * ```\n */\nexport function createReactiveRpcPool<TRoutes extends WorkerRpcHandlers>(\n handlers: TRoutes,\n options: CreateRpcPoolOptions = {}\n): ReactiveRpcPool<TRoutes> {\n const pool = createRpcPool(handlers, options);\n const mirror = createPoolSignalMirror(pool as PoolStateSource);\n const sync = (): void => {\n syncPoolSignals(pool as PoolStateSource, mirror);\n };\n\n return {\n get busy(): boolean {\n return pool.busy;\n },\n get concurrency(): number {\n return pool.concurrency;\n },\n get pending(): number {\n return pool.pending;\n },\n get size(): number {\n return pool.size;\n },\n get state(): TaskWorkerState {\n return pool.state;\n },\n busy$: readonly(mirror.busy),\n concurrency$: readonly(mirror.concurrency),\n pending$: readonly(mirror.pending),\n size$: readonly(mirror.size),\n state$: readonly(mirror.state),\n call<TMethod extends keyof TRoutes & string>(\n method: TMethod,\n input: Parameters<TRoutes[TMethod]>[0],\n runOptions: TaskRunOptions = {}\n ): Promise<Awaited<ReturnType<TRoutes[TMethod]>>> {\n return attachRunSync(pool.call(method, input, runOptions), sync);\n },\n clear(): void {\n pool.clear();\n sync();\n },\n terminate(): void {\n pool.terminate();\n sync();\n },\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { C as a, E as e, S as s, T as o, _ as t, a as c, b as k, c as p, d as i, f as l, g as T, h as n, i as W, l as u, m as R, n as d, o as m, p as v, r as E, s as f, t as y, u as P, v as S, w as b, x as h, y as C } from "./concurrency-BU1wPEsZ.js";
1
+ import { C as a, E as e, S as s, T as o, _ as t, a as c, b as k, c as p, d as i, f as l, g as T, h as n, i as W, l as u, m as R, n as d, o as m, p as v, r as E, s as f, t as y, u as P, v as S, w as b, x as h, y as C } from "./concurrency-kycgAZvW.js";
2
2
  export {
3
3
  s as TaskWorkerAbortError,
4
4
  a as TaskWorkerError,
@@ -37,4 +37,4 @@ export {
37
37
  d as t
38
38
  };
39
39
 
40
- //# sourceMappingURL=config-DhT9auRm.js.map
40
+ //# sourceMappingURL=config-BP7KwiR5.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-DhT9auRm.js","names":[],"sources":["../src/platform/config.ts"],"sourcesContent":["/**\n * Global bQuery configuration helpers.\n *\n * @module bquery/platform\n */\n\nimport { isPlainObject, merge } from '../core/utils/object';\n\n/** Supported response parsing strategies for fetch composables. */\nexport type BqueryFetchParseAs = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData' | 'response';\n\n/** Global fetch defaults used by useFetch(). */\nexport interface BqueryFetchConfig {\n /** Optional base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default request headers. */\n headers?: HeadersInit;\n /** Default response parser. */\n parseAs?: BqueryFetchParseAs;\n}\n\n/** Global cookie defaults used by useCookie(). */\nexport interface BqueryCookieConfig {\n /** Default cookie path. */\n path?: string;\n /** Default SameSite mode. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether cookies should be marked secure by default. */\n secure?: boolean;\n}\n\n/** Global announcer defaults used by useAnnouncer(). */\nexport interface BqueryAnnouncerConfig {\n /** Default politeness level. */\n politeness?: 'polite' | 'assertive';\n /** Whether announcements should be treated atomically. */\n atomic?: boolean;\n /** Delay before writing the message into the live region. */\n delay?: number;\n /** Delay after which the live region is cleared automatically. */\n clearDelay?: number;\n}\n\n/** Global page meta defaults used by definePageMeta(). */\nexport interface BqueryPageMetaConfig {\n /** Optional title template function. */\n titleTemplate?: (title: string) => string;\n}\n\n/** Global motion defaults used by transition(). */\nexport interface BqueryTransitionConfig {\n /** Skip transitions when reduced motion is preferred. */\n skipOnReducedMotion?: boolean;\n /** Classes applied to the root element during transitions. */\n classes?: string[];\n /** Transition type identifiers added when supported by the browser. */\n types?: string[];\n}\n\n/** Global default component library configuration. */\nexport interface BqueryComponentLibraryConfig {\n /** Prefix used by registerDefaultComponents(). */\n prefix?: string;\n}\n\n/** Complete global bQuery configuration object. */\nexport interface BqueryConfig {\n /** Fetch composable defaults. */\n fetch?: BqueryFetchConfig;\n /** Cookie composable defaults. */\n cookies?: BqueryCookieConfig;\n /** Announcer composable defaults. */\n announcer?: BqueryAnnouncerConfig;\n /** Page metadata defaults. */\n pageMeta?: BqueryPageMetaConfig;\n /** View transition defaults. */\n transitions?: BqueryTransitionConfig;\n /** Default component library options. */\n components?: BqueryComponentLibraryConfig;\n}\n\nconst defaultConfig: BqueryConfig = {\n fetch: {\n headers: {},\n parseAs: 'json',\n },\n cookies: {\n path: '/',\n sameSite: 'Lax',\n secure: false,\n },\n announcer: {\n politeness: 'polite',\n atomic: true,\n delay: 16,\n clearDelay: 1000,\n },\n pageMeta: {},\n transitions: {\n skipOnReducedMotion: false,\n classes: [],\n types: [],\n },\n components: {\n prefix: 'bq',\n },\n};\n\nconst cloneConfigValue = <T>(value: T): T => {\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return new Headers(value) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry)) as T;\n }\n\n if (isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] = cloneConfigValue(entry);\n }\n return result as T;\n }\n\n return value;\n};\n\nlet currentConfig: BqueryConfig = cloneConfigValue(defaultConfig);\n\n/**\n * Define or extend the global bQuery configuration.\n *\n * @param config - Partial configuration values to merge into the current config\n * @returns The resolved configuration after merging\n *\n * @example\n * ```ts\n * defineBqueryConfig({\n * fetch: { baseUrl: 'https://api.example.com' },\n * components: { prefix: 'ui' },\n * });\n * ```\n */\nexport const defineBqueryConfig = (config: BqueryConfig): BqueryConfig => {\n currentConfig = cloneConfigValue(\n merge(\n defaultConfig as Record<string, unknown>,\n currentConfig as Record<string, unknown>,\n config as Record<string, unknown>\n ) as BqueryConfig\n );\n return getBqueryConfig();\n};\n\n/**\n * Get the currently resolved bQuery configuration.\n *\n * @returns A cloned snapshot of the active configuration\n */\nexport const getBqueryConfig = (): BqueryConfig => {\n return cloneConfigValue(currentConfig);\n};\n"],"mappings":";AAiFA,IAAM,IAA8B;AAAA,EAClC,OAAO;AAAA,IACL,SAAS,CAAA;AAAA,IACT,SAAS;AAAA;EAEX,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA;EAEV,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA;EAEd,UAAU,CAAA;AAAA,EACV,aAAa;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAA;AAAA,IACT,OAAO,CAAA;AAAA;EAET,YAAY,EACV,QAAQ,KAAA;GAIN,IAAA,CAAuB,MAAgB;AAC3C,MAAI,OAAO,UAAY,OAAe,aAAiB,QACrD,QAAO,IAAI,QAAQ,CAAA;AAGrB,MAAI,MAAM,QAAQ,CAAA,EAChB,QAAO,EAAM,IAAA,CAAK,MAAU,EAAiB,CAAA,CAAM;AAGrD,MAAI,EAAc,CAAA,GAAQ;AACxB,UAAM,IAAkC,CAAA;AACxC,eAAW,CAAC,GAAK,CAAA,KAAU,OAAO,QAAQ,CAAA,EACxC,CAAA,EAAO,CAAA,IAAO,EAAiB,CAAA;AAEjC,WAAO;AAAA;AAGT,SAAO;GAGL,IAA8B,EAAiB,CAAA,GAgBtC,IAAA,CAAsB,OACjC,IAAgB,EACd,EACE,GACA,GACA,CAAA,CACD,GAEI,EAAA,IAQI,IAAA,MACJ,EAAiB,CAAA"}
1
+ {"version":3,"file":"config-BP7KwiR5.js","names":[],"sources":["../src/platform/config.ts"],"sourcesContent":["/**\n * Global bQuery configuration helpers.\n *\n * @module bquery/platform\n */\n\nimport { isPlainObject, merge } from '../core/utils/object';\n\n/** Supported response parsing strategies for fetch composables. */\nexport type BqueryFetchParseAs = 'json' | 'text' | 'blob' | 'arrayBuffer' | 'formData' | 'response';\n\n/** Global fetch defaults used by useFetch(). */\nexport interface BqueryFetchConfig {\n /** Optional base URL prepended to relative request URLs. */\n baseUrl?: string;\n /** Default request headers. */\n headers?: HeadersInit;\n /** Default response parser. */\n parseAs?: BqueryFetchParseAs;\n}\n\n/** Global cookie defaults used by useCookie(). */\nexport interface BqueryCookieConfig {\n /** Default cookie path. */\n path?: string;\n /** Default SameSite mode. */\n sameSite?: 'Strict' | 'Lax' | 'None';\n /** Whether cookies should be marked secure by default. */\n secure?: boolean;\n}\n\n/** Global announcer defaults used by useAnnouncer(). */\nexport interface BqueryAnnouncerConfig {\n /** Default politeness level. */\n politeness?: 'polite' | 'assertive';\n /** Whether announcements should be treated atomically. */\n atomic?: boolean;\n /** Delay before writing the message into the live region. */\n delay?: number;\n /** Delay after which the live region is cleared automatically. */\n clearDelay?: number;\n}\n\n/** Global page meta defaults used by definePageMeta(). */\nexport interface BqueryPageMetaConfig {\n /** Optional title template function. */\n titleTemplate?: (title: string) => string;\n}\n\n/** Global motion defaults used by transition(). */\nexport interface BqueryTransitionConfig {\n /** Skip transitions when reduced motion is preferred. */\n skipOnReducedMotion?: boolean;\n /** Classes applied to the root element during transitions. */\n classes?: string[];\n /** Transition type identifiers added when supported by the browser. */\n types?: string[];\n}\n\n/** Global default component library configuration. */\nexport interface BqueryComponentLibraryConfig {\n /** Prefix used by registerDefaultComponents(). */\n prefix?: string;\n}\n\n/** Complete global bQuery configuration object. */\nexport interface BqueryConfig {\n /** Fetch composable defaults. */\n fetch?: BqueryFetchConfig;\n /** Cookie composable defaults. */\n cookies?: BqueryCookieConfig;\n /** Announcer composable defaults. */\n announcer?: BqueryAnnouncerConfig;\n /** Page metadata defaults. */\n pageMeta?: BqueryPageMetaConfig;\n /** View transition defaults. */\n transitions?: BqueryTransitionConfig;\n /** Default component library options. */\n components?: BqueryComponentLibraryConfig;\n}\n\nconst defaultConfig: BqueryConfig = {\n fetch: {\n headers: {},\n parseAs: 'json',\n },\n cookies: {\n path: '/',\n sameSite: 'Lax',\n secure: false,\n },\n announcer: {\n politeness: 'polite',\n atomic: true,\n delay: 16,\n clearDelay: 1000,\n },\n pageMeta: {},\n transitions: {\n skipOnReducedMotion: false,\n classes: [],\n types: [],\n },\n components: {\n prefix: 'bq',\n },\n};\n\nconst cloneConfigValue = <T>(value: T): T => {\n if (typeof Headers !== 'undefined' && value instanceof Headers) {\n return new Headers(value) as T;\n }\n\n if (Array.isArray(value)) {\n return value.map((entry) => cloneConfigValue(entry)) as T;\n }\n\n if (isPlainObject(value)) {\n const result: Record<string, unknown> = {};\n for (const [key, entry] of Object.entries(value)) {\n result[key] = cloneConfigValue(entry);\n }\n return result as T;\n }\n\n return value;\n};\n\nlet currentConfig: BqueryConfig = cloneConfigValue(defaultConfig);\n\n/**\n * Define or extend the global bQuery configuration.\n *\n * @param config - Partial configuration values to merge into the current config\n * @returns The resolved configuration after merging\n *\n * @example\n * ```ts\n * defineBqueryConfig({\n * fetch: { baseUrl: 'https://api.example.com' },\n * components: { prefix: 'ui' },\n * });\n * ```\n */\nexport const defineBqueryConfig = (config: BqueryConfig): BqueryConfig => {\n currentConfig = cloneConfigValue(\n merge(\n defaultConfig as Record<string, unknown>,\n currentConfig as Record<string, unknown>,\n config as Record<string, unknown>\n ) as BqueryConfig\n );\n return getBqueryConfig();\n};\n\n/**\n * Get the currently resolved bQuery configuration.\n *\n * @returns A cloned snapshot of the active configuration\n */\nexport const getBqueryConfig = (): BqueryConfig => {\n return cloneConfigValue(currentConfig);\n};\n"],"mappings":";AAiFA,IAAM,IAA8B;AAAA,EAClC,OAAO;AAAA,IACL,SAAS,CAAC;AAAA,IACV,SAAS;AAAA,EACX;AAAA,EACA,SAAS;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,QAAQ;AAAA,EACV;AAAA,EACA,WAAW;AAAA,IACT,YAAY;AAAA,IACZ,QAAQ;AAAA,IACR,OAAO;AAAA,IACP,YAAY;AAAA,EACd;AAAA,EACA,UAAU,CAAC;AAAA,EACX,aAAa;AAAA,IACX,qBAAqB;AAAA,IACrB,SAAS,CAAC;AAAA,IACV,OAAO,CAAC;AAAA,EACV;AAAA,EACA,YAAY,EACV,QAAQ,KACV;AACF,GAEM,IAAA,CAAuB,MAAgB;AAC3C,MAAI,OAAO,UAAY,OAAe,aAAiB,QACrD,QAAO,IAAI,QAAQ,CAAK;AAG1B,MAAI,MAAM,QAAQ,CAAK,EACrB,QAAO,EAAM,IAAA,CAAK,MAAU,EAAiB,CAAK,CAAC;AAGrD,MAAI,EAAc,CAAK,GAAG;AACxB,UAAM,IAAkC,CAAC;AACzC,eAAW,CAAC,GAAK,CAAA,KAAU,OAAO,QAAQ,CAAK,EAC7C,CAAA,EAAO,CAAA,IAAO,EAAiB,CAAK;AAEtC,WAAO;AAAA,EACT;AAEA,SAAO;AACT,GAEI,IAA8B,EAAiB,CAAa,GAgBnD,IAAA,CAAsB,OACjC,IAAgB,EACd,EACE,GACA,GACA,CACF,CACF,GACO,EAAgB,IAQZ,IAAA,MACJ,EAAiB,CAAa"}
@@ -1 +1 @@
1
- {"version":3,"file":"constraints-Dlbx_m1b.js","names":[],"sources":["../src/router/constraints.ts"],"sourcesContent":["/**\n * Shared helpers for validating and normalizing route param constraints.\n * @internal\n */\n\nconst MAX_ROUTE_CONSTRAINT_CACHE_SIZE = 128;\nconst normalizedConstraintCache = new Map<string, string>();\nconst compiledConstraintRegexCache = new Map<string, RegExp>();\n\nconst setBoundedCacheEntry = <T>(cache: Map<string, T>, key: string, value: T): void => {\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, value);\n\n if (cache.size <= MAX_ROUTE_CONSTRAINT_CACHE_SIZE) {\n return;\n }\n\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n};\n\n/**\n * Detects potentially super-linear (ReDoS) patterns caused by quantified\n * groups that already contain inner quantifiers, such as `(a+)+` or `(a*)*`.\n * @internal\n */\nconst hasNestedQuantifier = (pattern: string): boolean => {\n const groupQuantifierStack: boolean[] = [];\n let inCharClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n i++;\n continue;\n }\n\n if (ch === '[' && !inCharClass) {\n inCharClass = true;\n continue;\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false;\n continue;\n }\n if (inCharClass) continue;\n\n if (ch === '(') {\n groupQuantifierStack.push(false);\n continue;\n }\n\n if (ch === ')') {\n const groupHasInnerQuantifier = groupQuantifierStack.pop() ?? false;\n // Check if the closing paren is followed by a quantifier\n const next = pattern[i + 1];\n if (\n groupHasInnerQuantifier &&\n (next === '+' || next === '*' || next === '?' || next === '{')\n ) {\n return true;\n }\n if (groupHasInnerQuantifier && groupQuantifierStack.length > 0) {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n continue;\n }\n\n if (groupQuantifierStack.length > 0) {\n if (ch === '?' && i > 0 && pattern[i - 1] === '(') {\n continue;\n }\n\n if (ch === '+' || ch === '*' || ch === '?' || ch === '{') {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n }\n }\n\n return false;\n};\n\nconst normalizeConstraintCaptures = (constraint: string): string => {\n let normalized = '';\n let inCharacterClass = false;\n\n for (let i = 0; i < constraint.length; i++) {\n const char = constraint[i];\n\n if (char === '\\\\' && i + 1 < constraint.length) {\n if (!inCharacterClass && constraint[i + 1] >= '1' && constraint[i + 1] <= '9') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n if (!inCharacterClass && constraint[i + 1] === 'k' && constraint[i + 2] === '<') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n normalized += char + constraint[i + 1];\n i++;\n continue;\n }\n\n if (char === '[' && !inCharacterClass) {\n inCharacterClass = true;\n normalized += char;\n continue;\n }\n\n if (char === ']' && inCharacterClass) {\n inCharacterClass = false;\n normalized += char;\n continue;\n }\n\n if (!inCharacterClass && char === '(') {\n if (i + 1 < constraint.length && constraint[i + 1] === '?') {\n if (constraint[i + 2] === '<') {\n if (constraint[i + 3] === '=' || constraint[i + 3] === '!') {\n normalized += '(';\n continue;\n }\n\n const namedCaptureEnd = constraint.indexOf('>', i + 3);\n if (namedCaptureEnd === -1) {\n throw new Error(\n `bQuery router: Invalid route constraint named capture group: \"${constraint}\".`\n );\n }\n normalized += '(?:';\n i = namedCaptureEnd;\n continue;\n }\n\n normalized += '(';\n continue;\n }\n\n normalized += '(?:';\n continue;\n }\n\n normalized += char;\n }\n\n return normalized;\n};\n\nexport const getNormalizedRouteConstraint = (constraint: string): string => {\n const cached = normalizedConstraintCache.get(constraint);\n if (cached !== undefined) {\n return cached;\n }\n\n const normalized = normalizeConstraintCaptures(constraint);\n setBoundedCacheEntry(normalizedConstraintCache, constraint, normalized);\n return normalized;\n};\n\nexport const getRouteConstraintRegex = (constraint: string): RegExp => {\n const normalizedConstraint = getNormalizedRouteConstraint(constraint);\n const cached = compiledConstraintRegexCache.get(normalizedConstraint);\n if (cached) {\n return cached;\n }\n\n if (hasNestedQuantifier(normalizedConstraint)) {\n throw new Error(\n `bQuery router: Route constraint contains a potentially catastrophic (ReDoS) pattern. Nested quantifiers are not allowed: \"${constraint}\".`\n );\n }\n\n try {\n const compiled = new RegExp(`^(?:${normalizedConstraint})$`);\n setBoundedCacheEntry(compiledConstraintRegexCache, normalizedConstraint, compiled);\n return compiled;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `bQuery router: Invalid route constraint regex \"${constraint}\": ${error.message}`\n );\n }\n throw error;\n }\n};\n\nexport const routeConstraintMatches = (constraint: string, value: string): boolean => {\n return getRouteConstraintRegex(constraint).test(value);\n};\n\nexport const clearRouteConstraintCache = (): void => {\n normalizedConstraintCache.clear();\n compiledConstraintRegexCache.clear();\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"constraints-Dlbx_m1b.js","names":[],"sources":["../src/router/constraints.ts"],"sourcesContent":["/**\n * Shared helpers for validating and normalizing route param constraints.\n * @internal\n */\n\nconst MAX_ROUTE_CONSTRAINT_CACHE_SIZE = 128;\nconst normalizedConstraintCache = new Map<string, string>();\nconst compiledConstraintRegexCache = new Map<string, RegExp>();\n\nconst setBoundedCacheEntry = <T>(cache: Map<string, T>, key: string, value: T): void => {\n if (cache.has(key)) {\n cache.delete(key);\n }\n\n cache.set(key, value);\n\n if (cache.size <= MAX_ROUTE_CONSTRAINT_CACHE_SIZE) {\n return;\n }\n\n const oldestKey = cache.keys().next().value;\n if (oldestKey !== undefined) {\n cache.delete(oldestKey);\n }\n};\n\n/**\n * Detects potentially super-linear (ReDoS) patterns caused by quantified\n * groups that already contain inner quantifiers, such as `(a+)+` or `(a*)*`.\n * @internal\n */\nconst hasNestedQuantifier = (pattern: string): boolean => {\n const groupQuantifierStack: boolean[] = [];\n let inCharClass = false;\n\n for (let i = 0; i < pattern.length; i++) {\n const ch = pattern[i];\n\n if (ch === '\\\\' && i + 1 < pattern.length) {\n i++;\n continue;\n }\n\n if (ch === '[' && !inCharClass) {\n inCharClass = true;\n continue;\n }\n if (ch === ']' && inCharClass) {\n inCharClass = false;\n continue;\n }\n if (inCharClass) continue;\n\n if (ch === '(') {\n groupQuantifierStack.push(false);\n continue;\n }\n\n if (ch === ')') {\n const groupHasInnerQuantifier = groupQuantifierStack.pop() ?? false;\n // Check if the closing paren is followed by a quantifier\n const next = pattern[i + 1];\n if (\n groupHasInnerQuantifier &&\n (next === '+' || next === '*' || next === '?' || next === '{')\n ) {\n return true;\n }\n if (groupHasInnerQuantifier && groupQuantifierStack.length > 0) {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n continue;\n }\n\n if (groupQuantifierStack.length > 0) {\n if (ch === '?' && i > 0 && pattern[i - 1] === '(') {\n continue;\n }\n\n if (ch === '+' || ch === '*' || ch === '?' || ch === '{') {\n groupQuantifierStack[groupQuantifierStack.length - 1] = true;\n }\n }\n }\n\n return false;\n};\n\nconst normalizeConstraintCaptures = (constraint: string): string => {\n let normalized = '';\n let inCharacterClass = false;\n\n for (let i = 0; i < constraint.length; i++) {\n const char = constraint[i];\n\n if (char === '\\\\' && i + 1 < constraint.length) {\n if (!inCharacterClass && constraint[i + 1] >= '1' && constraint[i + 1] <= '9') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n if (!inCharacterClass && constraint[i + 1] === 'k' && constraint[i + 2] === '<') {\n throw new Error(\n `bQuery router: Route constraints cannot use backreferences: \"${constraint}\".`\n );\n }\n\n normalized += char + constraint[i + 1];\n i++;\n continue;\n }\n\n if (char === '[' && !inCharacterClass) {\n inCharacterClass = true;\n normalized += char;\n continue;\n }\n\n if (char === ']' && inCharacterClass) {\n inCharacterClass = false;\n normalized += char;\n continue;\n }\n\n if (!inCharacterClass && char === '(') {\n if (i + 1 < constraint.length && constraint[i + 1] === '?') {\n if (constraint[i + 2] === '<') {\n if (constraint[i + 3] === '=' || constraint[i + 3] === '!') {\n normalized += '(';\n continue;\n }\n\n const namedCaptureEnd = constraint.indexOf('>', i + 3);\n if (namedCaptureEnd === -1) {\n throw new Error(\n `bQuery router: Invalid route constraint named capture group: \"${constraint}\".`\n );\n }\n normalized += '(?:';\n i = namedCaptureEnd;\n continue;\n }\n\n normalized += '(';\n continue;\n }\n\n normalized += '(?:';\n continue;\n }\n\n normalized += char;\n }\n\n return normalized;\n};\n\nexport const getNormalizedRouteConstraint = (constraint: string): string => {\n const cached = normalizedConstraintCache.get(constraint);\n if (cached !== undefined) {\n return cached;\n }\n\n const normalized = normalizeConstraintCaptures(constraint);\n setBoundedCacheEntry(normalizedConstraintCache, constraint, normalized);\n return normalized;\n};\n\nexport const getRouteConstraintRegex = (constraint: string): RegExp => {\n const normalizedConstraint = getNormalizedRouteConstraint(constraint);\n const cached = compiledConstraintRegexCache.get(normalizedConstraint);\n if (cached) {\n return cached;\n }\n\n if (hasNestedQuantifier(normalizedConstraint)) {\n throw new Error(\n `bQuery router: Route constraint contains a potentially catastrophic (ReDoS) pattern. Nested quantifiers are not allowed: \"${constraint}\".`\n );\n }\n\n try {\n const compiled = new RegExp(`^(?:${normalizedConstraint})$`);\n setBoundedCacheEntry(compiledConstraintRegexCache, normalizedConstraint, compiled);\n return compiled;\n } catch (error) {\n if (error instanceof SyntaxError) {\n throw new Error(\n `bQuery router: Invalid route constraint regex \"${constraint}\": ${error.message}`\n );\n }\n throw error;\n }\n};\n\nexport const routeConstraintMatches = (constraint: string, value: string): boolean => {\n return getRouteConstraintRegex(constraint).test(value);\n};\n\nexport const clearRouteConstraintCache = (): void => {\n normalizedConstraintCache.clear();\n compiledConstraintRegexCache.clear();\n};\n"],"mappings":"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"}