ChatApi.ts 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. import {Interfaces} from "./Interfaces"
  2. import * as HTTP from "http";
  3. import url = require("url");
  4. export namespace ChatApi {
  5. export class ApiServer implements Interfaces.ServerInterface {
  6. private clientsManager: Interfaces.ClientsManagerInterface;
  7. private conversationsManager: Interfaces.ConversationsManagerInterface;
  8. private logger: Interfaces.LoggerInterface;
  9. private routes: RoutesCollection = {};
  10. constructor(clientsManager: Interfaces.ClientsManagerInterface, conversationsManager: Interfaces.ConversationsManagerInterface, logger: Interfaces.LoggerInterface, routes: RoutesCollection) {
  11. this.clientsManager = clientsManager;
  12. this.conversationsManager = conversationsManager;
  13. this.logger = logger;
  14. this.routes = routes;
  15. this.logger.debug(`Starting API server`);
  16. }
  17. processRequest(request: HTTP.IncomingMessage, response: HTTP.ServerResponse) {
  18. let path = url.parse(request.url).pathname;
  19. if (this.routes.hasOwnProperty(path)) {
  20. this.logger.debug(`Processing action "${path}"`);
  21. let action = this.routes[path];
  22. action.call(this, request, response);
  23. } else {
  24. this.logger.debug(`Action "${path}" not found`);
  25. response.writeHead(404);
  26. response.end(`Action "${path}" not found`);
  27. }
  28. }
  29. refreshUsers(request: HTTP.IncomingMessage, response: HTTP.ServerResponse) {
  30. let content = '';
  31. request.on('data', (chunk) => {
  32. content += chunk;
  33. }).on('end', () => {
  34. try {
  35. let data = JSON.parse(content);
  36. this.clientsManager.get(data.id, true).then((client: Interfaces.ClientInterface) => {
  37. response.end('Ok');
  38. }).catch((err: Error) => {
  39. this.logger.error(err.message);
  40. this.logger.error(err.stack);
  41. response.writeHead(500, {'Content-type': 'text/plain'});
  42. response.end(err.message + err.stack);
  43. });
  44. } catch (err) {
  45. this.logger.error(err.message);
  46. this.logger.error(err.stack);
  47. this.logger.error('DATA: '+content);
  48. response.writeHead(500, {'Content-type': 'text/plain'});
  49. response.end(err.message + "\n" + err.stack + "\nData: "+ content);
  50. }
  51. });
  52. }
  53. }
  54. export interface RoutesCollection {
  55. [path: string]: (request: HTTP.IncomingMessage, response: HTTP.ServerResponse) => void
  56. }
  57. }