'use strict';Object.defineProperty(exports,'__esModule',{value:true});var_defs=require('./defs');var_actions=require('./actions');var_utils=require('../utils');constCMD_NEW_CONN=0;constCMD_DATA_FRAME=1;constCMD_CLOSE_CONN=2;classMuxPresetextends_defs.IPresetAddressing{constructor(...args){var_temp;return_temp=super(...args),this._adBuf=null,_temp}onInit(){this._adBuf=new_utils.AdvancedBuffer({getPacketLength:this.onReceiving.bind(this)});this._adBuf.on('data',this.onChunkReceived.bind(this))}onDestroy(){this._adBuf.clear();this._adBuf=null}onReceiving(buffer,{fail}){if(buffer.length<5){return}constcmd=buffer[0];switch(cmd){caseCMD_NEW_CONN:if(buffer.length<8+buffer[5]){return}return8+buffer[5];caseCMD_DATA_FRAME:if(buffer.length<7){return}return7+buffer.readUInt16BE(5);caseCMD_CLOSE_CONN:return5;default:fail(`unknown cmd=${cmd} dump=${(0,_utils.dumpHex)(buffer)}`);return-1;}}onChunkReceived(chunk,{broadcast,fail}){constcmd=chunk[0];constcid=chunk.slice(1,5).toString('hex');switch(cmd){caseCMD_NEW_CONN:{consthostBuf=chunk.slice(6,-2);consthost=hostBuf.toString();constport=chunk.readUInt16BE(6+chunk[5]);if(!(0,_utils.isValidHostname)(host)||!(0,_utils.isValidPort)(port)){returnfail(`invalid host or port, host=${(0,_utils.dumpHex)(hostBuf)} port=${port}`)}returnbroadcast({type:_actions.MUX_NEW_CONN,payload:{cid,host,port}})}caseCMD_DATA_FRAME:{constdataLen=chunk.readUInt16BE(5);returnbroadcast({type:_actions.MUX_DATA_FRAME,payload:{cid,data:chunk.slice(-dataLen)}})}caseCMD_CLOSE_CONN:returnbroadcast({type:_actions.MUX_CLOSE_CONN,payload:{cid}});}}createDataFrames(cid,data){constchunks=(0,_utils.getRandomChunks)(data,2048,16383).map(chunk=>Buffer.concat([(0,_utils.numberToBuffer)(CMD_DATA_FRAME,1),cid,(0,_utils.numberToBuffer)(chunk.length),chunk]));returnBuffer.concat(chunks)}createNewConn(host,port,cid){const_host=Buffer.from(host);const_port=(0,_utils.numberToBuffer)(port);returnBuffer.concat([(0,_utils.numberToBuffer)(CMD_NEW_CONN,1),cid,(0,_utils.numberToBuffer)(_host.length,1),_host,_port])}createCloseConn(cid){returnBuffer.concat([(0,_utils.numberToBuffer)(CMD_CLOSE_CONN,1),cid])}clientOut({buffer,fail},{host,port,cid,isClosing}){if(cid!==undefined){const_cid=Buffer.from(cid,'hex');constdataFrames=this.createDataFrames(_cid,buffer);if(host&&port){returnBuffer.concat([this.createNewConn(host,port,_cid),dataFrames])}if(isClosing){returnthis.createCloseConn(_cid)}returndataFrames}else{fail(`cid is not provided, drop buffer=${(0,_utils.dumpHex)(buffer)}`)}}serverOut({buffer,fail},{cid,isClosing}){if(cid!==undefined){const_cid=Buffer.from(cid,'hex');if(isClosing){returnthis.createCloseConn(_cid)}returnthis.createDataFrames(_cid,buffer)}else{fail(`cid is not provided, drop buffer=${(0,_utils.dumpHex)(buffer)}`)}}beforeIn({buffer,broadcast,fail}){this._adBuf.put(buffer,{broadcast,fail})}}exports.default=MuxPreset;