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