reportli 1.0.1 → 1.0.3
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.d.ts +8 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +210 -227
- package/dist/index.js.map +2 -2
- package/dist/index.mjs +210 -227
- package/dist/index.mjs.map +2 -2
- package/package.json +1 -1
- package/src/index.ts +288 -250
package/dist/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../src/index.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * Reportli SDK v1.0.1\n * Your AI agent that never sleeps.\n * Watches your SaaS, catches every error, files the GitHub issue \u2014 automatically.\n */\n\nconst ENDPOINT = \"https://fahikyfmgdyzejdfftox.supabase.co/functions/v1/rapid-processor\";\n\nconst isBrowser = typeof window !== \"undefined\";\nconst isNode = typeof process !== \"undefined\" && !!(process.versions?.node);\n\nlet _apiKey = \"\";\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getEnvironment(): string {\n return isBrowser ? \"browser\" : \"server\";\n}\n\nfunction getUrl(): string {\n if (isBrowser) return window.location.href;\n try { return require(\"os\").hostname(); } catch { return \"server\"; }\n}\n\nfunction getBrowser(): string {\n if (isBrowser) return navigator.userAgent;\n return `Node.js ${typeof process !== \"undefined\" ? process.version : \"unknown\"}`;\n}\n\nfunction parseStack(stack: string | undefined): { file: string; line: number; column: number } {\n if (!stack) return { file: \"unknown\", line: 0, column: 0 };\n const match =\n stack.match(/at .+ \\((.+):(\\d+):(\\d+)\\)/) ||\n stack.match(/at (.+):(\\d+):(\\d+)/);\n return {\n file: match?.[1]?.split(\"/\")?.pop() || \"unknown\",\n line: parseInt(match?.[2] || \"0\"),\n column: parseInt(match?.[3] || \"0\"),\n };\n}\n\nfunction getErrorCode(error: any): string {\n return error?.code || error?.status?.toString() || error?.statusCode?.toString() || error?.name || \"ERR_UNKNOWN\";\n}\n\nfunction classifyError(error: any, context?: string): { errorType: string; severity: \"low\" | \"medium\" | \"high\" | \"critical\" } {\n const msg = String(error?.message || error || \"\").toLowerCase();\n const name = String(error?.name || \"\").toLowerCase();\n\n if (name.includes(\"quotaexceeded\") || msg.includes(\"quota exceeded\") || msg.includes(\"localstorage\") || msg.includes(\"indexeddb\"))\n return { errorType: \"localStorage quota exceeded\", severity: \"medium\" };\n if (msg.includes(\"hydration\") || msg.includes(\"does not match server\"))\n return { errorType: \"React hydration error\", severity: \"high\" };\n if (msg.includes(\"invalid hook call\") || msg.includes(\"rules of hooks\"))\n return { errorType: \"Invalid hook call error\", severity: \"critical\" };\n if (msg.includes(\"failed prop type\") || msg.includes(\"invalid prop\"))\n return { errorType: \"Props type error\", severity: \"low\" };\n if (msg.includes(\"render\") || msg.includes(\"react error boundary\"))\n return { errorType: \"Component render error\", severity: \"critical\" };\n if (msg.includes(\"route not found\") || msg.includes(\"404 route\"))\n return { errorType: \"Route not found error\", severity: \"medium\" };\n if (msg.includes(\"failed to fetch dynamically imported\") || msg.includes(\"dynamic import\"))\n return { errorType: \"Dynamic import error\", severity: \"high\" };\n if (msg.includes(\"suspense\"))\n return { errorType: \"Suspense boundary error\", severity: \"medium\" };\n if (name === \"typeerror\" || msg.startsWith(\"typeerror\"))\n return { errorType: \"TypeError\", severity: \"high\" };\n if (name === \"referenceerror\")\n return { errorType: \"ReferenceError\", severity: \"critical\" };\n if (name === \"rangeerror\" || msg.includes(\"maximum call stack\"))\n return { errorType: \"Stack overflow error\", severity: \"critical\" };\n if (name === \"syntaxerror\")\n return { errorType: \"SyntaxError\", severity: \"high\" };\n if (msg.includes(\"stripe\") && (msg.includes(\"init\") || msg.includes(\"key\")))\n return { errorType: \"Stripe initialization error\", severity: \"critical\" };\n if (msg.includes(\"payment\") || msg.includes(\"card declined\"))\n return { errorType: \"Payment processing error\", severity: \"critical\" };\n if (msg.includes(\"checkout session\"))\n return { errorType: \"Checkout session error\", severity: \"high\" };\n if (msg.includes(\"refund failed\"))\n return { errorType: \"Refund failed error\", severity: \"high\" };\n if (msg.includes(\"supabase\") || msg.includes(\"postgresterror\"))\n return { errorType: \"Supabase query error\", severity: \"critical\" };\n if (msg.includes(\"unique constraint\") || msg.includes(\"duplicate key\"))\n return { errorType: \"Unique constraint error\", severity: \"high\" };\n if (msg.includes(\"foreign key\"))\n return { errorType: \"Foreign key error\", severity: \"high\" };\n if (msg.includes(\"transaction failed\") || msg.includes(\"rollback\"))\n return { errorType: \"Transaction failed error\", severity: \"critical\" };\n if (msg.includes(\"connection lost\") || msg.includes(\"econnrefused\"))\n return { errorType: \"Connection lost error\", severity: \"critical\" };\n if (msg.includes(\"query timeout\"))\n return { errorType: \"Query timeout error\", severity: \"high\" };\n if (msg.includes(\"jwt expired\") || msg.includes(\"token expired\"))\n return { errorType: \"JWT expired error\", severity: \"high\" };\n if (msg.includes(\"jwt\") && msg.includes(\"invalid\"))\n return { errorType: \"JWT verification error\", severity: \"high\" };\n if (msg.includes(\"firebase admin\"))\n return { errorType: \"Firebase admin error\", severity: \"critical\" };\n if (msg.includes(\"unauthorized\") || msg.includes(\"permission denied\"))\n return { errorType: \"Unauthorized access error\", severity: \"high\" };\n if (msg.includes(\"login failed\") || msg.includes(\"invalid credentials\"))\n return { errorType: \"Login failed error\", severity: \"medium\" };\n if (msg.includes(\"session ended\") || msg.includes(\"session expired\"))\n return { errorType: \"Session ended error\", severity: \"medium\" };\n if (msg.includes(\"oauth\"))\n return { errorType: \"OAuth callback error\", severity: \"high\" };\n if (msg.includes(\"cron job\") || msg.includes(\"cron failed\"))\n return { errorType: \"Cron job failed\", severity: \"high\" };\n if (msg.includes(\"queue processing\") || msg.includes(\"bullmq\"))\n return { errorType: \"Queue processing error\", severity: \"high\" };\n if (msg.includes(\"webhook\"))\n return { errorType: \"Webhook delivery failed\", severity: \"high\" };\n if (msg.includes(\"retry limit\"))\n return { errorType: \"Retry limit exceeded\", severity: \"high\" };\n if (msg.includes(\"out of memory\") || msg.includes(\"heap limit\"))\n return { errorType: \"Out of memory error\", severity: \"critical\" };\n if (msg.includes(\"cannot find module\"))\n return { errorType: \"Module not found error\", severity: \"critical\" };\n if (msg.includes(\"email\") || msg.includes(\"smtp\") || msg.includes(\"sendgrid\") || msg.includes(\"nodemailer\"))\n return { errorType: \"Email sending failed\", severity: \"high\" };\n if (msg.includes(\"onesignal\") || msg.includes(\"push notification\"))\n return { errorType: \"OneSignal API error\", severity: \"high\" };\n if (msg.includes(\"file upload\") || msg.includes(\"upload failed\"))\n return { errorType: \"File upload failed\", severity: \"high\" };\n if (msg.includes(\"file size exceeded\") || msg.includes(\"payload too large\"))\n return { errorType: \"File size exceeded\", severity: \"medium\" };\n if (msg.includes(\"invalid file type\") || msg.includes(\"mime type\"))\n return { errorType: \"Invalid file type\", severity: \"medium\" };\n if (msg.includes(\"cors\") || msg.includes(\"cross-origin\"))\n return { errorType: \"CORS error\", severity: \"high\" };\n if (msg.includes(\"fetch failed\") || msg.includes(\"failed to fetch\"))\n return { errorType: \"Fetch failed error\", severity: \"high\" };\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"etimedout\"))\n return { errorType: \"Request timeout error\", severity: \"medium\" };\n if (msg.includes(\"websocket\"))\n return { errorType: \"WebSocket connection error\", severity: \"high\" };\n if (context === \"unhandledrejection\")\n return { errorType: \"Unhandled promise rejection\", severity: \"medium\" };\n if (context === \"uncaughtexception\")\n return { errorType: \"Uncaught exception\", severity: \"high\" };\n if (context === \"express\")\n return { errorType: \"Route handler error\", severity: \"high\" };\n return { errorType: \"Uncaught exception\", severity: \"medium\" };\n}\n\nfunction normalizeError(err: any): { name: string; message: string; stack?: string } {\n if (err instanceof Error) return { name: err.name, message: err.message, stack: err.stack };\n if (typeof err === \"string\") return { name: \"Error\", message: err, stack: new Error(err).stack };\n if (err && typeof err === \"object\") return {\n name: err.name || err.code || \"Error\",\n message: err.message || err.reason || JSON.stringify(err),\n stack: err.stack || new Error(err.message).stack,\n };\n return { name: \"Error\", message: \"Unknown error\", stack: new Error().stack };\n}\n\n// \u2500\u2500\u2500 Send \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nasync function send(payload: object): Promise<void> {\n try {\n if ((payload as any).message?.includes(\"rapid-processor\")) return;\n await fetch(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": _apiKey,\n },\n body: JSON.stringify(payload),\n });\n } catch {\n // Fail silently \u2014 never break user app\n }\n}\n\n// \u2500\u2500\u2500 Build error payload \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction buildErrorPayload(error: any, context?: string): object {\n const normalized = normalizeError(error);\n const { file, line, column } = parseStack(normalized.stack);\n const { errorType, severity } = classifyError(normalized, context);\n\n return {\n type: \"ERROR\",\n apiKey: _apiKey,\n message: normalized.message,\n code: getErrorCode(error),\n stack: normalized.stack || \"\",\n file,\n line,\n column,\n url: getUrl(),\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n browser: getBrowser(),\n error_category: errorType,\n severity,\n status: \"open\",\n };\n}\n\n// \u2500\u2500\u2500 Browser listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateBrowserListeners(): void {\n // JS runtime errors + resource load errors\n window.addEventListener(\"error\", (event) => {\n if ((event as any).filename?.includes(\"rapid-processor\")) return;\n\n const target = event.target as HTMLElement;\n if (target && target.tagName) {\n const tag = target.tagName;\n const src = (target as any).src || (target as any).href || \"\";\n if ([\"IMG\", \"SCRIPT\", \"LINK\", \"VIDEO\", \"AUDIO\", \"SOURCE\"].includes(tag)) {\n send(buildErrorPayload({\n name: \"ResourceError\",\n message: `${tag} failed to load: ${src}`,\n stack: `at ${window.location.href}`,\n }));\n return;\n }\n }\n\n const err = (event as ErrorEvent).error || {\n name: \"Error\",\n message: (event as ErrorEvent).message,\n stack: `${(event as ErrorEvent).message} at ${(event as ErrorEvent).filename}:${(event as ErrorEvent).lineno}:${(event as ErrorEvent).colno}`,\n };\n send(buildErrorPayload(err));\n }, true);\n\n // Unhandled promise rejections\n window.addEventListener(\"unhandledrejection\", (event) => {\n send(buildErrorPayload(event.reason || { message: \"Unhandled Promise Rejection\" }, \"unhandledrejection\"));\n });\n\n // Intercept fetch\n const originalFetch = window.fetch;\n window.fetch = async function (input: RequestInfo | URL, init?: RequestInit): Promise<Response> {\n const url = typeof input === \"string\" ? input : (input instanceof URL ? input.toString() : (input as Request).url);\n if (url.includes(\"rapid-processor\") || url.includes(\"supabase.co/functions\")) {\n return originalFetch.apply(this, arguments as any);\n }\n try {\n const response = await originalFetch.apply(this, arguments as any);\n if (!response.ok) {\n send(buildErrorPayload({\n name: `API ${response.status} Error`,\n message: `HTTP ${response.status}: ${init?.method || \"GET\"} ${url}`,\n stack: `${init?.method || \"GET\"} ${url} \u2192 ${response.status} ${response.statusText}`,\n status: response.status,\n }));\n }\n return response;\n } catch (err: any) {\n send(buildErrorPayload({\n name: \"FetchError\",\n message: `Fetch failed: ${init?.method || \"GET\"} ${url} \u2014 ${err.message}`,\n stack: err.stack,\n }));\n throw err;\n }\n };\n\n // Intercept XHR\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (method: string, url: string) {\n (this as any)._r_method = method;\n (this as any)._r_url = url;\n return originalOpen.apply(this, arguments as any);\n } as any;\n\n XMLHttpRequest.prototype.send = function () {\n this.addEventListener(\"loadend\", () => {\n const url: string = (this as any)._r_url || \"\";\n const method: string = (this as any)._r_method || \"GET\";\n if (url.includes(\"rapid-processor\")) return;\n if (this.status >= 400 || this.status === 0) {\n send(buildErrorPayload({\n name: `XHR ${this.status} Error`,\n message: `XHR ${this.status}: ${method} ${url}`,\n stack: `${method} ${url} \u2192 ${this.status} ${this.statusText}`,\n status: this.status,\n }));\n }\n });\n return originalSend.apply(this, arguments as any);\n } as any;\n\n // Disconnect when page closes\n window.addEventListener(\"beforeunload\", () => {\n try {\n navigator.sendBeacon(ENDPOINT, JSON.stringify({\n type: \"SDK_DISCONNECTED\",\n apiKey: _apiKey,\n timestamp: new Date().toISOString(),\n environment: \"browser\",\n url: getUrl(),\n }));\n } catch { /* silent */ }\n });\n}\n\n// \u2500\u2500\u2500 Server listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateServerListeners(): void {\n process.on(\"uncaughtException\", (error: Error) => {\n send(buildErrorPayload(error, \"uncaughtexception\"));\n });\n\n process.on(\"unhandledRejection\", (reason: any) => {\n send(buildErrorPayload(\n reason instanceof Error ? reason : { name: \"UnhandledRejection\", message: String(reason), stack: \"\" },\n \"unhandledrejection\"\n ));\n });\n\n const shutdown = async () => {\n await send({\n type: \"SDK_DISCONNECTED\",\n apiKey: _apiKey,\n timestamp: new Date().toISOString(),\n environment: \"server\",\n url: getUrl(),\n });\n process.exit(0);\n };\n\n process.on(\"SIGTERM\", shutdown);\n process.on(\"SIGINT\", shutdown);\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nconst Reportli = {\n init({ apiKey }: { apiKey: string }): void {\n if (!apiKey || _apiKey) return;\n _apiKey = apiKey;\n\n // Send SDK_INITIALIZED once only\n if (isBrowser && typeof localStorage !== \"undefined\") {\n const key = `reportli_init_${apiKey}`;\n if (!localStorage.getItem(key)) {\n localStorage.setItem(key, \"true\");\n send({\n type: \"SDK_INITIALIZED\",\n apiKey: _apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n browser: getBrowser(),\n });\n }\n } else {\n send({\n type: \"SDK_INITIALIZED\",\n apiKey: _apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n browser: getBrowser(),\n });\n }\n\n if (isBrowser) {\n activateBrowserListeners();\n } else if (isNode) {\n activateServerListeners();\n }\n },\n\n capture(error: any): void {\n if (!_apiKey) return;\n send(buildErrorPayload(error, \"manual\"));\n },\n\n errorHandler() {\n return function (err: any, _req: any, _res: any, next: any) {\n send(buildErrorPayload(err, \"express\"));\n next(err);\n };\n },\n};\n\nexport default Reportli;\nexport { Reportli };\n"],
|
|
5
|
-
"mappings": ";;;;;;;;;
|
|
4
|
+
"sourcesContent": ["// src/index.ts \u2014 Reportli SDK v1.0.3\n\nconst ENDPOINT =\n \"https://fahikyfmgdyzejdfftox.supabase.co/functions/v1/rapid-processor\";\n\n// \u2500\u2500\u2500 Types \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\ntype Config = {\n apiKey: string;\n environment?: string;\n};\n\ntype QueueItem = Record<string, unknown>;\n\n// \u2500\u2500\u2500 State \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nlet initialized = false;\nlet _config: Config;\nconst queue: QueueItem[] = [];\nlet flushTimer: ReturnType<typeof setTimeout> | null = null;\nlet isFlushing = false;\n\n// \u2500\u2500\u2500 Queue & Batch Send \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction scheduleFlush() {\n if (flushTimer) return;\n flushTimer = setTimeout(() => {\n flushTimer = null;\n flush();\n }, 2000); // batch every 2 seconds\n}\n\nasync function flush() {\n if (isFlushing || queue.length === 0) return;\n isFlushing = true;\n\n const batch = queue.splice(0, 10); // send max 10 at a time\n\n for (const payload of batch) {\n await sendNow(payload);\n }\n\n isFlushing = false;\n\n if (queue.length > 0) flush(); // flush remaining\n}\n\nasync function sendNow(payload: QueueItem, attempts = 3): Promise<void> {\n for (let i = 0; i < attempts; i++) {\n try {\n const res = await fetch(ENDPOINT, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"x-api-key\": _config?.apiKey ?? \"\",\n },\n body: JSON.stringify(payload),\n });\n if (res.ok) return; // success \u2014 stop retrying\n } catch {\n // network error \u2014 wait before retry\n }\n await sleep(1000 * (i + 1)); // 1s, 2s, 3s\n }\n // give up silently after 3 attempts \u2014 never crash user app\n}\n\nfunction sleep(ms: number) {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\n// \u2500\u2500\u2500 Enqueue \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction enqueue(payload: QueueItem) {\n if (queue.length >= 100) return; // cap queue to prevent memory issues\n queue.push(payload);\n scheduleFlush();\n}\n\n// \u2500\u2500\u2500 Send immediately (for critical messages) \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction sendImmediate(payload: QueueItem) {\n sendNow(payload).catch(() => {}); // fire and forget\n}\n\n// \u2500\u2500\u2500 Helpers \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction getUrl(): string {\n if (typeof window !== \"undefined\") return window.location.href;\n try { return require(\"os\").hostname(); } catch { return \"server\"; }\n}\n\nfunction getBrowser(): string {\n if (typeof navigator !== \"undefined\") return navigator.userAgent;\n return `Node.js ${typeof process !== \"undefined\" ? process.version : \"unknown\"}`;\n}\n\nfunction getEnvironment(): string {\n return _config?.environment ?? (typeof window !== \"undefined\" ? \"browser\" : \"server\");\n}\n\nfunction parseStack(stack: string | undefined): { file: string; line: number; column: number } {\n if (!stack) return { file: \"unknown\", line: 0, column: 0 };\n const match =\n stack.match(/at .+ \\((.+):(\\d+):(\\d+)\\)/) ||\n stack.match(/at (.+):(\\d+):(\\d+)/);\n return {\n file: match?.[1]?.split(\"/\")?.pop() || \"unknown\",\n line: parseInt(match?.[2] || \"0\"),\n column: parseInt(match?.[3] || \"0\"),\n };\n}\n\nfunction getErrorCode(error: any): string {\n return (\n error?.code ||\n error?.status?.toString() ||\n error?.statusCode?.toString() ||\n error?.name ||\n \"ERR_UNKNOWN\"\n );\n}\n\nfunction classifyError(error: any, context?: string): { category: string; severity: \"low\" | \"medium\" | \"high\" | \"critical\" } {\n const msg = String(error?.message || error || \"\").toLowerCase();\n const name = String(error?.name || \"\").toLowerCase();\n\n // Payment \u2014 always critical\n if (msg.includes(\"stripe\") || msg.includes(\"payment\") || msg.includes(\"card declined\") || msg.includes(\"checkout\") || msg.includes(\"refund\"))\n return { category: \"Payment Error\", severity: \"critical\" };\n\n // Auth\n if (msg.includes(\"jwt\") || msg.includes(\"token expired\") || msg.includes(\"unauthorized\") || msg.includes(\"session\") || msg.includes(\"oauth\") || msg.includes(\"login failed\"))\n return { category: \"Auth Error\", severity: \"high\" };\n\n // Database\n if (msg.includes(\"supabase\") || msg.includes(\"database\") || msg.includes(\"query\") || msg.includes(\"connection lost\") || msg.includes(\"transaction\") || msg.includes(\"duplicate key\") || msg.includes(\"foreign key\"))\n return { category: \"Database Error\", severity: \"critical\" };\n\n // React/Next.js\n if (msg.includes(\"hydration\") || msg.includes(\"does not match server\"))\n return { category: \"Hydration Error\", severity: \"high\" };\n if (msg.includes(\"invalid hook\") || msg.includes(\"rules of hooks\"))\n return { category: \"Hook Error\", severity: \"critical\" };\n if (msg.includes(\"render\") || msg.includes(\"error boundary\"))\n return { category: \"Render Error\", severity: \"critical\" };\n if (msg.includes(\"dynamic import\") || msg.includes(\"failed to fetch dynamically\"))\n return { category: \"Import Error\", severity: \"high\" };\n\n // Network\n if (msg.includes(\"cors\") || msg.includes(\"cross-origin\"))\n return { category: \"CORS Error\", severity: \"high\" };\n if (msg.includes(\"fetch failed\") || msg.includes(\"failed to fetch\") || name === \"fetcherror\")\n return { category: \"Network Error\", severity: \"high\" };\n if (msg.includes(\"timeout\") || msg.includes(\"timed out\") || msg.includes(\"etimedout\"))\n return { category: \"Timeout Error\", severity: \"medium\" };\n if (msg.includes(\"websocket\"))\n return { category: \"WebSocket Error\", severity: \"high\" };\n\n // HTTP status codes\n if (msg.includes(\"http 401\") || msg.includes(\"xhr 401\"))\n return { category: \"Auth Error\", severity: \"high\" };\n if (msg.includes(\"http 403\") || msg.includes(\"xhr 403\"))\n return { category: \"Auth Error\", severity: \"high\" };\n if (msg.includes(\"http 404\") || msg.includes(\"xhr 404\"))\n return { category: \"Not Found Error\", severity: \"medium\" };\n if (msg.includes(\"http 500\") || msg.includes(\"xhr 500\"))\n return { category: \"Server Error\", severity: \"critical\" };\n if (msg.includes(\"http 503\") || msg.includes(\"xhr 503\"))\n return { category: \"Server Error\", severity: \"critical\" };\n\n // Memory\n if (msg.includes(\"maximum call stack\") || msg.includes(\"out of memory\") || msg.includes(\"heap limit\"))\n return { category: \"Memory Error\", severity: \"critical\" };\n\n // Server\n if (msg.includes(\"cannot find module\") || msg.includes(\"module not found\"))\n return { category: \"Module Error\", severity: \"critical\" };\n if (msg.includes(\"econnrefused\") || msg.includes(\"connection refused\"))\n return { category: \"Connection Error\", severity: \"critical\" };\n\n // Email & Jobs\n if (msg.includes(\"email\") || msg.includes(\"smtp\") || msg.includes(\"sendgrid\"))\n return { category: \"Email Error\", severity: \"high\" };\n if (msg.includes(\"cron\") || msg.includes(\"webhook\") || msg.includes(\"queue\"))\n return { category: \"Job Error\", severity: \"high\" };\n\n // Files\n if (msg.includes(\"upload\") || msg.includes(\"file size\") || msg.includes(\"invalid file\"))\n return { category: \"File Error\", severity: \"medium\" };\n\n // Storage\n if (msg.includes(\"quota exceeded\") || msg.includes(\"localstorage\") || msg.includes(\"indexeddb\"))\n return { category: \"Storage Error\", severity: \"medium\" };\n\n // JS core\n if (name === \"typeerror\") return { category: \"TypeError\", severity: \"high\" };\n if (name === \"referenceerror\") return { category: \"ReferenceError\", severity: \"critical\" };\n if (name === \"rangeerror\") return { category: \"RangeError\", severity: \"high\" };\n if (name === \"syntaxerror\") return { category: \"SyntaxError\", severity: \"high\" };\n\n // Context based\n if (context === \"unhandledrejection\") return { category: \"Promise Error\", severity: \"medium\" };\n if (context === \"express\") return { category: \"Server Error\", severity: \"high\" };\n if (context === \"resource\") return { category: \"Resource Error\", severity: \"low\" };\n\n return { category: \"Unknown Error\", severity: \"medium\" };\n}\n\nfunction buildErrorPayload(error: any, context?: string): QueueItem {\n const message = error?.message || String(error) || \"Unknown error\";\n const stack = error?.stack || \"\";\n const { file, line, column } = parseStack(stack);\n const { category, severity } = classifyError(error, context);\n\n return {\n type: \"ERROR\",\n apiKey: _config?.apiKey,\n message,\n code: getErrorCode(error),\n stack,\n file,\n line,\n column,\n url: getUrl(),\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n browser: getBrowser(),\n error_category: category,\n severity,\n status: \"open\",\n context: context || \"auto\",\n };\n}\n\n// \u2500\u2500\u2500 Browser Listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateBrowserListeners() {\n // JS errors + resource errors\n window.addEventListener(\"error\", (event) => {\n // Resource load error (img, script, link, video)\n const target = event.target as HTMLElement;\n if (target && target.tagName && [\"IMG\", \"SCRIPT\", \"LINK\", \"VIDEO\", \"AUDIO\"].includes(target.tagName)) {\n const src = (target as any).src || (target as any).href || \"unknown\";\n enqueue(buildErrorPayload({ name: \"ResourceError\", message: `${target.tagName} failed to load: ${src}`, stack: \"\" }, \"resource\"));\n return;\n }\n\n const err = (event as ErrorEvent).error || {\n name: \"Error\",\n message: (event as ErrorEvent).message,\n stack: `at ${(event as ErrorEvent).filename}:${(event as ErrorEvent).lineno}:${(event as ErrorEvent).colno}`,\n };\n enqueue(buildErrorPayload(err, \"window\"));\n }, true);\n\n // Unhandled promise rejections\n window.addEventListener(\"unhandledrejection\", (event) => {\n const err = event.reason instanceof Error\n ? event.reason\n : { name: \"UnhandledRejection\", message: String(event.reason || \"Unhandled Promise Rejection\"), stack: \"\" };\n enqueue(buildErrorPayload(err, \"unhandledrejection\"));\n });\n\n // Intercept fetch \u2014 catches all API errors automatically\n const originalFetch = window.fetch;\n window.fetch = async function (...args: Parameters<typeof fetch>): Promise<Response> {\n const url = typeof args[0] === \"string\"\n ? args[0]\n : args[0] instanceof URL\n ? args[0].toString()\n : (args[0] as Request)?.url ?? \"\";\n\n // Never intercept our own requests\n if (url.includes(\"rapid-processor\")) return originalFetch(...args);\n\n try {\n const response = await originalFetch(...args);\n if (!response.ok) {\n enqueue(buildErrorPayload({\n name: `HTTP_${response.status}`,\n message: `HTTP ${response.status}: ${(args[1] as RequestInit)?.method || \"GET\"} ${url}`,\n stack: `${(args[1] as RequestInit)?.method || \"GET\"} ${url} \u2192 ${response.status} ${response.statusText}`,\n status: response.status,\n }, \"fetch\"));\n }\n return response;\n } catch (err: any) {\n enqueue(buildErrorPayload({\n name: \"FetchError\",\n message: `Fetch failed: ${(args[1] as RequestInit)?.method || \"GET\"} ${url} \u2014 ${err.message}`,\n stack: err.stack,\n }, \"fetch\"));\n throw err;\n }\n };\n\n // Intercept XHR\n const originalOpen = XMLHttpRequest.prototype.open;\n const originalSend = XMLHttpRequest.prototype.send;\n\n XMLHttpRequest.prototype.open = function (method: string, url: string, ...rest: any[]) {\n (this as any)._r_method = method;\n (this as any)._r_url = url;\n return originalOpen.call(this, method, url, ...rest);\n } as any;\n\n XMLHttpRequest.prototype.send = function (...args: any[]) {\n const url: string = (this as any)._r_url || \"\";\n const method: string = (this as any)._r_method || \"GET\";\n\n if (!url.includes(\"rapid-processor\")) {\n this.addEventListener(\"loadend\", () => {\n if (this.status >= 400 || this.status === 0) {\n enqueue(buildErrorPayload({\n name: `XHR_${this.status}`,\n message: `XHR ${this.status}: ${method} ${url}`,\n stack: `${method} ${url} \u2192 ${this.status} ${this.statusText}`,\n status: this.status,\n }, \"xhr\"));\n }\n });\n }\n\n return originalSend.apply(this, args);\n } as any;\n\n // Disconnect when page closes\n window.addEventListener(\"beforeunload\", () => {\n try {\n navigator.sendBeacon(\n ENDPOINT,\n JSON.stringify({\n type: \"SDK_DISCONNECTED\",\n apiKey: _config?.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n })\n );\n } catch { /* silent */ }\n });\n}\n\n// \u2500\u2500\u2500 Server Listeners \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nfunction activateServerListeners() {\n process.on(\"uncaughtException\", (error: Error) => {\n enqueue(buildErrorPayload(error, \"uncaughtException\"));\n flush(); // flush immediately on crash\n });\n\n process.on(\"unhandledRejection\", (reason: any) => {\n enqueue(buildErrorPayload(\n reason instanceof Error ? reason : { name: \"UnhandledRejection\", message: String(reason), stack: \"\" },\n \"unhandledrejection\"\n ));\n });\n\n const shutdown = async (signal: string) => {\n await sendNow({\n type: \"SDK_DISCONNECTED\",\n apiKey: _config?.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n signal,\n });\n process.exit(0);\n };\n\n process.on(\"SIGTERM\", () => shutdown(\"SIGTERM\"));\n process.on(\"SIGINT\", () => shutdown(\"SIGINT\"));\n}\n\n// \u2500\u2500\u2500 Public API \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n\nexport const Reportli = {\n init(cfg: Config) {\n if (initialized) return;\n if (!cfg?.apiKey) return;\n\n _config = cfg;\n initialized = true;\n\n // Send SDK_INITIALIZED immediately \u2014 not queued\n sendImmediate({\n type: \"SDK_INITIALIZED\",\n apiKey: cfg.apiKey,\n timestamp: new Date().toISOString(),\n environment: getEnvironment(),\n url: getUrl(),\n browser: getBrowser(),\n });\n\n // Activate listeners\n if (typeof window !== \"undefined\") {\n activateBrowserListeners();\n } else if (typeof process !== \"undefined\" && process.versions?.node) {\n activateServerListeners();\n }\n },\n\n capture(error: unknown) {\n if (!initialized) return;\n const err = error instanceof Error\n ? error\n : { name: \"ManualCapture\", message: String(error), stack: new Error().stack };\n enqueue(buildErrorPayload(err, \"manual\"));\n },\n\n captureMessage(message: string) {\n if (!initialized) return;\n enqueue(buildErrorPayload({ name: \"Message\", message, stack: \"\" }, \"manual\"));\n },\n\n errorHandler() {\n return function (err: any, _req: any, _res: any, next: any) {\n enqueue(buildErrorPayload(err, \"express\"));\n next(err);\n };\n },\n};\n\nexport default Reportli;\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "reportli",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Enterprise-grade real-time exception tracking and AI-powered diagnostic SDK for client-side, server-side, and full-stack SaaS applications.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"module": "dist/index.mjs",
|