connector.manager.ts 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { v4 as uuidv4 } from 'uuid'
  2. import dotenv from 'dotenv';
  3. import { TransportEvent, ConnectionManager as ConnectionManagerInterface, AdapterSet, Transport, TransportService, ClientObject } from "../interface/connector.interface"
  4. import { TransmitterConnectionAdapter } from './connector.transmitter'
  5. import { ReceiverConnectionAdapter } from './connector.receiver'
  6. import { EventMessage } from '../interface/transport.interface'
  7. import { Subject } from 'rxjs'
  8. import { WebsocketTransportService } from '../transport/websocket'
  9. import { RequestResponseConnectionAdapter } from './connector.request.response'
  10. import { HttpTransportService } from '../transport/http'
  11. /* now, this connection manager, after setting up the servers, will also need to start assigning receivers so to speak.
  12. From Provider's perspective: When instantiating a new server, there will be no doubt multiple clients connecting in. So that means, the connector instances that will be used from
  13. the transmission side, must already be configured and locked to their respective target so to speak. So for one client, there would only be one transmitter and receiver connector instances
  14. as well as request response. Let's go along with this line for now. */
  15. export class ConnectionManager implements ConnectionManagerInterface {
  16. transportService!: TransportService;
  17. transportEvent: Subject<TransportEvent> = new Subject() // Every event goes through this boy, and it will be expose across differnet components
  18. adapterSet: AdapterSet[] = []
  19. constructor() {
  20. console.log(`Connection Manager: Contructing ConnectionManager....`)
  21. // logic here
  22. this.getTransportService(process.env.Transport as unknown as Transport)
  23. this.setUpServer(process.env.PORT as unknown as number)
  24. // Everything that happens will go through here. Can also plug in logging service here at a later time
  25. this.transportEvent.subscribe((event: TransportEvent) => {
  26. console.log(`TranpsortEvent: `, event)
  27. if (event.event == 'New Client') {
  28. this.handleNewClient((event.data as EventMessage).payload) // payload is connectedclientInstance
  29. }
  30. })
  31. }
  32. getAdapterSetById(adapterSetid: string): AdapterSet {
  33. let adapterSet: AdapterSet | undefined = this.adapterSet.find(obj => obj.id === adapterSetid)
  34. if (adapterSet) {
  35. return adapterSet
  36. } else {
  37. throw new Error(`Adapter Set not found!!!`)
  38. }
  39. }
  40. getTransportService(transportType: Transport): void {
  41. console.log(`Instantiating ${transportType} tranport service to be used.`)
  42. if (transportType === Transport.Websocket) {
  43. this.transportService = new WebsocketTransportService()
  44. this.triggerTransportEvent(`Setting up Websocket Transport Service`)
  45. }
  46. if (transportType === Transport.Http) {
  47. this.transportService = new HttpTransportService()
  48. this.triggerTransportEvent(`Setting up Http Transport Service`)
  49. }
  50. }
  51. private triggerTransportEvent(message: string): void {
  52. this.transportEvent.next({
  53. id: uuidv4(),
  54. event: `New Transport`,
  55. data: { message }
  56. });
  57. }
  58. // Server to be set up as well as acquiring client information if needed. Like in the case for grpc and socket. Http not requ`ired.
  59. private setUpServer(port: number): void {
  60. if (this.transportService instanceof WebsocketTransportService) {
  61. this.transportService.startServer(port);
  62. this.transportService.getTransportEvent().subscribe(this.transportEvent);
  63. } else if (this.transportService instanceof HttpTransportService) {
  64. this.transportService.startServer(port);
  65. this.transportService.getTransportEvent().subscribe(this.transportEvent);
  66. // Additional Http-specific setup if needed.
  67. }
  68. }
  69. private handleNewClient(clientInstance: ClientObject): void {
  70. // need to setup the adapters to be called by the transmission manager
  71. let transmitter: TransmitterConnectionAdapter = new TransmitterConnectionAdapter(this.transportService, clientInstance.id, this.transportEvent, clientInstance.connectionState.asObservable())
  72. let receiver: ReceiverConnectionAdapter = new ReceiverConnectionAdapter(this.transportService, clientInstance.id, this.transportEvent)
  73. let requestResponse: RequestResponseConnectionAdapter = new RequestResponseConnectionAdapter(transmitter, receiver, clientInstance.id)
  74. let adapterSet: AdapterSet = {
  75. id: clientInstance.id,
  76. dateCreated: new Date(),
  77. transmitterAdapter: transmitter,
  78. receiverAdapter: receiver,
  79. requestResponsAdapter: requestResponse
  80. }
  81. this.adapterSet.push(adapterSet)
  82. this.transportEvent.next({
  83. id: uuidv4(),
  84. event: `New Adapter`,
  85. data: {
  86. adapterId: adapterSet.id,
  87. message: `New Adapter Set${adapterSet.id} has been added`,
  88. payload: adapterSet
  89. } as EventMessage
  90. })
  91. }
  92. }