consumer_1.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import { SearchService } from "../services/query.service"
  2. import _ = require("lodash")
  3. import { Subject, interval } from "rxjs";
  4. import { io } from "socket.io-client";
  5. import { Server } from "socket.io"
  6. /* ---------------------- COMPLEX OPERATION ------------------------------ */
  7. // Check Heap size
  8. // const v8 = require('v8');
  9. // const heapStats = v8.getHeapStatistics();
  10. // const maxHeapSize = heapStats.heap_size_limit / (1024 * 1024); // Convert to MB
  11. // console.log(`Current maximum heap size: ${maxHeapSize.toFixed(2)} MB`);
  12. // const used = process.memoryUsage().heapUsed / 1024 / 1024;
  13. // const total = process.memoryUsage().heapTotal / 1024 / 1024;
  14. // console.log(`Heap memory usage: ${used.toFixed(2)} MB`);
  15. // console.log(`Total heap size: ${total.toFixed(2)} MB`);
  16. function checkHeapSize(): any {
  17. let currentHeapSize = process.memoryUsage().heapUsed / 1024 / 1024;
  18. let allocatedHeapSize = 512;
  19. let percentage = (currentHeapSize / allocatedHeapSize) * 100;
  20. console.log(`Consumer_! Heap currentHeapSize: ${currentHeapSize.toFixed(2)} MB. Percentage: ${percentage} %`);
  21. return percentage
  22. }
  23. // Create new Subject to handle incoming data from remote subscription
  24. let payload: Subject<any> = new Subject()
  25. payload.subscribe((element) => {
  26. console.log(`Received message from server: ${element.appData.msgId}`);
  27. })
  28. // Create new Subject to monitor and broadcast heap size
  29. let trafficControl: Subject<any> = new Subject()
  30. let intervalChecking = interval(1000)
  31. intervalChecking.subscribe(() => {
  32. trafficControl.next(checkHeapSize())
  33. })
  34. // Create a WebSocket server
  35. function createWebsocketServer() {
  36. const io = new Server({})
  37. // Listen for connections to the WebSocket server
  38. io.on(`connection`, (socket) => {
  39. console.log(`Connected to client`);
  40. // Subscribe to the subject when a client connects
  41. const subscription = trafficControl.subscribe((element) => {
  42. // Stringify heap status and send data over to connected client
  43. socket.emit('trafficControl', element);
  44. });
  45. socket.on(`disconnect`, () => {
  46. console.log(`Client Disconnected`)
  47. subscription.unsubscribe()
  48. })
  49. })
  50. io.listen(8081);
  51. }
  52. // Create a new WebSocket client
  53. function connectWebSocket() {
  54. const socket = io('http://localhost:8080')
  55. // Listen for the WebSocket connection to open
  56. socket.on(`connect`, () => {
  57. console.log(`Connected to publisher`)
  58. // Listen for messages from the server
  59. socket.on('message', (message) => {
  60. trafficControl.next(message);
  61. });
  62. })
  63. socket.emit('subscribe', 'traffic-status')
  64. socket.on('payload', (data) => {
  65. data.forEach(element => {
  66. payload.next(element)
  67. });
  68. })
  69. // Listen for the disconnect event
  70. socket.on('disconnect', () => {
  71. console.log('Disconnected from server');
  72. // Attempt to reconnect every 3 seconds
  73. setTimeout(() => {
  74. console.log('Attempting to reconnect...');
  75. socket.connect();
  76. }, 1000);
  77. });
  78. // Listen for errors
  79. socket.on('error', (error) => {
  80. console.error('Socket error:', error);
  81. });
  82. }
  83. createWebsocketServer()
  84. connectWebSocket();