takos-common 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/dist/abort.d.ts +14 -0
  2. package/dist/abort.d.ts.map +1 -0
  3. package/dist/abort.js +26 -0
  4. package/dist/abort.js.map +1 -0
  5. package/dist/env-parse.d.ts +74 -0
  6. package/dist/env-parse.d.ts.map +1 -0
  7. package/dist/env-parse.js +124 -0
  8. package/dist/env-parse.js.map +1 -0
  9. package/dist/errors.d.ts +181 -0
  10. package/dist/errors.d.ts.map +1 -0
  11. package/dist/errors.js +271 -0
  12. package/dist/errors.js.map +1 -0
  13. package/dist/id.d.ts +23 -0
  14. package/dist/id.d.ts.map +1 -0
  15. package/dist/id.js +32 -0
  16. package/dist/id.js.map +1 -0
  17. package/dist/index.d.ts +17 -0
  18. package/dist/index.d.ts.map +1 -0
  19. package/dist/index.js +43 -0
  20. package/dist/index.js.map +1 -0
  21. package/dist/jwt.d.ts +54 -0
  22. package/dist/jwt.d.ts.map +1 -0
  23. package/dist/jwt.js +149 -0
  24. package/dist/jwt.js.map +1 -0
  25. package/dist/logger.d.ts +22 -0
  26. package/dist/logger.d.ts.map +1 -0
  27. package/dist/logger.js +99 -0
  28. package/dist/logger.js.map +1 -0
  29. package/dist/middleware/hono.d.ts +151 -0
  30. package/dist/middleware/hono.d.ts.map +1 -0
  31. package/dist/middleware/hono.js +189 -0
  32. package/dist/middleware/hono.js.map +1 -0
  33. package/dist/validation.d.ts +21 -0
  34. package/dist/validation.d.ts.map +1 -0
  35. package/dist/validation.js +102 -0
  36. package/dist/validation.js.map +1 -0
  37. package/package.json +55 -0
  38. package/src/__tests__/jwt.test.ts +208 -0
  39. package/src/__tests__/validation.test.ts +42 -0
  40. package/src/abort.ts +30 -0
  41. package/src/env-parse.ts +153 -0
  42. package/src/errors.ts +341 -0
  43. package/src/id.ts +33 -0
  44. package/src/index.ts +81 -0
  45. package/src/jwt.ts +218 -0
  46. package/src/logger.ts +136 -0
  47. package/src/middleware/hono.ts +310 -0
  48. package/src/validation.ts +105 -0
  49. package/tsconfig.json +18 -0
  50. package/tsconfig.tsbuildinfo +1 -0
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Abort Signal Utilities
3
+ *
4
+ * Shared helpers for working with AbortSignal across Takos services.
5
+ */
6
+ /**
7
+ * Throws an `AppError` if the given signal has been aborted.
8
+ *
9
+ * @param signal - The abort signal to check (no-op if `undefined`).
10
+ * @param context - A short label describing the call-site, appended to the
11
+ * error message for easier debugging (e.g. `'langgraph-start'`).
12
+ */
13
+ export declare function throwIfAborted(signal: AbortSignal | undefined, context?: string): void;
14
+ //# sourceMappingURL=abort.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.d.ts","sourceRoot":"","sources":["../src/abort.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAIH;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CActF"}
package/dist/abort.js ADDED
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Abort Signal Utilities
3
+ *
4
+ * Shared helpers for working with AbortSignal across Takos services.
5
+ */
6
+ import { AppError } from './errors.js';
7
+ /**
8
+ * Throws an `AppError` if the given signal has been aborted.
9
+ *
10
+ * @param signal - The abort signal to check (no-op if `undefined`).
11
+ * @param context - A short label describing the call-site, appended to the
12
+ * error message for easier debugging (e.g. `'langgraph-start'`).
13
+ */
14
+ export function throwIfAborted(signal, context) {
15
+ if (!signal?.aborted) {
16
+ return;
17
+ }
18
+ const reason = signal.reason;
19
+ const message = reason instanceof Error
20
+ ? reason.message
21
+ : typeof reason === 'string'
22
+ ? reason
23
+ : 'Run aborted';
24
+ throw new AppError(context ? `${message} (${context})` : message);
25
+ }
26
+ //# sourceMappingURL=abort.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"abort.js","sourceRoot":"","sources":["../src/abort.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,MAA+B,EAAE,OAAgB;IAC9E,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAC7B,MAAM,OAAO,GACX,MAAM,YAAY,KAAK;QACrB,CAAC,CAAC,MAAM,CAAC,OAAO;QAChB,CAAC,CAAC,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,CAAC,MAAM;YACR,CAAC,CAAC,aAAa,CAAC;IAEtB,MAAM,IAAI,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,KAAK,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;AACpE,CAAC"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Environment variable parsing helpers.
3
+ *
4
+ * Provides a consistent pattern across all services:
5
+ * - **Required** vars (`parseIntEnvRequired`): throw if missing or invalid.
6
+ * - **Optional** vars (`parseIntEnv`, `parseFloatEnv`): log a warning when the
7
+ * raw value is present but invalid, then fall back to the default.
8
+ *
9
+ * The helpers intentionally avoid importing a specific logger so they stay
10
+ * dependency-free. A `warnFn` callback is accepted for warning output;
11
+ * callers can wire it to their own logger or leave it as `console.warn`.
12
+ */
13
+ type WarnFn = (message: string) => void;
14
+ /**
15
+ * Parse an optional integer environment variable.
16
+ *
17
+ * - Missing / empty value -> returns `defaultValue`.
18
+ * - Present but not a valid integer -> logs a warning, returns `defaultValue`.
19
+ * - `min` / `max` constraints are enforced when provided.
20
+ */
21
+ export declare function parseIntEnv(name: string, defaultValue: number, options?: {
22
+ min?: number;
23
+ max?: number;
24
+ warn?: WarnFn;
25
+ }): number;
26
+ /**
27
+ * Parse a required integer environment variable.
28
+ *
29
+ * - Missing / empty -> throws.
30
+ * - Present but not a valid integer -> throws.
31
+ */
32
+ export declare function parseIntEnvRequired(name: string, options?: {
33
+ min?: number;
34
+ max?: number;
35
+ }): number;
36
+ /**
37
+ * Parse an integer from a raw string value (not directly from process.env).
38
+ *
39
+ * Useful when the env value has already been read (e.g. from a Cloudflare
40
+ * Workers `Env` binding) rather than from `process.env`.
41
+ *
42
+ * - `undefined` / empty -> returns `defaultValue`.
43
+ * - Present but not a valid integer -> logs a warning, returns `defaultValue`.
44
+ */
45
+ export declare function parseIntValue(name: string, raw: string | undefined, defaultValue: number, options?: {
46
+ min?: number;
47
+ max?: number;
48
+ warn?: WarnFn;
49
+ }): number;
50
+ /**
51
+ * Parse an optional float environment variable.
52
+ *
53
+ * - Missing / empty value -> returns `defaultValue`.
54
+ * - Present but not a valid number -> logs a warning, returns `defaultValue`.
55
+ * - `min` / `max` constraints are enforced when provided.
56
+ */
57
+ export declare function parseFloatEnv(name: string, defaultValue: number, options?: {
58
+ min?: number;
59
+ max?: number;
60
+ warn?: WarnFn;
61
+ }): number;
62
+ /**
63
+ * Parse a float from a raw string value (not directly from process.env).
64
+ *
65
+ * - `undefined` / empty -> returns `defaultValue`.
66
+ * - Present but not a valid number -> logs a warning, returns `defaultValue`.
67
+ */
68
+ export declare function parseFloatValue(name: string, raw: string | undefined, defaultValue: number, options?: {
69
+ min?: number;
70
+ max?: number;
71
+ warn?: WarnFn;
72
+ }): number;
73
+ export {};
74
+ //# sourceMappingURL=env-parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parse.d.ts","sourceRoot":"","sources":["../src/env-parse.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,KAAK,MAAM,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAOxC;;;;;;GAMG;AACH,wBAAgB,WAAW,CACzB,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GACvC,MAAM,CAgBR;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAoBR;AAMD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAIR;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,GAAG,SAAS,EACvB,YAAY,EAAE,MAAM,EACpB,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD,MAAM,CAoBR"}
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Environment variable parsing helpers.
3
+ *
4
+ * Provides a consistent pattern across all services:
5
+ * - **Required** vars (`parseIntEnvRequired`): throw if missing or invalid.
6
+ * - **Optional** vars (`parseIntEnv`, `parseFloatEnv`): log a warning when the
7
+ * raw value is present but invalid, then fall back to the default.
8
+ *
9
+ * The helpers intentionally avoid importing a specific logger so they stay
10
+ * dependency-free. A `warnFn` callback is accepted for warning output;
11
+ * callers can wire it to their own logger or leave it as `console.warn`.
12
+ */
13
+ const defaultWarn = (msg) => console.warn(msg);
14
+ // ---------------------------------------------------------------------------
15
+ // Integer helpers
16
+ // ---------------------------------------------------------------------------
17
+ /**
18
+ * Parse an optional integer environment variable.
19
+ *
20
+ * - Missing / empty value -> returns `defaultValue`.
21
+ * - Present but not a valid integer -> logs a warning, returns `defaultValue`.
22
+ * - `min` / `max` constraints are enforced when provided.
23
+ */
24
+ export function parseIntEnv(name, defaultValue, options) {
25
+ const raw = (typeof globalThis.process !== 'undefined' ? process.env[name] : undefined)?.trim();
26
+ if (!raw)
27
+ return defaultValue;
28
+ return parseIntValue(name, raw, defaultValue, options);
29
+ }
30
+ /**
31
+ * Parse a required integer environment variable.
32
+ *
33
+ * - Missing / empty -> throws.
34
+ * - Present but not a valid integer -> throws.
35
+ */
36
+ export function parseIntEnvRequired(name, options) {
37
+ const raw = (typeof globalThis.process !== 'undefined' ? process.env[name] : undefined)?.trim();
38
+ if (!raw) {
39
+ throw new Error(`Required environment variable ${name} is not set`);
40
+ }
41
+ const parsed = Number.parseInt(raw, 10);
42
+ if (!Number.isFinite(parsed)) {
43
+ throw new Error(`Invalid integer for environment variable ${name}: ${raw}`);
44
+ }
45
+ if (options?.min != null && parsed < options.min) {
46
+ throw new Error(`Environment variable ${name} value ${parsed} is below minimum ${options.min}`);
47
+ }
48
+ if (options?.max != null && parsed > options.max) {
49
+ throw new Error(`Environment variable ${name} value ${parsed} exceeds maximum ${options.max}`);
50
+ }
51
+ return parsed;
52
+ }
53
+ /**
54
+ * Parse an integer from a raw string value (not directly from process.env).
55
+ *
56
+ * Useful when the env value has already been read (e.g. from a Cloudflare
57
+ * Workers `Env` binding) rather than from `process.env`.
58
+ *
59
+ * - `undefined` / empty -> returns `defaultValue`.
60
+ * - Present but not a valid integer -> logs a warning, returns `defaultValue`.
61
+ */
62
+ export function parseIntValue(name, raw, defaultValue, options) {
63
+ const warn = options?.warn ?? defaultWarn;
64
+ if (!raw || raw.trim() === '')
65
+ return defaultValue;
66
+ const trimmed = raw.trim();
67
+ const parsed = Number.parseInt(trimmed, 10);
68
+ if (!Number.isFinite(parsed)) {
69
+ warn(`Invalid integer for ${name}: "${trimmed}", using default ${defaultValue}`);
70
+ return defaultValue;
71
+ }
72
+ if (options?.min != null && parsed < options.min) {
73
+ warn(`Value for ${name} (${parsed}) is below minimum ${options.min}, using default ${defaultValue}`);
74
+ return defaultValue;
75
+ }
76
+ if (options?.max != null && parsed > options.max) {
77
+ warn(`Value for ${name} (${parsed}) exceeds maximum ${options.max}, using default ${defaultValue}`);
78
+ return defaultValue;
79
+ }
80
+ return parsed;
81
+ }
82
+ // ---------------------------------------------------------------------------
83
+ // Float helpers
84
+ // ---------------------------------------------------------------------------
85
+ /**
86
+ * Parse an optional float environment variable.
87
+ *
88
+ * - Missing / empty value -> returns `defaultValue`.
89
+ * - Present but not a valid number -> logs a warning, returns `defaultValue`.
90
+ * - `min` / `max` constraints are enforced when provided.
91
+ */
92
+ export function parseFloatEnv(name, defaultValue, options) {
93
+ const raw = (typeof globalThis.process !== 'undefined' ? process.env[name] : undefined)?.trim();
94
+ if (!raw)
95
+ return defaultValue;
96
+ return parseFloatValue(name, raw, defaultValue, options);
97
+ }
98
+ /**
99
+ * Parse a float from a raw string value (not directly from process.env).
100
+ *
101
+ * - `undefined` / empty -> returns `defaultValue`.
102
+ * - Present but not a valid number -> logs a warning, returns `defaultValue`.
103
+ */
104
+ export function parseFloatValue(name, raw, defaultValue, options) {
105
+ const warn = options?.warn ?? defaultWarn;
106
+ if (!raw || raw.trim() === '')
107
+ return defaultValue;
108
+ const trimmed = raw.trim();
109
+ const parsed = Number.parseFloat(trimmed);
110
+ if (!Number.isFinite(parsed)) {
111
+ warn(`Invalid number for ${name}: "${trimmed}", using default ${defaultValue}`);
112
+ return defaultValue;
113
+ }
114
+ if (options?.min != null && parsed < options.min) {
115
+ warn(`Value for ${name} (${parsed}) is below minimum ${options.min}, using default ${defaultValue}`);
116
+ return defaultValue;
117
+ }
118
+ if (options?.max != null && parsed > options.max) {
119
+ warn(`Value for ${name} (${parsed}) exceeds maximum ${options.max}, using default ${defaultValue}`);
120
+ return defaultValue;
121
+ }
122
+ return parsed;
123
+ }
124
+ //# sourceMappingURL=env-parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"env-parse.js","sourceRoot":"","sources":["../src/env-parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,181 @@
1
+ /**
2
+ * Standardized Error Handling for Takos Platform
3
+ *
4
+ * This module provides a consistent error handling pattern across all takos packages.
5
+ * All errors extend from AppError and include:
6
+ * - code: A unique error code for client-side handling
7
+ * - message: A user-safe message (no internal details)
8
+ * - statusCode: The HTTP status code to return
9
+ * - details: Optional field-level or additional details
10
+ */
11
+ import type { Logger } from './logger.js';
12
+ /**
13
+ * Standard error codes for consistent client handling
14
+ */
15
+ export declare const ErrorCodes: {
16
+ readonly BAD_REQUEST: "BAD_REQUEST";
17
+ readonly UNAUTHORIZED: "UNAUTHORIZED";
18
+ readonly PAYMENT_REQUIRED: "PAYMENT_REQUIRED";
19
+ readonly FORBIDDEN: "FORBIDDEN";
20
+ readonly NOT_FOUND: "NOT_FOUND";
21
+ readonly CONFLICT: "CONFLICT";
22
+ readonly GONE: "GONE";
23
+ readonly VALIDATION_ERROR: "VALIDATION_ERROR";
24
+ readonly RATE_LIMITED: "RATE_LIMITED";
25
+ readonly PAYLOAD_TOO_LARGE: "PAYLOAD_TOO_LARGE";
26
+ readonly INTERNAL_ERROR: "INTERNAL_ERROR";
27
+ readonly NOT_IMPLEMENTED: "NOT_IMPLEMENTED";
28
+ readonly SERVICE_UNAVAILABLE: "SERVICE_UNAVAILABLE";
29
+ readonly BAD_GATEWAY: "BAD_GATEWAY";
30
+ readonly GATEWAY_TIMEOUT: "GATEWAY_TIMEOUT";
31
+ };
32
+ export type ErrorCode = (typeof ErrorCodes)[keyof typeof ErrorCodes];
33
+ /**
34
+ * Standard error response format for API responses
35
+ */
36
+ export interface ErrorResponse {
37
+ error: {
38
+ code: string;
39
+ message: string;
40
+ details?: unknown;
41
+ };
42
+ }
43
+ /**
44
+ * Field-level validation error details
45
+ */
46
+ export interface ValidationErrorDetail {
47
+ field: string;
48
+ message: string;
49
+ value?: unknown;
50
+ }
51
+ /**
52
+ * Base application error class
53
+ * All custom errors should extend from this class
54
+ */
55
+ export declare class AppError extends Error {
56
+ readonly code: ErrorCode;
57
+ readonly statusCode: number;
58
+ readonly details?: unknown;
59
+ constructor(message: string, code?: ErrorCode, statusCode?: number, details?: unknown);
60
+ /**
61
+ * Convert error to API response format
62
+ * This ensures no internal details leak to clients
63
+ */
64
+ toResponse(): ErrorResponse;
65
+ }
66
+ /**
67
+ * 400 Bad Request - Invalid request syntax or parameters
68
+ */
69
+ export declare class BadRequestError extends AppError {
70
+ constructor(message?: string, details?: unknown);
71
+ }
72
+ /**
73
+ * 401 Unauthorized - Authentication required or invalid
74
+ */
75
+ export declare class AuthenticationError extends AppError {
76
+ constructor(message?: string, details?: unknown);
77
+ }
78
+ /**
79
+ * 402 Payment Required - Payment is required to access the resource
80
+ */
81
+ export declare class PaymentRequiredError extends AppError {
82
+ constructor(message?: string, details?: unknown);
83
+ }
84
+ /**
85
+ * 403 Forbidden - Authenticated but not authorized
86
+ */
87
+ export declare class AuthorizationError extends AppError {
88
+ constructor(message?: string, details?: unknown);
89
+ }
90
+ /**
91
+ * 404 Not Found - Resource does not exist
92
+ */
93
+ export declare class NotFoundError extends AppError {
94
+ constructor(resource?: string, details?: unknown);
95
+ }
96
+ /**
97
+ * 409 Conflict - Resource conflict (e.g., duplicate)
98
+ */
99
+ export declare class ConflictError extends AppError {
100
+ constructor(message?: string, details?: unknown);
101
+ }
102
+ /**
103
+ * 410 Gone - Resource no longer available
104
+ */
105
+ export declare class GoneError extends AppError {
106
+ constructor(message?: string, details?: unknown);
107
+ }
108
+ /**
109
+ * 413 Payload Too Large - Request payload exceeds limit
110
+ */
111
+ export declare class PayloadTooLargeError extends AppError {
112
+ constructor(message?: string, details?: unknown);
113
+ }
114
+ /**
115
+ * 422 Unprocessable Entity - Validation failed
116
+ */
117
+ export declare class ValidationError extends AppError {
118
+ readonly fieldErrors: ValidationErrorDetail[];
119
+ constructor(message?: string, fieldErrors?: ValidationErrorDetail[]);
120
+ }
121
+ /**
122
+ * 429 Too Many Requests - Rate limit exceeded
123
+ */
124
+ export declare class RateLimitError extends AppError {
125
+ readonly retryAfter?: number;
126
+ constructor(message?: string, retryAfter?: number);
127
+ }
128
+ /**
129
+ * 500 Internal Server Error - Unexpected server error
130
+ */
131
+ export declare class InternalError extends AppError {
132
+ constructor(message?: string, details?: unknown);
133
+ }
134
+ /**
135
+ * 501 Not Implemented - Functionality not implemented
136
+ */
137
+ export declare class NotImplementedError extends AppError {
138
+ constructor(message?: string, details?: unknown);
139
+ }
140
+ /**
141
+ * 502 Bad Gateway - Invalid response from upstream service
142
+ */
143
+ export declare class BadGatewayError extends AppError {
144
+ constructor(message?: string, details?: unknown);
145
+ }
146
+ /**
147
+ * 503 Service Unavailable - Service temporarily unavailable
148
+ */
149
+ export declare class ServiceUnavailableError extends AppError {
150
+ constructor(message?: string, details?: unknown);
151
+ }
152
+ /**
153
+ * 504 Gateway Timeout - Upstream service timeout
154
+ */
155
+ export declare class GatewayTimeoutError extends AppError {
156
+ constructor(message?: string, details?: unknown);
157
+ }
158
+ /**
159
+ * Type guard to check if an error is an AppError
160
+ */
161
+ export declare function isAppError(error: unknown): error is AppError;
162
+ /**
163
+ * Convert unknown error to AppError
164
+ * Use this to normalize errors before sending responses
165
+ */
166
+ export declare function normalizeError(error: unknown, logger?: Logger): AppError;
167
+ /**
168
+ * Extract a human-readable message from an unknown thrown value.
169
+ *
170
+ * When called with a single argument the behaviour matches the former
171
+ * `runtime-service/utils/error-message` helper (`String(err)` for
172
+ * non-Error values). When a `fallback` string is supplied the
173
+ * behaviour matches the former `control/web/lib/errors` helper
174
+ * (returns the fallback when no meaningful message can be extracted).
175
+ */
176
+ export declare function getErrorMessage(error: unknown, fallback?: string): string;
177
+ /**
178
+ * Log error with full details for server-side debugging
179
+ */
180
+ export declare function logError(error: unknown, context?: Record<string, unknown>, logger?: Logger): void;
181
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"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"}