| 
					
				 | 
			
			
				@@ -0,0 +1,208 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*  -----------------------       TEST4 {Mongo to Mongo}    -----------------------   */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Same with test 3 but this one will be working with CDMS or any other potential data. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import * as mongoose from 'mongoose' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { Observable, map, Subject, takeUntil, take, of, timer, from } from "rxjs"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { ErrorTrigger, MessageSynchronisationServiceSetting } from "../type/datatype"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { StreamingService } from "./test-streamOBS"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { MessageAuditorService } from "../services/message-auditor.service"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { LoggingService } from "../dependencies/fisloggingservice/interface/export"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { BaseMessage, ResponseMessage } from "../dependencies/fisappmessagejsutilty/interface/export"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+import { LogSetting } from "../dependencies/fisloggingservice/type/datatype"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Pre - Defined Data && Settings */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// This service will stream the messages from the local testRequest.json messages 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// into the designated location that will be specified later. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const stream = new StreamingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Using the instance of the streaming declared earlier, we feed 4 messages into the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+subscribers that are going to subsscribe to this source_payload. Please note that  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+source_payload will emite the messages stream from the instance of stream service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+and further feed them into the other Subject which is called source_payload_subject. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const primary_sync = new MessageAuditorService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const primary_Log = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const primary: Subject<BaseMessage> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primary.subscribe((e) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log(`Primary Received ${e.header.messageID}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Same thing as the above. The only difference is the we feed only 2 messages  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to simulate streaming error. We want to see if it will sync the other 2 later  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+on. But generall the declarative structure is the same as the above. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const secondary_log = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const secondary: Subject<BaseMessage> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+secondary.subscribe((e) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log(`Secondary Received ${e.header.messageID}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Declare the designated database. I am using windev's mongo storage to store the data. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+Hence here, is the block that definte the target and it's associated specifications. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+This will be the target and will receive the predefined set of data to be logged as  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+prepared earlier in the code above.s */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let publisher_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cacheMessageLimit: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    storage: "MongoDB", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    setting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appName: 'Default from client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    customSetting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        server: "192.168.100.59:27017", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        database: "primary" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Same as above. Also declaring another designated database. But this one will be used 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+as the target for synching. For such I purposely push only half the of the completed  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dataset in order to test out the sync later. I am using my own cloud atlas mongo 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+database on this. The address can always be changed. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let subscriber_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    cacheMessageLimit: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    storage: "MongoDB", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    setting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appName: 'Default from client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        appLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        logLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    customSetting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        srv: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        user: "testDB", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        password: "h1nt1OyXw6QeUnzS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        server: "cluster0.29sklte.mongodb.net", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        database: "secondary", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Combine source and target storage to form MessageSynchronisationServiceSetting 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let settings: MessageSynchronisationServiceSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    incomingSource: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //all of the settings to be combined here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ...publisher_storage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tags: ['Incoming'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, //LogSetting & {tags:string[] },    
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    target: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        ...subscriber_storage, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tags: ['Incoming'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }  //LogSetting & {tags:string[] }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* -------- SYNCHRONIZATION --------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// This is where the real test begin. THe process before this were merely just configuring  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// the settings of where to sync. Here the initial intialize data will first log the  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// messages into the designated database as specified earlier. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function initializeData() { // To store the data into the designated databases. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    primary_Log.init(publisher_storage).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        primary_Log.subscribe(primary) // Logging only occurs here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    secondary_log.init(subscriber_storage).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        secondary_log.subscribe(secondary) // Logging only occurs here 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Done by appoximately 5-8 Seconds 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// initializeData() // Call the function to store the data into the designated databases. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primary_sync.init(settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* This is where the synchronization logic is called. The errorSubject will act as a trigger 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+mechanism to execute the synchronization. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let errorSubject: Subject<ErrorTrigger> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Subscribe to errorSubject notification  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let sync = primary_sync.subscribe(errorSubject) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+sync.subscribe({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    next: (msgToBeSynchronized) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(`passing missing message: ${msgToBeSynchronized.header.messageID} into target/secondary subject.`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // the missing data returned will be pushed (next(message)) into the target payload. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        secondary.next(msgToBeSynchronized) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Set time oout for 5 seconds to allow the initial logging stage to complete it's logging 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// implementation first before proceedint to trigger the sync 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+setTimeout(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // This wil act as the trigger error.Although the definition of this error is  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // still subject for enhancements in the near future. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let sampleError: ErrorTrigger = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        status: 1, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        message: "NO. I dont want to work" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    errorSubject.next(sampleError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, 10000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* THis is testing for generating error message to be fed into the error subject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+to act as additional trigger to exectute the synchronization when there's no internet 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connection. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const dns = require('dns'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Function to check internet connectivity. Basically just look up the site of example.com 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// using the built in libray of DNS. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function checkInternetConnectivity() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dns.lookup('example.com', (err) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if (err && err.code === 'ENOTFOUND') { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            let errorMsg: ErrorTrigger = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                status: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                message: `No internet connection` 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            errorSubject.next(errorMsg) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // Emit a message indicating internet connectivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            // console.log('Internet connection is available'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Interval time (in milliseconds) for checking connectivity 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const intervalTime = 1000; // Check every 1 second 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Start checking connectivity at intervals 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const interval = setInterval(checkInternetConnectivity, intervalTime); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Stop checking connectivity after a certain duration (e.g., 1 minute) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const duration = 60000; // 1 minute 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+setTimeout(function () { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    clearInterval(interval); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    console.log('Internet connectivity monitoring stopped'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}, duration); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function countdown() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let seconds = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    const countUpInterval = setInterval(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(`Elapsed seconds: ${seconds}`); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        seconds++; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }, 1000); // Update every second (1000 milliseconds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+countdown() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const Schema = mongoose.Schema; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const fingerPrintSchema = new Schema({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    uuid: { type: String, required: true, lowercase: true, unique: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fileName: { type: String, required: true, lowercase: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fileType: { type: String, required: true, lowercase: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    entityName: { type: String, required: true, lowercase: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    fileData: { type: Object, required: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function convertDataInMongo(url: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let data: Subject<any> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let convertService = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let dbConnection = mongoose.createConnection(url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let dataModel = dbConnection.model('genericdata', fingerPrintSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dataModel.find().then((res) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log(res) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        res.forEach((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data.next(element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data.subscribe((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        convertService. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+convertDataInMongo('mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/test') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+convertDataInMongo('mongodb://192.168.100.59:27017/hq') 
			 |