{"record":{"id":"2c61f4443922e51e","repo":"remotion-dev/remotion","slug":"reader-should-not-be-provided-to-apiname-i","errorCode":null,"errorMessage":"`reader` should not be provided to `${apiName}`. If you want to use it in the browser, use parseMediaOnWorker(). If you also want to read files from the file system, use parseMediaOnServerWorker().","messagePattern":"`reader` should not be provided to `(.+?)`\\. If you want to use it in the browser, use parseMediaOnWorker\\(\\)\\. If you also want to read files from the file system, use parseMediaOnServerWorker\\(\\)\\.","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/media-parser/src/parse-media-on-worker-entry.ts","lineNumber":114,"sourceCode":"\t\tpostOnVideoTrack: Boolean(onVideoTrack),\n\t\t// URL cannot be serialized, so we convert it to a string\n\t\tsrc: src instanceof URL ? src.toString() : src,\n\t};\n};\n\nconst post = (worker: Worker, payload: WorkerRequestPayload) => {\n\tworker.postMessage(payload);\n};\n\nexport const parseMediaOnWorkerImplementation = async <\n\tF extends Options<ParseMediaFields>,\n>(\n\t{controller, reader, ...params}: ParseMediaOptions<F>,\n\tworker: Worker,\n\tapiName: string,\n) => {\n\tif (reader) {\n\t\tthrow new Error(\n\t\t\t`\\`reader\\` should not be provided to \\`${apiName}\\`. If you want to use it in the browser, use parseMediaOnWorker(). If you also want to read files from the file system, use parseMediaOnServerWorker().`,\n\t\t);\n\t}\n\n\tpost(worker, convertToWorkerPayload(params));\n\n\tlet workerTerminated = false;\n\n\tconst {promise, resolve, reject} =\n\t\twithResolvers<ParseMediaResult<Options<ParseMediaFields>>>();\n\n\tconst onAbort = () => {\n\t\tpost(worker, {type: 'request-abort'});\n\t};\n\n\tconst onResume = () => {\n\t\tpost(worker, {type: 'request-resume'});\n\t};","sourceCodeStart":96,"sourceCodeEnd":132,"githubUrl":"https://github.com/remotion-dev/remotion/blob/78fe4bb3fdb5a2cd68724393d63cb223db333fa7/packages/media-parser/src/parse-media-on-worker-entry.ts#L96-L132","documentation":"parseMediaOnWorkerImplementation destructures {controller, reader, ...params} and immediately rejects if reader is truthy. The worker entry serializes options via postMessage, and a reader (with native handles / FS access) cannot cross the worker boundary. Browser workers use fetchReader implicitly; server FS reading needs the dedicated server worker.","triggerScenarios":"Passing `reader: nodeReader` (or any custom reader) to parseMediaOnWorker or parseMediaOnServerWorker. The API expects readers only on the main-thread parseMedia / parseMediaOnServer.","commonSituations":"Wanting FS access inside a worker and assuming reader should be passed through; migrating from parseMedia to a worker variant without dropping the reader option; copy-paste from a Node parseMedia call.","solutions":["For browser worker parsing, drop the reader option (fetchReader is used automatically): call parseMediaOnWorker without reader.","For FS-backed parsing in a worker, use parseMediaOnServerWorker() WITHOUT passing reader — it uses nodeReader internally.","For FS-backed parsing on the main thread, call parseMedia({reader: nodeReader, ...}).","Check that you are importing the right function for your environment."],"exampleFix":"// before (wrong)\nimport {nodeReader} from '@remotion/media-parser/node-reader';\nawait parseMediaOnServerWorker({src, reader: nodeReader, fields: {}});\n\n// after (right): server worker wires nodeReader itself\nawait parseMediaOnServerWorker({src, fields: {}});\n// or, main thread:\nawait parseMedia({src, reader: nodeReader, fields: {}});","handlingStrategy":"validation","validationCode":"// Never pass reader to worker variants; choose the right entry point\nfunction pickParseFn({needsFs, inWorker}: {needsFs: boolean; inWorker: boolean}) {\n  if (needsFs) return 'parseMediaOnServerWorker'; // uses nodeReader internally\n  if (inWorker) return 'parseMediaOnWorker';\n  return 'parseMedia';\n}","typeGuard":"import type {ParseMediaOptions} from '@remotion/media-parser';\nconst optsHaveReader = (o: ParseMediaOptions<any>): boolean => Boolean((o as any).reader);","tryCatchPattern":"try {\n  await parseMediaOnServerWorker({src, fields: {}});\n} catch (e) {\n  if (e instanceof Error && e.message.includes('`reader` should not be provided')) {\n    // caller passed reader by mistake; strip it and retry\n    throw new Error('Do not pass reader to worker variants');\n  }\n  throw e;\n}","preventionTips":["Drop the reader option when calling parseMediaOnWorker / parseMediaOnServerWorker.","Use parseMedia({reader: nodeReader}) on the main thread for FS reads.","Remember server worker wires nodeReader internally.","Document which entry point each environment should use."],"tags":["api-misuse","worker","reader","media-parser"],"backgroundTag":null,"analyzedSha":"78fe4bb3fdb5a2cd68724393d63cb223db333fa7","analyzedAt":"2026-08-12T17:18:50.444Z","schemaVersion":2},"datasetVersion":"2026-08-12T23:17:12.415Z"}