@colyseus/core
Version:
Multiplayer Framework for Node.js.
76 lines (75 loc) • 2.68 kB
JavaScript
// 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
};