{"id":"0e27a57b5c4686a4","repo":"vitest-dev/vitest","slug":"postmessage-requires-at-least-one-argument","errorCode":null,"errorMessage":"\"postMessage\" requires at least one argument.","messagePattern":"\"postMessage\" requires at least one argument\\.","errorType":"exception","errorClass":"SyntaxError","httpStatus":null,"severity":"error","filePath":"packages/web-worker/src/worker.ts","lineNumber":76,"sourceCode":"        origin: typeof location !== 'undefined' ? location.origin : 'http://localhost:3000',\n        crossOriginIsolated: false,\n        name: options?.name || '',\n        close: () => this.terminate(),\n        dispatchEvent: (event: Event) => {\n          return this._vw_workerTarget.dispatchEvent(event)\n        },\n        addEventListener: (...args: any[]) => {\n          if (args[1]) {\n            this._vw_insideListeners.set(args[0], args[1])\n          }\n          return this._vw_workerTarget.addEventListener(...args as [any, any])\n        },\n        removeEventListener: (...args: any[]) => {\n          return this._vw_workerTarget.removeEventListener(...args as [any, any])\n        },\n        postMessage: (...args: any[]) => {\n          if (!args.length) {\n            throw new SyntaxError(\n              '\"postMessage\" requires at least one argument.',\n            )\n          }\n\n          debug(\n            'posting message %o from the worker %s to the main thread',\n            args[0],\n            this._vw_name,\n          )\n          const event = createMessageEvent(args[0], args[1], cloneType())\n          this.dispatchEvent(event)\n        },\n        get self() {\n          return selfProxy\n        },\n      }\n\n      selfProxy = new Proxy(context, {","sourceCodeStart":58,"sourceCodeEnd":94,"githubUrl":"https://github.com/vitest-dev/vitest/blob/d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09/packages/web-worker/src/worker.ts#L58-L94","documentation":"The worker-side context object created by Vitest's Worker constructor (packages/web-worker/src/worker.ts:74-79) exposes a `postMessage` to code running INSIDE the worker (i.e. `self.postMessage(...)`). It mirrors the WHATWG DedicatedWorkerGlobalScope.postMessage contract, which requires a message argument. Calling it with zero arguments throws a SyntaxError, exactly like a real browser worker would.","triggerScenarios":"Worker code calling `self.postMessage()` or `postMessage()` with no arguments; a conditional code path that calls postMessage only for its side effect; a wrapper/helper that forwards an arguments object and forwards zero args; off-by-one logic that drops the message payload before posting.","commonSituations":"Refactoring worker message handlers and accidentally dropping the payload; calling postMessage() inside a wrapper that destructures `(...args)` but receives none; mirroring a parent API that occasionally posts empty signals; testing edge cases where the worker has nothing to send yet still calls postMessage.","solutions":["Pass an explicit message: `self.postMessage(payload)` — even `null` or `{}` is valid if you only need a signal.","If the call is conditional, guard it so postMessage is only invoked when there is a payload to send.","Audit any wrapper around postMessage to ensure it forwards at least the first argument."],"exampleFix":"// before — inside worker.js\nfunction notify() {\n  self.postMessage() // forgot the payload\n}\n\n// after\nfunction notify(payload) {\n  if (payload !== undefined) self.postMessage(payload)\n}","handlingStrategy":"validation","validationCode":"// Guard worker-side postMessage calls so they never run empty.\nfunction postFromWorker(payload, transfer) {\n  if (arguments.length === 0 && payload === undefined) {\n    throw new TypeError('postFromWorker requires a payload')\n  }\n  const args = transfer ? [payload, transfer] : [payload ?? null]\n  self.postMessage(...args)\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Always pass an explicit payload to self.postMessage — use `null` only when intentionally sending an empty signal.","Forward variadic args with a minimum-arity assertion in any wrapper.","Unit-test worker message helpers with the no-argument case to catch dropped payloads early."],"tags":["web-worker","postmessage","worker-side","validation"],"analyzedSha":"d568f8ce3739b532d5bf2c1ee1e45e8a8a473d09","analyzedAt":"2026-08-03T20:23:56.861Z","schemaVersion":2}