sers.ServiceStation.js 31 KB

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