IPCTransport.js 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. const Debug = require("debug");
  4. const eventemitter2_1 = require("eventemitter2");
  5. const cluster = require("cluster");
  6. class IPCTransport extends eventemitter2_1.EventEmitter2 {
  7. constructor() {
  8. super(...arguments);
  9. this.initiated = false;
  10. this.logger = Debug('axm:transport:ipc');
  11. }
  12. init(config) {
  13. this.logger('Init new transport service');
  14. if (this.initiated === true) {
  15. console.error(`Trying to re-init the transport, please avoid`);
  16. return this;
  17. }
  18. this.initiated = true;
  19. this.logger('Agent launched');
  20. this.onMessage = (data) => {
  21. this.logger(`Received reverse message from IPC`);
  22. this.emit('data', data);
  23. };
  24. process.on('message', this.onMessage);
  25. if (cluster.isWorker === false) {
  26. this.autoExitHook();
  27. }
  28. return this;
  29. }
  30. autoExitHook() {
  31. this.autoExitHandle = setInterval(() => {
  32. let currentProcess = (cluster.isWorker) ? cluster.worker.process : process;
  33. if (currentProcess._getActiveHandles().length === 3) {
  34. let handlers = currentProcess._getActiveHandles().map(h => h.constructor.name);
  35. if (handlers.includes('Pipe') === true &&
  36. handlers.includes('Socket') === true) {
  37. process.removeListener('message', this.onMessage);
  38. let tmp = setTimeout(_ => {
  39. this.logger(`Still alive, listen back to IPC`);
  40. process.on('message', this.onMessage);
  41. }, 200);
  42. tmp.unref();
  43. }
  44. }
  45. }, 3000);
  46. this.autoExitHandle.unref();
  47. }
  48. setMetrics(metrics) {
  49. const serializedMetric = metrics.reduce((object, metric) => {
  50. if (typeof metric.name !== 'string')
  51. return object;
  52. object[metric.name] = {
  53. historic: metric.historic,
  54. unit: metric.unit,
  55. type: metric.id,
  56. value: metric.value
  57. };
  58. return object;
  59. }, {});
  60. this.send('axm:monitor', serializedMetric);
  61. }
  62. addAction(action) {
  63. this.logger(`Add action: ${action.name}:${action.type}`);
  64. this.send('axm:action', {
  65. action_name: action.name,
  66. action_type: action.type,
  67. arity: action.arity,
  68. opts: action.opts
  69. });
  70. }
  71. setOptions(options) {
  72. this.logger(`Set options: [${Object.keys(options).join(',')}]`);
  73. return this.send('axm:option:configuration', options);
  74. }
  75. send(channel, payload) {
  76. if (typeof process.send !== 'function')
  77. return -1;
  78. if (process.connected === false) {
  79. console.error('Process disconnected from parent! (not connected)');
  80. return process.exit(1);
  81. }
  82. try {
  83. process.send({ type: channel, data: payload });
  84. }
  85. catch (err) {
  86. this.logger('Process disconnected from parent !');
  87. this.logger(err);
  88. return process.exit(1);
  89. }
  90. }
  91. destroy() {
  92. if (this.onMessage !== undefined) {
  93. process.removeListener('message', this.onMessage);
  94. }
  95. if (this.autoExitHandle !== undefined) {
  96. clearInterval(this.autoExitHandle);
  97. }
  98. this.logger('destroy');
  99. }
  100. }
  101. exports.IPCTransport = IPCTransport;
  102. //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSVBDVHJhbnNwb3J0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL3RyYW5zcG9ydHMvSVBDVHJhbnNwb3J0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQ0EsK0JBQThCO0FBRzlCLGlEQUE2QztBQUM3QyxtQ0FBa0M7QUFFbEMsTUFBYSxZQUFhLFNBQVEsNkJBQWE7SUFBL0M7O1FBRVUsY0FBUyxHQUFZLEtBQUssQ0FBQTtRQUMxQixXQUFNLEdBQWEsS0FBSyxDQUFDLG1CQUFtQixDQUFDLENBQUE7SUF3R3ZELENBQUM7SUFwR0MsSUFBSSxDQUFFLE1BQXdCO1FBQzVCLElBQUksQ0FBQyxNQUFNLENBQUMsNEJBQTRCLENBQUMsQ0FBQTtRQUN6QyxJQUFJLElBQUksQ0FBQyxTQUFTLEtBQUssSUFBSSxFQUFFO1lBQzNCLE9BQU8sQ0FBQyxLQUFLLENBQUMsK0NBQStDLENBQUMsQ0FBQTtZQUM5RCxPQUFPLElBQUksQ0FBQTtTQUNaO1FBQ0QsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUE7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFBO1FBQzdCLElBQUksQ0FBQyxTQUFTLEdBQUcsQ0FBQyxJQUFhLEVBQUUsRUFBRTtZQUNqQyxJQUFJLENBQUMsTUFBTSxDQUFDLG1DQUFtQyxDQUFDLENBQUE7WUFDaEQsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsSUFBSSxDQUFDLENBQUE7UUFDekIsQ0FBQyxDQUFBO1FBQ0QsT0FBTyxDQUFDLEVBQUUsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFBO1FBSXJDLElBQUksT0FBTyxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7WUFDOUIsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFBO1NBQ3BCO1FBQ0QsT0FBTyxJQUFJLENBQUE7SUFDYixDQUFDO0lBRU8sWUFBWTtRQUdsQixJQUFJLENBQUMsY0FBYyxHQUFHLFdBQVcsQ0FBQyxHQUFHLEVBQUU7WUFDckMsSUFBSSxjQUFjLEdBQVEsQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUE7WUFFL0UsSUFBSSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUNuRCxJQUFJLFFBQVEsR0FBUSxjQUFjLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUVuRixJQUFJLFFBQVEsQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSTtvQkFDbEMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxRQUFRLENBQUMsS0FBSyxJQUFJLEVBQUU7b0JBQ3hDLE9BQU8sQ0FBQyxjQUFjLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDakQsSUFBSSxHQUFHLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO3dCQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGlDQUFpQyxDQUFDLENBQUE7d0JBQzlDLE9BQU8sQ0FBQyxFQUFFLENBQUMsU0FBUyxFQUFFLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtvQkFDdkMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFBO29CQUNQLEdBQUcsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtpQkFDWjthQUNGO1FBQ0gsQ0FBQyxFQUFFLElBQUksQ0FBQyxDQUFBO1FBRVIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQTtJQUM3QixDQUFDO0lBRUQsVUFBVSxDQUFFLE9BQXlCO1FBQ25DLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxNQUFzQixFQUFFLEVBQUU7WUFDekUsSUFBSSxPQUFPLE1BQU0sQ0FBQyxJQUFJLEtBQUssUUFBUTtnQkFBRSxPQUFPLE1BQU0sQ0FBQTtZQUNsRCxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHO2dCQUNwQixRQUFRLEVBQUUsTUFBTSxDQUFDLFFBQVE7Z0JBQ3pCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSTtnQkFDakIsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFO2dCQUNmLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSzthQUNwQixDQUFBO1lBQ0QsT0FBTyxNQUFNLENBQUE7UUFDZixDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUE7UUFDTixJQUFJLENBQUMsSUFBSSxDQUFDLGFBQWEsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFBO0lBQzVDLENBQUM7SUFFRCxTQUFTLENBQUUsTUFBYztRQUN2QixJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsTUFBTSxDQUFDLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUN4RCxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRTtZQUN0QixXQUFXLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDeEIsV0FBVyxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ3hCLEtBQUssRUFBRSxNQUFNLENBQUMsS0FBSztZQUNuQixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7U0FDbEIsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVELFVBQVUsQ0FBRSxPQUFPO1FBQ2pCLElBQUksQ0FBQyxNQUFNLENBQUMsaUJBQWlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQTtRQUMvRCxPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsMEJBQTBCLEVBQUUsT0FBTyxDQUFDLENBQUE7SUFDdkQsQ0FBQztJQUVELElBQUksQ0FBRSxPQUFPLEVBQUUsT0FBTztRQUNwQixJQUFJLE9BQU8sT0FBTyxDQUFDLElBQUksS0FBSyxVQUFVO1lBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQTtRQUNqRCxJQUFJLE9BQU8sQ0FBQyxTQUFTLEtBQUssS0FBSyxFQUFFO1lBQy9CLE9BQU8sQ0FBQyxLQUFLLENBQUMsbURBQW1ELENBQUMsQ0FBQTtZQUNsRSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUE7U0FDdkI7UUFFRCxJQUFJO1lBQ0YsT0FBTyxDQUFDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUE7U0FDL0M7UUFBQyxPQUFPLEdBQUcsRUFBRTtZQUNaLElBQUksQ0FBQyxNQUFNLENBQUMsb0NBQW9DLENBQUMsQ0FBQTtZQUNqRCxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1lBQ2hCLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQTtTQUN2QjtJQUNILENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxJQUFJLENBQUMsU0FBUyxLQUFLLFNBQVMsRUFBRTtZQUNoQyxPQUFPLENBQUMsY0FBYyxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7U0FDbEQ7UUFDRCxJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssU0FBUyxFQUFFO1lBQ3JDLGFBQWEsQ0FBQyxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUE7U0FDbkM7UUFDRCxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFBO0lBQ3hCLENBQUM7Q0FDRjtBQTNHRCxvQ0EyR0MifQ==