Engine.IO Parser
raw JSON →engine.io-parser is a foundational JavaScript parser library responsible for encoding and decoding packets and payloads for the Engine.IO protocol, which underpins Socket.IO. It enables seamless communication by handling various data types including strings, numbers, buffers, and ArrayBuffers across both Node.js and browser environments. The current stable version is 5.2.3, and it is actively maintained as part of the broader Socket.IO ecosystem, receiving updates alongside major Socket.IO releases. Its key differentiators include robust cross-environment compatibility (Node.js, browser, WebWorkers) and flexible binary data handling (encoding to/from ArrayBuffer, Blob, or Buffer), making it a critical component for real-time, low-level data transmission.
Common errors
error TypeError: parser.encodePacket is not a function ↓
import * as parser from 'engine.io-parser'; then use parser.encodePacket(...). If individual functions are exported, use import { encodePacket } from 'engine.io-parser';. error ReferenceError: Buffer is not defined ↓
ArrayBuffer or Blob objects for binary data instead of Node.js Buffer objects. If using a bundler like Webpack or Browserify, ensure buffer is polyfilled or correctly configured for browser usage. Warnings
gotcha The API primarily uses callback-based asynchronous patterns for encoding and decoding operations. Developers accustomed to Promise-based or async/await syntax may find this less ergonomic, potentially leading to nested callbacks (callback hell) if not managed with utilities like `util.promisify`. ↓
gotcha When handling binary data, `engine.io-parser` automatically encodes it as base64 strings within payloads if not explicitly handled as raw binary. While convenient for universal transport, this can introduce a performance overhead due to increased data size and encoding/decoding CPU cycles, especially for large binary payloads. Be aware of the `binary support` parameter in `encodePacket` and the `binary type` in `decodePacket`. ↓
gotcha The representation of binary data (Buffer, ArrayBuffer, Blob) varies between Node.js and browser environments. While `engine.io-parser` abstracts some of this, direct manipulation or assumptions about the underlying binary type can lead to cross-environment bugs if not carefully handled. `decodePacket` can return `ArrayBuffer` in Node.js, but `Blob` in browsers. ↓
Install
npm install engine.io-parser yarn add engine.io-parser pnpm add engine.io-parser Imports
- parser wrong
import parser from 'engine.io-parser';correctimport * as parser from 'engine.io-parser'; - encodePacket wrong
const { encodePacket } = require('engine.io-parser');correctimport { encodePacket } from 'engine.io-parser'; - decodePayload wrong
import { Parser } from 'engine.io-parser';correctimport { decodePayload } from 'engine.io-parser';
Quickstart
import { encodePacket, decodePacket, encodePayload, decodePayload } from 'engine.io-parser';
import { Buffer } from 'buffer'; // Node.js Buffer for example
const data = Buffer.from([ 1, 2, 3, 4 ]);
console.log('--- Packet Encoding/Decoding ---');
encodePacket({ type: 'message', data }, true, encoded => {
console.log('Encoded Packet:', encoded); // Should be a string or ArrayBuffer
const decodedPacket = decodePacket(encoded, 'arraybuffer');
console.log('Decoded Packet:', decodedPacket.data); // Should be { type: 'message', data: ArrayBuffer }
});
console.log('\n--- Payload Encoding/Decoding ---');
const testBuffer = new Int8Array(10);
for (let i = 0; i < testBuffer.length; i++) testBuffer[i] = i;
const packets = [
{ type: 'message', data: testBuffer.buffer },
{ type: 'message', data: 'hello world' }
];
encodePayload(packets, encodedPayload => {
console.log('Encoded Payload:', encodedPayload);
decodePayload(encodedPayload, (packet, index, total) => {
console.log(`Decoded Payload Packet ${index + 1}/${total}:`, packet);
if (index === 0) {
console.log(' Binary data (ArrayBuffer):', new Int8Array(packet.data));
} else {
console.log(' String data:', packet.data);
}
});
});