{"version":3,"file":"workerPool.js","names":[],"sources":["esm/cli/workerPool.js"],"sourcesContent":["import { Worker } from \"node:worker_threads\";\nimport { cpus } from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname, join } from \"node:path\";\nconst workerDirectory = typeof __dirname === \"string\" ? join(__dirname, \"..\", \"..\", \"esm\", \"cli\") : dirname(fileURLToPath(import.meta.url));\nclass BuildWorkerPool {\n  workers = [];\n  available = [];\n  taskQueue = [];\n  pendingById = /* @__PURE__ */ new Map();\n  nextId = 0;\n  readyCount = 0;\n  initCount = 0;\n  _ready;\n  _resolveReady;\n  _initialized;\n  _resolveInitialized;\n  _terminated = false;\n  constructor(size = Math.max(1, cpus().length - 1)) {\n    this._ready = new Promise((resolve) => {\n      this._resolveReady = resolve;\n    });\n    this._initialized = new Promise((resolve) => {\n      this._resolveInitialized = resolve;\n    });\n    const workerPath = join(workerDirectory, \"buildPageWorker.mjs\");\n    for (let i = 0; i < size; i++) {\n      const worker = new Worker(workerPath);\n      worker.on(\"message\", (msg) => {\n        if (msg.type === \"ready\") {\n          this.readyCount++;\n          this.available.push(worker);\n          if (this.readyCount === size) {\n            this._resolveReady();\n          }\n        } else if (msg.type === \"init-done\") {\n          this.initCount++;\n          if (this.initCount === size) {\n            this._resolveInitialized();\n          }\n          this.dispatch();\n        } else if (msg.type === \"done\" || msg.type === \"error\") {\n          const pending = this.pendingById.get(msg.id);\n          if (pending) {\n            this.pendingById.delete(msg.id);\n            if (msg.type === \"done\") {\n              pending.resolve(msg.result);\n            } else {\n              pending.reject(new Error(msg.error));\n            }\n          }\n          this.available.push(worker);\n          this.dispatch();\n        }\n      });\n      worker.on(\"error\", (err) => {\n        console.error(\"[BuildWorkerPool] Worker error:\", err);\n      });\n      this.workers.push(worker);\n    }\n  }\n  get size() {\n    return this.workers.length;\n  }\n  // initialize all workers with pre-loaded config from main thread\n  async initialize(oneOptions) {\n    await this._ready;\n    for (const worker of this.workers) {\n      worker.postMessage({ type: \"init\", id: this.nextId++, oneOptions });\n    }\n    await this._initialized;\n  }\n  dispatch() {\n    while (this.available.length > 0 && this.taskQueue.length > 0) {\n      const worker = this.available.shift();\n      const { msg, pending } = this.taskQueue.shift();\n      this.pendingById.set(pending.id, pending);\n      worker.postMessage(msg);\n    }\n  }\n  async buildPage(args) {\n    if (this._terminated) {\n      throw new Error(\"Worker pool has been terminated\");\n    }\n    const serializedRoute = {\n      type: args.foundRoute.type,\n      file: args.foundRoute.file,\n      // only keep serializable layout data\n      layouts: args.foundRoute.layouts?.map((layout) => ({\n        contextKey: layout.contextKey,\n        loaderServerPath: layout.loaderServerPath,\n        layoutRenderMode: layout.layoutRenderMode\n      })),\n      // only keep contextKey from middlewares\n      middlewares: args.foundRoute.middlewares?.map((mw) => ({\n        contextKey: mw.contextKey\n      }))\n    };\n    const id = this.nextId++;\n    const msg = {\n      type: \"build\",\n      id,\n      args: {\n        ...args,\n        foundRoute: serializedRoute\n      }\n    };\n    return new Promise((resolve, reject) => {\n      const pending = {\n        id,\n        resolve: (result) => resolve({ ...result, cssContents: args.allCSSContents }),\n        reject\n      };\n      this.taskQueue.push({ msg, pending });\n      this.dispatch();\n    });\n  }\n  async terminate() {\n    this._terminated = true;\n    await Promise.all(this.workers.map((w) => w.terminate()));\n    this.workers = [];\n    this.available = [];\n  }\n}\nlet pool = null;\nfunction getWorkerPool(size) {\n  if (!pool) {\n    pool = new BuildWorkerPool(size);\n  }\n  return pool;\n}\nasync function terminateWorkerPool() {\n  if (pool) {\n    await pool.terminate();\n    pool = null;\n  }\n}\nexport {\n  BuildWorkerPool,\n  getWorkerPool,\n  terminateWorkerPool\n};\n//# sourceMappingURL=workerPool.js.map\n"],"mappings":"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"}