├── README.md
├── index.html
├── package-lock.json
├── package.json
├── server.js
└── spec
├── server.spec.js
└── support
└── jasmine.json
/README.md:
--------------------------------------------------------------------------------
1 | # simple-chat
2 | A simple chat application in nodejs and mongodb
3 |
4 | Read
5 | https://medium.com/@amkurian/simple-chat-application-in-node-js-using-express-mongoose-and-socket-io-ee62d94f5804
6 |
--------------------------------------------------------------------------------
/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | My First Node App
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
Send Message
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
53 |
54 |
55 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "demo-chat-app",
3 | "version": "1.0.0",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@types/component-emitter": {
8 | "version": "1.2.11",
9 | "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz",
10 | "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ=="
11 | },
12 | "@types/cookie": {
13 | "version": "0.4.1",
14 | "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz",
15 | "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q=="
16 | },
17 | "@types/cors": {
18 | "version": "2.8.12",
19 | "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz",
20 | "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw=="
21 | },
22 | "@types/node": {
23 | "version": "17.0.32",
24 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.32.tgz",
25 | "integrity": "sha512-eAIcfAvhf/BkHcf4pkLJ7ECpBAhh9kcxRBpip9cTiO+hf+aJrsxYxBeS6OXvOd9WqNAJmavXVpZvY1rBjNsXmw=="
26 | },
27 | "accepts": {
28 | "version": "1.3.5",
29 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.5.tgz",
30 | "integrity": "sha1-63d99gEXI6OxTopywIBcjoZ0a9I=",
31 | "requires": {
32 | "mime-types": "~2.1.18",
33 | "negotiator": "0.6.1"
34 | }
35 | },
36 | "ajv": {
37 | "version": "5.5.2",
38 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
39 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
40 | "dev": true,
41 | "requires": {
42 | "co": "^4.6.0",
43 | "fast-deep-equal": "^1.0.0",
44 | "fast-json-stable-stringify": "^2.0.0",
45 | "json-schema-traverse": "^0.3.0"
46 | }
47 | },
48 | "array-flatten": {
49 | "version": "1.1.1",
50 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
51 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI="
52 | },
53 | "asn1": {
54 | "version": "0.2.3",
55 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz",
56 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=",
57 | "dev": true
58 | },
59 | "assert-plus": {
60 | "version": "1.0.0",
61 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
62 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
63 | "dev": true
64 | },
65 | "asynckit": {
66 | "version": "0.4.0",
67 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
68 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
69 | "dev": true
70 | },
71 | "aws-sign2": {
72 | "version": "0.7.0",
73 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
74 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
75 | "dev": true
76 | },
77 | "aws4": {
78 | "version": "1.7.0",
79 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
80 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
81 | "dev": true
82 | },
83 | "balanced-match": {
84 | "version": "1.0.0",
85 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
87 | "dev": true
88 | },
89 | "bcrypt-pbkdf": {
90 | "version": "1.0.2",
91 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
92 | "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
93 | "dev": true,
94 | "optional": true,
95 | "requires": {
96 | "tweetnacl": "^0.14.3"
97 | }
98 | },
99 | "bluebird": {
100 | "version": "3.5.1",
101 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz",
102 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA=="
103 | },
104 | "body-parser": {
105 | "version": "1.18.3",
106 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
107 | "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
108 | "requires": {
109 | "bytes": "3.0.0",
110 | "content-type": "~1.0.4",
111 | "debug": "2.6.9",
112 | "depd": "~1.1.2",
113 | "http-errors": "~1.6.3",
114 | "iconv-lite": "0.4.23",
115 | "on-finished": "~2.3.0",
116 | "qs": "6.5.2",
117 | "raw-body": "2.3.3",
118 | "type-is": "~1.6.16"
119 | },
120 | "dependencies": {
121 | "qs": {
122 | "version": "6.5.2",
123 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
124 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
125 | }
126 | }
127 | },
128 | "brace-expansion": {
129 | "version": "1.1.11",
130 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
131 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
132 | "dev": true,
133 | "requires": {
134 | "balanced-match": "^1.0.0",
135 | "concat-map": "0.0.1"
136 | }
137 | },
138 | "bson": {
139 | "version": "1.1.3",
140 | "resolved": "https://registry.npmjs.org/bson/-/bson-1.1.3.tgz",
141 | "integrity": "sha512-TdiJxMVnodVS7r0BdL42y/pqC9cL2iKynVwA0Ho3qbsQYr428veL3l7BQyuqiw+Q5SqqoT0m4srSY/BlZ9AxXg=="
142 | },
143 | "bytes": {
144 | "version": "3.0.0",
145 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
146 | "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg="
147 | },
148 | "caseless": {
149 | "version": "0.12.0",
150 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
151 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
152 | "dev": true
153 | },
154 | "co": {
155 | "version": "4.6.0",
156 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
157 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
158 | "dev": true
159 | },
160 | "combined-stream": {
161 | "version": "1.0.6",
162 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
163 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
164 | "dev": true,
165 | "requires": {
166 | "delayed-stream": "~1.0.0"
167 | }
168 | },
169 | "component-emitter": {
170 | "version": "1.3.0",
171 | "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
172 | "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg=="
173 | },
174 | "concat-map": {
175 | "version": "0.0.1",
176 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
177 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
178 | "dev": true
179 | },
180 | "content-disposition": {
181 | "version": "0.5.2",
182 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz",
183 | "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ="
184 | },
185 | "content-type": {
186 | "version": "1.0.4",
187 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
188 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA=="
189 | },
190 | "cookie": {
191 | "version": "0.3.1",
192 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz",
193 | "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s="
194 | },
195 | "cookie-signature": {
196 | "version": "1.0.6",
197 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
198 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw="
199 | },
200 | "core-util-is": {
201 | "version": "1.0.2",
202 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
203 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=",
204 | "dev": true
205 | },
206 | "cors": {
207 | "version": "2.8.5",
208 | "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz",
209 | "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==",
210 | "requires": {
211 | "object-assign": "^4",
212 | "vary": "^1"
213 | }
214 | },
215 | "dashdash": {
216 | "version": "1.14.1",
217 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
218 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
219 | "dev": true,
220 | "requires": {
221 | "assert-plus": "^1.0.0"
222 | }
223 | },
224 | "debug": {
225 | "version": "2.6.9",
226 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
227 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
228 | "requires": {
229 | "ms": "2.0.0"
230 | }
231 | },
232 | "delayed-stream": {
233 | "version": "1.0.0",
234 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
235 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
236 | "dev": true
237 | },
238 | "depd": {
239 | "version": "1.1.2",
240 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
241 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak="
242 | },
243 | "destroy": {
244 | "version": "1.0.4",
245 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
246 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA="
247 | },
248 | "ecc-jsbn": {
249 | "version": "0.1.1",
250 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz",
251 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=",
252 | "dev": true,
253 | "optional": true,
254 | "requires": {
255 | "jsbn": "~0.1.0"
256 | }
257 | },
258 | "ee-first": {
259 | "version": "1.1.1",
260 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
261 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0="
262 | },
263 | "encodeurl": {
264 | "version": "1.0.2",
265 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
266 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k="
267 | },
268 | "engine.io": {
269 | "version": "6.2.0",
270 | "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.2.0.tgz",
271 | "integrity": "sha512-4KzwW3F3bk+KlzSOY57fj/Jx6LyRQ1nbcyIadehl+AnXjKT7gDO0ORdRi/84ixvMKTym6ZKuxvbzN62HDDU1Lg==",
272 | "requires": {
273 | "@types/cookie": "^0.4.1",
274 | "@types/cors": "^2.8.12",
275 | "@types/node": ">=10.0.0",
276 | "accepts": "~1.3.4",
277 | "base64id": "2.0.0",
278 | "cookie": "~0.4.1",
279 | "cors": "~2.8.5",
280 | "debug": "~4.3.1",
281 | "engine.io-parser": "~5.0.3",
282 | "ws": "~8.2.3"
283 | },
284 | "dependencies": {
285 | "base64id": {
286 | "version": "2.0.0",
287 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
288 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
289 | },
290 | "cookie": {
291 | "version": "0.4.2",
292 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
293 | "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA=="
294 | },
295 | "debug": {
296 | "version": "4.3.4",
297 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
298 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
299 | "requires": {
300 | "ms": "2.1.2"
301 | }
302 | },
303 | "ms": {
304 | "version": "2.1.2",
305 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
306 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
307 | }
308 | }
309 | },
310 | "engine.io-parser": {
311 | "version": "5.0.4",
312 | "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.4.tgz",
313 | "integrity": "sha512-+nVFp+5z1E3HcToEnO7ZIj3g+3k9389DvWtvJZz0T6/eOCPIyyxehFcedoYrZQrp0LgQbD9pPXhpMBKMd5QURg=="
314 | },
315 | "escape-html": {
316 | "version": "1.0.3",
317 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
318 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg="
319 | },
320 | "etag": {
321 | "version": "1.8.1",
322 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
323 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc="
324 | },
325 | "express": {
326 | "version": "4.16.3",
327 | "resolved": "https://registry.npmjs.org/express/-/express-4.16.3.tgz",
328 | "integrity": "sha1-avilAjUNsyRuzEvs9rWjTSL37VM=",
329 | "requires": {
330 | "accepts": "~1.3.5",
331 | "array-flatten": "1.1.1",
332 | "body-parser": "1.18.2",
333 | "content-disposition": "0.5.2",
334 | "content-type": "~1.0.4",
335 | "cookie": "0.3.1",
336 | "cookie-signature": "1.0.6",
337 | "debug": "2.6.9",
338 | "depd": "~1.1.2",
339 | "encodeurl": "~1.0.2",
340 | "escape-html": "~1.0.3",
341 | "etag": "~1.8.1",
342 | "finalhandler": "1.1.1",
343 | "fresh": "0.5.2",
344 | "merge-descriptors": "1.0.1",
345 | "methods": "~1.1.2",
346 | "on-finished": "~2.3.0",
347 | "parseurl": "~1.3.2",
348 | "path-to-regexp": "0.1.7",
349 | "proxy-addr": "~2.0.3",
350 | "qs": "6.5.1",
351 | "range-parser": "~1.2.0",
352 | "safe-buffer": "5.1.1",
353 | "send": "0.16.2",
354 | "serve-static": "1.13.2",
355 | "setprototypeof": "1.1.0",
356 | "statuses": "~1.4.0",
357 | "type-is": "~1.6.16",
358 | "utils-merge": "1.0.1",
359 | "vary": "~1.1.2"
360 | },
361 | "dependencies": {
362 | "body-parser": {
363 | "version": "1.18.2",
364 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz",
365 | "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=",
366 | "requires": {
367 | "bytes": "3.0.0",
368 | "content-type": "~1.0.4",
369 | "debug": "2.6.9",
370 | "depd": "~1.1.1",
371 | "http-errors": "~1.6.2",
372 | "iconv-lite": "0.4.19",
373 | "on-finished": "~2.3.0",
374 | "qs": "6.5.1",
375 | "raw-body": "2.3.2",
376 | "type-is": "~1.6.15"
377 | }
378 | },
379 | "iconv-lite": {
380 | "version": "0.4.19",
381 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz",
382 | "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ=="
383 | },
384 | "raw-body": {
385 | "version": "2.3.2",
386 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz",
387 | "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=",
388 | "requires": {
389 | "bytes": "3.0.0",
390 | "http-errors": "1.6.2",
391 | "iconv-lite": "0.4.19",
392 | "unpipe": "1.0.0"
393 | },
394 | "dependencies": {
395 | "depd": {
396 | "version": "1.1.1",
397 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz",
398 | "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k="
399 | },
400 | "http-errors": {
401 | "version": "1.6.2",
402 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz",
403 | "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=",
404 | "requires": {
405 | "depd": "1.1.1",
406 | "inherits": "2.0.3",
407 | "setprototypeof": "1.0.3",
408 | "statuses": ">= 1.3.1 < 2"
409 | }
410 | },
411 | "setprototypeof": {
412 | "version": "1.0.3",
413 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz",
414 | "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ="
415 | }
416 | }
417 | }
418 | }
419 | },
420 | "extend": {
421 | "version": "3.0.2",
422 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
423 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
424 | "dev": true
425 | },
426 | "extsprintf": {
427 | "version": "1.3.0",
428 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
429 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
430 | "dev": true
431 | },
432 | "fast-deep-equal": {
433 | "version": "1.1.0",
434 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
435 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
436 | "dev": true
437 | },
438 | "fast-json-stable-stringify": {
439 | "version": "2.0.0",
440 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
441 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
442 | "dev": true
443 | },
444 | "finalhandler": {
445 | "version": "1.1.1",
446 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.1.tgz",
447 | "integrity": "sha512-Y1GUDo39ez4aHAw7MysnUD5JzYX+WaIj8I57kO3aEPT1fFRL4sr7mjei97FgnwhAyyzRYmQZaTHb2+9uZ1dPtg==",
448 | "requires": {
449 | "debug": "2.6.9",
450 | "encodeurl": "~1.0.2",
451 | "escape-html": "~1.0.3",
452 | "on-finished": "~2.3.0",
453 | "parseurl": "~1.3.2",
454 | "statuses": "~1.4.0",
455 | "unpipe": "~1.0.0"
456 | }
457 | },
458 | "forever-agent": {
459 | "version": "0.6.1",
460 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
461 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
462 | "dev": true
463 | },
464 | "form-data": {
465 | "version": "2.3.2",
466 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
467 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
468 | "dev": true,
469 | "requires": {
470 | "asynckit": "^0.4.0",
471 | "combined-stream": "1.0.6",
472 | "mime-types": "^2.1.12"
473 | }
474 | },
475 | "forwarded": {
476 | "version": "0.1.2",
477 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz",
478 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ="
479 | },
480 | "fresh": {
481 | "version": "0.5.2",
482 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
483 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac="
484 | },
485 | "fs.realpath": {
486 | "version": "1.0.0",
487 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
488 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
489 | "dev": true
490 | },
491 | "getpass": {
492 | "version": "0.1.7",
493 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
494 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
495 | "dev": true,
496 | "requires": {
497 | "assert-plus": "^1.0.0"
498 | }
499 | },
500 | "glob": {
501 | "version": "7.1.2",
502 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz",
503 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==",
504 | "dev": true,
505 | "requires": {
506 | "fs.realpath": "^1.0.0",
507 | "inflight": "^1.0.4",
508 | "inherits": "2",
509 | "minimatch": "^3.0.4",
510 | "once": "^1.3.0",
511 | "path-is-absolute": "^1.0.0"
512 | }
513 | },
514 | "har-schema": {
515 | "version": "2.0.0",
516 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
517 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
518 | "dev": true
519 | },
520 | "har-validator": {
521 | "version": "5.0.3",
522 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
523 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
524 | "dev": true,
525 | "requires": {
526 | "ajv": "^5.1.0",
527 | "har-schema": "^2.0.0"
528 | }
529 | },
530 | "http-errors": {
531 | "version": "1.6.3",
532 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
533 | "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
534 | "requires": {
535 | "depd": "~1.1.2",
536 | "inherits": "2.0.3",
537 | "setprototypeof": "1.1.0",
538 | "statuses": ">= 1.4.0 < 2"
539 | }
540 | },
541 | "http-signature": {
542 | "version": "1.2.0",
543 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
544 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
545 | "dev": true,
546 | "requires": {
547 | "assert-plus": "^1.0.0",
548 | "jsprim": "^1.2.2",
549 | "sshpk": "^1.7.0"
550 | }
551 | },
552 | "iconv-lite": {
553 | "version": "0.4.23",
554 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
555 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
556 | "requires": {
557 | "safer-buffer": ">= 2.1.2 < 3"
558 | }
559 | },
560 | "inflight": {
561 | "version": "1.0.6",
562 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
563 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
564 | "dev": true,
565 | "requires": {
566 | "once": "^1.3.0",
567 | "wrappy": "1"
568 | }
569 | },
570 | "inherits": {
571 | "version": "2.0.3",
572 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
573 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
574 | },
575 | "ipaddr.js": {
576 | "version": "1.8.0",
577 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
578 | "integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
579 | },
580 | "is-typedarray": {
581 | "version": "1.0.0",
582 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
583 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
584 | "dev": true
585 | },
586 | "isstream": {
587 | "version": "0.1.2",
588 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
589 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
590 | "dev": true
591 | },
592 | "jasmine": {
593 | "version": "3.1.0",
594 | "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-3.1.0.tgz",
595 | "integrity": "sha1-K9Wf1+xuwOistk4J9Fpo7SrRlSo=",
596 | "dev": true,
597 | "requires": {
598 | "glob": "^7.0.6",
599 | "jasmine-core": "~3.1.0"
600 | }
601 | },
602 | "jasmine-core": {
603 | "version": "3.1.0",
604 | "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.1.0.tgz",
605 | "integrity": "sha1-pHheE11d9lAk38kiSVPfWFvSdmw=",
606 | "dev": true
607 | },
608 | "jsbn": {
609 | "version": "0.1.1",
610 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
611 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=",
612 | "dev": true,
613 | "optional": true
614 | },
615 | "json-schema": {
616 | "version": "0.2.3",
617 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
618 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=",
619 | "dev": true
620 | },
621 | "json-schema-traverse": {
622 | "version": "0.3.1",
623 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
624 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
625 | "dev": true
626 | },
627 | "json-stringify-safe": {
628 | "version": "5.0.1",
629 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
630 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=",
631 | "dev": true
632 | },
633 | "jsprim": {
634 | "version": "1.4.1",
635 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
636 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
637 | "dev": true,
638 | "requires": {
639 | "assert-plus": "1.0.0",
640 | "extsprintf": "1.3.0",
641 | "json-schema": "0.2.3",
642 | "verror": "1.10.0"
643 | }
644 | },
645 | "kareem": {
646 | "version": "2.3.1",
647 | "resolved": "https://registry.npmjs.org/kareem/-/kareem-2.3.1.tgz",
648 | "integrity": "sha512-l3hLhffs9zqoDe8zjmb/mAN4B8VT3L56EUvKNqLFVs9YlFA+zx7ke1DO8STAdDyYNkeSo1nKmjuvQeI12So8Xw=="
649 | },
650 | "media-typer": {
651 | "version": "0.3.0",
652 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
653 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g="
654 | },
655 | "merge-descriptors": {
656 | "version": "1.0.1",
657 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
658 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
659 | },
660 | "methods": {
661 | "version": "1.1.2",
662 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
663 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4="
664 | },
665 | "mime": {
666 | "version": "1.4.1",
667 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz",
668 | "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ=="
669 | },
670 | "mime-db": {
671 | "version": "1.35.0",
672 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz",
673 | "integrity": "sha512-JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg=="
674 | },
675 | "mime-types": {
676 | "version": "2.1.19",
677 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz",
678 | "integrity": "sha512-P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==",
679 | "requires": {
680 | "mime-db": "~1.35.0"
681 | }
682 | },
683 | "minimatch": {
684 | "version": "3.0.4",
685 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
686 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
687 | "dev": true,
688 | "requires": {
689 | "brace-expansion": "^1.1.7"
690 | }
691 | },
692 | "mongodb": {
693 | "version": "3.3.2",
694 | "resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.3.2.tgz",
695 | "integrity": "sha512-fqJt3iywelk4yKu/lfwQg163Bjpo5zDKhXiohycvon4iQHbrfflSAz9AIlRE6496Pm/dQKQK5bMigdVo2s6gBg==",
696 | "requires": {
697 | "bson": "^1.1.1",
698 | "require_optional": "^1.0.1",
699 | "safe-buffer": "^5.1.2"
700 | },
701 | "dependencies": {
702 | "safe-buffer": {
703 | "version": "5.2.0",
704 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz",
705 | "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg=="
706 | }
707 | }
708 | },
709 | "mongoose": {
710 | "version": "5.7.5",
711 | "resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.7.5.tgz",
712 | "integrity": "sha512-BZ4FxtnbTurc/wcm/hLltLdI4IDxo4nsE0D9q58YymTdZwreNzwO62CcjVtaHhmr8HmJtOInp2W/T12FZaMf8g==",
713 | "requires": {
714 | "bson": "~1.1.1",
715 | "kareem": "2.3.1",
716 | "mongodb": "3.3.2",
717 | "mongoose-legacy-pluralize": "1.0.2",
718 | "mpath": "0.6.0",
719 | "mquery": "3.2.2",
720 | "ms": "2.1.2",
721 | "regexp-clone": "1.0.0",
722 | "safe-buffer": "5.1.2",
723 | "sift": "7.0.1",
724 | "sliced": "1.0.1"
725 | },
726 | "dependencies": {
727 | "ms": {
728 | "version": "2.1.2",
729 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
730 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
731 | },
732 | "safe-buffer": {
733 | "version": "5.1.2",
734 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
735 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
736 | }
737 | }
738 | },
739 | "mongoose-legacy-pluralize": {
740 | "version": "1.0.2",
741 | "resolved": "https://registry.npmjs.org/mongoose-legacy-pluralize/-/mongoose-legacy-pluralize-1.0.2.tgz",
742 | "integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
743 | },
744 | "mpath": {
745 | "version": "0.6.0",
746 | "resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
747 | "integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
748 | },
749 | "mquery": {
750 | "version": "3.2.2",
751 | "resolved": "https://registry.npmjs.org/mquery/-/mquery-3.2.2.tgz",
752 | "integrity": "sha512-XB52992COp0KP230I3qloVUbkLUxJIu328HBP2t2EsxSFtf4W1HPSOBWOXf1bqxK4Xbb66lfMJ+Bpfd9/yZE1Q==",
753 | "requires": {
754 | "bluebird": "3.5.1",
755 | "debug": "3.1.0",
756 | "regexp-clone": "^1.0.0",
757 | "safe-buffer": "5.1.2",
758 | "sliced": "1.0.1"
759 | },
760 | "dependencies": {
761 | "debug": {
762 | "version": "3.1.0",
763 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
764 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
765 | "requires": {
766 | "ms": "2.0.0"
767 | }
768 | },
769 | "safe-buffer": {
770 | "version": "5.1.2",
771 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
772 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
773 | }
774 | }
775 | },
776 | "ms": {
777 | "version": "2.0.0",
778 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
779 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
780 | },
781 | "negotiator": {
782 | "version": "0.6.1",
783 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz",
784 | "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk="
785 | },
786 | "oauth-sign": {
787 | "version": "0.8.2",
788 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz",
789 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=",
790 | "dev": true
791 | },
792 | "object-assign": {
793 | "version": "4.1.1",
794 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
795 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM="
796 | },
797 | "on-finished": {
798 | "version": "2.3.0",
799 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
800 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
801 | "requires": {
802 | "ee-first": "1.1.1"
803 | }
804 | },
805 | "once": {
806 | "version": "1.4.0",
807 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
808 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
809 | "dev": true,
810 | "requires": {
811 | "wrappy": "1"
812 | }
813 | },
814 | "parseurl": {
815 | "version": "1.3.2",
816 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz",
817 | "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M="
818 | },
819 | "path-is-absolute": {
820 | "version": "1.0.1",
821 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
822 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
823 | "dev": true
824 | },
825 | "path-to-regexp": {
826 | "version": "0.1.7",
827 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz",
828 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w="
829 | },
830 | "performance-now": {
831 | "version": "2.1.0",
832 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
833 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
834 | "dev": true
835 | },
836 | "proxy-addr": {
837 | "version": "2.0.4",
838 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
839 | "integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
840 | "requires": {
841 | "forwarded": "~0.1.2",
842 | "ipaddr.js": "1.8.0"
843 | }
844 | },
845 | "punycode": {
846 | "version": "1.4.1",
847 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
848 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
849 | "dev": true
850 | },
851 | "qs": {
852 | "version": "6.5.1",
853 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
854 | "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A=="
855 | },
856 | "range-parser": {
857 | "version": "1.2.0",
858 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz",
859 | "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4="
860 | },
861 | "raw-body": {
862 | "version": "2.3.3",
863 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
864 | "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
865 | "requires": {
866 | "bytes": "3.0.0",
867 | "http-errors": "1.6.3",
868 | "iconv-lite": "0.4.23",
869 | "unpipe": "1.0.0"
870 | }
871 | },
872 | "regexp-clone": {
873 | "version": "1.0.0",
874 | "resolved": "https://registry.npmjs.org/regexp-clone/-/regexp-clone-1.0.0.tgz",
875 | "integrity": "sha512-TuAasHQNamyyJ2hb97IuBEif4qBHGjPHBS64sZwytpLEqtBQ1gPJTnOaQ6qmpET16cK14kkjbazl6+p0RRv0yw=="
876 | },
877 | "request": {
878 | "version": "2.87.0",
879 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz",
880 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==",
881 | "dev": true,
882 | "requires": {
883 | "aws-sign2": "~0.7.0",
884 | "aws4": "^1.6.0",
885 | "caseless": "~0.12.0",
886 | "combined-stream": "~1.0.5",
887 | "extend": "~3.0.1",
888 | "forever-agent": "~0.6.1",
889 | "form-data": "~2.3.1",
890 | "har-validator": "~5.0.3",
891 | "http-signature": "~1.2.0",
892 | "is-typedarray": "~1.0.0",
893 | "isstream": "~0.1.2",
894 | "json-stringify-safe": "~5.0.1",
895 | "mime-types": "~2.1.17",
896 | "oauth-sign": "~0.8.2",
897 | "performance-now": "^2.1.0",
898 | "qs": "~6.5.1",
899 | "safe-buffer": "^5.1.1",
900 | "tough-cookie": "~2.3.3",
901 | "tunnel-agent": "^0.6.0",
902 | "uuid": "^3.1.0"
903 | }
904 | },
905 | "require_optional": {
906 | "version": "1.0.1",
907 | "resolved": "https://registry.npmjs.org/require_optional/-/require_optional-1.0.1.tgz",
908 | "integrity": "sha512-qhM/y57enGWHAe3v/NcwML6a3/vfESLe/sGM2dII+gEO0BpKRUkWZow/tyloNqJyN6kXSl3RyyM8Ll5D/sJP8g==",
909 | "requires": {
910 | "resolve-from": "^2.0.0",
911 | "semver": "^5.1.0"
912 | }
913 | },
914 | "resolve-from": {
915 | "version": "2.0.0",
916 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-2.0.0.tgz",
917 | "integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
918 | },
919 | "safe-buffer": {
920 | "version": "5.1.1",
921 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz",
922 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg=="
923 | },
924 | "safer-buffer": {
925 | "version": "2.1.2",
926 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
927 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
928 | },
929 | "semver": {
930 | "version": "5.7.1",
931 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
932 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ=="
933 | },
934 | "send": {
935 | "version": "0.16.2",
936 | "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz",
937 | "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==",
938 | "requires": {
939 | "debug": "2.6.9",
940 | "depd": "~1.1.2",
941 | "destroy": "~1.0.4",
942 | "encodeurl": "~1.0.2",
943 | "escape-html": "~1.0.3",
944 | "etag": "~1.8.1",
945 | "fresh": "0.5.2",
946 | "http-errors": "~1.6.2",
947 | "mime": "1.4.1",
948 | "ms": "2.0.0",
949 | "on-finished": "~2.3.0",
950 | "range-parser": "~1.2.0",
951 | "statuses": "~1.4.0"
952 | }
953 | },
954 | "serve-static": {
955 | "version": "1.13.2",
956 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.2.tgz",
957 | "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==",
958 | "requires": {
959 | "encodeurl": "~1.0.2",
960 | "escape-html": "~1.0.3",
961 | "parseurl": "~1.3.2",
962 | "send": "0.16.2"
963 | }
964 | },
965 | "setprototypeof": {
966 | "version": "1.1.0",
967 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
968 | "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ=="
969 | },
970 | "sift": {
971 | "version": "7.0.1",
972 | "resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
973 | "integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
974 | },
975 | "sliced": {
976 | "version": "1.0.1",
977 | "resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
978 | "integrity": "sha1-CzpmK10Ewxd7GSa+qCsD+Dei70E="
979 | },
980 | "socket.io": {
981 | "version": "4.5.0",
982 | "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.5.0.tgz",
983 | "integrity": "sha512-slTYqU2jCgMjXwresG8grhUi/cC6GjzmcfqArzaH3BN/9I/42eZk9yamNvZJdBfTubkjEdKAKs12NEztId+bUA==",
984 | "requires": {
985 | "accepts": "~1.3.4",
986 | "base64id": "~2.0.0",
987 | "debug": "~4.3.2",
988 | "engine.io": "~6.2.0",
989 | "socket.io-adapter": "~2.4.0",
990 | "socket.io-parser": "~4.0.4"
991 | },
992 | "dependencies": {
993 | "base64id": {
994 | "version": "2.0.0",
995 | "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz",
996 | "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog=="
997 | },
998 | "debug": {
999 | "version": "4.3.4",
1000 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1001 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1002 | "requires": {
1003 | "ms": "2.1.2"
1004 | }
1005 | },
1006 | "ms": {
1007 | "version": "2.1.2",
1008 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1009 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1010 | }
1011 | }
1012 | },
1013 | "socket.io-adapter": {
1014 | "version": "2.4.0",
1015 | "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.4.0.tgz",
1016 | "integrity": "sha512-W4N+o69rkMEGVuk2D/cvca3uYsvGlMwsySWV447y99gUPghxq42BxqLNMndb+a1mm/5/7NeXVQS7RLa2XyXvYg=="
1017 | },
1018 | "socket.io-parser": {
1019 | "version": "4.0.4",
1020 | "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz",
1021 | "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==",
1022 | "requires": {
1023 | "@types/component-emitter": "^1.2.10",
1024 | "component-emitter": "~1.3.0",
1025 | "debug": "~4.3.1"
1026 | },
1027 | "dependencies": {
1028 | "debug": {
1029 | "version": "4.3.4",
1030 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
1031 | "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
1032 | "requires": {
1033 | "ms": "2.1.2"
1034 | }
1035 | },
1036 | "ms": {
1037 | "version": "2.1.2",
1038 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
1039 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w=="
1040 | }
1041 | }
1042 | },
1043 | "sshpk": {
1044 | "version": "1.14.2",
1045 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
1046 | "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
1047 | "dev": true,
1048 | "requires": {
1049 | "asn1": "~0.2.3",
1050 | "assert-plus": "^1.0.0",
1051 | "bcrypt-pbkdf": "^1.0.0",
1052 | "dashdash": "^1.12.0",
1053 | "ecc-jsbn": "~0.1.1",
1054 | "getpass": "^0.1.1",
1055 | "jsbn": "~0.1.0",
1056 | "safer-buffer": "^2.0.2",
1057 | "tweetnacl": "~0.14.0"
1058 | }
1059 | },
1060 | "statuses": {
1061 | "version": "1.4.0",
1062 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz",
1063 | "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew=="
1064 | },
1065 | "tough-cookie": {
1066 | "version": "2.3.4",
1067 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
1068 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
1069 | "dev": true,
1070 | "requires": {
1071 | "punycode": "^1.4.1"
1072 | }
1073 | },
1074 | "tunnel-agent": {
1075 | "version": "0.6.0",
1076 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
1077 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
1078 | "dev": true,
1079 | "requires": {
1080 | "safe-buffer": "^5.0.1"
1081 | }
1082 | },
1083 | "tweetnacl": {
1084 | "version": "0.14.5",
1085 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
1086 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
1087 | "dev": true,
1088 | "optional": true
1089 | },
1090 | "type-is": {
1091 | "version": "1.6.16",
1092 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
1093 | "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
1094 | "requires": {
1095 | "media-typer": "0.3.0",
1096 | "mime-types": "~2.1.18"
1097 | }
1098 | },
1099 | "unpipe": {
1100 | "version": "1.0.0",
1101 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
1102 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw="
1103 | },
1104 | "utils-merge": {
1105 | "version": "1.0.1",
1106 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
1107 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM="
1108 | },
1109 | "uuid": {
1110 | "version": "3.3.2",
1111 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1112 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
1113 | "dev": true
1114 | },
1115 | "vary": {
1116 | "version": "1.1.2",
1117 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
1118 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw="
1119 | },
1120 | "verror": {
1121 | "version": "1.10.0",
1122 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
1123 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
1124 | "dev": true,
1125 | "requires": {
1126 | "assert-plus": "^1.0.0",
1127 | "core-util-is": "1.0.2",
1128 | "extsprintf": "^1.2.0"
1129 | }
1130 | },
1131 | "wrappy": {
1132 | "version": "1.0.2",
1133 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1134 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1135 | "dev": true
1136 | },
1137 | "ws": {
1138 | "version": "8.2.3",
1139 | "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz",
1140 | "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA=="
1141 | }
1142 | }
1143 | }
1144 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "demo-chat-app",
3 | "version": "1.0.0",
4 | "description": "demo chat app",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "jasmine"
8 | },
9 | "author": "",
10 | "license": "ISC",
11 | "dependencies": {
12 | "body-parser": "^1.18.3",
13 | "express": "^4.16.3",
14 | "mongoose": "^6.3.3",
15 | "socket.io": "^4.5.0"
16 | },
17 | "devDependencies": {
18 | "jasmine": "^3.1.0",
19 | "request": "^2.87.0"
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/server.js:
--------------------------------------------------------------------------------
1 | var express = require('express');
2 | var bodyParser = require('body-parser')
3 | var app = express();
4 | var http = require('http').Server(app);
5 | var io = require('socket.io')(http);
6 | var mongoose = require('mongoose');
7 |
8 | app.use(express.static(__dirname));
9 | app.use(bodyParser.json());
10 | app.use(bodyParser.urlencoded({extended: false}))
11 |
12 | var Message = mongoose.model('Message',{
13 | name : String,
14 | message : String
15 | })
16 |
17 | var dbUrl = 'mongodb://amkurian:amkurian1@ds257981.mlab.com:57981/simple-chat'
18 |
19 | app.get('/messages', (req, res) => {
20 | Message.find({},(err, messages)=> {
21 | res.send(messages);
22 | })
23 | })
24 |
25 |
26 | app.get('/messages/:user', (req, res) => {
27 | var user = req.params.user
28 | Message.find({name: user},(err, messages)=> {
29 | res.send(messages);
30 | })
31 | })
32 |
33 |
34 | app.post('/messages', async (req, res) => {
35 | try{
36 | var message = new Message(req.body);
37 |
38 | var savedMessage = await message.save()
39 | console.log('saved');
40 |
41 | var censored = await Message.findOne({message:'badword'});
42 | if(censored)
43 | await Message.remove({_id: censored.id})
44 | else
45 | io.emit('message', req.body);
46 | res.sendStatus(200);
47 | }
48 | catch (error){
49 | res.sendStatus(500);
50 | return console.log('error',error);
51 | }
52 | finally{
53 | console.log('Message Posted')
54 | }
55 |
56 | })
57 |
58 |
59 |
60 | io.on('connection', () =>{
61 | console.log('a user is connected')
62 | })
63 |
64 | mongoose.connect(dbUrl ,{useMongoClient : false} ,(err) => {
65 | console.log('mongodb connected',err);
66 | })
67 |
68 | var server = http.listen(3000, () => {
69 | console.log('server is running on port', server.address().port);
70 | });
71 |
--------------------------------------------------------------------------------
/spec/server.spec.js:
--------------------------------------------------------------------------------
1 | var request = require('request')
2 |
3 |
4 | describe('get messages', () => {
5 | it('should return 200 Ok', (done) => {
6 | request.get('http://localhost:3000/messages', (err, res) => {
7 | expect(res.statusCode).toEqual(200)
8 | done()
9 | })
10 | })
11 | it('should return a list, thats not empty', (done) => {
12 | request.get('http://localhost:3000/messages', (err, res) => {
13 | expect(JSON.parse(res.body).length).toBeGreaterThan(0)
14 | done()
15 | })
16 | })
17 | })
18 |
19 |
20 | describe('get messages from particular user', () => {
21 | it('should return 200 Ok', (done) => {
22 | request.get('http://localhost:3000/messages/Arun', (err, res) => {
23 | expect(res.statusCode).toEqual(200)
24 | done()
25 | })
26 | })
27 | it('should return the message of the user', (done) => {
28 | request.get('http://localhost:3000/messages/Arun', (err, res) => {
29 | expect(JSON.parse(res.body)[0].name).toEqual('Arun')
30 | done()
31 | })
32 | })
33 | })
34 |
--------------------------------------------------------------------------------
/spec/support/jasmine.json:
--------------------------------------------------------------------------------
1 | {
2 | "spec_dir": "spec",
3 | "spec_files": [
4 | "**/*[sS]pec.js"
5 | ],
6 | "helpers": [
7 | "helpers/**/*.js"
8 | ],
9 | "stopSpecOnExpectationFailure": false,
10 | "random": true
11 | }
12 |
--------------------------------------------------------------------------------