@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.
- package/dist/index.d.mts +54 -0
- package/dist/index.d.ts +5 -4
- package/dist/index.js +52 -61
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +31 -0
- package/dist/index.mjs.map +1 -0
- package/package.json +32 -9
- package/dist/index.d.ts.map +0 -1
- package/src/index.ts +0 -86
package/dist/index.d.mts
ADDED
|
@@ -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
|
|
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
|
-
|
|
52
|
-
|
|
53
|
-
|
|
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
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
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
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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,"
|
|
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.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "Koa request logging middleware for mihari",
|
|
5
|
-
"main": "
|
|
6
|
-
"
|
|
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": "
|
|
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
|
-
"
|
|
16
|
-
"
|
|
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.
|
|
20
|
-
"@mihari/logger-types": "^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": "
|
|
57
|
+
"gitHead": "a0a2dd591dafbf0923bb81bd5d8180fa6d6eecea"
|
|
35
58
|
}
|
package/dist/index.d.ts.map
DELETED
|
@@ -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;
|