@visulima/pail 4.0.0-alpha.11 → 4.0.0-alpha.13
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/CHANGELOG.md +33 -0
- package/LICENSE.md +131 -900
- package/dist/error.d.ts +95 -96
- package/dist/error.js +5 -76
- package/dist/index.browser.d.ts +557 -47
- package/dist/index.browser.js +19 -1499
- package/dist/index.server.d.ts +722 -61
- package/dist/index.server.js +31 -2803
- package/dist/middleware/elysia.d.ts +65 -63
- package/dist/middleware/elysia.js +1 -70
- package/dist/middleware/express.d.ts +73 -71
- package/dist/middleware/express.js +1 -29
- package/dist/middleware/fastify.d.ts +69 -67
- package/dist/middleware/fastify.js +1 -46
- package/dist/middleware/hono.d.ts +74 -72
- package/dist/middleware/hono.js +1 -33
- package/dist/middleware/next/handler.d.ts +101 -34
- package/dist/middleware/next/handler.js +1 -53
- package/dist/middleware/sveltekit.d.ts +100 -98
- package/dist/middleware/sveltekit.js +1 -43
- package/dist/object-tree.d.ts +67 -70
- package/dist/object-tree.js +2 -89
- package/dist/packem_shared/AbstractJsonReporter-BawNFYxI.js +1 -0
- package/dist/packem_shared/AbstractJsonReporter-Dt5-5x2R.js +1 -0
- package/dist/packem_shared/JsonReporter-15ln04rX.js +2 -0
- package/dist/packem_shared/JsonReporter-CerNvhg-.js +1 -0
- package/dist/packem_shared/PrettyReporter-Br5njEEy.js +5 -0
- package/dist/packem_shared/PrettyReporter-CgXnwIip.js +44 -0
- package/dist/packem_shared/abstract-json-reporter.d-Bz3lZEDi.d.ts +61 -0
- package/dist/packem_shared/abstract-pretty-reporter-BiHgKxG_.js +33 -0
- package/dist/packem_shared/constants-DKfCaSUR.js +1 -0
- package/dist/packem_shared/constants-ep2nsfdy.js +1 -0
- package/dist/packem_shared/create-middleware-logger.d-DeNLii5l.d.ts +47 -0
- package/dist/packem_shared/createPailError-53jAfQ-T.js +5 -0
- package/dist/packem_shared/headers-S8WyX-2m.js +1 -0
- package/dist/packem_shared/index-Bzp4LnJ5.js +1 -0
- package/dist/packem_shared/pailMiddleware-CWOJRmJq.js +1 -0
- package/dist/packem_shared/storage-DHM1EP2P.js +1 -0
- package/dist/packem_shared/types.d-ByY2ZuYG.d.ts +246 -0
- package/dist/packem_shared/types.d-C51XNfQz.d.ts +194 -0
- package/dist/packem_shared/types.d-CM5ie2qm.d.ts +236 -0
- package/dist/packem_shared/useLogger-qyZrjy4D.js +1 -0
- package/dist/packem_shared/wide-event.d-Ke44zirU.d.ts +704 -0
- package/dist/packem_shared/write-console-log-based-on-level-DfD64owL.js +1 -0
- package/dist/packem_shared/write-stream-Dd4_PTcm.js +1 -0
- package/dist/processor/caller/caller-processor.d.ts +49 -47
- package/dist/processor/caller/caller-processor.js +1 -59
- package/dist/processor/environment-processor.d.ts +113 -113
- package/dist/processor/environment-processor.js +1 -89
- package/dist/processor/message-formatter-processor.d.ts +51 -49
- package/dist/processor/message-formatter-processor.js +1 -715
- package/dist/processor/opentelemetry-processor.d.ts +69 -66
- package/dist/processor/opentelemetry-processor.js +1 -52
- package/dist/processor/redact-processor.d.ts +60 -41
- package/dist/processor/redact-processor.js +1 -31
- package/dist/processor/sampling-processor.d.ts +102 -101
- package/dist/processor/sampling-processor.js +1 -59
- package/dist/reporter/file/json-file-reporter.d.ts +91 -42
- package/dist/reporter/file/json-file-reporter.js +2 -136
- package/dist/reporter/http/abstract-http-reporter.d.ts +213 -211
- package/dist/reporter/http/abstract-http-reporter.js +2 -432
- package/dist/reporter/http/http-reporter.d.ts +40 -36
- package/dist/reporter/http/http-reporter.edge-light.d.ts +430 -38
- package/dist/reporter/http/http-reporter.edge-light.js +2 -728
- package/dist/reporter/http/http-reporter.js +1 -13
- package/dist/reporter/json/index.browser.d.ts +99 -3
- package/dist/reporter/json/index.browser.js +1 -2
- package/dist/reporter/json/index.d.ts +51 -3
- package/dist/reporter/json/index.js +1 -2
- package/dist/reporter/pretty/index.browser.d.ts +106 -2
- package/dist/reporter/pretty/index.browser.js +1 -1
- package/dist/reporter/pretty/index.d.ts +186 -2
- package/dist/reporter/pretty/index.js +1 -1
- package/dist/reporter/simple/simple-reporter.server.d.ts +168 -18
- package/dist/reporter/simple/simple-reporter.server.js +8 -182
- package/dist/wide-event.d.ts +5 -300
- package/dist/wide-event.js +1 -284
- package/package.json +29 -30
- package/dist/constants.d.ts +0 -37
- package/dist/middleware/next/middleware.d.ts +0 -59
- package/dist/middleware/next/storage.d.ts +0 -14
- package/dist/middleware/shared/create-middleware-logger.d.ts +0 -82
- package/dist/middleware/shared/headers.d.ts +0 -14
- package/dist/middleware/shared/routes.d.ts +0 -30
- package/dist/middleware/shared/storage.d.ts +0 -29
- package/dist/packem_shared/AbstractJsonReporter-BO8Calb4.js +0 -284
- package/dist/packem_shared/AbstractJsonReporter-nOj0Ft1F.js +0 -284
- package/dist/packem_shared/JsonReporter-CCmj7oYL.js +0 -28
- package/dist/packem_shared/JsonReporter-Ck2PIAEw.js +0 -58
- package/dist/packem_shared/PrettyReporter-BCvyNzXO.js +0 -2720
- package/dist/packem_shared/PrettyReporter-BtTr13Ha.js +0 -213
- package/dist/packem_shared/abstract-pretty-reporter-CXAKYCb8.js +0 -2635
- package/dist/packem_shared/constants-B1RjD_ps.js +0 -99
- package/dist/packem_shared/constants-omsTHUWB.js +0 -119
- package/dist/packem_shared/createPailError-B_sgL0nF.js +0 -76
- package/dist/packem_shared/headers-BxHWM6KI.js +0 -127
- package/dist/packem_shared/index-Bx3-C0j9.js +0 -658
- package/dist/packem_shared/pailMiddleware-Ci88geIF.js +0 -24
- package/dist/packem_shared/storage-D0vqz8OX.js +0 -36
- package/dist/packem_shared/useLogger-D0rU3lcX.js +0 -33
- package/dist/packem_shared/write-console-log-based-on-level-ree2lDPw.js +0 -15
- package/dist/packem_shared/write-stream-MDqyXmc_.js +0 -6
- package/dist/pail.browser.d.ts +0 -412
- package/dist/pail.server.d.ts +0 -158
- package/dist/processor/caller/get-caller-filename.d.ts +0 -23
- package/dist/reporter/file/utils/rotating-file-stream.d.ts +0 -48
- package/dist/reporter/http/utils/compression.d.ts +0 -7
- package/dist/reporter/http/utils/log-size-error.d.ts +0 -30
- package/dist/reporter/http/utils/retry.d.ts +0 -27
- package/dist/reporter/json/abstract-json-reporter.d.ts +0 -61
- package/dist/reporter/json/json-reporter.browser.d.ts +0 -40
- package/dist/reporter/json/json-reporter.server.d.ts +0 -50
- package/dist/reporter/pretty/abstract-pretty-reporter.d.ts +0 -83
- package/dist/reporter/pretty/pretty-reporter.browser.d.ts +0 -36
- package/dist/reporter/pretty/pretty-reporter.server.d.ts +0 -70
- package/dist/reporter/raw/raw-reporter.browser.d.ts +0 -5
- package/dist/reporter/raw/raw-reporter.server.d.ts +0 -13
- package/dist/reporter/utils/default-inspector-config.d.ts +0 -3
- package/dist/reporter/utils/format-label.d.ts +0 -3
- package/dist/types.d.ts +0 -241
- package/dist/utils/arrayify.d.ts +0 -2
- package/dist/utils/get-longest-badge.d.ts +0 -4
- package/dist/utils/get-longest-label.d.ts +0 -4
- package/dist/utils/merge-types.d.ts +0 -4
- package/dist/utils/stream/safe-stream-handler.d.ts +0 -21
- package/dist/utils/write-console-log-based-on-level.d.ts +0 -4
- package/dist/utils/write-stream.d.ts +0 -2
|
@@ -1,71 +1,73 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { W as WideEvent } from "../packem_shared/wide-event.d-Ke44zirU.js";
|
|
2
|
+
import { P as PailMiddlewareOptions } from "../packem_shared/create-middleware-logger.d-DeNLii5l.js";
|
|
3
|
+
import 'safe-stable-stringify';
|
|
4
|
+
import "../packem_shared/types.d-ByY2ZuYG.js";
|
|
5
|
+
import '@visulima/colorize';
|
|
6
|
+
import '@visulima/interactive-manager';
|
|
3
7
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
8
|
+
* An Elysia-like instance that supports the derive/hook registration API.
|
|
9
|
+
* Compatible with Elysia v1+.
|
|
10
|
+
*/
|
|
7
11
|
interface PailElysiaInstance {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
12
|
+
derive: (options: {
|
|
13
|
+
as: string;
|
|
14
|
+
}, handler: (context: {
|
|
15
|
+
request: Request;
|
|
16
|
+
}) => Record<string, unknown>) => PailElysiaInstance;
|
|
17
|
+
onAfterHandle: (options: {
|
|
18
|
+
as: string;
|
|
19
|
+
}, handler: (context: {
|
|
20
|
+
request: Request;
|
|
21
|
+
set: {
|
|
22
|
+
status?: number;
|
|
23
|
+
};
|
|
24
|
+
}) => Promise<void>) => PailElysiaInstance;
|
|
25
|
+
onError: (options: {
|
|
26
|
+
as: string;
|
|
27
|
+
}, handler: (context: {
|
|
28
|
+
error: Error;
|
|
29
|
+
request: Request;
|
|
30
|
+
}) => Promise<void>) => PailElysiaInstance;
|
|
27
31
|
}
|
|
28
32
|
/**
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
33
|
+
* Retrieve the request-scoped WideEvent logger from AsyncLocalStorage.
|
|
34
|
+
* Must be called within a request handler where pail middleware is active.
|
|
35
|
+
* @returns The request-scoped WideEvent logger
|
|
36
|
+
* @throws Error if called outside of the middleware context
|
|
37
|
+
*/
|
|
34
38
|
declare const useLogger: () => WideEvent;
|
|
35
39
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
40
|
+
* Configuration options for the Elysia pail plugin.
|
|
41
|
+
* @template T - Custom logger type names from the pail instance
|
|
42
|
+
*/
|
|
39
43
|
type ElysiaPluginOptions<T extends string = string> = PailMiddlewareOptions<T>;
|
|
40
44
|
/**
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
export { useLogger };
|
|
70
|
-
export type { ElysiaPluginOptions, PailElysiaInstance };
|
|
71
|
-
export type { WideEvent } from "../wide-event.d.ts";
|
|
45
|
+
* Register pail wide event logging as an Elysia plugin.
|
|
46
|
+
*
|
|
47
|
+
* Injects a `log` property into handler context via `derive`, accessible via:
|
|
48
|
+
* - `context.log` in route handlers (auto-injected)
|
|
49
|
+
* - `useLogger()` from anywhere in the async call stack
|
|
50
|
+
*
|
|
51
|
+
* The wide event is automatically emitted on response or error.
|
|
52
|
+
* @param app The Elysia instance
|
|
53
|
+
* @param options Plugin configuration
|
|
54
|
+
* @returns The Elysia instance (for chaining)
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* import { Elysia } from "elysia";
|
|
58
|
+
* import { createPail } from "@visulima/pail";
|
|
59
|
+
* import { pailPlugin, useLogger } from "@visulima/pail/middleware/elysia";
|
|
60
|
+
*
|
|
61
|
+
* const logger = createPail();
|
|
62
|
+
* const app = new Elysia();
|
|
63
|
+
*
|
|
64
|
+
* pailPlugin(app, { pail: logger });
|
|
65
|
+
*
|
|
66
|
+
* app.get("/api/users", ({ log }) => {
|
|
67
|
+
* log.set({ user: { id: 1 } });
|
|
68
|
+
* return { ok: true };
|
|
69
|
+
* });
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
declare const pailPlugin: <T extends string = string>(app: PailElysiaInstance, options: ElysiaPluginOptions<T>) => PailElysiaInstance;
|
|
73
|
+
export { type ElysiaPluginOptions, type PailElysiaInstance, type WideEvent, pailPlugin, useLogger };
|
|
@@ -1,70 +1 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
const __cjs_require = __cjs_createRequire(import.meta.url);
|
|
4
|
-
|
|
5
|
-
const __cjs_getProcess = typeof globalThis !== "undefined" && typeof globalThis.process !== "undefined" ? globalThis.process : process;
|
|
6
|
-
|
|
7
|
-
const __cjs_getBuiltinModule = (module) => {
|
|
8
|
-
// Check if we're in Node.js and version supports getBuiltinModule
|
|
9
|
-
if (typeof __cjs_getProcess !== "undefined" && __cjs_getProcess.versions && __cjs_getProcess.versions.node) {
|
|
10
|
-
const [major, minor] = __cjs_getProcess.versions.node.split(".").map(Number);
|
|
11
|
-
// Node.js 20.16.0+ and 22.3.0+
|
|
12
|
-
if (major > 22 || (major === 22 && minor >= 3) || (major === 20 && minor >= 16)) {
|
|
13
|
-
return __cjs_getProcess.getBuiltinModule(module);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
// Fallback to createRequire
|
|
17
|
-
return __cjs_require(module);
|
|
18
|
-
};
|
|
19
|
-
|
|
20
|
-
const {
|
|
21
|
-
AsyncLocalStorage
|
|
22
|
-
} = __cjs_getBuiltinModule("node:async_hooks");
|
|
23
|
-
import { a as extractSafeHeaders, c as createMiddlewareLogger } from '../packem_shared/headers-BxHWM6KI.js';
|
|
24
|
-
|
|
25
|
-
const storage = new AsyncLocalStorage();
|
|
26
|
-
const activeLoggers = /* @__PURE__ */ new WeakSet();
|
|
27
|
-
const useLogger = () => {
|
|
28
|
-
const logger = storage.getStore();
|
|
29
|
-
if (!logger || !activeLoggers.has(logger)) {
|
|
30
|
-
throw new Error("[pail] useLogger() called outside of Elysia pail plugin context.");
|
|
31
|
-
}
|
|
32
|
-
return logger;
|
|
33
|
-
};
|
|
34
|
-
const pailPlugin = (app, options) => {
|
|
35
|
-
const requestState = /* @__PURE__ */ new WeakMap();
|
|
36
|
-
const emitted = /* @__PURE__ */ new WeakSet();
|
|
37
|
-
return app.derive({ as: "global" }, ({ request }) => {
|
|
38
|
-
const url = new URL(request.url);
|
|
39
|
-
const requestId = request.headers.get("x-request-id") ?? crypto.randomUUID();
|
|
40
|
-
const safeHeaders = extractSafeHeaders(request.headers);
|
|
41
|
-
const result = createMiddlewareLogger(options, {
|
|
42
|
-
headers: safeHeaders,
|
|
43
|
-
method: request.method,
|
|
44
|
-
path: url.pathname,
|
|
45
|
-
requestId
|
|
46
|
-
});
|
|
47
|
-
requestState.set(request, result);
|
|
48
|
-
if (!result.skipped) {
|
|
49
|
-
activeLoggers.add(result.logger);
|
|
50
|
-
storage.enterWith(result.logger);
|
|
51
|
-
}
|
|
52
|
-
return { log: result.logger };
|
|
53
|
-
}).onAfterHandle({ as: "global" }, async ({ request, set }) => {
|
|
54
|
-
const state = requestState.get(request);
|
|
55
|
-
if (!state?.skipped && state && !emitted.has(request)) {
|
|
56
|
-
emitted.add(request);
|
|
57
|
-
state.finish({ status: set.status ?? 200 });
|
|
58
|
-
activeLoggers.delete(state.logger);
|
|
59
|
-
}
|
|
60
|
-
}).onError({ as: "global" }, async ({ error, request }) => {
|
|
61
|
-
const state = requestState.get(request);
|
|
62
|
-
if (!state?.skipped && state && !emitted.has(request)) {
|
|
63
|
-
emitted.add(request);
|
|
64
|
-
state.finish({ error });
|
|
65
|
-
activeLoggers.delete(state.logger);
|
|
66
|
-
}
|
|
67
|
-
});
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
export { pailPlugin, useLogger };
|
|
1
|
+
var f=Object.defineProperty;var g=(e,t)=>f(e,"name",{value:t,configurable:!0});import{createRequire as h}from"node:module";import{a as b,c as q}from"../packem_shared/headers-S8WyX-2m.js";const m=h(import.meta.url),i=typeof globalThis<"u"&&typeof globalThis.process<"u"?globalThis.process:process,_=g(e=>{if(typeof i<"u"&&i.versions&&i.versions.node){const[t,a]=i.versions.node.split(".").map(Number);if(t>22||t===22&&a>=3||t===20&&a>=16)return i.getBuiltinModule(e)}return m(e)},"__cjs_getBuiltinModule"),{AsyncLocalStorage:y}=_("node:async_hooks");var w=Object.defineProperty,c=g((e,t)=>w(e,"name",{value:t,configurable:!0}),"d");const u=new y,d=new WeakSet,L=c(()=>{const e=u.getStore();if(!e||!d.has(e))throw new Error("[pail] useLogger() called outside of Elysia pail plugin context.");return e},"useLogger"),S=c((e,t)=>{const a=new WeakMap,l=new WeakSet;return e.derive({as:"global"},({request:r})=>{const o=new URL(r.url),s=r.headers.get("x-request-id")??crypto.randomUUID(),p=b(r.headers),n=q(t,{headers:p,method:r.method,path:o.pathname,requestId:s});return a.set(r,n),n.skipped||(d.add(n.logger),u.enterWith(n.logger)),{log:n.logger}}).onAfterHandle({as:"global"},async({request:r,set:o})=>{const s=a.get(r);!s?.skipped&&s&&!l.has(r)&&(l.add(r),s.finish({status:o.status??200}),d.delete(s.logger))}).onError({as:"global"},async({error:r,request:o})=>{const s=a.get(o);!s?.skipped&&s&&!l.has(o)&&(l.add(o),s.finish({error:r}),d.delete(s.logger))})},"pailPlugin");export{S as pailPlugin,L as useLogger};
|
|
@@ -1,86 +1,88 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { W as WideEvent } from "../packem_shared/wide-event.d-Ke44zirU.js";
|
|
2
|
+
import { P as PailMiddlewareOptions } from "../packem_shared/create-middleware-logger.d-DeNLii5l.js";
|
|
3
|
+
import 'safe-stable-stringify';
|
|
4
|
+
import "../packem_shared/types.d-ByY2ZuYG.js";
|
|
5
|
+
import '@visulima/colorize';
|
|
6
|
+
import '@visulima/interactive-manager';
|
|
3
7
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
* An Express-like request object with the pail logger attached.
|
|
9
|
+
* Use this to type your route handlers when accessing `req.log`.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import type { PailRequest } from "@visulima/pail/middleware/express";
|
|
13
|
+
*
|
|
14
|
+
* app.get("/api/users", (req: PailRequest, res) => {
|
|
15
|
+
* req.log?.set({ user: { id: 1 } });
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
15
19
|
interface PailRequest {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
headers: Record<string, string | string[] | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* The request-scoped WideEvent logger, attached by pail middleware.
|
|
24
|
+
* Only present for non-excluded routes.
|
|
25
|
+
*/
|
|
26
|
+
log?: WideEvent;
|
|
27
|
+
method: string;
|
|
28
|
+
originalUrl?: string;
|
|
29
|
+
path: string;
|
|
26
30
|
}
|
|
27
31
|
/**
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
* An Express-like response object.
|
|
33
|
+
*/
|
|
30
34
|
interface PailResponse {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
[key: string]: unknown;
|
|
36
|
+
on: (event: string, listener: () => void) => void;
|
|
37
|
+
statusCode: number;
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
40
|
+
* Express-compatible next function.
|
|
41
|
+
*/
|
|
38
42
|
type PailNextFunction = (error?: unknown) => void;
|
|
39
43
|
/**
|
|
40
|
-
|
|
41
|
-
|
|
44
|
+
* The Express middleware function signature returned by `pailMiddleware()`.
|
|
45
|
+
*/
|
|
42
46
|
type PailExpressMiddleware = (request: PailRequest, response: PailResponse, next: PailNextFunction) => void;
|
|
43
47
|
/**
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
48
|
+
* Retrieve the request-scoped WideEvent logger from AsyncLocalStorage.
|
|
49
|
+
* Must be called within a request handled by the pail Express middleware.
|
|
50
|
+
* @returns The request-scoped WideEvent logger
|
|
51
|
+
* @throws Error if called outside of the middleware context
|
|
52
|
+
*/
|
|
49
53
|
declare const useLogger: () => WideEvent;
|
|
50
54
|
/**
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
55
|
+
* Configuration options for the Express pail middleware.
|
|
56
|
+
* @template T - Custom logger type names from the pail instance
|
|
57
|
+
*/
|
|
54
58
|
type ExpressMiddlewareOptions<T extends string = string> = PailMiddlewareOptions<T>;
|
|
55
59
|
/**
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
export { useLogger };
|
|
85
|
-
export type { ExpressMiddlewareOptions, PailExpressMiddleware, PailNextFunction, PailRequest, PailResponse };
|
|
86
|
-
export type { WideEvent } from "../wide-event.d.ts";
|
|
60
|
+
* Create Express middleware that attaches a WideEvent logger to each request.
|
|
61
|
+
*
|
|
62
|
+
* The logger is available via:
|
|
63
|
+
* - `req.log` on the request object
|
|
64
|
+
* - `useLogger()` from anywhere in the async call stack
|
|
65
|
+
*
|
|
66
|
+
* The wide event is automatically emitted when the response finishes.
|
|
67
|
+
* @param options Middleware configuration
|
|
68
|
+
* @returns Express middleware function
|
|
69
|
+
* @example
|
|
70
|
+
* ```typescript
|
|
71
|
+
* import express from "express";
|
|
72
|
+
* import { createPail } from "@visulima/pail";
|
|
73
|
+
* import { pailMiddleware, useLogger } from "@visulima/pail/middleware/express";
|
|
74
|
+
*
|
|
75
|
+
* const app = express();
|
|
76
|
+
* const logger = createPail();
|
|
77
|
+
*
|
|
78
|
+
* app.use(pailMiddleware({ pail: logger }));
|
|
79
|
+
*
|
|
80
|
+
* app.get("/api/users", (req, res) => {
|
|
81
|
+
* req.log.set({ user: { id: 1 } });
|
|
82
|
+
* // or: useLogger().set({ user: { id: 1 } });
|
|
83
|
+
* res.json({ ok: true });
|
|
84
|
+
* });
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
declare const pailMiddleware: <T extends string = string>(options: ExpressMiddlewareOptions<T>) => PailExpressMiddleware;
|
|
88
|
+
export { type ExpressMiddlewareOptions, type PailExpressMiddleware, type PailNextFunction, type PailRequest, type PailResponse, type WideEvent, pailMiddleware, useLogger };
|
|
@@ -1,29 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { c as createLoggerStorage } from '../packem_shared/storage-D0vqz8OX.js';
|
|
3
|
-
|
|
4
|
-
const loggerStorage = createLoggerStorage("Express middleware context. Make sure pail middleware is registered before your route handlers.");
|
|
5
|
-
const useLogger = () => loggerStorage.useLogger();
|
|
6
|
-
const pailMiddleware = (options) => (request, response, next) => {
|
|
7
|
-
const requestId = request.headers["x-request-id"] ?? crypto.randomUUID();
|
|
8
|
-
const path = request.originalUrl ?? request.url ?? "/";
|
|
9
|
-
const safeHeaders = extractSafeNodeHeaders(request.headers);
|
|
10
|
-
const { finish, logger, skipped } = createMiddlewareLogger(options, {
|
|
11
|
-
headers: safeHeaders,
|
|
12
|
-
method: request.method,
|
|
13
|
-
path,
|
|
14
|
-
requestId
|
|
15
|
-
});
|
|
16
|
-
if (skipped) {
|
|
17
|
-
next();
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
request.log = logger;
|
|
21
|
-
response.on("finish", () => {
|
|
22
|
-
finish({ status: response.statusCode });
|
|
23
|
-
});
|
|
24
|
-
loggerStorage.storage.run(logger, () => {
|
|
25
|
-
next();
|
|
26
|
-
});
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export { pailMiddleware, useLogger };
|
|
1
|
+
var c=Object.defineProperty;var t=(r,e)=>c(r,"name",{value:e,configurable:!0});import{e as m,c as f}from"../packem_shared/headers-S8WyX-2m.js";import{c as h}from"../packem_shared/storage-DHM1EP2P.js";var w=Object.defineProperty,d=t((r,e)=>w(r,"name",{value:e,configurable:!0}),"i");const i=h("Express middleware context. Make sure pail middleware is registered before your route handlers."),b=d(()=>i.useLogger(),"useLogger"),v=d(r=>(e,a,o)=>{const g=e.headers["x-request-id"]??crypto.randomUUID(),l=e.originalUrl??e.url??"/",u=m(e.headers),{finish:n,logger:s,skipped:p}=f(r,{headers:u,method:e.method,path:l,requestId:g});if(p){o();return}e.log=s,a.on("finish",()=>{n({status:a.statusCode})}),i.storage.run(s,()=>{o()})},"pailMiddleware");export{v as pailMiddleware,b as useLogger};
|
|
@@ -1,81 +1,83 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
1
|
+
import { W as WideEvent } from "../packem_shared/wide-event.d-Ke44zirU.js";
|
|
2
|
+
import { P as PailMiddlewareOptions } from "../packem_shared/create-middleware-logger.d-DeNLii5l.js";
|
|
3
|
+
import 'safe-stable-stringify';
|
|
4
|
+
import "../packem_shared/types.d-ByY2ZuYG.js";
|
|
5
|
+
import '@visulima/colorize';
|
|
6
|
+
import '@visulima/interactive-manager';
|
|
3
7
|
/**
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
8
|
+
* A Fastify-like request object with the pail logger attached.
|
|
9
|
+
* Use this to type your route handlers when accessing `request.log`.
|
|
10
|
+
* @example
|
|
11
|
+
* ```typescript
|
|
12
|
+
* import type { PailFastifyRequest } from "@visulima/pail/middleware/fastify";
|
|
13
|
+
*
|
|
14
|
+
* app.get("/api/users", async (request: PailFastifyRequest, reply) => {
|
|
15
|
+
* request.log?.set({ user: { id: 1 } });
|
|
16
|
+
* });
|
|
17
|
+
* ```
|
|
18
|
+
*/
|
|
15
19
|
interface PailFastifyRequest {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
[key: string]: unknown;
|
|
21
|
+
headers: Record<string, string | string[] | undefined>;
|
|
22
|
+
/**
|
|
23
|
+
* The request-scoped WideEvent logger, attached by pail plugin.
|
|
24
|
+
* Only present for non-excluded routes.
|
|
25
|
+
*/
|
|
26
|
+
log?: WideEvent;
|
|
27
|
+
method: string;
|
|
28
|
+
url: string;
|
|
25
29
|
}
|
|
26
30
|
/**
|
|
27
|
-
|
|
28
|
-
|
|
31
|
+
* A Fastify-like reply object.
|
|
32
|
+
*/
|
|
29
33
|
interface PailFastifyReply {
|
|
30
|
-
|
|
31
|
-
|
|
34
|
+
[key: string]: unknown;
|
|
35
|
+
statusCode: number;
|
|
32
36
|
}
|
|
33
37
|
/**
|
|
34
|
-
|
|
35
|
-
|
|
38
|
+
* A Fastify-like instance that supports the hook registration API.
|
|
39
|
+
*/
|
|
36
40
|
interface PailFastifyInstance {
|
|
37
|
-
|
|
41
|
+
addHook: ((name: "onError", hook: (request: PailFastifyRequest, reply: PailFastifyReply, error: Error) => Promise<void>) => void) & ((name: "onRequest", hook: (request: PailFastifyRequest, reply: PailFastifyReply, done: () => void) => void) => void) & ((name: "onResponse", hook: (request: PailFastifyRequest, reply: PailFastifyReply) => Promise<void>) => void);
|
|
38
42
|
}
|
|
39
43
|
/**
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
44
|
+
* Retrieve the request-scoped WideEvent logger from AsyncLocalStorage.
|
|
45
|
+
* Must be called within a request handled by the pail Fastify plugin.
|
|
46
|
+
* @returns The request-scoped WideEvent logger
|
|
47
|
+
* @throws Error if called outside of the plugin context
|
|
48
|
+
*/
|
|
45
49
|
declare const useLogger: () => WideEvent;
|
|
46
50
|
/**
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
51
|
+
* Configuration options for the Fastify pail plugin.
|
|
52
|
+
* @template T - Custom logger type names from the pail instance
|
|
53
|
+
*/
|
|
50
54
|
type FastifyPluginOptions<T extends string = string> = PailMiddlewareOptions<T>;
|
|
51
55
|
/**
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
export { useLogger };
|
|
80
|
-
export type { FastifyPluginOptions, PailFastifyInstance, PailFastifyReply, PailFastifyRequest };
|
|
81
|
-
export type { WideEvent } from "../wide-event.d.ts";
|
|
56
|
+
* Register pail wide event logging as a Fastify plugin.
|
|
57
|
+
*
|
|
58
|
+
* Attaches a WideEvent logger to each request, accessible via:
|
|
59
|
+
* - `request.log` on the Fastify request object
|
|
60
|
+
* - `useLogger()` from anywhere in the async call stack
|
|
61
|
+
*
|
|
62
|
+
* The wide event is automatically emitted on response or error.
|
|
63
|
+
* @param fastify The Fastify instance
|
|
64
|
+
* @param options Plugin configuration
|
|
65
|
+
* @example
|
|
66
|
+
* ```typescript
|
|
67
|
+
* import Fastify from "fastify";
|
|
68
|
+
* import { createPail } from "@visulima/pail";
|
|
69
|
+
* import { pailPlugin, useLogger } from "@visulima/pail/middleware/fastify";
|
|
70
|
+
*
|
|
71
|
+
* const app = Fastify();
|
|
72
|
+
* const logger = createPail();
|
|
73
|
+
*
|
|
74
|
+
* pailPlugin(app, { pail: logger });
|
|
75
|
+
*
|
|
76
|
+
* app.get("/api/users", async (request, reply) => {
|
|
77
|
+
* request.log.set({ user: { id: 1 } });
|
|
78
|
+
* return { ok: true };
|
|
79
|
+
* });
|
|
80
|
+
* ```
|
|
81
|
+
*/
|
|
82
|
+
declare const pailPlugin: <T extends string = string>(fastify: PailFastifyInstance, options: FastifyPluginOptions<T>) => void;
|
|
83
|
+
export { type FastifyPluginOptions, type PailFastifyInstance, type PailFastifyReply, type PailFastifyRequest, type WideEvent, pailPlugin, useLogger };
|
|
@@ -1,46 +1 @@
|
|
|
1
|
-
|
|
2
|
-
import { c as createLoggerStorage } from '../packem_shared/storage-D0vqz8OX.js';
|
|
3
|
-
|
|
4
|
-
const loggerStorage = createLoggerStorage("Fastify middleware context. Make sure pail plugin is registered before your route handlers.");
|
|
5
|
-
const useLogger = () => loggerStorage.useLogger();
|
|
6
|
-
const pailPlugin = (fastify, options) => {
|
|
7
|
-
const requestState = /* @__PURE__ */ new WeakMap();
|
|
8
|
-
const emitted = /* @__PURE__ */ new WeakSet();
|
|
9
|
-
fastify.addHook("onRequest", (request, _reply, done) => {
|
|
10
|
-
const requestId = request.headers["x-request-id"] ?? crypto.randomUUID();
|
|
11
|
-
const safeHeaders = extractSafeNodeHeaders(request.headers);
|
|
12
|
-
const { finish, logger, skipped } = createMiddlewareLogger(options, {
|
|
13
|
-
headers: safeHeaders,
|
|
14
|
-
method: request.method,
|
|
15
|
-
path: request.url,
|
|
16
|
-
requestId
|
|
17
|
-
});
|
|
18
|
-
if (skipped) {
|
|
19
|
-
done();
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
request.log = logger;
|
|
23
|
-
requestState.set(request, { finish });
|
|
24
|
-
loggerStorage.storage.run(logger, () => {
|
|
25
|
-
done();
|
|
26
|
-
});
|
|
27
|
-
});
|
|
28
|
-
fastify.addHook("onResponse", async (request, reply) => {
|
|
29
|
-
const state = requestState.get(request);
|
|
30
|
-
if (!state || emitted.has(request)) {
|
|
31
|
-
return;
|
|
32
|
-
}
|
|
33
|
-
emitted.add(request);
|
|
34
|
-
state.finish({ status: reply.statusCode });
|
|
35
|
-
});
|
|
36
|
-
fastify.addHook("onError", async (request, _reply, error) => {
|
|
37
|
-
const state = requestState.get(request);
|
|
38
|
-
if (!state || emitted.has(request)) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
emitted.add(request);
|
|
42
|
-
state.finish({ error });
|
|
43
|
-
});
|
|
44
|
-
};
|
|
45
|
-
|
|
46
|
-
export { pailPlugin, useLogger };
|
|
1
|
+
var h=Object.defineProperty;var g=(r,a)=>h(r,"name",{value:a,configurable:!0});import{e as m,c as k}from"../packem_shared/headers-S8WyX-2m.js";import{c as y}from"../packem_shared/storage-DHM1EP2P.js";var L=Object.defineProperty,u=g((r,a)=>L(r,"name",{value:a,configurable:!0}),"d");const c=y("Fastify middleware context. Make sure pail plugin is registered before your route handlers."),b=u(()=>c.useLogger(),"useLogger"),q=u((r,a)=>{const n=new WeakMap,s=new WeakSet;r.addHook("onRequest",(e,d,o)=>{const t=e.headers["x-request-id"]??crypto.randomUUID(),l=m(e.headers),{finish:p,logger:i,skipped:f}=k(a,{headers:l,method:e.method,path:e.url,requestId:t});if(f){o();return}e.log=i,n.set(e,{finish:p}),c.storage.run(i,()=>{o()})}),r.addHook("onResponse",async(e,d)=>{const o=n.get(e);!o||s.has(e)||(s.add(e),o.finish({status:d.statusCode}))}),r.addHook("onError",async(e,d,o)=>{const t=n.get(e);!t||s.has(e)||(s.add(e),t.finish({error:o}))})},"pailPlugin");export{q as pailPlugin,b as useLogger};
|