sers.ServiceStation.js 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220
  1. /*
  2. * sers.ServiceStation.js
  3. * Date : 2022-05-18
  4. * Version: 2.1.18-preview902
  5. * author : Lith
  6. * email : serset@yeah.net
  7. */
  8. ; sers = { version: '2.1.18-preview902' };
  9. /*
  10. * vit.js 扩展
  11. * author : Lith
  12. * email : serset@yeah.net
  13. */
  14. ; (function (vit) {
  15. // vit工具函数
  16. ; (function () {
  17. vit.stringToBytes = function (str) {
  18. if (!str) return [];
  19. var bytes = new Array();
  20. var len, c;
  21. len = str.length;
  22. for (var i = 0; i < len; i++) {
  23. c = str.charCodeAt(i);
  24. if (c >= 0x010000 && c <= 0x10FFFF) {
  25. bytes.push(((c >> 18) & 0x07) | 0xF0);
  26. bytes.push(((c >> 12) & 0x3F) | 0x80);
  27. bytes.push(((c >> 6) & 0x3F) | 0x80);
  28. bytes.push((c & 0x3F) | 0x80);
  29. } else if (c >= 0x000800 && c <= 0x00FFFF) {
  30. bytes.push(((c >> 12) & 0x0F) | 0xE0);
  31. bytes.push(((c >> 6) & 0x3F) | 0x80);
  32. bytes.push((c & 0x3F) | 0x80);
  33. } else if (c >= 0x000080 && c <= 0x0007FF) {
  34. bytes.push(((c >> 6) & 0x1F) | 0xC0);
  35. bytes.push((c & 0x3F) | 0x80);
  36. } else {
  37. bytes.push(c & 0xFF);
  38. }
  39. }
  40. return bytes;
  41. };
  42. vit.bytesToString = function (bytes) {
  43. if (!bytes) return null;
  44. if (typeof bytes === 'string') {
  45. return bytes;
  46. }
  47. var str = '',
  48. _arr = bytes;
  49. for (var i = 0; i < _arr.length; i++) {
  50. var one = _arr[i].toString(2),
  51. v = one.match(/^1+?(?=0)/);
  52. if (v && one.length == 8) {
  53. var bytesLength = v[0].length;
  54. var store = _arr[i].toString(2).slice(7 - bytesLength);
  55. for (var st = 1; st < bytesLength; st++) {
  56. store += _arr[st + i].toString(2).slice(2);
  57. }
  58. str += String.fromCharCode(parseInt(store, 2));
  59. i += bytesLength - 1;
  60. } else {
  61. str += String.fromCharCode(_arr[i]);
  62. }
  63. }
  64. return str;
  65. };
  66. vit.bytesToObject = function (bytes) {
  67. return eval('(' + vit.bytesToString(bytes) + ')');
  68. };
  69. vit.objectSerializeToString = function (obj) {
  70. if (obj == null || typeof (obj) == 'undefined') {
  71. return null;
  72. }
  73. var str = obj;
  74. if (typeof (str) != 'string') {
  75. str = JSON.stringify(str);
  76. }
  77. return str;
  78. };
  79. vit.objectSerializeToBytes = function (obj) {
  80. var str = vit.objectSerializeToString(obj);
  81. return vit.stringToBytes(str);
  82. };
  83. //合并连个数组
  84. vit.arrayConcat = function (a, b, count) {
  85. //a.push.apply(a, b);
  86. if (!count) count = b.length;
  87. for (var t = 0; t < count; t++) {
  88. a.push(b[t]);
  89. }
  90. return a;
  91. };
  92. vit.bytesToArrayBuffer = function (bytes) {
  93. return new Uint8Array(bytes).buffer;
  94. };
  95. vit.bytesToDataView = function (bytes) {
  96. return new DataView(vit.bytesToArrayBuffer(bytes));
  97. };
  98. vit.arrayBufferToBytes = function (arrayBuffer) {
  99. return Array.from(new Uint8Array(arrayBuffer));
  100. };
  101. vit.dataViewToBytes = function (dataView) {
  102. return vit.arrayBufferToBytes(dataView.buffer);
  103. };
  104. vit.bytesGetInt32 = function (bytes, index) {
  105. return new DataView(new Uint8Array(bytes).buffer).getInt32(index || 0, true);
  106. };
  107. vit.int32ToBytes = function (int32) {
  108. var buffer = new ArrayBuffer(4);
  109. var view = new DataView(buffer);
  110. view.setInt32(0, int32, true);
  111. return vit.dataViewToBytes(view);
  112. };
  113. vit.bytesInsertInt32 = function (bytes, index, int32) {
  114. var bytesInt32 = vit.int32ToBytes(int32);
  115. bytes.splice(index, 0, bytesInt32[0], bytesInt32[1], bytesInt32[2], bytesInt32[3]);
  116. return bytes;
  117. };
  118. // return '112233445566778899aabbccddee'
  119. vit.guid = function guid() {
  120. function S4() {
  121. return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
  122. }
  123. return (S4() + S4() + S4() + S4() + S4() + S4() + S4() + S4());
  124. };
  125. })();
  126. //vit.logger
  127. (function (logger) {
  128. /*** 对Date的扩展,将 Date 转化为指定格式的String * 月(M)、日(d)、12小时(h)、24小时(H)、分(m)、秒(s)、周(E)、季度(q)
  129. * 可以用 1-2 个占位符 * 年(y)可以用 1-4 个占位符,毫秒(S)只能用 1 个占位符(是 1-3 位的数字)
  130. * eg:
  131. * (newDate()).pattern("yyyy-MM-dd hh:mm:ss.S")==> 2006-07-02 08:09:04.423
  132. * (new Date()).pattern("yyyy-MM-dd E HH:mm:ss") ==> 2009-03-10 二 20:09:04
  133. * (new Date()).pattern("yyyy-MM-dd EE hh:mm:ss") ==> 2009-03-10 周二 08:09:04
  134. * (new Date()).pattern("yyyy-MM-dd EEE hh:mm:ss") ==> 2009-03-10 星期二 08:09:04
  135. * (new Date()).pattern("yyyy-M-d h:m:s.S") ==> 2006-7-2 8:9:4.18
  136. */
  137. Date.prototype.pattern = function (fmt) {
  138. var o = {
  139. "M+": this.getMonth() + 1, //月份
  140. "d+": this.getDate(), //日
  141. "h+": this.getHours() % 12 == 0 ? 12 : this.getHours() % 12, //小时
  142. "H+": this.getHours(), //小时
  143. "m+": this.getMinutes(), //分
  144. "s+": this.getSeconds(), //秒
  145. "q+": Math.floor((this.getMonth() + 3) / 3), //季度
  146. "S": this.getMilliseconds() //毫秒
  147. };
  148. var week = {
  149. "0": "/u65e5",
  150. "1": "/u4e00",
  151. "2": "/u4e8c",
  152. "3": "/u4e09",
  153. "4": "/u56db",
  154. "5": "/u4e94",
  155. "6": "/u516d"
  156. };
  157. if (/(y+)/.test(fmt)) {
  158. fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
  159. }
  160. if (/(E+)/.test(fmt)) {
  161. fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? "/u661f/u671f" : "/u5468") : "") + week[this.getDay() + ""]);
  162. }
  163. for (var k in o) {
  164. if (new RegExp("(" + k + ")").test(fmt)) {
  165. fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
  166. }
  167. }
  168. return fmt;
  169. };
  170. //type: info/error
  171. //e: pass error when type is error
  172. //function(message,type,e){ }
  173. logger.onmessage;
  174. logger.error = function (e, message) {
  175. var msgBody = new Date().pattern("[mm:ss.S]") + '[error]' + (message || e.message || '');
  176. //console.log(e);
  177. //console.log(msgBody);
  178. try {
  179. if (logger.onmessage) logger.onmessage(msgBody, 'error', e);
  180. } catch (e) {
  181. }
  182. };
  183. logger.info = function (message) {
  184. var msgBody = new Date().pattern("[mm:ss.S]") + '[info]' + message;
  185. //console.log(msgBody);
  186. try {
  187. if (logger.onmessage) logger.onmessage(msgBody, 'info');
  188. } catch (e) {
  189. }
  190. };
  191. })(vit.logger = {});
  192. })('undefined' === typeof (vit) ? vit = {} : vit);
  193. /*
  194. * sers.CL.js 扩展
  195. * PipeFrame CL.DeliveryClient RequestAdaptor CL.OrganizeClient
  196. * author : Lith
  197. * email : serset@yeah.net
  198. */
  199. ; (function (CL) {
  200. var logger = vit.logger;
  201. function PipeFrame() {
  202. this.write = function (arrayBuffer) {
  203. queueBuff.push(new Uint8Array(arrayBuffer));
  204. buffLen += arrayBuffer.byteLength;
  205. };
  206. //DataView list
  207. var queueBuff = [];
  208. var buffLen = 0;
  209. var QueueBuff_dataLenOfRemoved = 0;
  210. //return bytes
  211. function read(lenToPop) {
  212. if (buffLen < lenToPop) {
  213. return;
  214. }
  215. buffLen -= lenToPop;
  216. var dataToPop = [];
  217. var copyedIndex = 0;
  218. while (copyedIndex < lenToPop) {
  219. var leftCount = lenToPop - copyedIndex;
  220. var cur = queueBuff[0];
  221. if (QueueBuff_dataLenOfRemoved != 0) {
  222. cur = cur.subarray(QueueBuff_dataLenOfRemoved);
  223. }
  224. if (cur.length <= leftCount) {
  225. //dataToPop 数据长
  226. vit.arrayConcat(dataToPop, cur);
  227. copyedIndex += cur.length;
  228. QueueBuff_dataLenOfRemoved = 0;
  229. queueBuff.shift();
  230. }
  231. else {
  232. //queueBuff 数据长
  233. vit.arrayConcat(dataToPop, cur, leftCount);
  234. copyedIndex += leftCount;
  235. QueueBuff_dataLenOfRemoved += leftCount;
  236. }
  237. }
  238. return dataToPop;
  239. };
  240. var fileLen = -1;
  241. //return bytes
  242. this.readSersFile = function () {
  243. if (fileLen < 0) {
  244. var fileLen_bytes = read(4);
  245. if (!fileLen_bytes) {
  246. return null;
  247. }
  248. fileLen = vit.bytesGetInt32(fileLen_bytes, 0);
  249. }
  250. if (buffLen < fileLen) return null;
  251. var data = read(fileLen);
  252. fileLen = -1;
  253. return data;
  254. };
  255. };
  256. CL.DeliveryClient = function () {
  257. var self = this;
  258. self.host = "ws://127.0.0.1:4503";
  259. //function (bytes) { }
  260. self.event_onGetFrame;
  261. // function () { }
  262. self.event_onDisconnected;
  263. self.sendFrame = function (bytes) {
  264. if (!webSocket) throw new Error('连接尚未建立,无法发送数据,请先建立连接');
  265. vit.bytesInsertInt32(bytes, 0, bytes.length);
  266. var dataView = vit.bytesToDataView(bytes);
  267. webSocket.send(dataView);
  268. };
  269. var pipe = new PipeFrame();
  270. var webSocket = null;
  271. //callback: function(success){ }
  272. self.connect = function (callback) {
  273. if (webSocket) throw new Error('连接尚未断开,不可再次连接');
  274. webSocket = new WebSocket(self.host);
  275. webSocket.binaryType = "arraybuffer";
  276. webSocket.onerror = function (event) {
  277. self.close();
  278. };
  279. webSocket.onclose = function () {
  280. self.close();
  281. };
  282. //成功被调用 或者超时被调用
  283. var isCalled = false;
  284. var onCall = function (success) {
  285. if (isCalled) return;
  286. isCalled = true;
  287. callback(success);
  288. };
  289. setTimeout(onCall, 10000);
  290. webSocket.onopen = function (event) {
  291. onCall(true);
  292. };
  293. webSocket.onmessage = function (event) {
  294. var arrayBuffer = event.data;
  295. pipe.write(arrayBuffer);
  296. //bytes
  297. var frame;
  298. while (frame = pipe.readSersFile()) {
  299. try {
  300. self.event_onGetFrame(frame);
  301. } catch (e) {
  302. logger.error(e);
  303. }
  304. }
  305. };
  306. };
  307. self.close = function () {
  308. if (!webSocket) throw new Error('尚未建立连接,无需断开');
  309. //(x.1) close socket
  310. try {
  311. webSocket.close();
  312. } catch (e) {
  313. logger.error(e);
  314. }
  315. webSocket = null;
  316. logger.info('[sers.CL]DeliveryClient.event_onDisconnected');
  317. //(x.2) event_onDisconnected
  318. if (self.event_onDisconnected) {
  319. try {
  320. self.event_onDisconnected();
  321. } catch (e) {
  322. logger.error(e);
  323. }
  324. }
  325. };
  326. };
  327. function RequestAdaptor() {
  328. var EFrameType = { request: 1, reply: 2, message: 3 };
  329. var ERequestType = { app: 0, heartBeat: 1 };
  330. var organizeVersion = "Sers.Mq.Socket.v1";
  331. var self = this;
  332. // requestKey -> requestCallback
  333. var organizeToDelivery_RequestMap = {};
  334. var reqKeyIndex = 100;
  335. //事件,向外部delivery发送字节流时被调用
  336. //function (bytes) { }
  337. self.event_onSendFrame;
  338. //事件,delivery向Organize发送请求时被调用
  339. //function (apiRequestMessage_bytes, callback) { }
  340. // callback: function(apiReplyMessage_bytes){ }
  341. self.event_onGetRequest;
  342. //事件,delivery向Organize发送请求时被调用
  343. //function (bytes) { }
  344. self.event_onGetMessage;
  345. //请求超时时间(单位ms,默认300000)
  346. self.requestTimeoutMs = 300000;
  347. //外部调用,当外部从delivery读取到数据时调用
  348. self.deliveryToOrganize_onGetMessageFrame = function (bytes) {
  349. //deliveryToOrganize_ProcessFrame
  350. var msgType = bytes[0];
  351. var msgData = bytes.slice(2);
  352. switch (msgType) {
  353. case EFrameType.reply:
  354. var t = unpackReqRepFrame(msgData);
  355. var reqKey = t.reqKey;
  356. var replyData = t.oriData;
  357. var reqCallback = organizeToDelivery_RequestMap[reqKey];
  358. if (reqCallback) {
  359. delete organizeToDelivery_RequestMap[reqKey];
  360. reqCallback(replyData);
  361. }
  362. break;
  363. case EFrameType.request:
  364. var t = unpackReqRepFrame(msgData);
  365. var reqKey_bytes = t.reqKey_bytes;
  366. var requestData = t.oriData;
  367. var requestType = bytes[1];
  368. deliveryToOrganize_onGetRequest(requestType, reqKey_bytes, requestData);
  369. break;
  370. case EFrameType.message:
  371. self.event_onGetMessage(msgData);
  372. break;
  373. }
  374. };
  375. function deliveryToOrganize_onGetRequest(requestType, reqKey_bytes, requestData) {
  376. switch (requestType) {
  377. case ERequestType.app:
  378. self.event_onGetRequest(requestData, function (apiReplyMessage_bytes) {
  379. deliveryToOrganize_sendReply(reqKey_bytes, apiReplyMessage_bytes);
  380. });
  381. return;
  382. case ERequestType.heartBeat:
  383. var version = vit.bytesToString(requestData);
  384. if (version == organizeVersion) {
  385. // send reply
  386. deliveryToOrganize_sendReply(reqKey_bytes, requestData);
  387. }
  388. else {
  389. // send reply
  390. deliveryToOrganize_sendReply(reqKey_bytes, [0]);
  391. }
  392. return;
  393. }
  394. }
  395. function deliveryToOrganize_sendReply(reqKey_bytes, replyData) {
  396. var repFrame = packageReqRepFrame(reqKey_bytes, replyData);
  397. delivery_sendFrame(EFrameType.reply, 0, repFrame);
  398. }
  399. //callback: ({success,replyData})=>{ }
  400. self.sendRequest = function (requestType, requestData, callback) {
  401. var reqKey = reqKeyIndex++;
  402. //成功被调用 或者超时被调用
  403. var isCalled = false;
  404. var onRequestFinish = function (success, replyData) {
  405. if (isCalled) return;
  406. isCalled = true;
  407. //if (!success)
  408. delete organizeToDelivery_RequestMap[reqKey];
  409. if (callback)
  410. callback({ success: success, replyData: replyData });
  411. };
  412. setTimeout(onRequestFinish, self.requestTimeoutMs);
  413. organizeToDelivery_RequestMap[reqKey] = function (replyData) { onRequestFinish(true, replyData); };
  414. var reqKey_bytes = vit.int32ToBytes(reqKey);
  415. reqKey_bytes.push(0, 0, 0, 0);
  416. var reqRepFrame = packageReqRepFrame(reqKey_bytes, requestData);
  417. delivery_sendFrame(EFrameType.request, requestType || ERequestType.app, reqRepFrame);
  418. };
  419. self.sendMessage = function (message_bytes) {
  420. delivery_sendFrame(EFrameType.message, 0, message_bytes);
  421. };
  422. function delivery_sendFrame(msgType, requestType, bytes) {
  423. bytes.splice(0, 0, msgType, requestType);
  424. self.event_onSendFrame(bytes);
  425. }
  426. //reqKey_bytes 8字节
  427. //返回 reqRepFrame[bytes]
  428. function packageReqRepFrame(reqKey_bytes, oriData) {
  429. return vit.arrayConcat(reqKey_bytes, oriData);
  430. }
  431. // 返回对象 {reqKey:reqKey,reqKey_bytes:reqKey_bytes, oriData:oriData}
  432. function unpackReqRepFrame(reqRepFrame) {
  433. var reqKey = vit.bytesGetInt32(reqRepFrame, 0);
  434. return { reqKey: reqKey, reqKey_bytes: reqRepFrame.slice(0, 8), oriData: reqRepFrame.slice(8) };
  435. }
  436. }
  437. //websocketHost demo: "ws://127.0.0.1:4503"
  438. CL.OrganizeClient = function (websocketHost) {
  439. var self = this;
  440. var delivery = new CL.DeliveryClient();
  441. //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
  442. self.secretKey = "SersCL";
  443. //设置websocket host 地址 demo: "ws://127.0.0.1:4503"
  444. self.setHost = function (websocketHost) {
  445. delivery.host = websocketHost;
  446. };
  447. self.setHost(websocketHost);
  448. var requestAdaptor = new RequestAdaptor();
  449. //初始化requestAdaptor 和 delivery
  450. (function () {
  451. delivery.event_onGetFrame = function (bytes) {
  452. requestAdaptor.deliveryToOrganize_onGetMessageFrame(bytes);
  453. };
  454. requestAdaptor.event_onGetRequest = function (apiRequestMessage_bytes, callback) {
  455. self.event_onGetRequest(apiRequestMessage_bytes, callback);
  456. };
  457. requestAdaptor.event_onGetMessage = function (bytes) {
  458. self.event_onGetMessage(bytes);
  459. };
  460. requestAdaptor.event_onSendFrame = function (bytes) {
  461. delivery.sendFrame(bytes);
  462. };
  463. delivery.event_onDisconnected = function () {
  464. if (self.event_onDisconnected)
  465. self.event_onDisconnected.apply(self, arguments);
  466. };
  467. })();
  468. //function (event) { }
  469. self.event_onDisconnected = null;
  470. //function (apiRequestMessage_bytes,callback) { }
  471. // callback function(apiReplyMessage_bytes){}
  472. self.event_onGetRequest = null;
  473. //function (bytes) { }
  474. self.event_onGetMessage = null;
  475. //callback: ({success,replyData})=>{ }
  476. self.sendRequest = function (requestData, callback) {
  477. requestAdaptor.sendRequest(null, requestData, callback);
  478. };
  479. self.sendMessage = function (message_bytes) {
  480. requestAdaptor.sendMessage(message_bytes);
  481. };
  482. //callback: function (success) { }
  483. self.connect = function (callback) {
  484. delivery.connect(function (success) {
  485. //(x.1)连接不成功
  486. if (!success)
  487. callback(false);
  488. //(x.2)进行权限校验
  489. //setTimeout(function () {
  490. self.sendRequest(vit.stringToBytes(self.secretKey), function (args) {
  491. let success = args.success, replyData = args.replyData;
  492. //(x.x.1)请求不成功
  493. if (!success) {
  494. callback(false);
  495. return;
  496. }
  497. //(x.x.2)验证不成功
  498. if (vit.bytesToString(replyData) != 'true') {
  499. callback(false);
  500. return;
  501. }
  502. //(x.x.3)验证成功
  503. callback(true);
  504. });
  505. //}, 5000);
  506. });
  507. };
  508. self.stop = function () {
  509. delivery.close();
  510. };
  511. }
  512. })(sers.CL || (sers.CL = {}));
  513. /*
  514. * sers.ServiceStation.js 扩展
  515. * sers.ApiMessage sers.ApiClient sers.MessageClient sers.LocalApiService sers.ServiceStation
  516. * author : Lith
  517. * email : serset@yeah.net
  518. */
  519. ; (function (sers) {
  520. var logger = vit.logger;
  521. //ApiMessage
  522. function ApiMessage() {
  523. var self = this;
  524. //bytes
  525. var rpcContextData_OriData;
  526. //bytes
  527. var value_OriData;
  528. //return object
  529. self.getRpcData = function () {
  530. var strRpc = vit.bytesToString(rpcContextData_OriData);
  531. if (!strRpc) return {};
  532. return eval('(' + strRpc + ')');
  533. };
  534. //return bytes
  535. self.getValueBytes = function () {
  536. return value_OriData;
  537. };
  538. //return string
  539. self.getValueString = function () {
  540. var strValue = vit.bytesToString(value_OriData);
  541. return strValue;
  542. };
  543. //return object
  544. self.getValueObject = function () {
  545. return eval('(' + self.getValueString() + ')');
  546. };
  547. self.initAsApiRequestMessage = function (route, arg, httpMethod) {
  548. var rpcData = {
  549. "route": route,
  550. "caller": {
  551. "rid": vit.guid(),
  552. "callStack": [], // parentRequestGuid array
  553. "source": "Internal"
  554. },
  555. "http": {
  556. "method": httpMethod || "GET"
  557. }
  558. };
  559. rpcContextData_OriData = vit.objectSerializeToBytes(rpcData);
  560. value_OriData = vit.objectSerializeToBytes(arg);
  561. };
  562. self.package = function () {
  563. return ApiMessage.package(rpcContextData_OriData, value_OriData);
  564. };
  565. self.unpackage = function (oriData) {
  566. var files = ApiMessage.unpackage(oriData);
  567. rpcContextData_OriData = files[0];
  568. value_OriData = files[1];
  569. };
  570. };
  571. //arg files(bytes[])
  572. //return bytes
  573. ApiMessage.package = function () {
  574. var files = arguments;
  575. var oriData = [];
  576. for (var t = 0; t < files.length; t++) {
  577. var file = files[t];
  578. //if (file instanceof ArrayBuffer) {
  579. // file = vit.arrayBufferToBytes(file);
  580. //}
  581. vit.arrayConcat(oriData, vit.int32ToBytes(file.length));
  582. vit.arrayConcat(oriData, file);
  583. }
  584. return oriData;
  585. };
  586. //arg oriData(bytes)
  587. //return bytes[] file[]
  588. ApiMessage.unpackage = function (oriData) {
  589. var files = [];
  590. var curIndex = 0;
  591. while (curIndex < oriData.length) {
  592. var fileLength = vit.bytesGetInt32(oriData, curIndex);
  593. var fileContent = oriData.slice(curIndex + 4, curIndex + 4 + fileLength);
  594. curIndex += 4 + fileLength;
  595. files.push(fileContent);
  596. }
  597. return files;
  598. };
  599. sers.ApiMessage = ApiMessage;
  600. //ApiClient
  601. sers.ApiClient = function (organizeClient) {
  602. //(string route, object arg, string httpMethod, function callback)
  603. // callback: function({success,replyData_bytes,replyRpcData_object})
  604. this.callApiAsync = function (route, arg, httpMethod, callback) {
  605. var apiRequestMessage = new ApiMessage();
  606. apiRequestMessage.initAsApiRequestMessage(route, arg, httpMethod);
  607. organizeClient.sendRequest(apiRequestMessage.package(), function (args) {
  608. let success = args.success, replyData = args.replyData;
  609. if (!callback) return;
  610. if (!success) {
  611. callback({ success: false });
  612. } else {
  613. var apiMessage = new ApiMessage();
  614. apiMessage.unpackage(replyData);
  615. var value = apiMessage.getValueBytes();
  616. var replyRpcData = apiMessage.getRpcData();
  617. callback({ success: true, replyData_bytes: value, replyRpcData_object: replyRpcData });
  618. }
  619. });
  620. };
  621. };
  622. //MessageClient
  623. sers.MessageClient = function (organizeClient) {
  624. let EFrameType = {
  625. /// <summary>
  626. /// publish, msgTitle, msgData
  627. /// </summary>
  628. publish: 0,
  629. /// <summary>
  630. /// subscribe, msgTitle
  631. /// </summary>
  632. subscribe: 1,
  633. /// <summary>
  634. /// unSubscribe, msgTitle
  635. /// </summary>
  636. unSubscribe: 2,
  637. /// <summary>
  638. /// message, msgTitle, msgData
  639. /// </summary>
  640. message: 3
  641. };
  642. function sendFrame(frame) {
  643. organizeClient.sendMessage(frame);
  644. }
  645. this.onGetMessage = (messageData) => {
  646. let frame = ApiMessage.unpackage(messageData);
  647. let msgType = frame[0][0];
  648. switch (msgType) {
  649. case EFrameType.message:
  650. let msgTitle = vit.bytesToString(frame[1]);
  651. let msgData = frame[2];
  652. this.message_Consumer(msgTitle, msgData);
  653. break;
  654. }
  655. };
  656. // (msgTitle,msgData)=>void
  657. this.message_Consumer;
  658. this.message_Publish = function (msgTitle, msgData) {
  659. //EFrameType.publish, msgTitle, msgData
  660. let frame = ApiMessage.package(
  661. [EFrameType.publish],
  662. vit.stringToBytes(msgTitle),
  663. msgData);
  664. sendFrame(frame);
  665. };
  666. this.message_Subscribe = function (msgTitle) {
  667. //EFrameType.subscribe, msgTitle
  668. let frame = ApiMessage.package(
  669. [EFrameType.subscribe],
  670. vit.stringToBytes(msgTitle)
  671. );
  672. sendFrame(frame);
  673. };
  674. this.message_UnSubscribe = function (msgTitle) {
  675. //EFrameType.unSubscribe, msgTitle
  676. let frame = ApiMessage.package(
  677. [EFrameType.unSubscribe],
  678. vit.stringToBytes(msgTitle)
  679. );
  680. sendFrame(frame);
  681. };
  682. };
  683. //SubscriberManage
  684. sers.SubscriberManage = function (messageClient) {
  685. this.createSubscribe = (msgTitle, onGetMessage) => {
  686. return new sers.MessageSubscriber(this, msgTitle, onGetMessage);
  687. };
  688. //消息订阅者 msgTitle -> Subscriber[]
  689. let subscriberMap = {};
  690. // subscriber:MessageSubscriber
  691. this.message_Subscribe = function (subscriber) {
  692. let subscriberList = subscriberMap[subscriber.msgTitle];
  693. if (!subscriberList) {
  694. subscriberList = subscriberMap[subscriber.msgTitle] = [];
  695. messageClient.message_Subscribe(subscriber.msgTitle);
  696. }
  697. subscriberList.push(subscriber);
  698. };
  699. this.message_UnSubscribe = function (subscriber) {
  700. let subscriberList = subscriberMap[subscriber.msgTitle];
  701. if (!subscriberList) {
  702. return false;
  703. }
  704. subscriberList = subscriberList.filter(m => m != subscriber);
  705. if (subscriberList.length == 0) {
  706. delete subscriberMap[subscriber.msgTitle];
  707. messageClient.message_UnSubscribe(subscriber.msgTitle);
  708. }
  709. };
  710. this.message_Publish = function (msgTitle, msgData) {
  711. messageClient.message_Publish(msgTitle, msgData);
  712. };
  713. messageClient.message_Consumer = (msgTitle, msgData) => {
  714. let subscriberList = subscriberMap[msgTitle];
  715. if (!subscriberList || !subscriberList.length) return;
  716. for (let subscriber of subscriberList) {
  717. try {
  718. if (!subscriber || !subscriber.onGetMessage) continue;
  719. subscriber.onGetMessage(msgData);
  720. } catch (ex) {
  721. logger.error(ex);
  722. }
  723. }
  724. };
  725. };
  726. //MessageSubscriber
  727. sers.MessageSubscriber = function (subscriberManage, msgTitle, onGetMessage) {
  728. this.msgTitle = msgTitle;
  729. // bytes=>void
  730. this.onGetMessage = onGetMessage;
  731. this.subscribe = function () {
  732. subscriberManage.message_Subscribe(this);
  733. return this;
  734. };
  735. this.unSubscribe = function () {
  736. subscriberManage.message_UnSubscribe(this);
  737. return this;
  738. };
  739. };
  740. //LocalApiService
  741. sers.LocalApiService = function () {
  742. var self = this;
  743. // route_httpMethod -> ApiNode
  744. // ApiNode: { apiDesc,onInvoke,onInvokeAsync } //onInvoke 和 onInvokeAsync 指定其一即可
  745. // onInvoke: (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; } //onInvoke 和 onInvokeAsync 指定其一即可
  746. // onInvokeAsync: (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
  747. // onInvokeFinish :(replyData_bytes)=>{ }
  748. var apiNodeMap = {};
  749. //return [ ApiNode ];
  750. //ApiNode {apiDesc:apiDesc }
  751. self.getApiNodes = function () {
  752. var apiNodes = [];
  753. for (var key in apiNodeMap) {
  754. apiNodes.push({ apiDesc: apiNodeMap[key].apiDesc });
  755. }
  756. return apiNodes;
  757. };
  758. //清空已加载的apiNode
  759. self.clearApiNodes = function () {
  760. apiNodeMap = {};
  761. };
  762. // ApiNode: { apiDesc,onInvoke,onInvokeAsync } //onInvoke 和 onInvokeAsync 指定其一即可
  763. // onInvoke: (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; } //onInvoke 和 onInvokeAsync 指定其一即可
  764. // onInvokeAsync: (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
  765. // onInvokeFinish :(replyData_bytes)=>{ }
  766. self.addApiNode = function (apiNode) {
  767. var apiKey = apiNode.apiDesc.route + '_' + apiNode.apiDesc.extendConfig.httpMethod;
  768. apiNodeMap[apiKey] = apiNode;
  769. };
  770. // apiInvoke {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
  771. // onInvoke: (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; } //onInvoke 和 onInvokeAsync 指定其一即可
  772. // onInvokeAsync: (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
  773. // onInvokeFinish :(replyData_bytes)=>{ }
  774. self.addApiInvoke = function (apiInvoke) {
  775. var apiDesc = {
  776. route: apiInvoke.route,
  777. name: apiInvoke.name,
  778. description: apiInvoke.description,
  779. extendConfig: {
  780. httpMethod: apiInvoke.httpMethod
  781. }
  782. };
  783. self.addApiNode({ apiDesc: apiDesc, onInvoke: apiInvoke.onInvoke, onInvokeAsync: apiInvoke.onInvokeAsync });
  784. };
  785. // apiInvoke {route: '/JsStation/api', httpMethod: 'GET', name: 'call api in js server', description: 'js作为服务站点', onInvoke,onInvokeAsync}
  786. // onInvoke: (requestData_bytes,rpcData_object,replyRpcData_object)=>{ return replyData_bytes; } //onInvoke 和 onInvokeAsync 指定其一即可
  787. // onInvokeAsync: (requestData_bytes,rpcData_object,replyRpcData_object,onInvokeFinish)=>{ }
  788. // onInvokeFinish :(replyData_bytes)=>{ }
  789. self.addApiInvokeArray = function (apiInvokeArray) {
  790. for (var apiInvoke of apiInvokeArray) {
  791. self.addApiInvoke(apiInvoke);
  792. }
  793. };
  794. //(Error e,requestData_bytes,rpcData_object,replyRpcData_object)
  795. //localApiService.onError = (e,requestData_bytes,rpcData_object,replyRpcData_object)=>{ return {success:false}; }
  796. self.onError = function (e, requestData_bytes, rpcData_object, replyRpcData_object) {
  797. logger.error(e);
  798. var reply = {
  799. success: false,
  800. error: {
  801. errorMessage: e.message,
  802. errorDetail: { name: e.name, stack: e.stack }
  803. }
  804. };
  805. return reply;
  806. };
  807. //invoke local api
  808. //callback: (apiReplyMessage_bytes)=>{ }
  809. self.invokeApiAsync = (apiRequestMessage_bytes, callback) => {
  810. //(x.1) 解析请求数据
  811. var apiMessage = new ApiMessage();
  812. apiMessage.unpackage(apiRequestMessage_bytes);
  813. var rpcData_object = apiMessage.getRpcData();
  814. var requestData_bytes = apiMessage.getValueBytes();
  815. //(x.2)解析路由获得 处理函数
  816. var route = rpcData_object.route;
  817. var httpMethod = rpcData_object.http.method;
  818. var apiKey = route + '_' + httpMethod;
  819. var apiNode = apiNodeMap[apiKey];
  820. //(x.3)进行处理获得结果数据
  821. var replyRpcData_object = {}, replyData_bytes;
  822. var onInvokeFinish = (replyData_bytes) => {
  823. //返回结果数据
  824. var apiReplyMessage_bytes = ApiMessage.package(
  825. vit.objectSerializeToBytes(replyRpcData_object),
  826. replyData_bytes
  827. );
  828. callback(apiReplyMessage_bytes);
  829. };
  830. if (apiNode) {
  831. try {
  832. if (apiNode.onInvoke) {
  833. replyData_bytes = apiNode.onInvoke(requestData_bytes, rpcData_object, replyRpcData_object);
  834. } else if (apiNode.onInvokeAsync) {
  835. apiNode.onInvokeAsync(requestData_bytes, rpcData_object, replyRpcData_object, onInvokeFinish);
  836. return;
  837. }
  838. } catch (e) {
  839. var reply = self.onError(e, requestData_bytes, rpcData_object, replyRpcData_object);
  840. replyData_bytes = vit.objectSerializeToBytes(reply);
  841. }
  842. } else {
  843. var reply = {
  844. success: false,
  845. error: {
  846. errorCode: 404,
  847. errorMessage: "Api Not Found",
  848. errorDetail: { source: 'from JsStation' }
  849. }
  850. };
  851. replyData_bytes = vit.objectSerializeToBytes(reply);
  852. }
  853. onInvokeFinish(replyData_bytes);
  854. };
  855. };
  856. //ServiceStation
  857. // localApiService org apiClient serviceStationInfo
  858. sers.ServiceStation = function () {
  859. var self = this;
  860. //(x.1) localApiService
  861. (function () {
  862. self.localApiService = new sers.LocalApiService();
  863. })();
  864. //(x.2) OrganizeClient self.org
  865. (function () {
  866. self.org = new sers.CL.OrganizeClient("ws://127.0.0.1:4503");
  867. //self.org.event_onDisconnected = function () {
  868. // logger.info('[sers.CL]org.event_onDisconnected');
  869. //};
  870. self.org.event_onGetRequest = self.localApiService.invokeApiAsync;
  871. })();
  872. //(x.3) apiClient
  873. (function () {
  874. self.apiClient = new sers.ApiClient(self.org);
  875. })();
  876. //(x.4) subscriberManage
  877. (function () {
  878. let messageClient = new sers.MessageClient(self.org);
  879. self.subscriberManage = new sers.SubscriberManage(messageClient);
  880. self.org.event_onGetMessage = messageClient.onGetMessage;
  881. })();
  882. //(x.5)
  883. self.stop = function () {
  884. logger.info('[sers.ServiceStation] try stop...');
  885. self.org.stop();
  886. logger.info('[sers.ServiceStation] stoped.');
  887. };
  888. //(x.6)
  889. self.serviceStationInfo = {
  890. serviceStationName: 'JsStation', serviceStationKey: '', stationVersion: '', info: {}
  891. };
  892. //(x.7)
  893. var deviceInfo = { deviceKey: ('' + Math.random()).substr(2) };
  894. //(x.8)
  895. //callback: function(success){}
  896. self.start = function (callback) {
  897. logger.info('[sers.CL] try connect...');
  898. self.org.connect(function (success) {
  899. if (!success) {
  900. logger.info('[sers.CL] org cannot connect to server!');
  901. if (callback) callback(false);
  902. return;
  903. }
  904. //向服务中心注册localApiService
  905. logger.info('[ServiceStation] regist serviceStation to ServiceCenter...');
  906. var apiNodes = self.localApiService.getApiNodes();
  907. var serviceStationData = {
  908. serviceStationInfo: self.serviceStationInfo,
  909. deviceInfo: deviceInfo,
  910. apiNodes: apiNodes
  911. };
  912. //(string route, object arg, string httpMethod, function callback)
  913. // callback: function({success,replyData_bytes,replyRpcData_object})
  914. self.apiClient.callApiAsync("/_sys_/serviceStation/regist", serviceStationData, 'POST', function (args) {
  915. let success = args.success, replyData_bytes = args.replyData_bytes, replyRpcData_object = args.replyRpcData_object;
  916. if (!success) {
  917. logger.info("[ServiceStation] regist - failed");
  918. if (callback) callback(false);
  919. return;
  920. }
  921. var apiRet = vit.bytesToObject(replyData_bytes);
  922. if (!apiRet.success) {
  923. logger.info("[ServiceStation] regist - failed. reply:" + vit.bytesToString(replyData_bytes));
  924. if (callback) callback(false);
  925. return;
  926. }
  927. logger.info("[ServiceStation] regist - succeed");
  928. if (callback) callback(true);
  929. });
  930. });
  931. };
  932. }
  933. })(sers);