nugi-ts-logs-sdk 1.0.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.
Files changed (114) hide show
  1. package/README.md +218 -0
  2. package/dist/adapters/common.d.ts +43 -0
  3. package/dist/adapters/common.d.ts.map +1 -0
  4. package/dist/adapters/common.js +153 -0
  5. package/dist/adapters/common.js.map +1 -0
  6. package/dist/adapters/express.d.ts +29 -0
  7. package/dist/adapters/express.d.ts.map +1 -0
  8. package/dist/adapters/express.js +62 -0
  9. package/dist/adapters/express.js.map +1 -0
  10. package/dist/adapters/fastify.d.ts +18 -0
  11. package/dist/adapters/fastify.d.ts.map +1 -0
  12. package/dist/adapters/fastify.js +78 -0
  13. package/dist/adapters/fastify.js.map +1 -0
  14. package/dist/adapters/nestjs.d.ts +93 -0
  15. package/dist/adapters/nestjs.d.ts.map +1 -0
  16. package/dist/adapters/nestjs.js +310 -0
  17. package/dist/adapters/nestjs.js.map +1 -0
  18. package/dist/client.d.ts +66 -0
  19. package/dist/client.d.ts.map +1 -0
  20. package/dist/client.js +299 -0
  21. package/dist/client.js.map +1 -0
  22. package/dist/config.d.ts +116 -0
  23. package/dist/config.d.ts.map +1 -0
  24. package/dist/config.js +51 -0
  25. package/dist/config.js.map +1 -0
  26. package/dist/index.d.ts +32 -0
  27. package/dist/index.d.ts.map +1 -0
  28. package/dist/index.js +96 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/instrumentation/db-error.d.ts +27 -0
  31. package/dist/instrumentation/db-error.d.ts.map +1 -0
  32. package/dist/instrumentation/db-error.js +153 -0
  33. package/dist/instrumentation/db-error.js.map +1 -0
  34. package/dist/instrumentation/query-capture.d.ts +39 -0
  35. package/dist/instrumentation/query-capture.d.ts.map +1 -0
  36. package/dist/instrumentation/query-capture.js +359 -0
  37. package/dist/instrumentation/query-capture.js.map +1 -0
  38. package/dist/internal/breadcrumbs.d.ts +32 -0
  39. package/dist/internal/breadcrumbs.d.ts.map +1 -0
  40. package/dist/internal/breadcrumbs.js +31 -0
  41. package/dist/internal/breadcrumbs.js.map +1 -0
  42. package/dist/internal/console-capture.d.ts +31 -0
  43. package/dist/internal/console-capture.d.ts.map +1 -0
  44. package/dist/internal/console-capture.js +113 -0
  45. package/dist/internal/console-capture.js.map +1 -0
  46. package/dist/internal/context.d.ts +21 -0
  47. package/dist/internal/context.d.ts.map +1 -0
  48. package/dist/internal/context.js +42 -0
  49. package/dist/internal/context.js.map +1 -0
  50. package/dist/internal/diagnostics.d.ts +9 -0
  51. package/dist/internal/diagnostics.d.ts.map +1 -0
  52. package/dist/internal/diagnostics.js +43 -0
  53. package/dist/internal/diagnostics.js.map +1 -0
  54. package/dist/internal/http-utils.d.ts +16 -0
  55. package/dist/internal/http-utils.d.ts.map +1 -0
  56. package/dist/internal/http-utils.js +81 -0
  57. package/dist/internal/http-utils.js.map +1 -0
  58. package/dist/internal/ids.d.ts +9 -0
  59. package/dist/internal/ids.d.ts.map +1 -0
  60. package/dist/internal/ids.js +34 -0
  61. package/dist/internal/ids.js.map +1 -0
  62. package/dist/internal/metadata.d.ts +4 -0
  63. package/dist/internal/metadata.d.ts.map +1 -0
  64. package/dist/internal/metadata.js +151 -0
  65. package/dist/internal/metadata.js.map +1 -0
  66. package/dist/internal/propagation.d.ts +30 -0
  67. package/dist/internal/propagation.d.ts.map +1 -0
  68. package/dist/internal/propagation.js +99 -0
  69. package/dist/internal/propagation.js.map +1 -0
  70. package/dist/internal/sanitize.d.ts +11 -0
  71. package/dist/internal/sanitize.d.ts.map +1 -0
  72. package/dist/internal/sanitize.js +77 -0
  73. package/dist/internal/sanitize.js.map +1 -0
  74. package/dist/internal/stacktrace.d.ts +29 -0
  75. package/dist/internal/stacktrace.d.ts.map +1 -0
  76. package/dist/internal/stacktrace.js +182 -0
  77. package/dist/internal/stacktrace.js.map +1 -0
  78. package/dist/signals/checkins.d.ts +28 -0
  79. package/dist/signals/checkins.d.ts.map +1 -0
  80. package/dist/signals/checkins.js +76 -0
  81. package/dist/signals/checkins.js.map +1 -0
  82. package/dist/signals/logger.d.ts +26 -0
  83. package/dist/signals/logger.d.ts.map +1 -0
  84. package/dist/signals/logger.js +63 -0
  85. package/dist/signals/logger.js.map +1 -0
  86. package/dist/signals/metrics.d.ts +58 -0
  87. package/dist/signals/metrics.d.ts.map +1 -0
  88. package/dist/signals/metrics.js +166 -0
  89. package/dist/signals/metrics.js.map +1 -0
  90. package/dist/signals/tracer.d.ts +77 -0
  91. package/dist/signals/tracer.d.ts.map +1 -0
  92. package/dist/signals/tracer.js +210 -0
  93. package/dist/signals/tracer.js.map +1 -0
  94. package/dist/transport/batcher.d.ts +31 -0
  95. package/dist/transport/batcher.d.ts.map +1 -0
  96. package/dist/transport/batcher.js +129 -0
  97. package/dist/transport/batcher.js.map +1 -0
  98. package/dist/transport/legacy-logs.d.ts +21 -0
  99. package/dist/transport/legacy-logs.d.ts.map +1 -0
  100. package/dist/transport/legacy-logs.js +61 -0
  101. package/dist/transport/legacy-logs.js.map +1 -0
  102. package/dist/transport/retry.d.ts +16 -0
  103. package/dist/transport/retry.d.ts.map +1 -0
  104. package/dist/transport/retry.js +43 -0
  105. package/dist/transport/retry.js.map +1 -0
  106. package/dist/transport/transport.d.ts +14 -0
  107. package/dist/transport/transport.d.ts.map +1 -0
  108. package/dist/transport/transport.js +70 -0
  109. package/dist/transport/transport.js.map +1 -0
  110. package/dist/types.d.ts +136 -0
  111. package/dist/types.d.ts.map +1 -0
  112. package/dist/types.js +8 -0
  113. package/dist/types.js.map +1 -0
  114. package/package.json +56 -0
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ // Buffers telemetry events and ships them in batches. Responsibilities:
3
+ // - Buffering: bounded in-memory queue; oldest events dropped on overflow.
4
+ // - Batching: flush on size threshold or a periodic timer.
5
+ // - Retries: delegate to the transport's retry, re-buffer transient failures.
6
+ // - Backpressure/safety: a single in-flight flush; never throws to callers.
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.Batcher = void 0;
9
+ const transport_1 = require("./transport");
10
+ const retry_1 = require("./retry");
11
+ class Batcher {
12
+ constructor(config, resource, transport, diagnostics) {
13
+ this.config = config;
14
+ this.resource = resource;
15
+ this.transport = transport;
16
+ this.diagnostics = diagnostics;
17
+ this.buffer = [];
18
+ this.flushing = false;
19
+ this.droppedSinceLastFlush = 0;
20
+ this.closed = false;
21
+ this.timer = setInterval(() => {
22
+ void this.flush();
23
+ }, this.config.flushIntervalMs);
24
+ // Background flushing shouldn't keep the process alive on its own.
25
+ this.timer.unref?.();
26
+ }
27
+ /** Add an event to the buffer. Non-blocking; triggers a flush when full. */
28
+ enqueue(event) {
29
+ if (this.closed)
30
+ return;
31
+ this.buffer.push(event);
32
+ if (this.buffer.length > this.config.maxBufferSize) {
33
+ // Drop oldest to preserve the most recent signal under sustained overload.
34
+ const overflow = this.buffer.length - this.config.maxBufferSize;
35
+ this.buffer.splice(0, overflow);
36
+ this.droppedSinceLastFlush += overflow;
37
+ }
38
+ if (this.buffer.length >= this.config.batchSize) {
39
+ void this.flush();
40
+ }
41
+ }
42
+ /** Flush all currently buffered events. Never rejects. */
43
+ async flush() {
44
+ if (this.flushing)
45
+ return;
46
+ if (this.buffer.length === 0)
47
+ return;
48
+ this.flushing = true;
49
+ try {
50
+ if (this.droppedSinceLastFlush > 0) {
51
+ this.diagnostics.debug(`dropped ${this.droppedSinceLastFlush} events due to buffer overflow`);
52
+ this.droppedSinceLastFlush = 0;
53
+ }
54
+ // Drain in batch-sized chunks until the buffer is empty or a send fails
55
+ // permanently for this cycle.
56
+ while (this.buffer.length > 0) {
57
+ const batch = this.buffer.splice(0, this.config.batchSize);
58
+ const delivered = await this.deliver(batch);
59
+ if (!delivered)
60
+ break; // transient failure: stop; retry next interval
61
+ }
62
+ }
63
+ catch (error) {
64
+ this.diagnostics.error('unexpected flush failure', error);
65
+ }
66
+ finally {
67
+ this.flushing = false;
68
+ }
69
+ }
70
+ /**
71
+ * Attempt to deliver one batch with retries. Returns true on success.
72
+ * On a transient failure the batch is re-buffered (front) for a later cycle;
73
+ * on a fatal failure (e.g. 401/400) the batch is dropped.
74
+ */
75
+ async deliver(batch) {
76
+ if (!this.transport.enabled) {
77
+ // No endpoint configured — surface locally only, don't accumulate forever.
78
+ return true;
79
+ }
80
+ const envelope = {
81
+ resource: this.resource,
82
+ events: batch,
83
+ sentAt: new Date().toISOString(),
84
+ };
85
+ try {
86
+ await (0, retry_1.withRetry)(() => this.transport.send(envelope), {
87
+ maxRetries: this.config.maxRetries,
88
+ baseDelayMs: this.config.retryBaseDelayMs,
89
+ maxDelayMs: this.config.retryMaxDelayMs,
90
+ isRetryable: (e) => e instanceof transport_1.TransportError ? e.retryable : true,
91
+ onRetry: (attempt, delayMs, error) => this.diagnostics.debug(`retrying batch (attempt ${attempt}, delay ${delayMs}ms)`, error?.message),
92
+ });
93
+ return true;
94
+ }
95
+ catch (error) {
96
+ const transient = error instanceof transport_1.TransportError ? error.retryable : true;
97
+ if (transient && !this.closed) {
98
+ // Re-buffer at the front, then re-apply the overflow cap.
99
+ this.buffer.unshift(...batch);
100
+ if (this.buffer.length > this.config.maxBufferSize) {
101
+ const overflow = this.buffer.length - this.config.maxBufferSize;
102
+ this.buffer.splice(0, overflow);
103
+ this.droppedSinceLastFlush += overflow;
104
+ }
105
+ this.diagnostics.error('batch delivery failed; will retry', error);
106
+ }
107
+ else {
108
+ this.diagnostics.error(`dropping ${batch.length} events (non-retryable delivery failure)`, error);
109
+ }
110
+ return false;
111
+ }
112
+ }
113
+ /** Stop the timer and flush remaining events. Idempotent. */
114
+ async shutdown() {
115
+ if (this.timer) {
116
+ clearInterval(this.timer);
117
+ this.timer = undefined;
118
+ }
119
+ // Final drain (allow re-buffering to be skipped by marking closed after).
120
+ await this.flush();
121
+ this.closed = true;
122
+ }
123
+ /** Current number of buffered events (for tests/diagnostics). */
124
+ get size() {
125
+ return this.buffer.length;
126
+ }
127
+ }
128
+ exports.Batcher = Batcher;
129
+ //# sourceMappingURL=batcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"batcher.js","sourceRoot":"","sources":["../../src/transport/batcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Fire-and-forget POST to the legacy single-event `/api/v1/logs` endpoint.
3
+ * Used for DB query events (and any other Nest-SDK-compatible shapes) so data
4
+ * lands in the same Influx measurements as nugi-logs-sdk.
5
+ */
6
+ export interface LegacyLogsTransportOptions {
7
+ endpoint?: string;
8
+ apiKey: string;
9
+ requestTimeoutMs?: number;
10
+ onError?: (error: Error) => void;
11
+ }
12
+ export declare function resolveLogsUrl(endpoint?: string): string | undefined;
13
+ export declare class LegacyLogsTransport {
14
+ private readonly options;
15
+ private readonly url?;
16
+ private readonly timeoutMs;
17
+ constructor(options: LegacyLogsTransportOptions);
18
+ post(body: Record<string, unknown>): void;
19
+ private send;
20
+ }
21
+ //# sourceMappingURL=legacy-logs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-logs.d.ts","sourceRoot":"","sources":["../../src/transport/legacy-logs.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,MAAM,WAAW,0BAA0B;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC;CAClC;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMpE;AAED,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAHpC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;gBAEN,OAAO,EAAE,0BAA0B;IAKhE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;YAI3B,IAAI;CA4BnB"}
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ /**
3
+ * Fire-and-forget POST to the legacy single-event `/api/v1/logs` endpoint.
4
+ * Used for DB query events (and any other Nest-SDK-compatible shapes) so data
5
+ * lands in the same Influx measurements as nugi-logs-sdk.
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.LegacyLogsTransport = void 0;
9
+ exports.resolveLogsUrl = resolveLogsUrl;
10
+ function resolveLogsUrl(endpoint) {
11
+ if (!endpoint)
12
+ return undefined;
13
+ const cleaned = endpoint.replace(/\/$/, '');
14
+ if (/\/logs\/?$/i.test(cleaned))
15
+ return cleaned;
16
+ if (/\/api\/v1$/i.test(cleaned))
17
+ return `${cleaned}/logs`;
18
+ return `${cleaned}/api/v1/logs`;
19
+ }
20
+ class LegacyLogsTransport {
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.url = resolveLogsUrl(options.endpoint);
24
+ this.timeoutMs = options.requestTimeoutMs ?? 5000;
25
+ }
26
+ post(body) {
27
+ void this.send(body);
28
+ }
29
+ async send(body) {
30
+ try {
31
+ if (!this.url)
32
+ return;
33
+ const controller = new AbortController();
34
+ const timer = setTimeout(() => controller.abort(), this.timeoutMs);
35
+ try {
36
+ await fetch(this.url, {
37
+ method: 'POST',
38
+ headers: {
39
+ 'Content-Type': 'application/json',
40
+ 'X-API-Key': this.options.apiKey,
41
+ },
42
+ body: JSON.stringify(body),
43
+ signal: controller.signal,
44
+ });
45
+ }
46
+ finally {
47
+ clearTimeout(timer);
48
+ }
49
+ }
50
+ catch (err) {
51
+ try {
52
+ this.options.onError?.(err instanceof Error ? err : new Error(String(err)));
53
+ }
54
+ catch {
55
+ /* ignore */
56
+ }
57
+ }
58
+ }
59
+ }
60
+ exports.LegacyLogsTransport = LegacyLogsTransport;
61
+ //# sourceMappingURL=legacy-logs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"legacy-logs.js","sourceRoot":"","sources":["../../src/transport/legacy-logs.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AASH,wCAMC;AAND,SAAgB,cAAc,CAAC,QAAiB;IAC9C,IAAI,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAC;IAChC,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC;QAAE,OAAO,GAAG,OAAO,OAAO,CAAC;IAC1D,OAAO,GAAG,OAAO,cAAc,CAAC;AAClC,CAAC;AAED,MAAa,mBAAmB;IAI9B,YAA6B,OAAmC;QAAnC,YAAO,GAAP,OAAO,CAA4B;QAC9D,IAAI,CAAC,GAAG,GAAG,cAAc,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACpD,CAAC;IAED,IAAI,CAAC,IAA6B;QAChC,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,IAA6B;QAC9C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,GAAG;gBAAE,OAAO;YACtB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;YACnE,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE;oBACpB,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;qBACjC;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;oBAC1B,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC;gBACH,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,CACpB,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CACpD,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,YAAY;YACd,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAzCD,kDAyCC"}
@@ -0,0 +1,16 @@
1
+ export interface RetryOptions {
2
+ maxRetries: number;
3
+ baseDelayMs: number;
4
+ maxDelayMs: number;
5
+ isRetryable: (error: unknown) => boolean;
6
+ onRetry?: (attempt: number, delayMs: number, error: unknown) => void;
7
+ }
8
+ export declare function sleep(ms: number): Promise<void>;
9
+ /** Compute a backoff delay with full jitter for a given attempt (0-based). */
10
+ export declare function backoffDelay(attempt: number, baseDelayMs: number, maxDelayMs: number): number;
11
+ /**
12
+ * Run `fn`, retrying on retryable errors up to `maxRetries` additional attempts.
13
+ * Rejects with the last error when retries are exhausted or the error is fatal.
14
+ */
15
+ export declare function withRetry<T>(fn: () => Promise<T>, opts: RetryOptions): Promise<T>;
16
+ //# sourceMappingURL=retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.d.ts","sourceRoot":"","sources":["../../src/transport/retry.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,YAAY;IAC3B,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC;IACzC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,IAAI,CAAC;CACtE;AAED,wBAAgB,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO/C;AAED,8EAA8E;AAC9E,wBAAgB,YAAY,CAC1B,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,GACjB,MAAM,CAIR;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,CAAC,EAC/B,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,IAAI,EAAE,YAAY,GACjB,OAAO,CAAC,CAAC,CAAC,CAgBZ"}
@@ -0,0 +1,43 @@
1
+ "use strict";
2
+ // Exponential backoff with full jitter, used to retry failed flushes.
3
+ Object.defineProperty(exports, "__esModule", { value: true });
4
+ exports.sleep = sleep;
5
+ exports.backoffDelay = backoffDelay;
6
+ exports.withRetry = withRetry;
7
+ function sleep(ms) {
8
+ // Not unref'd on purpose: a backoff is awaited by an in-flight flush (often an
9
+ // explicit flush()/shutdown()), so it must keep the event loop alive until it
10
+ // resolves. The idle/periodic timer in the batcher is what gets unref'd.
11
+ return new Promise((resolve) => {
12
+ setTimeout(resolve, ms);
13
+ });
14
+ }
15
+ /** Compute a backoff delay with full jitter for a given attempt (0-based). */
16
+ function backoffDelay(attempt, baseDelayMs, maxDelayMs) {
17
+ const exponential = Math.min(maxDelayMs, baseDelayMs * 2 ** attempt);
18
+ // Full jitter: random in [0, exponential].
19
+ return Math.floor(Math.random() * exponential);
20
+ }
21
+ /**
22
+ * Run `fn`, retrying on retryable errors up to `maxRetries` additional attempts.
23
+ * Rejects with the last error when retries are exhausted or the error is fatal.
24
+ */
25
+ async function withRetry(fn, opts) {
26
+ let attempt = 0;
27
+ // eslint-disable-next-line no-constant-condition
28
+ while (true) {
29
+ try {
30
+ return await fn();
31
+ }
32
+ catch (error) {
33
+ if (attempt >= opts.maxRetries || !opts.isRetryable(error)) {
34
+ throw error;
35
+ }
36
+ const delay = backoffDelay(attempt, opts.baseDelayMs, opts.maxDelayMs);
37
+ opts.onRetry?.(attempt + 1, delay, error);
38
+ await sleep(delay);
39
+ attempt++;
40
+ }
41
+ }
42
+ }
43
+ //# sourceMappingURL=retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"retry.js","sourceRoot":"","sources":["../../src/transport/retry.ts"],"names":[],"mappings":";AAAA,sEAAsE;;AAUtE,sBAOC;AAGD,oCAQC;AAMD,8BAmBC;AA3CD,SAAgB,KAAK,CAAC,EAAU;IAC9B,+EAA+E;IAC/E,8EAA8E;IAC9E,yEAAyE;IACzE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;AACL,CAAC;AAED,8EAA8E;AAC9E,SAAgB,YAAY,CAC1B,OAAe,EACf,WAAmB,EACnB,UAAkB;IAElB,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC;IACrE,2CAA2C;IAC3C,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,WAAW,CAAC,CAAC;AACjD,CAAC;AAED;;;GAGG;AACI,KAAK,UAAU,SAAS,CAC7B,EAAoB,EACpB,IAAkB;IAElB,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,iDAAiD;IACjD,OAAO,IAAI,EAAE,CAAC;QACZ,IAAI,CAAC;YACH,OAAO,MAAM,EAAE,EAAE,CAAC;QACpB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3D,MAAM,KAAK,CAAC;YACd,CAAC;YACD,MAAM,KAAK,GAAG,YAAY,CAAC,OAAO,EAAE,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,CAAC,OAAO,EAAE,CAAC,OAAO,GAAG,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YAC1C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;IACH,CAAC;AACH,CAAC"}
@@ -0,0 +1,14 @@
1
+ import { EventEnvelope } from '../types';
2
+ import { ResolvedConfig } from '../config';
3
+ export declare class TransportError extends Error {
4
+ readonly retryable: boolean;
5
+ readonly status?: number | undefined;
6
+ constructor(message: string, retryable: boolean, status?: number | undefined);
7
+ }
8
+ export interface Transport {
9
+ send(envelope: EventEnvelope): Promise<void>;
10
+ /** Whether the transport can actually deliver (endpoint configured, fetch available). */
11
+ readonly enabled: boolean;
12
+ }
13
+ export declare function createHttpTransport(config: ResolvedConfig): Transport;
14
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAE3C,qBAAa,cAAe,SAAQ,KAAK;IAGrC,QAAQ,CAAC,SAAS,EAAE,OAAO;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM;gBAFxB,OAAO,EAAE,MAAM,EACN,SAAS,EAAE,OAAO,EAClB,MAAM,CAAC,EAAE,MAAM,YAAA;CAK3B;AASD,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,QAAQ,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7C,yFAAyF;IACzF,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;CAC3B;AAED,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,cAAc,GAAG,SAAS,CA4DrE"}
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ // HTTP transport. Dependency-free: uses the global fetch/AbortController present
3
+ // in Node 18+ (and modern runtimes/edge). Retryability is classified so the
4
+ // batcher can decide whether to re-buffer a failed batch.
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.TransportError = void 0;
7
+ exports.createHttpTransport = createHttpTransport;
8
+ class TransportError extends Error {
9
+ constructor(message, retryable, status) {
10
+ super(message);
11
+ this.retryable = retryable;
12
+ this.status = status;
13
+ this.name = 'TransportError';
14
+ }
15
+ }
16
+ exports.TransportError = TransportError;
17
+ function createHttpTransport(config) {
18
+ const url = config.endpoint
19
+ ? joinUrl(config.endpoint, config.ingestPath)
20
+ : undefined;
21
+ // A configured endpoint means we intend to deliver; fetch is resolved lazily
22
+ // at send time so polyfilled/late-bound fetch implementations still work.
23
+ const enabled = !!url;
24
+ return {
25
+ enabled,
26
+ async send(envelope) {
27
+ const fetchFn = globalThis.fetch;
28
+ if (!url || typeof fetchFn !== 'function') {
29
+ // No endpoint / no fetch available: nothing to deliver to. Not retryable.
30
+ return;
31
+ }
32
+ const controller = new AbortController();
33
+ const timer = setTimeout(() => controller.abort(), config.requestTimeoutMs);
34
+ timer.unref?.();
35
+ let response;
36
+ try {
37
+ response = await fetchFn(url, {
38
+ method: 'POST',
39
+ headers: {
40
+ 'Content-Type': 'application/json',
41
+ 'X-API-Key': config.apiKey,
42
+ 'User-Agent': `nugi-ts-logs-sdk/${envelope.resource.host.sdkVersion}`,
43
+ },
44
+ body: JSON.stringify(envelope),
45
+ signal: controller.signal,
46
+ });
47
+ }
48
+ catch (error) {
49
+ // Network error / timeout / abort — retryable.
50
+ throw new TransportError(`network error: ${error?.message ?? error}`, true);
51
+ }
52
+ finally {
53
+ clearTimeout(timer);
54
+ }
55
+ if (response.ok)
56
+ return;
57
+ // 408/429 and 5xx are transient; other 4xx are fatal (bad request/auth).
58
+ const retryable = response.status === 408 ||
59
+ response.status === 429 ||
60
+ response.status >= 500;
61
+ throw new TransportError(`HTTP ${response.status} ${response.statusText}`, retryable, response.status);
62
+ },
63
+ };
64
+ }
65
+ function joinUrl(base, path) {
66
+ const b = base.replace(/\/+$/, '');
67
+ const p = path.replace(/^\/+/, '');
68
+ return `${b}/${p}`;
69
+ }
70
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport/transport.ts"],"names":[],"mappings":";AAAA,iFAAiF;AACjF,4EAA4E;AAC5E,0DAA0D;;;AA6B1D,kDA4DC;AApFD,MAAa,cAAe,SAAQ,KAAK;IACvC,YACE,OAAe,EACN,SAAkB,EAClB,MAAe;QAExB,KAAK,CAAC,OAAO,CAAC,CAAC;QAHN,cAAS,GAAT,SAAS,CAAS;QAClB,WAAM,GAAN,MAAM,CAAS;QAGxB,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AATD,wCASC;AAeD,SAAgB,mBAAmB,CAAC,MAAsB;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ;QACzB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC;QAC7C,CAAC,CAAC,SAAS,CAAC;IACd,6EAA6E;IAC7E,0EAA0E;IAC1E,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,CAAC;IAEtB,OAAO;QACL,OAAO;QACP,KAAK,CAAC,IAAI,CAAC,QAAuB;YAChC,MAAM,OAAO,GAAI,UAAkC,CAAC,KAAK,CAAC;YAC1D,IAAI,CAAC,GAAG,IAAI,OAAO,OAAO,KAAK,UAAU,EAAE,CAAC;gBAC1C,0EAA0E;gBAC1E,OAAO;YACT,CAAC;YAED,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;YACzC,MAAM,KAAK,GAAG,UAAU,CACtB,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EACxB,MAAM,CAAC,gBAAgB,CACxB,CAAC;YACF,KAAK,CAAC,KAAK,EAAE,EAAE,CAAC;YAEhB,IAAI,QAAQ,CAAC;YACb,IAAI,CAAC;gBACH,QAAQ,GAAG,MAAM,OAAO,CAAC,GAAG,EAAE;oBAC5B,MAAM,EAAE,MAAM;oBACd,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,WAAW,EAAE,MAAM,CAAC,MAAM;wBAC1B,YAAY,EAAE,oBAAoB,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE;qBACtE;oBACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;oBAC9B,MAAM,EAAE,UAAU,CAAC,MAAM;iBAC1B,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,+CAA+C;gBAC/C,MAAM,IAAI,cAAc,CACtB,kBAAmB,KAAe,EAAE,OAAO,IAAI,KAAK,EAAE,EACtD,IAAI,CACL,CAAC;YACJ,CAAC;oBAAS,CAAC;gBACT,YAAY,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;YAED,IAAI,QAAQ,CAAC,EAAE;gBAAE,OAAO;YAExB,yEAAyE;YACzE,MAAM,SAAS,GACb,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,MAAM,KAAK,GAAG;gBACvB,QAAQ,CAAC,MAAM,IAAI,GAAG,CAAC;YACzB,MAAM,IAAI,cAAc,CACtB,QAAQ,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,EAChD,SAAS,EACT,QAAQ,CAAC,MAAM,CAChB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,OAAO,CAAC,IAAY,EAAE,IAAY;IACzC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACnC,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AACrB,CAAC"}
@@ -0,0 +1,136 @@
1
+ export type Severity = 'debug' | 'info' | 'warn' | 'error' | 'fatal';
2
+ export type MetricType = 'counter' | 'gauge' | 'histogram';
3
+ export type SpanKind = 'server' | 'client' | 'internal' | 'producer' | 'consumer';
4
+ export type SpanStatus = 'unset' | 'ok' | 'error';
5
+ export type Attributes = Record<string, unknown>;
6
+ export interface StackFrame {
7
+ filename: string;
8
+ absPath?: string;
9
+ function: string;
10
+ lineno?: number;
11
+ colno?: number;
12
+ inApp: boolean;
13
+ contextLine?: string;
14
+ preContext?: string[];
15
+ postContext?: string[];
16
+ module?: string;
17
+ raw?: string;
18
+ }
19
+ export interface HostMetadata {
20
+ hostname: string;
21
+ serverIp: string;
22
+ /** All resolved non-internal server IPs. */
23
+ serverIps?: {
24
+ ipv4: string[];
25
+ ipv6: string[];
26
+ };
27
+ sdkVersion: string;
28
+ nodeVersion: string;
29
+ os: string;
30
+ pid: number;
31
+ }
32
+ export interface RuntimeMetadata {
33
+ memoryUsage: {
34
+ rss: number;
35
+ heapUsed: number;
36
+ heapTotal: number;
37
+ external: number;
38
+ };
39
+ cpuUsage: {
40
+ percent: number;
41
+ user: number;
42
+ system: number;
43
+ };
44
+ }
45
+ /** Immutable descriptor of the service emitting telemetry. */
46
+ export interface Resource {
47
+ appId: string;
48
+ serviceName: string;
49
+ environment: string;
50
+ /** Deploy / release version (low cardinality). */
51
+ release?: string;
52
+ host: HostMetadata;
53
+ }
54
+ export interface BaseEvent {
55
+ /** ISO-8601 wall-clock time the event was recorded. */
56
+ timestamp: string;
57
+ traceId?: string;
58
+ spanId?: string;
59
+ attributes?: Attributes;
60
+ }
61
+ export interface LogEvent extends BaseEvent {
62
+ kind: 'log';
63
+ level: Severity;
64
+ message: string;
65
+ }
66
+ export interface MetricEvent extends BaseEvent {
67
+ kind: 'metric';
68
+ name: string;
69
+ type: MetricType;
70
+ value: number;
71
+ unit?: string;
72
+ }
73
+ export interface SpanEventEntry {
74
+ name: string;
75
+ timestamp: string;
76
+ attributes?: Attributes;
77
+ }
78
+ export interface SpanEvent extends BaseEvent {
79
+ kind: 'span';
80
+ traceId: string;
81
+ spanId: string;
82
+ parentSpanId?: string;
83
+ name: string;
84
+ spanKind: SpanKind;
85
+ startTime: string;
86
+ endTime: string;
87
+ durationMs: number;
88
+ status: SpanStatus;
89
+ statusMessage?: string;
90
+ events?: SpanEventEntry[];
91
+ /** Per-call runtime snapshot (memory/CPU) when available. */
92
+ runtime?: RuntimeMetadata;
93
+ }
94
+ export interface Breadcrumb {
95
+ timestamp: string;
96
+ type: string;
97
+ level: Severity;
98
+ message: string;
99
+ data?: Attributes;
100
+ }
101
+ export interface ErrorEvent extends BaseEvent {
102
+ kind: 'error';
103
+ name: string;
104
+ message: string;
105
+ stack?: string;
106
+ /** Sentry-style structured frames with optional source context. */
107
+ frames?: StackFrame[];
108
+ code?: string | number;
109
+ /** false when the error was uncaught / crashed a request. */
110
+ handled: boolean;
111
+ /** How the error was captured, e.g. 'auto.node.uncaughtException'. */
112
+ mechanism?: string;
113
+ /** Trail of events (console/logs/http) captured before the error. */
114
+ breadcrumbs?: Breadcrumb[];
115
+ runtime?: RuntimeMetadata;
116
+ }
117
+ /** Database query timing event (also dual-written to legacy /logs when configured). */
118
+ export interface QueryEvent extends BaseEvent {
119
+ kind: 'query';
120
+ query: string;
121
+ durationMs: number;
122
+ orm?: string;
123
+ success?: boolean;
124
+ slow?: boolean;
125
+ error?: string;
126
+ requestId?: string;
127
+ release?: string;
128
+ }
129
+ export type TelemetryEvent = LogEvent | MetricEvent | SpanEvent | ErrorEvent | QueryEvent;
130
+ /** A batch of events sharing one Resource — the transport payload. */
131
+ export interface EventEnvelope {
132
+ resource: Resource;
133
+ events: TelemetryEvent[];
134
+ sentAt: string;
135
+ }
136
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js ADDED
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ // ---------------------------------------------------------------------------
3
+ // Shared telemetry model. Every signal (log, metric, span, error) is normalised
4
+ // into a TelemetryEvent and shipped inside an EventEnvelope that also carries the
5
+ // immutable Resource describing the emitting service/host.
6
+ // ---------------------------------------------------------------------------
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";AAAA,8EAA8E;AAC9E,gFAAgF;AAChF,kFAAkF;AAClF,2DAA2D;AAC3D,8EAA8E"}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "nugi-ts-logs-sdk",
3
+ "version": "1.0.0",
4
+ "description": "Framework-agnostic TypeScript observability SDK (logs, metrics, traces, queries, check-ins, distributed tracing) with batching, retries and buffering. Works with Express, Fastify, NestJS and plain Node.",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "scripts": {
8
+ "build": "tsc",
9
+ "prepare": "npm run build",
10
+ "prepublishOnly": "npm run build",
11
+ "test": "echo \"Error: no test specified\" && exit 1"
12
+ },
13
+ "keywords": [
14
+ "observability",
15
+ "logging",
16
+ "metrics",
17
+ "tracing",
18
+ "distributed-tracing",
19
+ "telemetry",
20
+ "express",
21
+ "fastify",
22
+ "nestjs",
23
+ "opentelemetry",
24
+ "sql",
25
+ "database"
26
+ ],
27
+ "author": "Agbama Achu-ulim Akem",
28
+ "license": "MIT",
29
+ "engines": {
30
+ "node": ">=16"
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "README.md"
35
+ ],
36
+ "dependencies": {},
37
+ "devDependencies": {
38
+ "@nestjs/common": "^10.0.0",
39
+ "@types/node": "^20.0.0",
40
+ "reflect-metadata": "^0.1.13",
41
+ "rxjs": "^7.8.0",
42
+ "typescript": "^5.0.0"
43
+ },
44
+ "peerDependencies": {
45
+ "@nestjs/common": "^9.0.0 || ^10.0.0 || ^11.0.0",
46
+ "rxjs": "^7.0.0"
47
+ },
48
+ "peerDependenciesMeta": {
49
+ "@nestjs/common": {
50
+ "optional": true
51
+ },
52
+ "rxjs": {
53
+ "optional": true
54
+ }
55
+ }
56
+ }