79 lines
2.0 KiB
JavaScript
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;
|