badmfck-api-server 3.9.85 → 3.9.87

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/dist/apiServer/APIService.js +1 -1
  2. package/dist/apiServer/helper/ZipUtils.d.ts +8 -0
  3. package/dist/apiServer/helper/ZipUtils.js +28 -0
  4. package/dist/apiServer/interceptors/IntHmacSha256.d.ts +5 -0
  5. package/dist/apiServer/interceptors/IntHmacSha256.js +22 -0
  6. package/dist/index.d.ts +2 -1
  7. package/dist/index.js +3 -1
  8. package/package.json +1 -1
  9. package/dist/apiServer/APIService.js.map +0 -1
  10. package/dist/apiServer/BaseEndpoint.js.map +0 -1
  11. package/dist/apiServer/BaseService.js.map +0 -1
  12. package/dist/apiServer/ClusterService.d.ts +0 -30
  13. package/dist/apiServer/ClusterService.js +0 -81
  14. package/dist/apiServer/ClusterService.js.map +0 -1
  15. package/dist/apiServer/DocumentService.js.map +0 -1
  16. package/dist/apiServer/HUBService.d.ts +0 -37
  17. package/dist/apiServer/HUBService.js +0 -132
  18. package/dist/apiServer/HUBService.js.map +0 -1
  19. package/dist/apiServer/LocalRequest.js.map +0 -1
  20. package/dist/apiServer/LogService.js.map +0 -1
  21. package/dist/apiServer/MysqlService.js.map +0 -1
  22. package/dist/apiServer/WSAPITransport.js.map +0 -1
  23. package/dist/apiServer/WebSocketHandler.js.map +0 -1
  24. package/dist/apiServer/Websocket.d.ts +0 -8
  25. package/dist/apiServer/Websocket.js +0 -15
  26. package/dist/apiServer/WebsocketService.d.ts +0 -8
  27. package/dist/apiServer/WebsocketService.js +0 -18
  28. package/dist/apiServer/WebsocketService.js.map +0 -1
  29. package/dist/apiServer/cluster/HUBConnection.d.ts +0 -39
  30. package/dist/apiServer/cluster/HUBConnection.js +0 -251
  31. package/dist/apiServer/cluster/HUBConnection.js.map +0 -1
  32. package/dist/apiServer/cluster/HUBHandlres.d.ts +0 -0
  33. package/dist/apiServer/cluster/HUBHandlres.js +0 -2
  34. package/dist/apiServer/cluster/HUBHandlres.js.map +0 -1
  35. package/dist/apiServer/deployment/Deployment.js.map +0 -1
  36. package/dist/apiServer/helper/DataProvider.js.map +0 -1
  37. package/dist/apiServer/helper/Sleep.js.map +0 -1
  38. package/dist/apiServer/helper/UID.js.map +0 -1
  39. package/dist/apiServer/helper/Validator.js.map +0 -1
  40. package/dist/apiServer/monitor/Monitor.js.map +0 -1
  41. package/dist/apiServer/routes/Liveness.js.map +0 -1
  42. package/dist/apiServer/routes/Monitor.d.ts +0 -9
  43. package/dist/apiServer/routes/Monitor.js +0 -77
  44. package/dist/apiServer/routes/Readiness.js.map +0 -1
  45. package/dist/apiServer/structures/DefaultErrors.js.map +0 -1
  46. package/dist/apiServer/structures/HTTPStatus.js.map +0 -1
  47. package/dist/apiServer/structures/Interfaces.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"LocalRequest.js","sourceRoot":"","sources":["../../src/apiServer/LocalRequest.ts"],"names":[],"mappings":";;;;;;AAAA,kDAAwE;AAsCjE,MAAM,YAAY,GAAG,KAAK,EAAE,EAAU,EAAE,IAAU,EAAE,MAAe,EAAC,OAA8B,EAAE,EAAE;IAC5G,IAAI,CAAC,GAAG,KAAK,CAAA;IACb,IAAI,MAAM;QACT,CAAC,GAAG,MAAM,CAAC,WAAW,EAAE,CAAC;IAC1B,IAAI,IAAI,IAAI,CAAC,MAAM;QAClB,CAAC,GAAG,MAAM,CAAA;IAEX,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QACrB,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IACrB,IAAI,GAAG,GAAG,wBAAwB,GAAG,EAAE,CAAC;IAExC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC;QACtC,GAAG,GAAG,EAAE,CAAC;IAEV,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,CAAC,GAAG,CAAC,YAAY,EAAE,GAAG,CAAC,CAAA;IAC9B,IAAI;QACH,IAAI,CAAC,KAAK,KAAK;YACd,IAAI,GAAG,MAAM,eAAK,CAAC,GAAG,CAAC,GAAG,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAC;QAC/C,IAAI,CAAC,KAAK,MAAM;YACf,IAAI,GAAG,MAAM,eAAK,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,EAAC,EAAC,OAAO,EAAC,OAAO,EAAC,CAAC,CAAA;KACrD;IAAC,OAAO,CAAC,EAAE;QACX,OAAO,CAAC,GAAG,CAAC,sBAAsB,EAAC,CAAC,CAAC,CAAA;KACrC;IACD,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAA;AAClB,CAAC,CAAA;AAzBY,QAAA,YAAY,gBAyBxB","sourcesContent":["import axios, { AxiosResponse, InternalAxiosRequestConfig } from \"axios\"\n\n/*axios.interceptors.request.use((x:InternalAxiosRequestConfig<any>)=>{\n\tconsole.log(`AXIOS REQ:\\n\\turl:${x.url}\\n\\tmethod: ${x.method}\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})\n\naxios.interceptors.response.use((x:AxiosResponse)=>{\n\tconsole.log(`AXIOS RESP:\\n\\tdata: ${(()=>{\n\t\tif(typeof x.data === \"string\" )\n\t\t\treturn x.data\n\n\t\treturn JSON.stringify(x.data,null,\"\\t\\t\");\n\t})()}\\n\\theaders:\\n${(()=>{\n\t\tlet h = \"\";\n\t\tfor(let i in x.headers){\n\t\t\tif(h!==\"\")\n\t\t\t\th+=\"\\n\"\n\t\t\th+=\"\\t\\t\"+i+\" = \"+x.headers[i]\n\t\t}\n\t\treturn h\n\t})()}`)\n\treturn x;\n})*/\n\nexport const LocalRequest = async (ep: string, data?: any, method?: string,headers?:{[key:string]:string}) => {\n\tlet m = \"get\"\n\tif (method)\n\t\tm = method.toLowerCase();\n\tif (data && !method)\n\t\tm = \"post\"\n\n\tif (ep.startsWith(\"/\"))\n\t\tep = ep.substring(1)\n\tlet url = \"http://localhost:8091/\" + ep;\n\t\n\tif (ep.toLowerCase().startsWith(\"http\"))\n\t\turl = ep;\n\n\tlet resp = null;\n\tconsole.log(\"open url: \", url)\n\ttry {\n\t\tif (m === \"get\")\n\t\t\tresp = await axios.get(url,{headers:headers});\n\t\tif (m === \"post\")\n\t\t\tresp = await axios.post(url, data,{headers:headers})\n\t} catch (e) {\n\t\tconsole.log(\"ERROR! cant open url\",e)\n\t}\n\tconsole.log(resp)\n}\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"LogService.js","sourceRoot":"","sources":["../../src/apiServer/LogService.ts"],"names":[],"mappings":"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","sourcesContent":["import Signal, { Req } from \"badmfck-signal\";\nimport { BaseService } from \"./BaseService\";\n\nexport enum LOG_LEVEL{\n ALL=0,\n INFO=1,\n WARN=2,\n ERROR=3,\n CRIT=4\n}\nexport interface ILogItem{\n id:number,\n level:LOG_LEVEL,\n time:number,\n text:string\n date:string\n source:string\n}\n\nexport interface ILogServiceOptions{\n output?:(data:ILogItem)=>void,\n stackSize:number\n level:LOG_LEVEL\n textLimit:number\n watchFor?:string[]\n}\n\nexport const getDefaultLogOptions=():ILogServiceOptions=>{\n return {\n stackSize:100,\n textLimit:1024,\n level:LOG_LEVEL.ALL\n }\n}\n\nexport const logInfo=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.INFO,data:[message,optional]})}\nexport const logWarn=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.WARN,data:[message,optional]})}\nexport const logCrit=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.CRIT,data:[message,optional]})}\nexport const logError=(message:any,...optional:any[])=>{S_LOG.invoke({level:LOG_LEVEL.ERROR,data:[message,optional]})}\n\n\nexport const S_LOG=new Signal<{level:LOG_LEVEL,data:any[]}>()\nexport const S_LOG_CREATED=new Signal<ILogItem>()\nexport const S_LOG_CHANGE_LEVEL=new Signal<LOG_LEVEL>();\nexport const S_LOG_FLUSH=new Signal<void>();\nexport const S_LOG_ADD_SERVICE_TO_WATCH=new Signal<string>();\nexport const S_LOG_REMOVE_SERVICE_FROM_WATCH=new Signal<string>();\nexport const S_LOG_SET_TEXT_LIMIT=new Signal<number>();\nexport const REQ_LOG=new Req<{lastID:number}|null|undefined,ILogItem[]>();\nexport const REQ_LOG_UNIQUE_SERVICES=new Req<void,{name:string,count:number}[]>();\n\nexport class LogService extends BaseService{\n\n static nextID=0;\n log:ILogItem[]=[];\n options:ILogServiceOptions\n level:LOG_LEVEL=LOG_LEVEL.ALL\n \n uniqueServices:Map<string,number>=new Map() // service name (name.js) & count of log requests\n\n constructor(opt?:ILogServiceOptions){\n super(\"LogService\");\n if(!opt)\n opt=getDefaultLogOptions();\n this.options=opt;\n this.level = opt.level\n this.checkTextLimit();\n }\n\n async init(){\n \n REQ_LOG_UNIQUE_SERVICES.listener = async ()=>{\n const arr=[];\n for(let i of this.uniqueServices)\n arr.push({name:i[0],count:i[1]})\n return arr;\n }\n\n REQ_LOG.listener = async (req) => {\n if(req && req.lastID){ \n let result=this.log.filter(val=>val.id>req.lastID)\n return result\n }else\n return [...this.log]\n }\n\n S_LOG_SET_TEXT_LIMIT.subscribe(l=>{\n this.options.textLimit=l;\n this.checkTextLimit();\n })\n \n S_LOG_ADD_SERVICE_TO_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n this.options.watchFor=[];\n\n if(this.options.watchFor.find(val=>val===service)){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" aleready added\");\n return;\n }\n this.options.watchFor.push(service);\n })\n\n S_LOG_REMOVE_SERVICE_FROM_WATCH.subscribe(service=>{\n if(!this.options.watchFor)\n return;\n\n try{\n const i = this.options.watchFor.findIndex(val=>val===service)\n if(i>-1)\n this.options.watchFor.splice(i,1);\n }catch(e){\n logCrit(\"${LogService.js}\",\"Service \\\"\"+service+\"\\\" not deleted\");\n }\n })\n\n S_LOG_CHANGE_LEVEL.subscribe(l=>{this.level=l})\n\n S_LOG_FLUSH.subscribe(()=>this.log=[])\n\n S_LOG.subscribe((log)=>{\n\n if(log.level<this.level)\n return;\n\n const msg=log.data[0];\n const optional=log.data[1];\n let text = this.createText(msg,log.level);\n let source=\"\";\n if(text.startsWith(\"${\") && text.endsWith(\"}\") && text.indexOf(\".js\")!==-1){\n source=text.substring(2,text.length-1);\n text = \"\"\n }\n\n const usc=this.uniqueServices.get(source) ?? 0;\n this.uniqueServices.set(source,usc+1)\n\n let showlog=true;\n if(this.options && this.options.watchFor && Array.isArray(this.options.watchFor) && this.options.watchFor.length>0){\n showlog=false;\n for(let i of this.options.watchFor){\n if(source.toLowerCase().indexOf(i.toLowerCase())!==-1){\n showlog=true;\n break;\n }\n }\n }\n\n if(!showlog && this.level===LOG_LEVEL.CRIT)\n showlog=true;\n\n if(optional){\n for(let i of optional)\n text+=\", \"+this.createText(i,this.level);\n }\n\n const d = new Date();\n const logitem:ILogItem={\n level:log.level,\n id:LogService.nextID++,\n text:text,\n time:d.getTime(),\n date:this.createDate(d),\n source:source\n }\n\n // output as string\n if(this.options.output){ \n this.options.output(logitem);\n }\n\n // fire log item\n S_LOG_CREATED.invoke(logitem)\n\n // add log item to stack\n this.log.push(logitem);\n let limit = this.options.stackSize ?? 100\n if(limit>1000)\n limit = 1000\n if(this.log.length>limit)\n this.log.shift();\n\n })\n\n super.init();\n }\n\n checkTextLimit(){\n if(this.options.textLimit>1024*4)\n this.options.textLimit=1024*4\n }\n\n createDate(d?:Date):string{\n if(!d)\n d=new Date();\n return d.getFullYear()+\"-\"+this.leadZero(d.getMonth()+1)+\"-\"+this.leadZero(d.getDate())+\" \"+this.leadZero(d.getHours())+\":\"+this.leadZero(d.getMinutes())+\":\"+this.leadZero(d.getSeconds());\n }\n\n leadZero(num:number):string{\n if(num<10)\n return \"0\"+num;\n return num+\"\"\n }\n\n createText(data:any,level:LOG_LEVEL){\n \n if(data === null)\n return \"null\"\n\n if(data === undefined)\n return \"undefined\"\n\n let res=\"\"\n \n if(typeof data ===\"object\"){\n \n try{\n const tmp =JSON.stringify(data,null,\"\\t\")\n res = tmp ?? \"\";\n }catch(e){\n if(\"toString\" in data && data.toString && typeof data.toString === \"function\")\n res = data.toString()\n }\n \n\n if(`${data}`===\"[object Map]\" && \"size\" in data){\n // try to parse map!\n try{\n const arr=[];\n for(let i of data)\n arr.push({key:i[0],value:i[1]})\n res = \"MAP (size:\"+data.size+\") \\n\"+JSON.stringify(arr,null,\"\\t\");\n }catch(e){}\n }\n \n if(Array.isArray(data))\n res+\", total items: \"+data.length \n\n }else{\n res=data+\"\"\n }\n\n if(res.length>this.options.textLimit && level===LOG_LEVEL.INFO)\n res=res.substring(0,this.options.textLimit)+\"... (total: \"+res.length+\")\"\n return res\n }\n}"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"MysqlService.js","sourceRoot":"","sources":["../../src/apiServer/MysqlService.ts"],"names":[],"mappings":"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","sourcesContent":["//import mysql, { FieldInfo, MysqlError, Pool, PoolConnection } from \"mysql\"\n\nimport { BaseService } from \"./BaseService\";\nimport Signal, { Req } from \"badmfck-signal\";\nimport { createCipheriv, createDecipheriv, createHash } from \"crypto\"\nimport { logCrit, logError, logInfo, logWarn } from \"./LogService\";\nimport * as mysql from \"mysql2/promise\"\nimport fs from \"fs\"\nimport path from \"path\"\nimport { IError } from \"./structures/Interfaces\";\n\nexport const S_MYSQL_STARTED=new Signal<void>()\nexport const REQ_MYSQL_QUERY = new Req<MySqlQuery|MySqlQuery[],MysqlResult[]>(undefined,\"REQ_MYSQL_QUERY\");\n//export const REQ_MYSQL_TRANSACTION = new Req<MySqlQuery[],MysqlResult>(undefined,\"REQ_MYSQL_TRANSACTION\");\n\nexport const REQ_MYSQL_TBEGIN = new Req<void,MysqlError|number>(undefined,\"REQ_MYSQL_TRANSACTION_BEGING\"); // return transaction id or mysql error\nexport const REQ_MYSQL_TQUERY=new Req<{query:MySqlQuery,tid:number},MysqlResult>(undefined,\"REQ_MYSQL_TRANSACTION_ADD_OPERATION\"); // tid means transaction id\nexport const REQ_MYSQL_TCOMMIT=new Req<number,MysqlError|null>(undefined,\"REQ_MYSQL_TCOMMIT\"); // tid\nexport const REQ_MYSQL_TROLLBACK=new Req<number,MysqlError|null>(undefined,\"REQ_MYSQL_TROLLBACK\"); // tid\n\nexport const executeQuery = async (query:MySqlQuery|MySqlQuery[]):Promise<MysqlResult[]>=>{return await REQ_MYSQL_QUERY.request(query)}\n\nexport interface MysqlServiceOptions{\n connectionLimit:number,\n host:string,\n user:string,\n password:string,\n port:number,\n database:string, \n queueLimit?:number,\n transactionFailReport?:(trx:ITransaction,message:string)=>void,\n transactionFailReportDir?:string,\n debug?:boolean,\n naxTransactionWaitTime?:number,\n\tmigrations?:{\n\t\tdir:string,\n\t\tcallback:()=>void\n\t}|null\n}\n\nexport interface MysqlError{\n code: string,\n errno: number,\n sql: string,\n name:string,\n message:string\n fatal?:boolean\n}\n\nexport interface MysqlResult{\n error?:MysqlError|null,\n rollbackError?:MysqlError|null,\n isDuplicateError?:boolean\n data:any\n}\n\nexport interface MySqlQuery{\n query:string\n fields:MysqlQueryField[]|MysqlQueryFieldObject,\n rollbackQuery?:string|null\n transactionID?:number\n}\n\nexport interface MysqlQueryField{\n name:string,\n value:string|number|boolean|null|undefined,\n system?:boolean,\n ignoreInInsert?:boolean,\n ignoreInUpdate?:boolean\n useInReplace?:boolean,\n _parsedValue?:string|number|boolean|null\n}\n\nexport interface ITransaction{\n id:number\n timestamp:number,\n conn:mysql.PoolConnection,\n queries:{sql:string,status:string}[]\n}\n\nexport interface MysqlQueryFieldObject extends Record<string,string|number|boolean|null|undefined|{name?:string|null,value:string|number|boolean|null|undefined,system?:boolean,ignoreInInsert?:boolean,ignoreInUpdate?:boolean,useInReplace?:boolean}>{\n\n}\n \n\n/**\n * Mysql Services, execute queries\n * MySqlQuery.query:\n * @fields - replaced by field's names\n * @values - replaced by parsed values\n * @onupdate - repalced by pair field name = value\n * @onduplicate - replaced by pair field name = value\n */\n\nexport class MysqlService extends BaseService{\n\n reconnectionTimeout=1000*3;\n reconnecting=false;\n pool:mysql.Pool|null=null;\n options:MysqlServiceOptions;\n serviceStarted=false;\n timeoutID:any\n\n debug=false;\n\n queries=[]; // TODO: STORE QUERIES SENTS BEFORE THE SERVICE IS STARTED!\n static nextTransactionID=1;\n transactions:ITransaction[]=[]\n\n maxTransactionWaitTime = 1000*60*1; // 1 min and detelete transaction\n\n failReportFileStream:fs.WriteStream|null=null;\n failReportFileStreamName:string|null=null;\n failReportLastAccessTime:number=0;\n\n constructor(options:MysqlServiceOptions){\n super(\"mysql\");\n this.options = options;\n \n\n // decrypt when needed\n if(this.options.host.startsWith(\"_\"))\n this.options.host = decrypt(this.options.host.substring(1)) ?? this.options.host\n if(this.options.user.startsWith(\"_\"))\n this.options.user = decrypt(this.options.user.substring(1)) ?? this.options.user\n if(this.options.database.startsWith(\"_\"))\n this.options.database = decrypt(this.options.database.substring(1)) ?? this.options.database\n if(this.options.password.startsWith(\"_\"))\n this.options.password = decrypt(this.options.password.substring(1)) ?? this.options.password\n\n if(this.options.debug)\n this.debug = true\n if(this.options.naxTransactionWaitTime)\n this.maxTransactionWaitTime = this.options.naxTransactionWaitTime;\n\n setInterval(()=>{\n // check transactions\n const now = Date.now();\n const count = this.transactions.length;\n const removedIDs:number[]=[];\n for(let i of this.transactions){\n if(now-i.timestamp>this.maxTransactionWaitTime){\n logError(\"Release transaction connection due to timeout\")\n this.rollbackTransaction(i,true);\n removedIDs.push(i.id)\n }\n }\n\n this.transactions = this.transactions.filter(i=>!removedIDs.includes(i.id))\n \n if(this.debug)\n console.log(\"Removed: \",count-this.transactions.length)\n\n \n\n },1000*30)\n\n setInterval(()=>{\n if(!this.failReportFileStream)\n return;\n \n // after 15 min of inactivity, close file\n if(Date.now()-this.failReportLastAccessTime>1000*60*15){\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n\n },1000*60*5)\n\n if(options.transactionFailReportDir){\n try{\n if (!fs.existsSync(options.transactionFailReportDir)){\n fs.mkdirSync(options.transactionFailReportDir);\n }\n }catch(e){\n options.transactionFailReportDir=undefined;\n logCrit(\"${MysqlService.js}\",\"Can't create transaction fail report dir\")\n }\n }\n }\n\n static async executeQuery (query:MySqlQuery|MySqlQuery[]):Promise<MysqlResult[]>{ return await REQ_MYSQL_QUERY.request(query) }\n\n async init(){\n super.init();\n\n // setup process exit handlers interrupt (ctrl+c)\n process.on('SIGINT', async () => {\n await this.finishApp();\n process.exit(0);\n });\n \n // terminate (kill)\n process.on('SIGTERM',async () => {\n await this.finishApp();\n process.exit(0);\n });\n\n this.serviceStarted=false;\n let poolCreated:boolean = false;\n\n while(!poolCreated){\n logInfo(\"${MysqlService.js}\",\"Connecting to MYSQL!\")\n poolCreated = await this.recreatePool();\n if(!poolCreated){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL! Retrying in 3 seconds...\")\n await new Promise((resolve)=>setTimeout(resolve,3000))\n }\n }\n\n REQ_MYSQL_QUERY.listener=async data =>{\n if(!Array.isArray(data))\n data=[data];\n const promises=[]\n for(let i of data){\n const query = MysqlService.prepareQuery(i.query,i.fields);\n promises.push(this.execute(query,i.rollbackQuery ?? null,i.transactionID ?? 0));\n }\n \n if(this.debug)\n console.log(\"Execute queries: \",data.length)\n \n return await Promise.all(promises);\n }\n\n REQ_MYSQL_TBEGIN.listener=async ()=>{ \n const conn = await this.pool?.getConnection();\n if(!conn)\n return {code:\"NO_POOL\",errno:100000,fatal:true,sql:\"\",name:\"NO_POOL\",message:\"Mysql pool not created\"}\n\n // find conn in transactions\n for(let i of this.transactions){\n if(i.conn===conn){\n logInfo(\"Your connection is in transaction\")\n return {code:\"CONN_IN_TRX\",errno:100005,fatal:true,sql:\"\",name:\"CONN_IN_TRX\",message:\"Connection is in transaction\"}\n }\n }\n\n const tid = MysqlService.nextTransactionID++;\n if(this.debug)\n console.log(\"Begin transaction with id \",tid)\n\n try{\n \n // await conn.beginTransaction();\n await conn.query(\"START TRANSACTION\");\n //const res = await conn.query(\"SET autocommit=0\");\n if(this.debug)\n console.log(\"Transaction started\")\n\n }catch(e){\n this.rollbackTransaction({id:tid,conn:conn,timestamp:Date.now(),queries:[{sql:\"START TRANSACTION\",status:\"error\"}]})\n return this.createMysqlQueryError(e);\n }\n\n this.transactions.push({\n id:tid,\n timestamp:Date.now(),\n conn:conn,\n queries:[]\n })\n\n if(this.debug)\n console.log(\"Transactions pool: \",this.transactions)\n\n return tid;\n }\n \n REQ_MYSQL_TQUERY.listener=async data=>{\n const trx = this.transactions.find(i=>i.id===data.tid);\n if(!trx)\n return {err: {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n },data:null,rollbackError:null}\n\n const query = MysqlService.prepareQuery(data.query.query,data.query.fields);\n let err=null;\n let sqlData = null;\n\n if(this.debug)\n console.log(\"Execute query on transaction: \",trx)\n\n try{\n sqlData = await trx.conn.query(query);\n }catch(e){ err = this.createMysqlQueryError(e);}\n\n if(err)\n this.rollbackTransaction(trx);\n\n if(this.debug)\n console.log(\"Query execution status:\",err?err.message:\"completed\")\n\n trx.queries.push({sql:query,status:err?err.message:\"completed\"})\n\n return {\n data:sqlData?sqlData[0]:null,\n error:err,\n };\n }\n\n REQ_MYSQL_TROLLBACK.listener=async (tid:number)=>{\n const trx = this.transactions.find(i=>i.id===tid);\n if(!trx){\n return {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n }\n }\n\n await this.rollbackTransaction(trx);\n return null;\n }\n\n REQ_MYSQL_TCOMMIT.listener=async (tid:number)=>{\n const trx = this.transactions.find(i=>i.id===tid);\n if(!trx){\n return {\n code:\"NO_TRX\",\n errno:100004,\n fatal:true,\n sql:\"\",\n name:\"NO_TRX\",\n message:\"Transaction not found\"\n }\n }\n\n\n if(this.debug)\n console.log(\"Commit transaction:\",trx)\n \n // remove from transactions\n this.transactions = this.transactions.filter(i=>i.id!==tid);\n\n if(this.debug)\n console.log(\"Transaction pool:\",this.transactions )\n \n const err = await this.commit(trx);\n\n return err;\n }\n }\n\n async commit(trx:ITransaction):Promise<MysqlError|null>{\n \n try{\n await trx.conn.commit();\n //await trx.conn.query(\"COMMIT\");\n trx.conn.removeAllListeners();\n trx.conn.release();\n }catch(e){\n await this.rollbackTransaction(trx);\n return this.createMysqlQueryError(e);\n }\n return null;\n\n }\n\n async rollbackTransaction(trx:ITransaction,donNotRemove?:boolean):Promise<MysqlError|null>{\n let err=null;\n try{\n console.log(\"Rollback started\",trx.conn)\n await trx.conn.rollback();\n await trx.conn.commit();\n //await trx.conn.query(\"ROLLBACK\");\n trx.conn.removeAllListeners();\n trx.conn.release();\n if(!donNotRemove)\n this.transactions = this.transactions.filter(i=>i.id!==trx.id);\n if(this.debug)\n console.log(\"Rollback complete\",trx.conn)\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't rollback transaction\",trx)\n err = this.createMysqlQueryError(e);\n }\n this.storeTransactionAsProblem(trx,\"rollback\")\n return err;\n }\n\n async finishApp(){\n console.log(\"Finishing mysql service\")\n for(let i of this.transactions)\n this.rollbackTransaction(i);\n\n if(this.pool){\n try{await this.pool.end();}catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't close MYSQL pool!\")\n }\n }\n\n if(this.failReportFileStream)\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n\n async storeTransactionAsProblem(trx:ITransaction,message:string){\n\n if(!this.options.transactionFailReport && !this.options.transactionFailReportDir){\n logCrit(\"${MysqlService.js}\",\"Can't report failed transaction, no report function: transactionFailReport in options, and transactionFailReportDir isnt set\")\n return;\n }\n\n\n if(this.options.transactionFailReportDir){\n const yyymmdd = new Date().toISOString().substring(0,10).replaceAll(\"-\",\"\");\n\n //store transaction\n const date = new Date();\n const file = path.resolve(this.options.transactionFailReportDir,yyymmdd+\".json\");\n if(this.failReportFileStream){\n if(this.failReportFileStreamName!==file){\n this.failReportFileStream.end();\n this.failReportFileStream=null;\n }\n }\n\n\n if(this.failReportFileStreamName){\n this.failReportFileStream = fs.createWriteStream(file,{flags:'a'});\n this.failReportFileStreamName=file;\n }\n \n if(this.debug)\n console.log(\"Store transaction fail report: \",file,trx,message)\n\n if(!this.failReportFileStream)\n this.failReportFileStream = fs.createWriteStream(file,{flags:'a'});\n\n this.failReportFileStream.write(JSON.stringify({queries:trx.queries,time:trx.timestamp,date,message})+\"\\n}EOB{\\n\",err=>{\n if(err)\n logCrit(\"${MysqlService.js}\",\"Can't write to transaction fail report file\")\n else\n logInfo(\"${MysqlService.js}\",\"Transaction fail report stored\")\n });\n\n this.failReportLastAccessTime = Date.now();\n\n }\n\n \n if(this.options.transactionFailReport)\n this.options.transactionFailReport(trx,message);\n }\n\n\n async recreatePool():Promise<boolean>{\n\n logInfo(\"${MysqlService.js}\",\"Connecting to mysql: \\n HOST: \"+this.options.host+'\\n PORT:'+this.options.port)\n\n if(this.pool){\n this.pool.removeAllListeners();\n try{await this.pool.end();}catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't close MYSQL pool!\")\n }\n this.pool = null;\n }\n\n try{\n this.pool =mysql.createPool({\n host: this.options.host\n ,user: this.options.user\n ,password: this.options.password\n ,database: this.options.database\n ,port: this.options.port\n ,connectionLimit: this.options.connectionLimit\n ,queueLimit: 10\n ,multipleStatements: true\n });\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL!\")\n return false;\n }\n\n this.pool?.on('connection', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION CREATED\")\n });\n this.pool?.on('acquire', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION ACQUIRED\")\n })\n this.pool?.on('release', (connection) => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION RELEASED\")\n })\n this.pool?.on('enqueue', () => {\n logInfo(\"${MysqlService.js}\",\"MYSQL CONNECTION ENQUEUED\")\n })\n \n // Check connection\n if(this.debug)\n console.log(\"Check mysql connection\")\n return new Promise(async (resolve,reject)=>{\n try{\n const conn = await this.pool?.getConnection()\n if(conn){\n conn?.release();\n logInfo(\"${MysqlService.js}\",\"Connected to MYSQL!\")\n resolve(true)\n \n }else\n resolve(false)\n }catch(e){\n logCrit(\"${MysqlService.js}\",\"Can't connect to MYSQL!\")\n resolve(false)\n }\n });\n\n }\n\n async onApplicationReady() {}\n\n\n static fieldsToObject(fields:MysqlQueryField[]|MysqlQueryFieldObject,ignoreSystemParameters?:boolean):MysqlQueryFieldObject{\n if(!Array.isArray(fields))\n return fields;\n const obj:MysqlQueryFieldObject={};\n for(let i of fields){\n if(!i.name)\n continue;\n if(typeof i.value!== \"object\")\n obj[i.name]=i.value;\n else{\n if(!ignoreSystemParameters){\n obj[i.name]={\n value:i.value,\n system:i.system,\n ignoreInInsert:i.ignoreInInsert,\n ignoreInUpdate:i.ignoreInUpdate,\n useInReplace:i.useInReplace,\n name:i.name\n }\n }else\n obj[i.name]=i.value\n }\n\n }\n return obj;\n }\n\n static objectToFields(obj:MysqlQueryFieldObject|MysqlQueryField[]):MysqlQueryField[]{\n if(Array.isArray(obj))\n return obj;\n const fields:MysqlQueryField[]=[];\n for(let i in obj){\n if(obj[i] && typeof obj[i] === \"object\"){\n let mo = obj[i] as Record<string,string|number|boolean|null|undefined>;\n if(!mo){\n mo={\n name:i,\n value:null,\n system:false,\n ignoreInInsert:false,\n ignoreInUpdate:false,\n useInReplace:false\n }\n }\n fields.push({\n name:mo.name as string ?? i,\n value:mo.value,\n system:mo.system as boolean,\n ignoreInInsert:mo.system as boolean,\n ignoreInUpdate:mo.system as boolean,\n useInReplace:mo.system as boolean\n })\n }else{\n fields.push({\n name:i,\n value:obj[i] as string|number|boolean|null|undefined\n })\n }\n }\n return fields;\n }\n\n static prepareQuery(query:string,fields:MysqlQueryField[]|MysqlQueryFieldObject):string{\n \n if(!Array.isArray(fields))\n fields = MysqlService.objectToFields(fields);\n\n for(let i of fields){\n const val =this.prepareQueryFieldValue(i.value,i.system);\n i._parsedValue=val;\n query=query.replaceAll(\"@\"+i.name,val+\"\")\n }\n\n const tmp = query.toLowerCase();\n if(tmp.indexOf(\"select\")===0 && tmp.indexOf(\"limit\")===-1)\n query+=\" LIMIT 100\"\n \n query = query.replaceAll(\"@NOLIMIT\",\"\")\n\n\n if(query.indexOf(\"@fields\")!==-1){\n let insertFieldNames=[]\n let insertFieldValues=[]\n for(let i of fields){\n if(i.ignoreInInsert)\n continue;\n\n insertFieldNames.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'`')\n insertFieldValues.push(i._parsedValue)\n }\n\n query=query\n .replaceAll('@fields',insertFieldNames.join(\",\"))\n .replaceAll('@values',insertFieldValues.join(\",\"))\n }\n\n if(query.indexOf(\"@insert\")!==-1){\n let oninsertNames=[]\n let oninsertValues=[]\n for(let i of fields){\n if(i.ignoreInInsert)\n continue;\n oninsertNames.push(i.name)\n oninsertValues.push(i._parsedValue)\n }\n query = query.replaceAll(\"@insert\",`(${oninsertNames.join(\",\")}) VALUES (${oninsertValues.join(\",\")})`)\n }\n\n if(query.indexOf(\"@onupdate\")!==-1){\n let onUpdate=[]\n for(let i of fields){\n if(i.ignoreInUpdate)\n continue;\n onUpdate.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'` = '+i._parsedValue)\n }\n query = query.replaceAll(\"@onupdate\",onUpdate.join(\" , \"))\n \n }\n\n if(query.indexOf('@onduplicate')!==-1){\n let onDuplicate=[];\n for(let i of fields){\n if(!i.useInReplace)\n continue;\n onDuplicate.push('`'+i.name.replaceAll(\"`\",'').replaceAll('\\\"',\"\").replaceAll('\\'',\"\")+'` = '+i._parsedValue)\n }\n query = query.replaceAll(\"@onduplicate\",onDuplicate.join(\" , \"))\n }\n \n \n return query;\n }\n\n static prepareQueryFieldValue(value:string|number|boolean|null|undefined,system?:boolean):string|number|boolean|null|undefined{\n if(!system && typeof value === \"string\"){\n value = value?value.replaceAll('\"','\\\\\"'):null\n if(value!==null)\n value = '\"'+value+'\"'\n else\n value = \"NULL\"\n }\n if(value === null || value === undefined)\n return \"NULL\"\n return value;\n }\n\n\n async execute(query:string,rollbackQuery:string|null,transactionID:number):Promise<MysqlResult>{\n return new Promise(async (resolve:(data:MysqlResult)=>void,reject)=>{\n // Check pool\n if(!this.pool){\n logError(\"${MysqlService.js}\",\"No pool\")\n resolve({\n error:{\n code: \"NO_POOL\",\n errno: 100000,\n fatal: true,\n sql: query,\n name:\"NO_POOL\",\n message:\"Mysql pool not created\"\n },\n data:null,\n })\n return;\n }\n\n \n try{\n let conn:mysql.PoolConnection|null=null\n if(transactionID && transactionID>0){\n conn = this.transactions.find(i=>i.id===transactionID)?.conn ?? null;\n if(this.debug)\n console.log(\"Execute query on transaction: \",conn)\n }else{\n conn = await this.pool.getConnection();\n }\n\n if(this.debug)\n console.log(\"Execute query\",conn)\n\n // if connection not created\n if(!conn){\n logCrit(\"${MysqlService.js}\",`No connection created!`)\n resolve({\n error:{\n code: \"NO_CONN\",\n errno: 100001,\n fatal: true,\n sql: query,\n name:\"NO_CONN\",\n message:\"Mysql pool cant get connection\"\n },\n data:null,\n })\n return;\n }\n\n // Do send query\n for(let i of this.transactions){\n if(i.conn===conn){\n logInfo(\"Your connection is in transaction\")\n break;\n }\n }\n this.sendQuery(conn,query,resolve,rollbackQuery);\n\n }catch(e){\n logError(\"${MysqlService.js}\",e);\n \n // recreate pool, connection error\n if(`${e}`.indexOf('ECONNREFUSED')!==-1)\n this.recreatePool();\n \n resolve({\n error:{\n code: \"NO_CONN\",\n errno: 100001,\n fatal: true,\n sql: query,\n name:\"NO_CONN\",\n message:(e && typeof e === \"object\" && \"message\" in e as any)?(e as any).message:\"Mysql cant get connection\"\n },\n data:null\n })\n return;\n }\n });\n }\n\n async sendQuery(conn:mysql.PoolConnection,query:string,resolve:(data:MysqlResult)=>void,rollback:string|null){\n \n let errCatched=false;\n\n conn.on(\"error\",async err=>{\n errCatched=true;\n\n let rollbackError = null;\n if(rollback)\n rollbackError=(await this.queryAsync(conn,rollback)).err\n \n logError(\"${MysqlService.js}->conn.on('error')\",err)\n\n // close conn on success\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n \n resolve({\n error:{\n code: \"CONN_ERR\",\n errno: 100003,\n fatal: true,\n sql: query,\n name:\"CONN_ERR\",\n message:\"Error: \"+err\n },\n data:null,\n rollbackError:rollbackError\n })\n })\n\n\n\n logInfo(\"${MysqlService.js}\",query)\n\n // send query\n const queryResult = await this.queryAsync(conn,query);\n\n // handle error\n if(queryResult.err){\n \n // rollback\n let rollbackError=null;\n if(rollback)\n rollbackError=(await this.queryAsync(conn,rollback)).err\n\n // close connection\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n\n // determine duplicate error\n const dup = `${queryResult.err}`.toLowerCase().indexOf(\"er_dup_entry\")!==-1;\n\n logError(\"${MysqlService.js}->query error\",queryResult.err);\n\n resolve({\n error:queryResult.err,\n data:null,\n rollbackError:rollbackError,\n isDuplicateError:dup\n })\n }\n\n\n // close conn on success\n try{\n conn.release();\n conn.removeAllListeners();\n }catch(e){}\n\n // handle success\n resolve({\n error:queryResult.err,\n data:queryResult.results,\n })\n\n }\n\n\n // Async query wrapper to conn.query\n async queryAsync(conn:mysql.PoolConnection,query:string):Promise<{err:MysqlError|null,results?:any}>{\n\n let result=null;\n try{\n result = await conn.query(query);\n }catch(e){\n return {err:this.createMysqlQueryError(e)};\n }\n\n return {\n err:null,\n results:result[0],\n }\n }\n\n createMysqlQueryError(err:any):MysqlError{\n if(err && typeof err===\"object\" && \"code\" in err && \"errno\" in err && \"sql\" in err && \"name\" in err && \"message\" in err){\n return {\n code: err.code,\n errno: err.errno,\n sql: err.sql,\n name:err.name,\n message:err.message\n \n }\n }else{\n return {\n code: \"QUERY_ERR\",\n errno: 100002,\n fatal: true,\n sql: \"no query\",\n name:\"QUERY_ERR\",\n message:\"Error: \"+(err)?err:\"\"\n }\n }\n }\n}\n\n\nconst secret_key=\"AKLWkajw%^&dgwqhw#98453i23bfk23rn2knknglrgjeit\"\nconst secret_iv=\"rthadrfk23rn2kn#*FNKA@gt44df3tslrgj##!it\"\n\n// Generate secret hash with crypto to use for encryption\nconst key = createHash('sha512').update(secret_key).digest('hex').substring(0, 32)\nconst iv = createHash('sha512').update(secret_iv).digest('hex').substring(0, 16)\n\nconst decrypt =(encrypted:string):string|null=>{\n try{\n encrypted = Buffer.from(encrypted, 'base64').toString('binary');\n const decipher = createDecipheriv('aes-256-cbc', key, iv);\n let decrypted = decipher.update(encrypted, 'binary', 'utf8');\n decrypted += decipher.final('utf8');\n return decrypted;\n }catch(e){\n return null;\n }\n}\n\nconst encrypt = (txt:string):string|null=>{\n try{\n let encipher = createCipheriv('aes-256-cbc', key, iv),\n encrypted = encipher.update(txt, 'utf8', 'binary');\n encrypted += encipher.final('binary');\n return Buffer.from(encrypted, 'binary').toString('base64');\n }catch(e){\n return null;\n }\n}\n\nexport default MysqlService;"]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"WSAPITransport.js","sourceRoot":"","sources":["../../src/apiServer/WSAPITransport.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebSocketHandler.js","sourceRoot":"","sources":["../../src/apiServer/WebSocketHandler.ts"],"names":[],"mappings":"","sourcesContent":[""]}
@@ -1,8 +0,0 @@
1
- export interface IWebsocket {
2
- }
3
- export interface IWebSocketServiceOptions {
4
- }
5
- export declare class Websocket implements IWebsocket {
6
- options: IWebSocketServiceOptions;
7
- constructor(opt?: IWebSocketServiceOptions);
8
- }
@@ -1,15 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.Websocket = void 0;
4
- const getDefaultWebSocketServiceOptions = () => {
5
- return {
6
- endpoint: "/ws"
7
- };
8
- };
9
- class Websocket {
10
- options;
11
- constructor(opt) {
12
- this.options = { ...getDefaultWebSocketServiceOptions(), opt };
13
- }
14
- }
15
- exports.Websocket = Websocket;
@@ -1,8 +0,0 @@
1
- import { BaseService } from "./BaseService";
2
- export interface IWebSocketServiceOptions {
3
- }
4
- export declare class WebsocketService extends BaseService {
5
- options: IWebSocketServiceOptions;
6
- constructor(opt?: IWebSocketServiceOptions);
7
- init(): Promise<void>;
8
- }
@@ -1,18 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.WebsocketService = void 0;
4
- const BaseService_1 = require("./BaseService");
5
- const getDefaultWebSocketServiceOptions = () => {
6
- return {};
7
- };
8
- class WebsocketService extends BaseService_1.BaseService {
9
- options;
10
- constructor(opt) {
11
- super("WebsocketService");
12
- this.options = { ...getDefaultWebSocketServiceOptions(), opt };
13
- }
14
- async init() {
15
- super.init();
16
- }
17
- }
18
- exports.WebsocketService = WebsocketService;
@@ -1 +0,0 @@
1
- {"version":3,"file":"WebsocketService.js","sourceRoot":"","sources":["../../src/apiServer/WebsocketService.ts"],"names":[],"mappings":";;;AAAA,+CAA4C;AAM5C,MAAM,iCAAiC,GAAG,GAA2B,EAAE;IACnE,OAAO,EAEN,CAAA;AACL,CAAC,CAAA;AAGD,MAAa,gBAAiB,SAAQ,yBAAW;IAC7C,OAAO,CAA0B;IACjC,YAAY,GAA6B;QACrC,KAAK,CAAC,kBAAkB,CAAC,CAAC;QAC1B,IAAI,CAAC,OAAO,GAAG,EAAC,GAAG,iCAAiC,EAAE,EAAC,GAAG,EAAC,CAAA;IAC/D,CAAC;IAED,KAAK,CAAC,IAAI;QACN,KAAK,CAAC,IAAI,EAAE,CAAC;IACjB,CAAC;CACJ;AAVD,4CAUC","sourcesContent":["import { BaseService } from \"./BaseService\";\n\nexport interface IWebSocketServiceOptions{\n\n}\n\nconst getDefaultWebSocketServiceOptions = ():IWebSocketServiceOptions=>{\n return {\n\n }\n}\n\n\nexport class WebsocketService extends BaseService{\n options:IWebSocketServiceOptions;\n constructor(opt?:IWebSocketServiceOptions){\n super(\"WebsocketService\");\n this.options = {...getDefaultWebSocketServiceOptions(),opt}\n }\n\n async init(){\n super.init();\n }\n}"]}
@@ -1,39 +0,0 @@
1
- import { WebSocket } from "ws";
2
- import { IError } from "../structures/Interfaces";
3
- import Signal, { Req } from "badmfck-signal";
4
- export interface IClusterPacket {
5
- method: string;
6
- data?: any | null;
7
- error?: IError;
8
- callbackID: number;
9
- }
10
- export interface IHUBConnectionOptions {
11
- direction: "incoming" | "outgoing";
12
- ws: WebSocket;
13
- hostID: string;
14
- hostPrivateKey: string;
15
- hostPublicKey: string;
16
- hostURL: string;
17
- targetID: string | null;
18
- targetPublicKey: string | null;
19
- targetURL: string | null;
20
- onAuthorized: () => void;
21
- onClose: () => void;
22
- handlers: (Req<any, any> | Signal<any>)[];
23
- maxTimeout?: number;
24
- }
25
- export declare class HUBConnection {
26
- static callbackID: number;
27
- private callbacks;
28
- authorized: boolean;
29
- private ws;
30
- private onAuthorized;
31
- options: IHUBConnectionOptions;
32
- constructor(options: IHUBConnectionOptions);
33
- sendAuth(): Promise<void>;
34
- authorize(data: any): Promise<any | IError>;
35
- handleCallback(data: IClusterPacket): void;
36
- sendCallback(callbackID: number, data: IError | any): void;
37
- send(packet: IClusterPacket): Promise<any | IError | null>;
38
- close(): void;
39
- }
@@ -1,251 +0,0 @@
1
- "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || function (mod) {
19
- if (mod && mod.__esModule) return mod;
20
- var result = {};
21
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
- __setModuleDefault(result, mod);
23
- return result;
24
- };
25
- Object.defineProperty(exports, "__esModule", { value: true });
26
- exports.HUBConnection = void 0;
27
- const ws_1 = require("ws");
28
- const LogService_1 = require("../LogService");
29
- const DefaultErrors_1 = __importStar(require("../structures/DefaultErrors"));
30
- class HUBConnection {
31
- static callbackID = 1;
32
- callbacks = new Map();
33
- authorized = false;
34
- ws;
35
- onAuthorized;
36
- options;
37
- constructor(options) {
38
- (0, LogService_1.logInfo)("HUBConnection: new connection", options.hostID, options.targetID, options.direction === "outgoing" ? options.ws.url + " -->" : " <--");
39
- this.options = options;
40
- this.ws = options.ws;
41
- this.onAuthorized = options.onAuthorized;
42
- this.ws.on("close", () => {
43
- if (!this.authorized)
44
- return;
45
- (0, LogService_1.logInfo)("HUBConnection: connection closed");
46
- if (options.onClose)
47
- options.onClose();
48
- });
49
- this.ws.on("error", (e) => {
50
- (0, LogService_1.logError)("HUBConnection: connection error", e);
51
- });
52
- this.ws.on("open", () => {
53
- (0, LogService_1.logInfo)("HUBConnection: connection opened", options.direction);
54
- if (options.direction === "outgoing") {
55
- (0, LogService_1.logInfo)("HUBConnection: send authroization");
56
- this.sendAuth();
57
- }
58
- });
59
- this.ws.on("message", async (msg, isBinary) => {
60
- if (isBinary) {
61
- (0, LogService_1.logError)("HUBConnection: invalid packet type, must be a string");
62
- return;
63
- }
64
- let data = null;
65
- try {
66
- data = JSON.parse(msg.toString("utf8"));
67
- }
68
- catch (e) { }
69
- if (!data || !data.method) {
70
- (0, LogService_1.logError)("HUBConnection: invalid packet structure", data);
71
- return;
72
- }
73
- if (typeof data.method !== "string") {
74
- (0, LogService_1.logError)("HUBConnection: invalid packet structure", data);
75
- return;
76
- }
77
- const callbackID = parseInt(data.callbackID);
78
- if (data.method === "callback") {
79
- this.handleCallback(data);
80
- return;
81
- }
82
- ;
83
- if (!this.authorized && data.method === "auth") {
84
- const result = await this.authorize(data.data);
85
- if (DefaultErrors_1.ErrorUtils.isError(result)) {
86
- (0, LogService_1.logError)("HUBConnection: authorization failed", result);
87
- this.sendCallback(callbackID, result);
88
- return;
89
- }
90
- this.authorized = true;
91
- if (this.onAuthorized)
92
- this.onAuthorized();
93
- this.sendCallback(callbackID, result);
94
- return;
95
- }
96
- if (!this.authorized) {
97
- (0, LogService_1.logError)("HUBConnection: not authorized");
98
- this.sendCallback(callbackID, DefaultErrors_1.default.UNAUTHORIZED);
99
- return;
100
- }
101
- for (let i of options.handlers) {
102
- if (i.name === data.method) {
103
- const requestPacket = {
104
- data: data.data,
105
- authorized: this.authorized,
106
- connection: this
107
- };
108
- if (i.type === "signal") {
109
- i.invoke(requestPacket);
110
- if (data.callbackID > 0)
111
- this.sendCallback(callbackID, {});
112
- return;
113
- }
114
- else if (i.type === "request") {
115
- const result = await i.request(requestPacket);
116
- this.sendCallback(callbackID, result);
117
- return;
118
- }
119
- }
120
- }
121
- if (callbackID > 0)
122
- this.sendCallback(callbackID, { ...DefaultErrors_1.default.NOT_IMPLEMENTED, details: "method not found: " + data.method });
123
- else
124
- (0, LogService_1.logError)("HUBConnection: method not found", data.method);
125
- });
126
- setTimeout(() => {
127
- if (!this.authorized) {
128
- (0, LogService_1.logError)("HUBConnection: authorization timeout", this.authorized);
129
- this.close();
130
- }
131
- }, 15000);
132
- setInterval(() => {
133
- const now = +new Date();
134
- for (let [key, value] of this.callbacks) {
135
- if (now - value.time > (options.maxTimeout ?? 1000 * 60 * 15)) {
136
- value.callback({ method: "callback", data: null, callbackID: key, error: { ...DefaultErrors_1.default.TIMEOUT } });
137
- this.callbacks.delete(key);
138
- }
139
- }
140
- }, options.maxTimeout || 1000 * 60 * 15);
141
- }
142
- async sendAuth() {
143
- const response = await this.send({
144
- method: "auth",
145
- data: {
146
- hostID: this.options.targetID,
147
- targetPublicKey: this.options.hostPublicKey,
148
- targetURL: this.options.hostURL,
149
- targetID: this.options.hostID
150
- },
151
- callbackID: 1
152
- });
153
- if (DefaultErrors_1.ErrorUtils.isError(response)) {
154
- (0, LogService_1.logError)("HUBConnection: auth failed", response);
155
- this.close();
156
- return;
157
- }
158
- this.authorized = true;
159
- if (!response || !response.hostID || !response.hostPublicKey || !response.hostURL) {
160
- (0, LogService_1.logError)("HUBConnection: invalid auth response", response);
161
- this.close();
162
- return;
163
- }
164
- this.options.targetID = response.hostID;
165
- this.options.targetPublicKey = response.hostPublicKey;
166
- this.options.targetURL = response.hostURL;
167
- if (this.onAuthorized)
168
- this.onAuthorized();
169
- }
170
- async authorize(data) {
171
- if (typeof data !== "object" || !data || !data.hostID || !data.targetPublicKey || !data.targetID || !data.targetURL)
172
- return { ...DefaultErrors_1.default.BAD_REQUEST, stack: [data], details: "expecting {hostID:string,targetPublicKey:string,targetID:string,targetURL:string}" };
173
- if (data.hostID !== this.options.hostID)
174
- return { ...DefaultErrors_1.default.UNAUTHORIZED, details: "invalid targetID" };
175
- this.options.targetID = data.targetID;
176
- this.options.targetPublicKey = data.targetPublicKey;
177
- this.options.targetURL = data.targetURL;
178
- return {
179
- hostID: this.options.hostID,
180
- hostPublicKey: this.options.hostPublicKey,
181
- hostURL: this.options.hostURL
182
- };
183
- }
184
- handleCallback(data) {
185
- if (!this.callbacks.has(data.callbackID)) {
186
- (0, LogService_1.logError)("HUBConnection: callback not found", data);
187
- return;
188
- }
189
- const cb = this.callbacks.get(data.callbackID);
190
- if (cb) {
191
- cb.callback(data.data ?? data.error);
192
- this.callbacks.delete(data.callbackID);
193
- }
194
- }
195
- sendCallback(callbackID, data) {
196
- if (isNaN(callbackID) || callbackID <= 0) {
197
- (0, LogService_1.logError)("HUBConnection: invalid callbackID", callbackID, data);
198
- return;
199
- }
200
- if (this.ws && this.ws.readyState === ws_1.WebSocket.OPEN) {
201
- this.ws.send(JSON.stringify({
202
- method: "callback",
203
- error: DefaultErrors_1.ErrorUtils.isError(data) ? data : null,
204
- data: DefaultErrors_1.ErrorUtils.isError(data) ? null : data,
205
- callbackID: callbackID
206
- }));
207
- }
208
- else {
209
- (0, LogService_1.logError)("HUBConnection: ws not connected, cant send callback", this.options.direction, data);
210
- }
211
- }
212
- async send(packet) {
213
- if (!this.ws || this.ws.readyState !== ws_1.WebSocket.OPEN) {
214
- (0, LogService_1.logError)("HUBConnection: ws not connected, cant send packet", packet);
215
- return { ...DefaultErrors_1.default.SERVICE_NOT_WORKING, details: "ws not connected" };
216
- }
217
- let cb = null;
218
- const promise = new Promise((resolve) => cb = resolve);
219
- if (packet.callbackID > 0) {
220
- const callbackID = HUBConnection.callbackID++;
221
- this.callbacks.set(callbackID, { time: +new Date(), callback: cb });
222
- packet.callbackID = callbackID;
223
- }
224
- this.ws.send(JSON.stringify(packet), err => {
225
- if (err) {
226
- (0, LogService_1.logError)("HUBConnection: cant send packet", err);
227
- if (packet.callbackID > 0)
228
- this.callbacks.delete(packet.callbackID);
229
- cb(DefaultErrors_1.default.SERVICE_NOT_WORKING);
230
- }
231
- });
232
- if (packet.callbackID === 0)
233
- return null;
234
- return promise;
235
- }
236
- close() {
237
- (0, LogService_1.logInfo)("HUBConnection: close connection");
238
- this.callbacks.clear();
239
- this.authorized = false;
240
- if (this.ws) {
241
- try {
242
- this.ws.removeAllListeners();
243
- this.ws.close();
244
- this.ws.terminate();
245
- }
246
- catch (e) { }
247
- }
248
- }
249
- }
250
- exports.HUBConnection = HUBConnection;
251
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSFVCQ29ubmVjdGlvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9hcGlTZXJ2ZXIvY2x1c3Rlci9IVUJDb25uZWN0aW9uLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsMkJBQXdDO0FBQ3hDLDhDQUFrRDtBQUNsRCw2RUFBd0U7QUFnQ3hFLE1BQWEsYUFBYTtJQUN0QixNQUFNLENBQUMsVUFBVSxHQUFRLENBQUMsQ0FBQztJQUNuQixTQUFTLEdBQThELElBQUksR0FBRyxFQUFFLENBQUM7SUFDekYsVUFBVSxHQUFXLEtBQUssQ0FBQztJQUNuQixFQUFFLENBQVc7SUFDYixZQUFZLENBQVU7SUFDOUIsT0FBTyxDQUF1QjtJQUU5QixZQUFZLE9BQTZCO1FBRXJDLElBQUEsb0JBQU8sRUFBQywrQkFBK0IsRUFBQyxPQUFPLENBQUMsTUFBTSxFQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUMsT0FBTyxDQUFDLFNBQVMsS0FBRyxVQUFVLENBQUEsQ0FBQyxDQUFBLE9BQU8sQ0FBQyxFQUFFLENBQUMsR0FBRyxHQUFDLE1BQU0sQ0FBQSxDQUFDLENBQUEsTUFBTSxDQUFDLENBQUM7UUFFckksSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEVBQUUsR0FBRyxPQUFPLENBQUMsRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksQ0FBQTtRQUd4QyxJQUFJLENBQUMsRUFBRSxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUMsR0FBRSxFQUFFO1lBQ25CLElBQUcsQ0FBQyxJQUFJLENBQUMsVUFBVTtnQkFDZixPQUFPO1lBQ1gsSUFBQSxvQkFBTyxFQUFDLGtDQUFrQyxDQUFDLENBQUE7WUFDM0MsSUFBRyxPQUFPLENBQUMsT0FBTztnQkFDZCxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDMUIsQ0FBQyxDQUFD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QUFDO2dCQUNoQixJQUFJLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxDQUFDO2FBQ3ZCO1lBQUEsT0FBTSxDQUFDLEVBQUMsR0FBRTtTQUNkO0lBQ0wsQ0FBQzs7QUFoVEwsc0NBa1RDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF3RGF0YSwgV2ViU29ja2V0IH0gZnJvbSBcIndzXCI7XG5pbXBvcnQgeyBsb2dFcnJvciwgbG9nSW5mbyB9IGZyb20gXCIuLi9Mb2dTZXJ2aWNlXCI7XG5pbXBvcnQgRGVmYXVsdEVycm9ycywgeyBFcnJvclV0aWxzIH0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvRGVmYXVsdEVycm9yc1wiO1xuaW1wb3J0IHsgSUVycm9yIH0gZnJvbSBcIi4uL3N0cnVjdHVyZXMvSW50ZXJmYWNlc1wiO1xuaW1wb3J0IHsgcHJpdmF0ZURlY3J5cHQgfSBmcm9tIFwiY3J5cHRvXCI7XG5pbXBvcnQgU2lnbmFsLCB7IFJlcSB9IGZyb20gXCJiYWRtZmNrLXNpZ25hbFwiO1xuaW1wb3J0IHsgSVdlYnNvY2tldFBhY2tldCB9IGZyb20gXCIuLi9leHRlcm5hbC9FeHRlcm5hbFNlcnZpY2VcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJQ2x1c3RlclBhY2tldHtcbiAgICBtZXRob2Q6c3RyaW5nLFxuICAgIGRhdGE/OmFueXxudWxsLFxuICAgIGVycm9yPzpJRXJyb3IsXG4gICAgY2FsbGJhY2tJRDpudW1iZXJcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJSFVCQ29ubmVjdGlvbk9wdGlvbnN7XG4gICAgZGlyZWN0aW9uOlwiaW5jb21pbmdcInxcIm91dGdvaW5nXCIsXG4gICAgd3M6V2ViU29ja2V0LFxuXG4gICAgaG9zdElEOnN0cmluZyxcbiAgICBob3N0UHJpdmF0ZUtleTpzdHJpbmcsXG4gICAgaG9zdFB1YmxpY0tleTpzdHJpbmcsXG4gICAgaG9zdFVSTDpzdHJpbmcsXG5cbiAgICB0YXJnZXRJRDpzdHJpbmd8bnVsbCxcbiAgICB0YXJnZXRQdWJsaWNLZXk6c3RyaW5nfG51bGwsXG4gICAgdGFyZ2V0VVJMOnN0cmluZ3xudWxsLFxuXG4gICAgb25BdXRob3JpemVkOigpPT52b2lkLFxuICAgIG9uQ2xvc2U6KCk9PnZvaWQsXG4gICAgaGFuZGxlcnM6KFJlcTxhbnksYW55PnxTaWduYWw8YW55PilbXSxcbiAgICBtYXhUaW1lb3V0PzpudW1iZXJcbn1cblxuZXhwb3J0IGNsYXNzIEhVQkNvbm5lY3Rpb257XG4gICAgc3RhdGljIGNhbGxiYWNrSUQ6bnVtYmVyPTE7XG4gICAgcHJpdmF0ZSBjYWxsYmFja3M6TWFwPG51bWJlcix7dGltZTpudW1iZXIsY2FsbGJhY2s6KHJlc3VsdDphbnl8SUVycm9yKT0+dm9pZH0+PW5ldyBNYXAoKTtcbiAgICBhdXRob3JpemVkOmJvb2xlYW4gPSBmYWxzZTtcbiAgICBwcml2YXRlIHdzOldlYlNvY2tldDtcbiAgICBwcml2YXRlIG9uQXV0aG9yaXplZDooKT0+dm9pZDtcbiAgICBvcHRpb25zOklIVUJDb25uZWN0aW9uT3B0aW9ucztcbiAgICBcbiAgICBjb25zdHJ1Y3RvcihvcHRpb25zOklIVUJDb25uZWN0aW9uT3B0aW9ucyl7XG4gICAgICAgIFxuICAgICAgICBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogbmV3IGNvbm5lY3Rpb25cIixvcHRpb25zLmhvc3RJRCxvcHRpb25zLnRhcmdldElELG9wdGlvbnMuZGlyZWN0aW9uPT09XCJvdXRnb2luZ1wiP29wdGlvbnMud3MudXJsK1wiIC0tPlwiOlwiIDwtLVwiKTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLndzID0gb3B0aW9ucy53cztcbiAgICAgICAgdGhpcy5vbkF1dGhvcml6ZWQgPSBvcHRpb25zLm9uQXV0aG9yaXplZFxuICAgICAgICBcblxuICAgICAgICB0aGlzLndzLm9uKFwiY2xvc2VcIiwoKT0+e1xuICAgICAgICAgICAgaWYoIXRoaXMuYXV0aG9yaXplZClcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogY29ubmVjdGlvbiBjbG9zZWRcIilcbiAgICAgICAgICAgIGlmKG9wdGlvbnMub25DbG9zZSlcbiAgICAgICAgICAgICAgICBvcHRpb25zLm9uQ2xvc2UoKTtcbiAgICAgICAgfSlcblxuICAgICAgICB0aGlzLndzLm9uKFwiZXJyb3JcIiwoZSk9PntcbiAgICAgICAgICAgIGxvZ0Vycm9yKFwiSFVCQ29ubmVjdGlvbjogY29ubmVjdGlvbiBlcnJvclwiLGUpO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLndzLm9uKFwib3BlblwiLCgpPT57XG4gICAgICAgICAgICBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogY29ubmVjdGlvbiBvcGVuZWRcIixvcHRpb25zLmRpcmVjdGlvbilcbiAgICAgICAgICAgIGlmKG9wdGlvbnMuZGlyZWN0aW9uPT09XCJvdXRnb2luZ1wiKXtcbiAgICAgICAgICAgICAgICBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogc2VuZCBhdXRocm9pemF0aW9uXCIpXG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQXV0aCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuXG4gICAgICAgIHRoaXMud3Mub24oXCJtZXNzYWdlXCIsYXN5bmMgKG1zZzpSYXdEYXRhLGlzQmluYXJ5KT0+e1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZihpc0JpbmFyeSl7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IoXCJIVUJDb25uZWN0aW9uOiBpbnZhbGlkIHBhY2tldCB0eXBlLCBtdXN0IGJlIGEgc3RyaW5nXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGRhdGEgPSBudWxsO1xuICAgICAgICAgICAgdHJ5e1xuICAgICAgICAgICAgICAgIGRhdGEgPSBKU09OLnBhcnNlKG1zZy50b1N0cmluZyhcInV0ZjhcIikpXG4gICAgICAgICAgICB9Y2F0Y2goZSl7fVxuXG4gICAgICAgICAgICAvL2xvZ0luZm8oXCJIVUJDb25uZWN0aW9uOiBtZXNzYWdlIHJlY2VpdmVkXCIsdGhpcy5vcHRpb25zLmRpcmVjdGlvbixkYXRhKTtcblxuICAgICAgICAgICAgLy8gY2hlY2sgcGFja2V0IHN0cnVjdHVyZVxuICAgICAgICAgICAgaWYoIWRhdGEgfHwgIWRhdGEubWV0aG9kKXtcbiAgICAgICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IGludmFsaWQgcGFja2V0IHN0cnVjdHVyZVwiLGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gaGFuZGxlIHBhY2tldHNcbiAgICAgICAgICAgIGlmKHR5cGVvZiBkYXRhLm1ldGhvZCAhPT0gXCJzdHJpbmdcIil7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IoXCJIVUJDb25uZWN0aW9uOiBpbnZhbGlkIHBhY2tldCBzdHJ1Y3R1cmVcIixkYXRhKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNhbGxiYWNrSURcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrSUQgPSBwYXJzZUludChkYXRhLmNhbGxiYWNrSUQpO1xuICAgICAgICAgICAgIFxuICAgICAgICAgICAgLy8gaGFuZGxlIGNhbGxiYWNrc1xuICAgICAgICAgICAgIGlmKGRhdGEubWV0aG9kPT09XCJjYWxsYmFja1wiKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYoIXRoaXMuYXV0aG9yaXplZCAmJiBkYXRhLm1ldGhvZD09PVwiYXV0aFwiKXtcbiAgICAgICAgICAgICAgICAvLyBkbyBhdXRob3JpemF0aW9uICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IHRoaXMuYXV0aG9yaXplKGRhdGEuZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYoRXJyb3JVdGlscy5pc0Vycm9yKHJlc3VsdCkpe1xuICAgICAgICAgICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IGF1dGhvcml6YXRpb24gZmFpbGVkXCIscmVzdWx0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2FsbGJhY2soY2FsbGJhY2tJRCxyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYXV0aG9yaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5vbkF1dGhvcml6ZWQpXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25BdXRob3JpemVkKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZW5kQ2FsbGJhY2soY2FsbGJhY2tJRCxyZXN1bHQpO1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICBcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgaWYoIXRoaXMuYXV0aG9yaXplZCl7XG4gICAgICAgICAgICAgICAgbG9nRXJyb3IoXCJIVUJDb25uZWN0aW9uOiBub3QgYXV0aG9yaXplZFwiKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDYWxsYmFjayhjYWxsYmFja0lELERlZmF1bHRFcnJvcnMuVU5BVVRIT1JJWkVEKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGhhbmRsZSBtZXRob2RzXG4gICAgICAgICAgICBmb3IobGV0IGkgb2Ygb3B0aW9ucy5oYW5kbGVycyl7XG4gICAgICAgICAgICAgICAgaWYoaS5uYW1lID09PSBkYXRhLm1ldGhvZCl7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVxdWVzdFBhY2tldDpJV2Vic29ja2V0UGFja2V0PXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6ZGF0YS5kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXV0aG9yaXplZDp0aGlzLmF1dGhvcml6ZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uOnRoaXNcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmKGkudHlwZSA9PT0gXCJzaWduYWxcIil7XG4gICAgICAgICAgICAgICAgICAgICAgICAoaSBhcyBTaWduYWw8SVdlYnNvY2tldFBhY2tldD4pLmludm9rZShyZXF1ZXN0UGFja2V0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGRhdGEuY2FsbGJhY2tJRD4wKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VuZENhbGxiYWNrKGNhbGxiYWNrSUQse30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9ZWxzZSBpZihpLnR5cGUgPT09IFwicmVxdWVzdFwiKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IChpIGFzIFJlcTxJV2Vic29ja2V0UGFja2V0LGFueT4pLnJlcXVlc3QocmVxdWVzdFBhY2tldCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbmRDYWxsYmFjayhjYWxsYmFja0lELHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGNhbGxiYWNrSUQ+MClcbiAgICAgICAgICAgICAgICB0aGlzLnNlbmRDYWxsYmFjayhjYWxsYmFja0lELHsuLi5EZWZhdWx0RXJyb3JzLk5PVF9JTVBMRU1FTlRFRCxkZXRhaWxzOlwibWV0aG9kIG5vdCBmb3VuZDogXCIrZGF0YS5tZXRob2R9KTtcbiAgICAgICAgICAgIGVsc2VcbiAgICAgICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IG1ldGhvZCBub3QgZm91bmRcIixkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgIH0pXG5cbiAgICAgICAgXG4gICAgICAgIHNldFRpbWVvdXQoKCk9PntcbiAgICAgICAgICAgIGlmKCF0aGlzLmF1dGhvcml6ZWQpe1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKFwiSFVCQ29ubmVjdGlvbjogYXV0aG9yaXphdGlvbiB0aW1lb3V0XCIsdGhpcy5hdXRob3JpemVkKVxuICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwxNTAwMCk7IC8vIDE1c2VjIGZvciBhdXRob3JpemF0aW9uXG4gICAgICAgIFxuXG4gICAgICAgIHNldEludGVydmFsKCgpPT57XG4gICAgICAgICAgICBjb25zdCBub3cgPSArbmV3IERhdGUoKTtcbiAgICAgICAgICAgIGZvcihsZXQgW2tleSx2YWx1ZV0gb2YgdGhpcy5jYWxsYmFja3Mpe1xuICAgICAgICAgICAgICAgIGlmKG5vdy12YWx1ZS50aW1lPihvcHRpb25zLm1heFRpbWVvdXQgPz8gMTAwMCo2MCoxNSkpe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZS5jYWxsYmFjayh7bWV0aG9kOlwiY2FsbGJhY2tcIixkYXRhOm51bGwsY2FsbGJhY2tJRDprZXksZXJyb3I6ey4uLkRlZmF1bHRFcnJvcnMuVElNRU9VVH19KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LG9wdGlvbnMubWF4VGltZW91dCB8fCAxMDAwKjYwKjE1KTtcblxuICAgIH1cblxuXG4gICAgYXN5bmMgc2VuZEF1dGgoKXtcbiAgICAgICAvLyBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogc2VuZCBhdXRoIHBhY2tldFwiKVxuICAgICAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMuc2VuZCh7XG4gICAgICAgICAgICBtZXRob2Q6XCJhdXRoXCIsXG4gICAgICAgICAgICBkYXRhOntcbiAgICAgICAgICAgICAgICBob3N0SUQ6dGhpcy5vcHRpb25zLnRhcmdldElELCAvLyBSRU1PVEUgSE9TVCBJRFxuICAgICAgICAgICAgICAgIHRhcmdldFB1YmxpY0tleTp0aGlzLm9wdGlvbnMuaG9zdFB1YmxpY0tleSwgLy8gTE9DQUwgUFVCTElDIEtFWVxuICAgICAgICAgICAgICAgIHRhcmdldFVSTDp0aGlzLm9wdGlvbnMuaG9zdFVSTCwgLy8gTE9DQUwgVVJMXG4gICAgICAgICAgICAgICAgdGFyZ2V0SUQ6dGhpcy5vcHRpb25zLmhvc3RJRCAvLyBMT0NBTCBIT1NUIElEXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FsbGJhY2tJRDoxXG4gICAgICAgIH0pXG5cbiAgICAgICAgaWYoRXJyb3JVdGlscy5pc0Vycm9yKHJlc3BvbnNlKSl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IGF1dGggZmFpbGVkXCIscmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5hdXRob3JpemVkPXRydWU7XG4gICAgICAgIFxuICAgICAgICBpZighcmVzcG9uc2UgfHwgIXJlc3BvbnNlLmhvc3RJRCB8fCAhcmVzcG9uc2UuaG9zdFB1YmxpY0tleSB8fCAhcmVzcG9uc2UuaG9zdFVSTCl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IGludmFsaWQgYXV0aCByZXNwb25zZVwiLHJlc3BvbnNlKTtcbiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG5cbiAgICAgICAgLy8gc3RvcmUgdGFyZ2V0SUQsIHRhcmdldFB1YmxpY0tleSwgdGFyZ2V0VVJMXG4gICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXRJRCA9IHJlc3BvbnNlLmhvc3RJRDtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldFB1YmxpY0tleSA9IHJlc3BvbnNlLmhvc3RQdWJsaWNLZXk7XG4gICAgICAgIHRoaXMub3B0aW9ucy50YXJnZXRVUkwgPSByZXNwb25zZS5ob3N0VVJMO1xuICAgICAgICBcbiAgICAgICAvLyBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogYXV0aCBzdWNjZXNzXCIscmVzcG9uc2UpO1xuXG4gICAgICAgIGlmKHRoaXMub25BdXRob3JpemVkKVxuICAgICAgICAgICAgdGhpcy5vbkF1dGhvcml6ZWQoKTtcbiAgICAgICAgXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogXG4gICAgICogQHBhcmFtIGRhdGEgLT4ge3NpZ25hdHVyZTplbmNyeXB0ZWQgaHViIGtleSxwdWJsaWNLZXk6ZW5jcnlwdGVkIHB1YmxpYyBrZXksIGNsaWVudElEOmNsaWVudElEfVxuICAgICAqIEByZXR1cm5zIFxuICAgICAqL1xuICAgIGFzeW5jIGF1dGhvcml6ZShkYXRhOmFueSk6UHJvbWlzZTxhbnl8SUVycm9yPntcblxuICAgICAgICAvL2xvZ0luZm8oXCJIVUJDb25uZWN0aW9uOiB0cnkgdG8gYXV0aG9yaXplIGNvbm5lY3Rpb25cIixkYXRhKTtcblxuICAgICAgICBpZih0eXBlb2YgZGF0YSAhPT0gXCJvYmplY3RcIiB8fCAhZGF0YSB8fCAhZGF0YS5ob3N0SUQgfHwgIWRhdGEudGFyZ2V0UHVibGljS2V5IHx8ICFkYXRhLnRhcmdldElEIHx8ICFkYXRhLnRhcmdldFVSTClcbiAgICAgICAgICAgIHJldHVybiB7Li4uRGVmYXVsdEVycm9ycy5CQURfUkVRVUVTVCxzdGFjazpbZGF0YV0sZGV0YWlsczpcImV4cGVjdGluZyB7aG9zdElEOnN0cmluZyx0YXJnZXRQdWJsaWNLZXk6c3RyaW5nLHRhcmdldElEOnN0cmluZyx0YXJnZXRVUkw6c3RyaW5nfVwifTtcblxuICAgICAgICBpZihkYXRhLmhvc3RJRCAhPT0gdGhpcy5vcHRpb25zLmhvc3RJRClcbiAgICAgICAgICAgIHJldHVybiB7Li4uRGVmYXVsdEVycm9ycy5VTkFVVEhPUklaRUQsZGV0YWlsczpcImludmFsaWQgdGFyZ2V0SURcIn07XG5cbiAgICAgICAgLy9sb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogYXV0aG9yaXplIHN1Y2Nlc3NcIix0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLGRhdGEpO1xuXG4gICAgICAgIC8vMS4gc3RvcmUgdGFyZ2V0IGluZm9cbiAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldElEID0gZGF0YS50YXJnZXRJRDtcbiAgICAgICAgdGhpcy5vcHRpb25zLnRhcmdldFB1YmxpY0tleSA9IGRhdGEudGFyZ2V0UHVibGljS2V5O1xuICAgICAgICB0aGlzLm9wdGlvbnMudGFyZ2V0VVJMID0gZGF0YS50YXJnZXRVUkw7XG5cbiAgICAgICAgLy8yLiBzZW5kIGxvY2FsIGluZm9cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGhvc3RJRDp0aGlzLm9wdGlvbnMuaG9zdElELFxuICAgICAgICAgICAgaG9zdFB1YmxpY0tleTp0aGlzLm9wdGlvbnMuaG9zdFB1YmxpY0tleSxcbiAgICAgICAgICAgIGhvc3RVUkw6dGhpcy5vcHRpb25zLmhvc3RVUkxcbiAgICAgICAgfVxuXG4gICAgfVxuXG5cbiAgICBoYW5kbGVDYWxsYmFjayhkYXRhOklDbHVzdGVyUGFja2V0KXtcbiAgICAgICAgXG4gICAgICAgIGlmKCF0aGlzLmNhbGxiYWNrcy5oYXMoZGF0YS5jYWxsYmFja0lEKSl7XG4gICAgICAgICAgICBsb2dFcnJvcihcIkhVQkNvbm5lY3Rpb246IGNhbGxiYWNrIG5vdCBmb3VuZFwiLGRhdGEpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIC8vbG9nSW5mbyhcIkhVQkNvbm5lY3Rpb246IGV4ZWN1dGUgY2FsbGJhY2tcIixkYXRhKTtcblxuICAgICAgICBcbiAgICAgICAgY29uc3QgY2IgPSB0aGlzLmNhbGxiYWNrcy5nZXQoZGF0YS5jYWxsYmFja0lEKTtcbiAgICAgICAgaWYoY2Ipe1xuICAgICAgICAgICAgY2IuY2FsbGJhY2soZGF0YS5kYXRhID8/IGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlKGRhdGEuY2FsbGJhY2tJRCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBcbiAgICBzZW5kQ2FsbGJhY2soY2FsbGJhY2tJRDpudW1iZXIsZGF0YTpJRXJyb3J8YW55KXtcblxuICAgICAgICBpZihpc05hTihjYWxsYmFja0lEKSB8fCBjYWxsYmFja0lEPD0wKXtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFwiSFVCQ29ubmVjdGlvbjogaW52YWxpZCBjYWxsYmFja0lEXCIsY2FsbGJhY2tJRCxkYXRhKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgLy8gbG9nSW5mbyhcIkhVQkNvbm5lY3Rpb246IHNlbmQgY2FsbGJhY2tcIixkYXRhKTtcblxuICAgICAgICBpZih0aGlzLndzICYmIHRoaXMud3MucmVhZHlTdGF0ZT09PVdlYlNvY2tldC5PUEVOKXtcbiAgICAgICAgICAgIHRoaXMud3Muc2VuZChKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgbWV0aG9kOlwiY2FsbGJhY2tcIixcbiAgICAgICAgICAgICAgICBlcnJvcjpFcnJvclV0aWxzLmlzRXJyb3IoZGF0YSk/ZGF0YTpudWxsLFxuICAgICAgICAgICAgICAgIGRhdGE6RXJyb3JVdGlscy5pc0Vycm9yKGRhdGEpP251bGw6ZGF0YSxcbiAgICAgICAgICAgICAgICBjYWxsYmFja0lEOmNhbGxiYWNrSURcbiAgICAgICAgICAgIH0pKVxuICAgICAgICB9ZWxzZXtcbiAgICAgICAgICAgIGxvZ0Vycm9yKFwiSFVCQ29ubmVjdGlvbjogd3Mgbm90IGNvbm5lY3RlZCwgY2FudCBzZW5kIGNhbGxiYWNrXCIsdGhpcy5vcHRpb25zLmRpcmVjdGlvbixkYXRhKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXN5bmMgc2VuZChwYWNrZXQ6SUNsdXN0ZXJQYWNrZXQpOlByb21pc2U8YW55fElFcnJvcnxudWxsPntcbiAgICAgICAvLyBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogc2VuZCBwYWNrZXRcIix0aGlzLm9wdGlvbnMuZGlyZWN0aW9uLHBhY2tldCk7XG4gICAgICAgIGlmKCF0aGlzLndzIHx8IHRoaXMud3MucmVhZHlTdGF0ZSAhPT0gV2ViU29ja2V0Lk9QRU4pe1xuICAgICAgICAgICAgbG9nRXJyb3IoXCJIVUJDb25uZWN0aW9uOiB3cyBub3QgY29ubmVjdGVkLCBjYW50IHNlbmQgcGFja2V0XCIscGFja2V0KVxuICAgICAgICAgICAgcmV0dXJuIHsuLi5EZWZhdWx0RXJyb3JzLlNFUlZJQ0VfTk9UX1dPUktJTkcsZGV0YWlsczpcIndzIG5vdCBjb25uZWN0ZWRcIn07XG4gICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgIGxldCBjYj1udWxsO1xuICAgICAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2U8SUNsdXN0ZXJQYWNrZXR8bnVsbD4oKHJlc29sdmUpPT5jYj1yZXNvbHZlKTtcblxuICAgICAgICBpZihwYWNrZXQuY2FsbGJhY2tJRD4wKXtcbiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrSUQgPSBIVUJDb25uZWN0aW9uLmNhbGxiYWNrSUQrKztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tzLnNldChjYWxsYmFja0lELHt0aW1lOituZXcgRGF0ZSgpLGNhbGxiYWNrOmNiIX0pO1xuICAgICAgICAgICAgcGFja2V0LmNhbGxiYWNrSUQgPSBjYWxsYmFja0lEO1xuICAgICAgICB9XG5cbiAgICAgICAgLy90b2RvIC0gZW5jcnlwdCBkYXRhXG5cbiAgICAgICAgdGhpcy53cy5zZW5kKEpTT04uc3RyaW5naWZ5KHBhY2tldCksZXJyPT57XG4gICAgICAgICAgICBpZihlcnIpe1xuICAgICAgICAgICAgICAgIGxvZ0Vycm9yKFwiSFVCQ29ubmVjdGlvbjogY2FudCBzZW5kIHBhY2tldFwiLGVycik7XG4gICAgICAgICAgICAgICAgaWYocGFja2V0LmNhbGxiYWNrSUQ+MClcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFja3MuZGVsZXRlKHBhY2tldC5jYWxsYmFja0lEKTtcbiAgICAgICAgICAgICAgICBjYiEoRGVmYXVsdEVycm9ycy5TRVJWSUNFX05PVF9XT1JLSU5HKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYocGFja2V0LmNhbGxiYWNrSUQ9PT0wKVxuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxuXG5cbiAgICBjbG9zZSgpe1xuICAgICAgICBsb2dJbmZvKFwiSFVCQ29ubmVjdGlvbjogY2xvc2UgY29ubmVjdGlvblwiKVxuICAgICAgICB0aGlzLmNhbGxiYWNrcy5jbGVhcigpO1xuICAgICAgICB0aGlzLmF1dGhvcml6ZWQ9ZmFsc2U7XG5cbiAgICAgICAgaWYodGhpcy53cyl7XG4gICAgICAgICAgICB0cnl7XG4gICAgICAgICAgICAgICAgdGhpcy53cy5yZW1vdmVBbGxMaXN0ZW5lcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLndzLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy53cy50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH1jYXRjaChlKXt9XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuIl19