@mihari/logger-koa 0.1.0 → 0.2.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.
@@ -0,0 +1,54 @@
1
+ import { MihariConfig } from '@mihari/logger-types';
2
+
3
+ /**
4
+ * Minimal Koa context type to avoid requiring koa as a direct dependency.
5
+ */
6
+ interface KoaContext {
7
+ readonly method: string;
8
+ readonly url: string;
9
+ readonly status: number;
10
+ readonly ip: string;
11
+ readonly request: {
12
+ readonly length?: number;
13
+ readonly get: (header: string) => string;
14
+ };
15
+ readonly response: {
16
+ readonly length?: number;
17
+ };
18
+ }
19
+ type KoaNext = () => Promise<void>;
20
+ type KoaMiddleware = (ctx: KoaContext, next: KoaNext) => Promise<void>;
21
+ /**
22
+ * Creates Koa middleware that logs every HTTP request to mihari.
23
+ *
24
+ * Captured fields:
25
+ * - method: HTTP method (GET, POST, etc.)
26
+ * - url: Request URL
27
+ * - status: Response status code
28
+ * - responseTimeMs: Time to handle the request in milliseconds
29
+ * - userAgent: User-Agent header
30
+ * - contentLength: Response content length
31
+ * - ip: Client IP address
32
+ *
33
+ * Usage:
34
+ * ```typescript
35
+ * import Koa from "koa";
36
+ * import { mihariMiddleware } from "@mihari/logger-koa";
37
+ *
38
+ * const app = new Koa();
39
+ *
40
+ * app.use(mihariMiddleware({
41
+ * token: "your-token",
42
+ * endpoint: "https://logs.example.com",
43
+ * }));
44
+ *
45
+ * app.use(async (ctx) => {
46
+ * ctx.body = "Hello World";
47
+ * });
48
+ *
49
+ * app.listen(3000);
50
+ * ```
51
+ */
52
+ declare function mihariMiddleware(config: MihariConfig): KoaMiddleware;
53
+
54
+ export { mihariMiddleware as default, mihariMiddleware };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,5 @@
1
- import { MihariConfig } from "@mihari/logger-types";
1
+ import { MihariConfig } from '@mihari/logger-types';
2
+
2
3
  /**
3
4
  * Minimal Koa context type to avoid requiring koa as a direct dependency.
4
5
  */
@@ -48,6 +49,6 @@ type KoaMiddleware = (ctx: KoaContext, next: KoaNext) => Promise<void>;
48
49
  * app.listen(3000);
49
50
  * ```
50
51
  */
51
- export declare function mihariMiddleware(config: MihariConfig): KoaMiddleware;
52
- export default mihariMiddleware;
53
- //# sourceMappingURL=index.d.ts.map
52
+ declare function mihariMiddleware(config: MihariConfig): KoaMiddleware;
53
+
54
+ export { mihariMiddleware as default, mihariMiddleware };
package/dist/index.js CHANGED
@@ -1,65 +1,56 @@
1
1
  "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.mihariMiddleware = mihariMiddleware;
4
- const logger_core_1 = require("@mihari/logger-core");
5
- const logger_types_1 = require("@mihari/logger-types");
6
- /**
7
- * Creates Koa middleware that logs every HTTP request to mihari.
8
- *
9
- * Captured fields:
10
- * - method: HTTP method (GET, POST, etc.)
11
- * - url: Request URL
12
- * - status: Response status code
13
- * - responseTimeMs: Time to handle the request in milliseconds
14
- * - userAgent: User-Agent header
15
- * - contentLength: Response content length
16
- * - ip: Client IP address
17
- *
18
- * Usage:
19
- * ```typescript
20
- * import Koa from "koa";
21
- * import { mihariMiddleware } from "@mihari/logger-koa";
22
- *
23
- * const app = new Koa();
24
- *
25
- * app.use(mihariMiddleware({
26
- * token: "your-token",
27
- * endpoint: "https://logs.example.com",
28
- * }));
29
- *
30
- * app.use(async (ctx) => {
31
- * ctx.body = "Hello World";
32
- * });
33
- *
34
- * app.listen(3000);
35
- * ```
36
- */
2
+ var __defProp = Object.defineProperty;
3
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
+ var __getOwnPropNames = Object.getOwnPropertyNames;
5
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
6
+ var __export = (target, all) => {
7
+ for (var name in all)
8
+ __defProp(target, name, { get: all[name], enumerable: true });
9
+ };
10
+ var __copyProps = (to, from, except, desc) => {
11
+ if (from && typeof from === "object" || typeof from === "function") {
12
+ for (let key of __getOwnPropNames(from))
13
+ if (!__hasOwnProp.call(to, key) && key !== except)
14
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
+ }
16
+ return to;
17
+ };
18
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
19
+
20
+ // src/index.ts
21
+ var index_exports = {};
22
+ __export(index_exports, {
23
+ default: () => index_default,
24
+ mihariMiddleware: () => mihariMiddleware
25
+ });
26
+ module.exports = __toCommonJS(index_exports);
27
+ var import_logger_core = require("@mihari/logger-core");
28
+ var import_logger_types = require("@mihari/logger-types");
37
29
  function mihariMiddleware(config) {
38
- const client = new logger_core_1.MihariClient(config);
39
- return async (ctx, next) => {
40
- const startTime = Date.now();
41
- try {
42
- await next();
43
- }
44
- finally {
45
- const responseTimeMs = Date.now() - startTime;
46
- const status = ctx.status;
47
- const level = status >= 500
48
- ? logger_types_1.LogLevel.Error
49
- : status >= 400
50
- ? logger_types_1.LogLevel.Warn
51
- : logger_types_1.LogLevel.Info;
52
- client.log(level, `${ctx.method} ${ctx.url} ${status}`, {
53
- method: ctx.method,
54
- url: ctx.url,
55
- status,
56
- responseTimeMs,
57
- userAgent: ctx.request.get("user-agent"),
58
- contentLength: ctx.response.length,
59
- ip: ctx.ip,
60
- });
61
- }
62
- };
30
+ const client = new import_logger_core.MihariClient(config);
31
+ return async (ctx, next) => {
32
+ const startTime = Date.now();
33
+ try {
34
+ await next();
35
+ } finally {
36
+ const responseTimeMs = Date.now() - startTime;
37
+ const status = ctx.status;
38
+ const level = status >= 500 ? import_logger_types.LogLevel.Error : status >= 400 ? import_logger_types.LogLevel.Warn : import_logger_types.LogLevel.Info;
39
+ client.log(level, `${ctx.method} ${ctx.url} ${status}`, {
40
+ method: ctx.method,
41
+ url: ctx.url,
42
+ status,
43
+ responseTimeMs,
44
+ userAgent: ctx.request.get("user-agent"),
45
+ contentLength: ctx.response.length,
46
+ ip: ctx.ip
47
+ });
48
+ }
49
+ };
63
50
  }
64
- exports.default = mihariMiddleware;
51
+ var index_default = mihariMiddleware;
52
+ // Annotate the CommonJS export names for ESM import in node:
53
+ 0 && (module.exports = {
54
+ mihariMiddleware
55
+ });
65
56
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;AAsDA,4CA6BC;AAnFD,qDAAmD;AACnD,uDAA8D;AAsB9D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,SAAgB,gBAAgB,CAAC,MAAoB;IACnD,MAAM,MAAM,GAAG,IAAI,0BAAY,CAAC,MAAM,CAAC,CAAC;IAExC,OAAO,KAAK,EAAE,GAAe,EAAE,IAAa,EAAiB,EAAE;QAC7D,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAE7B,IAAI,CAAC;YACH,MAAM,IAAI,EAAE,CAAC;QACf,CAAC;gBAAS,CAAC;YACT,MAAM,cAAc,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YAC9C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;YAE1B,MAAM,KAAK,GAAG,MAAM,IAAI,GAAG;gBACzB,CAAC,CAAC,uBAAQ,CAAC,KAAK;gBAChB,CAAC,CAAC,MAAM,IAAI,GAAG;oBACb,CAAC,CAAC,uBAAQ,CAAC,IAAI;oBACf,CAAC,CAAC,uBAAQ,CAAC,IAAI,CAAC;YAEpB,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,GAAG,IAAI,MAAM,EAAE,EAAE;gBACtD,MAAM,EAAE,GAAG,CAAC,MAAM;gBAClB,GAAG,EAAE,GAAG,CAAC,GAAG;gBACZ,MAAM;gBACN,cAAc;gBACd,SAAS,EAAE,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;gBACxC,aAAa,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;gBAClC,EAAE,EAAE,GAAG,CAAC,EAAE;aACX,CAAC,CAAC;QACL,CAAC;IACH,CAAC,CAAC;AACJ,CAAC;AAED,kBAAe,gBAAgB,CAAC"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { MihariClient } from \"@mihari/logger-core\";\nimport { LogLevel, MihariConfig } from \"@mihari/logger-types\";\n\n/**\n * Minimal Koa context type to avoid requiring koa as a direct dependency.\n */\ninterface KoaContext {\n readonly method: string;\n readonly url: string;\n readonly status: number;\n readonly ip: string;\n readonly request: {\n readonly length?: number;\n readonly get: (header: string) => string;\n };\n readonly response: {\n readonly length?: number;\n };\n}\n\ntype KoaNext = () => Promise<void>;\ntype KoaMiddleware = (ctx: KoaContext, next: KoaNext) => Promise<void>;\n\n/**\n * Creates Koa middleware that logs every HTTP request to mihari.\n *\n * Captured fields:\n * - method: HTTP method (GET, POST, etc.)\n * - url: Request URL\n * - status: Response status code\n * - responseTimeMs: Time to handle the request in milliseconds\n * - userAgent: User-Agent header\n * - contentLength: Response content length\n * - ip: Client IP address\n *\n * Usage:\n * ```typescript\n * import Koa from \"koa\";\n * import { mihariMiddleware } from \"@mihari/logger-koa\";\n *\n * const app = new Koa();\n *\n * app.use(mihariMiddleware({\n * token: \"your-token\",\n * endpoint: \"https://logs.example.com\",\n * }));\n *\n * app.use(async (ctx) => {\n * ctx.body = \"Hello World\";\n * });\n *\n * app.listen(3000);\n * ```\n */\nexport function mihariMiddleware(config: MihariConfig): KoaMiddleware {\n const client = new MihariClient(config);\n\n return async (ctx: KoaContext, next: KoaNext): Promise<void> => {\n const startTime = Date.now();\n\n try {\n await next();\n } finally {\n const responseTimeMs = Date.now() - startTime;\n const status = ctx.status;\n\n const level = status >= 500\n ? LogLevel.Error\n : status >= 400\n ? LogLevel.Warn\n : LogLevel.Info;\n\n client.log(level, `${ctx.method} ${ctx.url} ${status}`, {\n method: ctx.method,\n url: ctx.url,\n status,\n responseTimeMs,\n userAgent: ctx.request.get(\"user-agent\"),\n contentLength: ctx.response.length,\n ip: ctx.ip,\n });\n }\n };\n}\n\nexport default mihariMiddleware;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,yBAA6B;AAC7B,0BAAuC;AAqDhC,SAAS,iBAAiB,QAAqC;AACpE,QAAM,SAAS,IAAI,gCAAa,MAAM;AAEtC,SAAO,OAAO,KAAiB,SAAiC;AAC9D,UAAM,YAAY,KAAK,IAAI;AAE3B,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,YAAM,iBAAiB,KAAK,IAAI,IAAI;AACpC,YAAM,SAAS,IAAI;AAEnB,YAAM,QAAQ,UAAU,MACpB,6BAAS,QACT,UAAU,MACR,6BAAS,OACT,6BAAS;AAEf,aAAO,IAAI,OAAO,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI;AAAA,QACtD,QAAQ,IAAI;AAAA,QACZ,KAAK,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW,IAAI,QAAQ,IAAI,YAAY;AAAA,QACvC,eAAe,IAAI,SAAS;AAAA,QAC5B,IAAI,IAAI;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
package/dist/index.mjs ADDED
@@ -0,0 +1,31 @@
1
+ // src/index.ts
2
+ import { MihariClient } from "@mihari/logger-core";
3
+ import { LogLevel } from "@mihari/logger-types";
4
+ function mihariMiddleware(config) {
5
+ const client = new MihariClient(config);
6
+ return async (ctx, next) => {
7
+ const startTime = Date.now();
8
+ try {
9
+ await next();
10
+ } finally {
11
+ const responseTimeMs = Date.now() - startTime;
12
+ const status = ctx.status;
13
+ const level = status >= 500 ? LogLevel.Error : status >= 400 ? LogLevel.Warn : LogLevel.Info;
14
+ client.log(level, `${ctx.method} ${ctx.url} ${status}`, {
15
+ method: ctx.method,
16
+ url: ctx.url,
17
+ status,
18
+ responseTimeMs,
19
+ userAgent: ctx.request.get("user-agent"),
20
+ contentLength: ctx.response.length,
21
+ ip: ctx.ip
22
+ });
23
+ }
24
+ };
25
+ }
26
+ var index_default = mihariMiddleware;
27
+ export {
28
+ index_default as default,
29
+ mihariMiddleware
30
+ };
31
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["import { MihariClient } from \"@mihari/logger-core\";\nimport { LogLevel, MihariConfig } from \"@mihari/logger-types\";\n\n/**\n * Minimal Koa context type to avoid requiring koa as a direct dependency.\n */\ninterface KoaContext {\n readonly method: string;\n readonly url: string;\n readonly status: number;\n readonly ip: string;\n readonly request: {\n readonly length?: number;\n readonly get: (header: string) => string;\n };\n readonly response: {\n readonly length?: number;\n };\n}\n\ntype KoaNext = () => Promise<void>;\ntype KoaMiddleware = (ctx: KoaContext, next: KoaNext) => Promise<void>;\n\n/**\n * Creates Koa middleware that logs every HTTP request to mihari.\n *\n * Captured fields:\n * - method: HTTP method (GET, POST, etc.)\n * - url: Request URL\n * - status: Response status code\n * - responseTimeMs: Time to handle the request in milliseconds\n * - userAgent: User-Agent header\n * - contentLength: Response content length\n * - ip: Client IP address\n *\n * Usage:\n * ```typescript\n * import Koa from \"koa\";\n * import { mihariMiddleware } from \"@mihari/logger-koa\";\n *\n * const app = new Koa();\n *\n * app.use(mihariMiddleware({\n * token: \"your-token\",\n * endpoint: \"https://logs.example.com\",\n * }));\n *\n * app.use(async (ctx) => {\n * ctx.body = \"Hello World\";\n * });\n *\n * app.listen(3000);\n * ```\n */\nexport function mihariMiddleware(config: MihariConfig): KoaMiddleware {\n const client = new MihariClient(config);\n\n return async (ctx: KoaContext, next: KoaNext): Promise<void> => {\n const startTime = Date.now();\n\n try {\n await next();\n } finally {\n const responseTimeMs = Date.now() - startTime;\n const status = ctx.status;\n\n const level = status >= 500\n ? LogLevel.Error\n : status >= 400\n ? LogLevel.Warn\n : LogLevel.Info;\n\n client.log(level, `${ctx.method} ${ctx.url} ${status}`, {\n method: ctx.method,\n url: ctx.url,\n status,\n responseTimeMs,\n userAgent: ctx.request.get(\"user-agent\"),\n contentLength: ctx.response.length,\n ip: ctx.ip,\n });\n }\n };\n}\n\nexport default mihariMiddleware;\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,SAAS,gBAA8B;AAqDhC,SAAS,iBAAiB,QAAqC;AACpE,QAAM,SAAS,IAAI,aAAa,MAAM;AAEtC,SAAO,OAAO,KAAiB,SAAiC;AAC9D,UAAM,YAAY,KAAK,IAAI;AAE3B,QAAI;AACF,YAAM,KAAK;AAAA,IACb,UAAE;AACA,YAAM,iBAAiB,KAAK,IAAI,IAAI;AACpC,YAAM,SAAS,IAAI;AAEnB,YAAM,QAAQ,UAAU,MACpB,SAAS,QACT,UAAU,MACR,SAAS,OACT,SAAS;AAEf,aAAO,IAAI,OAAO,GAAG,IAAI,MAAM,IAAI,IAAI,GAAG,IAAI,MAAM,IAAI;AAAA,QACtD,QAAQ,IAAI;AAAA,QACZ,KAAK,IAAI;AAAA,QACT;AAAA,QACA;AAAA,QACA,WAAW,IAAI,QAAQ,IAAI,YAAY;AAAA,QACvC,eAAe,IAAI,SAAS;AAAA,QAC5B,IAAI,IAAI;AAAA,MACV,CAAC;AAAA,IACH;AAAA,EACF;AACF;AAEA,IAAO,gBAAQ;","names":[]}
package/package.json CHANGED
@@ -1,23 +1,46 @@
1
1
  {
2
2
  "name": "@mihari/logger-koa",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Koa request logging middleware for mihari",
5
- "main": "src/index.ts",
6
- "types": "src/index.ts",
5
+ "main": "./dist/index.js",
6
+ "module": "./dist/index.mjs",
7
+ "types": "./dist/index.d.ts",
8
+ "exports": {
9
+ ".": {
10
+ "types": "./dist/index.d.ts",
11
+ "import": "./dist/index.mjs",
12
+ "require": "./dist/index.js"
13
+ }
14
+ },
7
15
  "files": [
8
16
  "dist"
9
17
  ],
10
18
  "scripts": {
11
- "build": "tsc",
19
+ "build": "tsup",
12
20
  "clean": "rm -rf dist",
13
21
  "test": "cd ../.. && npx vitest run --config vitest.config.ts packages/koa"
14
22
  },
15
- "devDependencies": {
16
- "vitest": "^3.0.0"
23
+ "tsup": {
24
+ "entry": [
25
+ "src/index.ts"
26
+ ],
27
+ "format": [
28
+ "cjs",
29
+ "esm"
30
+ ],
31
+ "dts": true,
32
+ "splitting": false,
33
+ "sourcemap": true,
34
+ "clean": true,
35
+ "external": [
36
+ "koa",
37
+ "@mihari/logger-core",
38
+ "@mihari/logger-types"
39
+ ]
17
40
  },
18
41
  "dependencies": {
19
- "@mihari/logger-core": "^0.1.0",
20
- "@mihari/logger-types": "^0.1.0"
42
+ "@mihari/logger-core": "^0.2.0",
43
+ "@mihari/logger-types": "^0.2.0"
21
44
  },
22
45
  "peerDependencies": {
23
46
  "koa": ">=2.0.0"
@@ -31,5 +54,5 @@
31
54
  "url": "https://github.com/mihari/mihari-js",
32
55
  "directory": "packages/koa"
33
56
  },
34
- "gitHead": "dc10a3217caa819965eb3a1e2ff3901a16e510aa"
57
+ "gitHead": "a0a2dd591dafbf0923bb81bd5d8180fa6d6eecea"
35
58
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAY,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE9D;;GAEG;AACH,UAAU,UAAU;IAClB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC;KAC1C,CAAC;IACF,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;KAC1B,CAAC;CACH;AAED,KAAK,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;AACnC,KAAK,aAAa,GAAG,CAAC,GAAG,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAEvE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,CA6BpE;AAED,eAAe,gBAAgB,CAAC"}
package/src/index.ts DELETED
@@ -1,86 +0,0 @@
1
- import { MihariClient } from "@mihari/logger-core";
2
- import { LogLevel, MihariConfig } from "@mihari/logger-types";
3
-
4
- /**
5
- * Minimal Koa context type to avoid requiring koa as a direct dependency.
6
- */
7
- interface KoaContext {
8
- readonly method: string;
9
- readonly url: string;
10
- readonly status: number;
11
- readonly ip: string;
12
- readonly request: {
13
- readonly length?: number;
14
- readonly get: (header: string) => string;
15
- };
16
- readonly response: {
17
- readonly length?: number;
18
- };
19
- }
20
-
21
- type KoaNext = () => Promise<void>;
22
- type KoaMiddleware = (ctx: KoaContext, next: KoaNext) => Promise<void>;
23
-
24
- /**
25
- * Creates Koa middleware that logs every HTTP request to mihari.
26
- *
27
- * Captured fields:
28
- * - method: HTTP method (GET, POST, etc.)
29
- * - url: Request URL
30
- * - status: Response status code
31
- * - responseTimeMs: Time to handle the request in milliseconds
32
- * - userAgent: User-Agent header
33
- * - contentLength: Response content length
34
- * - ip: Client IP address
35
- *
36
- * Usage:
37
- * ```typescript
38
- * import Koa from "koa";
39
- * import { mihariMiddleware } from "@mihari/logger-koa";
40
- *
41
- * const app = new Koa();
42
- *
43
- * app.use(mihariMiddleware({
44
- * token: "your-token",
45
- * endpoint: "https://logs.example.com",
46
- * }));
47
- *
48
- * app.use(async (ctx) => {
49
- * ctx.body = "Hello World";
50
- * });
51
- *
52
- * app.listen(3000);
53
- * ```
54
- */
55
- export function mihariMiddleware(config: MihariConfig): KoaMiddleware {
56
- const client = new MihariClient(config);
57
-
58
- return async (ctx: KoaContext, next: KoaNext): Promise<void> => {
59
- const startTime = Date.now();
60
-
61
- try {
62
- await next();
63
- } finally {
64
- const responseTimeMs = Date.now() - startTime;
65
- const status = ctx.status;
66
-
67
- const level = status >= 500
68
- ? LogLevel.Error
69
- : status >= 400
70
- ? LogLevel.Warn
71
- : LogLevel.Info;
72
-
73
- client.log(level, `${ctx.method} ${ctx.url} ${status}`, {
74
- method: ctx.method,
75
- url: ctx.url,
76
- status,
77
- responseTimeMs,
78
- userAgent: ctx.request.get("user-agent"),
79
- contentLength: ctx.response.length,
80
- ip: ctx.ip,
81
- });
82
- }
83
- };
84
- }
85
-
86
- export default mihariMiddleware;