From 0f2202037c6c0d0cf5b5dceca9532da263ad846e Mon Sep 17 00:00:00 2001 From: RIceWqy <1840169763@qq.com> Date: Thu, 14 Dec 2023 21:22:58 +0800 Subject: [PATCH] jsonrpc --- uview-ui/libs/jsonrpc/jsonrpc2.0.js | 357 ++++++++++++++++++++++++++++ 1 file changed, 357 insertions(+) create mode 100644 uview-ui/libs/jsonrpc/jsonrpc2.0.js diff --git a/uview-ui/libs/jsonrpc/jsonrpc2.0.js b/uview-ui/libs/jsonrpc/jsonrpc2.0.js new file mode 100644 index 0000000..b31dfbf --- /dev/null +++ b/uview-ui/libs/jsonrpc/jsonrpc2.0.js @@ -0,0 +1,357 @@ +/* +jsonrpc-2.0 over http +mode:async +exp: +by:liangliangit +v2.0 beta + +2.0 beta功能 +新增send方法 建议用send方法替代call方法 +新增错误码订阅事件委托 例如可以订阅一份账户未登录的错误通知信息,然后处理用户跳转到登录页面,而不需要每次都判断请求是否未授权 +新增日志打印开启,关闭功能,默认开启 +*/ + + + +const jsonrpc={ + + + //会话 + _session:{ + key:localStorage.getItem("jsonrpc_session_key") + }, + + //错误信息订阅通知 (例如可以订阅一份账户未登录的错误通知信息,然后处理用户跳转到登录页面) + errnotifys:new Map(), + + //返回订阅id便于取消订阅 + errNotifyAdd:function(errcode,callback){ + let callfuncs = this.errnotifys.get(errcode) + if (callfuncs == null || callfuncs == undefined || callfuncs == ""){ + let funcs = [] + funcs.push(callback) + this.errnotifys.set(errcode,funcs) + return 0 + } + + let index = callfuncs.length + callfuncs[index]=callback + this.errnotifys.set(errcode,callfuncs) + return index + }, + + errNotifyDel:function(errcode,id){ + let callfuncs = this.errnotifys.get(errcode) + if (callfuncs == null || callfuncs == undefined || callfuncs == ""){ + return + } + callfuncs.delete(id) + this.errnotifys.set(errcode,callfuncs) + }, + + _errNotify:function(errcode){ + let callfuncs = this.errnotifys.get(errcode) + if (callfuncs == null || callfuncs == undefined || callfuncs == ""){ + return + } + for(let func in callfuncs){ + callfuncs[func]() + } + }, + + strict:true, + log:false, + + jsonRequestCode:{ + jsonrpc:"2.0", + method:"", + params:{}, + id:"", + timestampin:"", + }, + + jsonResponseCode:{ + jsonrpc:"2.0", + result:{}, + id:"", + timestampin:"", + timestampout:"", + error:{ + message:"", + code:"", + data:"" + }, + }, + + setSessionKey:function(key){ + localStorage.setItem("jsonrpc_session_key",key) + this._session.key = key + }, + + setUrl:function(url){ + localStorage.setItem("jsonrpc_url",url) + }, + + + send:function(url,rpcRequest,callback,errorcall){ + let guid = this.guid() + rpcRequest.id=guid + rpcRequest.jsonrpc = "2.0" + rpcRequest.session = this._session.key + let now = new Date().getTime() + rpcRequest.timestampin=now.toString() + let jsonString = JSON.stringify(rpcRequest) + if (this.log){console.log("rpcCall to service:"+url);console.log(jsonString)} + let jsonrpc = this + this.asyncpost(url,jsonString).then( + rpcResponse=>{ + if (jsonrpc.log){console.log(rpcResponse)} + if(!rpcResponse){ + this._onError("收到了错误的响应:无法解析json字符串") + if (typeof (errorcall) == "function"){ + let error={ + message:"收到了错误的响应:无法解析json字符串", + code:-1, + data:{} + } + errorcall(error) + } + return + } + + if(this.strict){ + if(rpcResponse.id == "" || rpcResponse.id == undefined){ + this._onError("收到了错误的响应:无法解析response.id,id为必须参数") + if (typeof (errorcall) == "function"){ + let error={ + message:"收到了错误的响应:无法解析response.id,id为必须参数", + code:-1, + data:{} + } + errorcall(error) + } + return + } + if(rpcResponse.jsonrpc != "2.0"){ + this._onError("收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0") + if (typeof (errorcall) == "function"){ + let error={ + message:"收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0", + code:-1, + data:{} + } + errorcall(error) + } + return + } + if(rpcResponse.error.code != 200){ + //this._onError(rpcResponse.error) + + if (typeof (errorcall) == "function"){ + errorcall(rpcResponse.error) + } + jsonrpc._errNotify(rpcResponse.error.code) + return + } + } + callback(rpcResponse) + } + ) + + }, + + + + //input jsonrpc.request + //return jsonrpc.response.result + result:function(url,rpcRequest){ + let guid = this.guid() + rpcRequest.id=guid + rpcRequest.jsonrpc = "2.0" + rpcRequest.session = this._session.key + let now = new Date().getTime() + rpcRequest.timestampin=now.toString() + let jsonString = JSON.stringify(rpcRequest) + if (this.log){console.log("rpcCall to service:"+url);console.log(jsonString)} + let jsonrpc = this + return new Promise(function(resolve, reject) { + jsonrpc.asyncpost(url,jsonString).then( + rpcResponse=>{ + if (jsonrpc.log){console.log(rpcResponse)} + if(!rpcResponse){ + jsonrpc._onError("收到了错误的响应:无法解析json字符串") + + let error={ + message:"收到了错误的响应:无法解析json字符串", + code:-1, + data:{} + } + reject(error) + + return + } + + if(jsonrpc.strict){ + if(rpcResponse.id == "" || rpcResponse.id == undefined){ + jsonrpc._onError("收到了错误的响应:无法解析response.id,id为必须参数") + + let error={ + message:"收到了错误的响应:无法解析response.id,id为必须参数", + code:-1, + data:{} + } + reject(error) + + return + } + if(rpcResponse.jsonrpc != "2.0"){ + jsonrpc._onError("收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0") + + let error={ + message:"收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0", + code:-1, + data:{} + } + reject(error) + + return + } + if(rpcResponse.error.code != 200){ + jsonrpc._errNotify(rpcResponse.error.code) + reject(rpcResponse.error) + return + } + } + resolve(rpcResponse.result) + } + ) + }) + }, + + + fetch:function(url,rpcRequest){ + let guid = this.guid() + rpcRequest.id=guid + rpcRequest.jsonrpc = "2.0" + rpcRequest.session = this._session.key + let now = new Date().getTime() + rpcRequest.timestampin=now.toString() + let jsonString = JSON.stringify(rpcRequest) + if (this.log){console.log("rpcCall to service:"+url);console.log(jsonString)} + let jsonrpc = this + return new Promise(function(resolve, reject) { + jsonrpc.asyncpost(url,jsonString).then( + rpcResponse=>{ + if (jsonrpc.log){console.log(rpcResponse)} + if(!rpcResponse){ + jsonrpc._onError("收到了错误的响应:无法解析json字符串") + let error={ + message:"收到了错误的响应:无法解析json字符串", + code:-1, + data:{} + } + reject(error) + return + } + + if(jsonrpc.strict){ + if(rpcResponse.id == "" || rpcResponse.id == undefined){ + jsonrpc._onError("收到了错误的响应:无法解析response.id,id为必须参数") + let error={ + message:"收到了错误的响应:无法解析response.id,id为必须参数", + code:-1, + data:{} + } + reject(error) + return + } + if(rpcResponse.jsonrpc != "2.0"){ + jsonrpc._onError("收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0") + let error={ + message:"收到了错误的响应:无法解析JSON-RPC,jsonrpc参数必须为2.0", + code:-1, + data:{} + } + reject(error) + return + } + if(rpcResponse.error.code != 200){ + jsonrpc._errNotify(rpcResponse.error.code) + reject(rpcResponse.error) + return + } + } + resolve(rpcResponse.result) + } + ) + }) + }, + + + + + //生成guid + guid:function() { + return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { + let r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8) + return v.toString(16) + }) + }, + + _onHttpError:function(err){ + this.onHttpError(err) + }, + + onHttpError:function(err){}, + + _onError:function(err){ + this.onError(err) + }, + + onError:function(err){}, + + + asyncpost:function(url,jsonString){ + let r = fetch(url, + { + method: 'POST', // or 'PUT' + mode: 'cors', + headers: { + 'Content-Type': 'application/json', + }, + body: jsonString + } + ).then(response => { + if(response.status != 200){ + this._onHttpError(response.error) + let rpcResponse={ + jsonrpc:"2.0", + id:"1", + error:{ + message:"http响应错误:"+response.status, + code:-1 + } + } + return rpcResponse + } + return response.json() + }).catch(response => { + this._onHttpError(response) + + let rpcResponse={ + jsonrpc:"2.0", + id:"1", + error:{ + message:"网路连接失败,请重试", + code:-1 + } + } + return rpcResponse + }) + return r + }, +} + + + +export default jsonrpc