kayvee 3.18.0 → 4.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.md +147 -202
  2. package/dist/index.d.ts +4 -0
  3. package/dist/index.d.ts.map +1 -0
  4. package/dist/index.js +29 -0
  5. package/dist/kayvee.d.ts +12 -0
  6. package/dist/kayvee.d.ts.map +1 -0
  7. package/{build/lib → dist}/kayvee.js +17 -30
  8. package/dist/logger/logger.d.ts +49 -0
  9. package/dist/logger/logger.d.ts.map +1 -0
  10. package/{build/lib → dist}/logger/logger.js +91 -83
  11. package/dist/middleware.d.ts +23 -0
  12. package/dist/middleware.d.ts.map +1 -0
  13. package/dist/middleware.js +196 -0
  14. package/dist/package.json +89 -0
  15. package/dist/router/index.d.ts +23 -0
  16. package/dist/router/index.d.ts.map +1 -0
  17. package/{build/lib → dist}/router/index.js +33 -45
  18. package/package.json +63 -27
  19. package/.circleci/config.yml +0 -25
  20. package/.eslintrc.js +0 -124
  21. package/.github/workflows/notify-ci-status.yml +0 -20
  22. package/.nvmrc +0 -1
  23. package/.prettierrc.json +0 -1
  24. package/Makefile +0 -55
  25. package/benchmarks/data/.keep +0 -1
  26. package/benchmarks/data/corpus-basic.json +0 -22
  27. package/benchmarks/data/corpus-pathological.json +0 -22
  28. package/benchmarks/data/corpus-realistic.json +0 -22
  29. package/benchmarks/data/kvconfig-basic.yml +0 -7
  30. package/benchmarks/data/kvconfig-pathological.yml +0 -222
  31. package/benchmarks/data/kvconfig-realistic.yml +0 -39
  32. package/benchmarks/routing.js +0 -116
  33. package/build/lib/logger/helpers.js +0 -0
  34. package/build/lib/middleware.js +0 -274
  35. package/build/package.json +0 -53
  36. package/build/test/context_logger.js +0 -69
  37. package/build/test/kayvee.js +0 -36
  38. package/build/test/logger_test.js +0 -345
  39. package/build/test/middleware.js +0 -556
  40. package/build/test/router.js +0 -451
  41. package/index.js +0 -7
  42. package/lib/kayvee.ts +0 -73
  43. package/lib/logger/helpers.ts +0 -0
  44. package/lib/logger/logger.ts +0 -312
  45. package/lib/middleware.ts +0 -317
  46. package/lib/router/index.ts +0 -234
  47. package/lib/router/schema_definitions.json +0 -158
  48. package/test/context_logger.ts +0 -76
  49. package/test/kayvee.ts +0 -50
  50. package/test/kvconfig.yml +0 -14
  51. package/test/logger_test.ts +0 -378
  52. package/test/middleware.ts +0 -632
  53. package/test/router.ts +0 -558
  54. package/test/static/empty.css +0 -0
  55. package/test/static/js/empty.js +0 -0
  56. package/test/tests.json +0 -100
  57. package/tsconfig.json +0 -10
  58. /package/{build/lib → dist}/router/schema_definitions.json +0 -0
@@ -1,632 +0,0 @@
1
- var assert = require("assert");
2
- var express = require("express");
3
- var http = require("http");
4
- var path = require("path");
5
- var request = require("supertest");
6
- var split = require("split");
7
- var _ = require("underscore");
8
- var kayee_logger = require("../lib/logger/logger");
9
- var kv_middleware = require("../lib/middleware");
10
-
11
- kayee_logger.setGlobalRouting(path.join(__dirname, "/kvconfig.yml"));
12
-
13
- /*
14
- * Helpers copied from expressjs/morgan
15
- * https://github.com/expressjs/morgan/blob/master/test/morgan.js#L1332-L1380
16
- *
17
- * Modified `createServer`, since we are always testing Kayvee middleware here.
18
- * Renamed `after` -> `afterTest`; preventing typescript errors from overloading a Mocha function.
19
- */
20
- function afterTest(count, callback) {
21
- var args = new Array(3);
22
- var i = 0;
23
-
24
- return (err, arg1, arg2) => {
25
- assert.ok(i++ < count, `callback called ${count} times`);
26
-
27
- args[0] = args[0] || err;
28
- args[1] = args[1] || arg1;
29
- args[2] = args[2] || arg2;
30
-
31
- if (count === i) {
32
- callback(...args);
33
- }
34
- };
35
- }
36
-
37
- function createLineStream(callback) {
38
- return split().on("data", callback);
39
- }
40
-
41
- function noopMiddleware(req, res, next) {
42
- next();
43
- }
44
-
45
- function createServer(server_type, clever_options, morgan_options, fn) {
46
- var logger = kv_middleware(clever_options, morgan_options);
47
- var middle = fn || noopMiddleware;
48
-
49
- var server = null;
50
- if (server_type === "http") {
51
- server = http.createServer((req, res) => {
52
- logger(req, res, (err) => {
53
- // allow req, res alterations
54
- middle(req, res, () => {
55
- if (err) {
56
- res.statusCode = 500;
57
- res.end(err.message);
58
- }
59
-
60
- res.setHeader("X-Sent", "true");
61
- res.setHeader("Content-Length", 12345);
62
- res.end((req.connection && req.connection.remoteAddress) || "-");
63
- });
64
- });
65
- });
66
- } else if (server_type === "express") {
67
- var app = express();
68
- app.use(logger);
69
- app.use(express.static(`${__dirname}/static`));
70
- app.get("*", (req, res) => {
71
- res.header("Content-Length", 12345);
72
- res.end();
73
- });
74
-
75
- server = app;
76
- } else {
77
- throw new Error(`unknown server type: ${server_type}`);
78
- }
79
-
80
- return server;
81
- }
82
-
83
- _.each(["http", "express"], (serverType) => {
84
- describe(`middleware for *${serverType}* server: prototype pollution testing`, () => {
85
- it("params with toString is stripped", (done) => {
86
- var cb = afterTest(2, (err, res, line) => {
87
- if (err) {
88
- return done(err);
89
- }
90
- const expected = {
91
- method: "GET",
92
- path: "/hello/world",
93
- params: "?",
94
- "response-size": 12345,
95
- "response-time": 99999,
96
- "status-code": 200,
97
- ip: "::ffff:127.0.0.1",
98
- via: "kayvee-middleware",
99
- level: "info",
100
- title: "request-finished",
101
- deploy_env: "testing",
102
- wf_id: "abc",
103
- source: "test-app",
104
- _kvmeta: {
105
- team: "UNSET",
106
- kv_version: "X.X.X",
107
- kv_language: "js",
108
- routes: [
109
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
110
- ],
111
- },
112
- };
113
- var actual = JSON.parse(line);
114
- actual["response-time"] = 99999; // Masking the two fields that
115
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
116
-
117
- assert.deepEqual(actual, expected);
118
- return done();
119
- });
120
-
121
- var stream = createLineStream((line) => {
122
- cb(null, null, line);
123
- });
124
-
125
- var options = {
126
- source: "test-app",
127
- ignore_dir: {
128
- directory: `${__dirname}/static`,
129
- // path: "/", defaults to /
130
- },
131
- };
132
-
133
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
134
- next();
135
- });
136
-
137
- // this one is logged
138
- request(server).get("/hello/world?toString=foo").expect(200, cb);
139
- });
140
- it("params from actual attack is stripped", (done) => {
141
- var cb = afterTest(2, (err, res, line) => {
142
- if (err) {
143
- return done(err);
144
- }
145
- const expected = {
146
- method: "GET",
147
- path: "/hello/world",
148
- params: "?",
149
- "response-size": 12345,
150
- "response-time": 99999,
151
- "status-code": 200,
152
- ip: "::ffff:127.0.0.1",
153
- via: "kayvee-middleware",
154
- level: "info",
155
- title: "request-finished",
156
- deploy_env: "testing",
157
- wf_id: "abc",
158
- source: "test-app",
159
- _kvmeta: {
160
- team: "UNSET",
161
- kv_version: "X.X.X",
162
- kv_language: "js",
163
- routes: [
164
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
165
- ],
166
- },
167
- };
168
- var actual = JSON.parse(line);
169
- actual["response-time"] = 99999; // Masking the two fields that
170
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
171
-
172
- assert.deepEqual(actual, expected);
173
- return done();
174
- });
175
-
176
- var stream = createLineStream((line) => {
177
- cb(null, null, line);
178
- });
179
-
180
- var options = {
181
- source: "test-app",
182
- ignore_dir: {
183
- directory: `${__dirname}/static`,
184
- // path: "/", defaults to /
185
- },
186
- };
187
-
188
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
189
- next();
190
- });
191
-
192
- const params = `__proto__[Expect]=xxx
193
- &constructor[prototype][Expect]=xxx`;
194
- // this one is logged
195
- request(server).get(`/hello/world?${params}`).expect(200, cb);
196
- });
197
- });
198
- describe(`middleware for *${serverType}* server`, () => {
199
- it("should throw error on intialization if `source` not set in `options`", (done) => {
200
- var options = {};
201
- var erroringServer = () =>
202
- createServer(serverType, options, null, (req, res, next) => {
203
- res.setHeader("some-header", "some-header-value");
204
- next();
205
- });
206
- assert.throws(erroringServer, Error, "Expected an error to be thrown");
207
- return done();
208
- });
209
-
210
- it("should pass default fields", (done) => {
211
- var cb = afterTest(2, (err, res, line) => {
212
- if (err) {
213
- return done(err);
214
- }
215
- const expected = {
216
- method: "GET",
217
- path: "/hello/world",
218
- params: "?a=1&b=2",
219
- "response-size": 12345,
220
- "response-time": 99999,
221
- "status-code": 200,
222
- ip: "::ffff:127.0.0.1",
223
- via: "kayvee-middleware",
224
- level: "info",
225
- title: "request-finished",
226
- deploy_env: "testing",
227
- wf_id: "abc",
228
- source: "test-app",
229
- _kvmeta: {
230
- team: "UNSET",
231
- kv_version: "X.X.X",
232
- kv_language: "js",
233
- routes: [
234
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
235
- ],
236
- },
237
- };
238
-
239
- var actual = JSON.parse(line);
240
- actual["response-time"] = 99999; // Masking the two fields that
241
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
242
-
243
- assert.deepEqual(actual, expected);
244
- return done();
245
- });
246
-
247
- var stream = createLineStream((line) => {
248
- cb(null, null, line);
249
- });
250
-
251
- var options = { source: "test-app" };
252
-
253
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
254
- res.setHeader("some-header", "some-header-value");
255
- next();
256
- });
257
-
258
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
259
- });
260
-
261
- it("should allow logging user-specified request headers", (done) => {
262
- var cb = afterTest(2, (err, res, line) => {
263
- if (err) {
264
- return done(err);
265
- }
266
- const expected = {
267
- "some-header": "some-header-value",
268
- "another-header": "another-header-value",
269
- method: "GET",
270
- path: "/hello/world",
271
- params: "?a=1&b=2",
272
- "response-size": 12345,
273
- "response-time": 99999,
274
- "status-code": 200,
275
- ip: "::ffff:127.0.0.1",
276
- via: "kayvee-middleware",
277
- level: "info",
278
- title: "request-finished",
279
- deploy_env: "testing",
280
- wf_id: "abc",
281
- source: "test-app",
282
- _kvmeta: {
283
- team: "UNSET",
284
- kv_version: "X.X.X",
285
- kv_language: "js",
286
- routes: [
287
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
288
- ],
289
- },
290
- };
291
- var actual = JSON.parse(line);
292
- actual["response-time"] = 99999; // Masking the two fields that
293
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
294
-
295
- assert.deepEqual(actual, expected);
296
- return done();
297
- });
298
-
299
- var stream = createLineStream((line) => {
300
- cb(null, null, line);
301
- });
302
-
303
- var options = {
304
- source: "test-app",
305
- headers: ["some-header", "another-header"],
306
- };
307
-
308
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
309
- next();
310
- });
311
-
312
- request(server)
313
- .get("/hello/world?a=1&b=2")
314
- .set("some-header", "some-header-value")
315
- .set("another-header", "another-header-value")
316
- .expect(200, cb);
317
- });
318
-
319
- it("should allow logging from user-specified handlers", (done) => {
320
- var cb = afterTest(2, (err, res, line) => {
321
- if (err) {
322
- return done(err);
323
- }
324
- const expected = {
325
- global: 1,
326
- global2: 2,
327
- url: "/hello/world?a=1&b=2",
328
- method: "GET",
329
- path: "/hello/world",
330
- params: "?a=1&b=2",
331
- "response-size": 12345,
332
- "response-time": 99999,
333
- "status-code": 200,
334
- ip: "::ffff:127.0.0.1",
335
- via: "kayvee-middleware",
336
- level: "info",
337
- title: "request-finished",
338
- deploy_env: "testing",
339
- wf_id: "abc",
340
- source: "test-app",
341
- _kvmeta: {
342
- team: "UNSET",
343
- kv_version: "X.X.X",
344
- kv_language: "js",
345
- routes: [
346
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
347
- ],
348
- },
349
- };
350
- var actual = JSON.parse(line);
351
- actual["response-time"] = 99999; // Masking the two fields that
352
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
353
-
354
- assert.deepEqual(actual, expected);
355
- return done();
356
- });
357
-
358
- var stream = createLineStream((line) => {
359
- cb(null, null, line);
360
- });
361
-
362
- var options = {
363
- source: "test-app",
364
- handlers: [() => ({ global: 1 }), () => ({ global2: 2 }), (req) => ({ url: req.url })],
365
- };
366
-
367
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
368
- next();
369
- });
370
-
371
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
372
- });
373
-
374
- it("should not log null or undefined values", (done) => {
375
- var cb = afterTest(2, (err, res, line) => {
376
- if (err) {
377
- return done(err);
378
- }
379
- const expected = {
380
- method: "GET",
381
- path: "/hello/world",
382
- params: "?a=1&b=2",
383
- "response-size": 12345,
384
- "response-time": 99999,
385
- "status-code": 200,
386
- ip: "::ffff:127.0.0.1",
387
- via: "kayvee-middleware",
388
- level: "info",
389
- title: "request-finished",
390
- deploy_env: "testing",
391
- wf_id: "abc",
392
- source: "test-app",
393
- _kvmeta: {
394
- team: "UNSET",
395
- kv_version: "X.X.X",
396
- kv_language: "js",
397
- routes: [
398
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
399
- ],
400
- },
401
- };
402
- var actual = JSON.parse(line);
403
- actual["response-time"] = 99999; // Masking the two fields that
404
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
405
-
406
- assert.deepEqual(actual, expected);
407
- return done();
408
- });
409
-
410
- var stream = createLineStream((line) => {
411
- cb(null, null, line);
412
- });
413
-
414
- var options = {
415
- source: "test-app",
416
- // These values should not be logged
417
- headers: ["this-header-dne"],
418
- handlers: [() => ({ undef: undefined })],
419
- };
420
-
421
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
422
- next();
423
- });
424
-
425
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
426
- });
427
-
428
- it("should keep processing if there are broken user-specified handlers", (done) => {
429
- var cb = afterTest(2, (err, res, line) => {
430
- if (err) {
431
- return done(err);
432
- }
433
- const expected = {
434
- global: 1,
435
- method: "GET",
436
- path: "/hello/world",
437
- params: "?a=1&b=2",
438
- "response-size": 12345,
439
- "response-time": 99999,
440
- "status-code": 200,
441
- ip: "::ffff:127.0.0.1",
442
- via: "kayvee-middleware",
443
- level: "info",
444
- title: "request-finished",
445
- deploy_env: "testing",
446
- wf_id: "abc",
447
- source: "test-app",
448
- _kvmeta: {
449
- team: "UNSET",
450
- kv_version: "X.X.X",
451
- kv_language: "js",
452
- routes: [
453
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
454
- ],
455
- },
456
- };
457
- var actual = JSON.parse(line);
458
- actual["response-time"] = 99999; // Masking the two fields that
459
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
460
-
461
- assert.deepEqual(actual, expected);
462
- return done();
463
- });
464
-
465
- var stream = createLineStream((line) => {
466
- cb(null, null, line);
467
- });
468
-
469
- var options = {
470
- source: "test-app",
471
- handlers: [
472
- // This handler should be ignored, because it has an error
473
- () => {
474
- throw new Error("handler that throws an error");
475
- },
476
- // This handler should still work
477
- () => ({ global: 1 }),
478
- ],
479
- };
480
-
481
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
482
- next();
483
- });
484
-
485
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
486
- });
487
-
488
- it("should allow the user to override `base_handlers`", (done) => {
489
- var cb = afterTest(2, (err, res, line) => {
490
- if (err) {
491
- return done(err);
492
- }
493
- const expected = {
494
- global: 1,
495
- base: 1,
496
- deploy_env: "testing",
497
- wf_id: "abc",
498
- source: "test-app",
499
- _kvmeta: {
500
- team: "UNSET",
501
- kv_version: "X.X.X",
502
- kv_language: "js",
503
- routes: [],
504
- },
505
- };
506
-
507
- var actual = JSON.parse(line);
508
- actual._kvmeta.kv_version = "X.X.X"; // Masking field that is expected to change
509
-
510
- assert.deepEqual(actual, expected);
511
- return done();
512
- });
513
-
514
- var stream = createLineStream((line) => {
515
- cb(null, null, line);
516
- });
517
-
518
- var options = {
519
- source: "test-app",
520
- base_handlers: [() => ({ base: 1 })],
521
- handlers: [() => ({ global: 1 })],
522
- };
523
-
524
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
525
- next();
526
- });
527
-
528
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
529
- });
530
-
531
- it("should be robust to handlers that return non Objects", (done) => {
532
- var cb = afterTest(2, (err, res, line) => {
533
- if (err) {
534
- return done(err);
535
- }
536
- const expected = {
537
- global: 1,
538
- base: 1,
539
- source: "test-app",
540
- deploy_env: "testing",
541
- wf_id: "abc",
542
- _kvmeta: {
543
- team: "UNSET",
544
- kv_version: "X.X.X",
545
- kv_language: "js",
546
- routes: [],
547
- },
548
- };
549
-
550
- var actual = JSON.parse(line);
551
- actual._kvmeta.kv_version = "X.X.X"; // Masking field that is expected to change
552
-
553
- assert.deepEqual(actual, expected);
554
- return done();
555
- });
556
-
557
- var stream = createLineStream((line) => {
558
- cb(null, null, line);
559
- });
560
-
561
- var options = {
562
- source: "test-app",
563
- base_handlers: [() => 1, () => "a", () => [], () => ({}), () => ({ base: 1 })],
564
- handlers: [() => 1, () => "a", () => [], () => ({}), () => ({ global: 1 })],
565
- };
566
-
567
- var server = createServer(serverType, options, { stream, skip: null }, (req, res, next) => {
568
- next();
569
- });
570
-
571
- request(server).get("/hello/world?a=1&b=2").expect(200, cb);
572
- });
573
- it("allows ignoring requests to files in a static directory", (done) => {
574
- var cb = afterTest(2, (err, res, line) => {
575
- if (err) {
576
- return done(err);
577
- }
578
- const expected = {
579
- method: "GET",
580
- path: "/hello/world",
581
- params: "?",
582
- "response-size": 12345,
583
- "response-time": 99999,
584
- "status-code": 200,
585
- ip: "::ffff:127.0.0.1",
586
- via: "kayvee-middleware",
587
- level: "info",
588
- title: "request-finished",
589
- deploy_env: "testing",
590
- wf_id: "abc",
591
- source: "test-app",
592
- _kvmeta: {
593
- team: "UNSET",
594
- kv_version: "X.X.X",
595
- kv_language: "js",
596
- routes: [
597
- { type: "analytics", series: "requests.everything", rule: "all-kv_middleware" },
598
- ],
599
- },
600
- };
601
- var actual = JSON.parse(line);
602
- actual["response-time"] = 99999; // Masking the two fields that
603
- actual._kvmeta.kv_version = "X.X.X"; // are expected to change
604
-
605
- assert.deepEqual(actual, expected);
606
- return done();
607
- });
608
-
609
- var stream = createLineStream((line) => {
610
- cb(null, null, line);
611
- });
612
-
613
- var options = {
614
- source: "test-app",
615
- ignore_dir: {
616
- directory: `${__dirname}/static`,
617
- // path: "/", defaults to /
618
- },
619
- };
620
-
621
- var server = createServer(serverType, options, { stream }, (req, res, next) => {
622
- next();
623
- });
624
-
625
- // this line is never logged
626
- request(server).get("/empty.css").expect(200);
627
-
628
- // this one is logged
629
- request(server).get("/hello/world").expect(200, cb);
630
- });
631
- });
632
- });