@loggerjs/processors 0.0.1 → 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/dist/index.js CHANGED
@@ -126,6 +126,58 @@ function contextProcessor(context) {
126
126
  });
127
127
  }
128
128
  //#endregion
129
+ //#region src/coalesce.ts
130
+ function attachCoalesced(event, field, key, state, updateMessage) {
131
+ if (state.count <= 1) return event;
132
+ const payload = {
133
+ key,
134
+ count: state.count,
135
+ firstSeen: state.firstSeen,
136
+ lastSeen: state.lastSeen
137
+ };
138
+ return {
139
+ ...event,
140
+ message: updateMessage ? `${event.message} (x${state.count})` : event.message,
141
+ data: event.data && typeof event.data === "object" && !Array.isArray(event.data) ? {
142
+ ...event.data,
143
+ [field]: payload
144
+ } : {
145
+ value: event.data,
146
+ [field]: payload
147
+ }
148
+ };
149
+ }
150
+ function coalesceProcessor(options = {}) {
151
+ const windowMs = options.windowMs ?? 1e3;
152
+ const maxEntries = options.maxEntries ?? 1e3;
153
+ const field = options.field ?? "coalesced";
154
+ const updateMessage = options.updateMessage ?? true;
155
+ const keyFor = options.key ?? ((event) => `${event.levelName}:${event.message}:${event.error?.message ?? ""}`);
156
+ const seen = /* @__PURE__ */ new Map();
157
+ return (event, context) => {
158
+ const now = context.now();
159
+ const key = keyFor(event);
160
+ const previous = seen.get(key);
161
+ if (previous && now - previous.lastSeen < windowMs) {
162
+ previous.count += 1;
163
+ previous.lastSeen = now;
164
+ incrementLoggerMetaCounter("processor.coalesce.suppressed");
165
+ return false;
166
+ }
167
+ const next = {
168
+ firstSeen: now,
169
+ lastSeen: now,
170
+ count: 1
171
+ };
172
+ seen.set(key, next);
173
+ if (seen.size > maxEntries) {
174
+ const cutoff = now - windowMs;
175
+ for (const [entryKey, state] of seen) if (state.lastSeen < cutoff || seen.size > maxEntries) seen.delete(entryKey);
176
+ }
177
+ return previous ? attachCoalesced(event, field, key, previous, updateMessage) : event;
178
+ };
179
+ }
180
+ //#endregion
129
181
  //#region src/dedupe.ts
130
182
  function dedupeProcessor(options = {}) {
131
183
  const windowMs = options.windowMs ?? 1e3;
@@ -824,7 +876,7 @@ function normalizeFrames(frames, options) {
824
876
  }
825
877
  return out;
826
878
  }
827
- function writeFrames(event, options, frames) {
879
+ function writeFrames$1(event, options, frames) {
828
880
  if (options.target === "context") return {
829
881
  ...event,
830
882
  context: {
@@ -857,7 +909,60 @@ function stackParserProcessor(options = {}) {
857
909
  const stack = event.error?.stack;
858
910
  if (!stack || normalized.maxFrames === 0) return event;
859
911
  const frames = normalizeFrames(normalized.parser(stack), normalized);
860
- return frames.length > 0 ? writeFrames(event, normalized, frames) : event;
912
+ return frames.length > 0 ? writeFrames$1(event, normalized, frames) : event;
913
+ };
914
+ }
915
+ //#endregion
916
+ //#region src/symbolicate-stack.ts
917
+ function frameListFromEvent(event, sourceKey) {
918
+ const existing = event.error?.[sourceKey];
919
+ if (Array.isArray(existing)) return existing;
920
+ const stack = event.error?.stack;
921
+ return stack ? parseStack(stack) : [];
922
+ }
923
+ function applySymbolication(frame, event, options) {
924
+ const original = options.symbolicate(frame, event);
925
+ if (!original) return frame;
926
+ if (options.mode === "replace") return {
927
+ ...original,
928
+ raw: frame.raw
929
+ };
930
+ return {
931
+ ...frame,
932
+ original
933
+ };
934
+ }
935
+ function writeFrames(event, target, key, frames) {
936
+ if (target === "context") return {
937
+ ...event,
938
+ context: {
939
+ ...event.context,
940
+ [key]: frames
941
+ }
942
+ };
943
+ return {
944
+ ...event,
945
+ error: {
946
+ message: event.error?.message ?? event.message,
947
+ ...event.error,
948
+ [key]: frames
949
+ }
950
+ };
951
+ }
952
+ function symbolicateStackProcessor(options) {
953
+ const maxFrames = Math.max(0, Math.floor(options.maxFrames ?? 20));
954
+ const sourceKey = options.sourceKey ?? "frames";
955
+ const target = options.target ?? "error";
956
+ const key = options.key ?? "symbolicatedFrames";
957
+ const mode = options.mode ?? "annotate";
958
+ return (event) => {
959
+ if (maxFrames === 0) return event;
960
+ const frames = frameListFromEvent(event, sourceKey).slice(0, maxFrames);
961
+ if (frames.length === 0) return event;
962
+ return writeFrames(event, target, key, frames.map((frame) => applySymbolication(frame, event, {
963
+ mode,
964
+ symbolicate: options.symbolicate
965
+ })));
861
966
  };
862
967
  }
863
968
  //#endregion
@@ -1323,6 +1428,6 @@ function breadcrumbBufferProcessor(options = {}) {
1323
1428
  return processor;
1324
1429
  }
1325
1430
  //#endregion
1326
- export { breadcrumbBufferProcessor as breadcrumbBuffer, breadcrumbBufferProcessor, contextProcessor as context, contextProcessor, contextMiddleware, contextMiddleware as contextMw, dedupeProcessor as dedupe, dedupeProcessor, dynamicSamplerProcessor as dynamicSampler, dynamicSamplerProcessor, enrichProcessor as enrich, enrichProcessor, enrichMiddleware, enrichMiddleware as enrichMw, filterProcessor as filter, filterProcessor, fingerprintProcessor as fingerprint, fingerprintProcessor, fingersCrossedProcessor as fingersCrossed, fingersCrossedProcessor, levelOverrideProcessor as levelOverride, levelOverrideProcessor, typeProcessor as logType, typeProcessor, typeMiddleware as logTypeMw, typeMiddleware, normalizeErrorProcessor as normalizeError, normalizeErrorProcessor, parseStack, privacyGuardProcessor as privacyGuard, privacyGuardProcessor, rateLimitProcessor as rateLimit, rateLimitProcessor, redactProcessor as redact, redactProcessor, routeProcessor as route, routeProcessor, sampleProcessor as sample, sampleProcessor, schemaDevCheckProcessor as schemaDevCheck, schemaDevCheckProcessor, stackParserProcessor as stackParser, stackParserProcessor, tagsProcessor as tags, tagsProcessor, tagsMiddleware, tagsMiddleware as tagsMw, traceContextProcessor as traceContext, traceContextProcessor, traceContextMiddleware, traceContextMiddleware as traceContextMw };
1431
+ export { breadcrumbBufferProcessor as breadcrumbBuffer, breadcrumbBufferProcessor, coalesceProcessor as coalesce, coalesceProcessor, contextProcessor as context, contextProcessor, contextMiddleware, contextMiddleware as contextMw, dedupeProcessor as dedupe, dedupeProcessor, dynamicSamplerProcessor as dynamicSampler, dynamicSamplerProcessor, enrichProcessor as enrich, enrichProcessor, enrichMiddleware, enrichMiddleware as enrichMw, filterProcessor as filter, filterProcessor, fingerprintProcessor as fingerprint, fingerprintProcessor, fingersCrossedProcessor as fingersCrossed, fingersCrossedProcessor, levelOverrideProcessor as levelOverride, levelOverrideProcessor, typeProcessor as logType, typeProcessor, typeMiddleware as logTypeMw, typeMiddleware, normalizeErrorProcessor as normalizeError, normalizeErrorProcessor, parseStack, privacyGuardProcessor as privacyGuard, privacyGuardProcessor, rateLimitProcessor as rateLimit, rateLimitProcessor, redactProcessor as redact, redactProcessor, routeProcessor as route, routeProcessor, sampleProcessor as sample, sampleProcessor, schemaDevCheckProcessor as schemaDevCheck, schemaDevCheckProcessor, stackParserProcessor as stackParser, stackParserProcessor, symbolicateStackProcessor as symbolicateStack, symbolicateStackProcessor, tagsProcessor as tags, tagsProcessor, tagsMiddleware, tagsMiddleware as tagsMw, traceContextProcessor as traceContext, traceContextProcessor, traceContextMiddleware, traceContextMiddleware as traceContextMw };
1327
1432
 
1328
1433
  //# sourceMappingURL=index.js.map