| 
					
				 | 
			
			
				@@ -3,6 +3,8 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 Highly advisable to refer to test3c for the overall explanation of the logic flow in these 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 test cases. Test4 is an adjusted version of test3 to cater for the need to deal with  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 different types of data aside from messageLogs. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/* Note: MessageAudit will not work if storage is FIle. Search does not work at logging service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+does not cater for File system storage */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import * as mongoose from 'mongoose' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { Observable, map, Subject, takeUntil, take, of, timer, from } from "rxjs"; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 import { ErrorTrigger, MessageSynchronisationServiceSetting } from "../type/datatype"; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -16,6 +18,8 @@ import * as fs from "fs" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* Convert all the non message data in the database into messageLog type. This is to ensure it's compatibility  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 to be used by the interface from logging and audit message features. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const Schema = mongoose.Schema; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Use existing schema.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const messageSchema = require('../dependencies/log/type/schemas/message.schema') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Create the fingerprint schema. This is the type of the data to be transformed into messageLog type 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const fingerPrintSchema = new Schema({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     uuid: { type: String, required: true, lowercase: true, unique: true }, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -25,69 +29,23 @@ const fingerPrintSchema = new Schema({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     fileData: { type: Object, required: true }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// Use existing schema.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const messageSchema = require('../dependencies/log/type/schemas/message.schema') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// This function is used for convert existing generic data in the designated database to be prepared for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// AuditMessage service.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function convertDataInMongo(url: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Create a subject to stream data received from query at mongo, instantiate convert service and also the database location to read the datas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let data: Subject<any> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let convertService = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let dbConnection = mongoose.createConnection(url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let dataModel = dbConnection.model('genericdata', fingerPrintSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let messages = dbConnection.model('message', messageSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Once the data is queried, it will be streamed into the data Subject declared earlier 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    dataModel.find().then((res) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // console.log(res) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        res.forEach((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            data.next(element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Assign a `handler` so to speak to handle the element receivd in the data Subject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // This is where the transformation happens. The logic is written on the logging service side. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    // Once that is done, the transformed data will be saved again bacn in the mongo database in a different databse/collection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    data.subscribe((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        let res = convertService.convertCDMStoMessageLog(element, settings.incomingSource.tags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        console.log(`Converting fingerprint .... ${res.appData.msgId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        messages.create(res) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// These declaration are for the secondary to log the converted missing data back in it's own collection at their corresponding servers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const dbConnection = mongoose.createConnection("mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/secondary") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const dataModel = dbConnection.model('genericdata', fingerPrintSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// TO be used by the secondary Subject to convert the message log it receives to complete the synchronization process. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-function convertMessageLogToCDMS(args: MessageLog){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    let converted = secondary_log.convertMessageLogtoCDMS(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    dataModel.create(converted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* For basic explanation, pleas refer to test3c. Here we are just instantiating audit and logging service for both 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 the primary and the secondary soures. And then the instantiation of the corresponding subjects.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 The idea is that the subject will receive the missing info provided by the auditor and then log the  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 missing data in the designated database location. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-const primary_sync = new MessageAuditorService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const auditor = new MessageAuditorService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const primary_Log = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const primary: Subject<MessageLog> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 primary.subscribe((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     console.log(`Primary Received ${element.appData.msgId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const secondary_log = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const secondary: Subject<MessageLog> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 secondary.subscribe((element: MessageLog) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     console.log(`Secondary Received ${element.appData.msgId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     convertMessageLogToCDMS(element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* For basic explanation, please refer to test3c. Declaration of the source and target location. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let primary_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cacheMessageLimit: 0, 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -98,11 +56,11 @@ let primary_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     customSetting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        server: "192.168.100.59:27017", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        database: "primary" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        url: 'mongodb://192.168.100.59:27017/primary' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // server: "192.168.100.59:27017", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // database: "primary" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 let secondary_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     cacheMessageLimit: 0, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     storage: "MongoDB", 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -112,11 +70,12 @@ let secondary_storage: LogSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         logLocName: 'To be generated in client', 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     customSetting: { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        srv: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        user: "testDB", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        password: "h1nt1OyXw6QeUnzS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        server: "cluster0.29sklte.mongodb.net", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        database: "secondary", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        url: 'mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/secondary' 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // srv: true, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // user: "testDB", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // password: "h1nt1OyXw6QeUnzS", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // server: "cluster0.29sklte.mongodb.net", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // database: "secondary", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -132,17 +91,20 @@ let settings: MessageSynchronisationServiceSetting = { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         tags: ['Fingerprint'] 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }  //LogSetting & {tags:string[] }   
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* -------- SYNCHRONIZATION --------- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Primary will call the syncrhonization service 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-primary_sync.init(settings) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+auditor.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) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+let sync = auditor.subscribe(errorSubject) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 sync.subscribe({ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     next: (msgToBeSynchronized: MessageLog) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         console.log(`passing missing message: ${msgToBeSynchronized.appData.msgId} into target/secondary subject.`) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -163,9 +125,63 @@ setTimeout(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     errorSubject.next(sampleError) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }, 3000) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+countdown() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Convert all the existing cdms into message log 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+convertDataInMongo('mongodb://192.168.100.59:27017/primary') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+convertDataInMongo('mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/secondary') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// These declaration are for the secondary to log the converted missing data back in it's own collection at their corresponding servers 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const dbConnection = mongoose.createConnection("mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/secondary") 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+const dataModel = dbConnection.model('genericdata', fingerPrintSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// Manually log the missing data given by audit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+primary_Log.init(settings.incomingSource).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    primary_Log.subscribe(primary) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+secondary_log.init(settings.target).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    secondary_log.subscribe(secondary) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// This function is used for convert existing generic data in the designated database to be prepared for 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// AuditMessage service.  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function convertDataInMongo(url: string) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Create a subject to stream data received from query at mongo, instantiate convert service and also the database location to read the datas 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let data: Subject<any> = new Subject() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let convertService = new LoggingService() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let dbConnection = mongoose.createConnection(url) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let dataModel = dbConnection.model('genericdata', fingerPrintSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let messages = dbConnection.model('message', messageSchema) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Once the data is queried, it will be streamed into the data Subject declared earlier 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dataModel.find().then((res) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        // console.log(res) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        res.forEach((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            data.next(element) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Assign a `handler` so to speak to handle the element receivd in the data Subject 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // This is where the transformation happens. The logic is written on the logging service side. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // Once that is done, the transformed data will be saved again bacn in the mongo database in a different databse/collection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    data.subscribe((element) => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        let res = convertService.convertCDMStoMessageLog(element, settings.incomingSource.tags) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        console.log(`Converting fingerprint .... ${res.appData.msgId}`) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        messages.create(res) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+// TO be used by the secondary Subject to convert the message log it receives to complete the synchronization process. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+function convertMessageLogToCDMS(args: MessageLog) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    let converted = secondary_log.convertMessageLogtoCDMS(args) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    dataModel.create(converted) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* 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. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connection. */ // THis part is not mandatory and can be commented out--- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 const dns = require('dns'); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 // Function to check internet connectivity. Basically just look up the site of example.com 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -206,13 +222,3 @@ function countdown() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }, 1000); // Update every second (1000 milliseconds) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-countdown() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// convertDataInMongo('mongodb://192.168.100.59:27017/primary') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// convertDataInMongo('mongodb+srv://testDB:h1nt1OyXw6QeUnzS@cluster0.29sklte.mongodb.net/secondary') 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-// // Manually log the missing data given by audit 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-secondary_log.init(settings.target).then(() => { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    secondary_log.subscribe(secondary)  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 |