{"id":"d9ed2f7aab90570a","repo":"socketio/socket.io","slug":"invalid-payload","errorCode":null,"errorMessage":"invalid payload","messagePattern":"invalid payload","errorType":"exception","errorClass":"Error","httpStatus":null,"severity":"error","filePath":"packages/socket.io-parser/lib/index.ts","lineNumber":285,"sourceCode":"      const start = i + 1;\n      while (++i) {\n        const c = str.charAt(i);\n        if (null == c || Number(c) != c) {\n          --i;\n          break;\n        }\n        if (i === str.length) break;\n      }\n      p.id = Number(str.substring(start, i + 1));\n    }\n\n    // look up json data\n    if (str.charAt(++i)) {\n      const payload = this.tryParse(str.substr(i));\n      if (Decoder.isPayloadValid(p.type, payload)) {\n        p.data = payload;\n      } else {\n        throw new Error(\"invalid payload\");\n      }\n    }\n\n    debug(\"decoded %s as %j\", str, p);\n    return p;\n  }\n\n  private tryParse(str) {\n    try {\n      return JSON.parse(str, this.opts.reviver);\n    } catch (e) {\n      return false;\n    }\n  }\n\n  private static isPayloadValid(type: PacketType, payload: any): boolean {\n    switch (type) {\n      case PacketType.CONNECT:","sourceCodeStart":267,"sourceCodeEnd":303,"githubUrl":"https://github.com/socketio/socket.io/blob/ae7fb46e08c5ed964b4a1ea8b1703e816511598e/packages/socket.io-parser/lib/index.ts#L267-L303","documentation":"Thrown by decodeString() when the JSON payload portion of a packet parses successfully but fails the structural check in Decoder.isPayloadValid(). Each packet type requires a specific payload shape (CONNECT needs an object, DISCONNECT needs no payload, EVENT/BINARY_EVENT need an array whose first element is a string not reserved, ACK/BINARY_ACK need an array).","triggerScenarios":"A CONNECT packet whose JSON body is an array or primitive (not an object); an EVENT packet whose payload is not an array, or whose first element is a reserved event name or not a string/number; an ACK whose payload is not an array; or a DISCONNECT that carries a payload.","commonSituations":"A client/server version mismatch changing the payload contract; a custom producer emitting malformed JSON payloads; or a reserved event name slipping into an EVENT payload (isPayloadValid rejects reserved names at parser level too).","solutions":["Confirm both ends use compatible Socket.IO protocol versions so payload shapes align.","Ensure EVENT payloads are arrays like ['eventName', arg1, arg2] and the event name is not reserved.","Ensure CONNECT payloads are plain objects (e.g. {}) and DISCONNECT has no payload."],"exampleFix":"// before\n// malformed: EVENT with reserved name as payload[0]\ndecoder.add('2[\"connect\",\"hi\"]'); // isPayloadValid fails -> 'invalid payload'\n\n// after\ndecoder.add('2[\"myEvent\",\"hi\"]');","handlingStrategy":"validation","validationCode":"function payloadOk(type, payload){\n  switch(type){\n    case 0: return typeof payload==='object'&&payload!==null;\n    case 1: return payload===undefined;\n    case 4: return typeof payload==='string'||(typeof payload==='object'&&payload!==null);\n    case 2: case 5: return Array.isArray(payload)&&(typeof payload[0]==='number'||(typeof payload[0]==='string'));\n    case 3: case 6: return Array.isArray(payload);\n    default: return false;\n  }\n}","typeGuard":"function isEventPayload(p){ return Array.isArray(p) && typeof p[0]==='string'; }","tryCatchPattern":"try { decoder.add(raw); }\ncatch(e){ if(/invalid payload/.test(e.message)){ return; } throw e; }","preventionTips":["Keep encoder/decoder on the same protocol version so payload shapes match.","Ensure EVENT payloads are ['eventName', ...args] with a non-reserved string first element.","Ensure CONNECT payloads are objects and DISCONNECT has none."],"tags":["parser","decoder","validation","payload"],"analyzedSha":"ae7fb46e08c5ed964b4a1ea8b1703e816511598e","analyzedAt":"2026-08-03T19:08:14.127Z","schemaVersion":2}