masquitos

Untitled

Mar 13th, 2021 (edited)
546
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // app init
  2.  
  3. import { diContainer } from "./di/inversify.config";
  4. import { InversifyExpressServer } from "inversify-express-utils";
  5. import { environment } from "./environment/environment";
  6. import { appErrorHandlerMiddleWare, appMiddleWare } from "./api/app";
  7. import { ILogger } from "./service/logger/logger";
  8. import { TYPES } from "./di/di-types";
  9. import { SocketService } from "./service/socket/socket.service";
  10.  
  11. const logger = diContainer.get<ILogger>(TYPES.Logger);
  12. const socketService = diContainer.get<SocketService>(TYPES.SocketService);
  13.  
  14. // create server
  15. const server = new InversifyExpressServer(diContainer);
  16. server.setConfig(appMiddleWare);
  17. server.setErrorConfig(appErrorHandlerMiddleWare);
  18.  
  19. // @ts-ignore
  20. process.on("unhandledRejection", (reason: string, p: Promise<any>) => {
  21.   console.error(reason, "unhandledRejection");
  22.   throw reason;
  23. });
  24.  
  25. process.on("uncaughtException", (error: Error) => {
  26.   logger.error(error, "uncaughtException");
  27.   process.exit(1);
  28. });
  29.  
  30. export const app = server.build();
  31. // tslint:disable-next-line:no-var-requires
  32. const io = require("socket.io")(server);
  33. socketService.init(io);
  34. app.listen(environment.port, environment.host, () => {
  35.   logger.log(
  36.     "Node server started on:",
  37.     environment.http_type,
  38.     environment.host,
  39.     environment.port
  40.   );
  41. });
  42.  
  43. /// SocketService
  44.  
  45. import * as socketioJwt from "socketio-jwt";
  46. import { IMySocket, ISocketService } from "./socket.interface";
  47. import { inject, injectable } from "inversify";
  48. import { SocketEvents } from "./socket-events";
  49. import { ILogger } from "../logger/logger";
  50. import { TYPES } from "../../di/di-types";
  51. import { environment } from "../../environment/environment";
  52. import { Requester } from "../../shared/requester";
  53. import { InvalidTokenError } from "../../shared/errors/invalid-token.error";
  54. import { AuthenticationService } from "../auth/authentication.service";
  55.  
  56. @injectable()
  57. export class SocketService implements ISocketService {
  58.   constructor(
  59.     @inject(TYPES.Logger) private logger: ILogger,
  60.     @inject(TYPES.AuthenticationService)
  61.     private authenticationService: AuthenticationService
  62.   ) {}
  63.  
  64.   public init(io: any) {
  65.     this.logger.log("init socket");
  66.     const self = this;
  67.  
  68.     io.sockets
  69.       .on(
  70.         "connection",
  71.         socketioJwt.authorize({
  72.           secret: environment.jwtKey,
  73.         })
  74.       )
  75.       .on("authenticated", (socket: IMySocket) => {
  76.         self.logger.log("socket authenticated:");
  77.         for (const currSocket of Object.values(io.sockets.connected)) {
  78.           // чтобы выбрасывало этого же пользователя
  79.           const mySocket: IMySocket = currSocket as IMySocket;
  80.  
  81.           if (
  82.             mySocket.userId &&
  83.             mySocket.userId === mySocket.decoded_token.id
  84.           ) {
  85.             mySocket.emit(
  86.               SocketEvents.LOGOUT,
  87.               Requester.createError(new InvalidTokenError())
  88.             );
  89.  
  90.             mySocket.disconnect(true);
  91.           }
  92.         }
  93.         socket.userId = socket.decoded_token.id;
  94.         // Middleware проверка update при каждом запросе.
  95.  
  96.         socket.use(async (packet, next) => {
  97.           const isValid = await this.authenticationService.isValid(
  98.             socket.decoded_token
  99.           );
  100.           if (isValid) {
  101.             this.logger.log(packet[0]);
  102.             return next();
  103.           } else {
  104.             this.logger.warn(
  105.               "Socket",
  106.               socket.decoded_token.id + " " + socket.decoded_token.name
  107.             );
  108.             io.sockets.connected[socket.id].emit(
  109.               SocketEvents.LOGOUT,
  110.               Requester.createError(new InvalidTokenError())
  111.             );
  112.             next(new Error("socket Ошибка авторизации"));
  113.           }
  114.         });
  115.  
  116.         socket.on("error", (error) => {
  117.           console.error("error");
  118.         });
  119.  
  120.         // socket.on(
  121.         //   SocketEvents.MESSAGES,
  122.         //   async (conversationsMessages, callback) => {
  123.         //     try {
  124.         //       const userId = socket.decoded_token.id;
  125.         //       for (const convId of Object.keys(conversationsMessages)) {
  126.         //         const conversationId = parseInt(convId, 10);
  127.         //         const companion = await db_helper.getCompanion(
  128.         //           userId,
  129.         //           conversationId
  130.         //         );
  131.         //         const messages = conversationsMessages[conversationId];
  132.         //         await db_helper.saveMessages(conversationId, userId, messages);
  133.         //         const totalCount = await db_helper.getMessageTotalCount(
  134.         //           conversationId
  135.         //         );
  136.         //         // Отправляем сообщение назад, что мы его получили.
  137.         //         // Отправляем сообщения участнику чата
  138.         //         messages.forEach((msg) => {
  139.         //           msg.totalCount = totalCount;
  140.         //         });
  141.         //         self.sendData(
  142.         //           userId,
  143.         //           companion.user_id,
  144.         //           events.MESSAGES,
  145.         //           messages
  146.         //         );
  147.         //       }
  148.         //
  149.         //       callback(requester.createBody());
  150.         //     } catch (error) {
  151.         //       callback(requester.createError(error));
  152.         //       console.error("Не могу сохранить сообщения пользователя", error);
  153.         //     }
  154.         //   }
  155.         // );
  156.         //
  157.         // socket.on(events.SUPPORT_MESSAGES, async function (messages, callback) {
  158.         //   const user = socket.decoded_token;
  159.         //   const logId = LogContext.getContext(user.id);
  160.         //   const myLogger = new MyLogger(logId, self.constructor.name);
  161.         //   try {
  162.         //     // Проверка что пользователь пишите от себя
  163.         //     myLogger.debug("Try save support message from " + user.id);
  164.         //     const logic = new SaveSupportLogic(logId, user.id, user.role);
  165.         //     const convAndIsCreated = await logic.saveMessagesAndGetConv(
  166.         //       messages
  167.         //     );
  168.         //
  169.         //     if (convAndIsCreated.isCreated) {
  170.         //       self.sendData(
  171.         //         user.id,
  172.         //         convAndIsCreated.supportId,
  173.         //         helpDeskEvents.CONVERSATION,
  174.         //         {
  175.         //           conversation: convAndIsCreated.conversation,
  176.         //           messages: convAndIsCreated.resultMessages,
  177.         //         }
  178.         //       );
  179.         //     } else {
  180.         //       self.sendData(
  181.         //         user.id,
  182.         //         convAndIsCreated.supportId,
  183.         //         helpDeskEvents.MESSAGES,
  184.         //         convAndIsCreated.resultMessages
  185.         //       );
  186.         //     }
  187.         //     // Отправляем сообщение назад, что мы его получили.
  188.         //     callback(requester.createBody(convAndIsCreated.resultMessages));
  189.         //     // Отправляем сообщение пользователю support
  190.         //
  191.         //     // Проверку до отправки?
  192.         //     if (!self.getUserSocket(convAndIsCreated.supportId)) {
  193.         //       for (const message of convAndIsCreated.resultMessages) {
  194.         //         telegramSender.sendSupportNotify(user.id, message.text);
  195.         //       }
  196.         //     }
  197.         //   } catch (error) {
  198.         //     callback(requester.createError(error));
  199.         //     myLogger.myErrorLogger(error);
  200.         //   }
  201.         // });
  202.         //
  203.         // socket.on(
  204.         //   helpDeskEvents.MESSAGES,
  205.         //   async function (dataMessages, callback) {
  206.         //     const user = socket.decoded_token;
  207.         //     const logId = LogContext.getContext(user.id);
  208.         //     const myLogger = new MyLogger(logId, self.constructor.name);
  209.         //     try {
  210.         //       const logic = new HelpDeskMessagesSaveLogic(
  211.         //         logId,
  212.         //         user.id,
  213.         //         myRoles.SERVICE_SUPPORT
  214.         //       );
  215.         //       for (const convId of Object.keys(dataMessages)) {
  216.         //         const messages = dataMessages[convId];
  217.         //         myLogger.debug("try save support message: " + convId);
  218.         //         await logic.saveMessages(convId, messages);
  219.         //         callback(requester.createBody(messages));
  220.         //         const compId = await logic.getCompanion(convId);
  221.         //         if (self.getUserSocket(compId)) {
  222.         //           self.sendData(
  223.         //             user.id,
  224.         //             compId,
  225.         //             events.SUPPORT_MESSAGES,
  226.         //             messages
  227.         //           );
  228.         //         } else {
  229.         //           mailWorker.sendNotifyMessage(user.id, compId, messages);
  230.         //         }
  231.         //
  232.         //         myLogger.debug("message saved: " + convId);
  233.         //       }
  234.         //     } catch (error) {
  235.         //       callback(requester.createError(error));
  236.         //       myLogger.myErrorLogger(error);
  237.         //     }
  238.         //   }
  239.         // );
  240.  
  241.         // Removing the socket on disconnect
  242.         socket.on("disconnect", () => {
  243.           this.logger.log(null, "disconnect: " + socket.decoded_token.id);
  244.         });
  245.       });
  246.   }
  247.  
  248.   public getUserSocket(userId: number, {}: {} = {}): object {
  249.     return {};
  250.   }
  251.  
  252.   public sendData(
  253.     fromId: number | null,
  254.     toId: number,
  255.     event: SocketEvents,
  256.     data: any
  257.   ): void {
  258.     return;
  259.   }
  260. }
  261.  
Add Comment
Please, Sign In to add comment