instancify
This commit is contained in:
parent
a361a1c50e
commit
d14b83f3ef
19
MqttMongoNodejs.conf
Normal file
19
MqttMongoNodejs.conf
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
{
|
||||||
|
"brokerUrl": "mqtt://127.0.0.1:1883",
|
||||||
|
"brokerUser": "",
|
||||||
|
"brokerPass": "",
|
||||||
|
"brokerCa": "",
|
||||||
|
"mongoDbUrl": "mongodb://localhost/testdb",
|
||||||
|
"verbose": false,
|
||||||
|
"instances": [
|
||||||
|
{
|
||||||
|
"instanceId": "testInstance",
|
||||||
|
"collection": "testcollection",
|
||||||
|
"topics": [ "topic1", "topic2", "topic3" ],
|
||||||
|
"encapsulate": false,
|
||||||
|
"parsePayload": false
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
|
329
package-lock.json
generated
329
package-lock.json
generated
@ -10,24 +10,39 @@
|
|||||||
"integrity": "sha512-PMa4nkRhLaqwsXQDDTzGbTyCIpej0ERznyAP9fyuGnlsmUbcC4Y25mdqjibYjkOPNyK/BWWUKneruaKHcS3Q8g==",
|
"integrity": "sha512-PMa4nkRhLaqwsXQDDTzGbTyCIpej0ERznyAP9fyuGnlsmUbcC4Y25mdqjibYjkOPNyK/BWWUKneruaKHcS3Q8g==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "7.0.61"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"@types/command-line-args": {
|
||||||
|
"version": "5.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/command-line-args/-/command-line-args-5.0.0.tgz",
|
||||||
|
"integrity": "sha512-4eOPXyn5DmP64MCMF8ePDvdlvlzt2a+F8ZaVjqmh2yFCpGjc1kI3kGnCFYX9SCsGTjQcWIyVZ86IHCEyjy/MNg==",
|
||||||
|
"dev": true
|
||||||
|
},
|
||||||
"@types/events": {
|
"@types/events": {
|
||||||
"version": "1.2.0",
|
"version": "1.2.0",
|
||||||
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
|
||||||
"integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
|
"integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"@types/moment": {
|
||||||
|
"version": "2.13.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@types/moment/-/moment-2.13.0.tgz",
|
||||||
|
"integrity": "sha1-YE69GJvDvDShVIaJQE5hoqSqyJY=",
|
||||||
|
"dev": true,
|
||||||
|
"requires": {
|
||||||
|
"moment": "*"
|
||||||
|
}
|
||||||
|
},
|
||||||
"@types/mongodb": {
|
"@types/mongodb": {
|
||||||
"version": "2.2.20",
|
"version": "2.2.20",
|
||||||
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-2.2.20.tgz",
|
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-2.2.20.tgz",
|
||||||
"integrity": "sha512-EcsDWWppvtZ/C70+oDxYmbMNtckQ4dD4v60vI6HBamWuDNrblUEMvI6LDicpbE6Mpt6nhq/T7qzUOsy9cRgvYw==",
|
"integrity": "sha512-EcsDWWppvtZ/C70+oDxYmbMNtckQ4dD4v60vI6HBamWuDNrblUEMvI6LDicpbE6Mpt6nhq/T7qzUOsy9cRgvYw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/bson": "1.0.8",
|
"@types/bson": "*",
|
||||||
"@types/events": "1.2.0",
|
"@types/events": "*",
|
||||||
"@types/node": "7.0.61"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/mqtt": {
|
"@types/mqtt": {
|
||||||
@ -36,7 +51,7 @@
|
|||||||
"integrity": "sha1-eGV5AADMijEiQurZoOIJuiqmhtQ=",
|
"integrity": "sha1-eGV5AADMijEiQurZoOIJuiqmhtQ=",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"@types/node": "7.0.61"
|
"@types/node": "*"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"@types/node": {
|
"@types/node": {
|
||||||
@ -55,6 +70,23 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
|
||||||
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
|
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4="
|
||||||
},
|
},
|
||||||
|
"argv-tools": {
|
||||||
|
"version": "0.1.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/argv-tools/-/argv-tools-0.1.1.tgz",
|
||||||
|
"integrity": "sha512-Cc0dBvx4dvrjjKpyDA6w8RlNAw8Su30NvZbWl/Tv9ZALEVlLVkWQiHMi84Q0xNfpVuSaiQbYkdmWK8g1PLGhKw==",
|
||||||
|
"requires": {
|
||||||
|
"array-back": "^2.0.0",
|
||||||
|
"find-replace": "^2.0.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"array-back": {
|
||||||
|
"version": "2.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/array-back/-/array-back-2.0.0.tgz",
|
||||||
|
"integrity": "sha512-eJv4pLLufP3g5kcZry0j6WXpIbzYw9GUB4mVJZno9wfwiBxbizTnHCw3VJb07cBihbFX48Y7oSrW9y+gt4glyw==",
|
||||||
|
"requires": {
|
||||||
|
"typical": "^2.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"async-limiter": {
|
"async-limiter": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
|
||||||
@ -70,8 +102,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
|
"resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz",
|
||||||
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
|
"integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.3.5",
|
||||||
"safe-buffer": "5.1.2"
|
"safe-buffer": "^5.1.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"brace-expansion": {
|
"brace-expansion": {
|
||||||
@ -79,7 +111,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||||
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"balanced-match": "1.0.0",
|
"balanced-match": "^1.0.0",
|
||||||
"concat-map": "0.0.1"
|
"concat-map": "0.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -103,8 +135,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz",
|
||||||
"integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=",
|
"integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.1",
|
||||||
"readable-stream": "2.3.6"
|
"readable-stream": "> 1.0.0 < 3.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
@ -112,11 +144,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||||
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-styles": "2.2.1",
|
"ansi-styles": "^2.2.1",
|
||||||
"escape-string-regexp": "1.0.5",
|
"escape-string-regexp": "^1.0.2",
|
||||||
"has-ansi": "2.0.0",
|
"has-ansi": "^2.0.0",
|
||||||
"strip-ansi": "3.0.1",
|
"strip-ansi": "^3.0.0",
|
||||||
"supports-color": "2.0.0"
|
"supports-color": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"chalk-console": {
|
"chalk-console": {
|
||||||
@ -124,9 +156,21 @@
|
|||||||
"resolved": "https://registry.npmjs.org/chalk-console/-/chalk-console-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/chalk-console/-/chalk-console-1.0.1.tgz",
|
||||||
"integrity": "sha1-os8GLn+P+6TsAUzQqgcZfYVVgrw=",
|
"integrity": "sha1-os8GLn+P+6TsAUzQqgcZfYVVgrw=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"chalk": "1.1.3",
|
"chalk": "^1.0.0",
|
||||||
"date-utils": "1.2.21",
|
"date-utils": "^1.2.16",
|
||||||
"lodash": "3.10.1"
|
"lodash": "^3.7.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"command-line-args": {
|
||||||
|
"version": "5.0.2",
|
||||||
|
"resolved": "https://registry.npmjs.org/command-line-args/-/command-line-args-5.0.2.tgz",
|
||||||
|
"integrity": "sha512-/qPcbL8zpqg53x4rAaqMFlRV4opN3pbla7I7k9x8kyOBMQoGT6WltjN6sXZuxOXw6DgdK7Ad+ijYS5gjcr7vlA==",
|
||||||
|
"requires": {
|
||||||
|
"argv-tools": "^0.1.1",
|
||||||
|
"array-back": "^2.0.0",
|
||||||
|
"find-replace": "^2.0.1",
|
||||||
|
"lodash.camelcase": "^4.3.0",
|
||||||
|
"typical": "^2.6.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"commander": {
|
"commander": {
|
||||||
@ -139,8 +183,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/commist/-/commist-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/commist/-/commist-1.0.0.tgz",
|
||||||
"integrity": "sha1-wMNSUBz29S6RJOPvicmAbiAi6+8=",
|
"integrity": "sha1-wMNSUBz29S6RJOPvicmAbiAi6+8=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"leven": "1.0.2",
|
"leven": "^1.0.0",
|
||||||
"minimist": "1.2.0"
|
"minimist": "^1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"concat-map": {
|
"concat-map": {
|
||||||
@ -153,10 +197,10 @@
|
|||||||
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
"resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
|
||||||
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
"integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"buffer-from": "1.0.0",
|
"buffer-from": "^1.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.3",
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.2.2",
|
||||||
"typedarray": "0.0.6"
|
"typedarray": "^0.0.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"core-util-is": {
|
"core-util-is": {
|
||||||
@ -174,10 +218,10 @@
|
|||||||
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
|
"resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
|
||||||
"integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
|
"integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"end-of-stream": "1.4.1",
|
"end-of-stream": "^1.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.1",
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.0.0",
|
||||||
"stream-shift": "1.0.0"
|
"stream-shift": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"end-of-stream": {
|
"end-of-stream": {
|
||||||
@ -185,7 +229,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
|
||||||
"integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
|
"integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"once": "1.4.0"
|
"once": "^1.4.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"es6-promise": {
|
"es6-promise": {
|
||||||
@ -203,6 +247,15 @@
|
|||||||
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
|
||||||
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
|
"integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ="
|
||||||
},
|
},
|
||||||
|
"find-replace": {
|
||||||
|
"version": "2.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/find-replace/-/find-replace-2.0.1.tgz",
|
||||||
|
"integrity": "sha512-LzDo3Fpa30FLIBsh6DCDnMN1KW2g4QKkqKmejlImgWY67dDFPX/x9Kh/op/GK522DchQXEvDi/wD48HKW49XOQ==",
|
||||||
|
"requires": {
|
||||||
|
"array-back": "^2.0.0",
|
||||||
|
"test-value": "^3.0.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
"fs.realpath": {
|
"fs.realpath": {
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
|
||||||
@ -213,12 +266,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
|
||||||
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
|
"integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"fs.realpath": "1.0.0",
|
"fs.realpath": "^1.0.0",
|
||||||
"inflight": "1.0.6",
|
"inflight": "^1.0.4",
|
||||||
"inherits": "2.0.3",
|
"inherits": "2",
|
||||||
"minimatch": "3.0.4",
|
"minimatch": "^3.0.4",
|
||||||
"once": "1.4.0",
|
"once": "^1.3.0",
|
||||||
"path-is-absolute": "1.0.1"
|
"path-is-absolute": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"glob-parent": {
|
"glob-parent": {
|
||||||
@ -226,8 +279,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
|
||||||
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
|
"integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-glob": "3.1.0",
|
"is-glob": "^3.1.0",
|
||||||
"path-dirname": "1.0.2"
|
"path-dirname": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"glob-stream": {
|
"glob-stream": {
|
||||||
@ -235,16 +288,16 @@
|
|||||||
"resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz",
|
||||||
"integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
|
"integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"extend": "3.0.1",
|
"extend": "^3.0.0",
|
||||||
"glob": "7.1.2",
|
"glob": "^7.1.1",
|
||||||
"glob-parent": "3.1.0",
|
"glob-parent": "^3.1.0",
|
||||||
"is-negated-glob": "1.0.0",
|
"is-negated-glob": "^1.0.0",
|
||||||
"ordered-read-streams": "1.0.1",
|
"ordered-read-streams": "^1.0.0",
|
||||||
"pumpify": "1.4.0",
|
"pumpify": "^1.3.5",
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.1.5",
|
||||||
"remove-trailing-separator": "1.1.0",
|
"remove-trailing-separator": "^1.0.1",
|
||||||
"to-absolute-glob": "2.0.2",
|
"to-absolute-glob": "^2.0.0",
|
||||||
"unique-stream": "2.2.1"
|
"unique-stream": "^2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"has-ansi": {
|
"has-ansi": {
|
||||||
@ -252,7 +305,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
|
||||||
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
|
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-regex": "2.1.1"
|
"ansi-regex": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"help-me": {
|
"help-me": {
|
||||||
@ -260,10 +313,10 @@
|
|||||||
"resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz",
|
||||||
"integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=",
|
"integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"callback-stream": "1.1.0",
|
"callback-stream": "^1.0.2",
|
||||||
"glob-stream": "6.1.0",
|
"glob-stream": "^6.1.0",
|
||||||
"through2": "2.0.3",
|
"through2": "^2.0.1",
|
||||||
"xtend": "4.0.1"
|
"xtend": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"inflight": {
|
"inflight": {
|
||||||
@ -271,8 +324,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
|
||||||
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"once": "1.4.0",
|
"once": "^1.3.0",
|
||||||
"wrappy": "1.0.2"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"inherits": {
|
"inherits": {
|
||||||
@ -285,8 +338,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz",
|
||||||
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
|
"integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-relative": "1.0.0",
|
"is-relative": "^1.0.0",
|
||||||
"is-windows": "1.0.2"
|
"is-windows": "^1.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-extglob": {
|
"is-extglob": {
|
||||||
@ -299,7 +352,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
|
||||||
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
|
"integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-extglob": "2.1.1"
|
"is-extglob": "^2.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-negated-glob": {
|
"is-negated-glob": {
|
||||||
@ -312,7 +365,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz",
|
||||||
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
|
"integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-unc-path": "1.0.0"
|
"is-unc-path": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-unc-path": {
|
"is-unc-path": {
|
||||||
@ -320,7 +373,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz",
|
||||||
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
|
"integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"unc-path-regex": "0.1.2"
|
"unc-path-regex": "^0.1.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-windows": {
|
"is-windows": {
|
||||||
@ -338,7 +391,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz",
|
||||||
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
|
"integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"jsonify": "0.0.0"
|
"jsonify": "~0.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"jsonify": {
|
"jsonify": {
|
||||||
@ -356,12 +409,17 @@
|
|||||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
|
"resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz",
|
||||||
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
|
"integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y="
|
||||||
},
|
},
|
||||||
|
"lodash.camelcase": {
|
||||||
|
"version": "4.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz",
|
||||||
|
"integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY="
|
||||||
|
},
|
||||||
"minimatch": {
|
"minimatch": {
|
||||||
"version": "3.0.4",
|
"version": "3.0.4",
|
||||||
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
|
||||||
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
"integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"brace-expansion": "1.1.11"
|
"brace-expansion": "^1.1.7"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"minimist": {
|
"minimist": {
|
||||||
@ -369,6 +427,11 @@
|
|||||||
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
|
||||||
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
|
"integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ="
|
||||||
},
|
},
|
||||||
|
"moment": {
|
||||||
|
"version": "2.22.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
|
||||||
|
"integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ=="
|
||||||
|
},
|
||||||
"mongodb": {
|
"mongodb": {
|
||||||
"version": "2.2.35",
|
"version": "2.2.35",
|
||||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.35.tgz",
|
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-2.2.35.tgz",
|
||||||
@ -384,13 +447,13 @@
|
|||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.7.tgz",
|
||||||
"integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
|
"integrity": "sha1-BwV6y+JGeyIELTb5jFrVBwVOlbE=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"buffer-shims": "1.0.0",
|
"buffer-shims": "~1.0.0",
|
||||||
"core-util-is": "1.0.2",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "~2.0.1",
|
||||||
"isarray": "1.0.0",
|
"isarray": "~1.0.0",
|
||||||
"process-nextick-args": "1.0.7",
|
"process-nextick-args": "~1.0.6",
|
||||||
"string_decoder": "1.0.3",
|
"string_decoder": "~1.0.0",
|
||||||
"util-deprecate": "1.0.2"
|
"util-deprecate": "~1.0.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -400,8 +463,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.19.tgz",
|
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-2.1.19.tgz",
|
||||||
"integrity": "sha512-Jt4AtWUkpuW03kRdYGxga4O65O1UHlFfvvInslEfLlGi+zDMxbBe3J2NVmN9qPJ957Mn6Iz0UpMtV80cmxCVxw==",
|
"integrity": "sha512-Jt4AtWUkpuW03kRdYGxga4O65O1UHlFfvvInslEfLlGi+zDMxbBe3J2NVmN9qPJ957Mn6Iz0UpMtV80cmxCVxw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bson": "1.0.6",
|
"bson": "~1.0.4",
|
||||||
"require_optional": "1.0.1"
|
"require_optional": "~1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mqtt": {
|
"mqtt": {
|
||||||
@ -409,19 +472,19 @@
|
|||||||
"resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.17.0.tgz",
|
"resolved": "https://registry.npmjs.org/mqtt/-/mqtt-2.17.0.tgz",
|
||||||
"integrity": "sha512-eYeK5G/GQcdP/AOrGQMUULX7QvBXt3I9bfmgNkzMTsdSR1ywJQhK1iCYPrhh+rtRl3eUSJwEbO+oZx/Q51uHaw==",
|
"integrity": "sha512-eYeK5G/GQcdP/AOrGQMUULX7QvBXt3I9bfmgNkzMTsdSR1ywJQhK1iCYPrhh+rtRl3eUSJwEbO+oZx/Q51uHaw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"commist": "1.0.0",
|
"commist": "^1.0.0",
|
||||||
"concat-stream": "1.6.2",
|
"concat-stream": "^1.6.2",
|
||||||
"end-of-stream": "1.4.1",
|
"end-of-stream": "^1.4.1",
|
||||||
"help-me": "1.1.0",
|
"help-me": "^1.0.1",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.3",
|
||||||
"minimist": "1.2.0",
|
"minimist": "^1.2.0",
|
||||||
"mqtt-packet": "5.5.0",
|
"mqtt-packet": "^5.5.0",
|
||||||
"pump": "3.0.0",
|
"pump": "^3.0.0",
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.3.5",
|
||||||
"reinterval": "1.1.0",
|
"reinterval": "^1.1.0",
|
||||||
"split2": "2.2.0",
|
"split2": "^2.1.1",
|
||||||
"websocket-stream": "5.1.2",
|
"websocket-stream": "^5.1.2",
|
||||||
"xtend": "4.0.1"
|
"xtend": "^4.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mqtt-packet": {
|
"mqtt-packet": {
|
||||||
@ -429,10 +492,10 @@
|
|||||||
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.5.0.tgz",
|
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-5.5.0.tgz",
|
||||||
"integrity": "sha512-kR+Uw+r9rjUFSLZutmaAhjL4Y1asKLMTwE++PP0iuApJuc+zItE5v2LluQN2K3Pri5e2+K4V++QDjqGTgle/+A==",
|
"integrity": "sha512-kR+Uw+r9rjUFSLZutmaAhjL4Y1asKLMTwE++PP0iuApJuc+zItE5v2LluQN2K3Pri5e2+K4V++QDjqGTgle/+A==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"bl": "1.2.2",
|
"bl": "^1.2.1",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.3",
|
||||||
"process-nextick-args": "2.0.0",
|
"process-nextick-args": "^2.0.0",
|
||||||
"safe-buffer": "5.1.2"
|
"safe-buffer": "^5.1.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
@ -447,7 +510,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
|
||||||
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"wrappy": "1.0.2"
|
"wrappy": "1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"ordered-read-streams": {
|
"ordered-read-streams": {
|
||||||
@ -455,7 +518,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz",
|
||||||
"integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
|
"integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"readable-stream": "2.3.6"
|
"readable-stream": "^2.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"path-dirname": {
|
"path-dirname": {
|
||||||
@ -478,8 +541,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
|
||||||
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
"integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"end-of-stream": "1.4.1",
|
"end-of-stream": "^1.1.0",
|
||||||
"once": "1.4.0"
|
"once": "^1.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"pumpify": {
|
"pumpify": {
|
||||||
@ -487,9 +550,9 @@
|
|||||||
"resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
|
"resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.4.0.tgz",
|
||||||
"integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
|
"integrity": "sha512-2kmNR9ry+Pf45opRVirpNuIFotsxUGLaYqxIwuR77AYrYRMuFCz9eryHBS52L360O+NcR383CL4QYlMKPq4zYA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"duplexify": "3.5.4",
|
"duplexify": "^3.5.3",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.3",
|
||||||
"pump": "2.0.1"
|
"pump": "^2.0.0"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"pump": {
|
"pump": {
|
||||||
@ -497,8 +560,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz",
|
||||||
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
|
"integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"end-of-stream": "1.4.1",
|
"end-of-stream": "^1.1.0",
|
||||||
"once": "1.4.0"
|
"once": "^1.3.1"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -513,13 +576,13 @@
|
|||||||
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
|
||||||
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
"integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"core-util-is": "1.0.2",
|
"core-util-is": "~1.0.0",
|
||||||
"inherits": "2.0.3",
|
"inherits": "~2.0.3",
|
||||||
"isarray": "1.0.0",
|
"isarray": "~1.0.0",
|
||||||
"process-nextick-args": "2.0.0",
|
"process-nextick-args": "~2.0.0",
|
||||||
"safe-buffer": "5.1.2",
|
"safe-buffer": "~5.1.1",
|
||||||
"string_decoder": "1.1.1",
|
"string_decoder": "~1.1.1",
|
||||||
"util-deprecate": "1.0.2"
|
"util-deprecate": "~1.0.1"
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"process-nextick-args": {
|
"process-nextick-args": {
|
||||||
@ -532,7 +595,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
|
||||||
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
"integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"safe-buffer": "5.1.2"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -552,8 +615,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
|
||||||
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
|
"integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"resolve-from": "2.0.0",
|
"resolve-from": "^2.0.0",
|
||||||
"semver": "5.5.0"
|
"semver": "^5.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"resolve-from": {
|
"resolve-from": {
|
||||||
@ -576,7 +639,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz",
|
||||||
"integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
|
"integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"through2": "2.0.3"
|
"through2": "^2.0.2"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"stream-shift": {
|
"stream-shift": {
|
||||||
@ -589,7 +652,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz",
|
||||||
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
"integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"safe-buffer": "5.1.2"
|
"safe-buffer": "~5.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"strip-ansi": {
|
"strip-ansi": {
|
||||||
@ -597,7 +660,7 @@
|
|||||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"ansi-regex": "2.1.1"
|
"ansi-regex": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"supports-color": {
|
"supports-color": {
|
||||||
@ -605,13 +668,22 @@
|
|||||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||||
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
|
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc="
|
||||||
},
|
},
|
||||||
|
"test-value": {
|
||||||
|
"version": "3.0.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/test-value/-/test-value-3.0.0.tgz",
|
||||||
|
"integrity": "sha512-sVACdAWcZkSU9x7AOmJo5TqE+GyNJknHaHsMrR6ZnhjVlVN9Yx6FjHrsKZ3BjIpPCT68zYesPWkakrNupwfOTQ==",
|
||||||
|
"requires": {
|
||||||
|
"array-back": "^2.0.0",
|
||||||
|
"typical": "^2.6.1"
|
||||||
|
}
|
||||||
|
},
|
||||||
"through2": {
|
"through2": {
|
||||||
"version": "2.0.3",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
|
"resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
|
||||||
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
|
"integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.1.5",
|
||||||
"xtend": "4.0.1"
|
"xtend": "~4.0.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"through2-filter": {
|
"through2-filter": {
|
||||||
@ -619,8 +691,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
|
"resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
|
||||||
"integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
|
"integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"through2": "2.0.3",
|
"through2": "~2.0.0",
|
||||||
"xtend": "4.0.1"
|
"xtend": "~4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"to-absolute-glob": {
|
"to-absolute-glob": {
|
||||||
@ -628,8 +700,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz",
|
||||||
"integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
|
"integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"is-absolute": "1.0.0",
|
"is-absolute": "^1.0.0",
|
||||||
"is-negated-glob": "1.0.0"
|
"is-negated-glob": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"typedarray": {
|
"typedarray": {
|
||||||
@ -643,6 +715,11 @@
|
|||||||
"integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
|
"integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
|
"typical": {
|
||||||
|
"version": "2.6.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz",
|
||||||
|
"integrity": "sha1-XAgOXWYcu+OCWdLnCjxyU+hziB0="
|
||||||
|
},
|
||||||
"ultron": {
|
"ultron": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
|
||||||
@ -658,8 +735,8 @@
|
|||||||
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz",
|
||||||
"integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
|
"integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=",
|
||||||
"requires": {
|
"requires": {
|
||||||
"json-stable-stringify": "1.0.1",
|
"json-stable-stringify": "^1.0.0",
|
||||||
"through2-filter": "2.0.0"
|
"through2-filter": "^2.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"util-deprecate": {
|
"util-deprecate": {
|
||||||
@ -672,12 +749,12 @@
|
|||||||
"resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.1.2.tgz",
|
||||||
"integrity": "sha512-lchLOk435iDWs0jNuL+hiU14i3ERSrMA0IKSiJh7z6X/i4XNsutBZrtqu2CPOZuA4G/zabiqVAos0vW+S7GEVw==",
|
"integrity": "sha512-lchLOk435iDWs0jNuL+hiU14i3ERSrMA0IKSiJh7z6X/i4XNsutBZrtqu2CPOZuA4G/zabiqVAos0vW+S7GEVw==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"duplexify": "3.5.4",
|
"duplexify": "^3.5.1",
|
||||||
"inherits": "2.0.3",
|
"inherits": "^2.0.1",
|
||||||
"readable-stream": "2.3.6",
|
"readable-stream": "^2.3.3",
|
||||||
"safe-buffer": "5.1.2",
|
"safe-buffer": "^5.1.1",
|
||||||
"ws": "3.3.3",
|
"ws": "^3.2.0",
|
||||||
"xtend": "4.0.1"
|
"xtend": "^4.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"wrappy": {
|
"wrappy": {
|
||||||
@ -690,9 +767,9 @@
|
|||||||
"resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
|
"resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
|
||||||
"integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
|
"integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
|
||||||
"requires": {
|
"requires": {
|
||||||
"async-limiter": "1.0.0",
|
"async-limiter": "~1.0.0",
|
||||||
"safe-buffer": "5.1.2",
|
"safe-buffer": "~5.1.0",
|
||||||
"ultron": "1.1.1"
|
"ultron": "~1.1.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"xtend": {
|
"xtend": {
|
||||||
|
@ -15,6 +15,8 @@
|
|||||||
"url": "git@gitlab.com:wolutator/MqttMongoNodejs.git"
|
"url": "git@gitlab.com:wolutator/MqttMongoNodejs.git"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
|
"@types/command-line-args": "^5.0.0",
|
||||||
|
"@types/moment": "^2.13.0",
|
||||||
"@types/mongodb": "^2.2.0",
|
"@types/mongodb": "^2.2.0",
|
||||||
"@types/mqtt": "0.0.34",
|
"@types/mqtt": "0.0.34",
|
||||||
"@types/node": "^7.0.14",
|
"@types/node": "^7.0.14",
|
||||||
@ -22,7 +24,9 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"chalk-console": "^1.0.1",
|
"chalk-console": "^1.0.1",
|
||||||
|
"command-line-args": "^5.0.2",
|
||||||
"commander": "^2.15.1",
|
"commander": "^2.15.1",
|
||||||
|
"moment": "^2.22.1",
|
||||||
"mongodb": "^2.2.26",
|
"mongodb": "^2.2.26",
|
||||||
"mqtt": "^2.6.2",
|
"mqtt": "^2.6.2",
|
||||||
"queuejs": "^0.1.0",
|
"queuejs": "^0.1.0",
|
||||||
|
147
src/MqttMongo.ts
Normal file
147
src/MqttMongo.ts
Normal file
@ -0,0 +1,147 @@
|
|||||||
|
import * as Mqtt from 'mqtt'
|
||||||
|
import * as Mongo from 'mongodb'
|
||||||
|
import * as Events from 'events'
|
||||||
|
import * as Queue from './queue'
|
||||||
|
import * as MqttMessage from './mqtt_message'
|
||||||
|
import * as logger from './log'
|
||||||
|
|
||||||
|
|
||||||
|
export default class MqttMongo extends Events.EventEmitter {
|
||||||
|
|
||||||
|
private options : any
|
||||||
|
private msgCnt : number = 0
|
||||||
|
private startTime: Date
|
||||||
|
|
||||||
|
constructor(options : any) {
|
||||||
|
super()
|
||||||
|
this.options = options
|
||||||
|
this.startTime = new Date()
|
||||||
|
this.on('reconnectDatabase', this.connectToDatabase)
|
||||||
|
}
|
||||||
|
|
||||||
|
private dbHandle : Mongo.Db;
|
||||||
|
private dbReady : boolean = false;
|
||||||
|
private queue : Queue.Queue<MqttMessage.MqttMessage> = new Queue.Queue<MqttMessage.MqttMessage>()
|
||||||
|
private mqttClient : Mqtt.Client
|
||||||
|
private heartbeatTimer : NodeJS.Timer
|
||||||
|
|
||||||
|
logerror(msg: string) {
|
||||||
|
logger.error(`${this.options.instanceId}: ${msg}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
logwarn(msg: string) {
|
||||||
|
logger.warn(`${this.options.instanceId}: ${msg}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
loginfo(msg: string) {
|
||||||
|
logger.info(`${this.options.instanceId}: ${msg}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
connectToDatabase() {
|
||||||
|
this.loginfo("About to connect to database")
|
||||||
|
Mongo.MongoClient.connect(this.options.database)
|
||||||
|
.then(
|
||||||
|
(tmpDbHandle: Mongo.Db) => {
|
||||||
|
this.dbHandle = tmpDbHandle
|
||||||
|
this.dbReady = true;
|
||||||
|
this.loginfo("Database connected")
|
||||||
|
this.dbHandle.on('reconnectFailed', (err : any) => { this.logwarn(`Error on database ${err}`) })
|
||||||
|
this.dbHandle.on('reconnect', () => {
|
||||||
|
this.loginfo("Reconnect on database")
|
||||||
|
this.dbReady = true
|
||||||
|
this.queue.knock()
|
||||||
|
})
|
||||||
|
this.dbHandle.on('timeout', () => { this.logwarn("Timeout on database") })
|
||||||
|
this.dbHandle.on('close', () => {
|
||||||
|
this.loginfo("Close on database")
|
||||||
|
this.dbReady = false
|
||||||
|
})
|
||||||
|
},
|
||||||
|
(err: String) => {
|
||||||
|
this.logerror(`Unable to connect to database: ${err}`)
|
||||||
|
this.dbReady = false
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
connectToBroker() {
|
||||||
|
this.queue.on('data', () => {
|
||||||
|
if (this.dbReady || true) {
|
||||||
|
while (! this.queue.isEmpty()) {
|
||||||
|
let msg : MqttMessage.MqttMessage = this.queue.deq()
|
||||||
|
if (this.options.verbose) {
|
||||||
|
this.loginfo(`Something in the queue: ${JSON.stringify(msg)}`)
|
||||||
|
}
|
||||||
|
let coll = this.dbHandle.collection(this.options.collection)
|
||||||
|
coll.insertOne(msg.getMessage())
|
||||||
|
.then(
|
||||||
|
(r) => {
|
||||||
|
if (this.options.verbose) {
|
||||||
|
this.loginfo(`Successfully inserted into database ${JSON.stringify(msg.getMessage())}`)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
(err) => {
|
||||||
|
this.logerror(`Error when trying to insert into database ${err}`)
|
||||||
|
if (! this.dbReady) {
|
||||||
|
this.loginfo("Error occured while database connection is lost, re-enqueue msg.")
|
||||||
|
this.queue.reenq(msg)
|
||||||
|
this.emit('reconnectDatabase')
|
||||||
|
} else {
|
||||||
|
this.logerror(`Message ${JSON.stringify(msg.getMessage())} is lost`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// this.loginfo("Database currently not available, not reading from stream")
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
this.mqttClient = Mqtt.connect(this.options.broker)
|
||||||
|
this.mqttClient.on('offline', () => { console.warn("MQTT client is offline") })
|
||||||
|
this.mqttClient.on('reconnect', () => { console.warn("MQTT client is reconnecting") })
|
||||||
|
this.mqttClient.on('close', () => { console.warn("MQTT connection closed") })
|
||||||
|
|
||||||
|
this.mqttClient.on('connect', () => {
|
||||||
|
this.loginfo("MQTT broker connected")
|
||||||
|
this.options.topics.forEach((topic: string) => {
|
||||||
|
this.mqttClient.subscribe(topic)
|
||||||
|
this.loginfo(`Subscribed to ${topic}`)
|
||||||
|
})
|
||||||
|
this.mqttClient.publish(`MqttMongo/Status/${this.options.instanceId}`, 'hello, started up')
|
||||||
|
})
|
||||||
|
|
||||||
|
this.mqttClient.on('message', (topic : string, messageBuf : Buffer) => {
|
||||||
|
this.msgCnt++;
|
||||||
|
let message = messageBuf.toString('UTF-8')
|
||||||
|
if (this.options.verbose) {
|
||||||
|
this.loginfo(`Message received ${this.msgCnt}, topic ${topic}, payload ${message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
this.queue.enq(new MqttMessage.MqttMessage(topic, message, this.options.encapsulate, this.options.parsePayload))
|
||||||
|
} catch (e) {
|
||||||
|
this.logerror(`Error while parsing Mqtt message, topic '${topic}', message '${message}' , ${e.toString()}`)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
setupHeartbeat() {
|
||||||
|
this.heartbeatTimer = setInterval(() => {
|
||||||
|
let uptime : number = (new Date().getTime() - this.startTime.getTime()) / 1000
|
||||||
|
let statusMsg = `{'Uptime': ${uptime}, 'MessageCount': ${this.msgCnt}}`
|
||||||
|
this.mqttClient.publish(`MqttMongo/Status/${this.options.instanceId}`, statusMsg)
|
||||||
|
this.loginfo(`Status: ${statusMsg}`)
|
||||||
|
if (! this.dbReady) {
|
||||||
|
this.emit("reconnectDatabase")
|
||||||
|
}
|
||||||
|
}, 60000)
|
||||||
|
this.loginfo("Heartbeat timer started")
|
||||||
|
}
|
||||||
|
|
||||||
|
exec() : void {
|
||||||
|
this.connectToDatabase()
|
||||||
|
this.connectToBroker()
|
||||||
|
this.setupHeartbeat()
|
||||||
|
}
|
||||||
|
}
|
19
src/config.ts
Normal file
19
src/config.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import * as fs from 'fs'
|
||||||
|
import * as cmdargs from 'command-line-args'
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const OPTION_DEFINITIONS = [
|
||||||
|
{ name: 'verbose', alias: 'v', type: Boolean },
|
||||||
|
{ name: 'config', alias: 'c', type: String, defaultValue: '~/MqttMongoNodejs.conf' }
|
||||||
|
];
|
||||||
|
|
||||||
|
|
||||||
|
export let dict : any
|
||||||
|
|
||||||
|
export function readConfig() {
|
||||||
|
let options = cmdargs(OPTION_DEFINITIONS)
|
||||||
|
dict = JSON.parse(fs.readFileSync(options.config, "utf8"))
|
||||||
|
}
|
||||||
|
|
||||||
|
readConfig()
|
52
src/log.ts
Normal file
52
src/log.ts
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
import * as moment from 'moment'
|
||||||
|
import * as config from './config'
|
||||||
|
|
||||||
|
|
||||||
|
enum Level {
|
||||||
|
All,
|
||||||
|
NoDebug,
|
||||||
|
NoDebugNoInfo,
|
||||||
|
NoDebugNoInfoNoWarning
|
||||||
|
}
|
||||||
|
|
||||||
|
var level = Level.NoDebug
|
||||||
|
|
||||||
|
function timestamp(): string {
|
||||||
|
return moment().format('HH:mm:ss.SSS')
|
||||||
|
}
|
||||||
|
|
||||||
|
export function setLevel(value: string): void {
|
||||||
|
switch (value) {
|
||||||
|
case 'info': level = Level.NoDebug; break
|
||||||
|
case 'warn': level = Level.NoDebugNoInfo; break
|
||||||
|
case 'error': level = Level.NoDebugNoInfoNoWarning; break
|
||||||
|
default: level = Level.All
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function info(message: string): void {
|
||||||
|
if (level < Level.NoDebugNoInfo) {
|
||||||
|
console.log(`${timestamp()} [ II ] ${message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function warn(message: string): void {
|
||||||
|
if (level < Level.NoDebugNoInfoNoWarning) {
|
||||||
|
console.log(`${timestamp()} [ WW ] ${message}`)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function error(message: string): void {
|
||||||
|
console.log(`${timestamp()} [ EE ] ${message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function success(message: string): void {
|
||||||
|
console.log(`${timestamp()} [ OK ] ${message}`)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function debug(message: string): void {
|
||||||
|
if (level < Level.NoDebug) {
|
||||||
|
console.log(`${timestamp()} [ DB ] ${message}`)
|
||||||
|
}
|
||||||
|
}
|
187
src/main.ts
187
src/main.ts
@ -1,173 +1,32 @@
|
|||||||
import * as Mqtt from 'mqtt'
|
import * as log from './log'
|
||||||
import * as Mongo from 'mongodb'
|
import * as config from './config'
|
||||||
import * as Events from 'events'
|
import MqttMongo from './MqttMongo'
|
||||||
import * as Queue from './queue'
|
|
||||||
import * as MqttMessage from './mqtt_message'
|
|
||||||
|
|
||||||
|
|
||||||
let console = require('chalk-console')
|
|
||||||
|
|
||||||
|
let instances : MqttMongo[] = []
|
||||||
|
|
||||||
const MQTT_BROKER_URL : String = 'mqtt://localhost'
|
config.dict.instances.forEach((v: any) => {
|
||||||
const MONGO_DATABASE_URL : String = 'mongodb://localhost/test'
|
let options : any = {
|
||||||
const COLLECTION : String = 'mqttMongo'
|
brokerUrl: config.dict.brokerUrl,
|
||||||
|
brokerUser: config.dict.brokerUser,
|
||||||
|
brokerPass: config.dict.brokerPass,
|
||||||
function collect(val: string, memo: string[]) {
|
brokerCa: config.dict.brokerCa,
|
||||||
memo.push(val);
|
mongodbUrl: config.dict.mongodbUrl,
|
||||||
return memo;
|
verbose: config.dict.verbose,
|
||||||
}
|
instanceId: v.instanceId,
|
||||||
|
collection: v.collection,
|
||||||
import options = require('commander')
|
topics: v.topics,
|
||||||
options
|
encapsulate : v.encapsulate,
|
||||||
.version('0.0.1')
|
parsePayload : v.parsePayload
|
||||||
.option('-b, --broker [broker url]', 'Broker URL', MQTT_BROKER_URL)
|
|
||||||
.option('-m, --database [database url]', 'MongoDB Database URL', MONGO_DATABASE_URL)
|
|
||||||
.option('-c, --collection [mongodb collection]', 'Collection in MongoDB Database', COLLECTION)
|
|
||||||
.option('-t, --topic [topic to subscribe]', 'Topic to subscribe, can appear multiple times', collect, [])
|
|
||||||
.option('-e, --encapsulate', 'store current timestamp, topic and payload in document', false)
|
|
||||||
.option('-p, --parsePayload', 'parse payload when encapsulating (otherwise always)', false)
|
|
||||||
.option('-v, --verbose', 'log all inserted messages', false)
|
|
||||||
.parse(process.argv)
|
|
||||||
|
|
||||||
|
|
||||||
class MqttMongo extends Events.EventEmitter {
|
|
||||||
|
|
||||||
private options : any
|
|
||||||
private msgCnt : number = 0
|
|
||||||
private startTime: Date
|
|
||||||
|
|
||||||
constructor(options : any) {
|
|
||||||
super()
|
|
||||||
this.options = options
|
|
||||||
this.startTime = new Date()
|
|
||||||
this.on('reconnectDatabase', this.connectToDatabase)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private dbHandle : Mongo.Db;
|
log.info(JSON.stringify(options))
|
||||||
private dbReady : boolean = false;
|
|
||||||
private queue : Queue.Queue<MqttMessage.MqttMessage> = new Queue.Queue<MqttMessage.MqttMessage>()
|
|
||||||
private mqttClient : Mqtt.Client
|
|
||||||
private heartbeatTimer : NodeJS.Timer
|
|
||||||
|
|
||||||
connectToDatabase() {
|
let instance : MqttMongo = new MqttMongo(options)
|
||||||
console.info("About to connect to database")
|
instance.exec()
|
||||||
Mongo.MongoClient.connect(this.options.database)
|
instances.push(instance)
|
||||||
.then(
|
})
|
||||||
(tmpDbHandle: Mongo.Db) => {
|
|
||||||
this.dbHandle = tmpDbHandle
|
|
||||||
this.dbReady = true;
|
|
||||||
console.info("Database connected")
|
|
||||||
this.dbHandle.on('reconnectFailed', (err : any) => { console.warn(`Error on database ${err}`) })
|
|
||||||
this.dbHandle.on('reconnect', () => {
|
|
||||||
console.info("Reconnect on database")
|
|
||||||
this.dbReady = true
|
|
||||||
this.queue.knock()
|
|
||||||
})
|
|
||||||
this.dbHandle.on('timeout', () => { console.warn("Timeout on database") })
|
|
||||||
this.dbHandle.on('close', () => {
|
|
||||||
console.info("Close on database")
|
|
||||||
this.dbReady = false
|
|
||||||
})
|
|
||||||
},
|
|
||||||
(err: String) => {
|
|
||||||
console.error(`Unable to connect to database: ${err}`)
|
|
||||||
this.dbReady = false
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
connectToBroker() {
|
|
||||||
this.queue.on('data', () => {
|
|
||||||
if (this.dbReady || true) {
|
|
||||||
while (! this.queue.isEmpty()) {
|
|
||||||
let msg : MqttMessage.MqttMessage = this.queue.deq()
|
|
||||||
if (this.options.verbose) {
|
|
||||||
console.info(`Something in the queue: ${JSON.stringify(msg)}`)
|
|
||||||
}
|
|
||||||
let coll = this.dbHandle.collection(this.options.collection)
|
|
||||||
coll.insertOne(msg.getMessage())
|
|
||||||
.then(
|
|
||||||
(r) => {
|
|
||||||
if (this.options.verbose) {
|
|
||||||
console.success(`Successfully inserted into database ${JSON.stringify(msg.getMessage())}`)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
(err) => {
|
|
||||||
console.error(`Error when trying to insert into database ${err}`)
|
|
||||||
if (! this.dbReady) {
|
|
||||||
console.info("Error occured while database connection is lost, re-enqueue msg.")
|
|
||||||
this.queue.reenq(msg)
|
|
||||||
this.emit('reconnectDatabase')
|
|
||||||
} else {
|
|
||||||
console.error(`Message ${JSON.stringify(msg.getMessage())} is lost`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// console.info("Database currently not available, not reading from stream")
|
|
||||||
}
|
|
||||||
})
|
|
||||||
|
|
||||||
this.mqttClient = Mqtt.connect(this.options.broker)
|
log.info("MqttMongoNodejs started")
|
||||||
this.mqttClient.on('offline', () => { console.warn("MQTT client is offline") })
|
|
||||||
this.mqttClient.on('reconnect', () => { console.warn("MQTT client is reconnecting") })
|
|
||||||
this.mqttClient.on('close', () => { console.warn("MQTT connection closed") })
|
|
||||||
|
|
||||||
this.mqttClient.on('connect', () => {
|
|
||||||
console.info("MQTT broker connected")
|
|
||||||
this.options.topic.forEach((topic: string) => {
|
|
||||||
this.mqttClient.subscribe(topic)
|
|
||||||
console.info(`Subscribed to ${topic}`)
|
|
||||||
})
|
|
||||||
this.mqttClient.subscribe('MqttMongo/Command')
|
|
||||||
this.mqttClient.publish('MqttMongo/Status', 'hello, started up')
|
|
||||||
})
|
|
||||||
|
|
||||||
this.mqttClient.on('message', (topic : string, messageBuf : Buffer) => {
|
|
||||||
this.msgCnt++;
|
|
||||||
let message = messageBuf.toString('UTF-8')
|
|
||||||
if (this.options.verbose) {
|
|
||||||
console.info(`Message received ${this.msgCnt}, topic ${topic}, payload ${message}`)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (topic == "MqttMongo/Command" && message == "shutdown") {
|
|
||||||
this.shutdown()
|
|
||||||
} else {
|
|
||||||
try {
|
|
||||||
this.queue.enq(new MqttMessage.MqttMessage(topic, message, this.options.encapsulate, this.options.parsePayload))
|
|
||||||
} catch (e) {
|
|
||||||
console.error(`Error while parsing Mqtt message, topic '${topic}', message '${message}' , ${e.toString()}`)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
setupHeartbeat() {
|
|
||||||
this.heartbeatTimer = setInterval(() => {
|
|
||||||
let uptime : number = (new Date().getTime() - this.startTime.getTime()) / 1000
|
|
||||||
let statusMsg = `{'Uptime': ${uptime}, 'MessageCount': ${this.msgCnt}}`
|
|
||||||
this.mqttClient.publish('MqttMongo/Status', statusMsg)
|
|
||||||
console.info(`Status: ${statusMsg}`)
|
|
||||||
if (! this.dbReady) {
|
|
||||||
this.emit("reconnectDatabase")
|
|
||||||
}
|
|
||||||
}, 60000)
|
|
||||||
console.info("Heartbeat timer started")
|
|
||||||
}
|
|
||||||
|
|
||||||
shutdown() {
|
|
||||||
console.info("Shutting down MqttMongo")
|
|
||||||
clearInterval(this.heartbeatTimer)
|
|
||||||
this.mqttClient.end()
|
|
||||||
this.dbHandle.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let mqttMongo : MqttMongo = new MqttMongo(options)
|
|
||||||
mqttMongo.connectToDatabase()
|
|
||||||
mqttMongo.connectToBroker()
|
|
||||||
mqttMongo.setupHeartbeat()
|
|
||||||
|
|
||||||
console.info("MqttMongo started")
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user