@nvisy/sdk 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/errors.js ADDED
@@ -0,0 +1,201 @@
1
+ // src/errors.ts
2
+ var ClientError = class extends Error {
3
+ name;
4
+ constructor(message) {
5
+ super(message);
6
+ this.name = this.constructor.name;
7
+ if (Error.captureStackTrace) {
8
+ Error.captureStackTrace(this, this.constructor);
9
+ }
10
+ }
11
+ /**
12
+ * Convert error to JSON representation
13
+ */
14
+ toJSON() {
15
+ return {
16
+ name: this.name,
17
+ message: this.message,
18
+ context: ""
19
+ };
20
+ }
21
+ };
22
+ var ConfigError = class _ConfigError extends ClientError {
23
+ /** Field that caused the error (for validation errors) */
24
+ field;
25
+ /** Reason why the configuration is invalid */
26
+ reason;
27
+ constructor(message, options) {
28
+ super(message);
29
+ this.field = options?.field;
30
+ this.reason = options?.reason;
31
+ }
32
+ /**
33
+ * Create error for missing API key
34
+ */
35
+ static missingApiKey() {
36
+ return new _ConfigError("API key is required", {
37
+ field: "apiKey",
38
+ reason: "API key must be provided in configuration"
39
+ });
40
+ }
41
+ /**
42
+ * Create error for invalid configuration field
43
+ */
44
+ static invalidField(field, reason) {
45
+ return new _ConfigError(`Invalid configuration for ${field}: ${reason}`, {
46
+ field,
47
+ reason
48
+ });
49
+ }
50
+ /**
51
+ * Create error for missing required field
52
+ */
53
+ static missingField(field) {
54
+ return new _ConfigError(`Missing required configuration field: ${field}`, {
55
+ field,
56
+ reason: "This field is required"
57
+ });
58
+ }
59
+ /**
60
+ * Convert error to JSON representation
61
+ */
62
+ toJSON() {
63
+ return {
64
+ name: this.name,
65
+ message: this.message,
66
+ context: this.field || this.reason ? `field: ${this.field}, reason: ${this.reason}` : ""
67
+ };
68
+ }
69
+ };
70
+ var NetworkError = class _NetworkError extends ClientError {
71
+ /** Original error that caused this network error */
72
+ cause;
73
+ constructor(message, cause) {
74
+ super(message);
75
+ this.cause = cause;
76
+ }
77
+ /**
78
+ * Create error for network/connection issues
79
+ */
80
+ static connection(message, cause) {
81
+ return new _NetworkError(message, cause);
82
+ }
83
+ /**
84
+ * Create error for request timeout
85
+ */
86
+ static timeout(timeoutMs) {
87
+ return new _NetworkError(`Request timed out after ${timeoutMs}ms`);
88
+ }
89
+ /**
90
+ * Create error for aborted request
91
+ */
92
+ static aborted() {
93
+ return new _NetworkError("Request was aborted");
94
+ }
95
+ /**
96
+ * Create error for DNS resolution failure
97
+ */
98
+ static dnsResolution(hostname) {
99
+ return new _NetworkError(`Failed to resolve hostname: ${hostname}`);
100
+ }
101
+ /**
102
+ * Convert error to JSON representation
103
+ */
104
+ toJSON() {
105
+ return {
106
+ name: this.name,
107
+ message: this.message,
108
+ context: this.cause ? `cause: ${this.cause.message}` : ""
109
+ };
110
+ }
111
+ };
112
+ var ApiError = class _ApiError extends ClientError {
113
+ /** Error response from server */
114
+ errorResponse;
115
+ /** HTTP status code */
116
+ statusCode;
117
+ /** Request ID for debugging */
118
+ requestId;
119
+ constructor(message, statusCode, options) {
120
+ super(message);
121
+ this.statusCode = statusCode;
122
+ this.errorResponse = options?.errorResponse;
123
+ this.requestId = options?.requestId;
124
+ }
125
+ /**
126
+ * Create error from HTTP response
127
+ */
128
+ static fromResponse(response, errorData, requestId) {
129
+ const message = errorData?.message || `HTTP ${response.status}: ${response.statusText}`;
130
+ return new _ApiError(message, response.status, {
131
+ errorResponse: errorData,
132
+ requestId
133
+ });
134
+ }
135
+ /**
136
+ * Create error for rate limiting
137
+ */
138
+ static rateLimited(retryAfter, requestId) {
139
+ const message = retryAfter ? `Rate limited. Retry after ${retryAfter} seconds` : "Rate limited";
140
+ return new _ApiError(message, 429, {
141
+ requestId,
142
+ errorResponse: {
143
+ name: "RateLimitError",
144
+ message,
145
+ context: retryAfter ? `retryAfter: ${retryAfter}` : ""
146
+ }
147
+ });
148
+ }
149
+ /**
150
+ * Check if error is a client error (4xx)
151
+ */
152
+ isClientError() {
153
+ return this.statusCode ? this.statusCode >= 400 && this.statusCode < 500 : false;
154
+ }
155
+ /**
156
+ * Check if error is a server error (5xx)
157
+ */
158
+ isServerError() {
159
+ return this.statusCode ? this.statusCode >= 500 : false;
160
+ }
161
+ /**
162
+ * Check if error is retryable based on HTTP status
163
+ */
164
+ isRetryable() {
165
+ if (!this.statusCode) return false;
166
+ return this.statusCode >= 500 || // Server errors
167
+ this.statusCode === 408 || // Request timeout
168
+ this.statusCode === 429;
169
+ }
170
+ /**
171
+ * Get retry delay in milliseconds (returns null if not retryable)
172
+ */
173
+ getRetryDelay() {
174
+ if (!this.isRetryable()) return null;
175
+ if (this.statusCode === 429 && this.errorResponse?.context) {
176
+ const match = this.errorResponse.context.match(/retryAfter: (\d+)/);
177
+ if (match) {
178
+ const retryAfter = parseInt(match[1], 10);
179
+ return retryAfter * 1e3;
180
+ }
181
+ }
182
+ if (this.statusCode >= 500) {
183
+ return 1e3;
184
+ }
185
+ return 1e3;
186
+ }
187
+ /**
188
+ * Convert error to JSON representation
189
+ */
190
+ toJSON() {
191
+ return {
192
+ name: this.name,
193
+ message: this.message,
194
+ context: `statusCode: ${this.statusCode}${this.requestId ? `, requestId: ${this.requestId}` : ""}${this.errorResponse ? `, errorResponse: ${JSON.stringify(this.errorResponse)}` : ""}`
195
+ };
196
+ }
197
+ };
198
+
199
+ export { ApiError, ClientError, ConfigError, NetworkError };
200
+ //# sourceMappingURL=errors.js.map
201
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"names":[],"mappings":"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","file":"errors.js","sourcesContent":["/**\n * Error response structure from server\n */\nexport interface ErrorResponse {\n\t/** Error type/name */\n\tname: string;\n\t/** Human-readable error message */\n\tmessage: string;\n\t/** Additional error context */\n\tcontext: string;\n}\n\n/**\n * Abstract base error class for all Nvisy SDK errors\n */\nexport abstract class ClientError extends Error {\n\tpublic readonly name: string;\n\n\tconstructor(message: string) {\n\t\tsuper(message);\n\t\tthis.name = this.constructor.name;\n\n\t\t// Maintains proper stack trace for where our error was thrown (only available on V8)\n\t\tif (Error.captureStackTrace) {\n\t\t\tError.captureStackTrace(this, this.constructor);\n\t\t}\n\t}\n\n\t/**\n\t * Convert error to JSON representation\n\t */\n\ttoJSON(): ErrorResponse {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcontext: \"\",\n\t\t};\n\t}\n}\n\n/**\n * Configuration error - thrown when client configuration is invalid\n */\nexport class ConfigError extends ClientError {\n\t/** Field that caused the error (for validation errors) */\n\tpublic readonly field?: string;\n\t/** Reason why the configuration is invalid */\n\tpublic readonly reason?: string;\n\n\tconstructor(\n\t\tmessage: string,\n\t\toptions?: {\n\t\t\tfield?: string;\n\t\t\treason?: string;\n\t\t},\n\t) {\n\t\tsuper(message);\n\t\tthis.field = options?.field;\n\t\tthis.reason = options?.reason;\n\t}\n\n\t/**\n\t * Create error for missing API key\n\t */\n\tstatic missingApiKey(): ConfigError {\n\t\treturn new ConfigError(\"API key is required\", {\n\t\t\tfield: \"apiKey\",\n\t\t\treason: \"API key must be provided in configuration\",\n\t\t});\n\t}\n\n\t/**\n\t * Create error for invalid configuration field\n\t */\n\tstatic invalidField(field: string, reason: string): ConfigError {\n\t\treturn new ConfigError(`Invalid configuration for ${field}: ${reason}`, {\n\t\t\tfield,\n\t\t\treason,\n\t\t});\n\t}\n\n\t/**\n\t * Create error for missing required field\n\t */\n\tstatic missingField(field: string): ConfigError {\n\t\treturn new ConfigError(`Missing required configuration field: ${field}`, {\n\t\t\tfield,\n\t\t\treason: \"This field is required\",\n\t\t});\n\t}\n\n\t/**\n\t * Convert error to JSON representation\n\t */\n\ttoJSON(): ErrorResponse {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcontext:\n\t\t\t\tthis.field || this.reason\n\t\t\t\t\t? `field: ${this.field}, reason: ${this.reason}`\n\t\t\t\t\t: \"\",\n\t\t};\n\t}\n}\n\n/**\n * Network error - thrown when network requests fail\n */\nexport class NetworkError extends ClientError {\n\t/** Original error that caused this network error */\n\tpublic readonly cause?: Error;\n\n\tconstructor(message: string, cause?: Error) {\n\t\tsuper(message);\n\t\tthis.cause = cause;\n\t}\n\n\t/**\n\t * Create error for network/connection issues\n\t */\n\tstatic connection(message: string, cause?: Error): NetworkError {\n\t\treturn new NetworkError(message, cause);\n\t}\n\n\t/**\n\t * Create error for request timeout\n\t */\n\tstatic timeout(timeoutMs: number): NetworkError {\n\t\treturn new NetworkError(`Request timed out after ${timeoutMs}ms`);\n\t}\n\n\t/**\n\t * Create error for aborted request\n\t */\n\tstatic aborted(): NetworkError {\n\t\treturn new NetworkError(\"Request was aborted\");\n\t}\n\n\t/**\n\t * Create error for DNS resolution failure\n\t */\n\tstatic dnsResolution(hostname: string): NetworkError {\n\t\treturn new NetworkError(`Failed to resolve hostname: ${hostname}`);\n\t}\n\n\t/**\n\t * Convert error to JSON representation\n\t */\n\ttoJSON(): ErrorResponse {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcontext: this.cause ? `cause: ${this.cause.message}` : \"\",\n\t\t};\n\t}\n}\n\n/**\n * API error - thrown when server responds with an error\n */\nexport class ApiError extends ClientError {\n\t/** Error response from server */\n\tpublic readonly errorResponse?: ErrorResponse;\n\t/** HTTP status code */\n\tpublic readonly statusCode: number;\n\t/** Request ID for debugging */\n\tpublic readonly requestId?: string;\n\n\tconstructor(\n\t\tmessage: string,\n\t\tstatusCode: number,\n\t\toptions?: {\n\t\t\terrorResponse?: ErrorResponse;\n\t\t\trequestId?: string;\n\t\t},\n\t) {\n\t\tsuper(message);\n\t\tthis.statusCode = statusCode;\n\t\tthis.errorResponse = options?.errorResponse;\n\t\tthis.requestId = options?.requestId;\n\t}\n\n\t/**\n\t * Create error from HTTP response\n\t */\n\tstatic fromResponse(\n\t\tresponse: Response,\n\t\terrorData?: ErrorResponse,\n\t\trequestId?: string,\n\t): ApiError {\n\t\tconst message =\n\t\t\terrorData?.message || `HTTP ${response.status}: ${response.statusText}`;\n\n\t\treturn new ApiError(message, response.status, {\n\t\t\terrorResponse: errorData,\n\t\t\trequestId,\n\t\t});\n\t}\n\n\t/**\n\t * Create error for rate limiting\n\t */\n\tstatic rateLimited(retryAfter?: number, requestId?: string): ApiError {\n\t\tconst message = retryAfter\n\t\t\t? `Rate limited. Retry after ${retryAfter} seconds`\n\t\t\t: \"Rate limited\";\n\n\t\treturn new ApiError(message, 429, {\n\t\t\trequestId,\n\t\t\terrorResponse: {\n\t\t\t\tname: \"RateLimitError\",\n\t\t\t\tmessage,\n\t\t\t\tcontext: retryAfter ? `retryAfter: ${retryAfter}` : \"\",\n\t\t\t},\n\t\t});\n\t}\n\n\t/**\n\t * Check if error is a client error (4xx)\n\t */\n\tisClientError(): boolean {\n\t\treturn this.statusCode\n\t\t\t? this.statusCode >= 400 && this.statusCode < 500\n\t\t\t: false;\n\t}\n\n\t/**\n\t * Check if error is a server error (5xx)\n\t */\n\tisServerError(): boolean {\n\t\treturn this.statusCode ? this.statusCode >= 500 : false;\n\t}\n\n\t/**\n\t * Check if error is retryable based on HTTP status\n\t */\n\tisRetryable(): boolean {\n\t\tif (!this.statusCode) return false;\n\n\t\t// Retry on server errors and specific client errors\n\t\treturn (\n\t\t\tthis.statusCode >= 500 || // Server errors\n\t\t\tthis.statusCode === 408 || // Request timeout\n\t\t\tthis.statusCode === 429 // Rate limited\n\t\t);\n\t}\n\n\t/**\n\t * Get retry delay in milliseconds (returns null if not retryable)\n\t */\n\tgetRetryDelay(): number | null {\n\t\tif (!this.isRetryable()) return null;\n\n\t\t// For rate limiting, check if we have retry-after info\n\t\tif (this.statusCode === 429 && this.errorResponse?.context) {\n\t\t\tconst match = this.errorResponse.context.match(/retryAfter: (\\d+)/);\n\t\t\tif (match) {\n\t\t\t\tconst retryAfter = parseInt(match[1], 10);\n\t\t\t\treturn retryAfter * 1000; // Convert seconds to milliseconds\n\t\t\t}\n\t\t}\n\n\t\t// Default delays based on error type\n\t\tif (this.statusCode >= 500) {\n\t\t\treturn 1000; // 1 second for server errors\n\t\t}\n\n\t\treturn 1000; // Default 1 second\n\t}\n\n\t/**\n\t * Convert error to JSON representation\n\t */\n\ttoJSON(): ErrorResponse {\n\t\treturn {\n\t\t\tname: this.name,\n\t\t\tmessage: this.message,\n\t\t\tcontext: `statusCode: ${this.statusCode}${\n\t\t\t\tthis.requestId ? `, requestId: ${this.requestId}` : \"\"\n\t\t\t}${\n\t\t\t\tthis.errorResponse\n\t\t\t\t\t? `, errorResponse: ${JSON.stringify(this.errorResponse)}`\n\t\t\t\t\t: \"\"\n\t\t\t}`,\n\t\t};\n\t}\n}\n"]}
@@ -0,0 +1,3 @@
1
+ export { a as Client, C as ClientBuilder, b as ClientConfig, R as ResolvedClientConfig, g as getEnvironmentVariables, l as loadConfigFromEnv, r as resolveConfig } from './builder-BEUIGfoZ.js';
2
+ export { ApiError, ClientError, ConfigError, ErrorResponse, NetworkError } from './errors.js';
3
+ import 'openapi-fetch';