From de1ee10bd1448d00720c728d6b63e93f54536cf4 Mon Sep 17 00:00:00 2001
From: Octavio Percivaldi <octaviopercivaldi2@gmail.com>
Date: Fri, 18 Feb 2022 01:21:42 -0300
Subject: [PATCH] Lots of fixes and improvements

---
 .gitignore          |   5 +-
 lib/aap/listener.js |  61 +++++++++----------
 lib/index.js        | 140 +++++++++++++++++++++++++++++++++++---------
 package.json        |   2 +-
 4 files changed, 148 insertions(+), 60 deletions(-)

diff --git a/.gitignore b/.gitignore
index d6133dd..ad2958e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -104,4 +104,7 @@ dist
 .tern-port
 
 # Yarn Files
-yarn.lock
\ No newline at end of file
+yarn.lock
+
+# Package-lock.json
+package-lock.json
\ No newline at end of file
diff --git a/lib/aap/listener.js b/lib/aap/listener.js
index 1108214..37e7f68 100644
--- a/lib/aap/listener.js
+++ b/lib/aap/listener.js
@@ -96,7 +96,7 @@ const initializeDTN = async (dtnHost, dtnPort, agentID) => {
 const listen = async (netClient) => {
   const { deserializeMessage } = serializers;
 
-  netClient.on('data', (receivedData) => {
+  netClient.on('data', async (receivedData) => {
     console.log('[INFO] Received data from μD3TN:');
 
     // Update amount of MB received from foreign databases.
@@ -140,13 +140,13 @@ const updateLocalDatabase = async ({ type, modelName, localDate, data }) => {
   } else if (type === 'dtInsertMany') {
     model.insertMany(data);
   } else if (type === 'dtDeleteOne') {
-    const { filter, options, callback } = data;
-    model.deleteOne(filter, options, callback);
+    const { filter, options } = data;
+    model.deleteOne(filter, options).exec();
   } else if (type === 'dtDeleteMany') {
-    const { filter, options, callback } = data;
-    model.deleteMany(filter, options, callback);
+    const { filter, options } = data;
+    model.deleteMany(filter, options).exec();
   } else if (type === 'dtUpdateOne') {
-    const { filter, update, options, callback } = data;
+    const { filter, update, options } = data;
     model.findOne(filter, (err, doc) => {
       if (err) {
         console.log('[ERROR] dtUpdateOne - Failed to find document:', err);
@@ -157,28 +157,28 @@ const updateLocalDatabase = async ({ type, modelName, localDate, data }) => {
       const localUpdatedAt = doc && doc.updatedAt && new Date(doc.updatedAt);
       const isValidDate = localUpdatedAt instanceof Date && !isNaN(localUpdatedAt);
       if (!isValidDate || (localUpdatedAt < receivedUpdatedAt)) {
-        model.updateOne(filter, update, options, callback);
-        console.log('[INFO] Received localDate is newer than the one in the database, not updating.');
+        model.updateOne(filter, update, options).exec();
+        console.log('[INFO] Received localDate is newer than the one in the database, updating the database.');
         return;
       }
     });
   } else if (type === 'dtUpdateMany') {
-    const { filter, update, options, callback } = data;
-    model.updateMany(filter, update, options, callback);
+    const { filter, update, options } = data;
+    model.updateMany(filter, update, options).exec();
   } else if (type === 'dtReplaceOne') {
-    const { filter, replacement, options, callback } = data;
-    model.replaceOne(filter, replacement, options, callback);
+    const { filter, replacement, options } = data;
+    model.replaceOne(filter, replacement, options).exec();
   } else if (type === 'dtFindOneAndDelete') {
-    const { filter, options, callback } = data;
-    model.findOneAndDelete(filter, options, callback);
+    const { filter, options } = data;
+    model.findOneAndDelete(filter, options).exec();
   } else if (type === 'dtFindOneAndRemove') {
-    const { filter, options, callback } = data;
-    model.findOneAndRemove(filter, options, callback);
+    const { filter, options } = data;
+    model.findOneAndRemove(filter, options).exec();
   } else if (type === 'dtFindOneAndReplace') {
-    const { filter, replacement, options, callback } = data;
-    model.findOneAndReplace(filter, replacement, options, callback);
+    const { filter, replacement, options } = data;
+    model.findOneAndReplace(filter, replacement, options).exec();
   } else if (type === 'dtFindOneAndUpdate') {
-    const { filter, update, options, callback } = data;
+    const { filter, update, options } = data;
     model.findOne(filter, (err, doc) => {
       if (err) {
         console.log('[ERROR] dtFindOneAndUpdate - Failed to find document:', err);
@@ -189,31 +189,32 @@ const updateLocalDatabase = async ({ type, modelName, localDate, data }) => {
       const localUpdatedAt = doc && doc.updatedAt && new Date(doc.updatedAt);
       const isValidDate = localUpdatedAt instanceof Date && !isNaN(localUpdatedAt);
       if (!isValidDate || (localUpdatedAt < receivedUpdatedAt)) {
-        model.findOneAndUpdate(filter, update, options, callback);
-        console.log('[INFO] Received localDate is newer than the one in the database, not updating.');
+        model.findOneAndUpdate(filter, update, options).exec();
+        console.log('[INFO] Received localDate is newer than the one in the database, updating the database.');
         return;
       }
     });
   } else if (type === 'dtFindByIdAndDelete') {
-    const { id, options, callback } = data;
-    model.findByIdAndDelete(id, options, callback);
+    const { id, options } = data;
+    model.findByIdAndDelete(id, options).exec();
   } else if (type === 'dtFindByIdAndRemove') {
-    const { id, options, callback } = data;
-    model.findByIdAndRemove(id, options, callback);
+    const { id, options } = data;
+    model.findByIdAndRemove(id, options).exec();
   } else if (type === 'dtFindByIdAndUpdate') {
-    const { id, update, options, callback } = data;
-    model.findById(id, (err, doc) => {
+    const { id, update, options } = data;
+    model.findById(id._id, (err, doc) => {
       if (err) {
-        console.log('[ERROR] dtFindByIdAndUpdate - Failed to find document:', err);
+        console.log('[ERROR] dtFindByIdAndUpdate - Failed to find document:', id._id, err);
         return;
       }
+      console.log('[INFO] dtFindByIdAndUpdate - Found document:', id._id);
       // If received localDate is newer than the one in the database, update the database.
       const receivedUpdatedAt = new Date(localDate);
       const localUpdatedAt = doc && doc.updatedAt && new Date(doc.updatedAt);
       const isValidDate = localUpdatedAt instanceof Date && !isNaN(localUpdatedAt);
       if (!isValidDate || (localUpdatedAt < receivedUpdatedAt)) {
-        model.findByIdAndUpdate(id, update, options, callback);
-        console.log('[INFO] Received localDate is newer than the one in the database, not updating.');
+        model.findByIdAndUpdate(id._id, update, options).exec();
+        console.log('[INFO] Received localDate is newer than the one in the database, updating the database.');
         return;
       }
     });
diff --git a/lib/index.js b/lib/index.js
index de29ad4..a95b140 100644
--- a/lib/index.js
+++ b/lib/index.js
@@ -4,10 +4,12 @@ const mongoose = require('mongoose');
 
 const delayTolerantMongoose = mongoose;
 
+
 /// --------------------------------- ///
 /// ----- Configuration Methods ----- ///
 /// --------------------------------- ///
 
+
 /**
  * @description: Object with current DTN configuration.
  */
@@ -50,10 +52,12 @@ delayTolerantMongoose.configDtnAndStart = function (config) {
   this.initializeListener();
 };
 
+
 /// --------------------------------- ///
 /// ----- Aditional Information ----- ///
 /// --------------------------------- ///
 
+
 /**
  * @description: This is a list that contains all those bundles that were sent but that
  * were not received, or that are currently waiting for ack.
@@ -64,10 +68,12 @@ const bundlesWaitingInQueue = [];
 global.bundlesWaitingACK = bundlesWaitingACK;
 global.bundlesWaitingInQueue = bundlesWaitingInQueue;
 
+
 /// ---------------------- ///
 /// ----- Statistics ----- ///
 /// ---------------------- ///
 
+
 /**
  * Object with all available statistics.
  */
@@ -145,20 +151,28 @@ delayTolerantMongoose.getGeneralStats = function () {
 /// ----- DTN Variables ----- ///
 /// ------------------------- ///
 
+
 global.dtnNodeNetClient = null;
 
+
 /// ----------------------- ///
 /// ----- DTN Methods ----- ///
 /// ----------------------- ///
 
-delayTolerantMongoose.Model.dtCreate = async function (document) {
+delayTolerantMongoose.Model.dtCreate = async function (document, callback = null) {
   // Local Update
   const localUpdate = await this.create(document);
+
+  const documentWithId = {
+    ...document,
+    _id: localUpdate._id,
+  };
+
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtCreate',
-      data: document,
+      data: documentWithId,
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -166,11 +180,16 @@ delayTolerantMongoose.Model.dtCreate = async function (document) {
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   // Return the created document.
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtInsertMany = async function (documents) {
+delayTolerantMongoose.Model.dtInsertMany = async function (documents, callback = null) {
   // Local Update.
   const localUpdate = await this.insertMany(documents);
   // DTN Update.
@@ -185,17 +204,22 @@ delayTolerantMongoose.Model.dtInsertMany = async function (documents) {
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtDeleteOne = async function (filter = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtDeleteOne = async function (filter = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.deleteOne(filter, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtDeleteOne',
-      data: { filter, options, callback },
+      data: { filter, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -203,17 +227,22 @@ delayTolerantMongoose.Model.dtDeleteOne = async function (filter = {}, options =
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtDeleteMany = async function (filter = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtDeleteMany = async function (filter = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.deleteMany(filter, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtDeleteMany',
-      data: { filter, options, callback },
+      data: { filter, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -221,17 +250,22 @@ delayTolerantMongoose.Model.dtDeleteMany = async function (filter = {}, options
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtUpdateOne = async function (filter = {}, update = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtUpdateOne = async function (filter = {}, update = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.updateOne(filter, update, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtUpdateOne',
-      data: { filter, update, options, callback },
+      data: { filter, update, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -239,17 +273,22 @@ delayTolerantMongoose.Model.dtUpdateOne = async function (filter = {}, update =
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtUpdateMany = async function (filter = {}, update = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtUpdateMany = async function (filter = {}, update = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.updateMany(filter, update, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtUpdateMany',
-      data: { filter, update, options, callback },
+      data: { filter, update, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -257,17 +296,22 @@ delayTolerantMongoose.Model.dtUpdateMany = async function (filter = {}, update =
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtReplaceOne = async function (filter = {}, replacement = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtReplaceOne = async function (filter = {}, replacement = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.replaceOne(filter, replacement, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtReplaceOne',
-      data: { filter, replacement, options, callback },
+      data: { filter, replacement, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -275,17 +319,22 @@ delayTolerantMongoose.Model.dtReplaceOne = async function (filter = {}, replacem
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindOneAndDelete = async function (filter = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindOneAndDelete = async function (filter = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findOneAndDelete(filter, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindOneAndDelete',
-      data: { filter, options, callback },
+      data: { filter, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -293,17 +342,22 @@ delayTolerantMongoose.Model.dtFindOneAndDelete = async function (filter = {}, op
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindOneAndRemove = async function (filter = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindOneAndRemove = async function (filter = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findOneAndRemove(filter, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindOneAndRemove',
-      data: { filter, options, callback },
+      data: { filter, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -311,17 +365,22 @@ delayTolerantMongoose.Model.dtFindOneAndRemove = async function (filter = {}, op
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindOneAndReplace = async function (filter = {}, replacement = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindOneAndReplace = async function (filter = {}, replacement = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findOneAndReplace(filter, replacement, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindOneAndReplace',
-      data: { filter, replacement, options, callback },
+      data: { filter, replacement, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -329,17 +388,22 @@ delayTolerantMongoose.Model.dtFindOneAndReplace = async function (filter = {}, r
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindOneAndUpdate = async function (filter = {}, update = {}, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindOneAndUpdate = async function (filter = {}, update = {}, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findOneAndUpdate(filter, update, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindOneAndUpdate',
-      data: { filter, update, options, callback },
+      data: { filter, update, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -347,17 +411,22 @@ delayTolerantMongoose.Model.dtFindOneAndUpdate = async function (filter = {}, up
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindByIdAndDelete = async function (id, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindByIdAndDelete = async function (id, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findByIdAndDelete(id, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindByIdAndDelete',
-      data: { id, options, callback },
+      data: { id, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -365,17 +434,22 @@ delayTolerantMongoose.Model.dtFindByIdAndDelete = async function (id, options =
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindByIdAndRemove = async function (id, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindByIdAndRemove = async function (id, options = {}, callback = null) {
   // Local Update.
   const localUpdate = await this.findByIdAndRemove(id, options, callback);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindByIdAndRemove',
-      data: { id, options, callback },
+      data: { id, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -383,17 +457,22 @@ delayTolerantMongoose.Model.dtFindByIdAndRemove = async function (id, options =
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
-delayTolerantMongoose.Model.dtFindByIdAndUpdate = async function (id, update, options = {}, callback = () => {}) {
+delayTolerantMongoose.Model.dtFindByIdAndUpdate = async function (id, update, options = {}, callback = null) {
   // Local Update.
-  const localUpdate = await this.findByIdAndUpdate(id, update, options, callback);
+  const localUpdate = await this.findByIdAndUpdate(id, update, options);
   // DTN Update.
   await AAPForwarder({
     message: {
       type: 'dtFindByIdAndUpdate',
-      data: { id, update, options, callback },
+      data: { id, update, options },
       modelName: this.modelName,
       localDate: (new Date()).getTime(),
     },
@@ -401,6 +480,11 @@ delayTolerantMongoose.Model.dtFindByIdAndUpdate = async function (id, update, op
     dtnHost: delayTolerantMongoose.dtnConfig.DTN_HOST,
     dtnPort: delayTolerantMongoose.dtnConfig.DTN_PORT,
   });
+
+  if (callback) {
+    return callback(localUpdate);
+  }
+
   return localUpdate;
 };
 
diff --git a/package.json b/package.json
index 61a9b58..26dca7b 100644
--- a/package.json
+++ b/package.json
@@ -1,7 +1,7 @@
 {
   "name": "delay-tolerant-mongoose",
   "description": "A plug and play mongoose wrapper, that allows your app to work over DTNs (Delay Tolerant Networks).",
-  "version": "1.0.19",
+  "version": "1.0.20",
   "author": "Octavio Percivaldi <octavio.percivaldi@mi.unc.edu.ar> (https://github.com/octaviotastico/)",
   "license": "MIT",
   "keywords": [