{"record":{"id":"3cbf728a9e086563","repo":"PaddlePaddle/PaddleOCR","slug":"worker-transport-client-requires-a-createworker","errorCode":null,"errorMessage":"Worker transport client requires a createWorker() factory.","messagePattern":"Worker transport client requires a createWorker\\(\\) factory\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"paddleocr-js/packages/core/src/worker/client.ts","lineNumber":46,"sourceCode":"    this.nextRequestId = 1;\n    this.disposed = false;\n  }\n\n  ensureActive(): void {\n    if (this.disposed) {\n      throw new Error(\"Worker transport client has been disposed.\");\n    }\n  }\n\n  ensureWorker(): Worker {\n    this.ensureActive();\n    if (this.worker) {\n      return this.worker;\n    }\n\n    const workerFactory = this.workerOptions.createWorker;\n    if (typeof workerFactory !== \"function\") {\n      throw new Error(\"Worker transport client requires a createWorker() factory.\");\n    }\n    const worker = workerFactory();\n    worker.onmessage = (event: MessageEvent) => {\n      const message = event.data as unknown;\n      if (!isTransportResponse(message)) return;\n      const pending = this.pending.get(message.requestId);\n      if (!pending) return;\n      this.pending.delete(message.requestId);\n      if (message.status === \"success\") {\n        pending.resolve(message.payload);\n      } else {\n        pending.reject(deserializeError(message.error));\n      }\n    };\n    worker.onerror = (event: ErrorEvent) => {\n      const error = new Error(event.message || \"OCR worker failed.\");\n      for (const pending of this.pending.values()) {\n        pending.reject(error);","sourceCodeStart":28,"sourceCodeEnd":64,"githubUrl":"https://github.com/PaddlePaddle/PaddleOCR/blob/2661c7c0ef5c613e8f93c6e93b2e052399f0f854/paddleocr-js/packages/core/src/worker/client.ts#L28-L64","documentation":"Thrown by WorkerTransportClient.ensureWorker() when lazily spinning up the worker and finding that workerOptions.createWorker is not a function. The transport deliberately does not hardcode a Worker constructor (bundle paths differ per app), so the caller must inject a factory. Omitting it means the client was constructed with no or malformed options.","triggerScenarios":"new WorkerTransportClient() with no options in a custom integration; passing { createWorker: undefined } after a refactor; options object built by a function that forgot the field in one branch; bundler tree-shaking or mock setup dropping the factory.","commonSituations":"Advanced users wiring the low-level worker transport manually instead of the high-level API; test doubles not implementing createWorker; copying example code that assumed defaults.","solutions":["Pass a factory returning the bundled worker: { createWorker: () => new Worker(new URL('./worker.js', import.meta.url), { type: 'module' }) }","If you only need OCR, use the high-level API which provides the factory automatically","Type the options object against the exported WorkerOptions interface so the missing field is a compile error"],"exampleFix":"// before\nconst client = new WorkerTransportClient(); // no options -> throws on first use\n\n// after\nconst client = new WorkerTransportClient({\n  createWorker: () => new Worker(new URL(\"./ocr-worker.js\", import.meta.url), { type: \"module\" })\n});","handlingStrategy":"type-guard","validationCode":"const opts: WorkerOptions = {\n  createWorker: () => new Worker(new URL(\"./ocr.worker.js\", import.meta.url), { type: \"module\" })\n};\nassert(typeof opts.createWorker === \"function\");","typeGuard":"function hasWorkerFactory(o: unknown): o is { createWorker: () => Worker } {\n  return typeof (o as { createWorker?: unknown })?.createWorker === \"function\";\n}","tryCatchPattern":null,"preventionTips":["Type constructor calls against the exported WorkerOptions interface","Prefer the high-level API which injects the factory for you","Assert the factory exists in test doubles/mocks"],"tags":["worker","config","validation","typescript"],"backgroundTag":null,"analyzedSha":"2661c7c0ef5c613e8f93c6e93b2e052399f0f854","analyzedAt":"2026-08-14T20:17:30.180Z","schemaVersion":2},"datasetVersion":"2026-08-15T17:31:12.345Z"}