sers.ServiceStation.js 30 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966
  1. /*
  2. * sers.ServiceStation.js 扩展
  3. * Date : 2020-07-22
  4. * Version: 2.1.1.372
  5. * author : Lith
  6. * email : serset@yeah.net
  7. */
  8. ; var sers = { version: '2.1.1.372' };
  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. //function(message){}
  171. logger.onmessage;
  172. logger.error = function (e, message) {
  173. console.log(e);
  174. var msgOut = new Date().pattern("[mm:ss.S]") + '[error]' + message;
  175. console.log(msgOut);
  176. try {
  177. if (logger.onmessage) logger.onmessage(msgOut);
  178. } catch (e) {
  179. }
  180. };
  181. logger.info = function (message) {
  182. var msgBody = new Date().pattern("[mm:ss.S]") + '[info]' + message;
  183. console.log(msgBody);
  184. try {
  185. if (logger.onmessage) logger.onmessage(msgBody);
  186. } catch (e) {
  187. }
  188. };
  189. })(vit.logger = {});
  190. })('undefined' === typeof (vit) ? vit = {} : vit);
  191. /*
  192. * sers.CL.js 扩展
  193. * author : Lith
  194. * email : serset@yeah.net
  195. */
  196. ; (function (CL) {
  197. var logger = vit.logger;
  198. function PipeFrame() {
  199. this.write = function (arrayBuffer) {
  200. queueBuff.push(new Uint8Array(arrayBuffer));
  201. buffLen += arrayBuffer.byteLength;
  202. };
  203. //DataView list
  204. var queueBuff = [];
  205. var buffLen = 0;
  206. var QueueBuff_dataLenOfRemoved = 0;
  207. //return bytes
  208. function read(lenToPop) {
  209. if (buffLen < lenToPop) {
  210. return;
  211. }
  212. buffLen -= lenToPop;
  213. var dataToPop = [];
  214. var copyedIndex = 0;
  215. while (copyedIndex < lenToPop) {
  216. var leftCount = lenToPop - copyedIndex;
  217. var cur = queueBuff[0];
  218. if (QueueBuff_dataLenOfRemoved != 0) {
  219. cur = cur.subarray(QueueBuff_dataLenOfRemoved);
  220. }
  221. if (cur.length <= leftCount) {
  222. //dataToPop 数据长
  223. vit.arrayConcat(dataToPop, cur);
  224. copyedIndex += cur.length;
  225. QueueBuff_dataLenOfRemoved = 0;
  226. queueBuff.shift();
  227. }
  228. else {
  229. //queueBuff 数据长
  230. vit.arrayConcat(dataToPop, cur, leftCount);
  231. copyedIndex += leftCount;
  232. QueueBuff_dataLenOfRemoved += leftCount;
  233. }
  234. }
  235. return dataToPop;
  236. };
  237. var fileLen = -1;
  238. //return bytes
  239. this.readSersFile = function () {
  240. if (fileLen < 0) {
  241. var fileLen_bytes = read(4);
  242. if (!fileLen_bytes) {
  243. return null;
  244. }
  245. fileLen = vit.bytesGetInt32(fileLen_bytes, 0);
  246. }
  247. if (buffLen < fileLen) return null;
  248. var data = read(fileLen);
  249. fileLen = -1;
  250. return data;
  251. };
  252. };
  253. CL.DeliveryClient = function () {
  254. var self = this;
  255. self.host = "ws://127.0.0.1:4503";
  256. //function (bytes) { }
  257. self.event_onGetFrame;
  258. // function () { }
  259. self.event_onDisconnected;
  260. self.sendFrame = function (bytes) {
  261. vit.bytesInsertInt32(bytes, 0, bytes.length);
  262. var dataView = vit.bytesToDataView(bytes);
  263. webSocket.send(dataView);
  264. };
  265. var pipe = new PipeFrame();
  266. var webSocket = null;
  267. //callback: function(isConnected){ }
  268. self.connect = function (callback) {
  269. webSocket = new WebSocket(self.host);
  270. webSocket.binaryType = "arraybuffer";
  271. webSocket.onerror = function (ev) {
  272. self.close();
  273. };
  274. webSocket.onclose = function () {
  275. self.close();
  276. };
  277. //成功被调用 或者超时被调用
  278. var isCalled = false;
  279. var onCall = function (isSuccess) {
  280. if (isCalled) return;
  281. isCalled = true;
  282. callback(isSuccess);
  283. };
  284. setTimeout(onCall, 10000);
  285. webSocket.onopen = function (event) {
  286. onCall(true);
  287. };
  288. webSocket.onmessage = function (event) {
  289. var arrayBuffer = event.data;
  290. pipe.write(arrayBuffer);
  291. //bytes
  292. var frame;
  293. while (frame = pipe.readSersFile()) {
  294. try {
  295. self.event_onGetFrame(frame);
  296. } catch (e) {
  297. logger.error(e);
  298. }
  299. }
  300. };
  301. };
  302. self.close = function () {
  303. if (!webSocket) return;
  304. //(x.1) close socket
  305. try {
  306. webSocket.close();
  307. webSocket = null;
  308. } catch (e) {
  309. logger.error(e);
  310. }
  311. logger.info('[sers.CL]DeliveryClient.event_onDisconnected');
  312. //(x.2) event_onDisconnected
  313. if (self.event_onDisconnected) {
  314. try {
  315. self.event_onDisconnected();
  316. } catch (e) {
  317. logger.error(e);
  318. }
  319. }
  320. };
  321. };
  322. function RequestAdaptor() {
  323. var EFrameType = { request: 1, reply: 2, message: 3 };
  324. var ERequestType = { app: 0, heartBeat: 1 };
  325. var organizeVersion = "Sers.Mq.Socket.v1";
  326. var self = this;
  327. // requestKey -> requestCallback
  328. var organizeToDelivery_RequestMap = {};
  329. var reqKeyIndex = 100;
  330. //事件,向外部delivery发送字节流时被调用
  331. //function (bytes) { }
  332. self.event_onSendFrame;
  333. //事件,delivery向Organize发送请求时被调用
  334. //function (requestData, callback) { }
  335. //callback: function(replyData){ }
  336. self.event_onGetRequest;
  337. //外部调用,当外部从delivery读取到数据时调用
  338. self.deliveryToOrganize_onGetMessageFrame = function (bytes) {
  339. //deliveryToOrganize_ProcessFrame
  340. var msgType = bytes[0];
  341. var msgData = bytes.slice(2);
  342. switch (msgType) {
  343. case EFrameType.reply:
  344. var t = unpackReqRepFrame(msgData);
  345. var reqKey = t.reqKey;
  346. var replyData = t.oriData;
  347. var reqCallback = organizeToDelivery_RequestMap[reqKey];
  348. if (reqCallback) {
  349. delete organizeToDelivery_RequestMap[reqKey];
  350. reqCallback(replyData);
  351. }
  352. break;
  353. case EFrameType.request:
  354. var t = unpackReqRepFrame(msgData);
  355. var reqKey_bytes = t.reqKey_bytes;
  356. var requestData = t.oriData;
  357. var requestType = bytes[1];
  358. deliveryToOrganize_onGetRequest(requestType, reqKey_bytes, requestData);
  359. break;
  360. case EFrameType.message:
  361. //TODO
  362. break;
  363. }
  364. };
  365. function deliveryToOrganize_onGetRequest(requestType, reqKey_bytes, requestData) {
  366. switch (requestType) {
  367. case ERequestType.app:
  368. self.event_onGetRequest(requestData, function (replyData) {
  369. deliveryToOrganize_sendReply(reqKey_bytes, replyData);
  370. });
  371. return;
  372. case ERequestType.heartBeat:
  373. var version = vit.bytesToString(requestData);
  374. if (version == organizeVersion) {
  375. // send reply
  376. deliveryToOrganize_sendReply(reqKey_bytes, requestData);
  377. }
  378. else {
  379. // send reply
  380. deliveryToOrganize_sendReply(reqKey_bytes, [0]);
  381. }
  382. return;
  383. }
  384. }
  385. function deliveryToOrganize_sendReply(reqKey_bytes, replyData) {
  386. var repFrame = packageReqRepFrame(reqKey_bytes, replyData);
  387. delivery_sendFrame(EFrameType.reply, 0, repFrame);
  388. }
  389. //callback: function(replyData,isSuccess){ }
  390. self.sendRequest = function (requestData, callback, requestType) {
  391. var reqKey = reqKeyIndex++;
  392. //成功被调用 或者超时被调用
  393. var isCalled = false;
  394. var onCall = function (replyData, isSuccess) {
  395. if (isCalled) return;
  396. isCalled = true;
  397. if (!isSuccess) {
  398. delete organizeToDelivery_RequestMap[reqKey];
  399. }
  400. if (callback)
  401. callback(replyData, isSuccess);
  402. };
  403. setTimeout(onCall, 10000);
  404. organizeToDelivery_RequestMap[reqKey] = function (replyData) { onCall(replyData, true); };
  405. var reqKey_bytes = vit.int32ToBytes(reqKey);
  406. reqKey_bytes.push(0, 0, 0, 0);
  407. var reqRepFrame = packageReqRepFrame(reqKey_bytes, requestData);
  408. delivery_sendFrame(EFrameType.request, requestType || ERequestType.app, reqRepFrame);
  409. };
  410. function delivery_sendFrame(msgType, requestType, bytes) {
  411. bytes.splice(0, 0, msgType, requestType);
  412. self.event_onSendFrame(bytes);
  413. }
  414. //reqKey_bytes 8字节
  415. //返回 reqRepFrame[bytes]
  416. function packageReqRepFrame(reqKey_bytes, oriData) {
  417. return vit.arrayConcat(reqKey_bytes, oriData);
  418. }
  419. // 返回对象 {reqKey:reqKey,reqKey_bytes:reqKey_bytes, oriData:oriData}
  420. function unpackReqRepFrame(reqRepFrame) {
  421. var reqKey = vit.bytesGetInt32(reqRepFrame, 0);
  422. return { reqKey: reqKey, reqKey_bytes: reqRepFrame.slice(0, 8), oriData: reqRepFrame.slice(8) };
  423. }
  424. }
  425. //websocketHost demo: "ws://127.0.0.1:4503"
  426. CL.OrganizeClient = function (websocketHost) {
  427. var self = this;
  428. var delivery = new CL.DeliveryClient();
  429. //连接秘钥,用以验证连接安全性。服务端和客户端必须一致
  430. self.secretKey = "SersCL";
  431. //设置websocket host 地址 demo: "ws://127.0.0.1:4503"
  432. self.setHost = function (websocketHost) {
  433. delivery.host = websocketHost;
  434. };
  435. self.setHost(websocketHost);
  436. var requestAdaptor = new RequestAdaptor();
  437. //<<<<<<<<<<<<<<<< 初始化requestAdaptor 和 delivery
  438. (function () {
  439. delivery.event_onGetFrame = function (bytes) {
  440. requestAdaptor.deliveryToOrganize_onGetMessageFrame(bytes);
  441. };
  442. requestAdaptor.event_onGetRequest = function (requestData, callback) {
  443. self.event_onGetRequest(requestData, callback);
  444. };
  445. requestAdaptor.event_onSendFrame = function (bytes) {
  446. delivery.sendFrame(bytes);
  447. };
  448. delivery.event_onDisconnected = function () {
  449. if (self.event_onDisconnected)
  450. self.event_onDisconnected.apply(self, arguments);
  451. };
  452. })();
  453. //>>>>>>>>>>>>>>>>>
  454. //function (event) { }
  455. self.event_onDisconnected = null;
  456. //function (requestData,callback) { }
  457. //callback function(replyData){}
  458. self.event_onGetRequest = null;
  459. //callback: function(replyData,isSuccess){ }
  460. self.sendRequest = function (requestData, callback) {
  461. requestAdaptor.sendRequest(requestData, callback);
  462. };
  463. //callback: function (isSuccess) { }
  464. self.connect = function (callback) {
  465. delivery.connect(function (isSuccess) {
  466. //(x.1)连接不成功
  467. if (!isSuccess)
  468. callback(false);
  469. //(x.2)进行权限校验
  470. //setTimeout(function () {
  471. self.sendRequest(vit.stringToBytes(self.secretKey), function (replyData, isSuccess) {
  472. //(x.x.1)请求不成功
  473. if (!isSuccess) {
  474. callback(false);
  475. return;
  476. }
  477. //(x.x.2)验证不成功
  478. if (vit.bytesToString(replyData) != 'true') {
  479. callback(false);
  480. return;
  481. }
  482. //(x.x.3)验证成功
  483. callback(true);
  484. });
  485. //}, 5000);
  486. });
  487. };
  488. self.stop = function () {
  489. delivery.close();
  490. };
  491. }
  492. })(sers.CL || (sers.CL = {}));
  493. /*
  494. * sers.ServiceStation.js 扩展
  495. * author : Lith
  496. * email : serset@yeah.net
  497. */
  498. ; (function (sers) {
  499. var logger = vit.logger;
  500. //ApiMessage
  501. function ApiMessage() {
  502. var self = this;
  503. //bytes
  504. var rpcContextData_OriData;
  505. //bytes
  506. var value_OriData;
  507. //return object
  508. self.getRpcData = function () {
  509. var strRpc = vit.bytesToString(rpcContextData_OriData);
  510. if (!strRpc) return {};
  511. return eval('(' + strRpc + ')');
  512. };
  513. //return bytes
  514. self.getValueBytes = function () {
  515. return value_OriData;
  516. };
  517. //return string
  518. self.getValueString = function () {
  519. var strValue = vit.bytesToString(value_OriData);
  520. return strValue;
  521. };
  522. //return object
  523. self.getValueObject = function () {
  524. return eval('(' + self.getValueString() + ')');
  525. };
  526. self.initAsApiRequestMessage = function (route, arg, httpMethod) {
  527. var rpcData = {
  528. "route": route,
  529. "caller": {
  530. "rid": vit.guid(),
  531. "callStack": [], // parentRequestGuid array
  532. "source": "Internal"
  533. },
  534. "http": {
  535. "method": httpMethod || "GET"
  536. }
  537. };
  538. rpcContextData_OriData = vit.objectSerializeToBytes(rpcData);
  539. value_OriData = vit.objectSerializeToBytes(arg);
  540. };
  541. self.package = function () {
  542. return ApiMessage.package(rpcContextData_OriData, value_OriData);
  543. };
  544. self.unpackage = function (oriData) {
  545. var files = ApiMessage.unpackage(oriData);
  546. rpcContextData_OriData = files[0];
  547. value_OriData = files[1];
  548. };
  549. };
  550. //(bytes files)
  551. //return bytes
  552. ApiMessage.package = function () {
  553. var files = arguments;
  554. var oriData = [];
  555. for (var t = 0; t < files.length; t++) {
  556. var file = files[t];
  557. vit.arrayConcat(oriData, vit.int32ToBytes(file.length));
  558. vit.arrayConcat(oriData, file);
  559. }
  560. return oriData;
  561. };
  562. //(bytes oriData)
  563. //return bytes fileArray
  564. ApiMessage.unpackage = function (oriData) {
  565. var files = [];
  566. var curIndex = 0;
  567. while (curIndex < oriData.length) {
  568. var fileLength = vit.bytesGetInt32(oriData, curIndex);
  569. var fileContent = oriData.slice(curIndex + 4, curIndex + 4 + fileLength);
  570. curIndex += 4 + fileLength;
  571. files.push(fileContent);
  572. }
  573. return files;
  574. };
  575. sers.ApiMessage = ApiMessage;
  576. //ApiClient
  577. sers.ApiClient = function (organizeClient) {
  578. //(string route, object arg, string httpMethod, function callback)
  579. //callback: function(isSuccess,replyData_bytes,replyRpcData_object)
  580. this.callApi = function (route, arg, httpMethod, callback) {
  581. var apiRequestMessage = new ApiMessage();
  582. apiRequestMessage.initAsApiRequestMessage(route, arg, httpMethod);
  583. organizeClient.sendRequest(apiRequestMessage.package(), function (replyData, isSuccess) {
  584. if (!callback) return;
  585. if (!isSuccess) {
  586. callback(false);
  587. } else {
  588. var apiMessage = new ApiMessage();
  589. apiMessage.unpackage(replyData);
  590. var rpcData = apiMessage.getRpcData();
  591. var value = apiMessage.getValueBytes();
  592. callback(true, value, rpcData);
  593. }
  594. });
  595. };
  596. };
  597. //LocalApiService
  598. sers.LocalApiService = function () {
  599. var self = this;
  600. // key route_httpMehtod
  601. // value { apiDesc:apiDesc,Invoke:onInvoke }
  602. // onInvoke: function(requestData_bytes,rpcData,reply_rpcData){}
  603. var apiNodeMap = {};
  604. //return [ apiNode, ];
  605. //apiNode {apiDesc:apiDesc }
  606. self.getApiNodes = function () {
  607. var apiNodes = [];
  608. for (var key in apiNodeMap) {
  609. apiNodes.push({ apiDesc: apiNodeMap[key].apiDesc });
  610. }
  611. return apiNodes;
  612. };
  613. //清空已加载的apiNode
  614. self.clearApiNodes = function () {
  615. apiNodeMap = {};
  616. };
  617. //Invoke: function(requestData_bytes,rpcData_object,reply_rpcData_object){}
  618. self.addApiNode = function (apiDesc, Invoke) {
  619. var apiKey = apiDesc.route + '_' + apiDesc.extendConfig.httpMethod;
  620. apiNodeMap[apiKey] = { apiDesc: apiDesc, Invoke: Invoke };
  621. };
  622. //(string route, string httpMethod, string description, Invoke Invoke)
  623. //Invoke: function(requestData_bytes,rpcData_object,reply_rpcData_object){}
  624. self.addSimpleApiNode = function (route, httpMethod, description, Invoke) {
  625. var apiDesc = {
  626. route: route,
  627. name: description,
  628. description: description,
  629. extendConfig: {
  630. httpMethod: httpMethod
  631. }
  632. };
  633. self.addApiNode(apiDesc, Invoke);
  634. };
  635. //apiRequestMessage bytes
  636. //return apiReplyMessage bytes
  637. self.callApi = function (apiRequestMessage) {
  638. //(x.1) 解析请求数据
  639. var apiMessage = new ApiMessage();
  640. apiMessage.unpackage(apiRequestMessage);
  641. var rpcData = apiMessage.getRpcData();
  642. var requestData_bytes = apiMessage.getValueBytes();
  643. //(x.2)解析路由获得 处理函数
  644. var route = rpcData.route;
  645. var httpMethod = rpcData.http.method;
  646. var apiKey = route + '_' + httpMethod;
  647. var apiNode = apiNodeMap[apiKey];
  648. //(x.3)进行处理获得结果数据
  649. var replyRpcDta = {}, replyData;
  650. if (apiNode && apiNode.Invoke) {
  651. try {
  652. replyData = apiNode.Invoke(requestData_bytes, rpcData, replyRpcDta);
  653. } catch (e) {
  654. logger.error(e);
  655. var reply = {
  656. "success": false,
  657. "error": {
  658. "errorMessage": e.message,
  659. "errorDetail": { source: 'from JsStation' }
  660. }
  661. };
  662. replyData = vit.objectSerializeToBytes(reply);
  663. }
  664. } else {
  665. var reply = {
  666. "success": false,
  667. "error": {
  668. "errorCode": 404,
  669. "errorMessage": "接口不存在",
  670. "errorDetail": { source: 'from JsStation' }
  671. }
  672. };
  673. replyData = vit.objectSerializeToBytes(reply);
  674. }
  675. //(x.4)返回结果数据
  676. var apiReplyMessage_bytes = ApiMessage.package(
  677. vit.objectSerializeToBytes(replyRpcDta),
  678. replyData
  679. );
  680. return apiReplyMessage_bytes;
  681. };
  682. };
  683. //ServiceStation
  684. sers.ServiceStation = function () {
  685. var self = this;
  686. //(x.1) LocalApiService
  687. (function () {
  688. self.localApiService = new sers.LocalApiService();
  689. })();
  690. //(x.2) OrganizeClient self.org
  691. (function () {
  692. self.org = new sers.CL.OrganizeClient("ws://127.0.0.1:4503");
  693. //self.org.event_onDisconnected = function () {
  694. // logger.info('[sers.CL]org.event_onDisconnected');
  695. //};
  696. self.org.event_onGetRequest = function (requestData, callback) {
  697. var reply_bytes = self.localApiService.callApi(requestData);
  698. callback(reply_bytes);
  699. };
  700. })();
  701. //(x.3) ApiClient
  702. (function () {
  703. self.apiClient = new sers.ApiClient(self.org);
  704. })();
  705. self.stop = function () {
  706. logger.info('[sers.ServiceStation]try stop...');
  707. self.org.stop();
  708. logger.info('[sers.ServiceStation] stoped.');
  709. };
  710. //callback: function(isSuccess){}
  711. self.start = function (callback) {
  712. logger.info('[sers.CL]try connect...');
  713. self.org.connect(function (isSuccess) {
  714. if (!isSuccess) {
  715. logger.info('[sers.CL]org cannot connect to server!');
  716. if (callback) callback(false);
  717. return;
  718. }
  719. //向服务中心注册localApiService
  720. logger.info('[ServiceStation] regist serviceStation to ServiceCenter...');
  721. var serviceStationInfo = {
  722. serviceStationName: 'JsStation', serviceStationKey: '', stationVersion: '', info: {}
  723. };
  724. var deviceInfo = { deviceKey: '' + Math.random() };
  725. var apiNodes = self.localApiService.getApiNodes();
  726. var serviceStationData =
  727. {
  728. serviceStationInfo: serviceStationInfo,
  729. deviceInfo: deviceInfo,
  730. apiNodes: apiNodes
  731. };
  732. //(string route, object arg, string httpMethod, function callback)
  733. //callback: function(isSuccess,replyData_bytes,replyRpcData_object)
  734. self.apiClient.callApi("/_sys_/serviceStation/regist", serviceStationData, 'POST', function (isSuccess, replyData_bytes, replyRpcData_object) {
  735. if (!isSuccess) {
  736. logger.info("[ServiceStation] regist - failed");
  737. if (callback) callback(false);
  738. return;
  739. }
  740. var apiRet = vit.bytesToObject(replyData_bytes);
  741. if (!apiRet.success) {
  742. logger.info("[ServiceStation] regist - failed. reply:" + vit.bytesToString(replyData));
  743. if (callback) callback(false);
  744. }
  745. logger.info("[ServiceStation] regist - succeed");
  746. if (callback) callback(true);
  747. });
  748. });
  749. };
  750. }
  751. })(sers);