trickle-observe 0.2.90 → 0.2.91

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/types.d.ts CHANGED
@@ -42,6 +42,7 @@ export interface IngestPayload {
42
42
  paramNames?: string[];
43
43
  sampleInput?: unknown;
44
44
  sampleOutput?: unknown;
45
+ durationMs?: number;
45
46
  error?: {
46
47
  type: string;
47
48
  message: string;
package/dist/wrap.js CHANGED
@@ -32,6 +32,7 @@ function wrapFunction(fn, opts) {
32
32
  let threwError = false;
33
33
  let caughtError;
34
34
  const trackers = [];
35
+ const startTime = performance.now();
35
36
  try {
36
37
  // Always pass ORIGINAL args to the function — never proxied ones.
37
38
  // Proxied args can break framework internals (Express Router, DI containers, etc.)
@@ -40,9 +41,10 @@ function wrapFunction(fn, opts) {
40
41
  catch (err) {
41
42
  threwError = true;
42
43
  caughtError = err;
43
- // Capture error context
44
+ // Capture error context with timing
44
45
  try {
45
- captureErrorPayload(functionKey, opts, args, trackers, err);
46
+ const durationMs = performance.now() - startTime;
47
+ captureErrorPayload(functionKey, opts, args, trackers, err, durationMs);
46
48
  }
47
49
  catch {
48
50
  // Never let our instrumentation interfere
@@ -54,7 +56,8 @@ function wrapFunction(fn, opts) {
54
56
  if (result !== null && result !== undefined && typeof result === 'object' && typeof result.then === 'function') {
55
57
  return result.then((resolved) => {
56
58
  try {
57
- capturePayload(functionKey, opts, args, trackers, resolved, true);
59
+ const durationMs = performance.now() - startTime;
60
+ capturePayload(functionKey, opts, args, trackers, resolved, true, durationMs);
58
61
  }
59
62
  catch {
60
63
  // Never let our instrumentation interfere
@@ -62,7 +65,8 @@ function wrapFunction(fn, opts) {
62
65
  return resolved;
63
66
  }, (err) => {
64
67
  try {
65
- captureErrorPayload(functionKey, opts, args, trackers, err);
68
+ const durationMs = performance.now() - startTime;
69
+ captureErrorPayload(functionKey, opts, args, trackers, err, durationMs);
66
70
  }
67
71
  catch {
68
72
  // Never let our instrumentation interfere
@@ -73,7 +77,8 @@ function wrapFunction(fn, opts) {
73
77
  }
74
78
  // Synchronous return
75
79
  try {
76
- capturePayload(functionKey, opts, args, trackers, result);
80
+ const durationMs = performance.now() - startTime;
81
+ capturePayload(functionKey, opts, args, trackers, result, false, durationMs);
77
82
  }
78
83
  catch {
79
84
  // Never let our instrumentation interfere
@@ -90,7 +95,7 @@ function wrapFunction(fn, opts) {
90
95
  /**
91
96
  * Capture and enqueue a successful invocation's type data.
92
97
  */
93
- function capturePayload(functionKey, opts, originalArgs, trackers, returnValue, isAsync = false) {
98
+ function capturePayload(functionKey, opts, originalArgs, trackers, returnValue, isAsync = false, durationMs) {
94
99
  // Build args type as a tuple
95
100
  const argsType = buildArgsType(originalArgs, trackers, opts.maxDepth);
96
101
  const returnType = (0, type_inference_1.inferType)(returnValue, opts.maxDepth);
@@ -117,12 +122,15 @@ function capturePayload(functionKey, opts, originalArgs, trackers, returnValue,
117
122
  if (opts.paramNames && opts.paramNames.length > 0) {
118
123
  payload.paramNames = opts.paramNames;
119
124
  }
125
+ if (durationMs !== undefined) {
126
+ payload.durationMs = Math.round(durationMs * 100) / 100;
127
+ }
120
128
  (0, transport_1.enqueue)(payload);
121
129
  }
122
130
  /**
123
131
  * Capture type context for a failed invocation.
124
132
  */
125
- function captureErrorPayload(functionKey, opts, originalArgs, trackers, error) {
133
+ function captureErrorPayload(functionKey, opts, originalArgs, trackers, error, durationMs) {
126
134
  const argsType = buildArgsType(originalArgs, trackers, opts.maxDepth);
127
135
  const returnType = { kind: 'unknown' };
128
136
  const hash = (0, type_hash_1.hashType)(argsType, returnType);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "trickle-observe",
3
- "version": "0.2.90",
3
+ "version": "0.2.91",
4
4
  "description": "Runtime type observability for JavaScript applications",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
package/src/types.ts CHANGED
@@ -22,6 +22,7 @@ export interface IngestPayload {
22
22
  paramNames?: string[];
23
23
  sampleInput?: unknown;
24
24
  sampleOutput?: unknown;
25
+ durationMs?: number;
25
26
  error?: {
26
27
  type: string;
27
28
  message: string;
package/src/wrap.ts CHANGED
@@ -34,6 +34,7 @@ export function wrapFunction<T extends (...args: any[]) => any>(fn: T, opts: Wra
34
34
  let threwError = false;
35
35
  let caughtError: unknown;
36
36
  const trackers: Array<{ proxy: unknown; getAccessedPaths: () => Map<string, TypeNode> }> = [];
37
+ const startTime = performance.now();
37
38
 
38
39
  try {
39
40
  // Always pass ORIGINAL args to the function — never proxied ones.
@@ -43,9 +44,10 @@ export function wrapFunction<T extends (...args: any[]) => any>(fn: T, opts: Wra
43
44
  threwError = true;
44
45
  caughtError = err;
45
46
 
46
- // Capture error context
47
+ // Capture error context with timing
47
48
  try {
48
- captureErrorPayload(functionKey, opts, args, trackers, err);
49
+ const durationMs = performance.now() - startTime;
50
+ captureErrorPayload(functionKey, opts, args, trackers, err, durationMs);
49
51
  } catch {
50
52
  // Never let our instrumentation interfere
51
53
  }
@@ -59,7 +61,8 @@ export function wrapFunction<T extends (...args: any[]) => any>(fn: T, opts: Wra
59
61
  return result.then(
60
62
  (resolved: unknown) => {
61
63
  try {
62
- capturePayload(functionKey, opts, args, trackers, resolved, true);
64
+ const durationMs = performance.now() - startTime;
65
+ capturePayload(functionKey, opts, args, trackers, resolved, true, durationMs);
63
66
  } catch {
64
67
  // Never let our instrumentation interfere
65
68
  }
@@ -67,7 +70,8 @@ export function wrapFunction<T extends (...args: any[]) => any>(fn: T, opts: Wra
67
70
  },
68
71
  (err: unknown) => {
69
72
  try {
70
- captureErrorPayload(functionKey, opts, args, trackers, err);
73
+ const durationMs = performance.now() - startTime;
74
+ captureErrorPayload(functionKey, opts, args, trackers, err, durationMs);
71
75
  } catch {
72
76
  // Never let our instrumentation interfere
73
77
  }
@@ -79,7 +83,8 @@ export function wrapFunction<T extends (...args: any[]) => any>(fn: T, opts: Wra
79
83
 
80
84
  // Synchronous return
81
85
  try {
82
- capturePayload(functionKey, opts, args, trackers, result);
86
+ const durationMs = performance.now() - startTime;
87
+ capturePayload(functionKey, opts, args, trackers, result, false, durationMs);
83
88
  } catch {
84
89
  // Never let our instrumentation interfere
85
90
  }
@@ -107,6 +112,7 @@ function capturePayload(
107
112
  trackers: Array<{ proxy: unknown; getAccessedPaths: () => Map<string, TypeNode> }>,
108
113
  returnValue: unknown,
109
114
  isAsync: boolean = false,
115
+ durationMs?: number,
110
116
  ): void {
111
117
  // Build args type as a tuple
112
118
  const argsType = buildArgsType(originalArgs, trackers, opts.maxDepth);
@@ -141,6 +147,10 @@ function capturePayload(
141
147
  payload.paramNames = opts.paramNames;
142
148
  }
143
149
 
150
+ if (durationMs !== undefined) {
151
+ payload.durationMs = Math.round(durationMs * 100) / 100;
152
+ }
153
+
144
154
  enqueue(payload);
145
155
  }
146
156
 
@@ -153,6 +163,7 @@ function captureErrorPayload(
153
163
  originalArgs: unknown[],
154
164
  trackers: Array<{ proxy: unknown; getAccessedPaths: () => Map<string, TypeNode> }>,
155
165
  error: unknown,
166
+ durationMs?: number,
156
167
  ): void {
157
168
  const argsType = buildArgsType(originalArgs, trackers, opts.maxDepth);
158
169
  const returnType: TypeNode = { kind: 'unknown' };