@felixgeelhaar/govee-api-client 2.0.1 → 2.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/README.md +43 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/infrastructure/GoveeDeviceRepository.d.ts.map +1 -1
- package/dist/infrastructure/GoveeDeviceRepository.js +23 -4
- package/dist/infrastructure/GoveeDeviceRepository.js.map +1 -1
- package/docs/EXAMPLES.md +185 -4
- package/docs/TYPE_DEFINITIONS.md +176 -5
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -11,6 +11,7 @@ An enterprise-grade TypeScript client library for the Govee Developer REST API.
|
|
|
11
11
|
|
|
12
12
|
- 🎯 **Type-Safe**: Full TypeScript support with comprehensive type definitions
|
|
13
13
|
- 🏗️ **Domain-Driven Design**: Clean architecture following DDD principles
|
|
14
|
+
- ✅ **Runtime Validation**: Zod-based API response validation for production safety
|
|
14
15
|
- ⚡ **Rate Limiting**: High-performance sliding window rate limiter with burst capability
|
|
15
16
|
- 🔄 **Retry Logic**: Enterprise-grade retry with exponential backoff, jitter, and circuit breaker
|
|
16
17
|
- 🛡️ **Error Handling**: Comprehensive error hierarchy with specific error types
|
|
@@ -168,12 +169,26 @@ import {
|
|
|
168
169
|
InvalidApiKeyError,
|
|
169
170
|
RateLimitError,
|
|
170
171
|
NetworkError,
|
|
172
|
+
ValidationError,
|
|
171
173
|
} from '@felixgeelhaar/govee-api-client';
|
|
172
174
|
|
|
173
175
|
try {
|
|
174
176
|
await client.getDevices();
|
|
175
177
|
} catch (error) {
|
|
176
|
-
if (error instanceof
|
|
178
|
+
if (error instanceof ValidationError) {
|
|
179
|
+
// API returned malformed data that failed validation
|
|
180
|
+
console.log('Validation error:', error.message);
|
|
181
|
+
|
|
182
|
+
// Get detailed validation errors
|
|
183
|
+
const details = error.getValidationDetails();
|
|
184
|
+
details.forEach(detail => {
|
|
185
|
+
console.log(` ${detail.path}: ${detail.message}`);
|
|
186
|
+
console.log(` Received: ${JSON.stringify(detail.received)}`);
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Or get a summary string for logging
|
|
190
|
+
console.log('Summary:', error.getValidationSummary());
|
|
191
|
+
} else if (error instanceof InvalidApiKeyError) {
|
|
177
192
|
console.log('API key is invalid or expired');
|
|
178
193
|
console.log(error.getRecommendation());
|
|
179
194
|
} else if (error instanceof RateLimitError) {
|
|
@@ -192,6 +207,33 @@ try {
|
|
|
192
207
|
}
|
|
193
208
|
```
|
|
194
209
|
|
|
210
|
+
### Runtime Validation
|
|
211
|
+
|
|
212
|
+
All API responses are validated at runtime using Zod schemas to ensure data integrity:
|
|
213
|
+
|
|
214
|
+
- **Automatic**: All API calls are validated transparently
|
|
215
|
+
- **Type-safe**: Catches malformed responses before they reach your code
|
|
216
|
+
- **Detailed errors**: `ValidationError` provides specific information about what failed
|
|
217
|
+
- **Production-ready**: Protects against unexpected API changes
|
|
218
|
+
|
|
219
|
+
If you need custom validation, the Zod schemas are exported:
|
|
220
|
+
|
|
221
|
+
```typescript
|
|
222
|
+
import {
|
|
223
|
+
GoveeDevicesResponseSchema,
|
|
224
|
+
GoveeStateResponseSchema,
|
|
225
|
+
GoveeCommandResponseSchema,
|
|
226
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
227
|
+
|
|
228
|
+
// Use for custom validation scenarios
|
|
229
|
+
const result = GoveeDevicesResponseSchema.safeParse(rawApiData);
|
|
230
|
+
if (result.success) {
|
|
231
|
+
console.log('Valid data:', result.data);
|
|
232
|
+
} else {
|
|
233
|
+
console.log('Validation errors:', result.error);
|
|
234
|
+
}
|
|
235
|
+
```
|
|
236
|
+
|
|
195
237
|
## Rate Limiting & Retry Features
|
|
196
238
|
|
|
197
239
|
The client includes enterprise-grade rate limiting and retry capabilities designed for production environments.
|
package/dist/index.d.ts
CHANGED
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
export { GoveeClient, type GoveeClientConfig } from './GoveeClient';
|
|
2
2
|
export { GoveeDevice, DeviceState, Command, PowerOnCommand, PowerOffCommand, BrightnessCommand, ColorCommand, ColorTemperatureCommand, CommandFactory, type PowerState, type ColorState, type ColorTemperatureState, type BrightnessState, type StateProperty, } from './domain/entities';
|
|
3
3
|
export { ColorRgb, ColorTemperature, Brightness } from './domain/value-objects';
|
|
4
|
-
export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, } from './errors';
|
|
4
|
+
export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from './errors';
|
|
5
5
|
export { GoveeControlService, type GoveeControlServiceConfig } from './services';
|
|
6
6
|
export { GoveeDeviceRepository } from './infrastructure';
|
|
7
7
|
export { type IGoveeDeviceRepository } from './domain/repositories';
|
|
8
8
|
export { RetryPolicy, type RetryPolicyConfig, type BackoffStrategy, type JitterConfig, type RetryCondition, type CircuitBreakerConfig, type RetryMetrics, } from './infrastructure/retry';
|
|
9
|
+
export { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, type GoveeDevicesResponse, type GoveeStateResponse, type GoveeCommandResponse, } from './infrastructure/response-schemas';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,KAAK,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,EACd,KAAK,UAAU,EACf,KAAK,UAAU,EACf,KAAK,qBAAqB,EAC1B,KAAK,eAAe,EACpB,KAAK,aAAa,GACnB,MAAM,mBAAmB,CAAC;AAG3B,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAGhF,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC;AAGlB,OAAO,EAAE,mBAAmB,EAAE,KAAK,yBAAyB,EAAE,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AACzD,OAAO,EAAE,KAAK,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAGpE,OAAO,EACL,WAAW,EACX,KAAK,iBAAiB,EACtB,KAAK,eAAe,EACpB,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,oBAAoB,EACzB,KAAK,YAAY,GAClB,MAAM,wBAAwB,CAAC;AAGhC,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,EAC1B,KAAK,oBAAoB,EACzB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,mCAAmC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,10 +5,12 @@ export { GoveeDevice, DeviceState, Command, PowerOnCommand, PowerOffCommand, Bri
|
|
|
5
5
|
// Value objects
|
|
6
6
|
export { ColorRgb, ColorTemperature, Brightness } from './domain/value-objects';
|
|
7
7
|
// Error classes
|
|
8
|
-
export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, } from './errors';
|
|
8
|
+
export { GoveeApiClientError, GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from './errors';
|
|
9
9
|
// Services and repositories (for advanced usage)
|
|
10
10
|
export { GoveeControlService } from './services';
|
|
11
11
|
export { GoveeDeviceRepository } from './infrastructure';
|
|
12
12
|
// Retry infrastructure (for custom retry policies)
|
|
13
13
|
export { RetryPolicy, } from './infrastructure/retry';
|
|
14
|
+
// Validation schemas (for advanced usage)
|
|
15
|
+
export { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, } from './infrastructure/response-schemas';
|
|
14
16
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,GAMf,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEhF,gBAAgB;AAChB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc;AACd,OAAO,EAAE,WAAW,EAA0B,MAAM,eAAe,CAAC;AAEpE,kBAAkB;AAClB,OAAO,EACL,WAAW,EACX,WAAW,EACX,OAAO,EACP,cAAc,EACd,eAAe,EACf,iBAAiB,EACjB,YAAY,EACZ,uBAAuB,EACvB,cAAc,GAMf,MAAM,mBAAmB,CAAC;AAE3B,gBAAgB;AAChB,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAEhF,gBAAgB;AAChB,OAAO,EACL,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,cAAc,EACd,YAAY,EACZ,eAAe,GAChB,MAAM,UAAU,CAAC;AAElB,iDAAiD;AACjD,OAAO,EAAE,mBAAmB,EAAkC,MAAM,YAAY,CAAC;AACjF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAGzD,mDAAmD;AACnD,OAAO,EACL,WAAW,GAOZ,MAAM,wBAAwB,CAAC;AAEhC,0CAA0C;AAC1C,OAAO,EACL,0BAA0B,EAC1B,wBAAwB,EACxB,0BAA0B,GAI3B,MAAM,mCAAmC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoveeDeviceRepository.d.ts","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,WAAW,EAKZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;
|
|
1
|
+
{"version":3,"file":"GoveeDeviceRepository.d.ts","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EACL,WAAW,EAKZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAC;AAerD,UAAU,cAAc;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AA8ED,qBAAa,qBAAsB,YAAW,sBAAsB;IAClE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgB;IAC3C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAmC;IAEnE,OAAO,CAAC,iBAAiB;gBAIb,MAAM,EAAE,cAAc;IAgBlC,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,iBAAiB;IAqCzB,OAAO,CAAC,eAAe;IAkCjB,OAAO,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;IA8GjC,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAuD9D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IA6CjF,OAAO,CAAC,oBAAoB;IAS5B,OAAO,CAAC,0BAA0B;IA4ClC,OAAO,CAAC,gCAAgC;CA4BzC"}
|
|
@@ -2,7 +2,8 @@ import axios from 'axios';
|
|
|
2
2
|
import { GoveeDevice } from '../domain/entities/GoveeDevice';
|
|
3
3
|
import { DeviceState, } from '../domain/entities/DeviceState';
|
|
4
4
|
import { ColorRgb, ColorTemperature, Brightness } from '../domain/value-objects';
|
|
5
|
-
import { GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError } from '../errors';
|
|
5
|
+
import { GoveeApiError, InvalidApiKeyError, RateLimitError, NetworkError, ValidationError, } from '../errors';
|
|
6
|
+
import { GoveeDevicesResponseSchema, GoveeStateResponseSchema, GoveeCommandResponseSchema, } from './response-schemas';
|
|
6
7
|
export class GoveeDeviceRepository {
|
|
7
8
|
generateRequestId() {
|
|
8
9
|
return crypto.randomUUID();
|
|
@@ -79,7 +80,13 @@ export class GoveeDeviceRepository {
|
|
|
79
80
|
this.logger?.info('Fetching all devices');
|
|
80
81
|
try {
|
|
81
82
|
const response = await this.httpClient.get('/router/api/v1/user/devices');
|
|
82
|
-
|
|
83
|
+
// Validate response with Zod
|
|
84
|
+
const validationResult = GoveeDevicesResponseSchema.safeParse(response.data);
|
|
85
|
+
if (!validationResult.success) {
|
|
86
|
+
this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'API response validation failed');
|
|
87
|
+
throw ValidationError.fromZodError(validationResult.error, response.data);
|
|
88
|
+
}
|
|
89
|
+
const apiResponse = validationResult.data;
|
|
83
90
|
if (apiResponse.code !== 200) {
|
|
84
91
|
throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
|
|
85
92
|
}
|
|
@@ -144,7 +151,13 @@ export class GoveeDeviceRepository {
|
|
|
144
151
|
},
|
|
145
152
|
};
|
|
146
153
|
const response = await this.httpClient.post('/router/api/v1/device/state', requestBody);
|
|
147
|
-
|
|
154
|
+
// Validate response with Zod
|
|
155
|
+
const validationResult = GoveeStateResponseSchema.safeParse(response.data);
|
|
156
|
+
if (!validationResult.success) {
|
|
157
|
+
this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'Device state response validation failed');
|
|
158
|
+
throw ValidationError.fromZodError(validationResult.error, response.data);
|
|
159
|
+
}
|
|
160
|
+
const apiResponse = validationResult.data;
|
|
148
161
|
if (apiResponse.code !== 200) {
|
|
149
162
|
throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
|
|
150
163
|
}
|
|
@@ -173,7 +186,13 @@ export class GoveeDeviceRepository {
|
|
|
173
186
|
};
|
|
174
187
|
try {
|
|
175
188
|
const response = await this.httpClient.post('/router/api/v1/device/control', requestBody);
|
|
176
|
-
|
|
189
|
+
// Validate response with Zod
|
|
190
|
+
const validationResult = GoveeCommandResponseSchema.safeParse(response.data);
|
|
191
|
+
if (!validationResult.success) {
|
|
192
|
+
this.logger?.error({ zodError: validationResult.error, rawData: response.data }, 'Command response validation failed');
|
|
193
|
+
throw ValidationError.fromZodError(validationResult.error, response.data);
|
|
194
|
+
}
|
|
195
|
+
const apiResponse = validationResult.data;
|
|
177
196
|
if (apiResponse.code !== 200) {
|
|
178
197
|
throw new GoveeApiError(`API returned error code ${apiResponse.code}: ${apiResponse.message}`, response.status, apiResponse.code, apiResponse.message);
|
|
179
198
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoveeDeviceRepository.js","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"GoveeDeviceRepository.js","sourceRoot":"","sources":["../../src/infrastructure/GoveeDeviceRepository.ts"],"names":[],"mappings":"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"}
|
package/docs/EXAMPLES.md
CHANGED
|
@@ -10,6 +10,7 @@ This document provides comprehensive examples for using the Govee API Client lib
|
|
|
10
10
|
- [Color Management](#color-management)
|
|
11
11
|
- [State Management](#state-management)
|
|
12
12
|
- [Error Handling](#error-handling)
|
|
13
|
+
- [Runtime Validation & Error Recovery](#runtime-validation--error-recovery)
|
|
13
14
|
- [Rate Limiting & Monitoring](#rate-limiting--monitoring)
|
|
14
15
|
- [Retry Configuration](#retry-configuration)
|
|
15
16
|
- [Advanced Usage](#advanced-usage)
|
|
@@ -393,10 +394,17 @@ async function comprehensiveErrorHandling() {
|
|
|
393
394
|
}
|
|
394
395
|
} else if (error instanceof ValidationError) {
|
|
395
396
|
console.error('✅ Validation Error:', error.message);
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
397
|
+
console.log('📋 Validation Details:');
|
|
398
|
+
|
|
399
|
+
// Get detailed validation errors
|
|
400
|
+
const details = error.getValidationDetails();
|
|
401
|
+
details.forEach(detail => {
|
|
402
|
+
console.log(` 📍 ${detail.path}: ${detail.message}`);
|
|
403
|
+
console.log(` 💥 Received: ${JSON.stringify(detail.received)}`);
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
// Or use summary for quick logging
|
|
407
|
+
console.log('Summary:', error.getValidationSummary());
|
|
400
408
|
} else {
|
|
401
409
|
console.error('❓ Unknown Error:', error);
|
|
402
410
|
}
|
|
@@ -438,6 +446,179 @@ async function retryPattern(operation: () => Promise<void>, maxRetries = 3) {
|
|
|
438
446
|
}
|
|
439
447
|
```
|
|
440
448
|
|
|
449
|
+
## Runtime Validation & Error Recovery
|
|
450
|
+
|
|
451
|
+
### Understanding Validation Errors
|
|
452
|
+
|
|
453
|
+
All API responses are automatically validated using Zod schemas. If the Govee API returns malformed data, a `ValidationError` is thrown with detailed information about what failed validation.
|
|
454
|
+
|
|
455
|
+
```typescript
|
|
456
|
+
import { ValidationError } from '@felixgeelhaar/govee-api-client';
|
|
457
|
+
|
|
458
|
+
async function handleValidationErrors() {
|
|
459
|
+
try {
|
|
460
|
+
const devices = await client.getDevices();
|
|
461
|
+
console.log(`Found ${devices.length} devices`);
|
|
462
|
+
} catch (error) {
|
|
463
|
+
if (error instanceof ValidationError) {
|
|
464
|
+
console.error('API returned invalid data');
|
|
465
|
+
|
|
466
|
+
// Get structured validation errors
|
|
467
|
+
const validationDetails = error.getValidationDetails();
|
|
468
|
+
|
|
469
|
+
validationDetails.forEach(({ path, message, received }) => {
|
|
470
|
+
console.log(`Field "${path}" failed validation:`);
|
|
471
|
+
console.log(` Issue: ${message}`);
|
|
472
|
+
console.log(` Received value: ${JSON.stringify(received)}`);
|
|
473
|
+
});
|
|
474
|
+
|
|
475
|
+
// Log the complete Zod error for debugging
|
|
476
|
+
console.log('Zod Error:', error.zodError);
|
|
477
|
+
|
|
478
|
+
// Log the raw API response for investigation
|
|
479
|
+
console.log('Raw Data:', error.rawData);
|
|
480
|
+
}
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
```
|
|
484
|
+
|
|
485
|
+
### Custom Validation with Exported Schemas
|
|
486
|
+
|
|
487
|
+
For advanced use cases, you can access the Zod schemas directly:
|
|
488
|
+
|
|
489
|
+
```typescript
|
|
490
|
+
import {
|
|
491
|
+
GoveeDevicesResponseSchema,
|
|
492
|
+
GoveeStateResponseSchema,
|
|
493
|
+
GoveeCommandResponseSchema,
|
|
494
|
+
type GoveeDevicesResponse,
|
|
495
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
496
|
+
|
|
497
|
+
async function customValidation() {
|
|
498
|
+
// Example: Validate data from a cache or external source
|
|
499
|
+
const cachedData: unknown = await getCachedDevices();
|
|
500
|
+
|
|
501
|
+
const validationResult = GoveeDevicesResponseSchema.safeParse(cachedData);
|
|
502
|
+
|
|
503
|
+
if (validationResult.success) {
|
|
504
|
+
// Data is valid and typed
|
|
505
|
+
const response: GoveeDevicesResponse = validationResult.data;
|
|
506
|
+
console.log(`Cached data is valid: ${response.data.length} devices`);
|
|
507
|
+
} else {
|
|
508
|
+
// Handle validation failure
|
|
509
|
+
console.error('Cached data is invalid:', validationResult.error);
|
|
510
|
+
// Fetch fresh data from API
|
|
511
|
+
const freshDevices = await client.getDevices();
|
|
512
|
+
await cacheDevices(freshDevices);
|
|
513
|
+
}
|
|
514
|
+
}
|
|
515
|
+
```
|
|
516
|
+
|
|
517
|
+
### Graceful Degradation
|
|
518
|
+
|
|
519
|
+
Implement graceful degradation when validation fails:
|
|
520
|
+
|
|
521
|
+
```typescript
|
|
522
|
+
async function robustDeviceFetch() {
|
|
523
|
+
try {
|
|
524
|
+
// Try to get devices normally
|
|
525
|
+
return await client.getDevices();
|
|
526
|
+
} catch (error) {
|
|
527
|
+
if (error instanceof ValidationError) {
|
|
528
|
+
console.warn('API response validation failed, using fallback');
|
|
529
|
+
|
|
530
|
+
// Log for investigation
|
|
531
|
+
console.error('Validation error details:', error.getValidationSummary());
|
|
532
|
+
|
|
533
|
+
// Return empty array or cached data as fallback
|
|
534
|
+
const cachedDevices = await getCachedDevices();
|
|
535
|
+
if (cachedDevices && cachedDevices.length > 0) {
|
|
536
|
+
console.log('Using cached devices as fallback');
|
|
537
|
+
return cachedDevices;
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
console.log('No cache available, returning empty array');
|
|
541
|
+
return [];
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Re-throw other errors
|
|
545
|
+
throw error;
|
|
546
|
+
}
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### Validation Error Logging for Debugging
|
|
551
|
+
|
|
552
|
+
Create detailed logs for troubleshooting validation issues:
|
|
553
|
+
|
|
554
|
+
```typescript
|
|
555
|
+
import pino from 'pino';
|
|
556
|
+
|
|
557
|
+
const logger = pino();
|
|
558
|
+
|
|
559
|
+
async function logValidationErrors() {
|
|
560
|
+
try {
|
|
561
|
+
const devices = await client.getDevices();
|
|
562
|
+
return devices;
|
|
563
|
+
} catch (error) {
|
|
564
|
+
if (error instanceof ValidationError) {
|
|
565
|
+
// Structured logging with all validation details
|
|
566
|
+
logger.error(
|
|
567
|
+
{
|
|
568
|
+
err: error,
|
|
569
|
+
validationSummary: error.getValidationSummary(),
|
|
570
|
+
validationDetails: error.getValidationDetails(),
|
|
571
|
+
zodIssues: error.zodError.issues,
|
|
572
|
+
rawData: error.rawData,
|
|
573
|
+
},
|
|
574
|
+
'API response validation failed'
|
|
575
|
+
);
|
|
576
|
+
|
|
577
|
+
// Send to error tracking service
|
|
578
|
+
await sendToErrorTracker({
|
|
579
|
+
type: 'validation_error',
|
|
580
|
+
message: error.message,
|
|
581
|
+
details: error.getValidationDetails(),
|
|
582
|
+
stack: error.stack,
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
throw error;
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
### Testing Validation Behavior
|
|
592
|
+
|
|
593
|
+
Test your error handling for validation failures:
|
|
594
|
+
|
|
595
|
+
```typescript
|
|
596
|
+
import { ValidationError } from '@felixgeelhaar/govee-api-client';
|
|
597
|
+
import { z } from 'zod';
|
|
598
|
+
|
|
599
|
+
// Simulate validation error for testing
|
|
600
|
+
function simulateValidationError() {
|
|
601
|
+
const mockData = { invalid: 'data' };
|
|
602
|
+
const validationError = z.object({ valid: z.string() }).safeParse(mockData);
|
|
603
|
+
|
|
604
|
+
if (!validationError.success) {
|
|
605
|
+
throw ValidationError.fromZodError(validationError.error, mockData);
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
|
|
609
|
+
// Test your error handling
|
|
610
|
+
async function testErrorHandling() {
|
|
611
|
+
try {
|
|
612
|
+
simulateValidationError();
|
|
613
|
+
} catch (error) {
|
|
614
|
+
if (error instanceof ValidationError) {
|
|
615
|
+
console.log('✅ ValidationError handled correctly');
|
|
616
|
+
console.log('Details:', error.getValidationDetails());
|
|
617
|
+
}
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
```
|
|
621
|
+
|
|
441
622
|
## Rate Limiting & Monitoring
|
|
442
623
|
|
|
443
624
|
### Monitor Rate Limiter
|
package/docs/TYPE_DEFINITIONS.md
CHANGED
|
@@ -10,6 +10,7 @@ This document provides comprehensive type definitions for the Govee API Client l
|
|
|
10
10
|
- [Command Types](#command-types)
|
|
11
11
|
- [State Types](#state-types)
|
|
12
12
|
- [Error Types](#error-types)
|
|
13
|
+
- [Validation Types](#validation-types)
|
|
13
14
|
- [Retry & Rate Limiting Types](#retry--rate-limiting-types)
|
|
14
15
|
- [Utility Types](#utility-types)
|
|
15
16
|
|
|
@@ -329,12 +330,15 @@ class NetworkError extends GoveeApiClientError {
|
|
|
329
330
|
}
|
|
330
331
|
|
|
331
332
|
class ValidationError extends GoveeApiClientError {
|
|
332
|
-
readonly
|
|
333
|
-
readonly
|
|
334
|
-
readonly
|
|
333
|
+
readonly code = 'VALIDATION_ERROR';
|
|
334
|
+
readonly zodError: ZodError;
|
|
335
|
+
readonly rawData: unknown;
|
|
335
336
|
|
|
336
|
-
constructor(message: string,
|
|
337
|
-
|
|
337
|
+
constructor(message: string, zodError: ZodError, rawData: unknown);
|
|
338
|
+
|
|
339
|
+
static fromZodError(zodError: ZodError, rawData: unknown): ValidationError;
|
|
340
|
+
getValidationDetails(): Array<{ path: string; message: string; received: unknown }>;
|
|
341
|
+
getValidationSummary(): string;
|
|
338
342
|
}
|
|
339
343
|
```
|
|
340
344
|
|
|
@@ -350,6 +354,173 @@ function isNetworkError(error: unknown): error is NetworkError;
|
|
|
350
354
|
function isValidationError(error: unknown): error is ValidationError;
|
|
351
355
|
```
|
|
352
356
|
|
|
357
|
+
## Validation Types
|
|
358
|
+
|
|
359
|
+
### Zod Schemas
|
|
360
|
+
|
|
361
|
+
Exported Zod schemas for runtime API response validation.
|
|
362
|
+
|
|
363
|
+
```typescript
|
|
364
|
+
import { z } from 'zod';
|
|
365
|
+
|
|
366
|
+
// Device capability schema
|
|
367
|
+
const GoveeCapabilitySchema: z.ZodType;
|
|
368
|
+
|
|
369
|
+
// Individual device response schema
|
|
370
|
+
const GoveeDeviceResponseSchema: z.ZodType;
|
|
371
|
+
|
|
372
|
+
// Full devices API response schema
|
|
373
|
+
const GoveeDevicesResponseSchema: z.ZodObject<{
|
|
374
|
+
code: z.ZodNumber;
|
|
375
|
+
message: z.ZodString;
|
|
376
|
+
data: z.ZodArray<typeof GoveeDeviceResponseSchema>;
|
|
377
|
+
}>;
|
|
378
|
+
|
|
379
|
+
// Device state capability schema
|
|
380
|
+
const GoveeStateCapabilitySchema: z.ZodObject<{
|
|
381
|
+
type: z.ZodString;
|
|
382
|
+
instance: z.ZodString;
|
|
383
|
+
state: z.ZodObject<{ value: z.ZodUnknown }>;
|
|
384
|
+
}>;
|
|
385
|
+
|
|
386
|
+
// Device state API response schema
|
|
387
|
+
const GoveeStateResponseSchema: z.ZodObject<{
|
|
388
|
+
code: z.ZodNumber;
|
|
389
|
+
message: z.ZodString;
|
|
390
|
+
data: z.ZodObject<{
|
|
391
|
+
device: z.ZodString;
|
|
392
|
+
sku: z.ZodString;
|
|
393
|
+
capabilities: z.ZodArray<typeof GoveeStateCapabilitySchema>;
|
|
394
|
+
}>;
|
|
395
|
+
}>;
|
|
396
|
+
|
|
397
|
+
// Command API response schema
|
|
398
|
+
const GoveeCommandResponseSchema: z.ZodObject<{
|
|
399
|
+
code: z.ZodNumber;
|
|
400
|
+
message: z.ZodString;
|
|
401
|
+
data: z.ZodOptional<z.ZodUnknown>;
|
|
402
|
+
}>;
|
|
403
|
+
```
|
|
404
|
+
|
|
405
|
+
### Response Types
|
|
406
|
+
|
|
407
|
+
TypeScript types inferred from Zod schemas.
|
|
408
|
+
|
|
409
|
+
```typescript
|
|
410
|
+
// Type inferred from GoveeDevicesResponseSchema
|
|
411
|
+
type GoveeDevicesResponse = {
|
|
412
|
+
code: number;
|
|
413
|
+
message: string;
|
|
414
|
+
data: Array<{
|
|
415
|
+
device?: string | null;
|
|
416
|
+
sku?: string | null;
|
|
417
|
+
deviceName?: string | null;
|
|
418
|
+
capabilities?: Array<{
|
|
419
|
+
type?: string | null;
|
|
420
|
+
instance?: string | null;
|
|
421
|
+
parameters?: {
|
|
422
|
+
dataType: string;
|
|
423
|
+
options?: Array<{
|
|
424
|
+
name: string;
|
|
425
|
+
value: unknown;
|
|
426
|
+
}>;
|
|
427
|
+
};
|
|
428
|
+
}> | null;
|
|
429
|
+
}>;
|
|
430
|
+
};
|
|
431
|
+
|
|
432
|
+
// Type inferred from GoveeStateResponseSchema
|
|
433
|
+
type GoveeStateResponse = {
|
|
434
|
+
code: number;
|
|
435
|
+
message: string;
|
|
436
|
+
data: {
|
|
437
|
+
device: string;
|
|
438
|
+
sku: string;
|
|
439
|
+
capabilities: Array<{
|
|
440
|
+
type: string;
|
|
441
|
+
instance: string;
|
|
442
|
+
state: {
|
|
443
|
+
value: unknown;
|
|
444
|
+
};
|
|
445
|
+
}>;
|
|
446
|
+
};
|
|
447
|
+
};
|
|
448
|
+
|
|
449
|
+
// Type inferred from GoveeCommandResponseSchema
|
|
450
|
+
type GoveeCommandResponse = {
|
|
451
|
+
code: number;
|
|
452
|
+
message: string;
|
|
453
|
+
data?: unknown;
|
|
454
|
+
};
|
|
455
|
+
```
|
|
456
|
+
|
|
457
|
+
### Using Validation Schemas
|
|
458
|
+
|
|
459
|
+
Examples of using exported schemas for custom validation:
|
|
460
|
+
|
|
461
|
+
```typescript
|
|
462
|
+
import {
|
|
463
|
+
GoveeDevicesResponseSchema,
|
|
464
|
+
GoveeStateResponseSchema,
|
|
465
|
+
type GoveeDevicesResponse,
|
|
466
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
467
|
+
|
|
468
|
+
// Validate unknown data
|
|
469
|
+
function validateDevicesResponse(data: unknown): GoveeDevicesResponse {
|
|
470
|
+
return GoveeDevicesResponseSchema.parse(data); // Throws on invalid data
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
// Safe validation without throwing
|
|
474
|
+
function safeValidate(data: unknown) {
|
|
475
|
+
const result = GoveeDevicesResponseSchema.safeParse(data);
|
|
476
|
+
|
|
477
|
+
if (result.success) {
|
|
478
|
+
const validData: GoveeDevicesResponse = result.data;
|
|
479
|
+
return validData;
|
|
480
|
+
} else {
|
|
481
|
+
console.error('Validation failed:', result.error);
|
|
482
|
+
return null;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
// Custom schema composition
|
|
487
|
+
import { z } from 'zod';
|
|
488
|
+
|
|
489
|
+
const ExtendedDeviceSchema = GoveeDevicesResponseSchema.extend({
|
|
490
|
+
metadata: z.object({
|
|
491
|
+
fetchedAt: z.date(),
|
|
492
|
+
cacheKey: z.string(),
|
|
493
|
+
}),
|
|
494
|
+
});
|
|
495
|
+
```
|
|
496
|
+
|
|
497
|
+
### ValidationError Details
|
|
498
|
+
|
|
499
|
+
Structure of validation error details returned by `getValidationDetails()`:
|
|
500
|
+
|
|
501
|
+
```typescript
|
|
502
|
+
interface ValidationDetail {
|
|
503
|
+
path: string; // JSON path to the field that failed (e.g., "data.0.deviceName")
|
|
504
|
+
message: string; // Human-readable error message
|
|
505
|
+
received: unknown; // The actual value that failed validation
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
// Example usage
|
|
509
|
+
try {
|
|
510
|
+
await client.getDevices();
|
|
511
|
+
} catch (error) {
|
|
512
|
+
if (error instanceof ValidationError) {
|
|
513
|
+
const details: ValidationDetail[] = error.getValidationDetails();
|
|
514
|
+
|
|
515
|
+
details.forEach(({ path, message, received }) => {
|
|
516
|
+
console.log(`Field "${path}" is invalid`);
|
|
517
|
+
console.log(`Error: ${message}`);
|
|
518
|
+
console.log(`Got: ${JSON.stringify(received)}`);
|
|
519
|
+
});
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
```
|
|
523
|
+
|
|
353
524
|
## Retry & Rate Limiting Types
|
|
354
525
|
|
|
355
526
|
### RetryPolicy
|