Advertisement
Guest User

Untitled

a guest
Jun 25th, 2019
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.22 KB | None | 0 0
  1. import { ChildProcess, fork } from 'child_process';
  2. import config from '../config';
  3.  
  4. const { requestLimit } = config;
  5.  
  6. interface forkResponse {
  7. kill: boolean;
  8. string?: string;
  9. }
  10.  
  11. interface Params {
  12. req: {
  13. url: string;
  14. cookies: object;
  15. };
  16. res: object;
  17. }
  18.  
  19. class ForkBalancer {
  20. path: string;
  21. forks: number;
  22. maxRAM?: number;
  23. args?: Array<string>;
  24.  
  25. private activeFork: number;
  26. private resolvers = new Map();
  27. private renderers: Array<ChildProcess>;
  28.  
  29. constructor({ path = '', forks = 2, maxRAM = 250, args = [] }) {
  30. this.activeFork = 0;
  31. this.forks = forks;
  32. this.maxRAM = maxRAM;
  33. this.path = path;
  34. this.args = args;
  35. this.renderers = Array.from({ length: forks }, () => this.createFork());
  36. }
  37.  
  38. public getFromRenderer(params: Params): Promise<forkResponse> {
  39. const { resolvers, maxRAM, activeFork, restartFork, renderers } = this;
  40. const renderer = renderers[activeFork];
  41.  
  42. return new Promise(function(resolve, reject) {
  43. try {
  44. renderer.once('message', res => {
  45. resolvers.delete(params.req.url);
  46. resolve(res);
  47.  
  48. if (res.kill) restartFork();
  49. });
  50.  
  51. if (!resolvers.has(params.req.url)) {
  52. renderer.setMaxListeners(requestLimit);
  53. resolvers.set(params.req.url, resolve);
  54. renderer.send({ ...params, maxRAM });
  55. }
  56. } catch (error) {
  57. resolvers.delete(params.req.url);
  58. reject(error);
  59. }
  60. });
  61. }
  62.  
  63. private createFork = () => {
  64. const { path, args } = this;
  65. return fork(path, args);
  66. };
  67.  
  68. private restartFork = () => {
  69. const { activeFork, renderers, next, createFork } = this;
  70. const renderer = renderers[activeFork];
  71. next();
  72. renderer.kill();
  73. this.renderers[activeFork] = createFork();
  74. };
  75.  
  76. private next = () => {
  77. const { activeFork, forks } = this;
  78. if (activeFork === forks - 1) {
  79. this.activeFork = 0;
  80. } else {
  81. this.activeFork++;
  82. }
  83. };
  84. }
  85.  
  86. export default ForkBalancer;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement