1
0
mirror of synced 2025-02-21 15:29:30 +01:00
shadowtenpo/ccencap.js
2022-02-21 16:31:55 -08:00

79 lines
2.0 KiB
JavaScript

var CCEncap = {};
const CCM_NET_SENDTCP = 0x01;
const CCM_NET_SENDUDP = 0x02;
const CCM_PARTY_CREATE = 0x30;
const CCM_PARTY_HELLO = 0x31;
const CCM_PARTY_UPDATE = 0x32;
CCEncap.encodePartyCreate = function(req) {
var msg = Buffer.from(JSON.stringify(req));
msg[0] = CCM_PARTY_CREATE;
return msg;
}
CCEncap.encodePartyHello = function(req) {
var msg = Buffer.from(JSON.stringify(req));
msg[0] = CCM_PARTY_HELLO;
return msg;
}
CCEncap.encodePartyUpdate = function(req) {
var msg = Buffer.from(JSON.stringify(req));
msg[0] = CCM_PARTY_UPDATE;
return msg;
}
CCEncap.encodePacket = function(src, dst, sport, dport, type, data) {
if (type == 'tcp') {
var header = CCM_NET_SENDTCP;
} else if (type == 'udp') {
var header = CCM_NET_SENDUDP;
} else {
throw new Error('Invalid network protocol: ' + type);
}
var msg = Buffer.alloc(data.length + 7);
msg[0] = header;
msg[1] = dst;
msg.writeUInt16LE(sport, 2);
msg.writeUInt16LE(dport, 4);
msg[6] = src;
data.copy(msg, 7);
console.log(type + "_send "+src+':'+sport+'->'+dst+':'+dport);
return msg;
}
CCEncap.decode = function(msg) {
var opcode = msg[0], data = msg;
var ret = {op: '?'};
switch(opcode) {
case CCM_PARTY_CREATE: ret.op = 'party_create'; break;
case CCM_PARTY_HELLO: ret.op = 'party_hello'; break;
case CCM_PARTY_UPDATE: ret.op = 'party_update'; break;
case CCM_NET_SENDTCP: ret.op = 'net_tcp'; break;
case CCM_NET_SENDUDP: ret.op = 'net_udp'; break;
}
switch(opcode) {
case CCM_PARTY_CREATE:
case CCM_PARTY_HELLO:
case CCM_PARTY_UPDATE:
msg[0] = 0x7b; // '{'
Object.assign(ret, JSON.parse(msg));
break;
case CCM_NET_SENDTCP:
case CCM_NET_SENDUDP:
ret.dst = msg[1];
ret.src = msg[6];
ret.sport = msg.readUInt16LE(2);
ret.dport = msg.readUInt16LE(4);
// ret.msg = msg.slice(7);
console.log(ret.op+" "+ret.src+':'+ret.sport+'->'+ret.dst+':'+ret.dport);
break;
default:
console.warn('Received unknown opcode: ' + opcode.toString(16));
}
return ret;
}
module.exports = CCEncap;