autotel-adapters 0.1.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/README.md +119 -0
- package/dist/chunk-2MUUBQJZ.js +43 -0
- package/dist/chunk-2MUUBQJZ.js.map +1 -0
- package/dist/chunk-F2K6UTRF.js +73 -0
- package/dist/chunk-F2K6UTRF.js.map +1 -0
- package/dist/chunk-FPHF553F.js +23 -0
- package/dist/chunk-FPHF553F.js.map +1 -0
- package/dist/chunk-HC3ZQAZV.js +84 -0
- package/dist/chunk-HC3ZQAZV.js.map +1 -0
- package/dist/chunk-LFDWJWP2.js +21 -0
- package/dist/chunk-LFDWJWP2.js.map +1 -0
- package/dist/chunk-VFTRQVDR.js +67 -0
- package/dist/chunk-VFTRQVDR.js.map +1 -0
- package/dist/cloudflare.cjs +138 -0
- package/dist/cloudflare.cjs.map +1 -0
- package/dist/cloudflare.d.cts +33 -0
- package/dist/cloudflare.d.ts +33 -0
- package/dist/cloudflare.js +4 -0
- package/dist/cloudflare.js.map +1 -0
- package/dist/core.cjs +47 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +21 -0
- package/dist/core.d.ts +21 -0
- package/dist/core.js +3 -0
- package/dist/core.js.map +1 -0
- package/dist/hono.cjs +55 -0
- package/dist/hono.cjs.map +1 -0
- package/dist/hono.d.cts +9 -0
- package/dist/hono.d.ts +9 -0
- package/dist/hono.js +4 -0
- package/dist/hono.js.map +1 -0
- package/dist/index.cjs +258 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d-DgrxjJLc.d.cts +21 -0
- package/dist/index.d-DgrxjJLc.d.ts +21 -0
- package/dist/index.d.cts +9 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -0
- package/dist/next.cjs +127 -0
- package/dist/next.cjs.map +1 -0
- package/dist/next.d.cts +28 -0
- package/dist/next.d.ts +28 -0
- package/dist/next.js +4 -0
- package/dist/next.js.map +1 -0
- package/dist/nitro.cjs +101 -0
- package/dist/nitro.cjs.map +1 -0
- package/dist/nitro.d.cts +26 -0
- package/dist/nitro.d.ts +26 -0
- package/dist/nitro.js +4 -0
- package/dist/nitro.js.map +1 -0
- package/dist/tanstack.cjs +53 -0
- package/dist/tanstack.cjs.map +1 -0
- package/dist/tanstack.d.cts +14 -0
- package/dist/tanstack.d.ts +14 -0
- package/dist/tanstack.js +4 -0
- package/dist/tanstack.js.map +1 -0
- package/package.json +103 -0
- package/src/cloudflare.test.ts +31 -0
- package/src/cloudflare.ts +181 -0
- package/src/core.test.ts +38 -0
- package/src/core.ts +98 -0
- package/src/hono.ts +20 -0
- package/src/index.ts +6 -0
- package/src/next.test.ts +22 -0
- package/src/next.ts +127 -0
- package/src/nitro.test.ts +24 -0
- package/src/nitro.ts +111 -0
- package/src/tanstack.ts +23 -0
package/README.md
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# autotel-adapters
|
|
2
|
+
|
|
3
|
+
Composable framework adapters and DX helpers for `autotel`.
|
|
4
|
+
|
|
5
|
+
`autotel-adapters` gives easy to use ergonomics (`with...`, `useLogger(...)`,
|
|
6
|
+
`parseError`) while keeping one trace-native stack under the hood.
|
|
7
|
+
|
|
8
|
+
## Included adapters
|
|
9
|
+
|
|
10
|
+
- `autotel-adapters/hono`
|
|
11
|
+
- `autotel-adapters/tanstack`
|
|
12
|
+
- `autotel-adapters/next`
|
|
13
|
+
- `autotel-adapters/nitro`
|
|
14
|
+
- `autotel-adapters/cloudflare`
|
|
15
|
+
- `autotel-adapters/core` (build your own adapter)
|
|
16
|
+
|
|
17
|
+
## When to use `withAutotel` vs `useLogger` alone
|
|
18
|
+
|
|
19
|
+
Each adapter exports two patterns. Choose based on whether you already have
|
|
20
|
+
autotel tracing middleware:
|
|
21
|
+
|
|
22
|
+
**`withAutotel()` - use when you have NO existing autotel middleware.**
|
|
23
|
+
It creates a span and injects a request logger automatically:
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { withAutotel, useLogger } from 'autotel-adapters/next';
|
|
27
|
+
|
|
28
|
+
export const POST = withAutotel(async (request) => {
|
|
29
|
+
const log = useLogger(request);
|
|
30
|
+
log.set({ feature: 'checkout' });
|
|
31
|
+
return Response.json({ ok: true });
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**`useLogger()` alone - use when middleware already creates the span.**
|
|
36
|
+
For example, `autotel-hono` middleware (`otel()`) already creates a span per
|
|
37
|
+
request. Wrapping with `withAutotel` too would create a **duplicate span**:
|
|
38
|
+
|
|
39
|
+
```ts
|
|
40
|
+
import { otel } from 'autotel-hono';
|
|
41
|
+
import { useLogger } from 'autotel-adapters/hono';
|
|
42
|
+
|
|
43
|
+
app.use('*', otel());
|
|
44
|
+
app.get('/orders/:id', (c) => {
|
|
45
|
+
const log = useLogger(c);
|
|
46
|
+
log.set({ route: c.req.path });
|
|
47
|
+
return c.json({ ok: true });
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Core usage
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { createUseLogger } from 'autotel-adapters/core';
|
|
55
|
+
|
|
56
|
+
const useLogger = createUseLogger<{ requestId?: string }>({
|
|
57
|
+
adapterName: 'custom-framework',
|
|
58
|
+
enrich: (ctx) => ({ request_id: ctx.requestId }),
|
|
59
|
+
});
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Next.js
|
|
63
|
+
|
|
64
|
+
```ts
|
|
65
|
+
import { withAutotel, useLogger, parseError } from 'autotel-adapters/next';
|
|
66
|
+
|
|
67
|
+
export const POST = withAutotel(async (request: Request) => {
|
|
68
|
+
const log = useLogger(request);
|
|
69
|
+
log.set({ feature: 'checkout' });
|
|
70
|
+
|
|
71
|
+
try {
|
|
72
|
+
return Response.json({ ok: true });
|
|
73
|
+
} catch (error) {
|
|
74
|
+
const parsed = parseError(error);
|
|
75
|
+
log.set({ error_status: parsed.status, error_why: parsed.why });
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Nitro
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
import { withAutotelEventHandler, useLogger } from 'autotel-adapters/nitro';
|
|
85
|
+
|
|
86
|
+
export default withAutotelEventHandler(async (event) => {
|
|
87
|
+
const log = useLogger(event, 'api-service');
|
|
88
|
+
log.set({ route: event.path });
|
|
89
|
+
return { ok: true };
|
|
90
|
+
});
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
## Hono
|
|
94
|
+
|
|
95
|
+
```ts
|
|
96
|
+
import { otel } from 'autotel-hono';
|
|
97
|
+
import { useLogger } from 'autotel-adapters/hono';
|
|
98
|
+
|
|
99
|
+
app.use('*', otel());
|
|
100
|
+
app.get('/orders/:id', (c) => {
|
|
101
|
+
const log = useLogger(c);
|
|
102
|
+
log.set({ route: c.req.path });
|
|
103
|
+
return c.json({ ok: true });
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
## Cloudflare Workers
|
|
108
|
+
|
|
109
|
+
```ts
|
|
110
|
+
import { withAutotelFetch, useLogger } from 'autotel-adapters/cloudflare';
|
|
111
|
+
|
|
112
|
+
export default {
|
|
113
|
+
fetch: withAutotelFetch(async (request, env, ctx) => {
|
|
114
|
+
const log = useLogger(request);
|
|
115
|
+
log.set({ route: new URL(request.url).pathname });
|
|
116
|
+
return Response.json({ ok: true });
|
|
117
|
+
}),
|
|
118
|
+
};
|
|
119
|
+
```
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { getRequestLogger, createDrainPipeline, createStructuredError, parseError } from 'autotel';
|
|
2
|
+
|
|
3
|
+
// src/core.ts
|
|
4
|
+
function createUseLogger(options) {
|
|
5
|
+
return function useLogger(context, requestLoggerOptions) {
|
|
6
|
+
let logger;
|
|
7
|
+
try {
|
|
8
|
+
logger = getRequestLogger(void 0, requestLoggerOptions);
|
|
9
|
+
} catch {
|
|
10
|
+
throw new Error(
|
|
11
|
+
`[autotel-adapters/${options.adapterName}] No active trace context. Wrap your handler with autotel trace instrumentation before calling useLogger().`
|
|
12
|
+
);
|
|
13
|
+
}
|
|
14
|
+
if (context && options.enrich) {
|
|
15
|
+
const extra = options.enrich(context);
|
|
16
|
+
if (extra && Object.keys(extra).length > 0) {
|
|
17
|
+
logger.set(extra);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return logger;
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function createAdapterToolkit(options) {
|
|
24
|
+
return {
|
|
25
|
+
useLogger: createUseLogger(options),
|
|
26
|
+
parseError,
|
|
27
|
+
createStructuredError,
|
|
28
|
+
createDrainPipeline
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function getHeader(headers, name) {
|
|
32
|
+
if (!headers) return void 0;
|
|
33
|
+
if ("get" in headers && typeof headers.get === "function") {
|
|
34
|
+
return headers.get(name) ?? void 0;
|
|
35
|
+
}
|
|
36
|
+
const dictionary = headers;
|
|
37
|
+
const value = dictionary[name] ?? dictionary[name.toLowerCase()];
|
|
38
|
+
return typeof value === "string" ? value : void 0;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
export { createAdapterToolkit, createUseLogger, getHeader };
|
|
42
|
+
//# sourceMappingURL=chunk-2MUUBQJZ.js.map
|
|
43
|
+
//# sourceMappingURL=chunk-2MUUBQJZ.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/core.ts"],"names":[],"mappings":";;;AAgCO,SAAS,gBACd,OAAA,EACA;AACA,EAAA,OAAO,SAAS,SAAA,CACd,OAAA,EACA,oBAAA,EACe;AACf,IAAA,IAAI,MAAA;AACJ,IAAA,IAAI;AACF,MAAA,MAAA,GAAS,gBAAA,CAAiB,QAAW,oBAAoB,CAAA;AAAA,IAC3D,CAAA,CAAA,MAAQ;AACN,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,kBAAA,EAAqB,QAAQ,WAAW,CAAA,2GAAA;AAAA,OAE1C;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,IAAW,QAAQ,MAAA,EAAQ;AAC7B,MAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,OAAO,CAAA;AACpC,MAAA,IAAI,SAAS,MAAA,CAAO,IAAA,CAAK,KAAK,CAAA,CAAE,SAAS,CAAA,EAAG;AAC1C,QAAA,MAAA,CAAO,IAAI,KAAK,CAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT,CAAA;AACF;AAEO,SAAS,qBACd,OAAA,EAC0B;AAC1B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,gBAAgB,OAAO,CAAA;AAAA,IAClC,UAAA;AAAA,IACA,qBAAA;AAAA,IACA;AAAA,GACF;AACF;AAMO,SAAS,SAAA,CACd,SACA,IAAA,EACoB;AACpB,EAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,EAAA,IAAI,KAAA,IAAS,OAAA,IAAW,OAAO,OAAA,CAAQ,QAAQ,UAAA,EAAY;AACzD,IAAA,OAAO,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA,IAAK,MAAA;AAAA,EAC9B;AACA,EAAA,MAAM,UAAA,GAAa,OAAA;AACnB,EAAA,MAAM,QAAQ,UAAA,CAAW,IAAI,KAAK,UAAA,CAAW,IAAA,CAAK,aAAa,CAAA;AAC/D,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,GAAW,KAAA,GAAQ,MAAA;AAC7C","file":"chunk-2MUUBQJZ.js","sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n type ParsedError,\n type RequestLogger,\n type RequestLoggerOptions,\n type RequestLogSnapshot,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\n\nexport interface AdapterUseLoggerOptions<TContext> {\n adapterName: string;\n enrich?: (context: TContext) => Record<string, unknown> | undefined;\n}\n\nexport interface AdapterToolkit<TContext> {\n useLogger: (\n context?: TContext,\n options?: RequestLoggerOptions,\n ) => RequestLogger;\n parseError: (error: unknown) => ParsedError;\n createStructuredError: (input: StructuredErrorInput) => StructuredError;\n createDrainPipeline: <T = unknown>(\n options?: DrainPipelineOptions<T>,\n ) => (drain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>;\n}\n\nexport function createUseLogger<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n) {\n return function useLogger(\n context?: TContext,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger {\n let logger: RequestLogger;\n try {\n logger = getRequestLogger(undefined, requestLoggerOptions);\n } catch {\n throw new Error(\n `[autotel-adapters/${options.adapterName}] No active trace context. ` +\n `Wrap your handler with autotel trace instrumentation before calling useLogger().`,\n );\n }\n\n if (context && options.enrich) {\n const extra = options.enrich(context);\n if (extra && Object.keys(extra).length > 0) {\n logger.set(extra);\n }\n }\n\n return logger;\n };\n}\n\nexport function createAdapterToolkit<TContext = unknown>(\n options: AdapterUseLoggerOptions<TContext>,\n): AdapterToolkit<TContext> {\n return {\n useLogger: createUseLogger(options),\n parseError,\n createStructuredError,\n createDrainPipeline,\n };\n}\n\nexport type HeadersLike =\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n\nexport function getHeader(\n headers: HeadersLike | undefined,\n name: string,\n): string | undefined {\n if (!headers) return undefined;\n if ('get' in headers && typeof headers.get === 'function') {\n return headers.get(name) ?? undefined;\n }\n const dictionary = headers as Record<string, string | undefined>;\n const value = dictionary[name] ?? dictionary[name.toLowerCase()];\n return typeof value === 'string' ? value : undefined;\n}\n\nexport type {\n RequestLogger,\n RequestLoggerOptions,\n RequestLogSnapshot,\n ParsedError,\n StructuredError,\n StructuredErrorInput,\n DrainPipelineOptions,\n PipelineDrainFn,\n};\n"]}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { createUseLogger, createAdapterToolkit, getHeader } from './chunk-2MUUBQJZ.js';
|
|
2
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
3
|
+
import { trace, getRequestLogger, createDrainPipeline, createStructuredError, parseError } from 'autotel';
|
|
4
|
+
export { createDrainPipeline, createStructuredError, parseError } from 'autotel';
|
|
5
|
+
|
|
6
|
+
var nextLoggerStorage = new AsyncLocalStorage();
|
|
7
|
+
function enrichFromRequest(request) {
|
|
8
|
+
if (!request) return void 0;
|
|
9
|
+
let route = "/";
|
|
10
|
+
if (request.url) {
|
|
11
|
+
try {
|
|
12
|
+
route = new URL(request.url).pathname;
|
|
13
|
+
} catch {
|
|
14
|
+
route = request.url;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
const requestId = getHeader(request.headers, "x-request-id");
|
|
18
|
+
return {
|
|
19
|
+
...request.method ? { "http.request.method": request.method } : {},
|
|
20
|
+
...request.url ? { "url.full": request.url } : {},
|
|
21
|
+
...route ? { "http.route": route } : {},
|
|
22
|
+
...requestId ? { "http.request.header.x-request-id": requestId } : {}
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
var baseUseLogger = createUseLogger({
|
|
26
|
+
adapterName: "next",
|
|
27
|
+
enrich: enrichFromRequest
|
|
28
|
+
});
|
|
29
|
+
function useLogger(request, requestLoggerOptions) {
|
|
30
|
+
const logger = nextLoggerStorage.getStore();
|
|
31
|
+
if (logger) return logger;
|
|
32
|
+
return baseUseLogger(request, requestLoggerOptions);
|
|
33
|
+
}
|
|
34
|
+
function withAutotel(handler, options) {
|
|
35
|
+
return async (...args) => {
|
|
36
|
+
const request = args[0];
|
|
37
|
+
const spanName = typeof options?.spanName === "function" ? options.spanName(request) : options?.spanName ?? "next.request";
|
|
38
|
+
const wrapped = trace(
|
|
39
|
+
{ name: spanName },
|
|
40
|
+
(ctx) => async (...innerArgs) => {
|
|
41
|
+
const innerRequest = innerArgs[0];
|
|
42
|
+
const log = getRequestLogger(ctx, options?.requestLoggerOptions);
|
|
43
|
+
const auto = enrichFromRequest(innerRequest);
|
|
44
|
+
if (auto && Object.keys(auto).length > 0) {
|
|
45
|
+
log.set(auto);
|
|
46
|
+
}
|
|
47
|
+
const custom = options?.enrich?.(innerRequest);
|
|
48
|
+
if (custom && Object.keys(custom).length > 0) {
|
|
49
|
+
log.set(custom);
|
|
50
|
+
}
|
|
51
|
+
return await nextLoggerStorage.run(log, async () => handler(...innerArgs));
|
|
52
|
+
}
|
|
53
|
+
);
|
|
54
|
+
return await wrapped(...args);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
function createNextAdapter(options) {
|
|
58
|
+
return {
|
|
59
|
+
withAutotel: (handler) => withAutotel(handler, options),
|
|
60
|
+
useLogger: (request, requestLoggerOptions) => useLogger(request, requestLoggerOptions),
|
|
61
|
+
parseError: (error) => parseError(error),
|
|
62
|
+
createStructuredError: (input) => createStructuredError(input),
|
|
63
|
+
createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
var nextToolkit = createAdapterToolkit({
|
|
67
|
+
adapterName: "next",
|
|
68
|
+
enrich: enrichFromRequest
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
export { createNextAdapter, nextToolkit, useLogger, withAutotel };
|
|
72
|
+
//# sourceMappingURL=chunk-F2K6UTRF.js.map
|
|
73
|
+
//# sourceMappingURL=chunk-F2K6UTRF.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/next.ts"],"names":[],"mappings":"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","file":"chunk-F2K6UTRF.js","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n createDrainPipeline,\n getRequestLogger,\n parseError,\n trace,\n createStructuredError,\n type RequestLogger,\n type RequestLoggerOptions,\n type ParsedError,\n type DrainPipelineOptions,\n type PipelineDrainFn,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface NextRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n}\n\nexport interface NextWithAutotelOptions {\n spanName?: string | ((request?: NextRequestLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (request?: NextRequestLike) => Record<string, unknown> | undefined;\n}\n\nconst nextLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nfunction enrichFromRequest(\n request?: NextRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n const requestId = getHeader(request.headers, 'x-request-id');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.header.x-request-id': requestId } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n const logger = nextLoggerStorage.getStore();\n if (logger) return logger;\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotel<TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n options?: NextWithAutotelOptions,\n): (...args: TArgs) => Promise<TReturn> {\n return async (...args: TArgs): Promise<TReturn> => {\n const request = args[0] as NextRequestLike | undefined;\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request)\n : (options?.spanName ?? 'next.request');\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (...innerArgs: TArgs) => {\n const innerRequest = innerArgs[0] as NextRequestLike | undefined;\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerRequest);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n return await nextLoggerStorage.run(log, async () => handler(...innerArgs));\n },\n );\n return await wrapped(...args);\n };\n}\n\nexport function createNextAdapter(options?: NextWithAutotelOptions) {\n return {\n withAutotel: <TArgs extends unknown[], TReturn>(\n handler: (...args: TArgs) => TReturn | Promise<TReturn>,\n ) => withAutotel(handler, options),\n useLogger: (\n request?: NextRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n ): RequestLogger => useLogger(request, requestLoggerOptions),\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => createStructuredError(input),\n createDrainPipeline: <T = unknown>(\n drainOptions?: DrainPipelineOptions<T>,\n ): ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>) =>\n createDrainPipeline(drainOptions),\n };\n}\n\nexport const nextToolkit = createAdapterToolkit<NextRequestLike>({\n adapterName: 'next',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"]}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { createUseLogger, createAdapterToolkit } from './chunk-2MUUBQJZ.js';
|
|
2
|
+
|
|
3
|
+
// src/hono.ts
|
|
4
|
+
var useLogger = createUseLogger({
|
|
5
|
+
adapterName: "hono",
|
|
6
|
+
enrich: (c) => ({
|
|
7
|
+
"http.request.method": c.req.method,
|
|
8
|
+
"url.full": c.req.url,
|
|
9
|
+
"http.route": c.req.path
|
|
10
|
+
})
|
|
11
|
+
});
|
|
12
|
+
var honoToolkit = createAdapterToolkit({
|
|
13
|
+
adapterName: "hono",
|
|
14
|
+
enrich: (c) => ({
|
|
15
|
+
"http.request.method": c.req.method,
|
|
16
|
+
"url.full": c.req.url,
|
|
17
|
+
"http.route": c.req.path
|
|
18
|
+
})
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export { honoToolkit, useLogger };
|
|
22
|
+
//# sourceMappingURL=chunk-FPHF553F.js.map
|
|
23
|
+
//# sourceMappingURL=chunk-FPHF553F.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/hono.ts"],"names":[],"mappings":";;;AAGO,IAAM,YAAY,eAAA,CAAyB;AAAA,EAChD,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ,CAAC,CAAA,MAAO;AAAA,IACd,qBAAA,EAAuB,EAAE,GAAA,CAAI,MAAA;AAAA,IAC7B,UAAA,EAAY,EAAE,GAAA,CAAI,GAAA;AAAA,IAClB,YAAA,EAAc,EAAE,GAAA,CAAI;AAAA,GACtB;AACF,CAAC;AAEM,IAAM,cAAc,oBAAA,CAA8B;AAAA,EACvD,WAAA,EAAa,MAAA;AAAA,EACb,MAAA,EAAQ,CAAC,CAAA,MAAO;AAAA,IACd,qBAAA,EAAuB,EAAE,GAAA,CAAI,MAAA;AAAA,IAC7B,UAAA,EAAY,EAAE,GAAA,CAAI,GAAA;AAAA,IAClB,YAAA,EAAc,EAAE,GAAA,CAAI;AAAA,GACtB;AACF,CAAC","file":"chunk-FPHF553F.js","sourcesContent":["import type { Context } from 'hono';\nimport { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n\nexport const honoToolkit = createAdapterToolkit<Context>({\n adapterName: 'hono',\n enrich: (c) => ({\n 'http.request.method': c.req.method,\n 'url.full': c.req.url,\n 'http.route': c.req.path,\n }),\n});\n"]}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { createUseLogger, createAdapterToolkit, getHeader } from './chunk-2MUUBQJZ.js';
|
|
2
|
+
import { trace, getRequestLogger, createDrainPipeline, createStructuredError, parseError } from 'autotel';
|
|
3
|
+
export { createDrainPipeline, createStructuredError, parseError } from 'autotel';
|
|
4
|
+
|
|
5
|
+
var requestLoggers = /* @__PURE__ */ new WeakMap();
|
|
6
|
+
function enrichFromRequest(request) {
|
|
7
|
+
if (!request) return void 0;
|
|
8
|
+
let route = "/";
|
|
9
|
+
if (request.url) {
|
|
10
|
+
try {
|
|
11
|
+
route = new URL(request.url).pathname;
|
|
12
|
+
} catch {
|
|
13
|
+
route = request.url;
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
const requestId = getHeader(request.headers, "x-request-id") ?? getHeader(request.headers, "cf-ray");
|
|
17
|
+
return {
|
|
18
|
+
...request.method ? { "http.request.method": request.method } : {},
|
|
19
|
+
...request.url ? { "url.full": request.url } : {},
|
|
20
|
+
...route ? { "http.route": route } : {},
|
|
21
|
+
...requestId ? { "http.request.id": requestId } : {},
|
|
22
|
+
...request.cf?.country ? { "cloudflare.country": request.cf.country } : {},
|
|
23
|
+
...request.cf?.colo ? { "cloudflare.colo": request.cf.colo } : {},
|
|
24
|
+
...request.cf?.city ? { "cloudflare.city": request.cf.city } : {}
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
var baseUseLogger = createUseLogger({
|
|
28
|
+
adapterName: "cloudflare",
|
|
29
|
+
enrich: enrichFromRequest
|
|
30
|
+
});
|
|
31
|
+
function useLogger(request, requestLoggerOptions) {
|
|
32
|
+
if (request) {
|
|
33
|
+
const existing = requestLoggers.get(request);
|
|
34
|
+
if (existing) return existing;
|
|
35
|
+
}
|
|
36
|
+
return baseUseLogger(request, requestLoggerOptions);
|
|
37
|
+
}
|
|
38
|
+
function withAutotelFetch(handler, options) {
|
|
39
|
+
return async (request, env, executionContext) => {
|
|
40
|
+
const spanName = typeof options?.spanName === "function" ? options.spanName(request, env) : options?.spanName ?? `cloudflare.${request.method ?? "request"}`;
|
|
41
|
+
const wrapped = trace(
|
|
42
|
+
{ name: spanName },
|
|
43
|
+
(ctx) => async (innerRequest, innerEnv, innerExecutionContext) => {
|
|
44
|
+
const log = getRequestLogger(ctx, options?.requestLoggerOptions);
|
|
45
|
+
const auto = enrichFromRequest(innerRequest);
|
|
46
|
+
if (auto && Object.keys(auto).length > 0) {
|
|
47
|
+
log.set(auto);
|
|
48
|
+
}
|
|
49
|
+
const custom = options?.enrich?.(
|
|
50
|
+
innerRequest,
|
|
51
|
+
innerEnv,
|
|
52
|
+
innerExecutionContext
|
|
53
|
+
);
|
|
54
|
+
if (custom && Object.keys(custom).length > 0) {
|
|
55
|
+
log.set(custom);
|
|
56
|
+
}
|
|
57
|
+
requestLoggers.set(innerRequest, log);
|
|
58
|
+
try {
|
|
59
|
+
return await handler(innerRequest, innerEnv, innerExecutionContext);
|
|
60
|
+
} finally {
|
|
61
|
+
requestLoggers.delete(innerRequest);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
);
|
|
65
|
+
return await wrapped(request, env, executionContext);
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
function createCloudflareAdapter(options) {
|
|
69
|
+
return {
|
|
70
|
+
withAutotelFetch: (handler) => withAutotelFetch(handler, options),
|
|
71
|
+
useLogger,
|
|
72
|
+
parseError: (error) => parseError(error),
|
|
73
|
+
createStructuredError: (input) => createStructuredError(input),
|
|
74
|
+
createDrainPipeline: (drainOptions) => createDrainPipeline(drainOptions)
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
var cloudflareToolkit = createAdapterToolkit({
|
|
78
|
+
adapterName: "cloudflare",
|
|
79
|
+
enrich: enrichFromRequest
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
export { cloudflareToolkit, createCloudflareAdapter, useLogger, withAutotelFetch };
|
|
83
|
+
//# sourceMappingURL=chunk-HC3ZQAZV.js.map
|
|
84
|
+
//# sourceMappingURL=chunk-HC3ZQAZV.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/cloudflare.ts"],"names":[],"mappings":"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","file":"chunk-HC3ZQAZV.js","sourcesContent":["import {\n createDrainPipeline,\n createStructuredError,\n getRequestLogger,\n parseError,\n trace,\n type DrainPipelineOptions,\n type ParsedError,\n type PipelineDrainFn,\n type RequestLogger,\n type RequestLoggerOptions,\n type StructuredError,\n type StructuredErrorInput,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger, getHeader } from './core';\n\nexport interface CloudflareRequestLike {\n method?: string;\n url?: string;\n headers?:\n | { get(name: string): string | null }\n | Record<string, string | undefined>;\n cf?: Record<string, unknown>;\n}\n\nexport interface CloudflareExecutionContextLike {\n waitUntil?: (promise: Promise<unknown>) => void;\n passThroughOnException?: () => void;\n}\n\nexport interface CloudflareWithAutotelOptions<TEnv = unknown> {\n spanName?: string | ((request: CloudflareRequestLike, env: TEnv) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (\n request: CloudflareRequestLike,\n env: TEnv,\n ctx: CloudflareExecutionContextLike,\n ) => Record<string, unknown> | undefined;\n}\n\nconst requestLoggers = new WeakMap<object, RequestLogger>();\n\nfunction enrichFromRequest(\n request?: CloudflareRequestLike,\n): Record<string, unknown> | undefined {\n if (!request) return undefined;\n\n let route = '/';\n if (request.url) {\n try {\n route = new URL(request.url).pathname;\n } catch {\n route = request.url;\n }\n }\n\n const requestId =\n getHeader(request.headers, 'x-request-id') ??\n getHeader(request.headers, 'cf-ray');\n\n return {\n ...(request.method ? { 'http.request.method': request.method } : {}),\n ...(request.url ? { 'url.full': request.url } : {}),\n ...(route ? { 'http.route': route } : {}),\n ...(requestId ? { 'http.request.id': requestId } : {}),\n ...(request.cf?.country ? { 'cloudflare.country': request.cf.country } : {}),\n ...(request.cf?.colo ? { 'cloudflare.colo': request.cf.colo } : {}),\n ...(request.cf?.city ? { 'cloudflare.city': request.cf.city } : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport function useLogger(\n request?: CloudflareRequestLike,\n requestLoggerOptions?: RequestLoggerOptions,\n): RequestLogger {\n if (request) {\n const existing = requestLoggers.get(request as object);\n if (existing) return existing;\n }\n return baseUseLogger(request, requestLoggerOptions);\n}\n\nexport function withAutotelFetch<\n TEnv,\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n>(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n options?: CloudflareWithAutotelOptions<TEnv>,\n): (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n) => Promise<TReturn> {\n return async (\n request: TRequest,\n env: TEnv,\n executionContext: TContext,\n ): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(request, env)\n : (options?.spanName ?? `cloudflare.${request.method ?? 'request'}`);\n\n const wrapped = trace(\n { name: spanName },\n (ctx) => async (\n innerRequest: TRequest,\n innerEnv: TEnv,\n innerExecutionContext: TContext,\n ) => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromRequest(innerRequest);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(\n innerRequest,\n innerEnv,\n innerExecutionContext,\n );\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n\n requestLoggers.set(innerRequest as object, log);\n try {\n return await handler(innerRequest, innerEnv, innerExecutionContext);\n } finally {\n requestLoggers.delete(innerRequest as object);\n }\n },\n );\n\n return await wrapped(request, env, executionContext);\n };\n}\n\nexport function createCloudflareAdapter<TEnv = unknown>(\n options?: CloudflareWithAutotelOptions<TEnv>,\n) {\n return {\n withAutotelFetch: <\n TRequest extends CloudflareRequestLike,\n TContext extends CloudflareExecutionContextLike,\n TReturn,\n >(\n handler: (\n request: TRequest,\n env: TEnv,\n ctx: TContext,\n ) => TReturn | Promise<TReturn>,\n ) => withAutotelFetch(handler, options),\n useLogger,\n parseError: (error: unknown): ParsedError => parseError(error),\n createStructuredError: (\n input: StructuredErrorInput,\n ): StructuredError => createStructuredError(input),\n createDrainPipeline: <T = unknown>(\n drainOptions?: DrainPipelineOptions<T>,\n ): ((batchDrain: (batch: T[]) => void | Promise<void>) => PipelineDrainFn<T>) =>\n createDrainPipeline(drainOptions),\n };\n}\n\nexport const cloudflareToolkit = createAdapterToolkit<CloudflareRequestLike>({\n adapterName: 'cloudflare',\n enrich: enrichFromRequest,\n});\n\nexport { parseError, createDrainPipeline, createStructuredError };\n"]}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { createUseLogger, createAdapterToolkit } from './chunk-2MUUBQJZ.js';
|
|
2
|
+
|
|
3
|
+
// src/tanstack.ts
|
|
4
|
+
var useLogger = createUseLogger({
|
|
5
|
+
adapterName: "tanstack",
|
|
6
|
+
enrich: (ctx) => ({
|
|
7
|
+
...ctx.method ? { "http.request.method": ctx.method } : {},
|
|
8
|
+
...ctx.pathname ? { "http.route": ctx.pathname } : {}
|
|
9
|
+
})
|
|
10
|
+
});
|
|
11
|
+
var tanstackToolkit = createAdapterToolkit({
|
|
12
|
+
adapterName: "tanstack",
|
|
13
|
+
enrich: (ctx) => ({
|
|
14
|
+
...ctx.method ? { "http.request.method": ctx.method } : {},
|
|
15
|
+
...ctx.pathname ? { "http.route": ctx.pathname } : {}
|
|
16
|
+
})
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export { tanstackToolkit, useLogger };
|
|
20
|
+
//# sourceMappingURL=chunk-LFDWJWP2.js.map
|
|
21
|
+
//# sourceMappingURL=chunk-LFDWJWP2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/tanstack.ts"],"names":[],"mappings":";;;AAEO,IAAM,YAAY,eAAA,CAGtB;AAAA,EACD,WAAA,EAAa,UAAA;AAAA,EACb,MAAA,EAAQ,CAAC,GAAA,MAAS;AAAA,IAChB,GAAI,IAAI,MAAA,GAAS,EAAE,uBAAuB,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC1D,GAAI,IAAI,QAAA,GAAW,EAAE,cAAc,GAAA,CAAI,QAAA,KAAa;AAAC,GACvD;AACF,CAAC;AAEM,IAAM,kBAAkB,oBAAA,CAG5B;AAAA,EACD,WAAA,EAAa,UAAA;AAAA,EACb,MAAA,EAAQ,CAAC,GAAA,MAAS;AAAA,IAChB,GAAI,IAAI,MAAA,GAAS,EAAE,uBAAuB,GAAA,CAAI,MAAA,KAAW,EAAC;AAAA,IAC1D,GAAI,IAAI,QAAA,GAAW,EAAE,cAAc,GAAA,CAAI,QAAA,KAAa;AAAC,GACvD;AACF,CAAC","file":"chunk-LFDWJWP2.js","sourcesContent":["import { createUseLogger, createAdapterToolkit } from './core';\n\nexport const useLogger = createUseLogger<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n\nexport const tanstackToolkit = createAdapterToolkit<{\n pathname?: string;\n method?: string;\n}>({\n adapterName: 'tanstack',\n enrich: (ctx) => ({\n ...(ctx.method ? { 'http.request.method': ctx.method } : {}),\n ...(ctx.pathname ? { 'http.route': ctx.pathname } : {}),\n }),\n});\n"]}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { createUseLogger, createAdapterToolkit } from './chunk-2MUUBQJZ.js';
|
|
2
|
+
import { AsyncLocalStorage } from 'async_hooks';
|
|
3
|
+
import { trace, getRequestLogger } from 'autotel';
|
|
4
|
+
|
|
5
|
+
function enrichFromEvent(event) {
|
|
6
|
+
if (!event) return void 0;
|
|
7
|
+
return {
|
|
8
|
+
...event.method ? { "http.request.method": event.method } : {},
|
|
9
|
+
...event.path ? { "http.route": event.path } : {},
|
|
10
|
+
...typeof event.context?.requestId === "string" ? { "http.request.id": event.context.requestId } : {}
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
var baseUseLogger = createUseLogger({
|
|
14
|
+
adapterName: "nitro",
|
|
15
|
+
enrich: enrichFromEvent
|
|
16
|
+
});
|
|
17
|
+
var nitroLoggerStorage = new AsyncLocalStorage();
|
|
18
|
+
function useLogger(event, serviceOrOptions) {
|
|
19
|
+
const stored = nitroLoggerStorage.getStore();
|
|
20
|
+
const logger = stored ?? (typeof serviceOrOptions === "string" ? baseUseLogger(event) : baseUseLogger(event, serviceOrOptions));
|
|
21
|
+
if (typeof serviceOrOptions === "string" && serviceOrOptions.length > 0) {
|
|
22
|
+
logger.set({ service: serviceOrOptions });
|
|
23
|
+
}
|
|
24
|
+
return logger;
|
|
25
|
+
}
|
|
26
|
+
function withAutotelEventHandler(handler, options) {
|
|
27
|
+
return async (event) => {
|
|
28
|
+
const spanName = typeof options?.spanName === "function" ? options.spanName(event) : options?.spanName ?? `nitro.${event.method ?? "request"}`;
|
|
29
|
+
const wrapped = trace({ name: spanName }, (ctx) => async (innerEvent) => {
|
|
30
|
+
const log = getRequestLogger(ctx, options?.requestLoggerOptions);
|
|
31
|
+
const auto = enrichFromEvent(innerEvent);
|
|
32
|
+
if (auto && Object.keys(auto).length > 0) {
|
|
33
|
+
log.set(auto);
|
|
34
|
+
}
|
|
35
|
+
const custom = options?.enrich?.(innerEvent);
|
|
36
|
+
if (custom && Object.keys(custom).length > 0) {
|
|
37
|
+
log.set(custom);
|
|
38
|
+
}
|
|
39
|
+
return await nitroLoggerStorage.run(log, async () => handler(innerEvent));
|
|
40
|
+
});
|
|
41
|
+
return await wrapped(event);
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function createNitroAdapter(options) {
|
|
45
|
+
const toolkit = createAdapterToolkit({
|
|
46
|
+
adapterName: "nitro",
|
|
47
|
+
enrich: (event) => ({
|
|
48
|
+
...enrichFromEvent(event),
|
|
49
|
+
...options?.enrich?.(event) ?? {}
|
|
50
|
+
})
|
|
51
|
+
});
|
|
52
|
+
return {
|
|
53
|
+
withAutotelEventHandler: (handler) => withAutotelEventHandler(handler, options),
|
|
54
|
+
useLogger,
|
|
55
|
+
parseError: toolkit.parseError,
|
|
56
|
+
createStructuredError: toolkit.createStructuredError,
|
|
57
|
+
createDrainPipeline: toolkit.createDrainPipeline
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
var nitroToolkit = createAdapterToolkit({
|
|
61
|
+
adapterName: "nitro",
|
|
62
|
+
enrich: enrichFromEvent
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
export { createNitroAdapter, nitroToolkit, useLogger, withAutotelEventHandler };
|
|
66
|
+
//# sourceMappingURL=chunk-VFTRQVDR.js.map
|
|
67
|
+
//# sourceMappingURL=chunk-VFTRQVDR.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/nitro.ts"],"names":[],"mappings":"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","file":"chunk-VFTRQVDR.js","sourcesContent":["import { AsyncLocalStorage } from 'node:async_hooks';\nimport {\n getRequestLogger,\n trace,\n type RequestLogger,\n type RequestLoggerOptions,\n} from 'autotel';\nimport { createAdapterToolkit, createUseLogger } from './core';\n\nexport interface NitroEventLike {\n method?: string;\n path?: string;\n context?: Record<string, unknown>;\n}\n\nexport interface NitroWithAutotelOptions {\n spanName?: string | ((event: NitroEventLike) => string);\n requestLoggerOptions?: RequestLoggerOptions;\n enrich?: (event: NitroEventLike) => Record<string, unknown> | undefined;\n}\n\nfunction enrichFromEvent(\n event?: NitroEventLike,\n): Record<string, unknown> | undefined {\n if (!event) return undefined;\n\n return {\n ...(event.method ? { 'http.request.method': event.method } : {}),\n ...(event.path ? { 'http.route': event.path } : {}),\n ...(typeof event.context?.requestId === 'string'\n ? { 'http.request.id': event.context.requestId }\n : {}),\n };\n}\n\nconst baseUseLogger = createUseLogger<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\nconst nitroLoggerStorage = new AsyncLocalStorage<RequestLogger>();\n\nexport function useLogger(\n event?: NitroEventLike,\n serviceOrOptions?: string | RequestLoggerOptions,\n): RequestLogger {\n const stored = nitroLoggerStorage.getStore();\n const logger = stored ??\n (\n typeof serviceOrOptions === 'string'\n ? baseUseLogger(event)\n : baseUseLogger(event, serviceOrOptions)\n );\n\n if (typeof serviceOrOptions === 'string' && serviceOrOptions.length > 0) {\n logger.set({ service: serviceOrOptions });\n }\n\n return logger;\n}\n\nexport function withAutotelEventHandler<TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n options?: NitroWithAutotelOptions,\n): (event: TEvent) => Promise<TReturn> {\n return async (event: TEvent): Promise<TReturn> => {\n const spanName =\n typeof options?.spanName === 'function'\n ? options.spanName(event)\n : (options?.spanName ?? `nitro.${event.method ?? 'request'}`);\n\n const wrapped = trace({ name: spanName }, (ctx) => async (innerEvent: TEvent) => {\n const log = getRequestLogger(ctx, options?.requestLoggerOptions);\n const auto = enrichFromEvent(innerEvent);\n if (auto && Object.keys(auto).length > 0) {\n log.set(auto);\n }\n const custom = options?.enrich?.(innerEvent);\n if (custom && Object.keys(custom).length > 0) {\n log.set(custom);\n }\n return await nitroLoggerStorage.run(log, async () => handler(innerEvent));\n });\n\n return await wrapped(event);\n };\n}\n\nexport function createNitroAdapter(options?: NitroWithAutotelOptions) {\n const toolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: (event) => ({\n ...enrichFromEvent(event),\n ...(options?.enrich?.(event) ?? {}),\n }),\n });\n\n return {\n withAutotelEventHandler: <TEvent extends NitroEventLike, TReturn>(\n handler: (event: TEvent) => TReturn | Promise<TReturn>,\n ) => withAutotelEventHandler(handler, options),\n useLogger,\n parseError: toolkit.parseError,\n createStructuredError: toolkit.createStructuredError,\n createDrainPipeline: toolkit.createDrainPipeline,\n };\n}\n\nexport const nitroToolkit = createAdapterToolkit<NitroEventLike>({\n adapterName: 'nitro',\n enrich: enrichFromEvent,\n});\n"]}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var autotel = require('autotel');
|
|
4
|
+
|
|
5
|
+
// src/cloudflare.ts
|
|
6
|
+
function createUseLogger(options) {
|
|
7
|
+
return function useLogger2(context, requestLoggerOptions) {
|
|
8
|
+
let logger;
|
|
9
|
+
try {
|
|
10
|
+
logger = autotel.getRequestLogger(void 0, requestLoggerOptions);
|
|
11
|
+
} catch {
|
|
12
|
+
throw new Error(
|
|
13
|
+
`[autotel-adapters/${options.adapterName}] No active trace context. Wrap your handler with autotel trace instrumentation before calling useLogger().`
|
|
14
|
+
);
|
|
15
|
+
}
|
|
16
|
+
if (context && options.enrich) {
|
|
17
|
+
const extra = options.enrich(context);
|
|
18
|
+
if (extra && Object.keys(extra).length > 0) {
|
|
19
|
+
logger.set(extra);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
return logger;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
function createAdapterToolkit(options) {
|
|
26
|
+
return {
|
|
27
|
+
useLogger: createUseLogger(options),
|
|
28
|
+
parseError: autotel.parseError,
|
|
29
|
+
createStructuredError: autotel.createStructuredError,
|
|
30
|
+
createDrainPipeline: autotel.createDrainPipeline
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function getHeader(headers, name) {
|
|
34
|
+
if (!headers) return void 0;
|
|
35
|
+
if ("get" in headers && typeof headers.get === "function") {
|
|
36
|
+
return headers.get(name) ?? void 0;
|
|
37
|
+
}
|
|
38
|
+
const dictionary = headers;
|
|
39
|
+
const value = dictionary[name] ?? dictionary[name.toLowerCase()];
|
|
40
|
+
return typeof value === "string" ? value : void 0;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
// src/cloudflare.ts
|
|
44
|
+
var requestLoggers = /* @__PURE__ */ new WeakMap();
|
|
45
|
+
function enrichFromRequest(request) {
|
|
46
|
+
if (!request) return void 0;
|
|
47
|
+
let route = "/";
|
|
48
|
+
if (request.url) {
|
|
49
|
+
try {
|
|
50
|
+
route = new URL(request.url).pathname;
|
|
51
|
+
} catch {
|
|
52
|
+
route = request.url;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
const requestId = getHeader(request.headers, "x-request-id") ?? getHeader(request.headers, "cf-ray");
|
|
56
|
+
return {
|
|
57
|
+
...request.method ? { "http.request.method": request.method } : {},
|
|
58
|
+
...request.url ? { "url.full": request.url } : {},
|
|
59
|
+
...route ? { "http.route": route } : {},
|
|
60
|
+
...requestId ? { "http.request.id": requestId } : {},
|
|
61
|
+
...request.cf?.country ? { "cloudflare.country": request.cf.country } : {},
|
|
62
|
+
...request.cf?.colo ? { "cloudflare.colo": request.cf.colo } : {},
|
|
63
|
+
...request.cf?.city ? { "cloudflare.city": request.cf.city } : {}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
var baseUseLogger = createUseLogger({
|
|
67
|
+
adapterName: "cloudflare",
|
|
68
|
+
enrich: enrichFromRequest
|
|
69
|
+
});
|
|
70
|
+
function useLogger(request, requestLoggerOptions) {
|
|
71
|
+
if (request) {
|
|
72
|
+
const existing = requestLoggers.get(request);
|
|
73
|
+
if (existing) return existing;
|
|
74
|
+
}
|
|
75
|
+
return baseUseLogger(request, requestLoggerOptions);
|
|
76
|
+
}
|
|
77
|
+
function withAutotelFetch(handler, options) {
|
|
78
|
+
return async (request, env, executionContext) => {
|
|
79
|
+
const spanName = typeof options?.spanName === "function" ? options.spanName(request, env) : options?.spanName ?? `cloudflare.${request.method ?? "request"}`;
|
|
80
|
+
const wrapped = autotel.trace(
|
|
81
|
+
{ name: spanName },
|
|
82
|
+
(ctx) => async (innerRequest, innerEnv, innerExecutionContext) => {
|
|
83
|
+
const log = autotel.getRequestLogger(ctx, options?.requestLoggerOptions);
|
|
84
|
+
const auto = enrichFromRequest(innerRequest);
|
|
85
|
+
if (auto && Object.keys(auto).length > 0) {
|
|
86
|
+
log.set(auto);
|
|
87
|
+
}
|
|
88
|
+
const custom = options?.enrich?.(
|
|
89
|
+
innerRequest,
|
|
90
|
+
innerEnv,
|
|
91
|
+
innerExecutionContext
|
|
92
|
+
);
|
|
93
|
+
if (custom && Object.keys(custom).length > 0) {
|
|
94
|
+
log.set(custom);
|
|
95
|
+
}
|
|
96
|
+
requestLoggers.set(innerRequest, log);
|
|
97
|
+
try {
|
|
98
|
+
return await handler(innerRequest, innerEnv, innerExecutionContext);
|
|
99
|
+
} finally {
|
|
100
|
+
requestLoggers.delete(innerRequest);
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
);
|
|
104
|
+
return await wrapped(request, env, executionContext);
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
function createCloudflareAdapter(options) {
|
|
108
|
+
return {
|
|
109
|
+
withAutotelFetch: (handler) => withAutotelFetch(handler, options),
|
|
110
|
+
useLogger,
|
|
111
|
+
parseError: (error) => autotel.parseError(error),
|
|
112
|
+
createStructuredError: (input) => autotel.createStructuredError(input),
|
|
113
|
+
createDrainPipeline: (drainOptions) => autotel.createDrainPipeline(drainOptions)
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
var cloudflareToolkit = createAdapterToolkit({
|
|
117
|
+
adapterName: "cloudflare",
|
|
118
|
+
enrich: enrichFromRequest
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
Object.defineProperty(exports, "createDrainPipeline", {
|
|
122
|
+
enumerable: true,
|
|
123
|
+
get: function () { return autotel.createDrainPipeline; }
|
|
124
|
+
});
|
|
125
|
+
Object.defineProperty(exports, "createStructuredError", {
|
|
126
|
+
enumerable: true,
|
|
127
|
+
get: function () { return autotel.createStructuredError; }
|
|
128
|
+
});
|
|
129
|
+
Object.defineProperty(exports, "parseError", {
|
|
130
|
+
enumerable: true,
|
|
131
|
+
get: function () { return autotel.parseError; }
|
|
132
|
+
});
|
|
133
|
+
exports.cloudflareToolkit = cloudflareToolkit;
|
|
134
|
+
exports.createCloudflareAdapter = createCloudflareAdapter;
|
|
135
|
+
exports.useLogger = useLogger;
|
|
136
|
+
exports.withAutotelFetch = withAutotelFetch;
|
|
137
|
+
//# sourceMappingURL=cloudflare.cjs.map
|
|
138
|
+
//# sourceMappingURL=cloudflare.cjs.map
|