websocket.ts 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. import { BehaviorSubject, filter, Observable, Subject } from "rxjs";
  2. import { Socket as ClientSocket } from 'socket.io-client'
  3. import { Socket as SocketForConnectedClient } from "socket.io"
  4. import { handleClientSocketConnection, handleNewSocketClient, startClientSocketConnection, startSocketServer } from "../utils/socket.utils";
  5. import { ClientObject, ConnectionState, Info, Transport, TransportEvent, TransportMessage, TransportService } from "../interface/connector.interface";
  6. /* Just code in the context that this websocket service will be handling multiple UI clients. Can think about the server communication at a later time. */
  7. export class WebsocketTransportService implements TransportService {
  8. private info: Transport = Transport.Websocket
  9. private connectedServer: ConnectedServerSocket[] = [] // to allow the possibility of having to communicate with multiple servers as a client
  10. private connectedClientSocket: ConnectedClientSocket[] = [] // to keep track of the all the clients that are connected
  11. // private incomingMessage: Subject<TransportMessage> = new Subject() // this is only for client roles only atm
  12. private transportEvent: Subject<TransportEvent> = new Subject()
  13. constructor() {
  14. console.log(`WebsocketTransportService: Constructing socket transport service....`)
  15. // logic here
  16. }
  17. public startServer(port: number): void {
  18. // logic here
  19. startSocketServer(port).subscribe({
  20. next: (connectedClient: SocketForConnectedClient) => {
  21. console.log(`WebsocketTransport Server Started...`)
  22. handleNewSocketClient(connectedClient, this.connectedClientSocket).subscribe(this.transportEvent)
  23. },
  24. error: error => console.error(error),
  25. })
  26. }
  27. public startClient(url: string): void {
  28. // logic here
  29. startClientSocketConnection(url).then((socket: ClientSocket) => {
  30. handleClientSocketConnection(socket, this.connectedServer).subscribe(this.transportEvent)
  31. }).catch((error) => {
  32. console.error(`WebsocketTransport ERROR:`, error)
  33. })
  34. }
  35. public getTransportEvent(): Observable<TransportEvent> {
  36. return this.transportEvent.asObservable()
  37. }
  38. // for transmission(Server Only, not applicable for client Socket)
  39. public emit(message: TransportMessage): void {
  40. /* Just a rough idea, Because this service still needs to be direct the mesage to be emiteed based on the client that send it earlier.
  41. For example, if it'd doing a request response, obviosuly, it needs to be identified whose respnses it belong to. */
  42. let clientObj: ConnectedClientSocket | undefined = this.connectedClientSocket.find(obj => obj.id == message.target)
  43. if(clientObj && clientObj.connectionState.getValue() == 'ONLINE') {
  44. clientObj.socketInstance.emit(`message`, message)
  45. }
  46. }
  47. public subscribe(): Observable<TransportEvent> {
  48. return this.transportEvent.asObservable()
  49. }
  50. public getInfo(): Transport {
  51. return this.info
  52. }
  53. }
  54. export interface ConnectedClientSocket extends ClientObject {
  55. socketInstance: SocketForConnectedClient
  56. }
  57. export interface ConnectedServerSocket extends ClientObject {
  58. socketInstance: ClientSocket
  59. }