sers.ServiceStation.js 29 KB

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