UNPKG

@colyseus/core

Version:

Multiplayer Framework for Node.js.

102 lines (101 loc) 4.53 kB
// packages/core/src/Protocol.ts import { Packr } from "@colyseus/msgpackr"; import { encode } from "@colyseus/schema"; var Protocol = /* @__PURE__ */ ((Protocol2) => { Protocol2[Protocol2["JOIN_ROOM"] = 10] = "JOIN_ROOM"; Protocol2[Protocol2["ERROR"] = 11] = "ERROR"; Protocol2[Protocol2["LEAVE_ROOM"] = 12] = "LEAVE_ROOM"; Protocol2[Protocol2["ROOM_DATA"] = 13] = "ROOM_DATA"; Protocol2[Protocol2["ROOM_STATE"] = 14] = "ROOM_STATE"; Protocol2[Protocol2["ROOM_STATE_PATCH"] = 15] = "ROOM_STATE_PATCH"; Protocol2[Protocol2["ROOM_DATA_BYTES"] = 17] = "ROOM_DATA_BYTES"; Protocol2[Protocol2["WS_CLOSE_NORMAL"] = 1e3] = "WS_CLOSE_NORMAL"; Protocol2[Protocol2["WS_CLOSE_GOING_AWAY"] = 1001] = "WS_CLOSE_GOING_AWAY"; Protocol2[Protocol2["WS_CLOSE_CONSENTED"] = 4e3] = "WS_CLOSE_CONSENTED"; Protocol2[Protocol2["WS_CLOSE_WITH_ERROR"] = 4002] = "WS_CLOSE_WITH_ERROR"; Protocol2[Protocol2["WS_CLOSE_DEVMODE_RESTART"] = 4010] = "WS_CLOSE_DEVMODE_RESTART"; Protocol2[Protocol2["WS_SERVER_DISCONNECT"] = 4201] = "WS_SERVER_DISCONNECT"; Protocol2[Protocol2["WS_TOO_MANY_CLIENTS"] = 4202] = "WS_TOO_MANY_CLIENTS"; return Protocol2; })(Protocol || {}); var ErrorCode = /* @__PURE__ */ ((ErrorCode2) => { ErrorCode2[ErrorCode2["MATCHMAKE_NO_HANDLER"] = 4210] = "MATCHMAKE_NO_HANDLER"; ErrorCode2[ErrorCode2["MATCHMAKE_INVALID_CRITERIA"] = 4211] = "MATCHMAKE_INVALID_CRITERIA"; ErrorCode2[ErrorCode2["MATCHMAKE_INVALID_ROOM_ID"] = 4212] = "MATCHMAKE_INVALID_ROOM_ID"; ErrorCode2[ErrorCode2["MATCHMAKE_UNHANDLED"] = 4213] = "MATCHMAKE_UNHANDLED"; ErrorCode2[ErrorCode2["MATCHMAKE_EXPIRED"] = 4214] = "MATCHMAKE_EXPIRED"; ErrorCode2[ErrorCode2["AUTH_FAILED"] = 4215] = "AUTH_FAILED"; ErrorCode2[ErrorCode2["APPLICATION_ERROR"] = 4216] = "APPLICATION_ERROR"; ErrorCode2[ErrorCode2["INVALID_PAYLOAD"] = 4217] = "INVALID_PAYLOAD"; return ErrorCode2; })(ErrorCode || {}); var IpcProtocol = /* @__PURE__ */ ((IpcProtocol2) => { IpcProtocol2[IpcProtocol2["SUCCESS"] = 0] = "SUCCESS"; IpcProtocol2[IpcProtocol2["ERROR"] = 1] = "ERROR"; IpcProtocol2[IpcProtocol2["TIMEOUT"] = 2] = "TIMEOUT"; return IpcProtocol2; })(IpcProtocol || {}); var packr = new Packr({ useRecords: false // increased compatibility with decoders other than "msgpackr" }); packr.encode(void 0); var getMessageBytes = { [10 /* JOIN_ROOM */]: (reconnectionToken, serializerId, handshake) => { const it = { offset: 1 }; packr.buffer[0] = 10 /* 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) { handshake.copy(packr.buffer, it.offset, 0, handshakeLength); } return Buffer.from(packr.buffer.subarray(0, it.offset + handshakeLength)); }, [11 /* ERROR */]: (code, message = "") => { const it = { offset: 1 }; packr.buffer[0] = 11 /* ERROR */; encode.number(packr.buffer, code, it); encode.string(packr.buffer, message, it); return Buffer.from(packr.buffer.subarray(0, it.offset)); }, [14 /* ROOM_STATE */]: (bytes) => { return [14 /* ROOM_STATE */, ...bytes]; }, 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 { ErrorCode, IpcProtocol, Protocol, getMessageBytes };