websocket.ts 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. import { error } from "console";
  7. import { subscribe } from "diagnostics_channel";
  8. /* 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. */
  9. export class WebsocketTransportService implements TransportService {
  10. private info: Transport = Transport.Websocket
  11. private connectedServer: ConnectedServerSocket[] = [] // to allow the possibility of having to communicate with multiple servers as a client
  12. private connectedClientSocket: ConnectedClientSocket[] = [] // to keep track of the all the clients that are connected
  13. // private incomingMessage: Subject<TransportMessage> = new Subject() // this is only for client roles only atm
  14. private transportEvent!: Subject<TransportEvent>
  15. constructor(event: Subject<TransportEvent>) {
  16. console.log(`WebsocketTransportService: Constructing socket transport service....`)
  17. this.transportEvent = event
  18. // logic here
  19. }
  20. public startServer(port: number): void {
  21. // logic here
  22. startSocketServer(port).subscribe({
  23. next: (connectedClient: SocketForConnectedClient) => {
  24. console.log(`WebsocketTransport Server Started...`)
  25. handleNewSocketClient(connectedClient, this.connectedClientSocket).subscribe({
  26. next: event => this.transportEvent.next(event),
  27. error: error => console.error(error),
  28. complete: () => console.log(`Client ${connectedClient.id} disconnected...`)
  29. })
  30. },
  31. error: error => console.error(error),
  32. complete: () => console.log(`...`)
  33. })
  34. }
  35. public startClient(url: string): void {
  36. // logic here
  37. startClientSocketConnection(url).then((socket: ClientSocket) => {
  38. let clientName = '' // initiate a check in local file. If no client name, then this is new
  39. handleClientSocketConnection(socket, this.connectedServer).subscribe(this.transportEvent)
  40. }).catch((error) => {
  41. console.error(`WebsocketTransport ERROR:`, error)
  42. })
  43. }
  44. // for transmission(Server Only, not applicable for client Socket)
  45. public emit(message: TransportMessage): void {
  46. let clientObj: ConnectedClientSocket | undefined = this.connectedClientSocket.find(obj => obj.id == message.target)
  47. if (clientObj && clientObj.connectionState.getValue() == 'ONLINE') {
  48. clientObj.socketInstance.emit(`message`, message.payload)
  49. }
  50. }
  51. // this returns the ref pointer for the TransportEvent instantiated at Supervisor. Socket will broadcast incoming messages as event
  52. public subscribe(): Observable<TransportEvent> {
  53. return this.transportEvent.asObservable()
  54. }
  55. public getInfo(): Transport {
  56. return this.info
  57. }
  58. }
  59. export interface ConnectedClientSocket extends ClientObject {
  60. socketInstance: SocketForConnectedClient
  61. }
  62. export interface ConnectedServerSocket extends ClientObject {
  63. socketInstance: ClientSocket
  64. }