@felixgeelhaar/govee-api-client 2.0.1 → 2.1.1
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 +78 -6
- package/dist/GoveeClient.d.ts +2 -2
- package/dist/GoveeClient.d.ts.map +1 -1
- package/dist/GoveeClient.js +6 -4
- package/dist/GoveeClient.js.map +1 -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 +210 -8
- package/docs/TYPE_DEFINITIONS.md +193 -6
- 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
|
|
@@ -35,10 +36,11 @@ import {
|
|
|
35
36
|
ColorTemperature,
|
|
36
37
|
} from '@felixgeelhaar/govee-api-client';
|
|
37
38
|
|
|
38
|
-
// Initialize the client
|
|
39
|
-
const client = new GoveeClient(
|
|
40
|
-
|
|
41
|
-
|
|
39
|
+
// Initialize the client (uses GOVEE_API_KEY environment variable)
|
|
40
|
+
const client = new GoveeClient();
|
|
41
|
+
|
|
42
|
+
// Or provide API key explicitly
|
|
43
|
+
// const client = new GoveeClient({ apiKey: 'your-govee-api-key' });
|
|
42
44
|
|
|
43
45
|
// Get all devices
|
|
44
46
|
const devices = await client.getDevices();
|
|
@@ -60,12 +62,41 @@ if (livingRoomLight) {
|
|
|
60
62
|
|
|
61
63
|
## Configuration
|
|
62
64
|
|
|
65
|
+
### API Key
|
|
66
|
+
|
|
67
|
+
The client reads the API key from the `GOVEE_API_KEY` environment variable by default:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# Set environment variable
|
|
71
|
+
export GOVEE_API_KEY=your-govee-api-key
|
|
72
|
+
|
|
73
|
+
# Or use a .env file
|
|
74
|
+
echo "GOVEE_API_KEY=your-govee-api-key" > .env
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
```typescript
|
|
78
|
+
import { GoveeClient } from '@felixgeelhaar/govee-api-client';
|
|
79
|
+
|
|
80
|
+
// Uses GOVEE_API_KEY environment variable automatically
|
|
81
|
+
const client = new GoveeClient();
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
You can also provide the API key explicitly (not recommended for production):
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
const client = new GoveeClient({
|
|
88
|
+
apiKey: 'your-govee-api-key', // Explicit API key (overrides environment variable)
|
|
89
|
+
});
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
### Full Configuration
|
|
93
|
+
|
|
63
94
|
```typescript
|
|
64
95
|
import pino from 'pino';
|
|
65
96
|
import { GoveeClient, RetryPolicy } from '@felixgeelhaar/govee-api-client';
|
|
66
97
|
|
|
67
98
|
const client = new GoveeClient({
|
|
68
|
-
apiKey
|
|
99
|
+
// apiKey is optional - uses GOVEE_API_KEY environment variable by default
|
|
69
100
|
timeout: 30000, // Request timeout in milliseconds (default: 30000)
|
|
70
101
|
rateLimit: 95, // Requests per minute (default: 95, with 5 buffer under Govee's limit)
|
|
71
102
|
logger: pino({ level: 'info' }), // Optional logger (silent by default)
|
|
@@ -168,12 +199,26 @@ import {
|
|
|
168
199
|
InvalidApiKeyError,
|
|
169
200
|
RateLimitError,
|
|
170
201
|
NetworkError,
|
|
202
|
+
ValidationError,
|
|
171
203
|
} from '@felixgeelhaar/govee-api-client';
|
|
172
204
|
|
|
173
205
|
try {
|
|
174
206
|
await client.getDevices();
|
|
175
207
|
} catch (error) {
|
|
176
|
-
if (error instanceof
|
|
208
|
+
if (error instanceof ValidationError) {
|
|
209
|
+
// API returned malformed data that failed validation
|
|
210
|
+
console.log('Validation error:', error.message);
|
|
211
|
+
|
|
212
|
+
// Get detailed validation errors
|
|
213
|
+
const details = error.getValidationDetails();
|
|
214
|
+
details.forEach(detail => {
|
|
215
|
+
console.log(` ${detail.path}: ${detail.message}`);
|
|
216
|
+
console.log(` Received: ${JSON.stringify(detail.received)}`);
|
|
217
|
+
});
|
|
218
|
+
|
|
219
|
+
// Or get a summary string for logging
|
|
220
|
+
console.log('Summary:', error.getValidationSummary());
|
|
221
|
+
} else if (error instanceof InvalidApiKeyError) {
|
|
177
222
|
console.log('API key is invalid or expired');
|
|
178
223
|
console.log(error.getRecommendation());
|
|
179
224
|
} else if (error instanceof RateLimitError) {
|
|
@@ -192,6 +237,33 @@ try {
|
|
|
192
237
|
}
|
|
193
238
|
```
|
|
194
239
|
|
|
240
|
+
### Runtime Validation
|
|
241
|
+
|
|
242
|
+
All API responses are validated at runtime using Zod schemas to ensure data integrity:
|
|
243
|
+
|
|
244
|
+
- **Automatic**: All API calls are validated transparently
|
|
245
|
+
- **Type-safe**: Catches malformed responses before they reach your code
|
|
246
|
+
- **Detailed errors**: `ValidationError` provides specific information about what failed
|
|
247
|
+
- **Production-ready**: Protects against unexpected API changes
|
|
248
|
+
|
|
249
|
+
If you need custom validation, the Zod schemas are exported:
|
|
250
|
+
|
|
251
|
+
```typescript
|
|
252
|
+
import {
|
|
253
|
+
GoveeDevicesResponseSchema,
|
|
254
|
+
GoveeStateResponseSchema,
|
|
255
|
+
GoveeCommandResponseSchema,
|
|
256
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
257
|
+
|
|
258
|
+
// Use for custom validation scenarios
|
|
259
|
+
const result = GoveeDevicesResponseSchema.safeParse(rawApiData);
|
|
260
|
+
if (result.success) {
|
|
261
|
+
console.log('Valid data:', result.data);
|
|
262
|
+
} else {
|
|
263
|
+
console.log('Validation errors:', result.error);
|
|
264
|
+
}
|
|
265
|
+
```
|
|
266
|
+
|
|
195
267
|
## Rate Limiting & Retry Features
|
|
196
268
|
|
|
197
269
|
The client includes enterprise-grade rate limiting and retry capabilities designed for production environments.
|
package/dist/GoveeClient.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { Command } from './domain/entities/Command';
|
|
|
5
5
|
import { ColorRgb, ColorTemperature, Brightness } from './domain/value-objects';
|
|
6
6
|
import { RetryPolicy } from './infrastructure/retry';
|
|
7
7
|
export interface GoveeClientConfig {
|
|
8
|
-
apiKey
|
|
8
|
+
apiKey?: string;
|
|
9
9
|
timeout?: number;
|
|
10
10
|
rateLimit?: number;
|
|
11
11
|
logger?: Logger;
|
|
@@ -15,7 +15,7 @@ export interface GoveeClientConfig {
|
|
|
15
15
|
export declare class GoveeClient {
|
|
16
16
|
private readonly controlService;
|
|
17
17
|
private readonly logger;
|
|
18
|
-
constructor(config
|
|
18
|
+
constructor(config?: GoveeClientConfig);
|
|
19
19
|
private validateConfig;
|
|
20
20
|
getDevices(): Promise<GoveeDevice[]>;
|
|
21
21
|
getDeviceState(deviceId: string, model: string): Promise<DeviceState>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoveeClient.d.ts","sourceRoot":"","sources":["../src/GoveeClient.ts"],"names":[],"mappings":"AAAA,OAAa,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAGpC,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAC;AAC5D,OAAO,EAAE,OAAO,EAAE,MAAM,2BAA2B,CAAC;AACpD,OAAO,EAAE,QAAQ,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"GoveeClient.d.ts","sourceRoot":"","sources":["../src/GoveeClient.ts"],"names":[],"mappings":"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"}
|
package/dist/GoveeClient.js
CHANGED
|
@@ -3,13 +3,15 @@ import { GoveeDeviceRepository } from './infrastructure/GoveeDeviceRepository';
|
|
|
3
3
|
import { GoveeControlService } from './services/GoveeControlService';
|
|
4
4
|
import { RetryPolicy } from './infrastructure/retry';
|
|
5
5
|
export class GoveeClient {
|
|
6
|
-
constructor(config) {
|
|
7
|
-
|
|
6
|
+
constructor(config = {}) {
|
|
7
|
+
// Resolve API key from config or environment variable
|
|
8
|
+
const apiKey = config.apiKey ?? process.env.GOVEE_API_KEY;
|
|
9
|
+
this.validateConfig({ ...config, apiKey });
|
|
8
10
|
// Initialize logger (silent by default)
|
|
9
11
|
this.logger = config.logger ?? pino({ level: 'silent' });
|
|
10
12
|
// Initialize repository
|
|
11
13
|
const repositoryConfig = {
|
|
12
|
-
apiKey:
|
|
14
|
+
apiKey: apiKey,
|
|
13
15
|
logger: this.logger,
|
|
14
16
|
};
|
|
15
17
|
if (config.timeout !== undefined) {
|
|
@@ -35,7 +37,7 @@ export class GoveeClient {
|
|
|
35
37
|
}
|
|
36
38
|
validateConfig(config) {
|
|
37
39
|
if (!config.apiKey || typeof config.apiKey !== 'string' || config.apiKey.trim().length === 0) {
|
|
38
|
-
throw new Error('API key is required
|
|
40
|
+
throw new Error('API key is required. Provide it via config.apiKey or set the GOVEE_API_KEY environment variable.');
|
|
39
41
|
}
|
|
40
42
|
if (config.timeout !== undefined &&
|
|
41
43
|
(!Number.isInteger(config.timeout) || config.timeout <= 0)) {
|
package/dist/GoveeClient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"GoveeClient.js","sourceRoot":"","sources":["../src/GoveeClient.ts"],"names":[],"mappings":"AAAA,OAAO,IAAgB,MAAM,MAAM,CAAC;AACpC,OAAO,EAAE,qBAAqB,EAAE,MAAM,wCAAwC,CAAC;AAC/E,OAAO,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAKrE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAWrD,MAAM,OAAO,WAAW;IAItB,YAAY,
|
|
1
|
+
{"version":3,"file":"GoveeClient.js","sourceRoot":"","sources":["../src/GoveeClient.ts"],"names":[],"mappings":"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"}
|
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,20 +10,32 @@ 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)
|
|
16
17
|
|
|
17
18
|
## Basic Setup
|
|
18
19
|
|
|
20
|
+
### Environment Variable Configuration
|
|
21
|
+
|
|
22
|
+
The recommended approach is to use environment variables for the API key:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
# Set environment variable
|
|
26
|
+
export GOVEE_API_KEY=your-govee-api-key-here
|
|
27
|
+
|
|
28
|
+
# Or use a .env file (with dotenv package)
|
|
29
|
+
echo "GOVEE_API_KEY=your-govee-api-key-here" > .env
|
|
30
|
+
```
|
|
31
|
+
|
|
19
32
|
### Simple Client Initialization
|
|
20
33
|
|
|
21
34
|
```typescript
|
|
22
35
|
import { GoveeClient } from '@felixgeelhaar/govee-api-client';
|
|
23
36
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
});
|
|
37
|
+
// Uses GOVEE_API_KEY environment variable automatically
|
|
38
|
+
const client = new GoveeClient();
|
|
27
39
|
|
|
28
40
|
// Test connection
|
|
29
41
|
try {
|
|
@@ -41,7 +53,7 @@ import { GoveeClient } from '@felixgeelhaar/govee-api-client';
|
|
|
41
53
|
import pino from 'pino';
|
|
42
54
|
|
|
43
55
|
const client = new GoveeClient({
|
|
44
|
-
apiKey
|
|
56
|
+
// apiKey uses GOVEE_API_KEY environment variable by default
|
|
45
57
|
timeout: 30000, // 30 second timeout
|
|
46
58
|
rateLimit: 90, // 90 requests per minute (conservative)
|
|
47
59
|
logger: pino({
|
|
@@ -57,6 +69,16 @@ const client = new GoveeClient({
|
|
|
57
69
|
});
|
|
58
70
|
```
|
|
59
71
|
|
|
72
|
+
### Explicit API Key (Not Recommended)
|
|
73
|
+
|
|
74
|
+
For testing or special cases, you can provide the API key explicitly:
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
const client = new GoveeClient({
|
|
78
|
+
apiKey: 'your-govee-api-key-here', // Overrides environment variable
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
60
82
|
## Device Discovery
|
|
61
83
|
|
|
62
84
|
### List All Devices
|
|
@@ -393,10 +415,17 @@ async function comprehensiveErrorHandling() {
|
|
|
393
415
|
}
|
|
394
416
|
} else if (error instanceof ValidationError) {
|
|
395
417
|
console.error('✅ Validation Error:', error.message);
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
418
|
+
console.log('📋 Validation Details:');
|
|
419
|
+
|
|
420
|
+
// Get detailed validation errors
|
|
421
|
+
const details = error.getValidationDetails();
|
|
422
|
+
details.forEach(detail => {
|
|
423
|
+
console.log(` 📍 ${detail.path}: ${detail.message}`);
|
|
424
|
+
console.log(` 💥 Received: ${JSON.stringify(detail.received)}`);
|
|
425
|
+
});
|
|
426
|
+
|
|
427
|
+
// Or use summary for quick logging
|
|
428
|
+
console.log('Summary:', error.getValidationSummary());
|
|
400
429
|
} else {
|
|
401
430
|
console.error('❓ Unknown Error:', error);
|
|
402
431
|
}
|
|
@@ -438,6 +467,179 @@ async function retryPattern(operation: () => Promise<void>, maxRetries = 3) {
|
|
|
438
467
|
}
|
|
439
468
|
```
|
|
440
469
|
|
|
470
|
+
## Runtime Validation & Error Recovery
|
|
471
|
+
|
|
472
|
+
### Understanding Validation Errors
|
|
473
|
+
|
|
474
|
+
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.
|
|
475
|
+
|
|
476
|
+
```typescript
|
|
477
|
+
import { ValidationError } from '@felixgeelhaar/govee-api-client';
|
|
478
|
+
|
|
479
|
+
async function handleValidationErrors() {
|
|
480
|
+
try {
|
|
481
|
+
const devices = await client.getDevices();
|
|
482
|
+
console.log(`Found ${devices.length} devices`);
|
|
483
|
+
} catch (error) {
|
|
484
|
+
if (error instanceof ValidationError) {
|
|
485
|
+
console.error('API returned invalid data');
|
|
486
|
+
|
|
487
|
+
// Get structured validation errors
|
|
488
|
+
const validationDetails = error.getValidationDetails();
|
|
489
|
+
|
|
490
|
+
validationDetails.forEach(({ path, message, received }) => {
|
|
491
|
+
console.log(`Field "${path}" failed validation:`);
|
|
492
|
+
console.log(` Issue: ${message}`);
|
|
493
|
+
console.log(` Received value: ${JSON.stringify(received)}`);
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Log the complete Zod error for debugging
|
|
497
|
+
console.log('Zod Error:', error.zodError);
|
|
498
|
+
|
|
499
|
+
// Log the raw API response for investigation
|
|
500
|
+
console.log('Raw Data:', error.rawData);
|
|
501
|
+
}
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
### Custom Validation with Exported Schemas
|
|
507
|
+
|
|
508
|
+
For advanced use cases, you can access the Zod schemas directly:
|
|
509
|
+
|
|
510
|
+
```typescript
|
|
511
|
+
import {
|
|
512
|
+
GoveeDevicesResponseSchema,
|
|
513
|
+
GoveeStateResponseSchema,
|
|
514
|
+
GoveeCommandResponseSchema,
|
|
515
|
+
type GoveeDevicesResponse,
|
|
516
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
517
|
+
|
|
518
|
+
async function customValidation() {
|
|
519
|
+
// Example: Validate data from a cache or external source
|
|
520
|
+
const cachedData: unknown = await getCachedDevices();
|
|
521
|
+
|
|
522
|
+
const validationResult = GoveeDevicesResponseSchema.safeParse(cachedData);
|
|
523
|
+
|
|
524
|
+
if (validationResult.success) {
|
|
525
|
+
// Data is valid and typed
|
|
526
|
+
const response: GoveeDevicesResponse = validationResult.data;
|
|
527
|
+
console.log(`Cached data is valid: ${response.data.length} devices`);
|
|
528
|
+
} else {
|
|
529
|
+
// Handle validation failure
|
|
530
|
+
console.error('Cached data is invalid:', validationResult.error);
|
|
531
|
+
// Fetch fresh data from API
|
|
532
|
+
const freshDevices = await client.getDevices();
|
|
533
|
+
await cacheDevices(freshDevices);
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
### Graceful Degradation
|
|
539
|
+
|
|
540
|
+
Implement graceful degradation when validation fails:
|
|
541
|
+
|
|
542
|
+
```typescript
|
|
543
|
+
async function robustDeviceFetch() {
|
|
544
|
+
try {
|
|
545
|
+
// Try to get devices normally
|
|
546
|
+
return await client.getDevices();
|
|
547
|
+
} catch (error) {
|
|
548
|
+
if (error instanceof ValidationError) {
|
|
549
|
+
console.warn('API response validation failed, using fallback');
|
|
550
|
+
|
|
551
|
+
// Log for investigation
|
|
552
|
+
console.error('Validation error details:', error.getValidationSummary());
|
|
553
|
+
|
|
554
|
+
// Return empty array or cached data as fallback
|
|
555
|
+
const cachedDevices = await getCachedDevices();
|
|
556
|
+
if (cachedDevices && cachedDevices.length > 0) {
|
|
557
|
+
console.log('Using cached devices as fallback');
|
|
558
|
+
return cachedDevices;
|
|
559
|
+
}
|
|
560
|
+
|
|
561
|
+
console.log('No cache available, returning empty array');
|
|
562
|
+
return [];
|
|
563
|
+
}
|
|
564
|
+
|
|
565
|
+
// Re-throw other errors
|
|
566
|
+
throw error;
|
|
567
|
+
}
|
|
568
|
+
}
|
|
569
|
+
```
|
|
570
|
+
|
|
571
|
+
### Validation Error Logging for Debugging
|
|
572
|
+
|
|
573
|
+
Create detailed logs for troubleshooting validation issues:
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
import pino from 'pino';
|
|
577
|
+
|
|
578
|
+
const logger = pino();
|
|
579
|
+
|
|
580
|
+
async function logValidationErrors() {
|
|
581
|
+
try {
|
|
582
|
+
const devices = await client.getDevices();
|
|
583
|
+
return devices;
|
|
584
|
+
} catch (error) {
|
|
585
|
+
if (error instanceof ValidationError) {
|
|
586
|
+
// Structured logging with all validation details
|
|
587
|
+
logger.error(
|
|
588
|
+
{
|
|
589
|
+
err: error,
|
|
590
|
+
validationSummary: error.getValidationSummary(),
|
|
591
|
+
validationDetails: error.getValidationDetails(),
|
|
592
|
+
zodIssues: error.zodError.issues,
|
|
593
|
+
rawData: error.rawData,
|
|
594
|
+
},
|
|
595
|
+
'API response validation failed'
|
|
596
|
+
);
|
|
597
|
+
|
|
598
|
+
// Send to error tracking service
|
|
599
|
+
await sendToErrorTracker({
|
|
600
|
+
type: 'validation_error',
|
|
601
|
+
message: error.message,
|
|
602
|
+
details: error.getValidationDetails(),
|
|
603
|
+
stack: error.stack,
|
|
604
|
+
});
|
|
605
|
+
}
|
|
606
|
+
|
|
607
|
+
throw error;
|
|
608
|
+
}
|
|
609
|
+
}
|
|
610
|
+
```
|
|
611
|
+
|
|
612
|
+
### Testing Validation Behavior
|
|
613
|
+
|
|
614
|
+
Test your error handling for validation failures:
|
|
615
|
+
|
|
616
|
+
```typescript
|
|
617
|
+
import { ValidationError } from '@felixgeelhaar/govee-api-client';
|
|
618
|
+
import { z } from 'zod';
|
|
619
|
+
|
|
620
|
+
// Simulate validation error for testing
|
|
621
|
+
function simulateValidationError() {
|
|
622
|
+
const mockData = { invalid: 'data' };
|
|
623
|
+
const validationError = z.object({ valid: z.string() }).safeParse(mockData);
|
|
624
|
+
|
|
625
|
+
if (!validationError.success) {
|
|
626
|
+
throw ValidationError.fromZodError(validationError.error, mockData);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// Test your error handling
|
|
631
|
+
async function testErrorHandling() {
|
|
632
|
+
try {
|
|
633
|
+
simulateValidationError();
|
|
634
|
+
} catch (error) {
|
|
635
|
+
if (error instanceof ValidationError) {
|
|
636
|
+
console.log('✅ ValidationError handled correctly');
|
|
637
|
+
console.log('Details:', error.getValidationDetails());
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
}
|
|
641
|
+
```
|
|
642
|
+
|
|
441
643
|
## Rate Limiting & Monitoring
|
|
442
644
|
|
|
443
645
|
### 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
|
|
|
@@ -21,7 +22,7 @@ Main configuration interface for initializing the GoveeClient.
|
|
|
21
22
|
|
|
22
23
|
```typescript
|
|
23
24
|
interface GoveeClientConfig {
|
|
24
|
-
apiKey
|
|
25
|
+
apiKey?: string; // Optional: Govee API key (uses GOVEE_API_KEY env var if not provided)
|
|
25
26
|
timeout?: number; // Optional: Request timeout in milliseconds (default: 30000)
|
|
26
27
|
rateLimit?: number; // Optional: Max requests per minute (default: 95)
|
|
27
28
|
logger?: Logger; // Optional: Pino logger instance
|
|
@@ -32,6 +33,22 @@ interface GoveeClientConfig {
|
|
|
32
33
|
type RetryPolicyType = 'development' | 'testing' | 'production' | 'custom' | RetryPolicy;
|
|
33
34
|
```
|
|
34
35
|
|
|
36
|
+
**API Key Resolution:**
|
|
37
|
+
|
|
38
|
+
- If `apiKey` is provided in config, it will be used
|
|
39
|
+
- Otherwise, the client reads from the `GOVEE_API_KEY` environment variable
|
|
40
|
+
- If neither is available, an error is thrown with a helpful message
|
|
41
|
+
|
|
42
|
+
**Example:**
|
|
43
|
+
|
|
44
|
+
```typescript
|
|
45
|
+
// Uses GOVEE_API_KEY environment variable
|
|
46
|
+
const client = new GoveeClient();
|
|
47
|
+
|
|
48
|
+
// Explicit API key (overrides environment variable)
|
|
49
|
+
const client = new GoveeClient({ apiKey: 'your-key-here' });
|
|
50
|
+
```
|
|
51
|
+
|
|
35
52
|
### GoveeControlServiceConfig
|
|
36
53
|
|
|
37
54
|
Configuration for the internal control service.
|
|
@@ -329,12 +346,15 @@ class NetworkError extends GoveeApiClientError {
|
|
|
329
346
|
}
|
|
330
347
|
|
|
331
348
|
class ValidationError extends GoveeApiClientError {
|
|
332
|
-
readonly
|
|
333
|
-
readonly
|
|
334
|
-
readonly
|
|
349
|
+
readonly code = 'VALIDATION_ERROR';
|
|
350
|
+
readonly zodError: ZodError;
|
|
351
|
+
readonly rawData: unknown;
|
|
335
352
|
|
|
336
|
-
constructor(message: string,
|
|
337
|
-
|
|
353
|
+
constructor(message: string, zodError: ZodError, rawData: unknown);
|
|
354
|
+
|
|
355
|
+
static fromZodError(zodError: ZodError, rawData: unknown): ValidationError;
|
|
356
|
+
getValidationDetails(): Array<{ path: string; message: string; received: unknown }>;
|
|
357
|
+
getValidationSummary(): string;
|
|
338
358
|
}
|
|
339
359
|
```
|
|
340
360
|
|
|
@@ -350,6 +370,173 @@ function isNetworkError(error: unknown): error is NetworkError;
|
|
|
350
370
|
function isValidationError(error: unknown): error is ValidationError;
|
|
351
371
|
```
|
|
352
372
|
|
|
373
|
+
## Validation Types
|
|
374
|
+
|
|
375
|
+
### Zod Schemas
|
|
376
|
+
|
|
377
|
+
Exported Zod schemas for runtime API response validation.
|
|
378
|
+
|
|
379
|
+
```typescript
|
|
380
|
+
import { z } from 'zod';
|
|
381
|
+
|
|
382
|
+
// Device capability schema
|
|
383
|
+
const GoveeCapabilitySchema: z.ZodType;
|
|
384
|
+
|
|
385
|
+
// Individual device response schema
|
|
386
|
+
const GoveeDeviceResponseSchema: z.ZodType;
|
|
387
|
+
|
|
388
|
+
// Full devices API response schema
|
|
389
|
+
const GoveeDevicesResponseSchema: z.ZodObject<{
|
|
390
|
+
code: z.ZodNumber;
|
|
391
|
+
message: z.ZodString;
|
|
392
|
+
data: z.ZodArray<typeof GoveeDeviceResponseSchema>;
|
|
393
|
+
}>;
|
|
394
|
+
|
|
395
|
+
// Device state capability schema
|
|
396
|
+
const GoveeStateCapabilitySchema: z.ZodObject<{
|
|
397
|
+
type: z.ZodString;
|
|
398
|
+
instance: z.ZodString;
|
|
399
|
+
state: z.ZodObject<{ value: z.ZodUnknown }>;
|
|
400
|
+
}>;
|
|
401
|
+
|
|
402
|
+
// Device state API response schema
|
|
403
|
+
const GoveeStateResponseSchema: z.ZodObject<{
|
|
404
|
+
code: z.ZodNumber;
|
|
405
|
+
message: z.ZodString;
|
|
406
|
+
data: z.ZodObject<{
|
|
407
|
+
device: z.ZodString;
|
|
408
|
+
sku: z.ZodString;
|
|
409
|
+
capabilities: z.ZodArray<typeof GoveeStateCapabilitySchema>;
|
|
410
|
+
}>;
|
|
411
|
+
}>;
|
|
412
|
+
|
|
413
|
+
// Command API response schema
|
|
414
|
+
const GoveeCommandResponseSchema: z.ZodObject<{
|
|
415
|
+
code: z.ZodNumber;
|
|
416
|
+
message: z.ZodString;
|
|
417
|
+
data: z.ZodOptional<z.ZodUnknown>;
|
|
418
|
+
}>;
|
|
419
|
+
```
|
|
420
|
+
|
|
421
|
+
### Response Types
|
|
422
|
+
|
|
423
|
+
TypeScript types inferred from Zod schemas.
|
|
424
|
+
|
|
425
|
+
```typescript
|
|
426
|
+
// Type inferred from GoveeDevicesResponseSchema
|
|
427
|
+
type GoveeDevicesResponse = {
|
|
428
|
+
code: number;
|
|
429
|
+
message: string;
|
|
430
|
+
data: Array<{
|
|
431
|
+
device?: string | null;
|
|
432
|
+
sku?: string | null;
|
|
433
|
+
deviceName?: string | null;
|
|
434
|
+
capabilities?: Array<{
|
|
435
|
+
type?: string | null;
|
|
436
|
+
instance?: string | null;
|
|
437
|
+
parameters?: {
|
|
438
|
+
dataType: string;
|
|
439
|
+
options?: Array<{
|
|
440
|
+
name: string;
|
|
441
|
+
value: unknown;
|
|
442
|
+
}>;
|
|
443
|
+
};
|
|
444
|
+
}> | null;
|
|
445
|
+
}>;
|
|
446
|
+
};
|
|
447
|
+
|
|
448
|
+
// Type inferred from GoveeStateResponseSchema
|
|
449
|
+
type GoveeStateResponse = {
|
|
450
|
+
code: number;
|
|
451
|
+
message: string;
|
|
452
|
+
data: {
|
|
453
|
+
device: string;
|
|
454
|
+
sku: string;
|
|
455
|
+
capabilities: Array<{
|
|
456
|
+
type: string;
|
|
457
|
+
instance: string;
|
|
458
|
+
state: {
|
|
459
|
+
value: unknown;
|
|
460
|
+
};
|
|
461
|
+
}>;
|
|
462
|
+
};
|
|
463
|
+
};
|
|
464
|
+
|
|
465
|
+
// Type inferred from GoveeCommandResponseSchema
|
|
466
|
+
type GoveeCommandResponse = {
|
|
467
|
+
code: number;
|
|
468
|
+
message: string;
|
|
469
|
+
data?: unknown;
|
|
470
|
+
};
|
|
471
|
+
```
|
|
472
|
+
|
|
473
|
+
### Using Validation Schemas
|
|
474
|
+
|
|
475
|
+
Examples of using exported schemas for custom validation:
|
|
476
|
+
|
|
477
|
+
```typescript
|
|
478
|
+
import {
|
|
479
|
+
GoveeDevicesResponseSchema,
|
|
480
|
+
GoveeStateResponseSchema,
|
|
481
|
+
type GoveeDevicesResponse,
|
|
482
|
+
} from '@felixgeelhaar/govee-api-client';
|
|
483
|
+
|
|
484
|
+
// Validate unknown data
|
|
485
|
+
function validateDevicesResponse(data: unknown): GoveeDevicesResponse {
|
|
486
|
+
return GoveeDevicesResponseSchema.parse(data); // Throws on invalid data
|
|
487
|
+
}
|
|
488
|
+
|
|
489
|
+
// Safe validation without throwing
|
|
490
|
+
function safeValidate(data: unknown) {
|
|
491
|
+
const result = GoveeDevicesResponseSchema.safeParse(data);
|
|
492
|
+
|
|
493
|
+
if (result.success) {
|
|
494
|
+
const validData: GoveeDevicesResponse = result.data;
|
|
495
|
+
return validData;
|
|
496
|
+
} else {
|
|
497
|
+
console.error('Validation failed:', result.error);
|
|
498
|
+
return null;
|
|
499
|
+
}
|
|
500
|
+
}
|
|
501
|
+
|
|
502
|
+
// Custom schema composition
|
|
503
|
+
import { z } from 'zod';
|
|
504
|
+
|
|
505
|
+
const ExtendedDeviceSchema = GoveeDevicesResponseSchema.extend({
|
|
506
|
+
metadata: z.object({
|
|
507
|
+
fetchedAt: z.date(),
|
|
508
|
+
cacheKey: z.string(),
|
|
509
|
+
}),
|
|
510
|
+
});
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
### ValidationError Details
|
|
514
|
+
|
|
515
|
+
Structure of validation error details returned by `getValidationDetails()`:
|
|
516
|
+
|
|
517
|
+
```typescript
|
|
518
|
+
interface ValidationDetail {
|
|
519
|
+
path: string; // JSON path to the field that failed (e.g., "data.0.deviceName")
|
|
520
|
+
message: string; // Human-readable error message
|
|
521
|
+
received: unknown; // The actual value that failed validation
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Example usage
|
|
525
|
+
try {
|
|
526
|
+
await client.getDevices();
|
|
527
|
+
} catch (error) {
|
|
528
|
+
if (error instanceof ValidationError) {
|
|
529
|
+
const details: ValidationDetail[] = error.getValidationDetails();
|
|
530
|
+
|
|
531
|
+
details.forEach(({ path, message, received }) => {
|
|
532
|
+
console.log(`Field "${path}" is invalid`);
|
|
533
|
+
console.log(`Error: ${message}`);
|
|
534
|
+
console.log(`Got: ${JSON.stringify(received)}`);
|
|
535
|
+
});
|
|
536
|
+
}
|
|
537
|
+
}
|
|
538
|
+
```
|
|
539
|
+
|
|
353
540
|
## Retry & Rate Limiting Types
|
|
354
541
|
|
|
355
542
|
### RetryPolicy
|