@errio/core 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.
- package/dist/classify.d.ts +11 -0
- package/dist/classify.d.ts.map +1 -0
- package/dist/classify.js +102 -0
- package/dist/classify.js.map +1 -0
- package/dist/client.d.ts +42 -0
- package/dist/client.d.ts.map +1 -0
- package/dist/client.js +223 -0
- package/dist/client.js.map +1 -0
- package/dist/context.d.ts +29 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +60 -0
- package/dist/context.js.map +1 -0
- package/dist/deploy.d.ts +29 -0
- package/dist/deploy.d.ts.map +1 -0
- package/dist/deploy.js +50 -0
- package/dist/deploy.js.map +1 -0
- package/dist/fingerprint.d.ts +30 -0
- package/dist/fingerprint.d.ts.map +1 -0
- package/dist/fingerprint.js +74 -0
- package/dist/fingerprint.js.map +1 -0
- package/dist/git.d.ts +12 -0
- package/dist/git.d.ts.map +1 -0
- package/dist/git.js +60 -0
- package/dist/git.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +21 -0
- package/dist/index.js.map +1 -0
- package/dist/redact.d.ts +19 -0
- package/dist/redact.d.ts.map +1 -0
- package/dist/redact.js +86 -0
- package/dist/redact.js.map +1 -0
- package/dist/sampling.d.ts +13 -0
- package/dist/sampling.d.ts.map +1 -0
- package/dist/sampling.js +23 -0
- package/dist/sampling.js.map +1 -0
- package/dist/serializer.d.ts +16 -0
- package/dist/serializer.d.ts.map +1 -0
- package/dist/serializer.js +92 -0
- package/dist/serializer.js.map +1 -0
- package/dist/transport.d.ts +39 -0
- package/dist/transport.d.ts.map +1 -0
- package/dist/transport.js +138 -0
- package/dist/transport.js.map +1 -0
- package/dist/types.d.ts +148 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +47 -0
- package/src/index.ts +53 -0
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
const MAX_RETRIES = 3;
|
|
2
|
+
const INITIAL_BACKOFF_MS = 500;
|
|
3
|
+
const REQUEST_TIMEOUT_MS = 5000;
|
|
4
|
+
/**
|
|
5
|
+
* Batched HTTP transport for error events.
|
|
6
|
+
*
|
|
7
|
+
* Events are buffered in memory and flushed either when the batch is full,
|
|
8
|
+
* on a timer interval, or on process shutdown. This reduces HTTP overhead
|
|
9
|
+
* while ensuring events are not lost on process exit.
|
|
10
|
+
*/
|
|
11
|
+
export class BatchTransport {
|
|
12
|
+
buffer = [];
|
|
13
|
+
flushTimer = null;
|
|
14
|
+
shutdownRegistered = false;
|
|
15
|
+
flushing = false;
|
|
16
|
+
config;
|
|
17
|
+
constructor(config) {
|
|
18
|
+
this.config = config;
|
|
19
|
+
this.startFlushTimer();
|
|
20
|
+
this.registerShutdownHooks();
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Enqueue an event for batched delivery.
|
|
24
|
+
* Triggers an immediate flush if the buffer reaches batchSize.
|
|
25
|
+
*/
|
|
26
|
+
enqueue(event) {
|
|
27
|
+
this.buffer.push(event);
|
|
28
|
+
if (this.buffer.length >= this.config.batchSize) {
|
|
29
|
+
void this.flush();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Flush all buffered events to the API.
|
|
34
|
+
* Safe to call concurrently — uses a lock to prevent overlapping flushes.
|
|
35
|
+
*/
|
|
36
|
+
async flush() {
|
|
37
|
+
if (this.flushing || this.buffer.length === 0)
|
|
38
|
+
return;
|
|
39
|
+
this.flushing = true;
|
|
40
|
+
const batch = this.buffer.splice(0);
|
|
41
|
+
try {
|
|
42
|
+
// Send events individually to match the existing API contract (POST /api/v1/errors)
|
|
43
|
+
// A future batch endpoint could optimize this further.
|
|
44
|
+
const promises = batch.map((event) => this.sendWithRetry(event));
|
|
45
|
+
await Promise.allSettled(promises);
|
|
46
|
+
}
|
|
47
|
+
finally {
|
|
48
|
+
this.flushing = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Stop the flush timer and flush remaining events.
|
|
53
|
+
* Called during graceful shutdown.
|
|
54
|
+
*/
|
|
55
|
+
async shutdown() {
|
|
56
|
+
if (this.flushTimer) {
|
|
57
|
+
clearInterval(this.flushTimer);
|
|
58
|
+
this.flushTimer = null;
|
|
59
|
+
}
|
|
60
|
+
await this.flush();
|
|
61
|
+
}
|
|
62
|
+
/** Number of events currently buffered. */
|
|
63
|
+
get pendingCount() {
|
|
64
|
+
return this.buffer.length;
|
|
65
|
+
}
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Private
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
startFlushTimer() {
|
|
70
|
+
this.flushTimer = setInterval(() => {
|
|
71
|
+
void this.flush();
|
|
72
|
+
}, this.config.flushIntervalMs);
|
|
73
|
+
// Don't keep the process alive just for flushing
|
|
74
|
+
if (this.flushTimer.unref) {
|
|
75
|
+
this.flushTimer.unref();
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
registerShutdownHooks() {
|
|
79
|
+
if (this.shutdownRegistered)
|
|
80
|
+
return;
|
|
81
|
+
this.shutdownRegistered = true;
|
|
82
|
+
const onShutdown = () => {
|
|
83
|
+
void this.shutdown();
|
|
84
|
+
};
|
|
85
|
+
process.once('beforeExit', onShutdown);
|
|
86
|
+
process.once('SIGTERM', onShutdown);
|
|
87
|
+
process.once('SIGINT', onShutdown);
|
|
88
|
+
}
|
|
89
|
+
async sendWithRetry(event) {
|
|
90
|
+
for (let attempt = 0; attempt <= MAX_RETRIES; attempt++) {
|
|
91
|
+
try {
|
|
92
|
+
return await this.sendEvent(event);
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
if (attempt === MAX_RETRIES) {
|
|
96
|
+
if (this.config.debug) {
|
|
97
|
+
console.error(`[errio] Failed to send event after ${MAX_RETRIES + 1} attempts`);
|
|
98
|
+
}
|
|
99
|
+
return null;
|
|
100
|
+
}
|
|
101
|
+
// Exponential backoff: 500ms, 1000ms, 2000ms
|
|
102
|
+
const delay = INITIAL_BACKOFF_MS * Math.pow(2, attempt);
|
|
103
|
+
await this.sleep(delay);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
async sendEvent(event) {
|
|
109
|
+
const controller = new AbortController();
|
|
110
|
+
const timeout = setTimeout(() => controller.abort(), REQUEST_TIMEOUT_MS);
|
|
111
|
+
try {
|
|
112
|
+
const response = await fetch(`${this.config.endpoint}/api/v1/errors`, {
|
|
113
|
+
method: 'POST',
|
|
114
|
+
headers: {
|
|
115
|
+
'Content-Type': 'application/json',
|
|
116
|
+
'Authorization': `Bearer ${this.config.apiKey}`,
|
|
117
|
+
},
|
|
118
|
+
body: JSON.stringify(event),
|
|
119
|
+
signal: controller.signal,
|
|
120
|
+
});
|
|
121
|
+
if (!response.ok) {
|
|
122
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
123
|
+
}
|
|
124
|
+
return (await response.json());
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
clearTimeout(timeout);
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
sleep(ms) {
|
|
131
|
+
return new Promise((resolve) => {
|
|
132
|
+
const timer = setTimeout(resolve, ms);
|
|
133
|
+
if (timer.unref)
|
|
134
|
+
timer.unref();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=transport.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../src/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Configuration for the Errio SDK client.
|
|
3
|
+
*/
|
|
4
|
+
export interface ErrioConfig {
|
|
5
|
+
/** API key with `ak_` prefix. Required. */
|
|
6
|
+
apiKey: string;
|
|
7
|
+
/** Custom API endpoint URL. Defaults to https://errio.mosaicwellness.in */
|
|
8
|
+
endpoint?: string;
|
|
9
|
+
/** Environment name, e.g. 'production', 'staging' */
|
|
10
|
+
environment?: string;
|
|
11
|
+
/** Service name, e.g. 'payment-service' */
|
|
12
|
+
serviceName?: string;
|
|
13
|
+
/** Sample rate between 0.0 and 1.0. Default: 1.0 (capture all). */
|
|
14
|
+
sampleRate?: number;
|
|
15
|
+
/** Max events to batch before flushing. Default: 10. */
|
|
16
|
+
batchSize?: number;
|
|
17
|
+
/** Interval in ms between automatic flushes. Default: 5000. */
|
|
18
|
+
flushIntervalMs?: number;
|
|
19
|
+
/** Hook called before each event is sent. Return null to drop the event. */
|
|
20
|
+
beforeSend?: (event: ErrorEvent) => ErrorEvent | null;
|
|
21
|
+
/** Plugins to register on initialization. */
|
|
22
|
+
plugins?: ErrioPlugin[];
|
|
23
|
+
/** Enable debug logging to console. Default: false. */
|
|
24
|
+
debug?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Resolved configuration with defaults applied.
|
|
28
|
+
*/
|
|
29
|
+
export interface ResolvedConfig {
|
|
30
|
+
apiKey: string;
|
|
31
|
+
endpoint: string;
|
|
32
|
+
environment: string;
|
|
33
|
+
serviceName: string;
|
|
34
|
+
sampleRate: number;
|
|
35
|
+
batchSize: number;
|
|
36
|
+
flushIntervalMs: number;
|
|
37
|
+
beforeSend: ((event: ErrorEvent) => ErrorEvent | null) | null;
|
|
38
|
+
debug: boolean;
|
|
39
|
+
}
|
|
40
|
+
export type ErrorType = 'build_failure' | 'runtime_error' | 'test_failure' | 'type_error' | 'dependency_issue' | 'unknown';
|
|
41
|
+
export type Severity = 'critical' | 'high' | 'medium' | 'low';
|
|
42
|
+
/**
|
|
43
|
+
* A single link in the Error.cause chain.
|
|
44
|
+
*/
|
|
45
|
+
export interface CauseEntry {
|
|
46
|
+
name: string;
|
|
47
|
+
message: string;
|
|
48
|
+
stack?: string;
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A breadcrumb captures a notable event that happened before an error.
|
|
52
|
+
*/
|
|
53
|
+
export interface Breadcrumb {
|
|
54
|
+
timestamp: number;
|
|
55
|
+
level: 'debug' | 'info' | 'warn' | 'error';
|
|
56
|
+
message: string;
|
|
57
|
+
category?: string;
|
|
58
|
+
data?: Record<string, unknown>;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Request context propagated via AsyncLocalStorage.
|
|
62
|
+
*/
|
|
63
|
+
export interface RequestContext {
|
|
64
|
+
requestId?: string;
|
|
65
|
+
userId?: string;
|
|
66
|
+
tenantId?: string;
|
|
67
|
+
sessionId?: string;
|
|
68
|
+
route?: string;
|
|
69
|
+
method?: string;
|
|
70
|
+
[key: string]: unknown;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Capture options for manual error capture.
|
|
74
|
+
*/
|
|
75
|
+
export interface CaptureOptions {
|
|
76
|
+
severity?: Severity;
|
|
77
|
+
tags?: Record<string, string>;
|
|
78
|
+
extra?: Record<string, unknown>;
|
|
79
|
+
fingerprint?: string;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* The normalized error event sent to the API.
|
|
83
|
+
*/
|
|
84
|
+
export interface ErrorEvent {
|
|
85
|
+
source: 'api';
|
|
86
|
+
error_type: ErrorType;
|
|
87
|
+
error_message: string;
|
|
88
|
+
stack_trace: string | null;
|
|
89
|
+
repo_full_name: string;
|
|
90
|
+
commit_sha: string | null;
|
|
91
|
+
branch: string | null;
|
|
92
|
+
file_paths: string[];
|
|
93
|
+
severity: Severity;
|
|
94
|
+
raw_payload: Record<string, unknown>;
|
|
95
|
+
metadata: Record<string, unknown>;
|
|
96
|
+
cause_chain?: CauseEntry[];
|
|
97
|
+
breadcrumbs?: Breadcrumb[];
|
|
98
|
+
context?: RequestContext;
|
|
99
|
+
fingerprint?: string;
|
|
100
|
+
correlation_id?: string;
|
|
101
|
+
timestamp: number;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* API response for error ingestion.
|
|
105
|
+
*/
|
|
106
|
+
export interface ApiResponse {
|
|
107
|
+
error_id: string;
|
|
108
|
+
issue_id?: string;
|
|
109
|
+
deduplicated: boolean;
|
|
110
|
+
status: string;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Plugin interface for extending the SDK.
|
|
114
|
+
*/
|
|
115
|
+
export interface ErrioPlugin {
|
|
116
|
+
/** Unique plugin name. */
|
|
117
|
+
name: string;
|
|
118
|
+
/** Called during client initialization. Use to register hooks, middleware, etc. */
|
|
119
|
+
setup(client: ErrioClientInterface): void | Promise<void>;
|
|
120
|
+
/** Called during client shutdown. Use to clean up resources. */
|
|
121
|
+
teardown?(): void | Promise<void>;
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Public interface exposed to plugins for interacting with the client.
|
|
125
|
+
*/
|
|
126
|
+
export interface ErrioClientInterface {
|
|
127
|
+
/** Capture an error event. */
|
|
128
|
+
captureError(error: Error, options?: CaptureOptions): void;
|
|
129
|
+
/** Get the resolved configuration (read-only). */
|
|
130
|
+
getConfig(): Readonly<ResolvedConfig>;
|
|
131
|
+
/** Add a breadcrumb to the current context. */
|
|
132
|
+
addBreadcrumb(breadcrumb: Omit<Breadcrumb, 'timestamp'>): void;
|
|
133
|
+
/** Set request context for the current async context. */
|
|
134
|
+
setContext(ctx: Partial<RequestContext>): void;
|
|
135
|
+
/** Get request context from the current async context. */
|
|
136
|
+
getContext(): RequestContext | undefined;
|
|
137
|
+
/** Run a function with a new request context scope. */
|
|
138
|
+
runWithContext<T>(ctx: RequestContext, fn: () => T): T;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Git repository information detected from the environment.
|
|
142
|
+
*/
|
|
143
|
+
export interface GitInfo {
|
|
144
|
+
repoFullName: string | null;
|
|
145
|
+
commitSha: string | null;
|
|
146
|
+
branch: string | null;
|
|
147
|
+
}
|
|
148
|
+
//# 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 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
|
package/package.json
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@errio/core",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Errio core SDK — transport, context, plugins, and error primitives",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "src/index.ts",
|
|
7
|
+
"types": "src/index.ts",
|
|
8
|
+
"publishConfig": {
|
|
9
|
+
"main": "dist/index.js",
|
|
10
|
+
"types": "dist/index.d.ts",
|
|
11
|
+
"exports": {
|
|
12
|
+
".": {
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"import": "./dist/index.js"
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
},
|
|
18
|
+
"files": [
|
|
19
|
+
"dist"
|
|
20
|
+
],
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0"
|
|
23
|
+
},
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsc",
|
|
26
|
+
"lint": "tsc --noEmit",
|
|
27
|
+
"test": "vitest run",
|
|
28
|
+
"prepublishOnly": "yarn build"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^22.0.0",
|
|
32
|
+
"typescript": "^5.5.0",
|
|
33
|
+
"vitest": "^2.0.0"
|
|
34
|
+
},
|
|
35
|
+
"repository": {
|
|
36
|
+
"type": "git",
|
|
37
|
+
"url": "https://github.com/farhanpatel88/errio.git"
|
|
38
|
+
},
|
|
39
|
+
"keywords": [
|
|
40
|
+
"errio",
|
|
41
|
+
"error-tracking",
|
|
42
|
+
"error-remediation",
|
|
43
|
+
"observability",
|
|
44
|
+
"sdk"
|
|
45
|
+
],
|
|
46
|
+
"license": "MIT"
|
|
47
|
+
}
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
// Client
|
|
2
|
+
export { ErrioClient } from './client.js';
|
|
3
|
+
|
|
4
|
+
// Types (everything the consumer or plugin author needs)
|
|
5
|
+
export type {
|
|
6
|
+
ErrioConfig,
|
|
7
|
+
ResolvedConfig,
|
|
8
|
+
ErrioPlugin,
|
|
9
|
+
ErrioClientInterface,
|
|
10
|
+
ErrorEvent,
|
|
11
|
+
ErrorType,
|
|
12
|
+
Severity,
|
|
13
|
+
CaptureOptions,
|
|
14
|
+
CauseEntry,
|
|
15
|
+
Breadcrumb,
|
|
16
|
+
RequestContext,
|
|
17
|
+
ApiResponse,
|
|
18
|
+
GitInfo,
|
|
19
|
+
} from './types.js';
|
|
20
|
+
|
|
21
|
+
// Context propagation
|
|
22
|
+
export {
|
|
23
|
+
getContext,
|
|
24
|
+
setContext,
|
|
25
|
+
runWithContext,
|
|
26
|
+
addBreadcrumb,
|
|
27
|
+
getBreadcrumbs,
|
|
28
|
+
clearBreadcrumbs,
|
|
29
|
+
} from './context.js';
|
|
30
|
+
|
|
31
|
+
// Classification
|
|
32
|
+
export { classifyError, defaultSeverity } from './classify.js';
|
|
33
|
+
|
|
34
|
+
// Fingerprinting and dedup
|
|
35
|
+
export { generateFingerprint, normalizeMessage, DedupCache } from './fingerprint.js';
|
|
36
|
+
|
|
37
|
+
// Serialization and file path extraction
|
|
38
|
+
export { serializeCauseChain, extractFilePaths } from './serializer.js';
|
|
39
|
+
|
|
40
|
+
// PII and secret redaction
|
|
41
|
+
export { redactString, redactObject } from './redact.js';
|
|
42
|
+
|
|
43
|
+
// Sampling
|
|
44
|
+
export { shouldSample } from './sampling.js';
|
|
45
|
+
|
|
46
|
+
// Git detection
|
|
47
|
+
export { detectGitInfo, parseRepoFullName } from './git.js';
|
|
48
|
+
|
|
49
|
+
// Transport
|
|
50
|
+
export { BatchTransport } from './transport.js';
|
|
51
|
+
|
|
52
|
+
// Deploy reporting
|
|
53
|
+
export { reportDeploy, type DeployInfo } from './deploy.js';
|