UNPKG

@colyseus/core

Version:

Multiplayer Framework for Node.js.

76 lines (75 loc) 2.68 kB
// packages/core/src/Protocol.ts import { Packr } from "@colyseus/msgpackr"; import { encode } from "@colyseus/schema"; import { Protocol } from "@colyseus/shared-types"; var IpcProtocol = { SUCCESS: 0, ERROR: 1, TIMEOUT: 2 }; var packr = new Packr({ useRecords: false // increased compatibility with decoders other than "msgpackr" }); packr.encode(void 0); var getMessageBytes = { [Protocol.JOIN_ROOM]: (reconnectionToken, serializerId, handshake) => { const it = { offset: 1 }; packr.buffer[0] = Protocol.JOIN_ROOM; packr.buffer[it.offset++] = Buffer.byteLength(reconnectionToken, "utf8"); encode.utf8Write(packr.buffer, reconnectionToken, it); packr.buffer[it.offset++] = Buffer.byteLength(serializerId, "utf8"); encode.utf8Write(packr.buffer, serializerId, it); let handshakeLength = handshake?.byteLength || 0; if (handshakeLength > packr.buffer.byteLength - it.offset) { packr.useBuffer(Buffer.alloc(it.offset + handshakeLength, packr.buffer)); } if (handshakeLength > 0) { packr.buffer.set(handshake, it.offset); } return Buffer.from(packr.buffer.subarray(0, it.offset + handshakeLength)); }, [Protocol.ERROR]: (code, message = "") => { const it = { offset: 1 }; packr.buffer[0] = Protocol.ERROR; encode.number(packr.buffer, code, it); encode.string(packr.buffer, message, it); return Buffer.from(packr.buffer.subarray(0, it.offset)); }, [Protocol.ROOM_STATE]: (bytes) => { return [Protocol.ROOM_STATE, ...bytes]; }, [Protocol.PING]: () => { packr.buffer[0] = Protocol.PING; return Buffer.from(packr.buffer.subarray(0, 1)); }, raw: (code, type, message, rawMessage) => { const it = { offset: 1 }; packr.buffer[0] = code; if (typeof type === "string") { encode.string(packr.buffer, type, it); } else { encode.number(packr.buffer, type, it); } if (message !== void 0) { packr.position = 0; if (process.env.NODE_ENV !== "production") { packr.useBuffer(packr.buffer); } const endOfBufferOffset = packr.pack(message, 2048 + it.offset).byteLength; return Buffer.from(packr.buffer.subarray(0, endOfBufferOffset)); } else if (rawMessage !== void 0) { if (rawMessage.length + it.offset > packr.buffer.byteLength) { packr.useBuffer(Buffer.alloc(it.offset + rawMessage.length, packr.buffer)); } packr.buffer.set(rawMessage, it.offset); return Buffer.from(packr.buffer.subarray(0, it.offset + rawMessage.byteLength)); } else { return Buffer.from(packr.buffer.subarray(0, it.offset)); } } }; export { IpcProtocol, getMessageBytes };