|
@@ -0,0 +1,175 @@
|
|
|
+var rpc_client_id, Hlclient = function (wsURL) {
|
|
|
+ this.wsURL = wsURL;
|
|
|
+ this.handlers = {
|
|
|
+ _execjs: function (resolve, param) {
|
|
|
+ var res = eval(param)
|
|
|
+ resolve(res || "没有返回值")
|
|
|
+ }
|
|
|
+ };
|
|
|
+ this.socket = undefined;
|
|
|
+ this.isWechat = typeof wx !== 'undefined'; // 新增环境判断
|
|
|
+
|
|
|
+ if (!wsURL) throw new Error('wsURL can not be empty!!');
|
|
|
+
|
|
|
+ // 微信环境读取持久化的clientId
|
|
|
+ if (this.isWechat && wx.getStorageSync('rpc_client_id')) {
|
|
|
+ rpc_client_id = wx.getStorageSync('rpc_client_id');
|
|
|
+ }
|
|
|
+
|
|
|
+ this.connect();
|
|
|
+}
|
|
|
+
|
|
|
+Hlclient.prototype.connect = function () {
|
|
|
+ var _this = this;
|
|
|
+
|
|
|
+ // 处理clientId参数
|
|
|
+ if (this.wsURL.indexOf("clientId=") === -1 && rpc_client_id) {
|
|
|
+ this.wsURL += "&clientId=" + rpc_client_id;
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log('begin connect to:', this.wsURL);
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (this.isWechat) {
|
|
|
+ // 微信环境使用wx API
|
|
|
+ this.socket = wx.connectSocket({
|
|
|
+ url: this.wsURL,
|
|
|
+ success() {
|
|
|
+ console.log('微信WS连接建立成功');
|
|
|
+ },
|
|
|
+ fail(err) {
|
|
|
+ console.error('微信WS连接失败:', err);
|
|
|
+ _this.reconnect();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ // 微信事件监听
|
|
|
+ wx.onSocketMessage(function (res) {
|
|
|
+ _this.handlerRequest(res.data);
|
|
|
+ });
|
|
|
+
|
|
|
+ wx.onSocketOpen(function () {
|
|
|
+ console.log("rpc连接成功");
|
|
|
+ });
|
|
|
+
|
|
|
+ wx.onSocketError(function (err) {
|
|
|
+ console.error('rpc连接出错:', err);
|
|
|
+ });
|
|
|
+
|
|
|
+ wx.onSocketClose(function () {
|
|
|
+ console.log('rpc连接关闭');
|
|
|
+ _this.reconnect();
|
|
|
+ });
|
|
|
+
|
|
|
+ } else {
|
|
|
+ // 浏览器环境
|
|
|
+ this.socket = new WebSocket(this.wsURL);
|
|
|
+
|
|
|
+ this.socket.onmessage = function (e) {
|
|
|
+ _this.handlerRequest(e.data);
|
|
|
+ }
|
|
|
+
|
|
|
+ this.socket.onclose = function () {
|
|
|
+ console.log('rpc已关闭');
|
|
|
+ _this.reconnect();
|
|
|
+ }
|
|
|
+
|
|
|
+ this.socket.addEventListener('open', () => {
|
|
|
+ console.log("rpc连接成功");
|
|
|
+ });
|
|
|
+
|
|
|
+ this.socket.addEventListener('error', (err) => {
|
|
|
+ console.error('rpc连接出错:', err);
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.log("connection failed:", e);
|
|
|
+ this.reconnect();
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+Hlclient.prototype.reconnect = function () {
|
|
|
+ console.log("10秒后尝试重连...");
|
|
|
+ var _this = this;
|
|
|
+ setTimeout(function () {
|
|
|
+ _this.connect();
|
|
|
+ }, 10000);
|
|
|
+};
|
|
|
+
|
|
|
+Hlclient.prototype.send = function (msg) {
|
|
|
+ if (this.isWechat) {
|
|
|
+ // 微信环境发送消息
|
|
|
+ if (this.socket && this.socket.readyState === 1) {
|
|
|
+ wx.sendSocketMessage({
|
|
|
+ data: msg,
|
|
|
+ fail(err) {
|
|
|
+ console.error('消息发送失败:', err);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 浏览器环境
|
|
|
+ if (this.socket.readyState === WebSocket.OPEN) {
|
|
|
+ this.socket.send(msg);
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+Hlclient.prototype.regAction = function (func_name, func) {
|
|
|
+ if (typeof func_name !== 'string') throw new Error("func_name must be string");
|
|
|
+ if (typeof func !== 'function') throw new Error("must be function");
|
|
|
+ console.log("register func:", func_name);
|
|
|
+ this.handlers[func_name] = func;
|
|
|
+ return true;
|
|
|
+};
|
|
|
+
|
|
|
+Hlclient.prototype.handlerRequest = function (requestJson) {
|
|
|
+ var _this = this;
|
|
|
+ try {
|
|
|
+ var result = JSON.parse(requestJson);
|
|
|
+ // 微信环境持久化clientId
|
|
|
+ if (result["registerId"]) {
|
|
|
+ rpc_client_id = result['registerId'];
|
|
|
+ if (this.isWechat) {
|
|
|
+ wx.setStorageSync('rpc_client_id', rpc_client_id);
|
|
|
+ }
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!result['action'] || !result["message_id"]) {
|
|
|
+ console.warn('Invalid request:', result);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ var action = result["action"],
|
|
|
+ message_id = result["message_id"],
|
|
|
+ param = result["param"];
|
|
|
+
|
|
|
+ try { param = JSON.parse(param); } catch (e) { }
|
|
|
+
|
|
|
+ var handler = this.handlers[action];
|
|
|
+ if (!handler) {
|
|
|
+ return this.sendResult(action, message_id, 'Action not found');
|
|
|
+ }
|
|
|
+
|
|
|
+ handler(function (response) {
|
|
|
+ _this.sendResult(action, message_id, response);
|
|
|
+ }, param);
|
|
|
+
|
|
|
+ } catch (error) {
|
|
|
+ console.log("处理请求出错:", error);
|
|
|
+ this.sendResult(action, message_id, error.message);
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+Hlclient.prototype.sendResult = function (action, message_id, data) {
|
|
|
+ if (typeof data === 'object') {
|
|
|
+ try { data = JSON.stringify(data); } catch (e) { }
|
|
|
+ }
|
|
|
+ var response = JSON.stringify({
|
|
|
+ action: action,
|
|
|
+ message_id: message_id,
|
|
|
+ response_data: data
|
|
|
+ });
|
|
|
+ this.send(response);
|
|
|
+};
|