trane-thermostat-api 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 (59) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/client/auth.d.ts +50 -0
  4. package/dist/client/auth.d.ts.map +1 -0
  5. package/dist/client/auth.js +236 -0
  6. package/dist/client/auth.js.map +1 -0
  7. package/dist/client/nexia-client.d.ts +48 -0
  8. package/dist/client/nexia-client.d.ts.map +1 -0
  9. package/dist/client/nexia-client.js +311 -0
  10. package/dist/client/nexia-client.js.map +1 -0
  11. package/dist/devices/nexia-automation.d.ts +15 -0
  12. package/dist/devices/nexia-automation.d.ts.map +1 -0
  13. package/dist/devices/nexia-automation.js +39 -0
  14. package/dist/devices/nexia-automation.js.map +1 -0
  15. package/dist/devices/nexia-sensor.d.ts +34 -0
  16. package/dist/devices/nexia-sensor.d.ts.map +1 -0
  17. package/dist/devices/nexia-sensor.js +152 -0
  18. package/dist/devices/nexia-sensor.js.map +1 -0
  19. package/dist/devices/nexia-thermostat.d.ts +73 -0
  20. package/dist/devices/nexia-thermostat.d.ts.map +1 -0
  21. package/dist/devices/nexia-thermostat.js +357 -0
  22. package/dist/devices/nexia-thermostat.js.map +1 -0
  23. package/dist/devices/nexia-zone.d.ts +61 -0
  24. package/dist/devices/nexia-zone.d.ts.map +1 -0
  25. package/dist/devices/nexia-zone.js +370 -0
  26. package/dist/devices/nexia-zone.js.map +1 -0
  27. package/dist/index.d.ts +15 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +41 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/types/api.d.ts +277 -0
  32. package/dist/types/api.d.ts.map +1 -0
  33. package/dist/types/api.js +3 -0
  34. package/dist/types/api.js.map +1 -0
  35. package/dist/types/constants.d.ts +137 -0
  36. package/dist/types/constants.d.ts.map +1 -0
  37. package/dist/types/constants.js +160 -0
  38. package/dist/types/constants.js.map +1 -0
  39. package/dist/types/interfaces.d.ts +211 -0
  40. package/dist/types/interfaces.d.ts.map +1 -0
  41. package/dist/types/interfaces.js +3 -0
  42. package/dist/types/interfaces.js.map +1 -0
  43. package/dist/utils/errors.d.ts +94 -0
  44. package/dist/utils/errors.d.ts.map +1 -0
  45. package/dist/utils/errors.js +231 -0
  46. package/dist/utils/errors.js.map +1 -0
  47. package/dist/utils/http-utils.d.ts +59 -0
  48. package/dist/utils/http-utils.d.ts.map +1 -0
  49. package/dist/utils/http-utils.js +273 -0
  50. package/dist/utils/http-utils.js.map +1 -0
  51. package/dist/utils/json-utils.d.ts +32 -0
  52. package/dist/utils/json-utils.d.ts.map +1 -0
  53. package/dist/utils/json-utils.js +389 -0
  54. package/dist/utils/json-utils.js.map +1 -0
  55. package/dist/utils/validation.d.ts +52 -0
  56. package/dist/utils/validation.d.ts.map +1 -0
  57. package/dist/utils/validation.js +272 -0
  58. package/dist/utils/validation.js.map +1 -0
  59. package/package.json +69 -0
@@ -0,0 +1,273 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.HttpUtils = exports.HttpClient = void 0;
7
+ exports.createHttpClient = createHttpClient;
8
+ const axios_1 = __importDefault(require("axios"));
9
+ const errors_1 = require("./errors");
10
+ const constants_1 = require("../types/constants");
11
+ class HttpClient {
12
+ constructor(options) {
13
+ this.etagCache = new Map();
14
+ this.retryAttempts = options.retryAttempts || 3;
15
+ this.retryDelay = options.retryDelay || 1000;
16
+ this.axiosInstance = axios_1.default.create({
17
+ baseURL: options.baseURL,
18
+ timeout: options.timeout || 30000,
19
+ headers: {
20
+ 'Content-Type': 'application/json',
21
+ 'User-Agent': 'trane-thermostat-api/1.0.0',
22
+ ...options.headers
23
+ }
24
+ });
25
+ this.setupInterceptors();
26
+ }
27
+ setupInterceptors() {
28
+ this.axiosInstance.interceptors.request.use((config) => {
29
+ return config;
30
+ }, (error) => {
31
+ return Promise.reject(this.handleError(error));
32
+ });
33
+ this.axiosInstance.interceptors.response.use((response) => {
34
+ this.handleSuccessResponse(response);
35
+ return response;
36
+ }, (error) => {
37
+ return Promise.reject(this.handleError(error));
38
+ });
39
+ }
40
+ handleSuccessResponse(response) {
41
+ const etag = response.headers['etag'];
42
+ if (etag && response.config.url) {
43
+ this.etagCache.set(response.config.url, {
44
+ etag,
45
+ data: response.data,
46
+ timestamp: Date.now()
47
+ });
48
+ }
49
+ }
50
+ handleError(error) {
51
+ if (axios_1.default.isAxiosError(error)) {
52
+ return this.handleAxiosError(error);
53
+ }
54
+ if (error instanceof Error) {
55
+ return new errors_1.NetworkError(`Network error: ${error.message}`, error);
56
+ }
57
+ return new errors_1.ApiError('Unknown error occurred');
58
+ }
59
+ handleAxiosError(error) {
60
+ if (error.code === 'ECONNABORTED' || error.message.includes('timeout')) {
61
+ const timeout = error.config?.timeout || 30000;
62
+ return new errors_1.TimeoutError(`Request timed out after ${timeout}ms`, timeout);
63
+ }
64
+ if (error.code === 'ECONNREFUSED' || error.code === 'ENOTFOUND') {
65
+ return new errors_1.NetworkError(`Network error: ${error.message}`, error);
66
+ }
67
+ if (error.response) {
68
+ const { status, data } = error.response;
69
+ if (status === constants_1.HTTP_STATUS.UNAUTHORIZED) {
70
+ return new errors_1.AuthenticationError('Authentication failed or session expired');
71
+ }
72
+ return errors_1.ErrorFactory.createHttpError(status, error.message, data);
73
+ }
74
+ return new errors_1.NetworkError(`Request failed: ${error.message}`, error);
75
+ }
76
+ async get(url, config) {
77
+ return this.makeRequest('GET', url, undefined, config);
78
+ }
79
+ async post(url, data, config) {
80
+ return this.makeRequest('POST', url, data, config);
81
+ }
82
+ async put(url, data, config) {
83
+ return this.makeRequest('PUT', url, data, config);
84
+ }
85
+ async delete(url, config) {
86
+ return this.makeRequest('DELETE', url, undefined, config);
87
+ }
88
+ async getWithETag(url, config) {
89
+ const cacheEntry = this.etagCache.get(url);
90
+ const requestConfig = { ...config };
91
+ if (cacheEntry) {
92
+ requestConfig.headers = {
93
+ ...requestConfig.headers,
94
+ [constants_1.API_HEADERS.IF_NONE_MATCH]: cacheEntry.etag
95
+ };
96
+ }
97
+ try {
98
+ const response = await this.get(url, requestConfig);
99
+ return {
100
+ data: response.data,
101
+ status: response.status,
102
+ headers: response.headers,
103
+ fromCache: false
104
+ };
105
+ }
106
+ catch (error) {
107
+ if (error instanceof errors_1.HttpError && error.statusCode === constants_1.HTTP_STATUS.NOT_MODIFIED && cacheEntry) {
108
+ return {
109
+ data: cacheEntry.data,
110
+ status: constants_1.HTTP_STATUS.NOT_MODIFIED,
111
+ headers: {},
112
+ fromCache: true
113
+ };
114
+ }
115
+ throw error;
116
+ }
117
+ }
118
+ async makeRequest(method, url, data, config) {
119
+ const requestConfig = {
120
+ method,
121
+ url,
122
+ data,
123
+ ...config
124
+ };
125
+ let lastError;
126
+ for (let attempt = 0; attempt <= this.retryAttempts; attempt++) {
127
+ try {
128
+ const response = await this.axiosInstance.request(requestConfig);
129
+ return {
130
+ data: response.data,
131
+ status: response.status,
132
+ headers: response.headers,
133
+ etag: response.headers['etag']
134
+ };
135
+ }
136
+ catch (error) {
137
+ lastError = this.handleError(error);
138
+ if (lastError instanceof errors_1.AuthenticationError ||
139
+ (lastError instanceof errors_1.HttpError && lastError.statusCode && lastError.statusCode < 500)) {
140
+ throw lastError;
141
+ }
142
+ if (attempt === this.retryAttempts) {
143
+ throw lastError;
144
+ }
145
+ await this.delay(this.calculateRetryDelay(attempt));
146
+ }
147
+ }
148
+ throw lastError;
149
+ }
150
+ calculateRetryDelay(attempt) {
151
+ const baseDelay = this.retryDelay * Math.pow(2, attempt);
152
+ const jitter = Math.random() * 1000;
153
+ return Math.min(baseDelay + jitter, 30000);
154
+ }
155
+ delay(ms) {
156
+ return new Promise((resolve) => setTimeout(resolve, ms));
157
+ }
158
+ setAuthHeaders(apiKey, mobileId, brand) {
159
+ this.axiosInstance.defaults.headers[constants_1.API_HEADERS.API_KEY] = apiKey;
160
+ this.axiosInstance.defaults.headers[constants_1.API_HEADERS.MOBILE_ID] = mobileId;
161
+ this.axiosInstance.defaults.headers[constants_1.API_HEADERS.ASSOCIATED_BRAND] = brand;
162
+ this.axiosInstance.defaults.headers[constants_1.API_HEADERS.APP_VERSION] = '6.0.0';
163
+ }
164
+ clearAuthHeaders() {
165
+ delete this.axiosInstance.defaults.headers[constants_1.API_HEADERS.API_KEY];
166
+ delete this.axiosInstance.defaults.headers[constants_1.API_HEADERS.MOBILE_ID];
167
+ delete this.axiosInstance.defaults.headers[constants_1.API_HEADERS.ASSOCIATED_BRAND];
168
+ }
169
+ clearETagCache() {
170
+ this.etagCache.clear();
171
+ }
172
+ removeFromETagCache(url) {
173
+ this.etagCache.delete(url);
174
+ }
175
+ updateBaseURL(baseURL) {
176
+ this.axiosInstance.defaults.baseURL = baseURL;
177
+ }
178
+ getBaseURL() {
179
+ return this.axiosInstance.defaults.baseURL;
180
+ }
181
+ }
182
+ exports.HttpClient = HttpClient;
183
+ class HttpUtils {
184
+ static buildQueryString(params) {
185
+ const searchParams = new URLSearchParams();
186
+ Object.entries(params).forEach(([key, value]) => {
187
+ if (value !== undefined && value !== null) {
188
+ searchParams.append(key, String(value));
189
+ }
190
+ });
191
+ const queryString = searchParams.toString();
192
+ return queryString ? `?${queryString}` : '';
193
+ }
194
+ static joinUrls(...parts) {
195
+ return parts
196
+ .map((part, index) => {
197
+ if (index > 0 && part.startsWith('/')) {
198
+ part = part.slice(1);
199
+ }
200
+ if (index < parts.length - 1 && part.endsWith('/')) {
201
+ part = part.slice(0, -1);
202
+ }
203
+ return part;
204
+ })
205
+ .filter(part => part.length > 0)
206
+ .join('/');
207
+ }
208
+ static isValidUrl(url) {
209
+ try {
210
+ new URL(url);
211
+ return true;
212
+ }
213
+ catch {
214
+ return false;
215
+ }
216
+ }
217
+ static extractErrorMessage(response) {
218
+ if (typeof response === 'string') {
219
+ return response;
220
+ }
221
+ if (response?.message) {
222
+ return response.message;
223
+ }
224
+ if (response?.error) {
225
+ if (typeof response.error === 'string') {
226
+ return response.error;
227
+ }
228
+ if (response.error.message) {
229
+ return response.error.message;
230
+ }
231
+ }
232
+ if (response?.errors && Array.isArray(response.errors) && response.errors.length > 0) {
233
+ return response.errors[0].message || response.errors[0];
234
+ }
235
+ return 'Unknown error occurred';
236
+ }
237
+ static createFormData(data) {
238
+ const formData = new FormData();
239
+ Object.entries(data).forEach(([key, value]) => {
240
+ if (value !== undefined && value !== null) {
241
+ if (value instanceof File || value instanceof Blob) {
242
+ formData.append(key, value);
243
+ }
244
+ else if (typeof value === 'object') {
245
+ formData.append(key, JSON.stringify(value));
246
+ }
247
+ else {
248
+ formData.append(key, String(value));
249
+ }
250
+ }
251
+ });
252
+ return formData;
253
+ }
254
+ static safeJsonParse(data, fallback) {
255
+ if (typeof data === 'object' && data !== null) {
256
+ return data;
257
+ }
258
+ if (typeof data === 'string') {
259
+ try {
260
+ return JSON.parse(data);
261
+ }
262
+ catch {
263
+ return fallback;
264
+ }
265
+ }
266
+ return fallback;
267
+ }
268
+ }
269
+ exports.HttpUtils = HttpUtils;
270
+ function createHttpClient(options) {
271
+ return new HttpClient(options);
272
+ }
273
+ //# sourceMappingURL=http-utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http-utils.js","sourceRoot":"","sources":["../../src/utils/http-utils.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export interface JsonTraversalOptions {
2
+ caseSensitive?: boolean;
3
+ maxDepth?: number;
4
+ returnPath?: boolean;
5
+ }
6
+ export interface JsonSearchResult<T = any> {
7
+ value: T;
8
+ path: string[];
9
+ depth: number;
10
+ }
11
+ export declare class JsonUtils {
12
+ static findDictWithKeyValue<T = any>(jsonData: any, key: string, value: any, options?: JsonTraversalOptions): T | undefined;
13
+ static findAllDictsWithKeyValue<T = any>(jsonData: any, key: string, value: any, options?: JsonTraversalOptions): JsonSearchResult<T>[];
14
+ static getValueAtPath<T = any>(jsonData: any, path: string | string[], defaultValue?: T): T | undefined;
15
+ static setValueAtPath(jsonData: any, path: string | string[], value: any, createPath?: boolean): boolean;
16
+ static findHumiditySetpoint(setpoint: number): number;
17
+ static isNumber(str: string): boolean;
18
+ static toNumber(str: string): number | null;
19
+ static deepClone<T>(obj: T): T;
20
+ static deepMerge<T extends Record<string, any>>(target: T, ...sources: Partial<T>[]): T;
21
+ static safeParse<T = any>(jsonString: string): T | null;
22
+ static safeStringify(obj: any, space?: number): string | null;
23
+ private static jsonReplacer;
24
+ static flatten(obj: Record<string, any>, prefix?: string): Record<string, any>;
25
+ static unflatten(obj: Record<string, any>): Record<string, any>;
26
+ static validateStructure(data: any, schema: Record<string, any>): boolean;
27
+ private static objectHasKeyValue;
28
+ private static validateAgainstSchema;
29
+ }
30
+ export declare function findInJson<T = unknown>(data: unknown, predicate: (value: unknown, key: string, parent: unknown) => boolean, options?: JsonTraversalOptions): JsonSearchResult<T>[];
31
+ export declare function extractPaths(data: any, maxDepth?: number): string[];
32
+ //# sourceMappingURL=json-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json-utils.d.ts","sourceRoot":"","sources":["../../src/utils/json-utils.ts"],"names":[],"mappings":"AAOA,MAAM,WAAW,oBAAoB;IACnC,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,GAAG,GAAG;IACvC,KAAK,EAAE,CAAC,CAAC;IACT,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACf;AAED,qBAAa,SAAS;WAKN,oBAAoB,CAAC,CAAC,GAAG,GAAG,EACxC,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,oBAAyB,GACjC,CAAC,GAAG,SAAS;WAuCF,wBAAwB,CAAC,CAAC,GAAG,GAAG,EAC5C,QAAQ,EAAE,GAAG,EACb,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,GAAG,EACV,OAAO,GAAE,oBAAyB,GACjC,gBAAgB,CAAC,CAAC,CAAC,EAAE;WAqCV,cAAc,CAAC,CAAC,GAAG,GAAG,EAClC,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,YAAY,CAAC,EAAE,CAAC,GACf,CAAC,GAAG,SAAS;WA4BF,cAAc,CAC1B,QAAQ,EAAE,GAAG,EACb,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,EACvB,KAAK,EAAE,GAAG,EACV,UAAU,GAAE,OAAc,GACzB,OAAO;WAgFI,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM;WAa9C,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;WAiB9B,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;WAWpC,SAAS,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;WAwBvB,SAAS,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC;WAuBhF,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;WAWhD,aAAa,CAAC,GAAG,EAAE,GAAG,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAWpE,OAAO,CAAC,MAAM,CAAC,YAAY;WA2Bb,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;WAmB3E,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;WAaxD,iBAAiB,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,OAAO;IAYhF,OAAO,CAAC,MAAM,CAAC,iBAAiB;IAwBhC,OAAO,CAAC,MAAM,CAAC,qBAAqB;CA6CrC;AAGD,wBAAgB,UAAU,CAAC,CAAC,GAAG,OAAO,EACpC,IAAI,EAAE,OAAO,EACb,SAAS,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,KAAK,OAAO,EACpE,OAAO,GAAE,oBAAyB,GACjC,gBAAgB,CAAC,CAAC,CAAC,EAAE,CAkCvB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,GAAE,MAAW,GAAG,MAAM,EAAE,CAwBvE"}