|
@@ -12,7 +12,8 @@ connectors or adapters will have their own identifier*/
|
|
|
export class MessageTransmissionTransmitter extends MessageTransmissionBase implements MessageTransmitterInterface {
|
|
|
private connectionStateEvent: BehaviorSubject<ConnectionState> = new BehaviorSubject<ConnectionState>('OFFLINE')
|
|
|
private console: ConsoleLogger = new ConsoleLogger(`MessageTransmissionTransmitter`, ['transmission'])
|
|
|
- private messageToBeTransmitted!: Subject<FisMessage | WrappedMessage>
|
|
|
+ private messageToBeBuffered!: Subject<FisMessage | WrappedMessage>
|
|
|
+ private messageToBeTransmitted!: Subject<WrappedMessage>
|
|
|
private buffer!: RetransmissionService;
|
|
|
private currentAdapter!: TransmitterAdapterInterface
|
|
|
|
|
@@ -21,17 +22,18 @@ export class MessageTransmissionTransmitter extends MessageTransmissionBase impl
|
|
|
this.console.log({ message: `Constructing Transmitter Transmission with ${clientId}` })
|
|
|
this.event = event
|
|
|
this.messageToBeTransmitted = new Subject()
|
|
|
+ this.messageToBeBuffered = new Subject()
|
|
|
this.buffer = new RetransmissionService()
|
|
|
this.handleAdapters(this.event)
|
|
|
this.setupBuffer()
|
|
|
|
|
|
- // special case just for http in case of server/client disconnected, the unsent msg will be flushed back into messageToBeTransmitted
|
|
|
+ // special case just for http in case of server/client disconnected, the unsent msg will be flushed back into messageToBeBuffered
|
|
|
// logic here
|
|
|
}
|
|
|
|
|
|
public emit(message: FisMessage): void {
|
|
|
this.console.log({ message: `${this.connectionStateEvent.getValue() == 'ONLINE' ? `Transmitting message` : `Buffering message`}` })
|
|
|
- this.messageToBeTransmitted.next(message)
|
|
|
+ this.messageToBeBuffered.next(message)
|
|
|
}
|
|
|
|
|
|
private setupBuffer(): void {
|
|
@@ -52,25 +54,22 @@ export class MessageTransmissionTransmitter extends MessageTransmissionBase impl
|
|
|
if (signal == 'OFFLINE') this.console.error({ message: `${this.clientId} disconnected` })
|
|
|
if (signal == 'ONLINE') this.console.log({ message: `${this.clientId} connected` })
|
|
|
})
|
|
|
- this.buffer.implementRetransmission(this.messageToBeTransmitted, this.connectionStateEvent.asObservable(), true)
|
|
|
+ this.buffer.implementRetransmission(this.messageToBeBuffered, this.connectionStateEvent.asObservable(), true)
|
|
|
// automatically subscribe to allow released bffered messages to be released
|
|
|
this.buffer.returnSubjectForBufferedItems().subscribe((bufferedMessage: WrappedMessage) => {
|
|
|
// need to work with wrapped messages
|
|
|
this.console.log({ message: `Releasing ${bufferedMessage.thisMessageID}` });
|
|
|
if (this.currentAdapter) {
|
|
|
- this.currentAdapter.emit(bufferedMessage)
|
|
|
- } else {
|
|
|
+ // this.currentAdapter.emit(bufferedMessage)
|
|
|
this.messageToBeTransmitted.next(bufferedMessage)
|
|
|
+ } else {
|
|
|
+ this.messageToBeBuffered.next(bufferedMessage)
|
|
|
this.console.error({ message: `Adapter is not set. Please ensure adapters are ready.` })
|
|
|
}
|
|
|
})
|
|
|
}
|
|
|
|
|
|
- private handleAdapters(adaptersEvent: Observable<GeneralEvent<any>>): void {
|
|
|
- this.handleNewAdapters(adaptersEvent)
|
|
|
- }
|
|
|
-
|
|
|
- private handleNewAdapters(adaptersEvent: Observable<GeneralEvent<any>>): void {
|
|
|
+ private handleAdapters(adaptersEvent: Subject<GeneralEvent<any>>): void {
|
|
|
adaptersEvent.pipe(
|
|
|
filter(event => event.event === `New Adapter`),
|
|
|
map(event => { return event.data }),
|
|
@@ -79,15 +78,34 @@ export class MessageTransmissionTransmitter extends MessageTransmissionBase impl
|
|
|
adapters.forEach((adapter: AdapterInterface) => {
|
|
|
if (adapter.role === `Transmitter`) {
|
|
|
this.adapters.push(adapter as TransmitterAdapterInterface)
|
|
|
+ adaptersEvent.next({
|
|
|
+ id: uuidv4(),
|
|
|
+ type: 'Transmission Event',
|
|
|
+ event: `New Adapter`,
|
|
|
+ date: new Date(),
|
|
|
+ data: adapter,
|
|
|
+ transport: adapter.transport
|
|
|
+ })
|
|
|
}
|
|
|
})
|
|
|
- this.setUpAdapter()
|
|
|
},
|
|
|
error: error => this.console.error({ message: 'Observer Error', details: error })
|
|
|
})
|
|
|
- }
|
|
|
|
|
|
- private handleAdaptersTermination(adaptersEvent: Observable<GeneralEvent<any>>): void {
|
|
|
+ // listen to newly added adapters in transmission
|
|
|
+ adaptersEvent.pipe(
|
|
|
+ filter(event => event.type === `Transmission Event`),
|
|
|
+ filter(event => event.event === `New Adapter`),
|
|
|
+ map(event => {
|
|
|
+ return event.data
|
|
|
+ })
|
|
|
+ ).subscribe((adapter: AdapterInterface) => {
|
|
|
+ if (!this.currentAdapter) {
|
|
|
+ this.currentAdapter = adapter as TransmitterAdapterInterface
|
|
|
+ } else {
|
|
|
+ this.console.log({ message: `Already have existing transmitting adapter. Currently hardcode to use only 1` })
|
|
|
+ }
|
|
|
+ })
|
|
|
}
|
|
|
|
|
|
// temporary logic for now.
|
|
@@ -105,7 +123,7 @@ export class MessageTransmissionTransmitter extends MessageTransmissionBase impl
|
|
|
filter(event => event.data.clientId == this.clientId),
|
|
|
).subscribe((event: GeneralEvent<any>) => {
|
|
|
this.console.log({ message: `${this.connectionStateEvent.getValue() == 'ONLINE' ? `Transmitting ${((event.data.payload as TransportMessage).payload as WrappedMessage).thisMessageID}` : `Buffering ${((event.data.payload as TransportMessage).payload as WrappedMessage).thisMessageID}`}` })
|
|
|
- this.messageToBeTransmitted.next(((event.data.payload as TransportMessage).payload as WrappedMessage))
|
|
|
+ this.messageToBeBuffered.next(((event.data.payload as TransportMessage).payload as WrappedMessage))
|
|
|
})
|
|
|
}
|
|
|
|