@vestig/next 0.20.0 → 0.22.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/wide-events/index.d.ts +1 -1
- package/dist/wide-events/index.d.ts.map +1 -1
- package/dist/wide-events/index.js +1 -1
- package/dist/wide-events/index.js.map +1 -1
- package/dist/wide-events/server-action.d.ts +86 -0
- package/dist/wide-events/server-action.d.ts.map +1 -1
- package/dist/wide-events/server-action.js +149 -0
- package/dist/wide-events/server-action.js.map +1 -1
- package/package.json +2 -2
|
@@ -57,7 +57,7 @@
|
|
|
57
57
|
export { getWideEvent, requireWideEvent, getWideEventElapsed, runWithWideEvent, runWithWideEventAsync, type WideEventRequestContext, } from './context';
|
|
58
58
|
export { createWideEventMiddleware, wideEventMiddleware, type WideEventMiddlewareOptions, } from './middleware';
|
|
59
59
|
export { setWideEventUser, setWideEventPerformance, setWideEventField, mergeWideEventFields, setWideEventFeatureFlags, setWideEventError, timeWideEventOperation, } from './helpers';
|
|
60
|
-
export { withWideEvent, createWideEventAction, type WideEventActionOptions, type WideEventActionContext, type WideEventServerAction, } from './server-action';
|
|
60
|
+
export { withWideEvent, withWideEventArgs, createWideEventAction, createWideEventActionWithArgs, type WideEventActionOptions, type WideEventActionContext, type WideEventServerAction, type WideEventServerActionWithArgs, } from './server-action';
|
|
61
61
|
export type { WideEvent, WideEventBuilder, WideEventConfig, WideEventContext, WideEventEndOptions, WideEventFields, WideEventStatus, TailSamplingConfig, } from 'vestig';
|
|
62
62
|
export { createWideEvent } from 'vestig';
|
|
63
63
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wide-events/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAGH,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,uBAAuB,GAC5B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACN,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,0BAA0B,GAC/B,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACN,aAAa,EACb,qBAAqB,EACrB,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/wide-events/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAGH,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,EACrB,KAAK,uBAAuB,GAC5B,MAAM,WAAW,CAAA;AAGlB,OAAO,EACN,yBAAyB,EACzB,mBAAmB,EACnB,KAAK,0BAA0B,GAC/B,MAAM,cAAc,CAAA;AAGrB,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,WAAW,CAAA;AAGlB,OAAO,EACN,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,EAC7B,KAAK,sBAAsB,EAC3B,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC1B,KAAK,6BAA6B,GAClC,MAAM,iBAAiB,CAAA;AAGxB,YAAY,EACX,SAAS,EACT,gBAAgB,EAChB,eAAe,EACf,gBAAgB,EAChB,mBAAmB,EACnB,eAAe,EACf,eAAe,EACf,kBAAkB,GAClB,MAAM,QAAQ,CAAA;AAGf,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -61,7 +61,7 @@ export { createWideEventMiddleware, wideEventMiddleware, } from './middleware';
|
|
|
61
61
|
// Helpers
|
|
62
62
|
export { setWideEventUser, setWideEventPerformance, setWideEventField, mergeWideEventFields, setWideEventFeatureFlags, setWideEventError, timeWideEventOperation, } from './helpers';
|
|
63
63
|
// Server Actions
|
|
64
|
-
export { withWideEvent, createWideEventAction, } from './server-action';
|
|
64
|
+
export { withWideEvent, withWideEventArgs, createWideEventAction, createWideEventActionWithArgs, } from './server-action';
|
|
65
65
|
// Re-export createWideEvent for advanced use cases
|
|
66
66
|
export { createWideEvent } from 'vestig';
|
|
67
67
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wide-events/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,oBAAoB;AACpB,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,WAAW,CAAA;AAElB,aAAa;AACb,OAAO,EACN,yBAAyB,EACzB,mBAAmB,GAEnB,MAAM,cAAc,CAAA;AAErB,UAAU;AACV,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,WAAW,CAAA;AAElB,iBAAiB;AACjB,OAAO,EACN,aAAa,EACb,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/wide-events/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuDG;AAEH,oBAAoB;AACpB,OAAO,EACN,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,gBAAgB,EAChB,qBAAqB,GAErB,MAAM,WAAW,CAAA;AAElB,aAAa;AACb,OAAO,EACN,yBAAyB,EACzB,mBAAmB,GAEnB,MAAM,cAAc,CAAA;AAErB,UAAU;AACV,OAAO,EACN,gBAAgB,EAChB,uBAAuB,EACvB,iBAAiB,EACjB,oBAAoB,EACpB,wBAAwB,EACxB,iBAAiB,EACjB,sBAAsB,GACtB,MAAM,WAAW,CAAA;AAElB,iBAAiB;AACjB,OAAO,EACN,aAAa,EACb,iBAAiB,EACjB,qBAAqB,EACrB,6BAA6B,GAK7B,MAAM,iBAAiB,CAAA;AAcxB,mDAAmD;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA"}
|
|
@@ -27,6 +27,13 @@ export interface WideEventActionContext {
|
|
|
27
27
|
* Server action handler type with wide event context
|
|
28
28
|
*/
|
|
29
29
|
export type WideEventServerAction<TInput, TResult> = (input: TInput, ctx: WideEventActionContext) => Promise<TResult>;
|
|
30
|
+
/**
|
|
31
|
+
* Server action handler type that preserves original argument signatures.
|
|
32
|
+
*
|
|
33
|
+
* The context is passed as the first argument, followed by the original arguments.
|
|
34
|
+
* This allows wrapping existing server actions without changing call sites.
|
|
35
|
+
*/
|
|
36
|
+
export type WideEventServerActionWithArgs<TArgs extends unknown[], TResult> = (ctx: WideEventActionContext, ...args: TArgs) => Promise<TResult>;
|
|
30
37
|
/**
|
|
31
38
|
* Wrap a server action with wide event tracking.
|
|
32
39
|
*
|
|
@@ -88,4 +95,83 @@ export declare function withWideEvent<TInput, TResult>(handler: WideEventServerA
|
|
|
88
95
|
* ```
|
|
89
96
|
*/
|
|
90
97
|
export declare function createWideEventAction(defaultOptions?: WideEventActionOptions): <TInput, TResult>(handler: WideEventServerAction<TInput, TResult>, options?: WideEventActionOptions) => ((input: TInput) => Promise<TResult>);
|
|
98
|
+
/**
|
|
99
|
+
* Wrap a server action with wide event tracking while preserving the original argument signature.
|
|
100
|
+
*
|
|
101
|
+
* Unlike `withWideEvent` which requires wrapping all arguments into a single input object,
|
|
102
|
+
* this function preserves the original function signature, making it ideal for incremental
|
|
103
|
+
* adoption in existing codebases.
|
|
104
|
+
*
|
|
105
|
+
* The context (with the event) is passed as the FIRST argument to the handler,
|
|
106
|
+
* followed by the original arguments. The returned function has the original signature.
|
|
107
|
+
*
|
|
108
|
+
* @example
|
|
109
|
+
* ```typescript
|
|
110
|
+
* // BEFORE: Original server action
|
|
111
|
+
* export async function updateUser(userId: string, name: string, email: string) {
|
|
112
|
+
* const user = await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
113
|
+
* return user
|
|
114
|
+
* }
|
|
115
|
+
*
|
|
116
|
+
* // AFTER: Wrapped with wide events - call sites DON'T change!
|
|
117
|
+
* export const updateUser = withWideEventArgs(
|
|
118
|
+
* async ({ event }, userId: string, name: string, email: string) => {
|
|
119
|
+
* event.set('user', 'id', userId)
|
|
120
|
+
* event.set('user', 'action', 'update')
|
|
121
|
+
*
|
|
122
|
+
* const user = await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
123
|
+
*
|
|
124
|
+
* event.set('user', 'updated', true)
|
|
125
|
+
* return user
|
|
126
|
+
* },
|
|
127
|
+
* { name: 'action.user.update' }
|
|
128
|
+
* )
|
|
129
|
+
*
|
|
130
|
+
* // Existing call sites remain unchanged:
|
|
131
|
+
* await updateUser('user-123', 'John Doe', 'john@example.com')
|
|
132
|
+
* ```
|
|
133
|
+
*
|
|
134
|
+
* @param handler - The server action handler with context as first argument
|
|
135
|
+
* @param options - Wide event options (name, level, etc.)
|
|
136
|
+
* @returns A function with the original argument signature
|
|
137
|
+
*/
|
|
138
|
+
export declare function withWideEventArgs<TArgs extends unknown[], TResult>(handler: WideEventServerActionWithArgs<TArgs, TResult>, options?: WideEventActionOptions): (...args: TArgs) => Promise<TResult>;
|
|
139
|
+
/**
|
|
140
|
+
* Create a factory for wide event server actions with preserved argument signatures.
|
|
141
|
+
*
|
|
142
|
+
* This is the factory version of `withWideEventArgs`, allowing you to share
|
|
143
|
+
* options across multiple actions while preserving their original signatures.
|
|
144
|
+
*
|
|
145
|
+
* @example
|
|
146
|
+
* ```typescript
|
|
147
|
+
* // app/actions/index.ts
|
|
148
|
+
* import { createWideEventActionWithArgs } from '@vestig/next/wide-events'
|
|
149
|
+
*
|
|
150
|
+
* const action = createWideEventActionWithArgs({
|
|
151
|
+
* tailSampling: { enabled: true, successSampleRate: 0.1 },
|
|
152
|
+
* })
|
|
153
|
+
*
|
|
154
|
+
* // Original signatures preserved - no need to change call sites!
|
|
155
|
+
* export const getUser = action(
|
|
156
|
+
* async ({ event }, userId: string) => {
|
|
157
|
+
* event.set('user', 'id', userId)
|
|
158
|
+
* return await db.users.findUnique({ where: { id: userId } })
|
|
159
|
+
* },
|
|
160
|
+
* { name: 'action.user.get' }
|
|
161
|
+
* )
|
|
162
|
+
*
|
|
163
|
+
* export const updateUser = action(
|
|
164
|
+
* async ({ event }, userId: string, name: string, email: string) => {
|
|
165
|
+
* event.set('user', 'id', userId)
|
|
166
|
+
* return await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
167
|
+
* },
|
|
168
|
+
* { name: 'action.user.update' }
|
|
169
|
+
* )
|
|
170
|
+
*
|
|
171
|
+
* // Call sites remain unchanged:
|
|
172
|
+
* await getUser('user-123')
|
|
173
|
+
* await updateUser('user-123', 'John', 'john@example.com')
|
|
174
|
+
* ```
|
|
175
|
+
*/
|
|
176
|
+
export declare function createWideEventActionWithArgs(defaultOptions?: WideEventActionOptions): <TArgs extends unknown[], TResult>(handler: WideEventServerActionWithArgs<TArgs, TResult>, options?: WideEventActionOptions) => ((...args: TArgs) => Promise<TResult>);
|
|
91
177
|
//# sourceMappingURL=server-action.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-action.d.ts","sourceRoot":"","sources":["../../src/wide-events/server-action.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAEb,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,eAAe,EACf,MAAM,QAAQ,CAAA;AAGf;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kCAAkC;IAClC,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAgCD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,6CAA6C;IAC7C,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,IAAI,CACpD,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,sBAAsB,KACvB,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAC5C,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,OAAO,GAAE,sBAA2B,GAClC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAmFrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,GAAE,sBAA2B,IACxE,MAAM,EAAE,OAAO,EACtB,SAAS,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,UAAS,sBAA2B,KAClC,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAExC"}
|
|
1
|
+
{"version":3,"file":"server-action.d.ts","sourceRoot":"","sources":["../../src/wide-events/server-action.ts"],"names":[],"mappings":"AAAA,OAAO,EACN,KAAK,QAAQ,EAEb,KAAK,cAAc,EACnB,KAAK,kBAAkB,EAEvB,eAAe,EACf,MAAM,QAAQ,CAAA;AAGf;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,uCAAuC;IACvC,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,gBAAgB;IAChB,KAAK,CAAC,EAAE,QAAQ,CAAA;IAChB,yCAAyC;IACzC,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,8BAA8B;IAC9B,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,iCAAiC;IACjC,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,kCAAkC;IAClC,YAAY,CAAC,EAAE,kBAAkB,CAAA;CACjC;AAgCD;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACtC,6CAA6C;IAC7C,KAAK,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CACzC;AAED;;GAEG;AACH,MAAM,MAAM,qBAAqB,CAAC,MAAM,EAAE,OAAO,IAAI,CACpD,KAAK,EAAE,MAAM,EACb,GAAG,EAAE,sBAAsB,KACvB,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;GAKG;AACH,MAAM,MAAM,6BAA6B,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,IAAI,CAC7E,GAAG,EAAE,sBAAsB,EAC3B,GAAG,IAAI,EAAE,KAAK,KACV,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,OAAO,EAC5C,OAAO,EAAE,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,OAAO,GAAE,sBAA2B,GAClC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAmFrC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,qBAAqB,CAAC,cAAc,GAAE,sBAA2B,IACxE,MAAM,EAAE,OAAO,EACtB,SAAS,qBAAqB,CAAC,MAAM,EAAE,OAAO,CAAC,EAC/C,UAAS,sBAA2B,KAClC,CAAC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAExC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACjE,OAAO,EAAE,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,EACtD,OAAO,GAAE,sBAA2B,GAClC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAmFtC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AACH,wBAAgB,6BAA6B,CAAC,cAAc,GAAE,sBAA2B,IAChF,KAAK,SAAS,OAAO,EAAE,EAAE,OAAO,EACvC,SAAS,6BAA6B,CAAC,KAAK,EAAE,OAAO,CAAC,EACtD,UAAS,sBAA2B,KAClC,CAAC,CAAC,GAAG,IAAI,EAAE,KAAK,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC,CAEzC"}
|
|
@@ -155,4 +155,153 @@ export function withWideEvent(handler, options = {}) {
|
|
|
155
155
|
export function createWideEventAction(defaultOptions = {}) {
|
|
156
156
|
return (handler, options = {}) => withWideEvent(handler, { ...defaultOptions, ...options });
|
|
157
157
|
}
|
|
158
|
+
/**
|
|
159
|
+
* Wrap a server action with wide event tracking while preserving the original argument signature.
|
|
160
|
+
*
|
|
161
|
+
* Unlike `withWideEvent` which requires wrapping all arguments into a single input object,
|
|
162
|
+
* this function preserves the original function signature, making it ideal for incremental
|
|
163
|
+
* adoption in existing codebases.
|
|
164
|
+
*
|
|
165
|
+
* The context (with the event) is passed as the FIRST argument to the handler,
|
|
166
|
+
* followed by the original arguments. The returned function has the original signature.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
* ```typescript
|
|
170
|
+
* // BEFORE: Original server action
|
|
171
|
+
* export async function updateUser(userId: string, name: string, email: string) {
|
|
172
|
+
* const user = await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
173
|
+
* return user
|
|
174
|
+
* }
|
|
175
|
+
*
|
|
176
|
+
* // AFTER: Wrapped with wide events - call sites DON'T change!
|
|
177
|
+
* export const updateUser = withWideEventArgs(
|
|
178
|
+
* async ({ event }, userId: string, name: string, email: string) => {
|
|
179
|
+
* event.set('user', 'id', userId)
|
|
180
|
+
* event.set('user', 'action', 'update')
|
|
181
|
+
*
|
|
182
|
+
* const user = await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
183
|
+
*
|
|
184
|
+
* event.set('user', 'updated', true)
|
|
185
|
+
* return user
|
|
186
|
+
* },
|
|
187
|
+
* { name: 'action.user.update' }
|
|
188
|
+
* )
|
|
189
|
+
*
|
|
190
|
+
* // Existing call sites remain unchanged:
|
|
191
|
+
* await updateUser('user-123', 'John Doe', 'john@example.com')
|
|
192
|
+
* ```
|
|
193
|
+
*
|
|
194
|
+
* @param handler - The server action handler with context as first argument
|
|
195
|
+
* @param options - Wide event options (name, level, etc.)
|
|
196
|
+
* @returns A function with the original argument signature
|
|
197
|
+
*/
|
|
198
|
+
export function withWideEventArgs(handler, options = {}) {
|
|
199
|
+
const mergedOptions = { ...DEFAULT_OPTIONS, ...options };
|
|
200
|
+
return async (...args) => {
|
|
201
|
+
const startTime = performance.now();
|
|
202
|
+
const logger = getOrCreateLogger(mergedOptions);
|
|
203
|
+
// Check if we're already in a wide event context
|
|
204
|
+
const existingEvent = getWideEvent();
|
|
205
|
+
if (existingEvent) {
|
|
206
|
+
// Enrich existing event with action context
|
|
207
|
+
const actionName = mergedOptions.name ?? 'server-action';
|
|
208
|
+
existingEvent.set('action', 'name', actionName);
|
|
209
|
+
existingEvent.set('action', 'start_ms', performance.now() - startTime);
|
|
210
|
+
try {
|
|
211
|
+
const result = await handler({ event: existingEvent }, ...args);
|
|
212
|
+
existingEvent.set('action', 'duration_ms', performance.now() - startTime);
|
|
213
|
+
existingEvent.set('action', 'status', 'success');
|
|
214
|
+
return result;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
existingEvent.set('action', 'duration_ms', performance.now() - startTime);
|
|
218
|
+
existingEvent.set('action', 'status', 'error');
|
|
219
|
+
existingEvent.merge('error', {
|
|
220
|
+
name: error instanceof Error ? error.name : 'Error',
|
|
221
|
+
message: error instanceof Error ? error.message : String(error),
|
|
222
|
+
});
|
|
223
|
+
throw error;
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
// Create new wide event for this action
|
|
227
|
+
const actionName = mergedOptions.name ?? 'server-action';
|
|
228
|
+
const event = createWideEvent({
|
|
229
|
+
type: actionName,
|
|
230
|
+
});
|
|
231
|
+
event.set('action', 'name', actionName);
|
|
232
|
+
const eventContext = {
|
|
233
|
+
event,
|
|
234
|
+
startTime,
|
|
235
|
+
};
|
|
236
|
+
return runWithWideEventAsync(eventContext, async () => {
|
|
237
|
+
try {
|
|
238
|
+
const result = await handler({ event }, ...args);
|
|
239
|
+
// Complete and emit the wide event
|
|
240
|
+
const duration = performance.now() - startTime;
|
|
241
|
+
event.set('performance', 'duration_ms', duration);
|
|
242
|
+
const completedEvent = event.end({
|
|
243
|
+
status: 'success',
|
|
244
|
+
level: 'info',
|
|
245
|
+
});
|
|
246
|
+
logger.emitWideEvent(completedEvent);
|
|
247
|
+
return result;
|
|
248
|
+
}
|
|
249
|
+
catch (error) {
|
|
250
|
+
const duration = performance.now() - startTime;
|
|
251
|
+
event.set('performance', 'duration_ms', duration);
|
|
252
|
+
event.merge('error', {
|
|
253
|
+
name: error instanceof Error ? error.name : 'Error',
|
|
254
|
+
message: error instanceof Error ? error.message : String(error),
|
|
255
|
+
});
|
|
256
|
+
const completedEvent = event.end({
|
|
257
|
+
status: 'error',
|
|
258
|
+
error: error instanceof Error ? error : new Error(String(error)),
|
|
259
|
+
level: 'error',
|
|
260
|
+
});
|
|
261
|
+
logger.emitWideEvent(completedEvent);
|
|
262
|
+
throw error;
|
|
263
|
+
}
|
|
264
|
+
});
|
|
265
|
+
};
|
|
266
|
+
}
|
|
267
|
+
/**
|
|
268
|
+
* Create a factory for wide event server actions with preserved argument signatures.
|
|
269
|
+
*
|
|
270
|
+
* This is the factory version of `withWideEventArgs`, allowing you to share
|
|
271
|
+
* options across multiple actions while preserving their original signatures.
|
|
272
|
+
*
|
|
273
|
+
* @example
|
|
274
|
+
* ```typescript
|
|
275
|
+
* // app/actions/index.ts
|
|
276
|
+
* import { createWideEventActionWithArgs } from '@vestig/next/wide-events'
|
|
277
|
+
*
|
|
278
|
+
* const action = createWideEventActionWithArgs({
|
|
279
|
+
* tailSampling: { enabled: true, successSampleRate: 0.1 },
|
|
280
|
+
* })
|
|
281
|
+
*
|
|
282
|
+
* // Original signatures preserved - no need to change call sites!
|
|
283
|
+
* export const getUser = action(
|
|
284
|
+
* async ({ event }, userId: string) => {
|
|
285
|
+
* event.set('user', 'id', userId)
|
|
286
|
+
* return await db.users.findUnique({ where: { id: userId } })
|
|
287
|
+
* },
|
|
288
|
+
* { name: 'action.user.get' }
|
|
289
|
+
* )
|
|
290
|
+
*
|
|
291
|
+
* export const updateUser = action(
|
|
292
|
+
* async ({ event }, userId: string, name: string, email: string) => {
|
|
293
|
+
* event.set('user', 'id', userId)
|
|
294
|
+
* return await db.users.update({ where: { id: userId }, data: { name, email } })
|
|
295
|
+
* },
|
|
296
|
+
* { name: 'action.user.update' }
|
|
297
|
+
* )
|
|
298
|
+
*
|
|
299
|
+
* // Call sites remain unchanged:
|
|
300
|
+
* await getUser('user-123')
|
|
301
|
+
* await updateUser('user-123', 'John', 'john@example.com')
|
|
302
|
+
* ```
|
|
303
|
+
*/
|
|
304
|
+
export function createWideEventActionWithArgs(defaultOptions = {}) {
|
|
305
|
+
return (handler, options = {}) => withWideEventArgs(handler, { ...defaultOptions, ...options });
|
|
306
|
+
}
|
|
158
307
|
//# sourceMappingURL=server-action.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server-action.js","sourceRoot":"","sources":["../../src/wide-events/server-action.ts"],"names":[],"mappings":"AAAA,OAAO,EAKN,YAAY,EACZ,eAAe,GACf,MAAM,QAAQ,CAAA;AACf,OAAO,EAAgC,YAAY,EAAE,qBAAqB,EAAE,MAAM,WAAW,CAAA;AAoB7F,MAAM,eAAe,GAA2B;IAC/C,KAAK,EAAE,MAAM;IACb,OAAO,EAAE,IAAI;IACb,QAAQ,EAAE,SAAS;IACnB,UAAU,EAAE,IAAI;CAChB,CAAA;AAED,gBAAgB;AAChB,IAAI,YAAY,GAAkB,IAAI,CAAA;AAEtC,SAAS,iBAAiB,CAAC,OAA+B;IACzD,IAAI,YAAY,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QACjD,OAAO,YAAY,CAAA;IACpB,CAAC;IAED,MAAM,MAAM,GAAG,YAAY,CAAC;QAC3B,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,YAAY,EAAE,OAAO,CAAC,YAAY;KAClC,CAAC,CAAA;IAEF,IAAI,OAAO,KAAK,eAAe,EAAE,CAAC;QACjC,YAAY,GAAG,MAAM,CAAA;IACtB,CAAC;IAED,OAAO,MAAM,CAAA;AACd,CAAC;
|
|
1
|
+
{"version":3,"file":"server-action.js","sourceRoot":"","sources":["../../src/wide-events/server-action.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vestig/next",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.22.0",
|
|
4
4
|
"description": "First-class Next.js 15+ integration for vestig logging library. Zero boilerplate, automatic request correlation, full type safety.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -106,7 +106,7 @@
|
|
|
106
106
|
"vestig": ">=0.2.0"
|
|
107
107
|
},
|
|
108
108
|
"dependencies": {
|
|
109
|
-
"vestig": "0.
|
|
109
|
+
"vestig": "0.22.0",
|
|
110
110
|
"web-vitals": "^4.2.4"
|
|
111
111
|
},
|
|
112
112
|
"devDependencies": {
|