@vestig/next 0.3.1
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 +290 -0
- package/dist/client/hooks.d.ts +95 -0
- package/dist/client/hooks.d.ts.map +1 -0
- package/dist/client/hooks.js +128 -0
- package/dist/client/hooks.js.map +1 -0
- package/dist/client/index.d.ts +4 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +9 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/provider.d.ts +66 -0
- package/dist/client/provider.d.ts.map +1 -0
- package/dist/client/provider.js +126 -0
- package/dist/client/provider.js.map +1 -0
- package/dist/client/transport.d.ts +59 -0
- package/dist/client/transport.d.ts.map +1 -0
- package/dist/client/transport.js +148 -0
- package/dist/client/transport.js.map +1 -0
- package/dist/client.d.ts +43 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +47 -0
- package/dist/client.js.map +1 -0
- package/dist/config/defaults.d.ts +10 -0
- package/dist/config/defaults.d.ts.map +1 -0
- package/dist/config/defaults.js +72 -0
- package/dist/config/defaults.js.map +1 -0
- package/dist/config/index.d.ts +116 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +27 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/loader.d.ts +21 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +31 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +43 -0
- package/dist/index.js.map +1 -0
- package/dist/route/handler.d.ts +56 -0
- package/dist/route/handler.d.ts.map +1 -0
- package/dist/route/handler.js +250 -0
- package/dist/route/handler.js.map +1 -0
- package/dist/route/index.d.ts +2 -0
- package/dist/route/index.d.ts.map +1 -0
- package/dist/route/index.js +3 -0
- package/dist/route/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +10 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/middleware.d.ts +108 -0
- package/dist/server/middleware.d.ts.map +1 -0
- package/dist/server/middleware.js +182 -0
- package/dist/server/middleware.js.map +1 -0
- package/dist/server/route-handler.d.ts +93 -0
- package/dist/server/route-handler.d.ts.map +1 -0
- package/dist/server/route-handler.js +160 -0
- package/dist/server/route-handler.js.map +1 -0
- package/dist/server/server-action.d.ts +74 -0
- package/dist/server/server-action.d.ts.map +1 -0
- package/dist/server/server-action.js +132 -0
- package/dist/server/server-action.js.map +1 -0
- package/dist/server/server-component.d.ts +87 -0
- package/dist/server/server-component.d.ts.map +1 -0
- package/dist/server/server-component.js +122 -0
- package/dist/server/server-component.js.map +1 -0
- package/dist/types.d.ts +80 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/headers.d.ts +38 -0
- package/dist/utils/headers.d.ts.map +1 -0
- package/dist/utils/headers.js +42 -0
- package/dist/utils/headers.js.map +1 -0
- package/dist/utils/index.d.ts +4 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +4 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/metadata.d.ts +41 -0
- package/dist/utils/metadata.d.ts.map +1 -0
- package/dist/utils/metadata.js +46 -0
- package/dist/utils/metadata.js.map +1 -0
- package/dist/utils/timing.d.ts +31 -0
- package/dist/utils/timing.d.ts.map +1 -0
- package/dist/utils/timing.js +46 -0
- package/dist/utils/timing.js.map +1 -0
- package/package.json +88 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { type LogContext, type LogLevel, type Logger, type SanitizePreset } from 'vestig';
|
|
2
|
+
export interface ServerLoggerOptions {
|
|
3
|
+
/** Log level */
|
|
4
|
+
level?: LogLevel;
|
|
5
|
+
/** Enable/disable logging */
|
|
6
|
+
enabled?: boolean;
|
|
7
|
+
/** PII sanitization preset */
|
|
8
|
+
sanitize?: SanitizePreset;
|
|
9
|
+
/** Use structured JSON output */
|
|
10
|
+
structured?: boolean;
|
|
11
|
+
/** Base namespace for server-side logs */
|
|
12
|
+
namespace?: string;
|
|
13
|
+
/** Additional context to include in all logs */
|
|
14
|
+
context?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Configure server-side logging options
|
|
18
|
+
* Call this once in your app initialization
|
|
19
|
+
*/
|
|
20
|
+
export declare function configureServerLogger(options: ServerLoggerOptions): void;
|
|
21
|
+
/**
|
|
22
|
+
* Get a logger instance in Server Components
|
|
23
|
+
*
|
|
24
|
+
* Automatically includes request correlation context from the middleware.
|
|
25
|
+
* Uses React's cache() to ensure the same logger is used for the entire request.
|
|
26
|
+
*
|
|
27
|
+
* @param namespace - Optional namespace for the logger (e.g., 'users', 'auth')
|
|
28
|
+
*
|
|
29
|
+
* @example
|
|
30
|
+
* ```typescript
|
|
31
|
+
* // app/users/page.tsx
|
|
32
|
+
* import { getLogger } from '@vestig/next'
|
|
33
|
+
*
|
|
34
|
+
* export default async function UsersPage() {
|
|
35
|
+
* const log = await getLogger('users-page')
|
|
36
|
+
*
|
|
37
|
+
* log.info('Rendering users page')
|
|
38
|
+
*
|
|
39
|
+
* const users = await fetchUsers()
|
|
40
|
+
* log.debug('Users fetched', { count: users.length })
|
|
41
|
+
*
|
|
42
|
+
* return <UserList users={users} />
|
|
43
|
+
* }
|
|
44
|
+
* ```
|
|
45
|
+
*/
|
|
46
|
+
export declare function getLogger(namespace?: string): Promise<Logger>;
|
|
47
|
+
/**
|
|
48
|
+
* Get the current request's correlation context in Server Components
|
|
49
|
+
*
|
|
50
|
+
* Useful for passing correlation IDs to client components or external services.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // app/layout.tsx
|
|
55
|
+
* import { getRequestContext } from '@vestig/next'
|
|
56
|
+
* import { VestigProvider } from '@vestig/next/client'
|
|
57
|
+
*
|
|
58
|
+
* export default async function RootLayout({ children }) {
|
|
59
|
+
* const ctx = await getRequestContext()
|
|
60
|
+
*
|
|
61
|
+
* return (
|
|
62
|
+
* <html>
|
|
63
|
+
* <body>
|
|
64
|
+
* <VestigProvider initialContext={ctx}>
|
|
65
|
+
* {children}
|
|
66
|
+
* </VestigProvider>
|
|
67
|
+
* </body>
|
|
68
|
+
* </html>
|
|
69
|
+
* )
|
|
70
|
+
* }
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare function getRequestContext(): Promise<LogContext>;
|
|
74
|
+
/**
|
|
75
|
+
* Create a child logger with additional context
|
|
76
|
+
*
|
|
77
|
+
* @param namespace - Logger namespace
|
|
78
|
+
* @param additionalContext - Additional context to merge
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* const log = await createChildLogger('users', { userId: user.id })
|
|
83
|
+
* log.info('Processing user') // Includes userId in all logs
|
|
84
|
+
* ```
|
|
85
|
+
*/
|
|
86
|
+
export declare function createChildLogger(namespace: string, additionalContext?: Record<string, unknown>): Promise<Logger>;
|
|
87
|
+
//# sourceMappingURL=server-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-component.d.ts","sourceRoot":"","sources":["../../src/server/server-component.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,UAAU,EACf,KAAK,QAAQ,EACb,KAAK,MAAM,EACX,KAAK,cAAc,EAGnB,MAAM,QAAQ,CAAA;AAGf,MAAM,WAAW,mBAAmB;IACnC,gBAAgB;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,6BAA6B;IAC7B,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gDAAgD;IAChD,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC;AAaD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAExE;AAsCD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,SAAS,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAGnE;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAsB,iBAAiB,IAAI,OAAO,CAAC,UAAU,CAAC,CAG7D;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CACtC,SAAS,EAAE,MAAM,EACjB,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACzC,OAAO,CAAC,MAAM,CAAC,CAGjB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { headers } from 'next/headers';
|
|
2
|
+
import { cache } from 'react';
|
|
3
|
+
import { createCorrelationContext, createLogger, } from 'vestig';
|
|
4
|
+
import { CORRELATION_HEADERS } from '../utils/headers';
|
|
5
|
+
const DEFAULT_OPTIONS = {
|
|
6
|
+
level: 'info',
|
|
7
|
+
enabled: true,
|
|
8
|
+
sanitize: 'default',
|
|
9
|
+
structured: true,
|
|
10
|
+
namespace: 'server',
|
|
11
|
+
};
|
|
12
|
+
// Store options at module level
|
|
13
|
+
let serverOptions = DEFAULT_OPTIONS;
|
|
14
|
+
/**
|
|
15
|
+
* Configure server-side logging options
|
|
16
|
+
* Call this once in your app initialization
|
|
17
|
+
*/
|
|
18
|
+
export function configureServerLogger(options) {
|
|
19
|
+
serverOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Get a request-scoped logger using React's cache
|
|
23
|
+
* This ensures the same logger instance is used for the entire request
|
|
24
|
+
*/
|
|
25
|
+
const getRequestLogger = cache(async () => {
|
|
26
|
+
const headersList = await headers();
|
|
27
|
+
// Extract correlation context from headers (set by proxy/middleware)
|
|
28
|
+
const requestId = headersList.get(CORRELATION_HEADERS.REQUEST_ID) ?? undefined;
|
|
29
|
+
const traceId = headersList.get(CORRELATION_HEADERS.TRACE_ID) ?? undefined;
|
|
30
|
+
const spanId = headersList.get(CORRELATION_HEADERS.SPAN_ID) ?? undefined;
|
|
31
|
+
// Create or use existing correlation context
|
|
32
|
+
const context = createCorrelationContext({ requestId, traceId, spanId });
|
|
33
|
+
// Create logger with full context
|
|
34
|
+
const logger = createLogger({
|
|
35
|
+
level: serverOptions.level,
|
|
36
|
+
enabled: serverOptions.enabled,
|
|
37
|
+
sanitize: serverOptions.sanitize,
|
|
38
|
+
structured: serverOptions.structured,
|
|
39
|
+
namespace: serverOptions.namespace,
|
|
40
|
+
context: {
|
|
41
|
+
...serverOptions.context,
|
|
42
|
+
...context,
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
return { logger, context };
|
|
46
|
+
});
|
|
47
|
+
/**
|
|
48
|
+
* Get a logger instance in Server Components
|
|
49
|
+
*
|
|
50
|
+
* Automatically includes request correlation context from the middleware.
|
|
51
|
+
* Uses React's cache() to ensure the same logger is used for the entire request.
|
|
52
|
+
*
|
|
53
|
+
* @param namespace - Optional namespace for the logger (e.g., 'users', 'auth')
|
|
54
|
+
*
|
|
55
|
+
* @example
|
|
56
|
+
* ```typescript
|
|
57
|
+
* // app/users/page.tsx
|
|
58
|
+
* import { getLogger } from '@vestig/next'
|
|
59
|
+
*
|
|
60
|
+
* export default async function UsersPage() {
|
|
61
|
+
* const log = await getLogger('users-page')
|
|
62
|
+
*
|
|
63
|
+
* log.info('Rendering users page')
|
|
64
|
+
*
|
|
65
|
+
* const users = await fetchUsers()
|
|
66
|
+
* log.debug('Users fetched', { count: users.length })
|
|
67
|
+
*
|
|
68
|
+
* return <UserList users={users} />
|
|
69
|
+
* }
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
export async function getLogger(namespace) {
|
|
73
|
+
const { logger } = await getRequestLogger();
|
|
74
|
+
return namespace ? logger.child(namespace) : logger;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Get the current request's correlation context in Server Components
|
|
78
|
+
*
|
|
79
|
+
* Useful for passing correlation IDs to client components or external services.
|
|
80
|
+
*
|
|
81
|
+
* @example
|
|
82
|
+
* ```typescript
|
|
83
|
+
* // app/layout.tsx
|
|
84
|
+
* import { getRequestContext } from '@vestig/next'
|
|
85
|
+
* import { VestigProvider } from '@vestig/next/client'
|
|
86
|
+
*
|
|
87
|
+
* export default async function RootLayout({ children }) {
|
|
88
|
+
* const ctx = await getRequestContext()
|
|
89
|
+
*
|
|
90
|
+
* return (
|
|
91
|
+
* <html>
|
|
92
|
+
* <body>
|
|
93
|
+
* <VestigProvider initialContext={ctx}>
|
|
94
|
+
* {children}
|
|
95
|
+
* </VestigProvider>
|
|
96
|
+
* </body>
|
|
97
|
+
* </html>
|
|
98
|
+
* )
|
|
99
|
+
* }
|
|
100
|
+
* ```
|
|
101
|
+
*/
|
|
102
|
+
export async function getRequestContext() {
|
|
103
|
+
const { context } = await getRequestLogger();
|
|
104
|
+
return context;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Create a child logger with additional context
|
|
108
|
+
*
|
|
109
|
+
* @param namespace - Logger namespace
|
|
110
|
+
* @param additionalContext - Additional context to merge
|
|
111
|
+
*
|
|
112
|
+
* @example
|
|
113
|
+
* ```typescript
|
|
114
|
+
* const log = await createChildLogger('users', { userId: user.id })
|
|
115
|
+
* log.info('Processing user') // Includes userId in all logs
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export async function createChildLogger(namespace, additionalContext) {
|
|
119
|
+
const { logger } = await getRequestLogger();
|
|
120
|
+
return logger.child(namespace, { context: additionalContext });
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=server-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"server-component.js","sourceRoot":"","sources":["../../src/server/server-component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AACtC,OAAO,EAAE,KAAK,EAAE,MAAM,OAAO,CAAA;AAC7B,OAAO,EAKN,wBAAwB,EACxB,YAAY,GACZ,MAAM,QAAQ,CAAA;AACf,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAA;AAiBtD,MAAM,eAAe,GAAwB;IAC5C,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,IAAI;IAChB,SAAS,EAAE,QAAQ;CACnB,CAAA;AAED,gCAAgC;AAChC,IAAI,aAAa,GAAwB,eAAe,CAAA;AAExD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,OAA4B;IACjE,aAAa,GAAG,EAAE,GAAG,eAAe,EAAE,GAAG,OAAO,EAAE,CAAA;AACnD,CAAC;AAOD;;;GAGG;AACH,MAAM,gBAAgB,GAAG,KAAK,CAAC,KAAK,IAAkC,EAAE;IACvE,MAAM,WAAW,GAAG,MAAM,OAAO,EAAE,CAAA;IAEnC,qEAAqE;IACrE,MAAM,SAAS,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,SAAS,CAAA;IAC9E,MAAM,OAAO,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,SAAS,CAAA;IAC1E,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,SAAS,CAAA;IAExE,6CAA6C;IAC7C,MAAM,OAAO,GAAG,wBAAwB,CAAC,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAExE,kCAAkC;IAClC,MAAM,MAAM,GAAG,YAAY,CAAC;QAC3B,KAAK,EAAE,aAAa,CAAC,KAAK;QAC1B,OAAO,EAAE,aAAa,CAAC,OAAO;QAC9B,QAAQ,EAAE,aAAa,CAAC,QAAQ;QAChC,UAAU,EAAE,aAAa,CAAC,UAAU;QACpC,SAAS,EAAE,aAAa,CAAC,SAAS;QAClC,OAAO,EAAE;YACR,GAAG,aAAa,CAAC,OAAO;YACxB,GAAG,OAAO;SACV;KACD,CAAC,CAAA;IAEF,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAA;AAC3B,CAAC,CAAC,CAAA;AAEF;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,SAAkB;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC3C,OAAO,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAA;AACpD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACtC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC5C,OAAO,OAAO,CAAA;AACf,CAAC;AAED;;;;;;;;;;;GAWG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACtC,SAAiB,EACjB,iBAA2C;IAE3C,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,gBAAgB,EAAE,CAAA;IAC3C,OAAO,MAAM,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,OAAO,EAAE,iBAAiB,EAAE,CAAC,CAAA;AAC/D,CAAC"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared types for @vestig/next
|
|
3
|
+
*/
|
|
4
|
+
import type { LogContext, LogEntry, LogLevel, LogMetadata, Logger, LoggerConfig, SanitizeConfig, SanitizePreset, Transport } from 'vestig';
|
|
5
|
+
export type { Logger, LoggerConfig, LogLevel, LogEntry, LogMetadata, LogContext, Transport, SanitizePreset, SanitizeConfig, };
|
|
6
|
+
export type { VestigNextConfig, VestigNextOptions, VestigNextMiddlewareConfig, VestigNextServerConfig, VestigNextClientConfig, VestigNextDevToolsConfig, } from './config';
|
|
7
|
+
/**
|
|
8
|
+
* Context provided to route handlers wrapped with withVestig
|
|
9
|
+
*/
|
|
10
|
+
export interface RouteHandlerContext {
|
|
11
|
+
/** Logger instance with request correlation */
|
|
12
|
+
log: Logger;
|
|
13
|
+
/** Correlation context (requestId, traceId, spanId) */
|
|
14
|
+
ctx: LogContext;
|
|
15
|
+
/** Route params from Next.js */
|
|
16
|
+
params: Record<string, string>;
|
|
17
|
+
/** Request timing utilities */
|
|
18
|
+
timing: {
|
|
19
|
+
/** Start time in ms */
|
|
20
|
+
start: number;
|
|
21
|
+
/** Get elapsed time in ms */
|
|
22
|
+
elapsed: () => number;
|
|
23
|
+
/** Mark a checkpoint */
|
|
24
|
+
mark: (name: string) => void;
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Route handler function type
|
|
29
|
+
*/
|
|
30
|
+
export type RouteHandler<T = Response> = (request: Request, context: RouteHandlerContext) => Promise<T> | T;
|
|
31
|
+
/**
|
|
32
|
+
* Options for withVestig wrapper
|
|
33
|
+
*/
|
|
34
|
+
export interface WithVestigOptions {
|
|
35
|
+
/** Logger namespace (e.g., 'api:users') */
|
|
36
|
+
namespace?: string;
|
|
37
|
+
/** Log incoming request (default: true) */
|
|
38
|
+
logRequest?: boolean;
|
|
39
|
+
/** Log outgoing response (default: true) */
|
|
40
|
+
logResponse?: boolean;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Context provided to server actions wrapped with vestigAction
|
|
44
|
+
*/
|
|
45
|
+
export interface ActionContext {
|
|
46
|
+
/** Logger instance with request correlation */
|
|
47
|
+
log: Logger;
|
|
48
|
+
/** Correlation context */
|
|
49
|
+
ctx: LogContext;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Server action function type
|
|
53
|
+
*/
|
|
54
|
+
export type ServerAction<TInput, TOutput> = (input: TInput, context: ActionContext) => Promise<TOutput>;
|
|
55
|
+
/**
|
|
56
|
+
* Options for vestigAction wrapper
|
|
57
|
+
*/
|
|
58
|
+
export interface VestigActionOptions {
|
|
59
|
+
/** Logger namespace */
|
|
60
|
+
namespace?: string;
|
|
61
|
+
/** Log input data (default: false for security) */
|
|
62
|
+
logInput?: boolean;
|
|
63
|
+
/** Log output data (default: false) */
|
|
64
|
+
logOutput?: boolean;
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Props for VestigProvider component
|
|
68
|
+
*/
|
|
69
|
+
export interface VestigProviderProps {
|
|
70
|
+
children: React.ReactNode;
|
|
71
|
+
/** Initial correlation context (e.g., from server) */
|
|
72
|
+
initialContext?: LogContext;
|
|
73
|
+
/** Override endpoint URL */
|
|
74
|
+
endpoint?: string;
|
|
75
|
+
/** Logger namespace */
|
|
76
|
+
namespace?: string;
|
|
77
|
+
/** Additional static context */
|
|
78
|
+
context?: Record<string, unknown>;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACX,UAAU,EACV,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,MAAM,EACN,YAAY,EACZ,cAAc,EACd,cAAc,EACd,SAAS,EACT,MAAM,QAAQ,CAAA;AAGf,YAAY,EACX,MAAM,EACN,YAAY,EACZ,QAAQ,EACR,QAAQ,EACR,WAAW,EACX,UAAU,EACV,SAAS,EACT,cAAc,EACd,cAAc,GACd,CAAA;AAGD,YAAY,EACX,gBAAgB,EAChB,iBAAiB,EACjB,0BAA0B,EAC1B,sBAAsB,EACtB,sBAAsB,EACtB,wBAAwB,GACxB,MAAM,UAAU,CAAA;AAEjB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,uDAAuD;IACvD,GAAG,EAAE,UAAU,CAAA;IACf,gCAAgC;IAChC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAC9B,+BAA+B;IAC/B,MAAM,EAAE;QACP,uBAAuB;QACvB,KAAK,EAAE,MAAM,CAAA;QACb,6BAA6B;QAC7B,OAAO,EAAE,MAAM,MAAM,CAAA;QACrB,wBAAwB;QACxB,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;KAC5B,CAAA;CACD;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,CAAC,GAAG,QAAQ,IAAI,CACxC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE,mBAAmB,KACxB,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAA;AAEnB;;GAEG;AACH,MAAM,WAAW,iBAAiB;IACjC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,4CAA4C;IAC5C,WAAW,CAAC,EAAE,OAAO,CAAA;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,+CAA+C;IAC/C,GAAG,EAAE,MAAM,CAAA;IACX,0BAA0B;IAC1B,GAAG,EAAE,UAAU,CAAA;CACf;AAED;;GAEG;AACH,MAAM,MAAM,YAAY,CAAC,MAAM,EAAE,OAAO,IAAI,CAC3C,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,aAAa,KAClB,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,mDAAmD;IACnD,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,uCAAuC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAA;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;IACzB,sDAAsD;IACtD,cAAc,CAAC,EAAE,UAAU,CAAA;IAC3B,4BAA4B;IAC5B,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,gCAAgC;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACjC"}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard correlation headers used by vestig
|
|
3
|
+
*/
|
|
4
|
+
export declare const CORRELATION_HEADERS: {
|
|
5
|
+
readonly REQUEST_ID: "x-request-id";
|
|
6
|
+
readonly TRACE_ID: "x-trace-id";
|
|
7
|
+
readonly SPAN_ID: "x-span-id";
|
|
8
|
+
readonly TRACEPARENT: "traceparent";
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Correlation context extracted from headers
|
|
12
|
+
*/
|
|
13
|
+
export interface CorrelationHeaders {
|
|
14
|
+
requestId?: string;
|
|
15
|
+
traceId?: string;
|
|
16
|
+
spanId?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Extract correlation headers from a Headers object
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractCorrelationHeaders(headers: Headers): CorrelationHeaders;
|
|
22
|
+
/**
|
|
23
|
+
* Set correlation headers on a Headers object
|
|
24
|
+
*/
|
|
25
|
+
export declare function setCorrelationHeaders(headers: Headers, context: {
|
|
26
|
+
requestId?: string;
|
|
27
|
+
traceId?: string;
|
|
28
|
+
spanId?: string;
|
|
29
|
+
}): void;
|
|
30
|
+
/**
|
|
31
|
+
* Create a new Headers object with correlation headers added
|
|
32
|
+
*/
|
|
33
|
+
export declare function withCorrelationHeaders(existingHeaders: Headers | Record<string, string>, context: {
|
|
34
|
+
requestId?: string;
|
|
35
|
+
traceId?: string;
|
|
36
|
+
spanId?: string;
|
|
37
|
+
}): Headers;
|
|
38
|
+
//# sourceMappingURL=headers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.d.ts","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,eAAO,MAAM,mBAAmB;;;;;CAKtB,CAAA;AAEV;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,MAAM,CAAC,EAAE,MAAM,CAAA;CACf;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CAAC,OAAO,EAAE,OAAO,GAAG,kBAAkB,CAM9E;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,OAAO,EAAE,OAAO,EAChB,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,IAAI,CAUN;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CACrC,eAAe,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EACjD,OAAO,EAAE;IAAE,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAChE,OAAO,CAIT"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Standard correlation headers used by vestig
|
|
3
|
+
*/
|
|
4
|
+
export const CORRELATION_HEADERS = {
|
|
5
|
+
REQUEST_ID: 'x-request-id',
|
|
6
|
+
TRACE_ID: 'x-trace-id',
|
|
7
|
+
SPAN_ID: 'x-span-id',
|
|
8
|
+
TRACEPARENT: 'traceparent',
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* Extract correlation headers from a Headers object
|
|
12
|
+
*/
|
|
13
|
+
export function extractCorrelationHeaders(headers) {
|
|
14
|
+
return {
|
|
15
|
+
requestId: headers.get(CORRELATION_HEADERS.REQUEST_ID) ?? undefined,
|
|
16
|
+
traceId: headers.get(CORRELATION_HEADERS.TRACE_ID) ?? undefined,
|
|
17
|
+
spanId: headers.get(CORRELATION_HEADERS.SPAN_ID) ?? undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Set correlation headers on a Headers object
|
|
22
|
+
*/
|
|
23
|
+
export function setCorrelationHeaders(headers, context) {
|
|
24
|
+
if (context.requestId) {
|
|
25
|
+
headers.set(CORRELATION_HEADERS.REQUEST_ID, context.requestId);
|
|
26
|
+
}
|
|
27
|
+
if (context.traceId) {
|
|
28
|
+
headers.set(CORRELATION_HEADERS.TRACE_ID, context.traceId);
|
|
29
|
+
}
|
|
30
|
+
if (context.spanId) {
|
|
31
|
+
headers.set(CORRELATION_HEADERS.SPAN_ID, context.spanId);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Create a new Headers object with correlation headers added
|
|
36
|
+
*/
|
|
37
|
+
export function withCorrelationHeaders(existingHeaders, context) {
|
|
38
|
+
const headers = new Headers(existingHeaders);
|
|
39
|
+
setCorrelationHeaders(headers, context);
|
|
40
|
+
return headers;
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=headers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"headers.js","sourceRoot":"","sources":["../../src/utils/headers.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IAClC,UAAU,EAAE,cAAc;IAC1B,QAAQ,EAAE,YAAY;IACtB,OAAO,EAAE,WAAW;IACpB,WAAW,EAAE,aAAa;CACjB,CAAA;AAWV;;GAEG;AACH,MAAM,UAAU,yBAAyB,CAAC,OAAgB;IACzD,OAAO;QACN,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,CAAC,IAAI,SAAS;QACnE,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,CAAC,IAAI,SAAS;QAC/D,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,CAAC,IAAI,SAAS;KAC7D,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,qBAAqB,CACpC,OAAgB,EAChB,OAAkE;IAElE,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,UAAU,EAAE,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/D,CAAC;IACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,QAAQ,EAAE,OAAO,CAAC,OAAO,CAAC,CAAA;IAC3D,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,MAAM,CAAC,CAAA;IACzD,CAAC;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB,CACrC,eAAiD,EACjD,OAAkE;IAElE,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,eAA8B,CAAC,CAAA;IAC3D,qBAAqB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IACvC,OAAO,OAAO,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,UAAU,CAAA;AACxB,cAAc,YAAY,CAAA"}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request metadata extraction utilities
|
|
3
|
+
*/
|
|
4
|
+
type NextRequest = Request & {
|
|
5
|
+
nextUrl?: URL;
|
|
6
|
+
ip?: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Metadata extracted from a request
|
|
10
|
+
*/
|
|
11
|
+
export interface RequestMetadata {
|
|
12
|
+
method: string;
|
|
13
|
+
path: string;
|
|
14
|
+
search?: string;
|
|
15
|
+
ip?: string;
|
|
16
|
+
userAgent?: string;
|
|
17
|
+
referer?: string;
|
|
18
|
+
contentType?: string;
|
|
19
|
+
contentLength?: number;
|
|
20
|
+
origin?: string;
|
|
21
|
+
host?: string;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Extract common metadata from a request
|
|
25
|
+
*/
|
|
26
|
+
export declare function extractRequestMetadata(request: NextRequest): RequestMetadata;
|
|
27
|
+
/**
|
|
28
|
+
* Metadata extracted from a response
|
|
29
|
+
*/
|
|
30
|
+
export interface ResponseMetadata {
|
|
31
|
+
status: number;
|
|
32
|
+
statusText: string;
|
|
33
|
+
contentType?: string;
|
|
34
|
+
contentLength?: number;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract common metadata from a response
|
|
38
|
+
*/
|
|
39
|
+
export declare function extractResponseMetadata(response: Response): ResponseMetadata;
|
|
40
|
+
export {};
|
|
41
|
+
//# sourceMappingURL=metadata.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,KAAK,WAAW,GAAG,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,GAAG,CAAC;IAAC,EAAE,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE3D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,IAAI,CAAC,EAAE,MAAM,CAAA;CACb;AAED;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,WAAW,GAAG,eAAe,CAe5E;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,MAAM,CAAA;IACd,UAAU,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,aAAa,CAAC,EAAE,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,QAAQ,GAAG,gBAAgB,CAO5E"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request metadata extraction utilities
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Extract common metadata from a request
|
|
6
|
+
*/
|
|
7
|
+
export function extractRequestMetadata(request) {
|
|
8
|
+
const url = request.nextUrl ?? new URL(request.url);
|
|
9
|
+
return {
|
|
10
|
+
method: request.method,
|
|
11
|
+
path: url.pathname,
|
|
12
|
+
search: url.search || undefined,
|
|
13
|
+
ip: request.headers.get('x-forwarded-for')?.split(',')[0]?.trim() ?? request.ip,
|
|
14
|
+
userAgent: truncate(request.headers.get('user-agent'), 200),
|
|
15
|
+
referer: request.headers.get('referer') ?? undefined,
|
|
16
|
+
contentType: request.headers.get('content-type') ?? undefined,
|
|
17
|
+
contentLength: parseContentLength(request.headers.get('content-length')),
|
|
18
|
+
origin: request.headers.get('origin') ?? undefined,
|
|
19
|
+
host: request.headers.get('host') ?? undefined,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Extract common metadata from a response
|
|
24
|
+
*/
|
|
25
|
+
export function extractResponseMetadata(response) {
|
|
26
|
+
return {
|
|
27
|
+
status: response.status,
|
|
28
|
+
statusText: response.statusText,
|
|
29
|
+
contentType: response.headers.get('content-type') ?? undefined,
|
|
30
|
+
contentLength: parseContentLength(response.headers.get('content-length')),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function truncate(value, maxLength) {
|
|
34
|
+
if (!value)
|
|
35
|
+
return undefined;
|
|
36
|
+
if (value.length <= maxLength)
|
|
37
|
+
return value;
|
|
38
|
+
return `${value.slice(0, maxLength)}...`;
|
|
39
|
+
}
|
|
40
|
+
function parseContentLength(value) {
|
|
41
|
+
if (!value)
|
|
42
|
+
return undefined;
|
|
43
|
+
const parsed = Number.parseInt(value, 10);
|
|
44
|
+
return Number.isNaN(parsed) ? undefined : parsed;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=metadata.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../src/utils/metadata.ts"],"names":[],"mappings":"AAAA;;GAEG;AAoBH;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,OAAoB;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;IAEnD,OAAO;QACN,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,IAAI,EAAE,GAAG,CAAC,QAAQ;QAClB,MAAM,EAAE,GAAG,CAAC,MAAM,IAAI,SAAS;QAC/B,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,EAAE;QAC/E,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,EAAE,GAAG,CAAC;QAC3D,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS;QACpD,WAAW,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS;QAC7D,aAAa,EAAE,kBAAkB,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QACxE,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,SAAS;QAClD,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS;KAC9C,CAAA;AACF,CAAC;AAYD;;GAEG;AACH,MAAM,UAAU,uBAAuB,CAAC,QAAkB;IACzD,OAAO;QACN,MAAM,EAAE,QAAQ,CAAC,MAAM;QACvB,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,IAAI,SAAS;QAC9D,aAAa,EAAE,kBAAkB,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;KACzE,CAAA;AACF,CAAC;AAED,SAAS,QAAQ,CAAC,KAAoB,EAAE,SAAiB;IACxD,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,IAAI,KAAK,CAAC,MAAM,IAAI,SAAS;QAAE,OAAO,KAAK,CAAA;IAC3C,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,CAAA;AACzC,CAAC;AAED,SAAS,kBAAkB,CAAC,KAAoB;IAC/C,IAAI,CAAC,KAAK;QAAE,OAAO,SAAS,CAAA;IAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAA;AACjD,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request timing utilities for measuring performance
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Timing context for request duration tracking
|
|
6
|
+
*/
|
|
7
|
+
export interface RequestTiming {
|
|
8
|
+
/** Start time in milliseconds */
|
|
9
|
+
start: number;
|
|
10
|
+
/** End time in milliseconds (set when completed) */
|
|
11
|
+
end?: number;
|
|
12
|
+
/** Get elapsed time in milliseconds */
|
|
13
|
+
elapsed: () => number;
|
|
14
|
+
/** Mark a named checkpoint */
|
|
15
|
+
mark: (name: string) => void;
|
|
16
|
+
/** Get a specific mark's elapsed time from start */
|
|
17
|
+
getMark: (name: string) => number | undefined;
|
|
18
|
+
/** Get all marks */
|
|
19
|
+
getMarks: () => Record<string, number>;
|
|
20
|
+
/** Complete timing (sets end time) */
|
|
21
|
+
complete: () => number;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Create a new request timing context
|
|
25
|
+
*/
|
|
26
|
+
export declare function createRequestTiming(): RequestTiming;
|
|
27
|
+
/**
|
|
28
|
+
* Format duration in human-readable format
|
|
29
|
+
*/
|
|
30
|
+
export declare function formatDuration(ms: number): string;
|
|
31
|
+
//# sourceMappingURL=timing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.d.ts","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,iCAAiC;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,oDAAoD;IACpD,GAAG,CAAC,EAAE,MAAM,CAAA;IACZ,uCAAuC;IACvC,OAAO,EAAE,MAAM,MAAM,CAAA;IACrB,8BAA8B;IAC9B,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAA;IAC5B,oDAAoD;IACpD,OAAO,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAA;IAC7C,oBAAoB;IACpB,QAAQ,EAAE,MAAM,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACtC,sCAAsC;IACtC,QAAQ,EAAE,MAAM,MAAM,CAAA;CACtB;AAED;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,aAAa,CA2BnD;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAQjD"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Request timing utilities for measuring performance
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Create a new request timing context
|
|
6
|
+
*/
|
|
7
|
+
export function createRequestTiming() {
|
|
8
|
+
const start = performance.now();
|
|
9
|
+
const marks = {};
|
|
10
|
+
let end;
|
|
11
|
+
return {
|
|
12
|
+
start,
|
|
13
|
+
get end() {
|
|
14
|
+
return end;
|
|
15
|
+
},
|
|
16
|
+
elapsed() {
|
|
17
|
+
return (end ?? performance.now()) - start;
|
|
18
|
+
},
|
|
19
|
+
mark(name) {
|
|
20
|
+
marks[name] = performance.now() - start;
|
|
21
|
+
},
|
|
22
|
+
getMark(name) {
|
|
23
|
+
return marks[name];
|
|
24
|
+
},
|
|
25
|
+
getMarks() {
|
|
26
|
+
return { ...marks };
|
|
27
|
+
},
|
|
28
|
+
complete() {
|
|
29
|
+
end = performance.now();
|
|
30
|
+
return end - start;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Format duration in human-readable format
|
|
36
|
+
*/
|
|
37
|
+
export function formatDuration(ms) {
|
|
38
|
+
if (ms < 1) {
|
|
39
|
+
return `${(ms * 1000).toFixed(0)}μs`;
|
|
40
|
+
}
|
|
41
|
+
if (ms < 1000) {
|
|
42
|
+
return `${ms.toFixed(2)}ms`;
|
|
43
|
+
}
|
|
44
|
+
return `${(ms / 1000).toFixed(2)}s`;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=timing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"timing.js","sourceRoot":"","sources":["../../src/utils/timing.ts"],"names":[],"mappings":"AAAA;;GAEG;AAsBH;;GAEG;AACH,MAAM,UAAU,mBAAmB;IAClC,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;IAC/B,MAAM,KAAK,GAA2B,EAAE,CAAA;IACxC,IAAI,GAAuB,CAAA;IAE3B,OAAO;QACN,KAAK;QACL,IAAI,GAAG;YACN,OAAO,GAAG,CAAA;QACX,CAAC;QACD,OAAO;YACN,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC,GAAG,EAAE,CAAC,GAAG,KAAK,CAAA;QAC1C,CAAC;QACD,IAAI,CAAC,IAAY;YAChB,KAAK,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,KAAK,CAAA;QACxC,CAAC;QACD,OAAO,CAAC,IAAY;YACnB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,CAAC;QACD,QAAQ;YACP,OAAO,EAAE,GAAG,KAAK,EAAE,CAAA;QACpB,CAAC;QACD,QAAQ;YACP,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE,CAAA;YACvB,OAAO,GAAG,GAAG,KAAK,CAAA;QACnB,CAAC;KACD,CAAA;AACF,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,EAAU;IACxC,IAAI,EAAE,GAAG,CAAC,EAAE,CAAC;QACZ,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IACrC,CAAC;IACD,IAAI,EAAE,GAAG,IAAI,EAAE,CAAC;QACf,OAAO,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;IAC5B,CAAC;IACD,OAAO,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAA;AACpC,CAAC"}
|