var rpc_client_id, Hlclient = function (wsURL) { this.wsURL = wsURL; this.handlers = { _execjs: function (resolve, param) { try { var fn = new Function('return (async () => { ' + param + ' })()'); var result = fn(); if (result && typeof result.then === 'function') { result.then(function(res) { resolve(res !== undefined ? res : "执行成功(无返回值)"); }).catch(function(err) { resolve("执行错误: " + (err.message || err)); }); } else { resolve(result !== undefined ? result : "执行成功(无返回值)"); } } catch (err) { resolve("语法错误: " + (err.message || err)); } } }; this.socket = undefined; if (!wsURL) { throw new Error('wsURL can not be empty!!') } this.connect() } Hlclient.prototype.connect = function () { if (this.wsURL.indexOf("clientId=") === -1 && rpc_client_id) { this.wsURL += "&clientId=" + rpc_client_id } console.log('begin of connect to wsURL: ' + this.wsURL); var _this = this; try { this.socket = new WebSocket(this.wsURL); this.socket.onmessage = function (e) { _this.handlerRequest(e.data) } } catch (e) { console.log("connection failed,reconnect after 10s"); setTimeout(function () { _this.connect() }, 10000) } this.socket.onclose = function () { console.log('rpc已关闭'); setTimeout(function () { _this.connect() }, 10000) } this.socket.addEventListener('open', (event) => { console.log("rpc连接成功"); this._reportActions(); }); this.socket.addEventListener('error', (event) => { console.error('rpc连接出错,请检查是否打开服务端:', event.error); }) }; Hlclient.prototype.send = function (msg) { this.socket.send(msg) } Hlclient.prototype.regAction = function (func_name, func) { if (typeof func_name !== 'string') { throw new Error("an func_name must be string"); } if (typeof func !== 'function') { throw new Error("must be function"); } console.log("register func_name: " + func_name); this.handlers[func_name] = func; this._reportActions(); return true } Hlclient.prototype._reportActions = function () { var actions = Object.keys(this.handlers); if (this.socket && this.socket.readyState === WebSocket.OPEN) { this.send(JSON.stringify({ "action": "_registerActions", "message_id": "", "response_data": JSON.stringify(actions) })); } } Hlclient.prototype.handlerRequest = function (requestJson) { var _this = this; try { var result = JSON.parse(requestJson) } catch (error) { console.log("请求信息解析错误", requestJson); return } if (result["registerId"]) { rpc_client_id = result['registerId'] return } if (!result['action'] || !result["message_id"]) { console.warn('没有方法或者消息id,不处理'); return } var action = result["action"], message_id = result["message_id"] var theHandler = this.handlers[action]; if (!theHandler) { this.sendResult(action, message_id, 'action没找到'); return } try { if (!result["param"]) { const async_result = theHandler(function (response) { _this.sendResult(action, message_id, response); }) if (async_result && typeof async_result.then === "function") { async_result.catch(e => { _this.sendResult(action, message_id, "" + e); }); } return } var param = result["param"] try { param = JSON.parse(param) } catch (e) { } theHandler(function (response) { _this.sendResult(action, message_id, response); }, param) } catch (e) { console.log("error: " + e); _this.sendResult(action, message_id, "" + e); } } Hlclient.prototype.sendResult = function (action, message_id, e) { if (typeof e === 'object' && e !== null) { try { e = JSON.stringify(e) } catch (v) { console.log(v) } } this.send(JSON.stringify({"action": action, "message_id": message_id, "response_data": e})); }