├── .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 | 
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 |
23 |
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 |
--------------------------------------------------------------------------------