@muhammetgoktug/ek-sentry 0.1.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.
Files changed (93) hide show
  1. package/dist/core/client.d.ts +59 -0
  2. package/dist/core/client.d.ts.map +1 -0
  3. package/dist/core/client.js +156 -0
  4. package/dist/core/client.js.map +1 -0
  5. package/dist/core/index.d.ts +7 -0
  6. package/dist/core/index.d.ts.map +1 -0
  7. package/dist/core/index.js +5 -0
  8. package/dist/core/index.js.map +1 -0
  9. package/dist/core/scope.d.ts +14 -0
  10. package/dist/core/scope.d.ts.map +1 -0
  11. package/dist/core/scope.js +32 -0
  12. package/dist/core/scope.js.map +1 -0
  13. package/dist/core/singleton.d.ts +26 -0
  14. package/dist/core/singleton.d.ts.map +1 -0
  15. package/dist/core/singleton.js +50 -0
  16. package/dist/core/singleton.js.map +1 -0
  17. package/dist/core/transport.d.ts +18 -0
  18. package/dist/core/transport.d.ts.map +1 -0
  19. package/dist/core/transport.js +60 -0
  20. package/dist/core/transport.js.map +1 -0
  21. package/dist/core/uuid.d.ts +4 -0
  22. package/dist/core/uuid.d.ts.map +1 -0
  23. package/dist/core/uuid.js +12 -0
  24. package/dist/core/uuid.js.map +1 -0
  25. package/dist/index.d.ts +12 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +13 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/nextjs/client.d.ts +6 -0
  30. package/dist/nextjs/client.d.ts.map +1 -0
  31. package/dist/nextjs/client.js +16 -0
  32. package/dist/nextjs/client.js.map +1 -0
  33. package/dist/nextjs/server.d.ts +16 -0
  34. package/dist/nextjs/server.d.ts.map +1 -0
  35. package/dist/nextjs/server.js +25 -0
  36. package/dist/nextjs/server.js.map +1 -0
  37. package/dist/node/express.d.ts +21 -0
  38. package/dist/node/express.d.ts.map +1 -0
  39. package/dist/node/express.js +47 -0
  40. package/dist/node/express.js.map +1 -0
  41. package/dist/node/handlers.d.ts +4 -0
  42. package/dist/node/handlers.d.ts.map +1 -0
  43. package/dist/node/handlers.js +13 -0
  44. package/dist/node/handlers.js.map +1 -0
  45. package/dist/node/index.d.ts +10 -0
  46. package/dist/node/index.d.ts.map +1 -0
  47. package/dist/node/index.js +21 -0
  48. package/dist/node/index.js.map +1 -0
  49. package/dist/react-native.d.ts +6 -0
  50. package/dist/react-native.d.ts.map +1 -0
  51. package/dist/react-native.js +17 -0
  52. package/dist/react-native.js.map +1 -0
  53. package/dist/react.d.ts +17 -0
  54. package/dist/react.d.ts.map +1 -0
  55. package/dist/react.js +21 -0
  56. package/dist/react.js.map +1 -0
  57. package/dist/schemas/common.d.ts +16 -0
  58. package/dist/schemas/common.d.ts.map +1 -0
  59. package/dist/schemas/common.js +2 -0
  60. package/dist/schemas/common.js.map +1 -0
  61. package/dist/schemas/dsn.d.ts +15 -0
  62. package/dist/schemas/dsn.d.ts.map +1 -0
  63. package/dist/schemas/dsn.js +32 -0
  64. package/dist/schemas/dsn.js.map +1 -0
  65. package/dist/schemas/envelope.d.ts +21 -0
  66. package/dist/schemas/envelope.d.ts.map +1 -0
  67. package/dist/schemas/envelope.js +2 -0
  68. package/dist/schemas/envelope.js.map +1 -0
  69. package/dist/schemas/error.d.ts +56 -0
  70. package/dist/schemas/error.d.ts.map +1 -0
  71. package/dist/schemas/error.js +2 -0
  72. package/dist/schemas/error.js.map +1 -0
  73. package/dist/schemas/index.d.ts +8 -0
  74. package/dist/schemas/index.d.ts.map +1 -0
  75. package/dist/schemas/index.js +8 -0
  76. package/dist/schemas/index.js.map +1 -0
  77. package/dist/schemas/log.d.ts +16 -0
  78. package/dist/schemas/log.d.ts.map +1 -0
  79. package/dist/schemas/log.js +2 -0
  80. package/dist/schemas/log.js.map +1 -0
  81. package/dist/schemas/simple.d.ts +205 -0
  82. package/dist/schemas/simple.d.ts.map +1 -0
  83. package/dist/schemas/simple.js +125 -0
  84. package/dist/schemas/simple.js.map +1 -0
  85. package/dist/schemas/span.d.ts +21 -0
  86. package/dist/schemas/span.d.ts.map +1 -0
  87. package/dist/schemas/span.js +2 -0
  88. package/dist/schemas/span.js.map +1 -0
  89. package/dist/schemas/stacktrace.d.ts +9 -0
  90. package/dist/schemas/stacktrace.d.ts.map +1 -0
  91. package/dist/schemas/stacktrace.js +40 -0
  92. package/dist/schemas/stacktrace.js.map +1 -0
  93. package/package.json +83 -0
@@ -0,0 +1,59 @@
1
+ import { type Breadcrumb, type ErrorEvent, type Level, type LogEntry, type Platform, type SdkInfo, type SpanEvent, type User } from "../schemas/index.js";
2
+ import { Scope } from "./scope.js";
3
+ export interface ClientOptions {
4
+ dsn: string;
5
+ environment?: string;
6
+ release?: string;
7
+ serverName?: string;
8
+ platform?: Platform;
9
+ sdk?: SdkInfo;
10
+ /** Flush when this many items are buffered. */
11
+ maxBatchSize?: number;
12
+ /** Periodic flush interval (ms). */
13
+ flushIntervalMs?: number;
14
+ /** Span sampling rate, 0..1. */
15
+ tracesSampleRate?: number;
16
+ /** Mutate or drop (return null) an error event before sending. */
17
+ beforeSend?: (event: ErrorEvent) => ErrorEvent | null;
18
+ maxRetries?: number;
19
+ debug?: boolean;
20
+ }
21
+ /** Holds config, scope and transport; builds and buffers events for batched delivery. */
22
+ export declare class Client {
23
+ private readonly options;
24
+ readonly scope: Scope;
25
+ private readonly transport;
26
+ private readonly sdk;
27
+ private readonly platform;
28
+ private readonly environment;
29
+ private readonly publicKey;
30
+ private buffer;
31
+ private timer;
32
+ constructor(options: ClientOptions);
33
+ captureException(error: unknown, hint?: {
34
+ level?: Level;
35
+ tags?: Record<string, string>;
36
+ extra?: Record<string, unknown>;
37
+ }): string;
38
+ captureMessage(message: string, level?: Level, hint?: {
39
+ tags?: Record<string, string>;
40
+ extra?: Record<string, unknown>;
41
+ }): string;
42
+ captureLog(entry: Omit<LogEntry, "sdk" | "environment" | "timestamp"> & {
43
+ timestamp?: number;
44
+ environment?: string;
45
+ }): void;
46
+ captureSpan(span: Omit<SpanEvent, "sdk" | "environment"> & {
47
+ environment?: string;
48
+ }): void;
49
+ addBreadcrumb(crumb: Breadcrumb): void;
50
+ setUser(user: User | undefined): void;
51
+ setTag(key: string, value: string): void;
52
+ setExtra(key: string, value: unknown): void;
53
+ private dispatchError;
54
+ private enqueue;
55
+ private ensureTimer;
56
+ flush(): Promise<void>;
57
+ close(): Promise<void>;
58
+ }
59
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,156 @@
1
+ import { parseDsn, } from "../schemas/index.js";
2
+ import { Scope } from "./scope.js";
3
+ import { parseStackTrace } from "../schemas/stacktrace.js";
4
+ import { Transport } from "./transport.js";
5
+ import { randomUuid } from "./uuid.js";
6
+ const DEFAULT_SDK = { name: "@muhammetgoktug/ek-sentry", version: "0.1.1" };
7
+ function exceptionsFromError(error) {
8
+ const chain = [];
9
+ let current = error;
10
+ const seen = new Set();
11
+ while (current instanceof Error && !seen.has(current)) {
12
+ seen.add(current);
13
+ chain.push({
14
+ type: current.name || "Error",
15
+ value: current.message || "",
16
+ frames: parseStackTrace(current),
17
+ });
18
+ current = current.cause;
19
+ }
20
+ return chain;
21
+ }
22
+ /** Holds config, scope and transport; builds and buffers events for batched delivery. */
23
+ export class Client {
24
+ options;
25
+ scope = new Scope();
26
+ transport;
27
+ sdk;
28
+ platform;
29
+ environment;
30
+ publicKey;
31
+ buffer = [];
32
+ timer;
33
+ constructor(options) {
34
+ this.options = options;
35
+ const dsn = parseDsn(options.dsn);
36
+ this.publicKey = dsn.publicKey;
37
+ this.sdk = options.sdk ?? DEFAULT_SDK;
38
+ this.platform = options.platform ?? "node";
39
+ this.environment = options.environment ?? "production";
40
+ this.transport = new Transport(dsn.ingestUrl, dsn.publicKey, {
41
+ maxRetries: options.maxRetries,
42
+ debug: options.debug,
43
+ });
44
+ }
45
+ captureException(error, hint) {
46
+ const err = error instanceof Error ? error : new Error(typeof error === "string" ? error : JSON.stringify(error));
47
+ const exception = exceptionsFromError(err);
48
+ return this.dispatchError({
49
+ level: hint?.level ?? "error",
50
+ exception,
51
+ message: exception[0]?.value,
52
+ tags: hint?.tags,
53
+ extra: hint?.extra,
54
+ });
55
+ }
56
+ captureMessage(message, level = "info", hint) {
57
+ return this.dispatchError({ level, message, tags: hint?.tags, extra: hint?.extra });
58
+ }
59
+ captureLog(entry) {
60
+ const payload = {
61
+ timestamp: entry.timestamp ?? Date.now(),
62
+ level: entry.level,
63
+ message: entry.message,
64
+ logger: entry.logger,
65
+ environment: entry.environment ?? this.environment,
66
+ release: entry.release ?? this.options.release,
67
+ trace_id: entry.trace_id,
68
+ span_id: entry.span_id,
69
+ attributes: entry.attributes ?? {},
70
+ sdk: this.sdk,
71
+ };
72
+ this.enqueue({ type: "log", payload });
73
+ }
74
+ captureSpan(span) {
75
+ const rate = this.options.tracesSampleRate ?? 1;
76
+ if (rate < 1 && Math.random() > rate)
77
+ return;
78
+ const payload = {
79
+ ...span,
80
+ environment: span.environment ?? this.environment,
81
+ release: span.release ?? this.options.release,
82
+ sdk: this.sdk,
83
+ };
84
+ this.enqueue({ type: "span", payload });
85
+ }
86
+ addBreadcrumb(crumb) {
87
+ this.scope.addBreadcrumb(crumb);
88
+ }
89
+ setUser(user) {
90
+ this.scope.setUser(user);
91
+ }
92
+ setTag(key, value) {
93
+ this.scope.setTag(key, value);
94
+ }
95
+ setExtra(key, value) {
96
+ this.scope.setExtra(key, value);
97
+ }
98
+ dispatchError(input) {
99
+ const event_id = randomUuid();
100
+ let payload = {
101
+ event_id,
102
+ timestamp: Date.now(),
103
+ level: input.level,
104
+ platform: this.platform,
105
+ environment: this.environment,
106
+ release: this.options.release,
107
+ server_name: this.options.serverName,
108
+ message: input.message,
109
+ exception: input.exception,
110
+ tags: { ...this.scope.tags, ...input.tags },
111
+ extra: { ...this.scope.extra, ...input.extra },
112
+ user: this.scope.user,
113
+ breadcrumbs: [...this.scope.breadcrumbs],
114
+ sdk: this.sdk,
115
+ };
116
+ if (this.options.beforeSend) {
117
+ const result = this.options.beforeSend(payload);
118
+ if (!result)
119
+ return event_id;
120
+ payload = result;
121
+ }
122
+ this.enqueue({ type: "error", payload });
123
+ return event_id;
124
+ }
125
+ enqueue(item) {
126
+ this.buffer.push(item);
127
+ if (this.buffer.length >= (this.options.maxBatchSize ?? 50)) {
128
+ void this.flush();
129
+ }
130
+ else {
131
+ this.ensureTimer();
132
+ }
133
+ }
134
+ ensureTimer() {
135
+ if (this.timer)
136
+ return;
137
+ this.timer = setInterval(() => void this.flush(), this.options.flushIntervalMs ?? 3000);
138
+ if (typeof this.timer.unref === "function")
139
+ this.timer.unref();
140
+ }
141
+ async flush() {
142
+ if (this.buffer.length === 0)
143
+ return;
144
+ const items = this.buffer;
145
+ this.buffer = [];
146
+ await this.transport.send(items, this.sdk);
147
+ }
148
+ async close() {
149
+ if (this.timer) {
150
+ clearInterval(this.timer);
151
+ this.timer = undefined;
152
+ }
153
+ await this.flush();
154
+ }
155
+ }
156
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/core/client.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,GAWT,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAqBvC,MAAM,WAAW,GAAY,EAAE,IAAI,EAAE,2BAA2B,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAErF,SAAS,mBAAmB,CAAC,KAAY;IACvC,MAAM,KAAK,GAAgB,EAAE,CAAC;IAC9B,IAAI,OAAO,GAAY,KAAK,CAAC;IAC7B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAW,CAAC;IAChC,OAAO,OAAO,YAAY,KAAK,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAClB,KAAK,CAAC,IAAI,CAAC;YACT,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;YAC7B,KAAK,EAAE,OAAO,CAAC,OAAO,IAAI,EAAE;YAC5B,MAAM,EAAE,eAAe,CAAC,OAAO,CAAC;SACjC,CAAC,CAAC;QACH,OAAO,GAAI,OAA+B,CAAC,KAAK,CAAC;IACnD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,yFAAyF;AACzF,MAAM,OAAO,MAAM;IAUY;IATpB,KAAK,GAAG,IAAI,KAAK,EAAE,CAAC;IACZ,SAAS,CAAY;IACrB,GAAG,CAAU;IACb,QAAQ,CAAW;IACnB,WAAW,CAAS;IACpB,SAAS,CAAS;IAC3B,MAAM,GAAmB,EAAE,CAAC;IAC5B,KAAK,CAA6C;IAE1D,YAA6B,OAAsB;QAAtB,YAAO,GAAP,OAAO,CAAe;QACjD,MAAM,GAAG,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAClC,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,CAAC;QAC/B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,WAAW,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,MAAM,CAAC;QAC3C,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,YAAY,CAAC;QACvD,IAAI,CAAC,SAAS,GAAG,IAAI,SAAS,CAAC,GAAG,CAAC,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;YAC3D,UAAU,EAAE,OAAO,CAAC,UAAU;YAC9B,KAAK,EAAE,OAAO,CAAC,KAAK;SACrB,CAAC,CAAC;IACL,CAAC;IAED,gBAAgB,CAAC,KAAc,EAAE,IAAwF;QACvH,MAAM,GAAG,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;QAClH,MAAM,SAAS,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3C,OAAO,IAAI,CAAC,aAAa,CAAC;YACxB,KAAK,EAAE,IAAI,EAAE,KAAK,IAAI,OAAO;YAC7B,SAAS;YACT,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK;YAC5B,IAAI,EAAE,IAAI,EAAE,IAAI;YAChB,KAAK,EAAE,IAAI,EAAE,KAAK;SACnB,CAAC,CAAC;IACL,CAAC;IAED,cAAc,CAAC,OAAe,EAAE,QAAe,MAAM,EAAE,IAAyE;QAC9H,OAAO,IAAI,CAAC,aAAa,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,UAAU,CAAC,KAAyG;QAClH,MAAM,OAAO,GAAa;YACxB,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE;YACxC,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,WAAW,EAAE,KAAK,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;YAClD,OAAO,EAAE,KAAK,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAC9C,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,UAAU,EAAE,KAAK,CAAC,UAAU,IAAI,EAAE;YAClC,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IACzC,CAAC;IAED,WAAW,CAAC,IAAuE;QACjF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,CAAC,CAAC;QAChD,IAAI,IAAI,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI;YAAE,OAAO;QAC7C,MAAM,OAAO,GAAc;YACzB,GAAG,IAAI;YACP,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,WAAW;YACjD,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7C,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;QACF,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;IAC1C,CAAC;IAED,aAAa,CAAC,KAAiB;QAC7B,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;IAClC,CAAC;IACD,OAAO,CAAC,IAAsB;QAC5B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,CAAC,GAAW,EAAE,KAAa;QAC/B,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAChC,CAAC;IACD,QAAQ,CAAC,GAAW,EAAE,KAAc;QAClC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IAClC,CAAC;IAEO,aAAa,CAAC,KAMrB;QACC,MAAM,QAAQ,GAAG,UAAU,EAAE,CAAC;QAC9B,IAAI,OAAO,GAAe;YACxB,QAAQ;YACR,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;YACrB,KAAK,EAAE,KAAK,CAAC,KAAK;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,WAAW,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU;YACpC,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,EAAE;YAC3C,KAAK,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,KAAK,CAAC,KAAK,EAAE;YAC9C,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI;YACrB,WAAW,EAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;YACxC,GAAG,EAAE,IAAI,CAAC,GAAG;SACd,CAAC;QAEF,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;YAC5B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;YAChD,IAAI,CAAC,MAAM;gBAAE,OAAO,QAAQ,CAAC;YAC7B,OAAO,GAAG,MAAM,CAAC;QACnB,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACzC,OAAO,QAAQ,CAAC;IAClB,CAAC;IAEO,OAAO,CAAC,IAAkB;QAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,YAAY,IAAI,EAAE,CAAC,EAAE,CAAC;YAC5D,KAAK,IAAI,CAAC,KAAK,EAAE,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,WAAW,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAEO,WAAW;QACjB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO;QACvB,IAAI,CAAC,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC,CAAC;QACxF,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,KAAK,UAAU;YAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACjE,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QACrC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;QAC1B,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC1B,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,CAAC,KAAK,EAAE,CAAC;IACrB,CAAC;CACF"}
@@ -0,0 +1,7 @@
1
+ export { Client } from "./client.js";
2
+ export type { ClientOptions } from "./client.js";
3
+ export { Scope } from "./scope.js";
4
+ export { Transport } from "./transport.js";
5
+ export type { TransportOptions } from "./transport.js";
6
+ export { randomUuid } from "./uuid.js";
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,YAAY,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,YAAY,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { Client } from "./client.js";
2
+ export { Scope } from "./scope.js";
3
+ export { Transport } from "./transport.js";
4
+ export { randomUuid } from "./uuid.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/core/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { Breadcrumb, Tags, User } from "../schemas/index.js";
2
+ /** Mutable context attached to outgoing events: user, tags, extra data, breadcrumbs. */
3
+ export declare class Scope {
4
+ user?: User;
5
+ tags: Tags;
6
+ extra: Record<string, unknown>;
7
+ breadcrumbs: Breadcrumb[];
8
+ setUser(user: User | undefined): void;
9
+ setTag(key: string, value: string): void;
10
+ setExtra(key: string, value: unknown): void;
11
+ addBreadcrumb(crumb: Breadcrumb): void;
12
+ clone(): Scope;
13
+ }
14
+ //# sourceMappingURL=scope.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.d.ts","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAC;AAIlE,wFAAwF;AACxF,qBAAa,KAAK;IAChB,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,IAAI,EAAE,IAAI,CAAM;IAChB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAM;IACpC,WAAW,EAAE,UAAU,EAAE,CAAM;IAE/B,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI;IAIrC,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI;IAIxC,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI;IAI3C,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAOtC,KAAK,IAAI,KAAK;CAQf"}
@@ -0,0 +1,32 @@
1
+ const MAX_BREADCRUMBS = 100;
2
+ /** Mutable context attached to outgoing events: user, tags, extra data, breadcrumbs. */
3
+ export class Scope {
4
+ user;
5
+ tags = {};
6
+ extra = {};
7
+ breadcrumbs = [];
8
+ setUser(user) {
9
+ this.user = user;
10
+ }
11
+ setTag(key, value) {
12
+ this.tags[key] = value;
13
+ }
14
+ setExtra(key, value) {
15
+ this.extra[key] = value;
16
+ }
17
+ addBreadcrumb(crumb) {
18
+ this.breadcrumbs.push(crumb);
19
+ if (this.breadcrumbs.length > MAX_BREADCRUMBS) {
20
+ this.breadcrumbs.splice(0, this.breadcrumbs.length - MAX_BREADCRUMBS);
21
+ }
22
+ }
23
+ clone() {
24
+ const s = new Scope();
25
+ s.user = this.user ? { ...this.user } : undefined;
26
+ s.tags = { ...this.tags };
27
+ s.extra = { ...this.extra };
28
+ s.breadcrumbs = [...this.breadcrumbs];
29
+ return s;
30
+ }
31
+ }
32
+ //# sourceMappingURL=scope.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scope.js","sourceRoot":"","sources":["../../src/core/scope.ts"],"names":[],"mappings":"AAEA,MAAM,eAAe,GAAG,GAAG,CAAC;AAE5B,wFAAwF;AACxF,MAAM,OAAO,KAAK;IAChB,IAAI,CAAQ;IACZ,IAAI,GAAS,EAAE,CAAC;IAChB,KAAK,GAA4B,EAAE,CAAC;IACpC,WAAW,GAAiB,EAAE,CAAC;IAE/B,OAAO,CAAC,IAAsB;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,GAAW,EAAE,KAAa;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IACzB,CAAC;IAED,QAAQ,CAAC,GAAW,EAAE,KAAc;QAClC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC1B,CAAC;IAED,aAAa,CAAC,KAAiB;QAC7B,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,eAAe,EAAE,CAAC;YAC9C,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;IAED,KAAK;QACH,MAAM,CAAC,GAAG,IAAI,KAAK,EAAE,CAAC;QACtB,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;QAClD,CAAC,CAAC,IAAI,GAAG,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC1B,CAAC,CAAC,KAAK,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC5B,CAAC,CAAC,WAAW,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;QACtC,OAAO,CAAC,CAAC;IACX,CAAC;CACF"}
@@ -0,0 +1,26 @@
1
+ import { Client, type ClientOptions } from "./client.js";
2
+ import type { Level, User } from "../schemas/common.js";
3
+ import type { Breadcrumb } from "../schemas/error.js";
4
+ import type { LogAttributes } from "../schemas/log.js";
5
+ /** Create the global client. Platform subpaths (/node, /nextjs, /react-native) wrap this
6
+ * to also install their own global error handlers. */
7
+ export declare function init(options: ClientOptions): Client;
8
+ export declare function setClient(client: Client): void;
9
+ export declare function getClient(): Client | undefined;
10
+ export declare function captureException(error: unknown, hint?: Parameters<Client["captureException"]>[1]): string | undefined;
11
+ export declare function captureMessage(message: string, level?: Level): string | undefined;
12
+ export declare function addBreadcrumb(crumb: Breadcrumb): void;
13
+ export declare function setUser(user: User | undefined): void;
14
+ export declare function setTag(key: string, value: string): void;
15
+ export declare function setExtra(key: string, value: unknown): void;
16
+ export declare function flush(): Promise<void>;
17
+ export declare function close(): Promise<void>;
18
+ /** Structured logger — the "send the logs I choose" API. */
19
+ export declare const log: {
20
+ fatal: (m: string, a?: LogAttributes) => void;
21
+ error: (m: string, a?: LogAttributes) => void;
22
+ warn: (m: string, a?: LogAttributes) => void;
23
+ info: (m: string, a?: LogAttributes) => void;
24
+ debug: (m: string, a?: LogAttributes) => void;
25
+ };
26
+ //# sourceMappingURL=singleton.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.d.ts","sourceRoot":"","sources":["../../src/core/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAIvD;uDACuD;AACvD,wBAAgB,IAAI,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAGnD;AAED,wBAAgB,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAE9C;AAED,wBAAgB,SAAS,IAAI,MAAM,GAAG,SAAS,CAE9C;AAED,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,UAAU,CAAC,MAAM,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,MAAM,GAAG,SAAS,CAErH;AAED,wBAAgB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,GAAE,KAAc,GAAG,MAAM,GAAG,SAAS,CAEzF;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAErD;AACD,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,IAAI,CAEpD;AACD,wBAAgB,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,IAAI,CAEvD;AACD,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAE1D;AACD,wBAAgB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;AACD,wBAAgB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAErC;AAMD,4DAA4D;AAC5D,eAAO,MAAM,GAAG;eACH,MAAM,MAAM,aAAa;eACzB,MAAM,MAAM,aAAa;cAC1B,MAAM,MAAM,aAAa;cACzB,MAAM,MAAM,aAAa;eACxB,MAAM,MAAM,aAAa;CACrC,CAAC"}
@@ -0,0 +1,50 @@
1
+ import { Client } from "./client.js";
2
+ let current;
3
+ /** Create the global client. Platform subpaths (/node, /nextjs, /react-native) wrap this
4
+ * to also install their own global error handlers. */
5
+ export function init(options) {
6
+ current = new Client(options);
7
+ return current;
8
+ }
9
+ export function setClient(client) {
10
+ current = client;
11
+ }
12
+ export function getClient() {
13
+ return current;
14
+ }
15
+ export function captureException(error, hint) {
16
+ return current?.captureException(error, hint);
17
+ }
18
+ export function captureMessage(message, level = "info") {
19
+ return current?.captureMessage(message, level);
20
+ }
21
+ export function addBreadcrumb(crumb) {
22
+ current?.addBreadcrumb(crumb);
23
+ }
24
+ export function setUser(user) {
25
+ current?.setUser(user);
26
+ }
27
+ export function setTag(key, value) {
28
+ current?.setTag(key, value);
29
+ }
30
+ export function setExtra(key, value) {
31
+ current?.setExtra(key, value);
32
+ }
33
+ export function flush() {
34
+ return current ? current.flush() : Promise.resolve();
35
+ }
36
+ export function close() {
37
+ return current ? current.close() : Promise.resolve();
38
+ }
39
+ function emit(level, message, attributes) {
40
+ current?.captureLog({ level, message, logger: "default", attributes: attributes ?? {} });
41
+ }
42
+ /** Structured logger — the "send the logs I choose" API. */
43
+ export const log = {
44
+ fatal: (m, a) => emit("fatal", m, a),
45
+ error: (m, a) => emit("error", m, a),
46
+ warn: (m, a) => emit("warning", m, a),
47
+ info: (m, a) => emit("info", m, a),
48
+ debug: (m, a) => emit("debug", m, a),
49
+ };
50
+ //# sourceMappingURL=singleton.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"singleton.js","sourceRoot":"","sources":["../../src/core/singleton.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAsB,MAAM,aAAa,CAAC;AAKzD,IAAI,OAA2B,CAAC;AAEhC;uDACuD;AACvD,MAAM,UAAU,IAAI,CAAC,OAAsB;IACzC,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9B,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,MAAc;IACtC,OAAO,GAAG,MAAM,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,SAAS;IACvB,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,KAAc,EAAE,IAAgD;IAC/F,OAAO,OAAO,EAAE,gBAAgB,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,QAAe,MAAM;IACnE,OAAO,OAAO,EAAE,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAiB;IAC7C,OAAO,EAAE,aAAa,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AACD,MAAM,UAAU,OAAO,CAAC,IAAsB;IAC5C,OAAO,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AACD,MAAM,UAAU,MAAM,CAAC,GAAW,EAAE,KAAa;IAC/C,OAAO,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC9B,CAAC;AACD,MAAM,UAAU,QAAQ,CAAC,GAAW,EAAE,KAAc;IAClD,OAAO,EAAE,QAAQ,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAChC,CAAC;AACD,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;AACvD,CAAC;AACD,MAAM,UAAU,KAAK;IACnB,OAAO,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,IAAI,CAAC,KAAY,EAAE,OAAe,EAAE,UAA0B;IACrE,OAAO,EAAE,UAAU,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,IAAI,EAAE,EAAE,CAAC,CAAC;AAC3F,CAAC;AAED,4DAA4D;AAC5D,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,KAAK,EAAE,CAAC,CAAS,EAAE,CAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,CAAC,CAAS,EAAE,CAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5D,IAAI,EAAE,CAAC,CAAS,EAAE,CAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7D,IAAI,EAAE,CAAC,CAAS,EAAE,CAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC1D,KAAK,EAAE,CAAC,CAAS,EAAE,CAAiB,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC;CAC7D,CAAC"}
@@ -0,0 +1,18 @@
1
+ import type { EnvelopeItem, SdkInfo } from "../schemas/index.js";
2
+ export interface TransportOptions {
3
+ maxRetries?: number;
4
+ timeoutMs?: number;
5
+ debug?: boolean;
6
+ }
7
+ /** Sends envelopes to the ingest endpoint with bounded exponential-backoff retry. */
8
+ export declare class Transport {
9
+ private readonly ingestUrl;
10
+ private readonly publicKey;
11
+ private readonly maxRetries;
12
+ private readonly timeoutMs;
13
+ private readonly debug;
14
+ constructor(ingestUrl: string, publicKey: string, options?: TransportOptions);
15
+ send(items: EnvelopeItem[], sdk: SdkInfo): Promise<void>;
16
+ private logDebug;
17
+ }
18
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAY,YAAY,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAE3E,MAAM,WAAW,gBAAgB;IAC/B,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAID,qFAAqF;AACrF,qBAAa,SAAS;IAMlB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAN5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAU;gBAGb,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EAClC,OAAO,GAAE,gBAAqB;IAO1B,IAAI,CAAC,KAAK,EAAE,YAAY,EAAE,EAAE,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAsC9D,OAAO,CAAC,QAAQ;CAGjB"}
@@ -0,0 +1,60 @@
1
+ const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
2
+ /** Sends envelopes to the ingest endpoint with bounded exponential-backoff retry. */
3
+ export class Transport {
4
+ ingestUrl;
5
+ publicKey;
6
+ maxRetries;
7
+ timeoutMs;
8
+ debug;
9
+ constructor(ingestUrl, publicKey, options = {}) {
10
+ this.ingestUrl = ingestUrl;
11
+ this.publicKey = publicKey;
12
+ this.maxRetries = options.maxRetries ?? 3;
13
+ this.timeoutMs = options.timeoutMs ?? 5000;
14
+ this.debug = options.debug ?? false;
15
+ }
16
+ async send(items, sdk) {
17
+ if (items.length === 0)
18
+ return;
19
+ const envelope = { sdk, sent_at: Date.now(), items };
20
+ const body = JSON.stringify(envelope);
21
+ for (let attempt = 0;; attempt++) {
22
+ try {
23
+ const controller = new AbortController();
24
+ const t = setTimeout(() => controller.abort(), this.timeoutMs);
25
+ let res;
26
+ try {
27
+ res = await fetch(this.ingestUrl, {
28
+ method: "POST",
29
+ headers: { "content-type": "application/json", "x-ek-public-key": this.publicKey },
30
+ body,
31
+ signal: controller.signal,
32
+ });
33
+ }
34
+ finally {
35
+ clearTimeout(t);
36
+ }
37
+ if (res.ok)
38
+ return;
39
+ // 4xx (except 429) are client errors — retrying won't help, drop.
40
+ if (res.status !== 429 && res.status < 500) {
41
+ this.logDebug(`dropped envelope: HTTP ${res.status}`);
42
+ return;
43
+ }
44
+ throw new Error(`retryable HTTP ${res.status}`);
45
+ }
46
+ catch (err) {
47
+ if (attempt >= this.maxRetries) {
48
+ this.logDebug(`giving up after ${attempt + 1} attempts: ${String(err)}`);
49
+ return;
50
+ }
51
+ await sleep(Math.min(1000 * 2 ** attempt, 8000));
52
+ }
53
+ }
54
+ }
55
+ logDebug(msg) {
56
+ if (this.debug)
57
+ console.warn(`[ek-sentry] ${msg}`);
58
+ }
59
+ }
60
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/core/transport.ts"],"names":[],"mappings":"AAQA,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpE,qFAAqF;AACrF,MAAM,OAAO,SAAS;IAMD;IACA;IANF,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,KAAK,CAAU;IAEhC,YACmB,SAAiB,EACjB,SAAiB,EAClC,UAA4B,EAAE;QAFb,cAAS,GAAT,SAAS,CAAQ;QACjB,cAAS,GAAT,SAAS,CAAQ;QAGlC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,IAAI,CAAC,CAAC;QAC1C,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,CAAC;QAC3C,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,KAAK,CAAC;IACtC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAqB,EAAE,GAAY;QAC5C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAC/B,MAAM,QAAQ,GAAa,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC;QAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAEtC,KAAK,IAAI,OAAO,GAAG,CAAC,GAAI,OAAO,EAAE,EAAE,CAAC;YAClC,IAAI,CAAC;gBACH,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;gBACzC,MAAM,CAAC,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC/D,IAAI,GAAa,CAAC;gBAClB,IAAI,CAAC;oBACH,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,SAAS,EAAE;wBAChC,MAAM,EAAE,MAAM;wBACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,IAAI,CAAC,SAAS,EAAE;wBAClF,IAAI;wBACJ,MAAM,EAAE,UAAU,CAAC,MAAM;qBAC1B,CAAC,CAAC;gBACL,CAAC;wBAAS,CAAC;oBACT,YAAY,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC;gBAED,IAAI,GAAG,CAAC,EAAE;oBAAE,OAAO;gBACnB,kEAAkE;gBAClE,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC3C,IAAI,CAAC,QAAQ,CAAC,0BAA0B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;oBACtD,OAAO;gBACT,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAClD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;oBAC/B,IAAI,CAAC,QAAQ,CAAC,mBAAmB,OAAO,GAAG,CAAC,cAAc,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACzE,OAAO;gBACT,CAAC;gBACD,MAAM,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACnD,CAAC;QACH,CAAC;IACH,CAAC;IAEO,QAAQ,CAAC,GAAW;QAC1B,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,CAAC,IAAI,CAAC,eAAe,GAAG,EAAE,CAAC,CAAC;IACrD,CAAC;CACF"}
@@ -0,0 +1,4 @@
1
+ /** Cross-platform UUID. Uses `crypto.randomUUID` where available (Node 22, browsers,
2
+ * modern Hermes); falls back to a Math.random v4 for older React Native runtimes. */
3
+ export declare function randomUuid(): string;
4
+ //# sourceMappingURL=uuid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.d.ts","sourceRoot":"","sources":["../../src/core/uuid.ts"],"names":[],"mappings":"AAAA;qFACqF;AACrF,wBAAgB,UAAU,IAAI,MAAM,CAOnC"}
@@ -0,0 +1,12 @@
1
+ /** Cross-platform UUID. Uses `crypto.randomUUID` where available (Node 22, browsers,
2
+ * modern Hermes); falls back to a Math.random v4 for older React Native runtimes. */
3
+ export function randomUuid() {
4
+ const c = globalThis.crypto;
5
+ if (c?.randomUUID)
6
+ return c.randomUUID();
7
+ return "xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g, (ch) => {
8
+ const r = (Math.random() * 16) | 0;
9
+ return (ch === "x" ? r : (r & 0x3) | 0x8).toString(16);
10
+ });
11
+ }
12
+ //# sourceMappingURL=uuid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"uuid.js","sourceRoot":"","sources":["../../src/core/uuid.ts"],"names":[],"mappings":"AAAA;qFACqF;AACrF,MAAM,UAAU,UAAU;IACxB,MAAM,CAAC,GAAI,UAAyD,CAAC,MAAM,CAAC;IAC5E,IAAI,CAAC,EAAE,UAAU;QAAE,OAAO,CAAC,CAAC,UAAU,EAAE,CAAC;IACzC,OAAO,sCAAsC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE;QACpE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC;QACnC,OAAO,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IACzD,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,12 @@
1
+ export { init, setClient, getClient, captureException, captureMessage, addBreadcrumb, setUser, setTag, setExtra, flush, close, log, } from "./core/singleton.js";
2
+ export { Client, Scope, Transport, randomUuid } from "./core/index.js";
3
+ export type { ClientOptions, TransportOptions } from "./core/index.js";
4
+ export { parseDsn } from "./schemas/dsn.js";
5
+ export type { ParsedDsn } from "./schemas/dsn.js";
6
+ export { parseStackString, parseStackTrace } from "./schemas/stacktrace.js";
7
+ export type { Level, Platform, User, SdkInfo, Tags, } from "./schemas/common.js";
8
+ export type { ErrorEvent, Exception, StackFrame, Breadcrumb, Request as RequestContext } from "./schemas/error.js";
9
+ export type { LogEntry, LogAttributes } from "./schemas/log.js";
10
+ export type { SpanEvent, SpanStatus } from "./schemas/span.js";
11
+ export type { EnvelopeItem, Envelope, EnvelopeItemType } from "./schemas/envelope.js";
12
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAQA,OAAO,EACL,IAAI,EACJ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,GACJ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AACvE,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,YAAY,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG5E,YAAY,EACV,KAAK,EACL,QAAQ,EACR,IAAI,EACJ,OAAO,EACP,IAAI,GACL,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACnH,YAAY,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/D,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,13 @@
1
+ // Main entry — universal, works on any JS runtime (Node/Next/RN/browser).
2
+ // For automatic platform-specific error handlers, import from a subpath instead:
3
+ // import { init } from "@muhammetgoktug/ek-sentry/node"
4
+ // import { init } from "@muhammetgoktug/ek-sentry/nextjs"
5
+ // import { initBrowser } from "@muhammetgoktug/ek-sentry/nextjs/client"
6
+ // import { ErrorBoundary } from "@muhammetgoktug/ek-sentry/react"
7
+ // import { initReactNative } from "@muhammetgoktug/ek-sentry/react-native"
8
+ export { init, setClient, getClient, captureException, captureMessage, addBreadcrumb, setUser, setTag, setExtra, flush, close, log, } from "./core/singleton.js";
9
+ export { Client, Scope, Transport, randomUuid } from "./core/index.js";
10
+ // Pure helpers — useful for both SDK users and server-side ingestion consumers.
11
+ export { parseDsn } from "./schemas/dsn.js";
12
+ export { parseStackString, parseStackTrace } from "./schemas/stacktrace.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,iFAAiF;AACjF,0DAA0D;AAC1D,4DAA4D;AAC5D,0EAA0E;AAC1E,oEAAoE;AACpE,6EAA6E;AAE7E,OAAO,EACL,IAAI,EACJ,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,GACJ,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAGvE,gFAAgF;AAChF,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAE5C,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import { type Client, type ClientOptions } from "../core/index.js";
2
+ export type BrowserInitOptions = Omit<ClientOptions, "sdk" | "platform">;
3
+ /** Initialize browser-side capture (call once at app boot — e.g. in a root client provider). */
4
+ export declare function initBrowser(options: BrowserInitOptions): Client;
5
+ export { getClient as getBrowserClient, captureException, captureMessage, addBreadcrumb, setUser, setTag, setExtra, flush, log, } from "../core/singleton.js";
6
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/nextjs/client.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKnE,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;AAEzE,gGAAgG;AAChG,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB,GAAG,MAAM,CAS/D;AAED,OAAO,EACL,SAAS,IAAI,gBAAgB,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,GAAG,GACJ,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ "use client";
2
+ import { init as coreInit } from "../core/singleton.js";
3
+ const SDK_INFO = { name: "@muhammetgoktug/ek-sentry/nextjs", version: "0.1.1" };
4
+ /** Initialize browser-side capture (call once at app boot — e.g. in a root client provider). */
5
+ export function initBrowser(options) {
6
+ const client = coreInit({ ...options, platform: "browser", sdk: SDK_INFO });
7
+ window.addEventListener("error", (ev) => {
8
+ client.captureException(ev.error ?? ev.message);
9
+ });
10
+ window.addEventListener("unhandledrejection", (ev) => {
11
+ client.captureException(ev.reason);
12
+ });
13
+ return client;
14
+ }
15
+ export { getClient as getBrowserClient, captureException, captureMessage, addBreadcrumb, setUser, setTag, setExtra, flush, log, } from "../core/singleton.js";
16
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/nextjs/client.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAGb,OAAO,EAAE,IAAI,IAAI,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAExD,MAAM,QAAQ,GAAG,EAAE,IAAI,EAAE,kCAAkC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAIhF,gGAAgG;AAChG,MAAM,UAAU,WAAW,CAAC,OAA2B;IACrD,MAAM,MAAM,GAAG,QAAQ,CAAC,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5E,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,EAAc,EAAE,EAAE;QAClD,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,OAAO,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IACH,MAAM,CAAC,gBAAgB,CAAC,oBAAoB,EAAE,CAAC,EAAyB,EAAE,EAAE;QAC1E,MAAM,CAAC,gBAAgB,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,OAAO,EACL,SAAS,IAAI,gBAAgB,EAC7B,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,GAAG,GACJ,MAAM,sBAAsB,CAAC"}
@@ -0,0 +1,16 @@
1
+ import { type Client, type ClientOptions } from "../core/index.js";
2
+ export type NextInitOptions = Omit<ClientOptions, "sdk" | "platform">;
3
+ /** Call from `register()` in instrumentation.ts (Node runtime) to set up server-side capture. */
4
+ export declare function init(options: NextInitOptions): Client;
5
+ /** Wire to `export const onRequestError` in instrumentation.ts (Next 15+). */
6
+ export declare function captureRequestError(error: unknown, request: {
7
+ path?: string;
8
+ method?: string;
9
+ headers?: Record<string, string>;
10
+ }, context?: {
11
+ routerKind?: string;
12
+ routePath?: string;
13
+ renderSource?: string;
14
+ }): void;
15
+ export { getClient, captureException, captureMessage, addBreadcrumb, setUser, setTag, setExtra, flush, close, log, } from "../core/singleton.js";
16
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/nextjs/server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAE,KAAK,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAKnE,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,KAAK,GAAG,UAAU,CAAC,CAAC;AAEtE,iGAAiG;AACjG,wBAAgB,IAAI,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,CASrD;AAED,8EAA8E;AAC9E,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,OAAO,EACd,OAAO,EAAE;IAAE,IAAI,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,EAC7E,OAAO,CAAC,EAAE;IAAE,UAAU,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC3E,IAAI,CAQN;AAED,OAAO,EACL,SAAS,EACT,gBAAgB,EAChB,cAAc,EACd,aAAa,EACb,OAAO,EACP,MAAM,EACN,QAAQ,EACR,KAAK,EACL,KAAK,EACL,GAAG,GACJ,MAAM,sBAAsB,CAAC"}