api.js 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. 'use strict';
  2. const fs = require('fs');
  3. const http = require('http');
  4. const path = require('path');
  5. const _ = require('lodash');
  6. const storage = require('./storage');
  7. const socketIo = require('socket.io');
  8. const eLogger = require('./eLogger').get();
  9. // const {app} = require('electron');
  10. const apis = {};
  11. exports.setup = async function () {
  12. eLogger.info('[api] [setup] start');
  13. setApi();
  14. // use api server
  15. let port = await storage.setIpcDynamicPort();
  16. eLogger.info('[api] [setup] dynamic ipc port:', port);
  17. const listen = 'localhost';
  18. port = port ? port : 7069;
  19. const server = http.createServer(function(req, res) {
  20. eLogger.info('[api] [setup] command received', { method: req.method, url: req.url });
  21. if ((req.method === 'POST' && req.url === '/send')) {
  22. let body = '';
  23. req.setEncoding('utf8');
  24. req
  25. .on('data', function(data) {
  26. body += data;
  27. })
  28. .on('end', function() {
  29. let message;
  30. try {
  31. message = JSON.parse(body);
  32. } catch (e) {
  33. res.statusCode = 400;
  34. return res.end('request body parse failure.');
  35. }
  36. if (!apis[message.cmd]) {
  37. eLogger.info('[api] [setup] invalid command called:', message.cmd);
  38. res.statusCode = 404;
  39. return res.end('NG');
  40. }
  41. eLogger.info('[api] [setup] command received message:', message);
  42. const data = apis[message.cmd](...message.params);
  43. res.statusCode = 200;
  44. const result = {
  45. err: null,
  46. data: data,
  47. };
  48. res.end(JSON.stringify(result));
  49. });
  50. } else {
  51. res.statusCode = 404;
  52. res.end('NOT FOUND');
  53. }
  54. });
  55. // socket io
  56. const io = socketIo(server);
  57. io.on('connection', (socket) => {
  58. socket.on('ipc', (message, callback) => {
  59. eLogger.info('[api] [setup] socket id:' + socket.id + ' message cmd: ' + message.cmd);
  60. const data = apis[message.cmd](...message.params);
  61. if (data && typeof data.then === 'function') { // 判断是否是异步
  62. data.then((data) => {
  63. const result = {
  64. err: null,
  65. data: data,
  66. };
  67. callback(result)
  68. });
  69. } else {
  70. const result = {
  71. err: null,
  72. data: data,
  73. };
  74. callback(result);
  75. }
  76. });
  77. });
  78. server.listen(port, listen, function() {
  79. eLogger.info('[api] [setup] server is listening on', `${listen}:${port}`);
  80. });
  81. return true;
  82. };
  83. function setApi() {
  84. const apiDir = path.normalize(__dirname + '/../apis');
  85. fs.readdirSync(apiDir).forEach(function(filename) {
  86. if (path.extname(filename) === '.js' && filename !== 'index.js') {
  87. const name = path.basename(filename, '.js');
  88. const fileObj = require(`../apis/${filename}`);
  89. _.map(fileObj, function(fn, method) {
  90. let methodName = getApiName(name, method);
  91. apis[methodName] = fn;
  92. });
  93. }
  94. });
  95. };
  96. /**
  97. * get api method name
  98. * ex.) jsname='user' method='get' => 'user.get'
  99. * @param {String} jsname
  100. * @param {String} method
  101. */
  102. function getApiName (jsname, method) {
  103. return jsname + '.' + method;
  104. //return jsname + method.charAt(0).toUpperCase() + method.slice(1);
  105. }