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": [