├── .env.example ├── .gitignore ├── README.md ├── app.js ├── demo └── demo-sendotp.html ├── logger.js ├── mqtt.js ├── otp.js ├── package-lock.json ├── package.json ├── redis.js └── server.js /.env.example: -------------------------------------------------------------------------------- 1 | MQTT_URL=mqtt:// 2 | PORT= 3 | REDIS_URL=redis:// -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .env -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # api-sms-gateway-mqtt 2 | 3 | This repostiory included [implementation](https://github.com/2pai/ooceans) of these design pattern and POC of One time password services. 4 | 5 | ![image](https://user-images.githubusercontent.com/22183588/86217031-18e8d280-bba9-11ea-9f45-df718a82fc40.png) 6 | 7 | 8 | ### How to Run 9 | 10 | ##### Clone this repostiory 11 | 12 | ``` 13 | git clone https://github.com/2pai/api-sms-gateway-mqtt 14 | ``` 15 | ##### Install the package 16 | ``` 17 | npm install 18 | ``` 19 | 20 | ##### Export .env and fill the variable 21 | ``` 22 | cp .env.example .env 23 | ``` 24 | 25 | ##### Run 26 | ``` 27 | npm start 28 | ``` -------------------------------------------------------------------------------- /app.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | 3 | const s = require('./server') 4 | const mqtt = require('./mqtt') 5 | const server = new s() 6 | const redis = require('./redis') 7 | 8 | server.init(process.env.PORT || 9002, () => { 9 | mqtt.init() 10 | redis.init() 11 | }) 12 | -------------------------------------------------------------------------------- /demo/demo-sendotp.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Demo Send OTP 7 | 8 | 9 | 10 |
11 |
12 |

Demo Send OTP

13 |
14 |
15 |
16 | 17 |
18 |
19 | 20 |
21 |
22 |
23 |
24 |
25 |
26 | 27 |
28 |
29 | 30 |
31 |
32 |
33 |
 34 |                         
35 | 36 |
37 |
38 |
39 |
40 | 41 | 42 | -------------------------------------------------------------------------------- /logger.js: -------------------------------------------------------------------------------- 1 | const winston = require('winston') 2 | 3 | const logger = winston.createLogger({ 4 | format: winston.format.combine( 5 | winston.format.timestamp({ format: 'YYYY-MM-DD HH:mm:ss' }), 6 | winston.format.json() 7 | ), 8 | transports: [ 9 | new winston.transports.Console({ 10 | level: 'info', 11 | handleExceptions: true, 12 | json: false 13 | }) 14 | ], 15 | exitOnError: false 16 | }) 17 | 18 | const info = (context, desc) => { 19 | const object = { 20 | context, 21 | message: desc.toString() 22 | } 23 | logger.info(object) 24 | } 25 | 26 | const error = (context, desc) => { 27 | const object = { 28 | context, 29 | message: desc.toString() 30 | } 31 | logger.error(object) 32 | } 33 | 34 | module.exports = { 35 | info, 36 | error 37 | } 38 | -------------------------------------------------------------------------------- /mqtt.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const mqtt = require('mqtt') 3 | const logger = require('./logger') 4 | const { json } = require('body-parser') 5 | const client = mqtt.connect(process.env.MQTT_URL) 6 | const init = () => { 7 | client.on('connect', () => { 8 | subscribe('2pai-dev/report') 9 | logger.info('mqtt-init', 'MQTT connected') 10 | }) 11 | } 12 | 13 | const publish = (topic, msg) => { 14 | client.publish(topic, msg.toString(), { qos: 0 }, (err) => { 15 | if (err) logger.error('mqtt-publish', JSON.stringify(err)) 16 | else logger.info('mqtt-publish', 'message published to ' + topic) 17 | }) 18 | } 19 | 20 | const subscribe = (topic) => { 21 | client.subscribe(topic, { qos: 0 }, (err) => { 22 | if (err) logger.error('mqtt-subscribe', JSON.stringify(err)) 23 | else logger.info('mqtt-subscribe', 'success subscribe to ' + topic) 24 | }) 25 | } 26 | 27 | 28 | client.on('message', (topic, message) => { 29 | 30 | logger.info('mqtt-message', JSON.stringify({topic:topic,payload:message.toString()})) 31 | }) 32 | 33 | module.exports = { 34 | init, 35 | publish, 36 | subscribe 37 | } -------------------------------------------------------------------------------- /otp.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const mqtt = require('./mqtt') 3 | const redis = require('./redis') 4 | const { v4:uuid4 } = require('uuid'); 5 | const logger = require('./logger') 6 | 7 | const requestOTP = (req,res) => { 8 | const {PORT} = process.env 9 | const {phoneNumber} = req.body; 10 | if(phoneNumber == '' || phoneNumber == undefined){ 11 | res.send(JSON.stringify({ok:0,message:"Payload cannot be null"})) 12 | return 13 | } 14 | const otp = Math.floor(1000 + Math.random() * 9000); 15 | const id = uuid4() 16 | const payload = JSON.stringify({id:id,phoneNumber:phoneNumber,otp:otp,message:`OTP Code = ${otp}`}) 17 | redis.set(id,payload,60) 18 | mqtt.publish('2pai-dev/pulsa',payload) 19 | logger.info('request-otp',payload); 20 | res.send(JSON.stringify({ok:1,message:"OK",next:`http://${req.hostname}:${PORT}/verifyOtp/${id}`})) 21 | } 22 | 23 | const verifyOTP = (req,res) => { 24 | const {otpCode} = req.body; 25 | const {id} = req.params; 26 | if(otpCode == '' || otpCode == undefined){ 27 | res.send(JSON.stringify({ok:0,message:"Payload cannot be null"})) 28 | return 29 | } 30 | redis.client.get(id,(err,data) => { 31 | if(data){ 32 | let parsed = JSON.parse(data); 33 | if (parsed.otp == otpCode){ 34 | res.send(JSON.stringify({ok:1,message:"OTP VALID"})) 35 | }else{ 36 | res.send(JSON.stringify({ok:0,message:"OTP Invlaid"})) 37 | } 38 | }else{ 39 | res.send(JSON.stringify({ok:0,message:"Error!"})) 40 | } 41 | }) 42 | 43 | } 44 | module.exports = { 45 | requestOTP, 46 | verifyOTP 47 | } -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sms-mqtt-rest", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@dabh/diagnostics": { 8 | "version": "2.0.2", 9 | "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.2.tgz", 10 | "integrity": "sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q==", 11 | "requires": { 12 | "colorspace": "1.1.x", 13 | "enabled": "2.0.x", 14 | "kuler": "^2.0.0" 15 | } 16 | }, 17 | "accepts": { 18 | "version": "1.3.7", 19 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 20 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 21 | "requires": { 22 | "mime-types": "~2.1.24", 23 | "negotiator": "0.6.2" 24 | } 25 | }, 26 | "array-flatten": { 27 | "version": "1.1.1", 28 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 29 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 30 | }, 31 | "async": { 32 | "version": "3.2.0", 33 | "resolved": "https://registry.npmjs.org/async/-/async-3.2.0.tgz", 34 | "integrity": "sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw==" 35 | }, 36 | "async-limiter": { 37 | "version": "1.0.1", 38 | "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", 39 | "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==" 40 | }, 41 | "balanced-match": { 42 | "version": "1.0.0", 43 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 44 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 45 | }, 46 | "base64-js": { 47 | "version": "1.3.1", 48 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz", 49 | "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==" 50 | }, 51 | "bl": { 52 | "version": "1.2.2", 53 | "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.2.tgz", 54 | "integrity": "sha512-e8tQYnZodmebYDWGH7KMRvtzKXaJHx3BbilrgZCfvyLUYdKpK1t5PSPmpkny/SgiTSCnjfLW7v5rlONXVFkQEA==", 55 | "requires": { 56 | "readable-stream": "^2.3.5", 57 | "safe-buffer": "^5.1.1" 58 | } 59 | }, 60 | "body-parser": { 61 | "version": "1.19.0", 62 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 63 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 64 | "requires": { 65 | "bytes": "3.1.0", 66 | "content-type": "~1.0.4", 67 | "debug": "2.6.9", 68 | "depd": "~1.1.2", 69 | "http-errors": "1.7.2", 70 | "iconv-lite": "0.4.24", 71 | "on-finished": "~2.3.0", 72 | "qs": "6.7.0", 73 | "raw-body": "2.4.0", 74 | "type-is": "~1.6.17" 75 | } 76 | }, 77 | "brace-expansion": { 78 | "version": "1.1.11", 79 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 80 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 81 | "requires": { 82 | "balanced-match": "^1.0.0", 83 | "concat-map": "0.0.1" 84 | } 85 | }, 86 | "buffer-from": { 87 | "version": "1.1.1", 88 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 89 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 90 | }, 91 | "bytes": { 92 | "version": "3.1.0", 93 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 94 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 95 | }, 96 | "callback-stream": { 97 | "version": "1.1.0", 98 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 99 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 100 | "requires": { 101 | "inherits": "^2.0.1", 102 | "readable-stream": "> 1.0.0 < 3.0.0" 103 | } 104 | }, 105 | "color": { 106 | "version": "3.0.0", 107 | "resolved": "https://registry.npmjs.org/color/-/color-3.0.0.tgz", 108 | "integrity": "sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w==", 109 | "requires": { 110 | "color-convert": "^1.9.1", 111 | "color-string": "^1.5.2" 112 | } 113 | }, 114 | "color-convert": { 115 | "version": "1.9.3", 116 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 117 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 118 | "requires": { 119 | "color-name": "1.1.3" 120 | } 121 | }, 122 | "color-name": { 123 | "version": "1.1.3", 124 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 125 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" 126 | }, 127 | "color-string": { 128 | "version": "1.5.3", 129 | "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz", 130 | "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==", 131 | "requires": { 132 | "color-name": "^1.0.0", 133 | "simple-swizzle": "^0.2.2" 134 | } 135 | }, 136 | "colors": { 137 | "version": "1.4.0", 138 | "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", 139 | "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==" 140 | }, 141 | "colorspace": { 142 | "version": "1.1.2", 143 | "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.2.tgz", 144 | "integrity": "sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ==", 145 | "requires": { 146 | "color": "3.0.x", 147 | "text-hex": "1.0.x" 148 | } 149 | }, 150 | "commist": { 151 | "version": "1.1.0", 152 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 153 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 154 | "requires": { 155 | "leven": "^2.1.0", 156 | "minimist": "^1.1.0" 157 | } 158 | }, 159 | "concat-map": { 160 | "version": "0.0.1", 161 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 162 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 163 | }, 164 | "concat-stream": { 165 | "version": "1.6.2", 166 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 167 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 168 | "requires": { 169 | "buffer-from": "^1.0.0", 170 | "inherits": "^2.0.3", 171 | "readable-stream": "^2.2.2", 172 | "typedarray": "^0.0.6" 173 | } 174 | }, 175 | "content-disposition": { 176 | "version": "0.5.3", 177 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 178 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 179 | "requires": { 180 | "safe-buffer": "5.1.2" 181 | } 182 | }, 183 | "content-type": { 184 | "version": "1.0.4", 185 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 186 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 187 | }, 188 | "cookie": { 189 | "version": "0.4.0", 190 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 191 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 192 | }, 193 | "cookie-signature": { 194 | "version": "1.0.6", 195 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 196 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 197 | }, 198 | "core-util-is": { 199 | "version": "1.0.2", 200 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 201 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 202 | }, 203 | "cors": { 204 | "version": "2.8.5", 205 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", 206 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", 207 | "requires": { 208 | "object-assign": "^4", 209 | "vary": "^1" 210 | } 211 | }, 212 | "d": { 213 | "version": "1.0.1", 214 | "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", 215 | "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", 216 | "requires": { 217 | "es5-ext": "^0.10.50", 218 | "type": "^1.0.1" 219 | } 220 | }, 221 | "debug": { 222 | "version": "2.6.9", 223 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 224 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 225 | "requires": { 226 | "ms": "2.0.0" 227 | } 228 | }, 229 | "denque": { 230 | "version": "1.4.1", 231 | "resolved": "https://registry.npmjs.org/denque/-/denque-1.4.1.tgz", 232 | "integrity": "sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ==" 233 | }, 234 | "depd": { 235 | "version": "1.1.2", 236 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 237 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 238 | }, 239 | "destroy": { 240 | "version": "1.0.4", 241 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 242 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 243 | }, 244 | "dotenv": { 245 | "version": "8.2.0", 246 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 247 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 248 | }, 249 | "duplexify": { 250 | "version": "3.7.1", 251 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 252 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 253 | "requires": { 254 | "end-of-stream": "^1.0.0", 255 | "inherits": "^2.0.1", 256 | "readable-stream": "^2.0.0", 257 | "stream-shift": "^1.0.0" 258 | } 259 | }, 260 | "ee-first": { 261 | "version": "1.1.1", 262 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 263 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 264 | }, 265 | "enabled": { 266 | "version": "2.0.0", 267 | "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", 268 | "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==" 269 | }, 270 | "encodeurl": { 271 | "version": "1.0.2", 272 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 273 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 274 | }, 275 | "end-of-stream": { 276 | "version": "1.4.4", 277 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 278 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 279 | "requires": { 280 | "once": "^1.4.0" 281 | } 282 | }, 283 | "es5-ext": { 284 | "version": "0.10.53", 285 | "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", 286 | "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", 287 | "requires": { 288 | "es6-iterator": "~2.0.3", 289 | "es6-symbol": "~3.1.3", 290 | "next-tick": "~1.0.0" 291 | } 292 | }, 293 | "es6-iterator": { 294 | "version": "2.0.3", 295 | "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", 296 | "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", 297 | "requires": { 298 | "d": "1", 299 | "es5-ext": "^0.10.35", 300 | "es6-symbol": "^3.1.1" 301 | } 302 | }, 303 | "es6-map": { 304 | "version": "0.1.5", 305 | "resolved": "https://registry.npmjs.org/es6-map/-/es6-map-0.1.5.tgz", 306 | "integrity": "sha1-kTbgUD3MBqMBaQ8LsU/042TpSfA=", 307 | "requires": { 308 | "d": "1", 309 | "es5-ext": "~0.10.14", 310 | "es6-iterator": "~2.0.1", 311 | "es6-set": "~0.1.5", 312 | "es6-symbol": "~3.1.1", 313 | "event-emitter": "~0.3.5" 314 | } 315 | }, 316 | "es6-set": { 317 | "version": "0.1.5", 318 | "resolved": "https://registry.npmjs.org/es6-set/-/es6-set-0.1.5.tgz", 319 | "integrity": "sha1-0rPsXU2ADO2BjbU40ol02wpzzLE=", 320 | "requires": { 321 | "d": "1", 322 | "es5-ext": "~0.10.14", 323 | "es6-iterator": "~2.0.1", 324 | "es6-symbol": "3.1.1", 325 | "event-emitter": "~0.3.5" 326 | }, 327 | "dependencies": { 328 | "es6-symbol": { 329 | "version": "3.1.1", 330 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.1.tgz", 331 | "integrity": "sha1-vwDvT9q2uhtG7Le2KbTH7VcVzHc=", 332 | "requires": { 333 | "d": "1", 334 | "es5-ext": "~0.10.14" 335 | } 336 | } 337 | } 338 | }, 339 | "es6-symbol": { 340 | "version": "3.1.3", 341 | "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", 342 | "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", 343 | "requires": { 344 | "d": "^1.0.1", 345 | "ext": "^1.1.2" 346 | } 347 | }, 348 | "escape-html": { 349 | "version": "1.0.3", 350 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 351 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 352 | }, 353 | "etag": { 354 | "version": "1.8.1", 355 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 356 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 357 | }, 358 | "event-emitter": { 359 | "version": "0.3.5", 360 | "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", 361 | "integrity": "sha1-34xp7vFkeSPHFXuc6DhAYQsCzDk=", 362 | "requires": { 363 | "d": "1", 364 | "es5-ext": "~0.10.14" 365 | } 366 | }, 367 | "express": { 368 | "version": "4.17.1", 369 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", 370 | "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", 371 | "requires": { 372 | "accepts": "~1.3.7", 373 | "array-flatten": "1.1.1", 374 | "body-parser": "1.19.0", 375 | "content-disposition": "0.5.3", 376 | "content-type": "~1.0.4", 377 | "cookie": "0.4.0", 378 | "cookie-signature": "1.0.6", 379 | "debug": "2.6.9", 380 | "depd": "~1.1.2", 381 | "encodeurl": "~1.0.2", 382 | "escape-html": "~1.0.3", 383 | "etag": "~1.8.1", 384 | "finalhandler": "~1.1.2", 385 | "fresh": "0.5.2", 386 | "merge-descriptors": "1.0.1", 387 | "methods": "~1.1.2", 388 | "on-finished": "~2.3.0", 389 | "parseurl": "~1.3.3", 390 | "path-to-regexp": "0.1.7", 391 | "proxy-addr": "~2.0.5", 392 | "qs": "6.7.0", 393 | "range-parser": "~1.2.1", 394 | "safe-buffer": "5.1.2", 395 | "send": "0.17.1", 396 | "serve-static": "1.14.1", 397 | "setprototypeof": "1.1.1", 398 | "statuses": "~1.5.0", 399 | "type-is": "~1.6.18", 400 | "utils-merge": "1.0.1", 401 | "vary": "~1.1.2" 402 | } 403 | }, 404 | "ext": { 405 | "version": "1.4.0", 406 | "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", 407 | "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", 408 | "requires": { 409 | "type": "^2.0.0" 410 | }, 411 | "dependencies": { 412 | "type": { 413 | "version": "2.0.0", 414 | "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", 415 | "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" 416 | } 417 | } 418 | }, 419 | "extend": { 420 | "version": "3.0.2", 421 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 422 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 423 | }, 424 | "fast-safe-stringify": { 425 | "version": "2.0.7", 426 | "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz", 427 | "integrity": "sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA==" 428 | }, 429 | "fecha": { 430 | "version": "4.2.0", 431 | "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.0.tgz", 432 | "integrity": "sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg==" 433 | }, 434 | "finalhandler": { 435 | "version": "1.1.2", 436 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 437 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 438 | "requires": { 439 | "debug": "2.6.9", 440 | "encodeurl": "~1.0.2", 441 | "escape-html": "~1.0.3", 442 | "on-finished": "~2.3.0", 443 | "parseurl": "~1.3.3", 444 | "statuses": "~1.5.0", 445 | "unpipe": "~1.0.0" 446 | } 447 | }, 448 | "fn.name": { 449 | "version": "1.1.0", 450 | "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", 451 | "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==" 452 | }, 453 | "forwarded": { 454 | "version": "0.1.2", 455 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 456 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 457 | }, 458 | "fresh": { 459 | "version": "0.5.2", 460 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 461 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 462 | }, 463 | "fs.realpath": { 464 | "version": "1.0.0", 465 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 466 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 467 | }, 468 | "glob": { 469 | "version": "7.1.6", 470 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 471 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 472 | "requires": { 473 | "fs.realpath": "^1.0.0", 474 | "inflight": "^1.0.4", 475 | "inherits": "2", 476 | "minimatch": "^3.0.4", 477 | "once": "^1.3.0", 478 | "path-is-absolute": "^1.0.0" 479 | } 480 | }, 481 | "glob-parent": { 482 | "version": "3.1.0", 483 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 484 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 485 | "requires": { 486 | "is-glob": "^3.1.0", 487 | "path-dirname": "^1.0.0" 488 | } 489 | }, 490 | "glob-stream": { 491 | "version": "6.1.0", 492 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 493 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 494 | "requires": { 495 | "extend": "^3.0.0", 496 | "glob": "^7.1.1", 497 | "glob-parent": "^3.1.0", 498 | "is-negated-glob": "^1.0.0", 499 | "ordered-read-streams": "^1.0.0", 500 | "pumpify": "^1.3.5", 501 | "readable-stream": "^2.1.5", 502 | "remove-trailing-separator": "^1.0.1", 503 | "to-absolute-glob": "^2.0.0", 504 | "unique-stream": "^2.0.2" 505 | } 506 | }, 507 | "help-me": { 508 | "version": "1.1.0", 509 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 510 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 511 | "requires": { 512 | "callback-stream": "^1.0.2", 513 | "glob-stream": "^6.1.0", 514 | "through2": "^2.0.1", 515 | "xtend": "^4.0.0" 516 | } 517 | }, 518 | "http-errors": { 519 | "version": "1.7.2", 520 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 521 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 522 | "requires": { 523 | "depd": "~1.1.2", 524 | "inherits": "2.0.3", 525 | "setprototypeof": "1.1.1", 526 | "statuses": ">= 1.5.0 < 2", 527 | "toidentifier": "1.0.0" 528 | } 529 | }, 530 | "iconv-lite": { 531 | "version": "0.4.24", 532 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 533 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 534 | "requires": { 535 | "safer-buffer": ">= 2.1.2 < 3" 536 | } 537 | }, 538 | "inflight": { 539 | "version": "1.0.6", 540 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 541 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 542 | "requires": { 543 | "once": "^1.3.0", 544 | "wrappy": "1" 545 | } 546 | }, 547 | "inherits": { 548 | "version": "2.0.3", 549 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 550 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 551 | }, 552 | "ipaddr.js": { 553 | "version": "1.9.1", 554 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", 555 | "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" 556 | }, 557 | "is-absolute": { 558 | "version": "1.0.0", 559 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 560 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 561 | "requires": { 562 | "is-relative": "^1.0.0", 563 | "is-windows": "^1.0.1" 564 | } 565 | }, 566 | "is-arrayish": { 567 | "version": "0.3.2", 568 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", 569 | "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==" 570 | }, 571 | "is-extglob": { 572 | "version": "2.1.1", 573 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 574 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 575 | }, 576 | "is-glob": { 577 | "version": "3.1.0", 578 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 579 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 580 | "requires": { 581 | "is-extglob": "^2.1.0" 582 | } 583 | }, 584 | "is-negated-glob": { 585 | "version": "1.0.0", 586 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 587 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" 588 | }, 589 | "is-relative": { 590 | "version": "1.0.0", 591 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 592 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 593 | "requires": { 594 | "is-unc-path": "^1.0.0" 595 | } 596 | }, 597 | "is-stream": { 598 | "version": "2.0.0", 599 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", 600 | "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" 601 | }, 602 | "is-unc-path": { 603 | "version": "1.0.0", 604 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 605 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 606 | "requires": { 607 | "unc-path-regex": "^0.1.2" 608 | } 609 | }, 610 | "is-windows": { 611 | "version": "1.0.2", 612 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 613 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 614 | }, 615 | "isarray": { 616 | "version": "1.0.0", 617 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 618 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 619 | }, 620 | "json-stable-stringify-without-jsonify": { 621 | "version": "1.0.1", 622 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 623 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 624 | }, 625 | "kuler": { 626 | "version": "2.0.0", 627 | "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", 628 | "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==" 629 | }, 630 | "leven": { 631 | "version": "2.1.0", 632 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 633 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 634 | }, 635 | "lodash": { 636 | "version": "4.17.15", 637 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", 638 | "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" 639 | }, 640 | "logform": { 641 | "version": "2.2.0", 642 | "resolved": "https://registry.npmjs.org/logform/-/logform-2.2.0.tgz", 643 | "integrity": "sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg==", 644 | "requires": { 645 | "colors": "^1.2.1", 646 | "fast-safe-stringify": "^2.0.4", 647 | "fecha": "^4.2.0", 648 | "ms": "^2.1.1", 649 | "triple-beam": "^1.3.0" 650 | }, 651 | "dependencies": { 652 | "ms": { 653 | "version": "2.1.2", 654 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 655 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 656 | } 657 | } 658 | }, 659 | "media-typer": { 660 | "version": "0.3.0", 661 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 662 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 663 | }, 664 | "merge-descriptors": { 665 | "version": "1.0.1", 666 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 667 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 668 | }, 669 | "methods": { 670 | "version": "1.1.2", 671 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 672 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 673 | }, 674 | "mime": { 675 | "version": "1.6.0", 676 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 677 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 678 | }, 679 | "mime-db": { 680 | "version": "1.44.0", 681 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", 682 | "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==" 683 | }, 684 | "mime-types": { 685 | "version": "2.1.27", 686 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz", 687 | "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==", 688 | "requires": { 689 | "mime-db": "1.44.0" 690 | } 691 | }, 692 | "minimatch": { 693 | "version": "3.0.4", 694 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 695 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 696 | "requires": { 697 | "brace-expansion": "^1.1.7" 698 | } 699 | }, 700 | "minimist": { 701 | "version": "1.2.5", 702 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 703 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 704 | }, 705 | "mqtt": { 706 | "version": "4.1.0", 707 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.1.0.tgz", 708 | "integrity": "sha512-dBihVZzaB8p9G/2ktSfamiaHmMnpCpP2du08317ZuEX1kBAbZOG9aMJQ11EChXnOX3GKUeiZYaSITueceQKT2A==", 709 | "requires": { 710 | "base64-js": "^1.3.0", 711 | "commist": "^1.0.0", 712 | "concat-stream": "^1.6.2", 713 | "debug": "^4.1.1", 714 | "end-of-stream": "^1.4.1", 715 | "es6-map": "^0.1.5", 716 | "help-me": "^1.0.1", 717 | "inherits": "^2.0.3", 718 | "minimist": "^1.2.0", 719 | "mqtt-packet": "^6.0.0", 720 | "pump": "^3.0.0", 721 | "readable-stream": "^2.3.6", 722 | "reinterval": "^1.1.0", 723 | "split2": "^3.1.0", 724 | "websocket-stream": "^5.1.2", 725 | "xtend": "^4.0.1" 726 | }, 727 | "dependencies": { 728 | "debug": { 729 | "version": "4.1.1", 730 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 731 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 732 | "requires": { 733 | "ms": "^2.1.1" 734 | } 735 | }, 736 | "ms": { 737 | "version": "2.1.2", 738 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 739 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 740 | } 741 | } 742 | }, 743 | "mqtt-packet": { 744 | "version": "6.3.2", 745 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.3.2.tgz", 746 | "integrity": "sha512-i56+2kN6F57KInGtjjfUXSl4xG8u/zOvfaXFLKFAbBXzWkXOmwcmjaSCBPayf2IQCkQU0+h+S2DizCo3CF6gQA==", 747 | "requires": { 748 | "bl": "^1.2.2", 749 | "debug": "^4.1.1", 750 | "inherits": "^2.0.3", 751 | "process-nextick-args": "^2.0.0", 752 | "safe-buffer": "^5.1.2" 753 | }, 754 | "dependencies": { 755 | "debug": { 756 | "version": "4.1.1", 757 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 758 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 759 | "requires": { 760 | "ms": "^2.1.1" 761 | } 762 | }, 763 | "ms": { 764 | "version": "2.1.2", 765 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 766 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 767 | } 768 | } 769 | }, 770 | "ms": { 771 | "version": "2.0.0", 772 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 773 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 774 | }, 775 | "negotiator": { 776 | "version": "0.6.2", 777 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 778 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 779 | }, 780 | "next-tick": { 781 | "version": "1.0.0", 782 | "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", 783 | "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" 784 | }, 785 | "object-assign": { 786 | "version": "4.1.1", 787 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 788 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 789 | }, 790 | "on-finished": { 791 | "version": "2.3.0", 792 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 793 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 794 | "requires": { 795 | "ee-first": "1.1.1" 796 | } 797 | }, 798 | "once": { 799 | "version": "1.4.0", 800 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 801 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 802 | "requires": { 803 | "wrappy": "1" 804 | } 805 | }, 806 | "one-time": { 807 | "version": "1.0.0", 808 | "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", 809 | "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", 810 | "requires": { 811 | "fn.name": "1.x.x" 812 | } 813 | }, 814 | "ordered-read-streams": { 815 | "version": "1.0.1", 816 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 817 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 818 | "requires": { 819 | "readable-stream": "^2.0.1" 820 | } 821 | }, 822 | "parseurl": { 823 | "version": "1.3.3", 824 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 825 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 826 | }, 827 | "path-dirname": { 828 | "version": "1.0.2", 829 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 830 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 831 | }, 832 | "path-is-absolute": { 833 | "version": "1.0.1", 834 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 835 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 836 | }, 837 | "path-to-regexp": { 838 | "version": "0.1.7", 839 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 840 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 841 | }, 842 | "process-nextick-args": { 843 | "version": "2.0.1", 844 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 845 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 846 | }, 847 | "proxy-addr": { 848 | "version": "2.0.6", 849 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", 850 | "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", 851 | "requires": { 852 | "forwarded": "~0.1.2", 853 | "ipaddr.js": "1.9.1" 854 | } 855 | }, 856 | "pump": { 857 | "version": "3.0.0", 858 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 859 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 860 | "requires": { 861 | "end-of-stream": "^1.1.0", 862 | "once": "^1.3.1" 863 | } 864 | }, 865 | "pumpify": { 866 | "version": "1.5.1", 867 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 868 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 869 | "requires": { 870 | "duplexify": "^3.6.0", 871 | "inherits": "^2.0.3", 872 | "pump": "^2.0.0" 873 | }, 874 | "dependencies": { 875 | "pump": { 876 | "version": "2.0.1", 877 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 878 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 879 | "requires": { 880 | "end-of-stream": "^1.1.0", 881 | "once": "^1.3.1" 882 | } 883 | } 884 | } 885 | }, 886 | "qs": { 887 | "version": "6.7.0", 888 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 889 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 890 | }, 891 | "range-parser": { 892 | "version": "1.2.1", 893 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 894 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 895 | }, 896 | "raw-body": { 897 | "version": "2.4.0", 898 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 899 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 900 | "requires": { 901 | "bytes": "3.1.0", 902 | "http-errors": "1.7.2", 903 | "iconv-lite": "0.4.24", 904 | "unpipe": "1.0.0" 905 | } 906 | }, 907 | "readable-stream": { 908 | "version": "2.3.7", 909 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 910 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 911 | "requires": { 912 | "core-util-is": "~1.0.0", 913 | "inherits": "~2.0.3", 914 | "isarray": "~1.0.0", 915 | "process-nextick-args": "~2.0.0", 916 | "safe-buffer": "~5.1.1", 917 | "string_decoder": "~1.1.1", 918 | "util-deprecate": "~1.0.1" 919 | } 920 | }, 921 | "redis": { 922 | "version": "3.0.2", 923 | "resolved": "https://registry.npmjs.org/redis/-/redis-3.0.2.tgz", 924 | "integrity": "sha512-PNhLCrjU6vKVuMOyFu7oSP296mwBkcE6lrAjruBYG5LgdSqtRBoVQIylrMyVZD/lkF24RSNNatzvYag6HRBHjQ==", 925 | "requires": { 926 | "denque": "^1.4.1", 927 | "redis-commands": "^1.5.0", 928 | "redis-errors": "^1.2.0", 929 | "redis-parser": "^3.0.0" 930 | } 931 | }, 932 | "redis-commands": { 933 | "version": "1.5.0", 934 | "resolved": "https://registry.npmjs.org/redis-commands/-/redis-commands-1.5.0.tgz", 935 | "integrity": "sha512-6KxamqpZ468MeQC3bkWmCB1fp56XL64D4Kf0zJSwDZbVLLm7KFkoIcHrgRvQ+sk8dnhySs7+yBg94yIkAK7aJg==" 936 | }, 937 | "redis-errors": { 938 | "version": "1.2.0", 939 | "resolved": "https://registry.npmjs.org/redis-errors/-/redis-errors-1.2.0.tgz", 940 | "integrity": "sha1-62LSrbFeTq9GEMBK/hUpOEJQq60=" 941 | }, 942 | "redis-parser": { 943 | "version": "3.0.0", 944 | "resolved": "https://registry.npmjs.org/redis-parser/-/redis-parser-3.0.0.tgz", 945 | "integrity": "sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ=", 946 | "requires": { 947 | "redis-errors": "^1.0.0" 948 | } 949 | }, 950 | "reinterval": { 951 | "version": "1.1.0", 952 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 953 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 954 | }, 955 | "remove-trailing-separator": { 956 | "version": "1.1.0", 957 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 958 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 959 | }, 960 | "safe-buffer": { 961 | "version": "5.1.2", 962 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 963 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 964 | }, 965 | "safer-buffer": { 966 | "version": "2.1.2", 967 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 968 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 969 | }, 970 | "send": { 971 | "version": "0.17.1", 972 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 973 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 974 | "requires": { 975 | "debug": "2.6.9", 976 | "depd": "~1.1.2", 977 | "destroy": "~1.0.4", 978 | "encodeurl": "~1.0.2", 979 | "escape-html": "~1.0.3", 980 | "etag": "~1.8.1", 981 | "fresh": "0.5.2", 982 | "http-errors": "~1.7.2", 983 | "mime": "1.6.0", 984 | "ms": "2.1.1", 985 | "on-finished": "~2.3.0", 986 | "range-parser": "~1.2.1", 987 | "statuses": "~1.5.0" 988 | }, 989 | "dependencies": { 990 | "ms": { 991 | "version": "2.1.1", 992 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 993 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 994 | } 995 | } 996 | }, 997 | "serve-static": { 998 | "version": "1.14.1", 999 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 1000 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 1001 | "requires": { 1002 | "encodeurl": "~1.0.2", 1003 | "escape-html": "~1.0.3", 1004 | "parseurl": "~1.3.3", 1005 | "send": "0.17.1" 1006 | } 1007 | }, 1008 | "setprototypeof": { 1009 | "version": "1.1.1", 1010 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 1011 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 1012 | }, 1013 | "simple-swizzle": { 1014 | "version": "0.2.2", 1015 | "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", 1016 | "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=", 1017 | "requires": { 1018 | "is-arrayish": "^0.3.1" 1019 | } 1020 | }, 1021 | "split2": { 1022 | "version": "3.1.1", 1023 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.1.1.tgz", 1024 | "integrity": "sha512-emNzr1s7ruq4N+1993yht631/JH+jaj0NYBosuKmLcq+JkGQ9MmTw1RB1fGaTCzUuseRIClrlSLHRNYGwWQ58Q==", 1025 | "requires": { 1026 | "readable-stream": "^3.0.0" 1027 | }, 1028 | "dependencies": { 1029 | "readable-stream": { 1030 | "version": "3.6.0", 1031 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1032 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1033 | "requires": { 1034 | "inherits": "^2.0.3", 1035 | "string_decoder": "^1.1.1", 1036 | "util-deprecate": "^1.0.1" 1037 | } 1038 | } 1039 | } 1040 | }, 1041 | "stack-trace": { 1042 | "version": "0.0.10", 1043 | "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", 1044 | "integrity": "sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA=" 1045 | }, 1046 | "statuses": { 1047 | "version": "1.5.0", 1048 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 1049 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 1050 | }, 1051 | "stream-shift": { 1052 | "version": "1.0.1", 1053 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1054 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1055 | }, 1056 | "string_decoder": { 1057 | "version": "1.1.1", 1058 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1059 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1060 | "requires": { 1061 | "safe-buffer": "~5.1.0" 1062 | } 1063 | }, 1064 | "text-hex": { 1065 | "version": "1.0.0", 1066 | "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", 1067 | "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" 1068 | }, 1069 | "through2": { 1070 | "version": "2.0.5", 1071 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1072 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1073 | "requires": { 1074 | "readable-stream": "~2.3.6", 1075 | "xtend": "~4.0.1" 1076 | } 1077 | }, 1078 | "through2-filter": { 1079 | "version": "3.0.0", 1080 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 1081 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 1082 | "requires": { 1083 | "through2": "~2.0.0", 1084 | "xtend": "~4.0.0" 1085 | } 1086 | }, 1087 | "to-absolute-glob": { 1088 | "version": "2.0.2", 1089 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 1090 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 1091 | "requires": { 1092 | "is-absolute": "^1.0.0", 1093 | "is-negated-glob": "^1.0.0" 1094 | } 1095 | }, 1096 | "toidentifier": { 1097 | "version": "1.0.0", 1098 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 1099 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 1100 | }, 1101 | "triple-beam": { 1102 | "version": "1.3.0", 1103 | "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", 1104 | "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==" 1105 | }, 1106 | "type": { 1107 | "version": "1.2.0", 1108 | "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", 1109 | "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" 1110 | }, 1111 | "type-is": { 1112 | "version": "1.6.18", 1113 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 1114 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 1115 | "requires": { 1116 | "media-typer": "0.3.0", 1117 | "mime-types": "~2.1.24" 1118 | } 1119 | }, 1120 | "typedarray": { 1121 | "version": "0.0.6", 1122 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1123 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1124 | }, 1125 | "ultron": { 1126 | "version": "1.1.1", 1127 | "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz", 1128 | "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==" 1129 | }, 1130 | "unc-path-regex": { 1131 | "version": "0.1.2", 1132 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1133 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 1134 | }, 1135 | "unique-stream": { 1136 | "version": "2.3.1", 1137 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 1138 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 1139 | "requires": { 1140 | "json-stable-stringify-without-jsonify": "^1.0.1", 1141 | "through2-filter": "^3.0.0" 1142 | } 1143 | }, 1144 | "unpipe": { 1145 | "version": "1.0.0", 1146 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 1147 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 1148 | }, 1149 | "util-deprecate": { 1150 | "version": "1.0.2", 1151 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1152 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1153 | }, 1154 | "utils-merge": { 1155 | "version": "1.0.1", 1156 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 1157 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 1158 | }, 1159 | "uuid": { 1160 | "version": "8.2.0", 1161 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.2.0.tgz", 1162 | "integrity": "sha512-CYpGiFTUrmI6OBMkAdjSDM0k5h8SkkiTP4WAjQgDgNB1S3Ou9VBEvr6q0Kv2H1mMk7IWfxYGpMH5sd5AvcIV2Q==" 1163 | }, 1164 | "vary": { 1165 | "version": "1.1.2", 1166 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 1167 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 1168 | }, 1169 | "websocket-stream": { 1170 | "version": "5.5.2", 1171 | "resolved": "https://registry.npmjs.org/websocket-stream/-/websocket-stream-5.5.2.tgz", 1172 | "integrity": "sha512-8z49MKIHbGk3C4HtuHWDtYX8mYej1wWabjthC/RupM9ngeukU4IWoM46dgth1UOS/T4/IqgEdCDJuMe2039OQQ==", 1173 | "requires": { 1174 | "duplexify": "^3.5.1", 1175 | "inherits": "^2.0.1", 1176 | "readable-stream": "^2.3.3", 1177 | "safe-buffer": "^5.1.2", 1178 | "ws": "^3.2.0", 1179 | "xtend": "^4.0.0" 1180 | } 1181 | }, 1182 | "winston": { 1183 | "version": "3.3.3", 1184 | "resolved": "https://registry.npmjs.org/winston/-/winston-3.3.3.tgz", 1185 | "integrity": "sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw==", 1186 | "requires": { 1187 | "@dabh/diagnostics": "^2.0.2", 1188 | "async": "^3.1.0", 1189 | "is-stream": "^2.0.0", 1190 | "logform": "^2.2.0", 1191 | "one-time": "^1.0.0", 1192 | "readable-stream": "^3.4.0", 1193 | "stack-trace": "0.0.x", 1194 | "triple-beam": "^1.3.0", 1195 | "winston-transport": "^4.4.0" 1196 | }, 1197 | "dependencies": { 1198 | "readable-stream": { 1199 | "version": "3.6.0", 1200 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1201 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1202 | "requires": { 1203 | "inherits": "^2.0.3", 1204 | "string_decoder": "^1.1.1", 1205 | "util-deprecate": "^1.0.1" 1206 | } 1207 | } 1208 | } 1209 | }, 1210 | "winston-transport": { 1211 | "version": "4.4.0", 1212 | "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.4.0.tgz", 1213 | "integrity": "sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw==", 1214 | "requires": { 1215 | "readable-stream": "^2.3.7", 1216 | "triple-beam": "^1.2.0" 1217 | } 1218 | }, 1219 | "wrappy": { 1220 | "version": "1.0.2", 1221 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1222 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1223 | }, 1224 | "ws": { 1225 | "version": "3.3.3", 1226 | "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz", 1227 | "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==", 1228 | "requires": { 1229 | "async-limiter": "~1.0.0", 1230 | "safe-buffer": "~5.1.0", 1231 | "ultron": "~1.1.0" 1232 | } 1233 | }, 1234 | "xtend": { 1235 | "version": "4.0.2", 1236 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1237 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1238 | } 1239 | } 1240 | } 1241 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "sms-mqtt-rest", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "app.js", 6 | "scripts": { 7 | "start": "node app.js", 8 | "test": "echo \"Error: no test specified\" && exit 1" 9 | }, 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "body-parser": "^1.19.0", 14 | "cors": "^2.8.5", 15 | "dotenv": "^8.2.0", 16 | "express": "^4.17.1", 17 | "lodash": "^4.17.15", 18 | "mqtt": "^4.1.0", 19 | "redis": "^3.0.2", 20 | "uuid": "^8.2.0", 21 | "winston": "^3.3.3" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /redis.js: -------------------------------------------------------------------------------- 1 | require('dotenv').config() 2 | const redis = require('redis') 3 | const logger = require('./logger') 4 | const _ = require('lodash') 5 | 6 | const client = redis.createClient({ 7 | url: process.env.REDIS_URL, 8 | port: 6379 9 | }) 10 | const init = () => { 11 | client.on('connect', () => { 12 | logger.info('redis-init', 'Redis Client connected') 13 | }) 14 | 15 | client.on('error', (err) => { 16 | logger.error('redis-init', JSON.stringify(err)) 17 | }) 18 | } 19 | 20 | const set = (key, val, duration) => { 21 | if (_.some([key, val], el => _.isEmpty(el))) { 22 | logger.error('redis-set', 'Payload Cannot be empty') 23 | return 1 24 | } 25 | 26 | client.set(key, val, (err, res) => { 27 | if (err) logger.error('redis-set', JSON.stringify(err)) 28 | logger.info('redis-set', res) 29 | }) 30 | 31 | client.expire(key,duration,(err,res) => { 32 | if (err) logger.error('redis-expire', JSON.stringify(err)) 33 | logger.info('redis-expire', res) 34 | }) 35 | return 0 36 | } 37 | 38 | 39 | 40 | module.exports = { 41 | init, 42 | set, 43 | client 44 | } 45 | -------------------------------------------------------------------------------- /server.js: -------------------------------------------------------------------------------- 1 | const express = require('express') 2 | const cors = require('cors') 3 | const bodyParser = require('body-parser') 4 | const logger = require('./logger') 5 | const otpHandler = require('./otp') 6 | class Server { 7 | constructor () { 8 | this.app = express() 9 | this.app.use(bodyParser.json()) 10 | this.app.use(bodyParser.urlencoded({ extended: true })) 11 | this.app.use(cors()) 12 | this.app.post('/requestOTP',otpHandler.requestOTP) 13 | this.app.post('/verifyOTP/:id',otpHandler.verifyOTP) 14 | 15 | } 16 | 17 | init (port, next) { 18 | this.app.listen(port, () => { 19 | logger.info('app-init', `app run on ${port} `, '') 20 | }) 21 | next() 22 | } 23 | } 24 | module.exports = Server 25 | --------------------------------------------------------------------------------