import { Observable } from "rxjs"; import { MessageLog } from "../../interfaces/general.interface"; abstract class RemoteSR { remoteSrId: string | undefined msgLogger: MessageLogger msgErrorLogger: MessageErrorLogger Transporter: Transporter constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { this.remoteSrId = remoteSrId this.msgLogger = msgLogger this.msgErrorLogger = msgErrorLogger this.Transporter = transporter } } abstract class RemoteSRClient extends RemoteSR { abstract RemoteSR constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) } abstract send(msg: any): Observable abstract emit(msg: any) } abstract class RemoteRSClient { resObs: Observable constructor(resObs: Observable) { this.resObs = resObs; } } class RemoteSender extends RemoteSR { constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) } } class RemoteReceiver extends RemoteSR { receivableObs: Observable constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) this.receivableObs = transporter.transporter // Assuming this is where it returns an observable } } class MessageLogger extends RemoteSR { msgId: string msg: MessageLog constructor(msgId: string, msg: MessageLog, remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) this.msgId = msgId this.msg = msg } } class MessageErrorLogger extends RemoteSR { msgId: string constructor(msgId: string, remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) this.msgId = msgId } } class Transporter extends RemoteSR { transporter: any constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) this.transporter = transporter } } class RemoteReceiverClient extends RemoteSRClient { RemoteSR: any; constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) } send(msg: any): Observable { let newObservable: Observable = new Observable() return newObservable } emit(msg: any) { } } class RemoteSenderClient extends RemoteSRClient { RemoteSR: any; constructor(remoteSrId: string, msgLogger: MessageLogger, msgErrorLogger: MessageErrorLogger, transporter: Transporter) { super(remoteSrId, msgLogger, msgErrorLogger, transporter) } send(msg: any): Observable { let newObservable: Observable = new Observable() return newObservable } emit(msg: any) { } } class RemoteRSReceiverClient extends RemoteRSClient { observables: Observable[] constructor(resObs: Observable, observables: Observable[]) { super(resObs) this.observables = observables } addObs(obs: Observable) { } } class RemoteRSSenderClient extends RemoteRSClient { receiver: any constructor(resObs: Observable, receiver: any) { super(resObs) this.receiver = receiver } }