|
@@ -1,17 +1,16 @@
|
|
|
import * as _ from 'lodash'
|
|
|
-import * as fs from 'fs'
|
|
|
import mongoose, { Model, Schema } from 'mongoose';
|
|
|
import { Observable, Subject, Subscription, from } from 'rxjs'
|
|
|
-import { ColorCode, GrpcMessage, MessageLog, ReportStatus, Status } from '../interfaces/general.interface'
|
|
|
+import { ColorCode, Message, MessageLog, ReportStatus, Status } from '../interfaces/general.interface'
|
|
|
require('dotenv').config();
|
|
|
|
|
|
|
|
|
export class FisRetransmissionService {
|
|
|
private mongoUrl: string = process.env.MONGO + 'emergencyStorage'
|
|
|
- private bufferedStorage: any[] = []
|
|
|
+ private bufferedStorage: Message[] = []
|
|
|
private mongoConnection: any
|
|
|
private messageModel: any
|
|
|
- private maximumBufferLength: number = parseInt(process.env.MaxBufferLoad as string)
|
|
|
+ private maximumBufferLength: number = parseInt(process.env.MaxBufferLoad as string)
|
|
|
|
|
|
constructor() {
|
|
|
|
|
@@ -19,15 +18,16 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- public handleMessage(messageToBePublished: Subject<GrpcMessage>, statusReport: Subject<ReportStatus>): Subject<GrpcMessage> {
|
|
|
- let releaseMessageSubject: Subject<GrpcMessage> = new Subject()
|
|
|
-
|
|
|
+ public handleMessage(applicationOutgoingMessage: Subject<Message>, statusReport: Subject<ReportStatus>): Subject<Message> {
|
|
|
+ let releaseMessageSubject: Subject<Message> = new Subject()
|
|
|
let messageReleaseSubscription: Subscription | null = null
|
|
|
let messageBufferSubscription: Subscription | null = null
|
|
|
let messageStreamToMongo: Subscription | null = null
|
|
|
- this.checkBufferLimit(messageToBePublished, statusReport)
|
|
|
+ this.checkBufferLimit(applicationOutgoingMessage, statusReport)
|
|
|
statusReport.subscribe((report: ReportStatus) => {
|
|
|
- if (report.code == ColorCode.GREEN) {
|
|
|
+
|
|
|
+ if there's any. */
|
|
|
+ if (report.code == ColorCode.GREEN) {
|
|
|
console.log(`Connection status report && ${report.message ?? 'No Message'}`)
|
|
|
|
|
|
let status: Status = 1
|
|
@@ -40,11 +40,11 @@ export class FisRetransmissionService {
|
|
|
if (messageBufferSubscription) status = 0
|
|
|
}
|
|
|
if (status === 1) {
|
|
|
- messageReleaseSubscription = this.activateReleaseSubscription(messageReleaseSubscription, messageToBePublished, releaseMessageSubject)
|
|
|
+ messageReleaseSubscription = this.activateReleaseSubscription(messageReleaseSubscription, applicationOutgoingMessage, releaseMessageSubject)
|
|
|
if (!messageReleaseSubscription) status = 0
|
|
|
}
|
|
|
if (status === 1) {
|
|
|
- this.releaseMessageFromLocalBuffer(this.bufferedStorage).then((resObs: Observable<GrpcMessage>) => {
|
|
|
+ this.releaseMessageFromLocalBuffer(this.bufferedStorage).then((resObs: Observable<Message>) => {
|
|
|
resObs.subscribe({
|
|
|
next: message => releaseMessageSubject.next(message),
|
|
|
error: err => console.error(err),
|
|
@@ -59,7 +59,7 @@ export class FisRetransmissionService {
|
|
|
})
|
|
|
}
|
|
|
if (status === 1) {
|
|
|
- this.releaseMessageFromMongoStorage().then((resObs: Subject<GrpcMessage>) => {
|
|
|
+ this.releaseMessageFromMongoStorage().then((resObs: Subject<Message>) => {
|
|
|
resObs.subscribe({
|
|
|
next: message => releaseMessageSubject.next(message),
|
|
|
error: err => console.error(err),
|
|
@@ -73,19 +73,18 @@ export class FisRetransmissionService {
|
|
|
if (status === 0) {
|
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
+
|
|
|
if (report.code == ColorCode.YELLOW) {
|
|
|
if (report.payload) {
|
|
|
console.log(`Rebuffering ${report.payload.message?.appData?.msgId} into buffer...`)
|
|
|
this.bufferedStorage.push(report.payload)
|
|
|
}
|
|
|
console.log(`Connection status report && ${report.message ?? 'No Message'}`)
|
|
|
-
|
|
|
let status: Status = 1
|
|
|
|
|
|
if (status === 1) {
|
|
|
- messageBufferSubscription = this.activateBufferSubscription(this.bufferedStorage, messageBufferSubscription, messageToBePublished)
|
|
|
+ messageBufferSubscription = this.activateBufferSubscription(this.bufferedStorage, messageBufferSubscription, applicationOutgoingMessage)
|
|
|
if (!messageBufferSubscription) status = 0
|
|
|
}
|
|
|
if (status === 1) {
|
|
@@ -96,12 +95,13 @@ export class FisRetransmissionService {
|
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ flow from applicationOutgoingMessage into Mongo */
|
|
|
if (report.code == ColorCode.RED) {
|
|
|
console.log(`Connection status report: Server down. ${report.message} lol`)
|
|
|
-
|
|
|
let status: Status = 1
|
|
|
if (status === 1) {
|
|
|
- messageStreamToMongo = this.activateMongoStreamSubscription(messageStreamToMongo, messageToBePublished)
|
|
|
+ messageStreamToMongo = this.activateMongoStreamSubscription(messageStreamToMongo, applicationOutgoingMessage)
|
|
|
if (!messageStreamToMongo) status = 0
|
|
|
}
|
|
|
if (status === 1) {
|
|
@@ -116,7 +116,6 @@ export class FisRetransmissionService {
|
|
|
if (status === 0) {
|
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
if (!report.code) {
|
|
|
console.log(`Unknown message...`)
|
|
@@ -125,7 +124,9 @@ export class FisRetransmissionService {
|
|
|
return releaseMessageSubject
|
|
|
}
|
|
|
|
|
|
- private checkBufferLimit(message: Subject<GrpcMessage>, statusReport: Subject<ReportStatus>) {
|
|
|
+
|
|
|
+
|
|
|
+ private checkBufferLimit(message: Subject<Message>, statusReport: Subject<ReportStatus>) {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
message.subscribe(() => {
|
|
@@ -144,12 +145,12 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private activateReleaseSubscription(messageReleaseSubscription: Subscription | null, messageToBePublished: Subject<GrpcMessage>, releaseMessageSubject: Subject<GrpcMessage>): Subscription | null {
|
|
|
+ private activateReleaseSubscription(messageReleaseSubscription: Subscription | null, applicationOutgoingMessage: Subject<Message>, releaseMessageSubject: Subject<Message>): Subscription | null {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
if (!messageReleaseSubscription) {
|
|
|
- messageReleaseSubscription = messageToBePublished.subscribe({
|
|
|
- next: (message: GrpcMessage) => {
|
|
|
+ messageReleaseSubscription = applicationOutgoingMessage.subscribe({
|
|
|
+ next: (message: Message) => {
|
|
|
console.log(`Releasing ${(message.message as MessageLog).appData.msgId}...`);
|
|
|
releaseMessageSubject.next(message);
|
|
|
},
|
|
@@ -165,7 +166,7 @@ export class FisRetransmissionService {
|
|
|
return messageReleaseSubscription
|
|
|
}
|
|
|
|
|
|
-
|
|
|
+
|
|
|
private deactivateReleaseSubscription(messageReleaseSubscription: Subscription | null): Subscription | null {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
@@ -181,11 +182,11 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private activateBufferSubscription(bufferStorage: GrpcMessage[], messageBufferSubscription: Subscription | null, messageToBePublished: Subject<GrpcMessage>): Subscription | null {
|
|
|
+ private activateBufferSubscription(bufferStorage: Message[], messageBufferSubscription: Subscription | null, applicationOutgoingMessage: Subject<Message>): Subscription | null {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
if (!messageBufferSubscription) {
|
|
|
- messageBufferSubscription = messageToBePublished.subscribe({
|
|
|
+ messageBufferSubscription = applicationOutgoingMessage.subscribe({
|
|
|
next: (message: any) => {
|
|
|
console.log(`Buffering ${(message.message as MessageLog).appData.msgId}... Local array length: ${bufferStorage.length}`);
|
|
|
bufferStorage.push(message)
|
|
@@ -220,11 +221,11 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private activateMongoStreamSubscription(messageStreamToMongo: Subscription | null, messageToBePublished: Subject<GrpcMessage>): Subscription | null {
|
|
|
+ private activateMongoStreamSubscription(messageStreamToMongo: Subscription | null, applicationOutgoingMessage: Subject<Message>): Subscription | null {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
if (!messageStreamToMongo) {
|
|
|
- messageStreamToMongo = messageToBePublished.subscribe({
|
|
|
+ messageStreamToMongo = applicationOutgoingMessage.subscribe({
|
|
|
next: (message: any) => {
|
|
|
console.log(`Saving ${(message.message as MessageLog).appData.msgId}...`);
|
|
|
this.saveToMongo(message)
|
|
@@ -258,7 +259,7 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async saveToMongo(message: GrpcMessage): Promise<boolean> {
|
|
|
+ private async saveToMongo(message: Message): Promise<boolean> {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
|
|
this.messageModel.create(message).then(() => {
|
|
@@ -272,11 +273,11 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async transferBufferedMessageToMongoStorage(bufferedMessage: GrpcMessage[], messageBufferSubscription: Subscription | null): Promise<GrpcMessage[]> {
|
|
|
+ private async transferBufferedMessageToMongoStorage(bufferedMessage: Message[], messageBufferSubscription: Subscription | null): Promise<Message[]> {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
- let bufferedStorage: Observable<GrpcMessage> = from(bufferedMessage)
|
|
|
+ let bufferedStorage: Observable<Message> = from(bufferedMessage)
|
|
|
bufferedStorage.subscribe({
|
|
|
next: (message: any) => {
|
|
|
this.saveToMongo(message).then((res) => {
|
|
@@ -300,14 +301,14 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async releaseMessageFromLocalBuffer(bufferedStorage: GrpcMessage[]): Promise<Observable<GrpcMessage>> {
|
|
|
+ private async releaseMessageFromLocalBuffer(bufferedStorage: Message[]): Promise<Observable<Message>> {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
if (bufferedStorage.length > 1) {
|
|
|
let caseVariable = this.bufferedStorage.length > 1;
|
|
|
console.log(`Releasing data from local buffer instance. There ${caseVariable ? "is" : "are"} ${this.bufferedStorage.length} messages...`);
|
|
|
- let returnArrayObs: Observable<GrpcMessage> = from(bufferedStorage)
|
|
|
+ let returnArrayObs: Observable<Message> = from(bufferedStorage)
|
|
|
resolve(returnArrayObs)
|
|
|
} else {
|
|
|
let message = `There is no data in stored in local instance`
|
|
@@ -318,11 +319,11 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
|
|
|
|
|
|
- private async releaseMessageFromMongoStorage(): Promise<Subject<GrpcMessage>> {
|
|
|
+ private async releaseMessageFromMongoStorage(): Promise<Subject<Message>> {
|
|
|
return new Promise((resolve, reject) => {
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|
|
|
- let dataSubject: Subject<GrpcMessage> = new Subject()
|
|
|
+ let dataSubject: Subject<Message> = new Subject()
|
|
|
this.extractAllMessages(dataSubject)
|
|
|
resolve(dataSubject)
|
|
|
}
|
|
@@ -360,7 +361,8 @@ export class FisRetransmissionService {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- public async extractAllMessages(subjectArgs: Subject<GrpcMessage>): Promise<void> {
|
|
|
+
|
|
|
+ public async extractAllMessages(subjectArgs: Subject<Message>): Promise<void> {
|
|
|
|
|
|
let status: Status = 1
|
|
|
if (status = 1) {
|