evlog 2.14.0 → 2.15.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/LICENSE +21 -0
- package/README.md +49 -19
- package/dist/adapters/axiom.d.mts +18 -27
- package/dist/adapters/axiom.d.mts.map +1 -1
- package/dist/adapters/axiom.mjs +40 -30
- package/dist/adapters/axiom.mjs.map +1 -1
- package/dist/adapters/better-stack.d.mts +11 -24
- package/dist/adapters/better-stack.d.mts.map +1 -1
- package/dist/adapters/better-stack.mjs +34 -29
- package/dist/adapters/better-stack.mjs.map +1 -1
- package/dist/adapters/datadog.d.mts +1 -1
- package/dist/adapters/datadog.d.mts.map +1 -1
- package/dist/adapters/datadog.mjs +10 -4
- package/dist/adapters/datadog.mjs.map +1 -1
- package/dist/adapters/fs.d.mts +2 -2
- package/dist/adapters/fs.d.mts.map +1 -1
- package/dist/adapters/fs.mjs +19 -7
- package/dist/adapters/fs.mjs.map +1 -1
- package/dist/adapters/hyperdx.d.mts +1 -1
- package/dist/adapters/hyperdx.mjs +1 -2
- package/dist/adapters/hyperdx.mjs.map +1 -1
- package/dist/adapters/otlp.d.mts +1 -1
- package/dist/adapters/otlp.d.mts.map +1 -1
- package/dist/adapters/otlp.mjs +36 -31
- package/dist/adapters/otlp.mjs.map +1 -1
- package/dist/adapters/posthog.d.mts +50 -70
- package/dist/adapters/posthog.d.mts.map +1 -1
- package/dist/adapters/posthog.mjs +50 -85
- package/dist/adapters/posthog.mjs.map +1 -1
- package/dist/adapters/sentry.d.mts +1 -1
- package/dist/adapters/sentry.d.mts.map +1 -1
- package/dist/adapters/sentry.mjs +15 -5
- package/dist/adapters/sentry.mjs.map +1 -1
- package/dist/ai/index.d.mts +1 -1
- package/dist/{audit-d9esRZOK.mjs → audit--n0QRR2Y.mjs} +202 -20
- package/dist/audit--n0QRR2Y.mjs.map +1 -0
- package/dist/{audit-mUutdf6A.d.mts → audit-CJl-wZ10.d.mts} +144 -2
- package/dist/audit-CJl-wZ10.d.mts.map +1 -0
- package/dist/better-auth/index.d.mts +1 -1
- package/dist/better-auth/index.mjs.map +1 -1
- package/dist/browser.d.mts +1 -1
- package/dist/define-D6OJdSUH.mjs +63 -0
- package/dist/define-D6OJdSUH.mjs.map +1 -0
- package/dist/define-Fp8TrdEB.d.mts +57 -0
- package/dist/define-Fp8TrdEB.d.mts.map +1 -0
- package/dist/{dist-Do8P4zWd.mjs → dist-BIlS38vi.mjs} +1 -1
- package/dist/dist-BIlS38vi.mjs.map +1 -0
- package/dist/drain-ByWUeOQC.mjs +160 -0
- package/dist/drain-ByWUeOQC.mjs.map +1 -0
- package/dist/elysia/index.d.mts +25 -2
- package/dist/elysia/index.d.mts.map +1 -1
- package/dist/elysia/index.mjs +53 -20
- package/dist/elysia/index.mjs.map +1 -1
- package/dist/enricher-BA6viylF.mjs +95 -0
- package/dist/enricher-BA6viylF.mjs.map +1 -0
- package/dist/enricher-CLSnrzrr.d.mts +42 -0
- package/dist/enricher-CLSnrzrr.d.mts.map +1 -0
- package/dist/enrichers.d.mts +16 -9
- package/dist/enrichers.d.mts.map +1 -1
- package/dist/enrichers.mjs +81 -64
- package/dist/enrichers.mjs.map +1 -1
- package/dist/{error-D1FZI2Kd.d.mts → error-C-66_G2M.d.mts} +2 -2
- package/dist/{error-D1FZI2Kd.d.mts.map → error-C-66_G2M.d.mts.map} +1 -1
- package/dist/error.d.mts +1 -1
- package/dist/{errors-BJRXUfMg.mjs → errors-BQgyQ9xe.mjs} +1 -1
- package/dist/{errors-BJRXUfMg.mjs.map → errors-BQgyQ9xe.mjs.map} +1 -1
- package/dist/{errors-NIXCyk6I.d.mts → errors-DQoYsDW1.d.mts} +2 -2
- package/dist/{errors-NIXCyk6I.d.mts.map → errors-DQoYsDW1.d.mts.map} +1 -1
- package/dist/event-ef-5Dbxg.mjs +53 -0
- package/dist/event-ef-5Dbxg.mjs.map +1 -0
- package/dist/express/index.d.mts +2 -2
- package/dist/express/index.d.mts.map +1 -1
- package/dist/express/index.mjs +17 -15
- package/dist/express/index.mjs.map +1 -1
- package/dist/fastify/index.d.mts +2 -2
- package/dist/fastify/index.d.mts.map +1 -1
- package/dist/fastify/index.mjs +19 -20
- package/dist/fastify/index.mjs.map +1 -1
- package/dist/fork-D44V93-K.mjs +227 -0
- package/dist/fork-D44V93-K.mjs.map +1 -0
- package/dist/{headers-D74M0wsg.mjs → headers-CU-QqnYg.mjs} +19 -2
- package/dist/headers-CU-QqnYg.mjs.map +1 -0
- package/dist/hono/index.d.mts +2 -2
- package/dist/hono/index.d.mts.map +1 -1
- package/dist/hono/index.mjs +14 -10
- package/dist/hono/index.mjs.map +1 -1
- package/dist/http.d.mts +1 -1
- package/dist/http.d.mts.map +1 -1
- package/dist/http.mjs +3 -2
- package/dist/http.mjs.map +1 -1
- package/dist/index.d.mts +8 -7
- package/dist/index.mjs +3 -2
- package/dist/integration-Bz8X6_Lb.mjs +75 -0
- package/dist/integration-Bz8X6_Lb.mjs.map +1 -0
- package/dist/{logger-b3epPH0N.d.mts → logger-Brt5-WMK.d.mts} +28 -3
- package/dist/logger-Brt5-WMK.d.mts.map +1 -0
- package/dist/logger.d.mts +2 -2
- package/dist/logger.mjs +2 -2
- package/dist/middleware-CGM-bOvE.d.mts +72 -0
- package/dist/middleware-CGM-bOvE.d.mts.map +1 -0
- package/dist/nestjs/index.d.mts +2 -2
- package/dist/nestjs/index.mjs +3 -4
- package/dist/nestjs/index.mjs.map +1 -1
- package/dist/next/client.d.mts +1 -1
- package/dist/next/index.d.mts +4 -4
- package/dist/next/index.mjs +3 -3
- package/dist/next/index.mjs.map +1 -1
- package/dist/next/instrumentation.d.mts +1 -1
- package/dist/next/instrumentation.mjs +1 -1
- package/dist/next/instrumentation.mjs.map +1 -1
- package/dist/nitro/errorHandler.mjs +2 -2
- package/dist/nitro/errorHandler.mjs.map +1 -1
- package/dist/nitro/module.d.mts +2 -2
- package/dist/nitro/plugin.mjs +21 -11
- package/dist/nitro/plugin.mjs.map +1 -1
- package/dist/nitro/v3/errorHandler.mjs +3 -3
- package/dist/nitro/v3/index.d.mts +2 -2
- package/dist/nitro/v3/middleware.mjs.map +1 -1
- package/dist/nitro/v3/module.d.mts +1 -1
- package/dist/nitro/v3/plugin.mjs +29 -17
- package/dist/nitro/v3/plugin.mjs.map +1 -1
- package/dist/nitro/v3/useLogger.d.mts +1 -1
- package/dist/nitro/v3/useLogger.mjs.map +1 -1
- package/dist/{nitro-DenB86W6.d.mts → nitro-DHPb9dXG.d.mts} +2 -2
- package/dist/{nitro-DenB86W6.d.mts.map → nitro-DHPb9dXG.d.mts.map} +1 -1
- package/dist/{nitro-OmT_M4Pb.mjs → nitro-DavLelNz.mjs} +2 -2
- package/dist/nitro-DavLelNz.mjs.map +1 -0
- package/dist/{nitroConfigBridge-C37lXaNm.mjs → nitroConfigBridge-aZ1e5upQ.mjs} +1 -1
- package/dist/nitroConfigBridge-aZ1e5upQ.mjs.map +1 -0
- package/dist/nuxt/module.d.mts +1 -1
- package/dist/nuxt/module.mjs +2 -2
- package/dist/{parseError-BR9pocvY.d.mts → parseError-B1zJZvQ5.d.mts} +2 -2
- package/dist/parseError-B1zJZvQ5.d.mts.map +1 -0
- package/dist/pipeline.mjs.map +1 -1
- package/dist/react-router/index.d.mts +2 -2
- package/dist/react-router/index.mjs +3 -4
- package/dist/react-router/index.mjs.map +1 -1
- package/dist/{routes-CGPmbzCZ.mjs → routes-B48wm7Pb.mjs} +1 -1
- package/dist/{routes-CGPmbzCZ.mjs.map → routes-B48wm7Pb.mjs.map} +1 -1
- package/dist/runtime/client/log.d.mts +1 -1
- package/dist/runtime/client/log.mjs +2 -2
- package/dist/runtime/client/log.mjs.map +1 -1
- package/dist/runtime/client/plugin.mjs.map +1 -1
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs +21 -10
- package/dist/runtime/server/routes/_evlog/ingest.post.mjs.map +1 -1
- package/dist/runtime/server/useLogger.d.mts +1 -1
- package/dist/runtime/server/useLogger.mjs.map +1 -1
- package/dist/runtime/utils/parseError.d.mts +2 -2
- package/dist/runtime/utils/parseError.mjs +1 -1
- package/dist/{_severity-CQijvfhU.mjs → severity-BYWZ96Sb.mjs} +6 -2
- package/dist/severity-BYWZ96Sb.mjs.map +1 -0
- package/dist/{source-location-DRvDDqfq.mjs → source-location-Dco0cRTz.mjs} +3 -3
- package/dist/source-location-Dco0cRTz.mjs.map +1 -0
- package/dist/storage-BT-3fT1-.mjs +27 -0
- package/dist/storage-BT-3fT1-.mjs.map +1 -0
- package/dist/sveltekit/index.d.mts +2 -2
- package/dist/sveltekit/index.mjs +5 -6
- package/dist/sveltekit/index.mjs.map +1 -1
- package/dist/toolkit.d.mts +288 -12
- package/dist/toolkit.d.mts.map +1 -1
- package/dist/toolkit.mjs +13 -7
- package/dist/types.d.mts +1 -1
- package/dist/{useLogger-C56tDPwf.d.mts → useLogger-Cb1R6bQE.d.mts} +2 -2
- package/dist/{useLogger-C56tDPwf.d.mts.map → useLogger-Cb1R6bQE.d.mts.map} +1 -1
- package/dist/{utils-DzGCLRFe.d.mts → utils-gQCeZMbg.d.mts} +4 -3
- package/dist/utils-gQCeZMbg.d.mts.map +1 -0
- package/dist/utils.d.mts +2 -2
- package/dist/utils.mjs +7 -1
- package/dist/utils.mjs.map +1 -1
- package/dist/vite/index.d.mts +1 -1
- package/dist/vite/index.mjs +1 -1
- package/dist/vite/index.mjs.map +1 -1
- package/dist/workers.d.mts +48 -4
- package/dist/workers.d.mts.map +1 -1
- package/dist/workers.mjs +32 -5
- package/dist/workers.mjs.map +1 -1
- package/package.json +38 -39
- package/dist/_drain-CmCtsuF6.mjs +0 -23
- package/dist/_drain-CmCtsuF6.mjs.map +0 -1
- package/dist/_http-CHSsrWDJ.mjs +0 -71
- package/dist/_http-CHSsrWDJ.mjs.map +0 -1
- package/dist/_severity-CQijvfhU.mjs.map +0 -1
- package/dist/audit-d9esRZOK.mjs.map +0 -1
- package/dist/audit-mUutdf6A.d.mts.map +0 -1
- package/dist/dist-Do8P4zWd.mjs.map +0 -1
- package/dist/fork-CTJXnpl8.mjs +0 -72
- package/dist/fork-CTJXnpl8.mjs.map +0 -1
- package/dist/headers-D74M0wsg.mjs.map +0 -1
- package/dist/logger-b3epPH0N.d.mts.map +0 -1
- package/dist/middleware-BWOJ7JI0.mjs +0 -123
- package/dist/middleware-BWOJ7JI0.mjs.map +0 -1
- package/dist/middleware-BYf26Lfu.d.mts +0 -93
- package/dist/middleware-BYf26Lfu.d.mts.map +0 -1
- package/dist/nitro-OmT_M4Pb.mjs.map +0 -1
- package/dist/nitroConfigBridge-C37lXaNm.mjs.map +0 -1
- package/dist/parseError-BR9pocvY.d.mts.map +0 -1
- package/dist/source-location-DRvDDqfq.mjs.map +0 -1
- package/dist/storage-CFGTn37X.mjs +0 -46
- package/dist/storage-CFGTn37X.mjs.map +0 -1
- package/dist/utils-DzGCLRFe.d.mts.map +0 -1
package/dist/workers.d.mts
CHANGED
|
@@ -1,6 +1,13 @@
|
|
|
1
|
-
import { G as LoggerConfig, Y as RequestLogger } from "./audit-
|
|
1
|
+
import { G as LoggerConfig, Y as RequestLogger } from "./audit-CJl-wZ10.mjs";
|
|
2
2
|
|
|
3
3
|
//#region src/workers/index.d.ts
|
|
4
|
+
/**
|
|
5
|
+
* Minimal Cloudflare Workers execution context (`fetch` third argument).
|
|
6
|
+
* Matches Cloudflare `ExecutionContext` without requiring `@cloudflare/workers-types`.
|
|
7
|
+
*/
|
|
8
|
+
interface WorkerExecutionContext {
|
|
9
|
+
waitUntil(promise: Promise<unknown>): void;
|
|
10
|
+
}
|
|
4
11
|
/**
|
|
5
12
|
* Options for createWorkersLogger
|
|
6
13
|
*/
|
|
@@ -9,6 +16,21 @@ interface WorkersLoggerOptions {
|
|
|
9
16
|
requestId?: string;
|
|
10
17
|
/** Headers to include in logs (default: none) */
|
|
11
18
|
headers?: string[];
|
|
19
|
+
/**
|
|
20
|
+
* Cloudflare Workers `ExecutionContext` from the `fetch` handler
|
|
21
|
+
* (`async fetch(request, env, ctx)`). When set, async `initLogger({ drain })`
|
|
22
|
+
* work from `log.emit()` is registered with `ctx.waitUntil` so drains (HTTP to
|
|
23
|
+
* Axiom, PostHog, etc.) complete after the response is returned.
|
|
24
|
+
*
|
|
25
|
+
* Prefer {@link defineWorkerFetch} when you want this wired automatically.
|
|
26
|
+
*/
|
|
27
|
+
executionCtx?: WorkerExecutionContext;
|
|
28
|
+
/**
|
|
29
|
+
* Lower-level alternative to `executionCtx`: same function Cloudflare assigns to
|
|
30
|
+
* `ExecutionContext#waitUntil` (must be bound if you extract the method), e.g.
|
|
31
|
+
* `waitUntil: ctx.waitUntil.bind(ctx)`.
|
|
32
|
+
*/
|
|
33
|
+
waitUntil?: (promise: Promise<unknown>) => void;
|
|
12
34
|
}
|
|
13
35
|
/**
|
|
14
36
|
* Initialize evlog for Cloudflare Workers.
|
|
@@ -22,6 +44,28 @@ interface WorkersLoggerOptions {
|
|
|
22
44
|
* ```
|
|
23
45
|
*/
|
|
24
46
|
declare function initWorkersLogger(options?: LoggerConfig): void;
|
|
47
|
+
/**
|
|
48
|
+
* Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives
|
|
49
|
+
* `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).
|
|
50
|
+
*
|
|
51
|
+
* Cloudflare does not expose `ExecutionContext` globally — only as the third
|
|
52
|
+
* `fetch` argument — so evlog cannot discover it without either this helper or
|
|
53
|
+
* an explicit `{ executionCtx: ctx }` / `waitUntil` option.
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```ts
|
|
57
|
+
* initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })
|
|
58
|
+
*
|
|
59
|
+
* export default defineWorkerFetch(async (request, env, ctx, log) => {
|
|
60
|
+
* log.set({ route: '/health' })
|
|
61
|
+
* log.emit({ status: 200 })
|
|
62
|
+
* return new Response('ok')
|
|
63
|
+
* })
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
declare function defineWorkerFetch<TEnv = unknown>(handler: (request: Request, env: TEnv, ctx: WorkerExecutionContext, log: RequestLogger) => Response | Promise<Response>): {
|
|
67
|
+
fetch: (request: Request, env: TEnv, ctx: WorkerExecutionContext) => Promise<Response>;
|
|
68
|
+
};
|
|
25
69
|
/**
|
|
26
70
|
* Create a request-scoped logger for Cloudflare Workers.
|
|
27
71
|
* Auto-extracts cf-ray, request.cf context, method, and path.
|
|
@@ -29,8 +73,8 @@ declare function initWorkersLogger(options?: LoggerConfig): void;
|
|
|
29
73
|
* @example
|
|
30
74
|
* ```ts
|
|
31
75
|
* export default {
|
|
32
|
-
* async fetch(request: Request) {
|
|
33
|
-
* const log = createWorkersLogger(request)
|
|
76
|
+
* async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
77
|
+
* const log = createWorkersLogger(request, { executionCtx: ctx })
|
|
34
78
|
*
|
|
35
79
|
* log.set({ user: { id: '123' } })
|
|
36
80
|
* log.emit({ status: 200 })
|
|
@@ -42,5 +86,5 @@ declare function initWorkersLogger(options?: LoggerConfig): void;
|
|
|
42
86
|
*/
|
|
43
87
|
declare function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options?: WorkersLoggerOptions): RequestLogger<T>;
|
|
44
88
|
//#endregion
|
|
45
|
-
export { WorkersLoggerOptions, createWorkersLogger, initWorkersLogger };
|
|
89
|
+
export { WorkerExecutionContext, WorkersLoggerOptions, createWorkersLogger, defineWorkerFetch, initWorkersLogger };
|
|
46
90
|
//# sourceMappingURL=workers.d.mts.map
|
package/dist/workers.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers.d.mts","names":[],"sources":["../src/workers/index.ts"],"mappings":";;;;;
|
|
1
|
+
{"version":3,"file":"workers.d.mts","names":[],"sources":["../src/workers/index.ts"],"mappings":";;;;;AAOA;;UAAiB,sBAAA;EACf,SAAA,CAAU,OAAA,EAAS,OAAA;AAAA;;;;UAMJ,oBAAA;EAAA;EAEf,SAAA;;EAEA,OAAA;EAFA;;;;;;;;EAWA,YAAA,GAAe,sBAAA;EAuCD;;;;;EAjCd,SAAA,IAAa,OAAA,EAAS,OAAA;AAAA;;;;;;;;;;;;iBAiCR,iBAAA,CAAkB,OAAA,GAAS,YAAA;;;;;;;;;;;;;;;;;;;;iBA2B3B,iBAAA,gBAAA,CACd,OAAA,GACE,OAAA,EAAS,OAAA,EACT,GAAA,EAAK,IAAA,EACL,GAAA,EAAK,sBAAA,EACL,GAAA,EAAK,aAAA,KACF,QAAA,GAAW,OAAA,CAAQ,QAAA;EAExB,KAAA,GAAQ,OAAA,EAAS,OAAA,EAAS,GAAA,EAAK,IAAA,EAAM,GAAA,EAAK,sBAAA,KAA2B,OAAA,CAAQ,QAAA;AAAA;;;;;;AAuC/E;;;;;;;;;;;;;iBAAgB,mBAAA,oBAAuC,MAAA,kBAAA,CAAyB,OAAA,EAAS,OAAA,EAAS,OAAA,GAAS,oBAAA,GAA4B,aAAA,CAAc,CAAA"}
|
package/dist/workers.mjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { b as initLogger, g as createRequestLogger } from "./audit--n0QRR2Y.mjs";
|
|
2
2
|
//#region src/workers/index.ts
|
|
3
3
|
function isRecord(value) {
|
|
4
4
|
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
@@ -30,6 +30,31 @@ function initWorkersLogger(options = {}) {
|
|
|
30
30
|
stringify: false
|
|
31
31
|
});
|
|
32
32
|
}
|
|
33
|
+
/**
|
|
34
|
+
* Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives
|
|
35
|
+
* `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).
|
|
36
|
+
*
|
|
37
|
+
* Cloudflare does not expose `ExecutionContext` globally — only as the third
|
|
38
|
+
* `fetch` argument — so evlog cannot discover it without either this helper or
|
|
39
|
+
* an explicit `{ executionCtx: ctx }` / `waitUntil` option.
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```ts
|
|
43
|
+
* initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })
|
|
44
|
+
*
|
|
45
|
+
* export default defineWorkerFetch(async (request, env, ctx, log) => {
|
|
46
|
+
* log.set({ route: '/health' })
|
|
47
|
+
* log.emit({ status: 200 })
|
|
48
|
+
* return new Response('ok')
|
|
49
|
+
* })
|
|
50
|
+
* ```
|
|
51
|
+
*/
|
|
52
|
+
function defineWorkerFetch(handler) {
|
|
53
|
+
return { fetch(request, env, ctx) {
|
|
54
|
+
const log = createWorkersLogger(request, { executionCtx: ctx });
|
|
55
|
+
return Promise.resolve(handler(request, env, ctx, log));
|
|
56
|
+
} };
|
|
57
|
+
}
|
|
33
58
|
function pickCfContext(request) {
|
|
34
59
|
const cf = Reflect.get(request, "cf");
|
|
35
60
|
if (!isRecord(cf)) return {};
|
|
@@ -46,8 +71,8 @@ function pickCfContext(request) {
|
|
|
46
71
|
* @example
|
|
47
72
|
* ```ts
|
|
48
73
|
* export default {
|
|
49
|
-
* async fetch(request: Request) {
|
|
50
|
-
* const log = createWorkersLogger(request)
|
|
74
|
+
* async fetch(request: Request, env: Env, ctx: ExecutionContext) {
|
|
75
|
+
* const log = createWorkersLogger(request, { executionCtx: ctx })
|
|
51
76
|
*
|
|
52
77
|
* log.set({ user: { id: '123' } })
|
|
53
78
|
* log.emit({ status: 200 })
|
|
@@ -61,10 +86,12 @@ function createWorkersLogger(request, options = {}) {
|
|
|
61
86
|
const url = new URL(request.url);
|
|
62
87
|
const cfRay = request.headers.get("cf-ray") ?? void 0;
|
|
63
88
|
const traceparent = request.headers.get("traceparent") ?? void 0;
|
|
89
|
+
const waitUntil = options.waitUntil ?? (options.executionCtx ? options.executionCtx.waitUntil.bind(options.executionCtx) : void 0);
|
|
64
90
|
const log = createRequestLogger({
|
|
65
91
|
method: request.method,
|
|
66
92
|
path: url.pathname,
|
|
67
|
-
requestId: options.requestId ?? cfRay
|
|
93
|
+
requestId: options.requestId ?? cfRay,
|
|
94
|
+
waitUntil
|
|
68
95
|
});
|
|
69
96
|
log.set({
|
|
70
97
|
cfRay,
|
|
@@ -75,6 +102,6 @@ function createWorkersLogger(request, options = {}) {
|
|
|
75
102
|
return log;
|
|
76
103
|
}
|
|
77
104
|
//#endregion
|
|
78
|
-
export { createWorkersLogger, initWorkersLogger };
|
|
105
|
+
export { createWorkersLogger, defineWorkerFetch, initWorkersLogger };
|
|
79
106
|
|
|
80
107
|
//# sourceMappingURL=workers.mjs.map
|
package/dist/workers.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workers.mjs","names":[],"sources":["../src/workers/index.ts"],"sourcesContent":["import { initLogger, createRequestLogger } from '../logger'\nimport type { LoggerConfig, RequestLogger } from '../types'\n\n/**\n * Options for createWorkersLogger\n */\nexport interface WorkersLoggerOptions {\n /** Override the request ID (default: cf-ray header) */\n requestId?: string\n /** Headers to include in logs (default: none) */\n headers?: string[]\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction collectHeaders(headers: Headers, include: string[] | undefined): Record<string, string> | undefined {\n if (!include || include.length === 0) return undefined\n\n const normalized = new Set(include.map(h => h.toLowerCase()))\n const result: Record<string, string> = {}\n\n headers.forEach((value, key) => {\n if (normalized.has(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Initialize evlog for Cloudflare Workers.\n * Call once at module scope.\n *\n * @example\n * ```ts\n * initWorkersLogger({\n * env: { service: 'my-api' },\n * })\n * ```\n */\nexport function initWorkersLogger(options: LoggerConfig = {}): void {\n initLogger({\n ...options,\n pretty: false,\n stringify: false,\n })\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n const cf = Reflect.get(request, 'cf')\n if (!isRecord(cf)) return {}\n\n const out: Record<string, unknown> = {}\n if (typeof cf.colo === 'string') out.colo = cf.colo\n if (typeof cf.country === 'string') out.country = cf.country\n if (typeof cf.asn === 'number') out.asn = cf.asn\n return out\n}\n\n/**\n * Create a request-scoped logger for Cloudflare Workers.\n * Auto-extracts cf-ray, request.cf context, method, and path.\n *\n * @example\n * ```ts\n * export default {\n * async fetch(request: Request) {\n * const log = createWorkersLogger(request)\n *\n * log.set({ user: { id: '123' } })\n * log.emit({ status: 200 })\n *\n * return new Response('ok')\n * }\n * }\n * ```\n */\nexport function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options: WorkersLoggerOptions = {}): RequestLogger<T> {\n const url = new URL(request.url)\n const cfRay = request.headers.get('cf-ray') ?? undefined\n const traceparent = request.headers.get('traceparent') ?? undefined\n\n const log = createRequestLogger<T>({\n method: request.method,\n path: url.pathname,\n requestId: options.requestId ?? cfRay,\n })\n\n // Cast needed: CF-specific enrichment fields (cfRay, traceparent, etc.) aren't in user's T\n const untyped = log as unknown as RequestLogger\n untyped.set({\n cfRay,\n traceparent,\n ...pickCfContext(request),\n ...(options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}),\n })\n\n return log\n}\n"],"mappings":";;
|
|
1
|
+
{"version":3,"file":"workers.mjs","names":[],"sources":["../src/workers/index.ts"],"sourcesContent":["import { initLogger, createRequestLogger } from '../logger'\nimport type { LoggerConfig, RequestLogger } from '../types'\n\n/**\n * Minimal Cloudflare Workers execution context (`fetch` third argument).\n * Matches Cloudflare `ExecutionContext` without requiring `@cloudflare/workers-types`.\n */\nexport interface WorkerExecutionContext {\n waitUntil(promise: Promise<unknown>): void\n}\n\n/**\n * Options for createWorkersLogger\n */\nexport interface WorkersLoggerOptions {\n /** Override the request ID (default: cf-ray header) */\n requestId?: string\n /** Headers to include in logs (default: none) */\n headers?: string[]\n /**\n * Cloudflare Workers `ExecutionContext` from the `fetch` handler\n * (`async fetch(request, env, ctx)`). When set, async `initLogger({ drain })`\n * work from `log.emit()` is registered with `ctx.waitUntil` so drains (HTTP to\n * Axiom, PostHog, etc.) complete after the response is returned.\n *\n * Prefer {@link defineWorkerFetch} when you want this wired automatically.\n */\n executionCtx?: WorkerExecutionContext\n /**\n * Lower-level alternative to `executionCtx`: same function Cloudflare assigns to\n * `ExecutionContext#waitUntil` (must be bound if you extract the method), e.g.\n * `waitUntil: ctx.waitUntil.bind(ctx)`.\n */\n waitUntil?: (promise: Promise<unknown>) => void\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction collectHeaders(headers: Headers, include: string[] | undefined): Record<string, string> | undefined {\n if (!include || include.length === 0) return undefined\n\n const normalized = new Set(include.map(h => h.toLowerCase()))\n const result: Record<string, string> = {}\n\n headers.forEach((value, key) => {\n if (normalized.has(key.toLowerCase())) {\n result[key] = value\n }\n })\n\n return Object.keys(result).length > 0 ? result : undefined\n}\n\n/**\n * Initialize evlog for Cloudflare Workers.\n * Call once at module scope.\n *\n * @example\n * ```ts\n * initWorkersLogger({\n * env: { service: 'my-api' },\n * })\n * ```\n */\nexport function initWorkersLogger(options: LoggerConfig = {}): void {\n initLogger({\n ...options,\n pretty: false,\n stringify: false,\n })\n}\n\n/**\n * Wraps a Workers `fetch` handler so {@link createWorkersLogger} receives\n * `executionCtx` automatically for async drains (`initWorkersLogger({ drain })`).\n *\n * Cloudflare does not expose `ExecutionContext` globally — only as the third\n * `fetch` argument — so evlog cannot discover it without either this helper or\n * an explicit `{ executionCtx: ctx }` / `waitUntil` option.\n *\n * @example\n * ```ts\n * initWorkersLogger({ env: { service: 'my-api' }, drain: myDrain })\n *\n * export default defineWorkerFetch(async (request, env, ctx, log) => {\n * log.set({ route: '/health' })\n * log.emit({ status: 200 })\n * return new Response('ok')\n * })\n * ```\n */\nexport function defineWorkerFetch<TEnv = unknown>(\n handler: (\n request: Request,\n env: TEnv,\n ctx: WorkerExecutionContext,\n log: RequestLogger,\n ) => Response | Promise<Response>,\n): {\n fetch: (request: Request, env: TEnv, ctx: WorkerExecutionContext) => Promise<Response>\n} {\n return {\n fetch(request, env, ctx) {\n const log = createWorkersLogger(request, { executionCtx: ctx })\n return Promise.resolve(handler(request, env, ctx, log))\n },\n }\n}\n\nfunction pickCfContext(request: Request): Record<string, unknown> {\n const cf = Reflect.get(request, 'cf')\n if (!isRecord(cf)) return {}\n\n const out: Record<string, unknown> = {}\n if (typeof cf.colo === 'string') out.colo = cf.colo\n if (typeof cf.country === 'string') out.country = cf.country\n if (typeof cf.asn === 'number') out.asn = cf.asn\n return out\n}\n\n/**\n * Create a request-scoped logger for Cloudflare Workers.\n * Auto-extracts cf-ray, request.cf context, method, and path.\n *\n * @example\n * ```ts\n * export default {\n * async fetch(request: Request, env: Env, ctx: ExecutionContext) {\n * const log = createWorkersLogger(request, { executionCtx: ctx })\n *\n * log.set({ user: { id: '123' } })\n * log.emit({ status: 200 })\n *\n * return new Response('ok')\n * }\n * }\n * ```\n */\nexport function createWorkersLogger<T extends object = Record<string, unknown>>(request: Request, options: WorkersLoggerOptions = {}): RequestLogger<T> {\n const url = new URL(request.url)\n const cfRay = request.headers.get('cf-ray') ?? undefined\n const traceparent = request.headers.get('traceparent') ?? undefined\n\n const waitUntil =\n options.waitUntil\n ?? (options.executionCtx\n ? options.executionCtx.waitUntil.bind(options.executionCtx)\n : undefined)\n\n const log = createRequestLogger<T>({\n method: request.method,\n path: url.pathname,\n requestId: options.requestId ?? cfRay,\n waitUntil,\n })\n\n // Cast needed: CF-specific enrichment fields (cfRay, traceparent, etc.) aren't in user's T\n const untyped = log as unknown as RequestLogger\n untyped.set({\n cfRay,\n traceparent,\n ...pickCfContext(request),\n ...(options.headers ? { requestHeaders: collectHeaders(request.headers, options.headers) } : {}),\n })\n\n return log\n}\n"],"mappings":";;AAoCA,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM;;AAG7E,SAAS,eAAe,SAAkB,SAAmE;AAC3G,KAAI,CAAC,WAAW,QAAQ,WAAW,EAAG,QAAO,KAAA;CAE7C,MAAM,aAAa,IAAI,IAAI,QAAQ,KAAI,MAAK,EAAE,aAAa,CAAC,CAAC;CAC7D,MAAM,SAAiC,EAAE;AAEzC,SAAQ,SAAS,OAAO,QAAQ;AAC9B,MAAI,WAAW,IAAI,IAAI,aAAa,CAAC,CACnC,QAAO,OAAO;GAEhB;AAEF,QAAO,OAAO,KAAK,OAAO,CAAC,SAAS,IAAI,SAAS,KAAA;;;;;;;;;;;;;AAcnD,SAAgB,kBAAkB,UAAwB,EAAE,EAAQ;AAClE,YAAW;EACT,GAAG;EACH,QAAQ;EACR,WAAW;EACZ,CAAC;;;;;;;;;;;;;;;;;;;;;AAsBJ,SAAgB,kBACd,SAQA;AACA,QAAO,EACL,MAAM,SAAS,KAAK,KAAK;EACvB,MAAM,MAAM,oBAAoB,SAAS,EAAE,cAAc,KAAK,CAAC;AAC/D,SAAO,QAAQ,QAAQ,QAAQ,SAAS,KAAK,KAAK,IAAI,CAAC;IAE1D;;AAGH,SAAS,cAAc,SAA2C;CAChE,MAAM,KAAK,QAAQ,IAAI,SAAS,KAAK;AACrC,KAAI,CAAC,SAAS,GAAG,CAAE,QAAO,EAAE;CAE5B,MAAM,MAA+B,EAAE;AACvC,KAAI,OAAO,GAAG,SAAS,SAAU,KAAI,OAAO,GAAG;AAC/C,KAAI,OAAO,GAAG,YAAY,SAAU,KAAI,UAAU,GAAG;AACrD,KAAI,OAAO,GAAG,QAAQ,SAAU,KAAI,MAAM,GAAG;AAC7C,QAAO;;;;;;;;;;;;;;;;;;;;AAqBT,SAAgB,oBAAgE,SAAkB,UAAgC,EAAE,EAAoB;CACtJ,MAAM,MAAM,IAAI,IAAI,QAAQ,IAAI;CAChC,MAAM,QAAQ,QAAQ,QAAQ,IAAI,SAAS,IAAI,KAAA;CAC/C,MAAM,cAAc,QAAQ,QAAQ,IAAI,cAAc,IAAI,KAAA;CAE1D,MAAM,YACJ,QAAQ,cACJ,QAAQ,eACR,QAAQ,aAAa,UAAU,KAAK,QAAQ,aAAa,GACzD,KAAA;CAEN,MAAM,MAAM,oBAAuB;EACjC,QAAQ,QAAQ;EAChB,MAAM,IAAI;EACV,WAAW,QAAQ,aAAa;EAChC;EACD,CAAC;AAIF,KAAQ,IAAI;EACV;EACA;EACA,GAAG,cAAc,QAAQ;EACzB,GAAI,QAAQ,UAAU,EAAE,gBAAgB,eAAe,QAAQ,SAAS,QAAQ,QAAQ,EAAE,GAAG,EAAE;EAChG,CAAC;AAEF,QAAO"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "evlog",
|
|
3
|
-
"version": "2.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "2.15.0",
|
|
4
|
+
"description": "Modern TypeScript logger — simple logs, wide events, structured errors. Built for scripts, libraries, jobs, edge, and HTTP. One drain pipeline everywhere.",
|
|
5
5
|
"author": "HugoRCD <contact@hrcd.fr>",
|
|
6
6
|
"homepage": "https://evlog.dev",
|
|
7
7
|
"repository": {
|
|
@@ -302,49 +302,35 @@
|
|
|
302
302
|
"dist",
|
|
303
303
|
"README.md"
|
|
304
304
|
],
|
|
305
|
-
"scripts": {
|
|
306
|
-
"build": "tsdown",
|
|
307
|
-
"dev": "tsdown --watch",
|
|
308
|
-
"dev:prepare": "tsdown",
|
|
309
|
-
"lint": "eslint .",
|
|
310
|
-
"lint:fix": "eslint . --fix",
|
|
311
|
-
"bench": "vitest bench bench/core/ && cp bench/results.json bench/baseline/bench.json && bun bench/scripts/report.ts",
|
|
312
|
-
"bench:compare": "vitest bench bench/comparison/ && cp bench/results.json bench/baseline/comparison.json && bun bench/scripts/report.ts",
|
|
313
|
-
"bench:report": "bun bench/scripts/report.ts",
|
|
314
|
-
"size": "bun bench/scripts/size.ts",
|
|
315
|
-
"size:json": "bun bench/scripts/size.ts --json",
|
|
316
|
-
"test": "vitest run",
|
|
317
|
-
"test:watch": "vitest watch",
|
|
318
|
-
"test:coverage": "vitest run --coverage",
|
|
319
|
-
"typecheck": "echo 'Typecheck handled by build'"
|
|
320
|
-
},
|
|
321
305
|
"devDependencies": {
|
|
322
|
-
"@tanstack/start-client-core": "^1.167.
|
|
306
|
+
"@tanstack/start-client-core": "^1.167.20",
|
|
323
307
|
"acorn": "^8.16.0",
|
|
324
|
-
"@codspeed/vitest-plugin": "^5.
|
|
325
|
-
"@nestjs/common": "^11.1.
|
|
308
|
+
"@codspeed/vitest-plugin": "^5.3.0",
|
|
309
|
+
"@nestjs/common": "^11.1.19",
|
|
326
310
|
"@nuxt/devtools": "^3.2.4",
|
|
327
311
|
"@nuxt/schema": "^4.4.2",
|
|
328
|
-
"@nuxt/test-utils": "^4.0.
|
|
312
|
+
"@nuxt/test-utils": "^4.0.3",
|
|
329
313
|
"@types/express": "^5.0.6",
|
|
330
314
|
"@types/supertest": "^7.2.0",
|
|
331
315
|
"changelogen": "^0.6.2",
|
|
332
316
|
"consola": "^3.4.2",
|
|
333
317
|
"elysia": "^1.4.28",
|
|
334
318
|
"express": "^5.2.1",
|
|
335
|
-
"fastify": "^5.8.
|
|
319
|
+
"fastify": "^5.8.5",
|
|
336
320
|
"h3": "^1.15.11",
|
|
337
|
-
"happy-dom": "^20.
|
|
321
|
+
"happy-dom": "^20.9.0",
|
|
338
322
|
"nitro": "^3.0.260311-beta",
|
|
339
323
|
"nitropack": "^2.13.3",
|
|
340
324
|
"nuxt": "^4.4.2",
|
|
341
325
|
"pino": "^10.3.1",
|
|
342
|
-
"react-router": "^7.14.
|
|
326
|
+
"react-router": "^7.14.2",
|
|
343
327
|
"supertest": "^7.2.2",
|
|
344
|
-
"
|
|
328
|
+
"tinyglobby": "^0.2.16",
|
|
329
|
+
"tsdown": "^0.21.10",
|
|
330
|
+
"tsx": "^4.20.7",
|
|
345
331
|
"magic-string": "^0.30.21",
|
|
346
|
-
"typescript": "^6.0.
|
|
347
|
-
"vite": "^8.0.
|
|
332
|
+
"typescript": "^6.0.3",
|
|
333
|
+
"vite": "^8.0.10",
|
|
348
334
|
"ufo": "^1.6.3",
|
|
349
335
|
"winston": "^3.19.0"
|
|
350
336
|
},
|
|
@@ -354,18 +340,17 @@
|
|
|
354
340
|
"nitropack": "^2.13.3",
|
|
355
341
|
"ofetch": "^1.5.1",
|
|
356
342
|
"nitro": "^3.0.260311-beta",
|
|
357
|
-
"next": ">=16.2.
|
|
343
|
+
"next": ">=16.2.4",
|
|
358
344
|
"react": ">=19.2.5",
|
|
359
345
|
"hono": "",
|
|
360
346
|
"express": ">=5.2.1",
|
|
361
347
|
"elysia": ">=1.4.28",
|
|
362
|
-
"fastify": ">=5.8.
|
|
363
|
-
"@nestjs/common": ">=11.1.
|
|
364
|
-
"react-router": ">=7.14.
|
|
348
|
+
"fastify": ">=5.8.5",
|
|
349
|
+
"@nestjs/common": ">=11.1.19",
|
|
350
|
+
"react-router": ">=7.14.2",
|
|
365
351
|
"vite": "^7.0.0 || ^8.0.0",
|
|
366
|
-
"ai": ">=6.0.
|
|
367
|
-
"@tanstack/start-client-core": "^1.167.
|
|
368
|
-
"better-auth": ">=1.2.0"
|
|
352
|
+
"ai": ">=6.0.168",
|
|
353
|
+
"@tanstack/start-client-core": "^1.167.20"
|
|
369
354
|
},
|
|
370
355
|
"peerDependenciesMeta": {
|
|
371
356
|
"@nuxt/kit": {
|
|
@@ -415,9 +400,23 @@
|
|
|
415
400
|
},
|
|
416
401
|
"@tanstack/start-client-core": {
|
|
417
402
|
"optional": true
|
|
418
|
-
},
|
|
419
|
-
"better-auth": {
|
|
420
|
-
"optional": true
|
|
421
403
|
}
|
|
404
|
+
},
|
|
405
|
+
"scripts": {
|
|
406
|
+
"build": "tsdown",
|
|
407
|
+
"dev": "tsdown --watch",
|
|
408
|
+
"dev:prepare": "tsdown",
|
|
409
|
+
"lint": "eslint .",
|
|
410
|
+
"lint:fix": "eslint . --fix",
|
|
411
|
+
"bench": "vitest bench bench/core/ && cp bench/results.json bench/baseline/bench.json && tsx bench/scripts/report.ts",
|
|
412
|
+
"bench:compare": "vitest bench bench/comparison/ && cp bench/results.json bench/baseline/comparison.json && tsx bench/scripts/report.ts",
|
|
413
|
+
"bench:report": "tsx bench/scripts/report.ts",
|
|
414
|
+
"size": "tsx bench/scripts/size.ts",
|
|
415
|
+
"size:json": "tsx bench/scripts/size.ts --json",
|
|
416
|
+
"test": "vitest run",
|
|
417
|
+
"test:watch": "vitest watch",
|
|
418
|
+
"test:coverage": "vitest run --coverage",
|
|
419
|
+
"test:e2e": "vitest run --config vitest.e2e.config.ts",
|
|
420
|
+
"typecheck": "echo 'Typecheck handled by build'"
|
|
422
421
|
}
|
|
423
|
-
}
|
|
422
|
+
}
|
package/dist/_drain-CmCtsuF6.mjs
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
//#region src/adapters/_drain.ts
|
|
2
|
-
/**
|
|
3
|
-
* Build a drain callback for `evlog:drain` (or `initLogger({ drain })`).
|
|
4
|
-
* The returned function is async so `resolve` can load Nitro runtime config; hosts typically attach
|
|
5
|
-
* the resulting promise to `waitUntil` so the HTTP response is not blocked (see Nitro plugin).
|
|
6
|
-
*/
|
|
7
|
-
function defineDrain(options) {
|
|
8
|
-
return async (ctx) => {
|
|
9
|
-
const contexts = Array.isArray(ctx) ? ctx : [ctx];
|
|
10
|
-
if (contexts.length === 0) return;
|
|
11
|
-
const config = await options.resolve();
|
|
12
|
-
if (!config) return;
|
|
13
|
-
try {
|
|
14
|
-
await options.send(contexts.map((c) => c.event), config);
|
|
15
|
-
} catch (error) {
|
|
16
|
-
console.error(`[evlog/${options.name}] Failed to send events:`, error);
|
|
17
|
-
}
|
|
18
|
-
};
|
|
19
|
-
}
|
|
20
|
-
//#endregion
|
|
21
|
-
export { defineDrain as t };
|
|
22
|
-
|
|
23
|
-
//# sourceMappingURL=_drain-CmCtsuF6.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_drain-CmCtsuF6.mjs","names":[],"sources":["../src/adapters/_drain.ts"],"sourcesContent":["import type { DrainContext, WideEvent } from '../types'\n\nexport interface DrainOptions<TConfig> {\n name: string\n resolve: () => TConfig | null | Promise<TConfig | null>\n send: (events: WideEvent[], config: TConfig) => Promise<void>\n}\n\n/**\n * Build a drain callback for `evlog:drain` (or `initLogger({ drain })`).\n * The returned function is async so `resolve` can load Nitro runtime config; hosts typically attach\n * the resulting promise to `waitUntil` so the HTTP response is not blocked (see Nitro plugin).\n */\nexport function defineDrain<TConfig>(options: DrainOptions<TConfig>): (ctx: DrainContext | DrainContext[]) => Promise<void> {\n return async (ctx: DrainContext | DrainContext[]) => {\n const contexts = Array.isArray(ctx) ? ctx : [ctx]\n if (contexts.length === 0) return\n\n const config = await options.resolve()\n if (!config) return\n\n try {\n await options.send(contexts.map(c => c.event), config)\n } catch (error) {\n console.error(`[evlog/${options.name}] Failed to send events:`, error)\n }\n }\n}\n"],"mappings":";;;;;;AAaA,SAAgB,YAAqB,SAAuF;AAC1H,QAAO,OAAO,QAAuC;EACnD,MAAM,WAAW,MAAM,QAAQ,IAAI,GAAG,MAAM,CAAC,IAAI;AACjD,MAAI,SAAS,WAAW,EAAG;EAE3B,MAAM,SAAS,MAAM,QAAQ,SAAS;AACtC,MAAI,CAAC,OAAQ;AAEb,MAAI;AACF,SAAM,QAAQ,KAAK,SAAS,KAAI,MAAK,EAAE,MAAM,EAAE,OAAO;WAC/C,OAAO;AACd,WAAQ,MAAM,UAAU,QAAQ,KAAK,2BAA2B,MAAM"}
|
package/dist/_http-CHSsrWDJ.mjs
DELETED
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { t as getNitroRuntimeConfigRecord } from "./nitroConfigBridge-C37lXaNm.mjs";
|
|
2
|
-
//#region src/adapters/_config.ts
|
|
3
|
-
/**
|
|
4
|
-
* Adapter runtime-config reads go through `getNitroRuntimeConfigRecord` in
|
|
5
|
-
* `shared/nitroConfigBridge.ts` (documented there — Workers-safe dynamic imports).
|
|
6
|
-
*
|
|
7
|
-
* Drain handlers remain non-blocking when the host provides `waitUntil`.
|
|
8
|
-
*/
|
|
9
|
-
function getRuntimeConfig() {
|
|
10
|
-
return getNitroRuntimeConfigRecord();
|
|
11
|
-
}
|
|
12
|
-
async function resolveAdapterConfig(namespace, fields, overrides) {
|
|
13
|
-
const runtimeConfig = await getRuntimeConfig();
|
|
14
|
-
const evlogNs = runtimeConfig?.evlog?.[namespace];
|
|
15
|
-
const rootNs = runtimeConfig?.[namespace];
|
|
16
|
-
const config = {};
|
|
17
|
-
for (const { key, env } of fields) config[key] = overrides?.[key] ?? evlogNs?.[key] ?? rootNs?.[key] ?? resolveEnv(env);
|
|
18
|
-
return config;
|
|
19
|
-
}
|
|
20
|
-
function resolveEnv(envKeys) {
|
|
21
|
-
if (!envKeys) return void 0;
|
|
22
|
-
for (const key of envKeys) {
|
|
23
|
-
const val = process.env[key];
|
|
24
|
-
if (val) return val;
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
//#endregion
|
|
28
|
-
//#region src/adapters/_http.ts
|
|
29
|
-
function isRetryable(error) {
|
|
30
|
-
if (error instanceof DOMException && error.name === "AbortError") return true;
|
|
31
|
-
if (error instanceof TypeError) return true;
|
|
32
|
-
if (error instanceof Error) {
|
|
33
|
-
const match = error.message.match(/API error: (\d+)/);
|
|
34
|
-
if (match) return Number.parseInt(match[1]) >= 500;
|
|
35
|
-
}
|
|
36
|
-
return false;
|
|
37
|
-
}
|
|
38
|
-
async function httpPost({ url, headers, body, timeout, label, retries = 2 }) {
|
|
39
|
-
const normalizedRetries = Number.isFinite(retries) && retries >= 0 ? Math.floor(retries) : 2;
|
|
40
|
-
let lastError;
|
|
41
|
-
for (let attempt = 0; attempt <= normalizedRetries; attempt++) {
|
|
42
|
-
const controller = new AbortController();
|
|
43
|
-
const timeoutId = setTimeout(() => controller.abort(), timeout);
|
|
44
|
-
try {
|
|
45
|
-
const response = await fetch(url, {
|
|
46
|
-
method: "POST",
|
|
47
|
-
headers,
|
|
48
|
-
body,
|
|
49
|
-
signal: controller.signal
|
|
50
|
-
});
|
|
51
|
-
if (!response.ok) {
|
|
52
|
-
const text = await response.text().catch(() => "Unknown error");
|
|
53
|
-
const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text;
|
|
54
|
-
throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`);
|
|
55
|
-
}
|
|
56
|
-
clearTimeout(timeoutId);
|
|
57
|
-
return;
|
|
58
|
-
} catch (error) {
|
|
59
|
-
clearTimeout(timeoutId);
|
|
60
|
-
if (error instanceof DOMException && error.name === "AbortError") lastError = /* @__PURE__ */ new Error(`${label} request timed out after ${timeout}ms`);
|
|
61
|
-
else lastError = error;
|
|
62
|
-
if (!isRetryable(error) || attempt === normalizedRetries) throw lastError;
|
|
63
|
-
await new Promise((r) => setTimeout(r, 200 * 2 ** attempt));
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
throw lastError;
|
|
67
|
-
}
|
|
68
|
-
//#endregion
|
|
69
|
-
export { resolveAdapterConfig as n, httpPost as t };
|
|
70
|
-
|
|
71
|
-
//# sourceMappingURL=_http-CHSsrWDJ.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_http-CHSsrWDJ.mjs","names":[],"sources":["../src/adapters/_config.ts","../src/adapters/_http.ts"],"sourcesContent":["import { getNitroRuntimeConfigRecord } from '../shared/nitroConfigBridge'\n\n/**\n * Adapter runtime-config reads go through `getNitroRuntimeConfigRecord` in\n * `shared/nitroConfigBridge.ts` (documented there — Workers-safe dynamic imports).\n *\n * Drain handlers remain non-blocking when the host provides `waitUntil`.\n */\n\nexport function getRuntimeConfig(): Promise<Record<string, any> | undefined> {\n return getNitroRuntimeConfigRecord()\n}\n\nexport interface ConfigField<T> {\n key: keyof T & string\n env?: string[]\n}\n\nexport async function resolveAdapterConfig<T>(\n namespace: string,\n fields: ConfigField<T>[],\n overrides?: Partial<T>,\n): Promise<Partial<T>> {\n const runtimeConfig = await getRuntimeConfig()\n const evlogNs = runtimeConfig?.evlog?.[namespace]\n const rootNs = runtimeConfig?.[namespace]\n\n const config: Record<string, unknown> = {}\n\n for (const { key, env } of fields) {\n config[key] =\n overrides?.[key]\n ?? evlogNs?.[key]\n ?? rootNs?.[key]\n ?? resolveEnv(env)\n }\n\n return config as Partial<T>\n}\n\nfunction resolveEnv(envKeys?: string[]): string | undefined {\n if (!envKeys) return undefined\n for (const key of envKeys) {\n const val = process.env[key]\n if (val) return val\n }\n return undefined\n}\n","export interface HttpPostOptions {\n url: string\n headers: Record<string, string>\n body: string\n timeout: number\n label: string\n retries?: number\n}\n\nfunction isRetryable(error: unknown): boolean {\n if (error instanceof DOMException && error.name === 'AbortError') return true\n if (error instanceof TypeError) return true\n if (error instanceof Error) {\n const match = error.message.match(/API error: (\\d+)/)\n if (match) return Number.parseInt(match[1]) >= 500\n }\n return false\n}\n\nexport async function httpPost({ url, headers, body, timeout, label, retries = 2 }: HttpPostOptions): Promise<void> {\n const normalizedRetries = Number.isFinite(retries) && retries >= 0 ? Math.floor(retries) : 2\n\n let lastError: Error | undefined\n\n for (let attempt = 0; attempt <= normalizedRetries; attempt++) {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), timeout)\n\n try {\n const response = await fetch(url, {\n method: 'POST',\n headers,\n body,\n signal: controller.signal,\n })\n\n if (!response.ok) {\n const text = await response.text().catch(() => 'Unknown error')\n const safeText = text.length > 200 ? `${text.slice(0, 200)}...[truncated]` : text\n throw new Error(`${label} API error: ${response.status} ${response.statusText} - ${safeText}`)\n }\n\n clearTimeout(timeoutId)\n return\n } catch (error) {\n clearTimeout(timeoutId)\n\n if (error instanceof DOMException && error.name === 'AbortError') {\n lastError = new Error(`${label} request timed out after ${timeout}ms`)\n } else {\n lastError = error as Error\n }\n\n if (!isRetryable(error) || attempt === normalizedRetries) {\n throw lastError\n }\n\n await new Promise<void>(r => setTimeout(r, 200 * 2 ** attempt))\n }\n }\n\n throw lastError!\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,mBAA6D;AAC3E,QAAO,6BAA6B;;AAQtC,eAAsB,qBACpB,WACA,QACA,WACqB;CACrB,MAAM,gBAAgB,MAAM,kBAAkB;CAC9C,MAAM,UAAU,eAAe,QAAQ;CACvC,MAAM,SAAS,gBAAgB;CAE/B,MAAM,SAAkC,EAAE;AAE1C,MAAK,MAAM,EAAE,KAAK,SAAS,OACzB,QAAO,OACL,YAAY,QACT,UAAU,QACV,SAAS,QACT,WAAW,IAAI;AAGtB,QAAO;;AAGT,SAAS,WAAW,SAAwC;AAC1D,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,MAAK,MAAM,OAAO,SAAS;EACzB,MAAM,MAAM,QAAQ,IAAI;AACxB,MAAI,IAAK,QAAO;;;;;ACnCpB,SAAS,YAAY,OAAyB;AAC5C,KAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAAc,QAAO;AACzE,KAAI,iBAAiB,UAAW,QAAO;AACvC,KAAI,iBAAiB,OAAO;EAC1B,MAAM,QAAQ,MAAM,QAAQ,MAAM,mBAAmB;AACrD,MAAI,MAAO,QAAO,OAAO,SAAS,MAAM,GAAG,IAAI;;AAEjD,QAAO;;AAGT,eAAsB,SAAS,EAAE,KAAK,SAAS,MAAM,SAAS,OAAO,UAAU,KAAqC;CAClH,MAAM,oBAAoB,OAAO,SAAS,QAAQ,IAAI,WAAW,IAAI,KAAK,MAAM,QAAQ,GAAG;CAE3F,IAAI;AAEJ,MAAK,IAAI,UAAU,GAAG,WAAW,mBAAmB,WAAW;EAC7D,MAAM,aAAa,IAAI,iBAAiB;EACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,QAAQ;AAE/D,MAAI;GACF,MAAM,WAAW,MAAM,MAAM,KAAK;IAChC,QAAQ;IACR;IACA;IACA,QAAQ,WAAW;IACpB,CAAC;AAEF,OAAI,CAAC,SAAS,IAAI;IAChB,MAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,gBAAgB;IAC/D,MAAM,WAAW,KAAK,SAAS,MAAM,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,kBAAkB;AAC7E,UAAM,IAAI,MAAM,GAAG,MAAM,cAAc,SAAS,OAAO,GAAG,SAAS,WAAW,KAAK,WAAW;;AAGhG,gBAAa,UAAU;AACvB;WACO,OAAO;AACd,gBAAa,UAAU;AAEvB,OAAI,iBAAiB,gBAAgB,MAAM,SAAS,aAClD,6BAAY,IAAI,MAAM,GAAG,MAAM,2BAA2B,QAAQ,IAAI;OAEtE,aAAY;AAGd,OAAI,CAAC,YAAY,MAAM,IAAI,YAAY,kBACrC,OAAM;AAGR,SAAM,IAAI,SAAc,MAAK,WAAW,GAAG,MAAM,KAAK,QAAQ,CAAC;;;AAInE,OAAM"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"_severity-CQijvfhU.mjs","names":[],"sources":["../src/adapters/_severity.ts"],"sourcesContent":["import type { LogLevel } from '../types'\n\nexport const OTEL_SEVERITY_NUMBER: Record<LogLevel, number> = {\n debug: 5,\n info: 9,\n warn: 13,\n error: 17,\n}\n\nexport const OTEL_SEVERITY_TEXT: Record<LogLevel, string> = {\n debug: 'DEBUG',\n info: 'INFO',\n warn: 'WARN',\n error: 'ERROR',\n}\n"],"mappings":";AAEA,MAAa,uBAAiD;CAC5D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR;AAED,MAAa,qBAA+C;CAC1D,OAAO;CACP,MAAM;CACN,MAAM;CACN,OAAO;CACR"}
|