@vestig/next 0.5.0 → 0.8.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/README.md +1 -1
- package/dist/__tests__/mocks/next-server.d.ts.map +1 -1
- package/dist/__tests__/mocks/next-server.js.map +1 -1
- package/dist/client/error-boundary.d.ts +80 -0
- package/dist/client/error-boundary.d.ts.map +1 -0
- package/dist/client/error-boundary.js +182 -0
- package/dist/client/error-boundary.js.map +1 -0
- package/dist/client/index.d.ts +2 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/transport.d.ts +42 -0
- package/dist/client/transport.d.ts.map +1 -1
- package/dist/client/transport.js +143 -2
- package/dist/client/transport.js.map +1 -1
- package/dist/client.d.ts +2 -1
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +2 -0
- package/dist/client.js.map +1 -1
- package/dist/db/drizzle.d.ts +115 -0
- package/dist/db/drizzle.d.ts.map +1 -0
- package/dist/db/drizzle.js +174 -0
- package/dist/db/drizzle.js.map +1 -0
- package/dist/db/index.d.ts +49 -0
- package/dist/db/index.d.ts.map +1 -0
- package/dist/db/index.js +51 -0
- package/dist/db/index.js.map +1 -0
- package/dist/db/prisma.d.ts +114 -0
- package/dist/db/prisma.d.ts.map +1 -0
- package/dist/db/prisma.js +144 -0
- package/dist/db/prisma.js.map +1 -0
- package/dist/db/query-logger.d.ts +30 -0
- package/dist/db/query-logger.d.ts.map +1 -0
- package/dist/db/query-logger.js +169 -0
- package/dist/db/query-logger.js.map +1 -0
- package/dist/db/types.d.ts +102 -0
- package/dist/db/types.d.ts.map +1 -0
- package/dist/db/types.js +28 -0
- package/dist/db/types.js.map +1 -0
- package/dist/dev/api/index.d.ts +13 -0
- package/dist/dev/api/index.d.ts.map +1 -0
- package/dist/dev/api/index.js +13 -0
- package/dist/dev/api/index.js.map +1 -0
- package/dist/dev/api/logs-stream.d.ts +119 -0
- package/dist/dev/api/logs-stream.d.ts.map +1 -0
- package/dist/dev/api/logs-stream.js +156 -0
- package/dist/dev/api/logs-stream.js.map +1 -0
- package/dist/dev/filters.d.ts +17 -0
- package/dist/dev/filters.d.ts.map +1 -0
- package/dist/dev/filters.js +96 -0
- package/dist/dev/filters.js.map +1 -0
- package/dist/dev/hooks/use-logs.d.ts +53 -0
- package/dist/dev/hooks/use-logs.d.ts.map +1 -0
- package/dist/dev/hooks/use-logs.js +205 -0
- package/dist/dev/hooks/use-logs.js.map +1 -0
- package/dist/dev/index.d.ts +35 -0
- package/dist/dev/index.d.ts.map +1 -0
- package/dist/dev/index.js +41 -0
- package/dist/dev/index.js.map +1 -0
- package/dist/dev/log-entry.d.ts +12 -0
- package/dist/dev/log-entry.d.ts.map +1 -0
- package/dist/dev/log-entry.js +152 -0
- package/dist/dev/log-entry.js.map +1 -0
- package/dist/dev/log-viewer.d.ts +11 -0
- package/dist/dev/log-viewer.d.ts.map +1 -0
- package/dist/dev/log-viewer.js +49 -0
- package/dist/dev/log-viewer.js.map +1 -0
- package/dist/dev/metrics-card.d.ts +18 -0
- package/dist/dev/metrics-card.d.ts.map +1 -0
- package/dist/dev/metrics-card.js +75 -0
- package/dist/dev/metrics-card.js.map +1 -0
- package/dist/dev/metrics-histogram.d.ts +12 -0
- package/dist/dev/metrics-histogram.d.ts.map +1 -0
- package/dist/dev/metrics-histogram.js +69 -0
- package/dist/dev/metrics-histogram.js.map +1 -0
- package/dist/dev/metrics-panel.d.ts +10 -0
- package/dist/dev/metrics-panel.d.ts.map +1 -0
- package/dist/dev/metrics-panel.js +84 -0
- package/dist/dev/metrics-panel.js.map +1 -0
- package/dist/dev/overlay.d.ts +55 -0
- package/dist/dev/overlay.d.ts.map +1 -0
- package/dist/dev/overlay.js +204 -0
- package/dist/dev/overlay.js.map +1 -0
- package/dist/dev/store.d.ts +186 -0
- package/dist/dev/store.d.ts.map +1 -0
- package/dist/dev/store.js +214 -0
- package/dist/dev/store.js.map +1 -0
- package/dist/error/boundary.d.ts +36 -0
- package/dist/error/boundary.d.ts.map +1 -0
- package/dist/error/boundary.js +263 -0
- package/dist/error/boundary.js.map +1 -0
- package/dist/error/breadcrumbs.d.ts +95 -0
- package/dist/error/breadcrumbs.d.ts.map +1 -0
- package/dist/error/breadcrumbs.js +273 -0
- package/dist/error/breadcrumbs.js.map +1 -0
- package/dist/error/fingerprint.d.ts +42 -0
- package/dist/error/fingerprint.d.ts.map +1 -0
- package/dist/error/fingerprint.js +135 -0
- package/dist/error/fingerprint.js.map +1 -0
- package/dist/error/index.d.ts +52 -0
- package/dist/error/index.d.ts.map +1 -0
- package/dist/error/index.js +56 -0
- package/dist/error/index.js.map +1 -0
- package/dist/error/stack-parser.d.ts +43 -0
- package/dist/error/stack-parser.d.ts.map +1 -0
- package/dist/error/stack-parser.js +166 -0
- package/dist/error/stack-parser.js.map +1 -0
- package/dist/error/types.d.ts +152 -0
- package/dist/error/types.d.ts.map +1 -0
- package/dist/error/types.js +10 -0
- package/dist/error/types.js.map +1 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/metrics/hooks/use-route-metrics.d.ts +91 -0
- package/dist/metrics/hooks/use-route-metrics.d.ts.map +1 -0
- package/dist/metrics/hooks/use-route-metrics.js +216 -0
- package/dist/metrics/hooks/use-route-metrics.js.map +1 -0
- package/dist/metrics/hooks/use-web-vitals.d.ts +70 -0
- package/dist/metrics/hooks/use-web-vitals.d.ts.map +1 -0
- package/dist/metrics/hooks/use-web-vitals.js +146 -0
- package/dist/metrics/hooks/use-web-vitals.js.map +1 -0
- package/dist/metrics/index.d.ts +51 -0
- package/dist/metrics/index.d.ts.map +1 -0
- package/dist/metrics/index.js +56 -0
- package/dist/metrics/index.js.map +1 -0
- package/dist/metrics/reporter.d.ts +87 -0
- package/dist/metrics/reporter.d.ts.map +1 -0
- package/dist/metrics/reporter.js +178 -0
- package/dist/metrics/reporter.js.map +1 -0
- package/dist/metrics/store.d.ts +34 -0
- package/dist/metrics/store.d.ts.map +1 -0
- package/dist/metrics/store.js +172 -0
- package/dist/metrics/store.js.map +1 -0
- package/dist/metrics/thresholds.d.ts +84 -0
- package/dist/metrics/thresholds.d.ts.map +1 -0
- package/dist/metrics/thresholds.js +148 -0
- package/dist/metrics/thresholds.js.map +1 -0
- package/dist/metrics/types.d.ts +211 -0
- package/dist/metrics/types.d.ts.map +1 -0
- package/dist/metrics/types.js +10 -0
- package/dist/metrics/types.js.map +1 -0
- package/dist/metrics/web-vitals.d.ts +72 -0
- package/dist/metrics/web-vitals.d.ts.map +1 -0
- package/dist/metrics/web-vitals.js +89 -0
- package/dist/metrics/web-vitals.js.map +1 -0
- package/dist/server/middleware.d.ts.map +1 -1
- package/dist/server/middleware.js +51 -37
- package/dist/server/middleware.js.map +1 -1
- package/dist/server/route-handler.d.ts.map +1 -1
- package/dist/server/route-handler.js +61 -40
- package/dist/server/route-handler.js.map +1 -1
- package/dist/server/server-action.d.ts.map +1 -1
- package/dist/server/server-action.js +54 -33
- package/dist/server/server-action.js.map +1 -1
- package/dist/types.d.ts +6 -2
- package/dist/types.d.ts.map +1 -1
- package/package.json +28 -6
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# @vestig/next
|
|
2
2
|
|
|
3
|
-
First-class structured logging for Next.js applications. Built on top of [vestig](https://github.com/
|
|
3
|
+
First-class structured logging for Next.js 15+ applications. Built on top of [vestig](https://github.com/Arakiss/vestig), this package provides automatic request correlation, middleware integration, and seamless client/server logging.
|
|
4
4
|
|
|
5
5
|
## Features
|
|
6
6
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-server.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/next-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACjB,GACJ,eAAe,CAyCjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE;QACR,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,YAAY,EAAE,eAAe,CAAA;QAC7B,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,MAAM,CAAA;KACtB,CAAA;IACD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,EAAE,MAAM,eAAe,CAAA;CAC5B;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC5B,SAAgB,MAAM,EAAE,MAAM,CAAA;IAC9B,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY;IAO/C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY;IAM9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,GAMrC,2BAA2B;IAG/C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,SAAM;IAM/C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAM1B,IAAI;IAIJ,IAAI;CAGV;AAED,UAAU,2BAA4B,SAAQ,gBAAgB;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACvC;AAED,wBAAgB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"next-server.d.ts","sourceRoot":"","sources":["../../../src/__tests__/mocks/next-server.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,qBAAqB,CACpC,GAAG,EAAE,MAAM,EACX,OAAO,GAAE;IACR,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IAChC,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CACjB,GACJ,eAAe,CAyCjB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC/B,MAAM,EAAE,MAAM,CAAA;IACd,GAAG,EAAE,MAAM,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE;QACR,QAAQ,EAAE,MAAM,CAAA;QAChB,MAAM,EAAE,MAAM,CAAA;QACd,YAAY,EAAE,eAAe,CAAA;QAC7B,IAAI,EAAE,MAAM,CAAA;QACZ,MAAM,EAAE,MAAM,CAAA;QACd,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,CAAA;QAChB,IAAI,EAAE,MAAM,CAAA;QACZ,QAAQ,EAAE,MAAM,MAAM,CAAA;KACtB,CAAA;IACD,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,GAAG,CAAC,EAAE;QACL,IAAI,CAAC,EAAE,MAAM,CAAA;QACb,OAAO,CAAC,EAAE,MAAM,CAAA;QAChB,MAAM,CAAC,EAAE,MAAM,CAAA;KACf,CAAA;IACD,IAAI,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;IAC5B,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAA;IAC3B,KAAK,EAAE,MAAM,eAAe,CAAA;CAC5B;AAED;;GAEG;AACH,qBAAa,gBAAgB;IAC5B,SAAgB,MAAM,EAAE,MAAM,CAAA;IAC9B,SAAgB,UAAU,EAAE,MAAM,CAAA;IAClC,SAAgB,OAAO,EAAE,OAAO,CAAA;IAChC,OAAO,CAAC,KAAK,CAAS;gBAEV,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY;IAO/C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,YAAY;IAM9C,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE;YAAE,OAAO,CAAC,EAAE,OAAO,CAAA;SAAE,CAAA;KAAE,GAMrC,2BAA2B;IAG/C,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,EAAE,MAAM,SAAM;IAM/C,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG;IAM1B,IAAI;IAIJ,IAAI;CAGV;AAED,UAAU,2BAA4B,SAAQ,gBAAgB;IAC7D,eAAe,CAAC,EAAE,OAAO,CAAA;CACzB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CACvC;AAED,wBAAgB,sBAAsB,CAAC,MAAM,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GAAG,gBAAgB,CAI5F"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"next-server.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/next-server.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"next-server.js","sourceRoot":"","sources":["../../../src/__tests__/mocks/next-server.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { type ErrorInfo, type ReactNode } from 'react';
|
|
2
|
+
import type { LogEntry } from 'vestig';
|
|
3
|
+
/**
|
|
4
|
+
* Breadcrumb entry for error context
|
|
5
|
+
*/
|
|
6
|
+
export interface Breadcrumb {
|
|
7
|
+
timestamp: string;
|
|
8
|
+
level: string;
|
|
9
|
+
message: string;
|
|
10
|
+
namespace?: string;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Props for VestigErrorBoundary
|
|
14
|
+
*/
|
|
15
|
+
export interface VestigErrorBoundaryProps {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
/** Custom fallback UI (string, ReactNode, or function) */
|
|
18
|
+
fallback?: ReactNode | ((error: Error, errorInfo: ErrorInfo) => ReactNode);
|
|
19
|
+
/** Callback when error is caught */
|
|
20
|
+
onError?: (error: Error, errorInfo: ErrorInfo) => void;
|
|
21
|
+
/** Maximum breadcrumbs to keep (default: 20) */
|
|
22
|
+
maxBreadcrumbs?: number;
|
|
23
|
+
/** Whether to reset error state on navigation (default: true) */
|
|
24
|
+
resetOnNavigation?: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Add a breadcrumb (called from logging hooks)
|
|
28
|
+
*/
|
|
29
|
+
export declare function addBreadcrumb(entry: Partial<LogEntry>): void;
|
|
30
|
+
/**
|
|
31
|
+
* Get recent breadcrumbs
|
|
32
|
+
*/
|
|
33
|
+
export declare function getBreadcrumbs(): readonly Breadcrumb[];
|
|
34
|
+
/**
|
|
35
|
+
* Clear all breadcrumbs
|
|
36
|
+
*/
|
|
37
|
+
export declare function clearBreadcrumbs(): void;
|
|
38
|
+
/**
|
|
39
|
+
* Error boundary component that automatically logs errors to Vestig
|
|
40
|
+
*
|
|
41
|
+
* Features:
|
|
42
|
+
* - Automatic error logging with full stack trace
|
|
43
|
+
* - Breadcrumb trail of recent logs before error
|
|
44
|
+
* - Component stack for debugging
|
|
45
|
+
* - Customizable fallback UI
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```tsx
|
|
49
|
+
* import { VestigErrorBoundary } from '@vestig/next/client'
|
|
50
|
+
*
|
|
51
|
+
* export default function Layout({ children }) {
|
|
52
|
+
* return (
|
|
53
|
+
* <VestigProvider>
|
|
54
|
+
* <VestigErrorBoundary
|
|
55
|
+
* fallback={<ErrorPage />}
|
|
56
|
+
* onError={(error) => console.error('Caught:', error)}
|
|
57
|
+
* >
|
|
58
|
+
* {children}
|
|
59
|
+
* </VestigErrorBoundary>
|
|
60
|
+
* </VestigProvider>
|
|
61
|
+
* )
|
|
62
|
+
* }
|
|
63
|
+
* ```
|
|
64
|
+
*
|
|
65
|
+
* @example Custom fallback function
|
|
66
|
+
* ```tsx
|
|
67
|
+
* <VestigErrorBoundary
|
|
68
|
+
* fallback={(error, errorInfo) => (
|
|
69
|
+
* <div>
|
|
70
|
+
* <h1>Error: {error.message}</h1>
|
|
71
|
+
* <pre>{errorInfo.componentStack}</pre>
|
|
72
|
+
* </div>
|
|
73
|
+
* )}
|
|
74
|
+
* >
|
|
75
|
+
* {children}
|
|
76
|
+
* </VestigErrorBoundary>
|
|
77
|
+
* ```
|
|
78
|
+
*/
|
|
79
|
+
export declare function VestigErrorBoundary(props: VestigErrorBoundaryProps): ReactNode;
|
|
80
|
+
//# sourceMappingURL=error-boundary.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary.d.ts","sourceRoot":"","sources":["../../src/client/error-boundary.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAa,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AACjE,OAAO,KAAK,EAAU,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAG9C;;GAEG;AACH,MAAM,WAAW,UAAU;IAC1B,SAAS,EAAE,MAAM,CAAA;IACjB,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,CAAA;IACf,SAAS,CAAC,EAAE,MAAM,CAAA;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,wBAAwB;IACxC,QAAQ,EAAE,SAAS,CAAA;IACnB,0DAA0D;IAC1D,QAAQ,CAAC,EAAE,SAAS,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,SAAS,CAAC,CAAA;IAC1E,oCAAoC;IACpC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,KAAK,IAAI,CAAA;IACtD,gDAAgD;IAChD,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,iEAAiE;IACjE,iBAAiB,CAAC,EAAE,OAAO,CAAA;CAC3B;AAiBD;;GAEG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG,IAAI,CAY5D;AAED;;GAEG;AACH,wBAAgB,cAAc,IAAI,SAAS,UAAU,EAAE,CAEtD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,IAAI,IAAI,CAEvC;AA6ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,wBAAwB,GAAG,SAAS,CAE9E"}
|
|
@@ -0,0 +1,182 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { Component } from 'react';
|
|
4
|
+
import { useVestigContext } from './provider';
|
|
5
|
+
/**
|
|
6
|
+
* Breadcrumb storage (module-level for simplicity)
|
|
7
|
+
*/
|
|
8
|
+
const breadcrumbs = [];
|
|
9
|
+
let maxBreadcrumbSize = 20;
|
|
10
|
+
/**
|
|
11
|
+
* Add a breadcrumb (called from logging hooks)
|
|
12
|
+
*/
|
|
13
|
+
export function addBreadcrumb(entry) {
|
|
14
|
+
breadcrumbs.push({
|
|
15
|
+
timestamp: entry.timestamp ?? new Date().toISOString(),
|
|
16
|
+
level: entry.level ?? 'info',
|
|
17
|
+
message: entry.message ?? '',
|
|
18
|
+
namespace: entry.namespace,
|
|
19
|
+
});
|
|
20
|
+
// Trim to max size
|
|
21
|
+
while (breadcrumbs.length > maxBreadcrumbSize) {
|
|
22
|
+
breadcrumbs.shift();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Get recent breadcrumbs
|
|
27
|
+
*/
|
|
28
|
+
export function getBreadcrumbs() {
|
|
29
|
+
return breadcrumbs;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Clear all breadcrumbs
|
|
33
|
+
*/
|
|
34
|
+
export function clearBreadcrumbs() {
|
|
35
|
+
breadcrumbs.length = 0;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Inner error boundary class component
|
|
39
|
+
*/
|
|
40
|
+
class VestigErrorBoundaryInner extends Component {
|
|
41
|
+
constructor(props) {
|
|
42
|
+
super(props);
|
|
43
|
+
this.state = {
|
|
44
|
+
hasError: false,
|
|
45
|
+
error: null,
|
|
46
|
+
errorInfo: null,
|
|
47
|
+
};
|
|
48
|
+
// Update max breadcrumb size
|
|
49
|
+
if (props.maxBreadcrumbs !== undefined) {
|
|
50
|
+
maxBreadcrumbSize = props.maxBreadcrumbs;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
static getDerivedStateFromError(error) {
|
|
54
|
+
return { hasError: true, error };
|
|
55
|
+
}
|
|
56
|
+
componentDidCatch(error, errorInfo) {
|
|
57
|
+
this.setState({ errorInfo });
|
|
58
|
+
// Log the error with vestig
|
|
59
|
+
if (this.props.logger) {
|
|
60
|
+
this.props.logger.error('React component error', {
|
|
61
|
+
error: {
|
|
62
|
+
name: error.name,
|
|
63
|
+
message: error.message,
|
|
64
|
+
stack: error.stack,
|
|
65
|
+
},
|
|
66
|
+
componentStack: errorInfo.componentStack,
|
|
67
|
+
breadcrumbs: getBreadcrumbs(),
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
// Call custom error handler
|
|
71
|
+
this.props.onError?.(error, errorInfo);
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Reset error state
|
|
75
|
+
*/
|
|
76
|
+
resetError = () => {
|
|
77
|
+
this.setState({
|
|
78
|
+
hasError: false,
|
|
79
|
+
error: null,
|
|
80
|
+
errorInfo: null,
|
|
81
|
+
});
|
|
82
|
+
clearBreadcrumbs();
|
|
83
|
+
};
|
|
84
|
+
render() {
|
|
85
|
+
const { hasError, error, errorInfo } = this.state;
|
|
86
|
+
const { children, fallback } = this.props;
|
|
87
|
+
if (hasError && error) {
|
|
88
|
+
// Render fallback UI
|
|
89
|
+
if (typeof fallback === 'function') {
|
|
90
|
+
return fallback(error, errorInfo);
|
|
91
|
+
}
|
|
92
|
+
if (fallback !== undefined) {
|
|
93
|
+
return fallback;
|
|
94
|
+
}
|
|
95
|
+
// Default fallback
|
|
96
|
+
return (_jsxs("div", { role: "alert", style: {
|
|
97
|
+
padding: '20px',
|
|
98
|
+
margin: '20px',
|
|
99
|
+
backgroundColor: '#fee2e2',
|
|
100
|
+
border: '1px solid #ef4444',
|
|
101
|
+
borderRadius: '8px',
|
|
102
|
+
fontFamily: 'system-ui, sans-serif',
|
|
103
|
+
}, children: [_jsx("h2", { style: { color: '#dc2626', marginTop: 0 }, children: "Something went wrong" }), _jsx("p", { style: { color: '#7f1d1d' }, children: error.message }), _jsx("button", { onClick: this.resetError, style: {
|
|
104
|
+
padding: '8px 16px',
|
|
105
|
+
backgroundColor: '#dc2626',
|
|
106
|
+
color: 'white',
|
|
107
|
+
border: 'none',
|
|
108
|
+
borderRadius: '4px',
|
|
109
|
+
cursor: 'pointer',
|
|
110
|
+
}, children: "Try again" }), process.env.NODE_ENV === 'development' && error.stack && (_jsx("pre", { style: {
|
|
111
|
+
marginTop: '16px',
|
|
112
|
+
padding: '12px',
|
|
113
|
+
backgroundColor: '#fecaca',
|
|
114
|
+
borderRadius: '4px',
|
|
115
|
+
fontSize: '12px',
|
|
116
|
+
overflow: 'auto',
|
|
117
|
+
whiteSpace: 'pre-wrap',
|
|
118
|
+
wordBreak: 'break-word',
|
|
119
|
+
}, children: error.stack }))] }));
|
|
120
|
+
}
|
|
121
|
+
return children;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* Wrapper to inject logger from context
|
|
126
|
+
*/
|
|
127
|
+
function VestigErrorBoundaryWrapper(props) {
|
|
128
|
+
let logger = null;
|
|
129
|
+
try {
|
|
130
|
+
const context = useVestigContext();
|
|
131
|
+
logger = context.logger;
|
|
132
|
+
}
|
|
133
|
+
catch {
|
|
134
|
+
// VestigProvider not available, log will be skipped
|
|
135
|
+
}
|
|
136
|
+
return _jsx(VestigErrorBoundaryInner, { ...props, logger: logger });
|
|
137
|
+
}
|
|
138
|
+
/**
|
|
139
|
+
* Error boundary component that automatically logs errors to Vestig
|
|
140
|
+
*
|
|
141
|
+
* Features:
|
|
142
|
+
* - Automatic error logging with full stack trace
|
|
143
|
+
* - Breadcrumb trail of recent logs before error
|
|
144
|
+
* - Component stack for debugging
|
|
145
|
+
* - Customizable fallback UI
|
|
146
|
+
*
|
|
147
|
+
* @example
|
|
148
|
+
* ```tsx
|
|
149
|
+
* import { VestigErrorBoundary } from '@vestig/next/client'
|
|
150
|
+
*
|
|
151
|
+
* export default function Layout({ children }) {
|
|
152
|
+
* return (
|
|
153
|
+
* <VestigProvider>
|
|
154
|
+
* <VestigErrorBoundary
|
|
155
|
+
* fallback={<ErrorPage />}
|
|
156
|
+
* onError={(error) => console.error('Caught:', error)}
|
|
157
|
+
* >
|
|
158
|
+
* {children}
|
|
159
|
+
* </VestigErrorBoundary>
|
|
160
|
+
* </VestigProvider>
|
|
161
|
+
* )
|
|
162
|
+
* }
|
|
163
|
+
* ```
|
|
164
|
+
*
|
|
165
|
+
* @example Custom fallback function
|
|
166
|
+
* ```tsx
|
|
167
|
+
* <VestigErrorBoundary
|
|
168
|
+
* fallback={(error, errorInfo) => (
|
|
169
|
+
* <div>
|
|
170
|
+
* <h1>Error: {error.message}</h1>
|
|
171
|
+
* <pre>{errorInfo.componentStack}</pre>
|
|
172
|
+
* </div>
|
|
173
|
+
* )}
|
|
174
|
+
* >
|
|
175
|
+
* {children}
|
|
176
|
+
* </VestigErrorBoundary>
|
|
177
|
+
* ```
|
|
178
|
+
*/
|
|
179
|
+
export function VestigErrorBoundary(props) {
|
|
180
|
+
return _jsx(VestigErrorBoundaryWrapper, { ...props });
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=error-boundary.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-boundary.js","sourceRoot":"","sources":["../../src/client/error-boundary.tsx"],"names":[],"mappings":"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"}
|
package/dist/client/index.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export { VestigProvider, useVestigContext, type VestigProviderProps } from './provider';
|
|
2
2
|
export { useLogger, useCorrelationContext, useVestigConnection, useComponentLogger, useRenderLogger, } from './hooks';
|
|
3
|
-
export {
|
|
3
|
+
export { VestigErrorBoundary, addBreadcrumb, getBreadcrumbs, clearBreadcrumbs, type VestigErrorBoundaryProps, type Breadcrumb, } from './error-boundary';
|
|
4
|
+
export { ClientHTTPTransport, createClientTransport, type ClientHTTPTransportConfig, type OfflineQueueConfig, } from './transport';
|
|
4
5
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGvF,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EACN,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,yBAAyB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAGvF,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,SAAS,CAAA;AAGhB,OAAO,EACN,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,gBAAgB,EAChB,KAAK,wBAAwB,EAC7B,KAAK,UAAU,GACf,MAAM,kBAAkB,CAAA;AAGzB,OAAO,EACN,mBAAmB,EACnB,qBAAqB,EACrB,KAAK,yBAAyB,EAC9B,KAAK,kBAAkB,GACvB,MAAM,aAAa,CAAA"}
|
package/dist/client/index.js
CHANGED
|
@@ -4,6 +4,8 @@
|
|
|
4
4
|
export { VestigProvider, useVestigContext } from './provider';
|
|
5
5
|
// Hooks
|
|
6
6
|
export { useLogger, useCorrelationContext, useVestigConnection, useComponentLogger, useRenderLogger, } from './hooks';
|
|
7
|
+
// Error Boundary
|
|
8
|
+
export { VestigErrorBoundary, addBreadcrumb, getBreadcrumbs, clearBreadcrumbs, } from './error-boundary';
|
|
7
9
|
// Transport (for advanced use cases)
|
|
8
10
|
export { ClientHTTPTransport, createClientTransport, } from './transport';
|
|
9
11
|
//# sourceMappingURL=index.js.map
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,8CAA8C;AAE9C,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA4B,MAAM,YAAY,CAAA;AAEvF,QAAQ;AACR,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,SAAS,CAAA;AAEhB,qCAAqC;AACrC,OAAO,EACN,mBAAmB,EACnB,qBAAqB,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAA;AAEZ,8CAA8C;AAE9C,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAA4B,MAAM,YAAY,CAAA;AAEvF,QAAQ;AACR,OAAO,EACN,SAAS,EACT,qBAAqB,EACrB,mBAAmB,EACnB,kBAAkB,EAClB,eAAe,GACf,MAAM,SAAS,CAAA;AAEhB,iBAAiB;AACjB,OAAO,EACN,mBAAmB,EACnB,aAAa,EACb,cAAc,EACd,gBAAgB,GAGhB,MAAM,kBAAkB,CAAA;AAEzB,qCAAqC;AACrC,OAAO,EACN,mBAAmB,EACnB,qBAAqB,GAGrB,MAAM,aAAa,CAAA"}
|
|
@@ -1,4 +1,19 @@
|
|
|
1
1
|
import type { LogEntry, Transport, TransportConfig } from 'vestig';
|
|
2
|
+
/**
|
|
3
|
+
* Configuration for offline queue persistence
|
|
4
|
+
*/
|
|
5
|
+
export interface OfflineQueueConfig {
|
|
6
|
+
/** Enable offline queue persistence (default: true) */
|
|
7
|
+
enabled?: boolean;
|
|
8
|
+
/** localStorage key for persisted queue (default: 'vestig:offline-queue') */
|
|
9
|
+
storageKey?: string;
|
|
10
|
+
/** Maximum entries to persist (default: 1000) */
|
|
11
|
+
maxSize?: number;
|
|
12
|
+
/** Callback when queue is restored from storage */
|
|
13
|
+
onRestore?: (count: number) => void;
|
|
14
|
+
/** Callback when queue is persisted to storage */
|
|
15
|
+
onPersist?: (count: number) => void;
|
|
16
|
+
}
|
|
2
17
|
/**
|
|
3
18
|
* Configuration for ClientHTTPTransport
|
|
4
19
|
*/
|
|
@@ -19,6 +34,8 @@ export interface ClientHTTPTransportConfig extends TransportConfig {
|
|
|
19
34
|
onFlushError?: (error: Error) => void;
|
|
20
35
|
/** Callback when logs are dropped */
|
|
21
36
|
onDrop?: (count: number) => void;
|
|
37
|
+
/** Offline queue configuration for persistence */
|
|
38
|
+
offlineQueue?: OfflineQueueConfig;
|
|
22
39
|
}
|
|
23
40
|
/**
|
|
24
41
|
* HTTP transport for client-side log batching
|
|
@@ -28,6 +45,7 @@ export interface ClientHTTPTransportConfig extends TransportConfig {
|
|
|
28
45
|
* - Retry with exponential backoff
|
|
29
46
|
* - Uses keepalive for beforeunload reliability
|
|
30
47
|
* - Automatic page metadata enrichment
|
|
48
|
+
* - Offline queue persistence with localStorage
|
|
31
49
|
*/
|
|
32
50
|
export declare class ClientHTTPTransport implements Transport {
|
|
33
51
|
readonly name: string;
|
|
@@ -40,17 +58,41 @@ export declare class ClientHTTPTransport implements Transport {
|
|
|
40
58
|
private onFlushSuccess?;
|
|
41
59
|
private onFlushError?;
|
|
42
60
|
private onDrop?;
|
|
61
|
+
private offlineEnabled;
|
|
62
|
+
private offlineStorageKey;
|
|
63
|
+
private offlineMaxSize;
|
|
64
|
+
private onOfflineRestore?;
|
|
65
|
+
private onOfflinePersist?;
|
|
43
66
|
private buffer;
|
|
44
67
|
private flushTimer;
|
|
45
68
|
private isFlushing;
|
|
46
69
|
private isDestroyed;
|
|
47
70
|
private maxBufferSize;
|
|
71
|
+
private isOnline;
|
|
72
|
+
private boundOnlineHandler;
|
|
73
|
+
private boundOfflineHandler;
|
|
48
74
|
constructor(config: ClientHTTPTransportConfig);
|
|
49
75
|
init(): Promise<void>;
|
|
76
|
+
private handleOnline;
|
|
77
|
+
private handleOffline;
|
|
78
|
+
private restoreOfflineQueue;
|
|
79
|
+
private persistOfflineQueue;
|
|
50
80
|
log(entry: LogEntry): void;
|
|
51
81
|
flush(): Promise<void>;
|
|
52
82
|
private sendWithRetry;
|
|
53
83
|
destroy(): Promise<void>;
|
|
84
|
+
/**
|
|
85
|
+
* Get current online status
|
|
86
|
+
*/
|
|
87
|
+
getOnlineStatus(): boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Get current buffer size
|
|
90
|
+
*/
|
|
91
|
+
getBufferSize(): number;
|
|
92
|
+
/**
|
|
93
|
+
* Manually trigger offline queue persistence
|
|
94
|
+
*/
|
|
95
|
+
persistNow(): void;
|
|
54
96
|
}
|
|
55
97
|
/**
|
|
56
98
|
* Create a client HTTP transport with default configuration
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,QAAQ,CAAA;AAElE;;GAEG;AACH,MAAM,WAAW,yBAA0B,SAAQ,eAAe;IACjE,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAA;IACX,iDAAiD;IACjD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,2CAA2C;IAC3C,aAAa,CAAC,EAAE,MAAM,CAAA;IACtB,sCAAsC;IACtC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,wCAAwC;IACxC,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,mCAAmC;IACnC,cAAc,CAAC,EAAE,MAAM,IAAI,CAAA;IAC3B,8BAA8B;IAC9B,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAA;IACrC,qCAAqC;IACrC,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;
|
|
1
|
+
{"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../src/client/transport.ts"],"names":[],"mappings":"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"}
|
package/dist/client/transport.js
CHANGED
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* - Retry with exponential backoff
|
|
8
8
|
* - Uses keepalive for beforeunload reliability
|
|
9
9
|
* - Automatic page metadata enrichment
|
|
10
|
+
* - Offline queue persistence with localStorage
|
|
10
11
|
*/
|
|
11
12
|
export class ClientHTTPTransport {
|
|
12
13
|
name;
|
|
@@ -19,11 +20,20 @@ export class ClientHTTPTransport {
|
|
|
19
20
|
onFlushSuccess;
|
|
20
21
|
onFlushError;
|
|
21
22
|
onDrop;
|
|
23
|
+
// Offline queue config
|
|
24
|
+
offlineEnabled;
|
|
25
|
+
offlineStorageKey;
|
|
26
|
+
offlineMaxSize;
|
|
27
|
+
onOfflineRestore;
|
|
28
|
+
onOfflinePersist;
|
|
22
29
|
buffer = [];
|
|
23
30
|
flushTimer = null;
|
|
24
31
|
isFlushing = false;
|
|
25
32
|
isDestroyed = false;
|
|
26
33
|
maxBufferSize = 500;
|
|
34
|
+
isOnline = true;
|
|
35
|
+
boundOnlineHandler;
|
|
36
|
+
boundOfflineHandler;
|
|
27
37
|
constructor(config) {
|
|
28
38
|
this.name = config.name;
|
|
29
39
|
this.config = { name: config.name, enabled: config.enabled ?? true };
|
|
@@ -35,13 +45,104 @@ export class ClientHTTPTransport {
|
|
|
35
45
|
this.onFlushSuccess = config.onFlushSuccess;
|
|
36
46
|
this.onFlushError = config.onFlushError;
|
|
37
47
|
this.onDrop = config.onDrop;
|
|
48
|
+
// Offline queue settings
|
|
49
|
+
const offlineConfig = config.offlineQueue ?? {};
|
|
50
|
+
this.offlineEnabled = offlineConfig.enabled ?? true;
|
|
51
|
+
this.offlineStorageKey = offlineConfig.storageKey ?? 'vestig:offline-queue';
|
|
52
|
+
this.offlineMaxSize = offlineConfig.maxSize ?? 1000;
|
|
53
|
+
this.onOfflineRestore = offlineConfig.onRestore;
|
|
54
|
+
this.onOfflinePersist = offlineConfig.onPersist;
|
|
55
|
+
// Initialize network status (default to true if navigator.onLine is not available)
|
|
56
|
+
this.isOnline =
|
|
57
|
+
typeof navigator !== 'undefined' && navigator.onLine !== undefined ? navigator.onLine : true;
|
|
58
|
+
// Bind handlers for cleanup
|
|
59
|
+
this.boundOnlineHandler = this.handleOnline.bind(this);
|
|
60
|
+
this.boundOfflineHandler = this.handleOffline.bind(this);
|
|
38
61
|
}
|
|
39
62
|
async init() {
|
|
63
|
+
// Restore offline queue if any
|
|
64
|
+
if (this.offlineEnabled) {
|
|
65
|
+
this.restoreOfflineQueue();
|
|
66
|
+
}
|
|
67
|
+
// Listen for network status changes
|
|
68
|
+
if (typeof window !== 'undefined') {
|
|
69
|
+
window.addEventListener('online', this.boundOnlineHandler);
|
|
70
|
+
window.addEventListener('offline', this.boundOfflineHandler);
|
|
71
|
+
}
|
|
40
72
|
// Start flush timer
|
|
41
73
|
this.flushTimer = setInterval(() => {
|
|
42
74
|
this.flush();
|
|
43
75
|
}, this.flushInterval);
|
|
44
76
|
}
|
|
77
|
+
handleOnline() {
|
|
78
|
+
this.isOnline = true;
|
|
79
|
+
// Attempt to flush when back online
|
|
80
|
+
this.flush();
|
|
81
|
+
}
|
|
82
|
+
handleOffline() {
|
|
83
|
+
this.isOnline = false;
|
|
84
|
+
// Persist current buffer to offline storage
|
|
85
|
+
if (this.offlineEnabled && this.buffer.length > 0) {
|
|
86
|
+
this.persistOfflineQueue();
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
restoreOfflineQueue() {
|
|
90
|
+
if (typeof localStorage === 'undefined')
|
|
91
|
+
return;
|
|
92
|
+
try {
|
|
93
|
+
const stored = localStorage.getItem(this.offlineStorageKey);
|
|
94
|
+
if (!stored)
|
|
95
|
+
return;
|
|
96
|
+
const entries = JSON.parse(stored);
|
|
97
|
+
if (!Array.isArray(entries) || entries.length === 0)
|
|
98
|
+
return;
|
|
99
|
+
// Add restored entries to the front of the buffer
|
|
100
|
+
this.buffer.unshift(...entries);
|
|
101
|
+
// Enforce max buffer size
|
|
102
|
+
if (this.buffer.length > this.maxBufferSize) {
|
|
103
|
+
const excess = this.buffer.length - this.maxBufferSize;
|
|
104
|
+
this.buffer.splice(this.maxBufferSize);
|
|
105
|
+
this.onDrop?.(excess);
|
|
106
|
+
}
|
|
107
|
+
// Clear stored queue
|
|
108
|
+
localStorage.removeItem(this.offlineStorageKey);
|
|
109
|
+
this.onOfflineRestore?.(entries.length);
|
|
110
|
+
}
|
|
111
|
+
catch {
|
|
112
|
+
// Silently ignore parsing errors
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
persistOfflineQueue() {
|
|
116
|
+
if (typeof localStorage === 'undefined')
|
|
117
|
+
return;
|
|
118
|
+
try {
|
|
119
|
+
// Merge existing stored entries with current buffer
|
|
120
|
+
let toStore = [...this.buffer];
|
|
121
|
+
const existingStored = localStorage.getItem(this.offlineStorageKey);
|
|
122
|
+
if (existingStored) {
|
|
123
|
+
try {
|
|
124
|
+
const existing = JSON.parse(existingStored);
|
|
125
|
+
if (Array.isArray(existing)) {
|
|
126
|
+
toStore = [...existing, ...toStore];
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
catch {
|
|
130
|
+
// Ignore parse errors
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
// Enforce max size
|
|
134
|
+
if (toStore.length > this.offlineMaxSize) {
|
|
135
|
+
const excess = toStore.length - this.offlineMaxSize;
|
|
136
|
+
toStore = toStore.slice(excess);
|
|
137
|
+
this.onDrop?.(excess);
|
|
138
|
+
}
|
|
139
|
+
localStorage.setItem(this.offlineStorageKey, JSON.stringify(toStore));
|
|
140
|
+
this.onOfflinePersist?.(toStore.length);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
// Silently ignore storage errors (quota exceeded, etc.)
|
|
144
|
+
}
|
|
145
|
+
}
|
|
45
146
|
log(entry) {
|
|
46
147
|
if (this.isDestroyed)
|
|
47
148
|
return;
|
|
@@ -74,6 +175,13 @@ export class ClientHTTPTransport {
|
|
|
74
175
|
if (this.isFlushing || this.buffer.length === 0 || this.isDestroyed) {
|
|
75
176
|
return;
|
|
76
177
|
}
|
|
178
|
+
// If offline, persist to storage instead of sending
|
|
179
|
+
if (!this.isOnline) {
|
|
180
|
+
if (this.offlineEnabled) {
|
|
181
|
+
this.persistOfflineQueue();
|
|
182
|
+
}
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
77
185
|
this.isFlushing = true;
|
|
78
186
|
const entries = [...this.buffer];
|
|
79
187
|
this.buffer = [];
|
|
@@ -90,6 +198,10 @@ export class ClientHTTPTransport {
|
|
|
90
198
|
this.buffer.splice(this.maxBufferSize);
|
|
91
199
|
this.onDrop?.(excess);
|
|
92
200
|
}
|
|
201
|
+
// If send failed, might be network issue - persist to offline queue
|
|
202
|
+
if (this.offlineEnabled) {
|
|
203
|
+
this.persistOfflineQueue();
|
|
204
|
+
}
|
|
93
205
|
this.onFlushError?.(error instanceof Error ? error : new Error(String(error)));
|
|
94
206
|
}
|
|
95
207
|
finally {
|
|
@@ -124,16 +236,45 @@ export class ClientHTTPTransport {
|
|
|
124
236
|
}
|
|
125
237
|
async destroy() {
|
|
126
238
|
this.isDestroyed = true;
|
|
239
|
+
// Remove network event listeners
|
|
240
|
+
if (typeof window !== 'undefined') {
|
|
241
|
+
window.removeEventListener('online', this.boundOnlineHandler);
|
|
242
|
+
window.removeEventListener('offline', this.boundOfflineHandler);
|
|
243
|
+
}
|
|
127
244
|
if (this.flushTimer) {
|
|
128
245
|
clearInterval(this.flushTimer);
|
|
129
246
|
this.flushTimer = null;
|
|
130
247
|
}
|
|
131
|
-
//
|
|
132
|
-
if (this.buffer.length > 0) {
|
|
248
|
+
// Persist remaining buffer to offline storage
|
|
249
|
+
if (this.offlineEnabled && this.buffer.length > 0) {
|
|
250
|
+
this.persistOfflineQueue();
|
|
251
|
+
}
|
|
252
|
+
// Final flush attempt if online
|
|
253
|
+
if (this.buffer.length > 0 && this.isOnline) {
|
|
133
254
|
this.isFlushing = false; // Reset to allow final flush
|
|
134
255
|
await this.flush();
|
|
135
256
|
}
|
|
136
257
|
}
|
|
258
|
+
/**
|
|
259
|
+
* Get current online status
|
|
260
|
+
*/
|
|
261
|
+
getOnlineStatus() {
|
|
262
|
+
return this.isOnline;
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Get current buffer size
|
|
266
|
+
*/
|
|
267
|
+
getBufferSize() {
|
|
268
|
+
return this.buffer.length;
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Manually trigger offline queue persistence
|
|
272
|
+
*/
|
|
273
|
+
persistNow() {
|
|
274
|
+
if (this.offlineEnabled) {
|
|
275
|
+
this.persistOfflineQueue();
|
|
276
|
+
}
|
|
277
|
+
}
|
|
137
278
|
}
|
|
138
279
|
/**
|
|
139
280
|
* Create a client HTTP transport with default configuration
|