|
@@ -2,7 +2,7 @@ import * as _ from 'lodash'
|
|
import * as fs from 'fs'
|
|
import * as fs from 'fs'
|
|
import mongoose, { Model, Schema } from 'mongoose';
|
|
import mongoose, { Model, Schema } from 'mongoose';
|
|
import { Observable, Subject, Subscription, from } from 'rxjs'
|
|
import { Observable, Subject, Subscription, from } from 'rxjs'
|
|
-import { ColorCode, ReportStatus } from '../interfaces/general.interface'
|
|
|
|
|
|
+import { ColorCode, GrpcMessage, MessageLog, ReportStatus, Status } from '../interfaces/general.interface'
|
|
require('dotenv').config();
|
|
require('dotenv').config();
|
|
|
|
|
|
// Implement status chain refactoring
|
|
// Implement status chain refactoring
|
|
@@ -19,32 +19,32 @@ export class FisRetransmissionService {
|
|
}
|
|
}
|
|
|
|
|
|
// Main function that intercepts outgoing messages by communicating || intepreting report status from grpc connection as indicator
|
|
// Main function that intercepts outgoing messages by communicating || intepreting report status from grpc connection as indicator
|
|
- public handleMessage(messageToBePublished: Subject<any>, statusReport: Subject<ReportStatus>): Subject<any> {
|
|
|
|
- let releaseMessageSubject: Subject<any> = new Subject() // A return value
|
|
|
|
|
|
+ public handleMessage(messageToBePublished: Subject<GrpcMessage>, statusReport: Subject<ReportStatus>): Subject<GrpcMessage> {
|
|
|
|
+ let releaseMessageSubject: Subject<GrpcMessage> = new Subject() // A return value
|
|
// Using the concept of toggling to improve the eficacy of subscription control && data flow
|
|
// Using the concept of toggling to improve the eficacy of subscription control && data flow
|
|
let messageReleaseSubscription: Subscription | null = null
|
|
let messageReleaseSubscription: Subscription | null = null
|
|
let messageBufferSubscription: Subscription | null = null
|
|
let messageBufferSubscription: Subscription | null = null
|
|
let messageStreamToMongo: Subscription | null = null
|
|
let messageStreamToMongo: Subscription | null = null
|
|
this.checkBufferLimit(messageToBePublished, statusReport)
|
|
this.checkBufferLimit(messageToBePublished, statusReport)
|
|
- statusReport.subscribe((report: any) => {
|
|
|
|
|
|
+ statusReport.subscribe((report: ReportStatus) => {
|
|
if (report.code == ColorCode.GREEN) {
|
|
if (report.code == ColorCode.GREEN) {
|
|
console.log(`Connection status report && ${report.message ?? 'No Message'}`)
|
|
console.log(`Connection status report && ${report.message ?? 'No Message'}`)
|
|
/* Status Chain begins */
|
|
/* Status Chain begins */
|
|
let status: Status = 1
|
|
let status: Status = 1
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageStreamToMongo = this.deactivateMongoStreamSubscription(messageStreamToMongo)
|
|
messageStreamToMongo = this.deactivateMongoStreamSubscription(messageStreamToMongo)
|
|
- if (messageStreamToMongo) status = -1
|
|
|
|
|
|
+ if (messageStreamToMongo) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageBufferSubscription = this.deactivateBufferSubscription(messageBufferSubscription)
|
|
messageBufferSubscription = this.deactivateBufferSubscription(messageBufferSubscription)
|
|
- if (messageBufferSubscription) status = -1
|
|
|
|
|
|
+ if (messageBufferSubscription) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageReleaseSubscription = this.activateReleaseSubscription(messageReleaseSubscription, messageToBePublished, releaseMessageSubject)
|
|
messageReleaseSubscription = this.activateReleaseSubscription(messageReleaseSubscription, messageToBePublished, releaseMessageSubject)
|
|
- if (!messageReleaseSubscription) status = -1
|
|
|
|
|
|
+ if (!messageReleaseSubscription) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
- this.releaseMessageFromLocalBuffer(this.bufferedStorage).then((resObs: Observable<any>) => {
|
|
|
|
|
|
+ this.releaseMessageFromLocalBuffer(this.bufferedStorage).then((resObs: Observable<GrpcMessage>) => {
|
|
resObs.subscribe({
|
|
resObs.subscribe({
|
|
next: message => releaseMessageSubject.next(message),
|
|
next: message => releaseMessageSubject.next(message),
|
|
error: err => console.error(err),
|
|
error: err => console.error(err),
|
|
@@ -54,23 +54,23 @@ export class FisRetransmissionService {
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}).catch((err) => {
|
|
}).catch((err) => {
|
|
- status = -1
|
|
|
|
|
|
+ status = 0
|
|
console.error(err)
|
|
console.error(err)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
- this.releaseMessageFromMongoStorage().then((resObs: Subject<any>) => {
|
|
|
|
|
|
+ this.releaseMessageFromMongoStorage().then((resObs: Subject<GrpcMessage>) => {
|
|
resObs.subscribe({
|
|
resObs.subscribe({
|
|
next: message => releaseMessageSubject.next(message),
|
|
next: message => releaseMessageSubject.next(message),
|
|
error: err => console.error(err),
|
|
error: err => console.error(err),
|
|
complete: () => console.log(`All Mongo data are transferred `)
|
|
complete: () => console.log(`All Mongo data are transferred `)
|
|
})
|
|
})
|
|
}).catch((err) => {
|
|
}).catch((err) => {
|
|
- status = -1
|
|
|
|
|
|
+ status = 0
|
|
console.error(err)
|
|
console.error(err)
|
|
})
|
|
})
|
|
}
|
|
}
|
|
- if (status === -1) {
|
|
|
|
|
|
+ if (status === 0) {
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
}
|
|
}
|
|
|
|
|
|
@@ -86,13 +86,13 @@ export class FisRetransmissionService {
|
|
/* Status Chain begins */
|
|
/* Status Chain begins */
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageBufferSubscription = this.activateBufferSubscription(this.bufferedStorage, messageBufferSubscription, messageToBePublished)
|
|
messageBufferSubscription = this.activateBufferSubscription(this.bufferedStorage, messageBufferSubscription, messageToBePublished)
|
|
- if (!messageBufferSubscription) status = -1
|
|
|
|
|
|
+ if (!messageBufferSubscription) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageReleaseSubscription = this.deactivateReleaseSubscription(messageReleaseSubscription)
|
|
messageReleaseSubscription = this.deactivateReleaseSubscription(messageReleaseSubscription)
|
|
- if (messageReleaseSubscription) status = -1
|
|
|
|
|
|
+ if (messageReleaseSubscription) status = 0
|
|
}
|
|
}
|
|
- if (status === -1) {
|
|
|
|
|
|
+ if (status === 0) {
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -102,168 +102,167 @@ export class FisRetransmissionService {
|
|
let status: Status = 1
|
|
let status: Status = 1
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageStreamToMongo = this.activateMongoStreamSubscription(messageStreamToMongo, messageToBePublished)
|
|
messageStreamToMongo = this.activateMongoStreamSubscription(messageStreamToMongo, messageToBePublished)
|
|
- if (!messageStreamToMongo) status = -1
|
|
|
|
|
|
+ if (!messageStreamToMongo) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
messageBufferSubscription = this.deactivateBufferSubscription(messageBufferSubscription)
|
|
messageBufferSubscription = this.deactivateBufferSubscription(messageBufferSubscription)
|
|
- if (messageBufferSubscription) status = -1
|
|
|
|
|
|
+ if (messageBufferSubscription) status = 0
|
|
}
|
|
}
|
|
if (status === 1) {
|
|
if (status === 1) {
|
|
this.transferBufferedMessageToMongoStorage(this.bufferedStorage, messageBufferSubscription).then((res: any[]) => {
|
|
this.transferBufferedMessageToMongoStorage(this.bufferedStorage, messageBufferSubscription).then((res: any[]) => {
|
|
if (res.length !== this.bufferedStorage.length || this.bufferedStorage.length > 0) status = -1 // this promise function should return an empty array
|
|
if (res.length !== this.bufferedStorage.length || this.bufferedStorage.length > 0) status = -1 // this promise function should return an empty array
|
|
})
|
|
})
|
|
}
|
|
}
|
|
- if (status === -1) {
|
|
|
|
|
|
+ if (status === 0) {
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
console.log(`Something Went Wrong in handling ${ColorCode.RED} report.`)
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
- if (!report.code || report.code == "") {
|
|
|
|
|
|
+ if (!report.code) {
|
|
console.log(`Unknown message...`)
|
|
console.log(`Unknown message...`)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
return releaseMessageSubject
|
|
return releaseMessageSubject
|
|
}
|
|
}
|
|
|
|
|
|
- private checkBufferLimit(message: Subject<any>, statusReport: Subject<ReportStatus>) {
|
|
|
|
- message.subscribe(() => {
|
|
|
|
- if (this.bufferedStorage.length >= this.maximumBufferLength) {
|
|
|
|
- // for every messges that comes in, check the bufffer size, if it exceesd more than designated amount, push a red report status i
|
|
|
|
- console.log(`Buffer length exceeds limit imposed!!!`)
|
|
|
|
- let report: ReportStatus = {
|
|
|
|
- code: ColorCode.RED,
|
|
|
|
- message: `Buffer is exceeding limit. Initiate storage transfer to designated database.`,
|
|
|
|
- from: `Error Handling Service`
|
|
|
|
|
|
+ private checkBufferLimit(message: Subject<GrpcMessage>, statusReport: Subject<ReportStatus>) {
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ message.subscribe(() => {
|
|
|
|
+ if (this.bufferedStorage.length >= this.maximumBufferLength) {
|
|
|
|
+ // for every messges that comes in, check the bufffer size, if it exceesd more than designated amount, push a red report status i
|
|
|
|
+ console.log(`Buffer length exceeds limit imposed!!!`)
|
|
|
|
+ let report: ReportStatus = {
|
|
|
|
+ code: ColorCode.RED,
|
|
|
|
+ message: `Buffer is exceeding limit. Initiate storage transfer to designated database.`,
|
|
|
|
+ from: `Error Handling Service`
|
|
|
|
+ }
|
|
|
|
+ statusReport.next(report)
|
|
}
|
|
}
|
|
- statusReport.next(report)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
|
|
+ })
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
// Release the incoming Messages to be returned to the caller
|
|
// Release the incoming Messages to be returned to the caller
|
|
- private activateReleaseSubscription(messageReleaseSubscription, messageToBePublished, releaseMessageSubject): Subscription | null {
|
|
|
|
- if (!messageReleaseSubscription) {
|
|
|
|
- messageReleaseSubscription = messageToBePublished.subscribe({
|
|
|
|
- next: (message: any) => {
|
|
|
|
- console.log(`Releasing ${message.message.appData.msgId}...`);
|
|
|
|
- releaseMessageSubject.next(message);
|
|
|
|
- },
|
|
|
|
- error: (err) => console.error(err),
|
|
|
|
- complete: () => { },
|
|
|
|
- });
|
|
|
|
- console.log(`Subscription message release activated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message release is already active.`);
|
|
|
|
|
|
+ private activateReleaseSubscription(messageReleaseSubscription: Subscription | null, messageToBePublished: Subject<GrpcMessage>, releaseMessageSubject: Subject<GrpcMessage>): Subscription | null {
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (!messageReleaseSubscription) {
|
|
|
|
+ messageReleaseSubscription = messageToBePublished.subscribe({
|
|
|
|
+ next: (message: GrpcMessage) => {
|
|
|
|
+ console.log(`Releasing ${(message.message as MessageLog).appData.msgId}...`);
|
|
|
|
+ releaseMessageSubject.next(message);
|
|
|
|
+ },
|
|
|
|
+ error: (err) => console.error(err),
|
|
|
|
+ complete: () => { },
|
|
|
|
+ });
|
|
|
|
+ console.log(`Subscription message release activated.`);
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Subscription message release is already active.`);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return messageReleaseSubscription
|
|
return messageReleaseSubscription
|
|
}
|
|
}
|
|
|
|
|
|
// Stop the incoming Messaes to be returned to caller
|
|
// Stop the incoming Messaes to be returned to caller
|
|
- private deactivateReleaseSubscription(messageReleaseSubscription): Subscription | null {
|
|
|
|
- if (messageReleaseSubscription) {
|
|
|
|
- messageReleaseSubscription.unsubscribe();
|
|
|
|
- messageReleaseSubscription = null;
|
|
|
|
- console.log(`Subscription message release deactivated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message release is already deactivated.`);
|
|
|
|
|
|
+ private deactivateReleaseSubscription(messageReleaseSubscription: Subscription | null): Subscription | null {
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (messageReleaseSubscription) {
|
|
|
|
+ messageReleaseSubscription.unsubscribe();
|
|
|
|
+ messageReleaseSubscription = null;
|
|
|
|
+ console.log(`Subscription message release deactivated.`);
|
|
|
|
+ } else {
|
|
|
|
+ console.log(`Subscription message release is already deactivated.`);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return messageReleaseSubscription
|
|
return messageReleaseSubscription
|
|
}
|
|
}
|
|
|
|
|
|
// Begin to push the incoming messages into local instantarray
|
|
// Begin to push the incoming messages into local instantarray
|
|
- private activateBufferSubscription(bufferStorage: any[], messageBufferSubscription: Subscription | null, messageToBePublished: Subject<any>): Subscription | null {
|
|
|
|
- if (!messageBufferSubscription) {
|
|
|
|
- messageBufferSubscription = messageToBePublished.subscribe({
|
|
|
|
- next: (message: any) => {
|
|
|
|
- console.log(`Buffering ${message.message.appData.msgId}... Local array length: ${bufferStorage.length}`);
|
|
|
|
- bufferStorage.push(message)
|
|
|
|
- },
|
|
|
|
- error: (err) => console.error(err),
|
|
|
|
- complete: () => { },
|
|
|
|
- });
|
|
|
|
- console.log(`Subscription message buffer activated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message buffer is already active.`);
|
|
|
|
|
|
+ private activateBufferSubscription(bufferStorage: GrpcMessage[], messageBufferSubscription: Subscription | null, messageToBePublished: Subject<GrpcMessage>): Subscription | null {
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (!messageBufferSubscription) {
|
|
|
|
+ messageBufferSubscription = messageToBePublished.subscribe({
|
|
|
|
+ next: (message: any) => {
|
|
|
|
+ console.log(`Buffering ${(message.message as MessageLog).appData.msgId}... Local array length: ${bufferStorage.length}`);
|
|
|
|
+ bufferStorage.push(message)
|
|
|
|
+ },
|
|
|
|
+ error: (err) => console.error(err),
|
|
|
|
+ complete: () => { },
|
|
|
|
+ });
|
|
|
|
+ console.log(`Subscription message buffer activated.`);
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Subscription message buffer is already active.`);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return messageBufferSubscription
|
|
return messageBufferSubscription
|
|
}
|
|
}
|
|
|
|
|
|
// Stop pushing the incoming messages into local instantarray
|
|
// Stop pushing the incoming messages into local instantarray
|
|
private deactivateBufferSubscription(messageBufferSubscription: Subscription | null): Subscription | null {
|
|
private deactivateBufferSubscription(messageBufferSubscription: Subscription | null): Subscription | null {
|
|
- if (messageBufferSubscription) {
|
|
|
|
- messageBufferSubscription.unsubscribe();
|
|
|
|
- messageBufferSubscription = null;
|
|
|
|
- console.log(`Subscription message buffer deactivated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message buffer is already deactivated.`);
|
|
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status) {
|
|
|
|
+
|
|
|
|
+ if (messageBufferSubscription) {
|
|
|
|
+ messageBufferSubscription.unsubscribe();
|
|
|
|
+ messageBufferSubscription = null;
|
|
|
|
+ console.log(`Subscription message buffer deactivated.`);
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Subscription message buffer is already deactivated.`);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return null
|
|
return null
|
|
}
|
|
}
|
|
|
|
|
|
// Change the streaming direction of the incoming messages into mongo streaming subject( to be saved in local databse )
|
|
// Change the streaming direction of the incoming messages into mongo streaming subject( to be saved in local databse )
|
|
- private activateMongoStreamSubscription(messageStreamToMongo: Subscription | null, messageToBePublished: Subject<any>): Subscription | null {
|
|
|
|
- if (!messageStreamToMongo) {
|
|
|
|
- messageStreamToMongo = messageToBePublished.subscribe({
|
|
|
|
- next: (message: any) => {
|
|
|
|
- console.log(`Saving ${message.message.appData.msgId}...`);
|
|
|
|
- this.saveToMongo(message)
|
|
|
|
- },
|
|
|
|
- error: (err) => console.error(err),
|
|
|
|
- complete: () => { },
|
|
|
|
- });
|
|
|
|
- console.log(`Subscription message streaming to Mongo activated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message streaming to Mongo is already active.`);
|
|
|
|
|
|
+ private activateMongoStreamSubscription(messageStreamToMongo: Subscription | null, messageToBePublished: Subject<GrpcMessage>): Subscription | null {
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (!messageStreamToMongo) {
|
|
|
|
+ messageStreamToMongo = messageToBePublished.subscribe({
|
|
|
|
+ next: (message: any) => {
|
|
|
|
+ console.log(`Saving ${(message.message as MessageLog).appData.msgId}...`);
|
|
|
|
+ this.saveToMongo(message)
|
|
|
|
+ },
|
|
|
|
+ error: (err) => console.error(err),
|
|
|
|
+ complete: () => { },
|
|
|
|
+ });
|
|
|
|
+ console.log(`Subscription message streaming to Mongo activated.`);
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Subscription message streaming to Mongo is already active.`);
|
|
|
|
+ }
|
|
}
|
|
}
|
|
return messageStreamToMongo
|
|
return messageStreamToMongo
|
|
}
|
|
}
|
|
|
|
|
|
// Stop or cut off the mongo streaming
|
|
// Stop or cut off the mongo streaming
|
|
private deactivateMongoStreamSubscription(messageStreamToMongo: Subscription | null): Subscription | null {
|
|
private deactivateMongoStreamSubscription(messageStreamToMongo: Subscription | null): Subscription | null {
|
|
- if (messageStreamToMongo) {
|
|
|
|
- messageStreamToMongo.unsubscribe();
|
|
|
|
- messageStreamToMongo = null;
|
|
|
|
- console.log(`Subscription message streaming to Mongo deactivated.`);
|
|
|
|
- } else {
|
|
|
|
- console.log(`Subscription message streaming to Mongo is already deactivated.`);
|
|
|
|
- }
|
|
|
|
- return messageStreamToMongo
|
|
|
|
- }
|
|
|
|
-
|
|
|
|
- // Store in json file in this project folder. To be enabled in future
|
|
|
|
- private async transferMessageToLocalStorage(message: Subject<any>): Promise<void> {
|
|
|
|
- let localArray: any[] = this.bufferedStorage
|
|
|
|
- let filename = `localstorage.json`;
|
|
|
|
-
|
|
|
|
- while (localArray.length > 0) {
|
|
|
|
- let objectToWrite = this.bufferedStorage[0];
|
|
|
|
- await writeMessage(objectToWrite, filename)
|
|
|
|
- }
|
|
|
|
- message.subscribe((message: any) => {
|
|
|
|
- writeMessage(message, filename)
|
|
|
|
- })
|
|
|
|
-
|
|
|
|
- if (localArray.length < 1) this.bufferedStorage = localArray
|
|
|
|
- console.log('Local Array is empty. Finished transferring to files.')
|
|
|
|
-
|
|
|
|
- async function writeMessage(message: any, filename: string) {
|
|
|
|
- try {
|
|
|
|
- let stringifiedMessage = JSON.stringify(message);
|
|
|
|
- await fs.promises.appendFile(filename, stringifiedMessage + "\r\n")
|
|
|
|
- console.log(`Successfully transferred ${filename}`);
|
|
|
|
- localArray.shift();
|
|
|
|
- } catch (err) {
|
|
|
|
- console.error(`Error trasferring ${filename}:`, err);
|
|
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (messageStreamToMongo) {
|
|
|
|
+ messageStreamToMongo.unsubscribe();
|
|
|
|
+ messageStreamToMongo = null;
|
|
|
|
+ console.log(`Subscription message streaming to Mongo deactivated.`);
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Subscription message streaming to Mongo is already deactivated.`);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
+ return messageStreamToMongo
|
|
}
|
|
}
|
|
|
|
|
|
// To be used by mongoStreamSubscription to perform the saving execution
|
|
// To be used by mongoStreamSubscription to perform the saving execution
|
|
- private async saveToMongo(message: any): Promise<boolean> {
|
|
|
|
|
|
+ private async saveToMongo(message: GrpcMessage): Promise<boolean> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
// let messageModel: Model<any> = this.mongoConnection.model('Message', require('../models/message.schema'))
|
|
// let messageModel: Model<any> = this.mongoConnection.model('Message', require('../models/message.schema'))
|
|
this.messageModel.create(message).then(() => {
|
|
this.messageModel.create(message).then(() => {
|
|
- console.log(`Saved MessageID ${message.message.appData.msgId} into ${this.mongoUrl}`);
|
|
|
|
|
|
+ console.log(`Saved MessageID ${(message.message as MessageLog).appData.msgId} into ${this.mongoUrl}`);
|
|
resolve(true)
|
|
resolve(true)
|
|
}).catch((err) => {
|
|
}).catch((err) => {
|
|
console.log(`MongoSaveError: ${err.message}`)
|
|
console.log(`MongoSaveError: ${err.message}`)
|
|
@@ -273,67 +272,79 @@ export class FisRetransmissionService {
|
|
}
|
|
}
|
|
|
|
|
|
// As the name implies, transder all the messages from the local instance into mongoStorage. Local instance should be emptied after transfer is completed
|
|
// As the name implies, transder all the messages from the local instance into mongoStorage. Local instance should be emptied after transfer is completed
|
|
- private async transferBufferedMessageToMongoStorage(bufferedMessage: any[], messageBufferSubscription): Promise<any[]> {
|
|
|
|
|
|
+ private async transferBufferedMessageToMongoStorage(bufferedMessage: GrpcMessage[], messageBufferSubscription: Subscription | null): Promise<GrpcMessage[]> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
- let bufferedStorage: Observable<any> = from(bufferedMessage)
|
|
|
|
- bufferedStorage.subscribe({
|
|
|
|
- next: (message: any) => {
|
|
|
|
- this.saveToMongo(message).then((res) => {
|
|
|
|
- console.log(`Message ${message.message.appData.msgId} saved successfully...`)
|
|
|
|
- }).catch((err) => console.error(err))
|
|
|
|
- },
|
|
|
|
- error: (error) => {
|
|
|
|
- reject(error)
|
|
|
|
- console.error(error)
|
|
|
|
- },
|
|
|
|
- complete: () => {
|
|
|
|
- this.bufferedStorage = []
|
|
|
|
- if (messageBufferSubscription) {
|
|
|
|
- console.log(`All ${bufferedMessage.length} buffered messages have been sent for transfer to ${this.mongoUrl}. Current length: ${this.bufferedStorage.length}`)
|
|
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ let bufferedStorage: Observable<GrpcMessage> = from(bufferedMessage)
|
|
|
|
+ bufferedStorage.subscribe({
|
|
|
|
+ next: (message: any) => {
|
|
|
|
+ this.saveToMongo(message).then((res) => {
|
|
|
|
+ console.log(`Message ${(message.message as MessageLog).appData.msgId} saved successfully...`)
|
|
|
|
+ }).catch((err) => console.error(err))
|
|
|
|
+ },
|
|
|
|
+ error: (error) => {
|
|
|
|
+ reject(error)
|
|
|
|
+ console.error(error)
|
|
|
|
+ },
|
|
|
|
+ complete: () => {
|
|
|
|
+ this.bufferedStorage = []
|
|
|
|
+ if (messageBufferSubscription) {
|
|
|
|
+ console.log(`All ${bufferedMessage.length} buffered messages have been sent for transfer to ${this.mongoUrl}. Current length: ${this.bufferedStorage.length}`)
|
|
|
|
+ }
|
|
|
|
+ resolve(this.bufferedStorage)
|
|
}
|
|
}
|
|
- resolve(this.bufferedStorage)
|
|
|
|
- }
|
|
|
|
- })
|
|
|
|
|
|
+ })
|
|
|
|
+ }
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
// Transfer stored messages from the local instance back into the stream to be returned to the caller.
|
|
// Transfer stored messages from the local instance back into the stream to be returned to the caller.
|
|
- private async releaseMessageFromLocalBuffer(bufferedStorage: any[]): Promise<Observable<any>> {
|
|
|
|
|
|
+ private async releaseMessageFromLocalBuffer(bufferedStorage: GrpcMessage[]): Promise<Observable<GrpcMessage>> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
- 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<any> = from(bufferedStorage)
|
|
|
|
- resolve(returnArrayObs)
|
|
|
|
- } else {
|
|
|
|
- let message = `There is no data in stored in local instance`
|
|
|
|
- reject(message)
|
|
|
|
|
|
+ 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)
|
|
|
|
+ resolve(returnArrayObs)
|
|
|
|
+ } else {
|
|
|
|
+ let message = `There is no data in stored in local instance`
|
|
|
|
+ reject(message)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
// Transder all the stored messages in designated mongo databases. It should be empty after all the data has been transferred.
|
|
// Transder all the stored messages in designated mongo databases. It should be empty after all the data has been transferred.
|
|
- private async releaseMessageFromMongoStorage(): Promise<Subject<any>> {
|
|
|
|
|
|
+ private async releaseMessageFromMongoStorage(): Promise<Subject<GrpcMessage>> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
- let dataSubject: Subject<any> = new Subject()
|
|
|
|
- this.extractAllMessages(dataSubject)
|
|
|
|
- resolve(dataSubject)
|
|
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ let dataSubject: Subject<GrpcMessage> = new Subject()
|
|
|
|
+ this.extractAllMessages(dataSubject)
|
|
|
|
+ resolve(dataSubject)
|
|
|
|
+ }
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
// Connect to designated mongodatabase.
|
|
// Connect to designated mongodatabase.
|
|
private async connectToMongoDatabase(): Promise<any> {
|
|
private async connectToMongoDatabase(): Promise<any> {
|
|
return new Promise((resolve, reject) => {
|
|
return new Promise((resolve, reject) => {
|
|
- console.log(this.mongoUrl)
|
|
|
|
- this.mongoConnection = mongoose.createConnection(this.mongoUrl)
|
|
|
|
- this.mongoConnection.on('error', (error) => {
|
|
|
|
- console.error('Connection error:', error);
|
|
|
|
- resolve('')
|
|
|
|
- });
|
|
|
|
- this.mongoConnection.once('open', () => {
|
|
|
|
- console.log(`Connected to ${process.env.MONGO}`);
|
|
|
|
- this.messageModel = this.mongoConnection.model('Message', require('../models/message.schema'));
|
|
|
|
- });
|
|
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ console.log(this.mongoUrl)
|
|
|
|
+ this.mongoConnection = mongoose.createConnection(this.mongoUrl)
|
|
|
|
+ this.mongoConnection.on('error', (error) => {
|
|
|
|
+ console.error('Connection error:', error);
|
|
|
|
+ resolve('')
|
|
|
|
+ });
|
|
|
|
+ this.mongoConnection.once('open', () => {
|
|
|
|
+ console.log(`Connected to ${process.env.MONGO}`);
|
|
|
|
+ this.messageModel = this.mongoConnection.model('Message', require('../models/message.schema'));
|
|
|
|
+ });
|
|
|
|
+ }
|
|
})
|
|
})
|
|
}
|
|
}
|
|
|
|
|
|
@@ -349,29 +360,64 @@ export class FisRetransmissionService {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
- public async extractAllMessages(subjectArgs: Subject<any>): Promise<void> {
|
|
|
|
- if (this.messageModel) {
|
|
|
|
- const eventStream = this.messageModel.find().lean().cursor()
|
|
|
|
- eventStream.on('data', (message) => {
|
|
|
|
- // Emit each document to the subject
|
|
|
|
- subjectArgs.next(message);
|
|
|
|
- });
|
|
|
|
- eventStream.on('end', async () => {
|
|
|
|
- // All data has been streamed, complete the subject
|
|
|
|
- subjectArgs.complete();
|
|
|
|
- // Delete the data once it has been streamed
|
|
|
|
- try {
|
|
|
|
- await this.messageModel.deleteMany({});
|
|
|
|
- console.log('Data in Mongo deleted successfully.');
|
|
|
|
- } catch (err) {
|
|
|
|
- console.error('Error deleting data:', err);
|
|
|
|
- }
|
|
|
|
- });
|
|
|
|
- } else {
|
|
|
|
- console.log(`Error: Message Model is ${this.messageModel}!! Please set up the mongoose connectino properly!`)
|
|
|
|
|
|
+ public async extractAllMessages(subjectArgs: Subject<GrpcMessage>): Promise<void> {
|
|
|
|
+ // Need to resolve the issue of streaming in a specific order that is sequential
|
|
|
|
+ let status: Status = 1
|
|
|
|
+ if (status = 1) {
|
|
|
|
+ if (this.messageModel) {
|
|
|
|
+ const eventStream = this.messageModel.find().lean().cursor()
|
|
|
|
+ eventStream.on('data', (message) => {
|
|
|
|
+ // Emit each document to the subject
|
|
|
|
+ subjectArgs.next(message);
|
|
|
|
+ });
|
|
|
|
+ eventStream.on('end', async () => {
|
|
|
|
+ // All data has been streamed, complete the subject
|
|
|
|
+ subjectArgs.complete();
|
|
|
|
+ // Delete the data once it has been streamed
|
|
|
|
+ try {
|
|
|
|
+ await this.messageModel.deleteMany({});
|
|
|
|
+ console.log('Data in Mongo deleted successfully.');
|
|
|
|
+ } catch (err) {
|
|
|
|
+ console.error('Error deleting data:', err);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ } else {
|
|
|
|
+ status = 0
|
|
|
|
+ console.log(`Error: Message Model is ${this.messageModel}!! Please set up the mongoose connectino properly!`)
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
-type Status = -1 | 0 | 1 // For status chain effect
|
|
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+
|
|
|
|
+// Store in json file in this project folder. To be enabled in future
|
|
|
|
+// private async transferMessageToLocalStorage(message: Subject<any>): Promise<void> {
|
|
|
|
+// let localArray: any[] = this.bufferedStorage
|
|
|
|
+// let filename = `localstorage.json`;
|
|
|
|
+
|
|
|
|
+// while (localArray.length > 0) {
|
|
|
|
+// let objectToWrite = this.bufferedStorage[0];
|
|
|
|
+// await writeMessage(objectToWrite, filename)
|
|
|
|
+// }
|
|
|
|
+// message.subscribe((message: any) => {
|
|
|
|
+// writeMessage(message, filename)
|
|
|
|
+// })
|
|
|
|
+
|
|
|
|
+// if (localArray.length < 1) this.bufferedStorage = localArray
|
|
|
|
+// console.log('Local Array is empty. Finished transferring to files.')
|
|
|
|
+
|
|
|
|
+// async function writeMessage(message: any, filename: string) {
|
|
|
|
+// try {
|
|
|
|
+// let stringifiedMessage = JSON.stringify(message);
|
|
|
|
+// await fs.promises.appendFile(filename, stringifiedMessage + "\r\n")
|
|
|
|
+// console.log(`Successfully transferred ${filename}`);
|
|
|
|
+// localArray.shift();
|
|
|
|
+// } catch (err) {
|
|
|
|
+// console.error(`Error trasferring ${filename}:`, err);
|
|
|
|
+// }
|
|
|
|
+// }
|
|
|
|
+// }
|