sers.ServiceStation.js 30 KB

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