@aigne/afs-tesla 1.11.0-beta.12

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.
@@ -0,0 +1,226 @@
1
+ let _aigne_afs = require("@aigne/afs");
2
+
3
+ //#region src/client.ts
4
+ /**
5
+ * Tesla Fleet API Client
6
+ *
7
+ * Handles API communication with token management and error mapping.
8
+ */
9
+ const REGION_BASE_URLS = {
10
+ na: "https://fleet-api.prd.na.vn.cloud.tesla.com",
11
+ eu: "https://fleet-api.prd.eu.vn.cloud.tesla.com",
12
+ cn: "https://fleet-api.prd.cn.vn.cloud.tesla.com"
13
+ };
14
+ var FleetClient = class {
15
+ token;
16
+ baseUrl;
17
+ cacheTtl;
18
+ cacheTtlStatic;
19
+ vehicleListCache = null;
20
+ energySiteListCache = null;
21
+ vinMap = {};
22
+ vinMapInitialized = false;
23
+ vehicleDataCache = /* @__PURE__ */ new Map();
24
+ nearbyChargersCache = /* @__PURE__ */ new Map();
25
+ releaseNotesCache = /* @__PURE__ */ new Map();
26
+ energySiteInfoCache = /* @__PURE__ */ new Map();
27
+ energyLiveCache = /* @__PURE__ */ new Map();
28
+ energyHistoryCache = /* @__PURE__ */ new Map();
29
+ inFlightRequests = /* @__PURE__ */ new Map();
30
+ constructor(options) {
31
+ this.token = options.token;
32
+ this.baseUrl = options.baseUrl || REGION_BASE_URLS[options.region] || REGION_BASE_URLS.na;
33
+ this.cacheTtl = options.cacheTtl * 1e3;
34
+ this.cacheTtlStatic = options.cacheTtlStatic * 1e3;
35
+ }
36
+ async apiGet(path) {
37
+ const url = `${this.baseUrl}${path}`;
38
+ const existing = this.inFlightRequests.get(url);
39
+ if (existing) return existing;
40
+ const promise = this.doFetch(url, "GET");
41
+ this.inFlightRequests.set(url, promise);
42
+ try {
43
+ return await promise;
44
+ } finally {
45
+ this.inFlightRequests.delete(url);
46
+ }
47
+ }
48
+ async apiPost(path, body) {
49
+ const url = `${this.baseUrl}${path}`;
50
+ return this.doFetch(url, "POST", body);
51
+ }
52
+ async doFetch(url, method, body) {
53
+ let response;
54
+ try {
55
+ response = await fetch(url, {
56
+ method,
57
+ headers: {
58
+ Authorization: `Bearer ${this.token}`,
59
+ "Content-Type": "application/json"
60
+ },
61
+ body: body ? JSON.stringify(body) : void 0
62
+ });
63
+ } catch {
64
+ throw new _aigne_afs.AFSError(`Fleet API request failed: network error`, "AFS_TIMEOUT");
65
+ }
66
+ if (!response.ok) return this.handleErrorResponse(response);
67
+ return (await response.json()).response;
68
+ }
69
+ async handleErrorResponse(response) {
70
+ const status = response.status;
71
+ const body = await response.json().catch(() => null);
72
+ const apiReason = this.extractApiReason(body);
73
+ if (status === 401 || status === 403) throw new _aigne_afs.AFSError(`Fleet API authentication error (HTTP ${status})`, "AFS_AUTH_ERROR");
74
+ if (status === 429) throw new _aigne_afs.AFSError(`Fleet API rate limited. Retry after ${response.headers.get("Retry-After") || "60"}s`, "AFS_RATE_LIMITED");
75
+ if (status === 404) throw new _aigne_afs.AFSNotFoundError("/", "Resource not found in Fleet API");
76
+ if (status === 408) {
77
+ if (apiReason) throw new _aigne_afs.AFSError(`Fleet API request timeout: ${apiReason}`, "AFS_TIMEOUT");
78
+ throw new _aigne_afs.AFSError("Fleet API request timeout", "AFS_TIMEOUT");
79
+ }
80
+ throw new _aigne_afs.AFSError(`Fleet API error (HTTP ${status})`, "AFS_ERROR");
81
+ }
82
+ extractApiReason(body) {
83
+ if (!body) return void 0;
84
+ if (typeof body.error_description === "string" && body.error_description.trim().length > 0) return body.error_description;
85
+ const response = body.response;
86
+ if (typeof response === "object" && response !== null) {
87
+ const reason = response.reason;
88
+ if (typeof reason === "string" && reason.trim().length > 0) return reason;
89
+ }
90
+ }
91
+ assertCommandSucceeded(data, commandLabel) {
92
+ if (typeof data !== "object" || data === null) return;
93
+ if (data.result !== false) return;
94
+ const reason = data.reason;
95
+ throw new _aigne_afs.AFSError(`${commandLabel} failed: ${typeof reason === "string" && reason.trim().length > 0 ? reason : "unknown reason"}`, "AFS_ERROR");
96
+ }
97
+ isCacheValid(cached, ttl) {
98
+ if (!cached) return false;
99
+ if (ttl === 0) return false;
100
+ return Date.now() - cached.timestamp < ttl;
101
+ }
102
+ setCachedData(cache, key, data) {
103
+ cache.set(key, {
104
+ data,
105
+ timestamp: Date.now()
106
+ });
107
+ }
108
+ async getVehicles() {
109
+ if (this.isCacheValid(this.vehicleListCache, this.cacheTtlStatic)) return this.vehicleListCache.data;
110
+ const vehicles = await this.apiGet("/api/1/vehicles");
111
+ this.vehicleListCache = {
112
+ data: vehicles,
113
+ timestamp: Date.now()
114
+ };
115
+ for (const v of vehicles) this.vinMap[v.vin] = v.id;
116
+ this.vinMapInitialized = true;
117
+ return vehicles;
118
+ }
119
+ async resolveVIN(vin) {
120
+ if (!this.vinMapInitialized) await this.getVehicles();
121
+ const id = this.vinMap[vin];
122
+ if (id !== void 0) return id;
123
+ this.vehicleListCache = null;
124
+ await this.getVehicles();
125
+ const refreshedId = this.vinMap[vin];
126
+ if (refreshedId !== void 0) return refreshedId;
127
+ throw new _aigne_afs.AFSNotFoundError(`/vehicles/${vin}`, `Vehicle VIN not found: ${vin}`);
128
+ }
129
+ async getVehicleData(vin) {
130
+ const cached = this.vehicleDataCache.get(vin);
131
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
132
+ const vehicleId = await this.resolveVIN(vin);
133
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/vehicle_data`);
134
+ this.setCachedData(this.vehicleDataCache, vin, data);
135
+ return data;
136
+ }
137
+ async getNearbyChargers(vin) {
138
+ const cached = this.nearbyChargersCache.get(vin);
139
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
140
+ const vehicleId = await this.resolveVIN(vin);
141
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/nearby_charging_sites`);
142
+ this.setCachedData(this.nearbyChargersCache, vin, data);
143
+ return data;
144
+ }
145
+ async getReleaseNotes(vin) {
146
+ const cached = this.releaseNotesCache.get(vin);
147
+ if (this.isCacheValid(cached, this.cacheTtlStatic)) return cached.data;
148
+ const vehicleId = await this.resolveVIN(vin);
149
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/release_notes`);
150
+ this.setCachedData(this.releaseNotesCache, vin, data);
151
+ return data;
152
+ }
153
+ getVehicleDataTimestamp(vin) {
154
+ return this.vehicleDataCache.get(vin)?.timestamp;
155
+ }
156
+ async wakeVehicle(vin) {
157
+ const vehicleId = await this.resolveVIN(vin);
158
+ return this.apiPost(`/api/1/vehicles/${vehicleId}/wake_up`);
159
+ }
160
+ async sendVehicleCommand(vin, command, body) {
161
+ const vehicleId = await this.resolveVIN(vin);
162
+ const response = await this.apiPost(`/api/1/vehicles/${vehicleId}/command/${command}`, body);
163
+ this.assertCommandSucceeded(response, `Vehicle command '${command}'`);
164
+ return response;
165
+ }
166
+ async getEnergySites() {
167
+ if (this.isCacheValid(this.energySiteListCache, this.cacheTtlStatic)) return this.energySiteListCache.data;
168
+ const energySites = (await this.apiGet("/api/1/products")).filter((p) => typeof p === "object" && p !== null && "energy_site_id" in p);
169
+ this.energySiteListCache = {
170
+ data: energySites,
171
+ timestamp: Date.now()
172
+ };
173
+ return energySites;
174
+ }
175
+ async resolveEnergySiteId(siteIdStr) {
176
+ const siteId = Number.parseInt(siteIdStr, 10);
177
+ if (Number.isNaN(siteId)) throw new _aigne_afs.AFSNotFoundError(`/energy/${siteIdStr}`, `Invalid energy site ID: ${siteIdStr}`);
178
+ if (!(await this.getEnergySites()).find((s) => s.energy_site_id === siteId)) throw new _aigne_afs.AFSNotFoundError(`/energy/${siteIdStr}`, `Energy site not found: ${siteIdStr}`);
179
+ return siteId;
180
+ }
181
+ async getEnergySiteInfo(siteIdStr) {
182
+ const cached = this.energySiteInfoCache.get(siteIdStr);
183
+ if (this.isCacheValid(cached, this.cacheTtlStatic)) return cached.data;
184
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
185
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/site_info`);
186
+ this.setCachedData(this.energySiteInfoCache, siteIdStr, data);
187
+ return data;
188
+ }
189
+ async getEnergySiteLiveStatus(siteIdStr) {
190
+ const cached = this.energyLiveCache.get(siteIdStr);
191
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
192
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
193
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/live_status`);
194
+ this.setCachedData(this.energyLiveCache, siteIdStr, data);
195
+ return data;
196
+ }
197
+ async getEnergySiteHistory(siteIdStr) {
198
+ const cached = this.energyHistoryCache.get(siteIdStr);
199
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
200
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
201
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/calendar_history`);
202
+ this.setCachedData(this.energyHistoryCache, siteIdStr, data);
203
+ return data;
204
+ }
205
+ async sendEnergySiteCommand(siteIdStr, command, body) {
206
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
207
+ const response = await this.apiPost(`/api/1/energy_sites/${siteId}/${command}`, body);
208
+ this.assertCommandSucceeded(response, `Energy command '${command}'`);
209
+ return response;
210
+ }
211
+ clearAllCaches() {
212
+ this.vehicleListCache = null;
213
+ this.energySiteListCache = null;
214
+ this.vehicleDataCache.clear();
215
+ this.nearbyChargersCache.clear();
216
+ this.releaseNotesCache.clear();
217
+ this.energySiteInfoCache.clear();
218
+ this.energyLiveCache.clear();
219
+ this.energyHistoryCache.clear();
220
+ this.vinMapInitialized = false;
221
+ this.vinMap = {};
222
+ }
223
+ };
224
+
225
+ //#endregion
226
+ exports.FleetClient = FleetClient;
@@ -0,0 +1,227 @@
1
+ import { AFSError, AFSNotFoundError } from "@aigne/afs";
2
+
3
+ //#region src/client.ts
4
+ /**
5
+ * Tesla Fleet API Client
6
+ *
7
+ * Handles API communication with token management and error mapping.
8
+ */
9
+ const REGION_BASE_URLS = {
10
+ na: "https://fleet-api.prd.na.vn.cloud.tesla.com",
11
+ eu: "https://fleet-api.prd.eu.vn.cloud.tesla.com",
12
+ cn: "https://fleet-api.prd.cn.vn.cloud.tesla.com"
13
+ };
14
+ var FleetClient = class {
15
+ token;
16
+ baseUrl;
17
+ cacheTtl;
18
+ cacheTtlStatic;
19
+ vehicleListCache = null;
20
+ energySiteListCache = null;
21
+ vinMap = {};
22
+ vinMapInitialized = false;
23
+ vehicleDataCache = /* @__PURE__ */ new Map();
24
+ nearbyChargersCache = /* @__PURE__ */ new Map();
25
+ releaseNotesCache = /* @__PURE__ */ new Map();
26
+ energySiteInfoCache = /* @__PURE__ */ new Map();
27
+ energyLiveCache = /* @__PURE__ */ new Map();
28
+ energyHistoryCache = /* @__PURE__ */ new Map();
29
+ inFlightRequests = /* @__PURE__ */ new Map();
30
+ constructor(options) {
31
+ this.token = options.token;
32
+ this.baseUrl = options.baseUrl || REGION_BASE_URLS[options.region] || REGION_BASE_URLS.na;
33
+ this.cacheTtl = options.cacheTtl * 1e3;
34
+ this.cacheTtlStatic = options.cacheTtlStatic * 1e3;
35
+ }
36
+ async apiGet(path) {
37
+ const url = `${this.baseUrl}${path}`;
38
+ const existing = this.inFlightRequests.get(url);
39
+ if (existing) return existing;
40
+ const promise = this.doFetch(url, "GET");
41
+ this.inFlightRequests.set(url, promise);
42
+ try {
43
+ return await promise;
44
+ } finally {
45
+ this.inFlightRequests.delete(url);
46
+ }
47
+ }
48
+ async apiPost(path, body) {
49
+ const url = `${this.baseUrl}${path}`;
50
+ return this.doFetch(url, "POST", body);
51
+ }
52
+ async doFetch(url, method, body) {
53
+ let response;
54
+ try {
55
+ response = await fetch(url, {
56
+ method,
57
+ headers: {
58
+ Authorization: `Bearer ${this.token}`,
59
+ "Content-Type": "application/json"
60
+ },
61
+ body: body ? JSON.stringify(body) : void 0
62
+ });
63
+ } catch {
64
+ throw new AFSError(`Fleet API request failed: network error`, "AFS_TIMEOUT");
65
+ }
66
+ if (!response.ok) return this.handleErrorResponse(response);
67
+ return (await response.json()).response;
68
+ }
69
+ async handleErrorResponse(response) {
70
+ const status = response.status;
71
+ const body = await response.json().catch(() => null);
72
+ const apiReason = this.extractApiReason(body);
73
+ if (status === 401 || status === 403) throw new AFSError(`Fleet API authentication error (HTTP ${status})`, "AFS_AUTH_ERROR");
74
+ if (status === 429) throw new AFSError(`Fleet API rate limited. Retry after ${response.headers.get("Retry-After") || "60"}s`, "AFS_RATE_LIMITED");
75
+ if (status === 404) throw new AFSNotFoundError("/", "Resource not found in Fleet API");
76
+ if (status === 408) {
77
+ if (apiReason) throw new AFSError(`Fleet API request timeout: ${apiReason}`, "AFS_TIMEOUT");
78
+ throw new AFSError("Fleet API request timeout", "AFS_TIMEOUT");
79
+ }
80
+ throw new AFSError(`Fleet API error (HTTP ${status})`, "AFS_ERROR");
81
+ }
82
+ extractApiReason(body) {
83
+ if (!body) return void 0;
84
+ if (typeof body.error_description === "string" && body.error_description.trim().length > 0) return body.error_description;
85
+ const response = body.response;
86
+ if (typeof response === "object" && response !== null) {
87
+ const reason = response.reason;
88
+ if (typeof reason === "string" && reason.trim().length > 0) return reason;
89
+ }
90
+ }
91
+ assertCommandSucceeded(data, commandLabel) {
92
+ if (typeof data !== "object" || data === null) return;
93
+ if (data.result !== false) return;
94
+ const reason = data.reason;
95
+ throw new AFSError(`${commandLabel} failed: ${typeof reason === "string" && reason.trim().length > 0 ? reason : "unknown reason"}`, "AFS_ERROR");
96
+ }
97
+ isCacheValid(cached, ttl) {
98
+ if (!cached) return false;
99
+ if (ttl === 0) return false;
100
+ return Date.now() - cached.timestamp < ttl;
101
+ }
102
+ setCachedData(cache, key, data) {
103
+ cache.set(key, {
104
+ data,
105
+ timestamp: Date.now()
106
+ });
107
+ }
108
+ async getVehicles() {
109
+ if (this.isCacheValid(this.vehicleListCache, this.cacheTtlStatic)) return this.vehicleListCache.data;
110
+ const vehicles = await this.apiGet("/api/1/vehicles");
111
+ this.vehicleListCache = {
112
+ data: vehicles,
113
+ timestamp: Date.now()
114
+ };
115
+ for (const v of vehicles) this.vinMap[v.vin] = v.id;
116
+ this.vinMapInitialized = true;
117
+ return vehicles;
118
+ }
119
+ async resolveVIN(vin) {
120
+ if (!this.vinMapInitialized) await this.getVehicles();
121
+ const id = this.vinMap[vin];
122
+ if (id !== void 0) return id;
123
+ this.vehicleListCache = null;
124
+ await this.getVehicles();
125
+ const refreshedId = this.vinMap[vin];
126
+ if (refreshedId !== void 0) return refreshedId;
127
+ throw new AFSNotFoundError(`/vehicles/${vin}`, `Vehicle VIN not found: ${vin}`);
128
+ }
129
+ async getVehicleData(vin) {
130
+ const cached = this.vehicleDataCache.get(vin);
131
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
132
+ const vehicleId = await this.resolveVIN(vin);
133
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/vehicle_data`);
134
+ this.setCachedData(this.vehicleDataCache, vin, data);
135
+ return data;
136
+ }
137
+ async getNearbyChargers(vin) {
138
+ const cached = this.nearbyChargersCache.get(vin);
139
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
140
+ const vehicleId = await this.resolveVIN(vin);
141
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/nearby_charging_sites`);
142
+ this.setCachedData(this.nearbyChargersCache, vin, data);
143
+ return data;
144
+ }
145
+ async getReleaseNotes(vin) {
146
+ const cached = this.releaseNotesCache.get(vin);
147
+ if (this.isCacheValid(cached, this.cacheTtlStatic)) return cached.data;
148
+ const vehicleId = await this.resolveVIN(vin);
149
+ const data = await this.apiGet(`/api/1/vehicles/${vehicleId}/release_notes`);
150
+ this.setCachedData(this.releaseNotesCache, vin, data);
151
+ return data;
152
+ }
153
+ getVehicleDataTimestamp(vin) {
154
+ return this.vehicleDataCache.get(vin)?.timestamp;
155
+ }
156
+ async wakeVehicle(vin) {
157
+ const vehicleId = await this.resolveVIN(vin);
158
+ return this.apiPost(`/api/1/vehicles/${vehicleId}/wake_up`);
159
+ }
160
+ async sendVehicleCommand(vin, command, body) {
161
+ const vehicleId = await this.resolveVIN(vin);
162
+ const response = await this.apiPost(`/api/1/vehicles/${vehicleId}/command/${command}`, body);
163
+ this.assertCommandSucceeded(response, `Vehicle command '${command}'`);
164
+ return response;
165
+ }
166
+ async getEnergySites() {
167
+ if (this.isCacheValid(this.energySiteListCache, this.cacheTtlStatic)) return this.energySiteListCache.data;
168
+ const energySites = (await this.apiGet("/api/1/products")).filter((p) => typeof p === "object" && p !== null && "energy_site_id" in p);
169
+ this.energySiteListCache = {
170
+ data: energySites,
171
+ timestamp: Date.now()
172
+ };
173
+ return energySites;
174
+ }
175
+ async resolveEnergySiteId(siteIdStr) {
176
+ const siteId = Number.parseInt(siteIdStr, 10);
177
+ if (Number.isNaN(siteId)) throw new AFSNotFoundError(`/energy/${siteIdStr}`, `Invalid energy site ID: ${siteIdStr}`);
178
+ if (!(await this.getEnergySites()).find((s) => s.energy_site_id === siteId)) throw new AFSNotFoundError(`/energy/${siteIdStr}`, `Energy site not found: ${siteIdStr}`);
179
+ return siteId;
180
+ }
181
+ async getEnergySiteInfo(siteIdStr) {
182
+ const cached = this.energySiteInfoCache.get(siteIdStr);
183
+ if (this.isCacheValid(cached, this.cacheTtlStatic)) return cached.data;
184
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
185
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/site_info`);
186
+ this.setCachedData(this.energySiteInfoCache, siteIdStr, data);
187
+ return data;
188
+ }
189
+ async getEnergySiteLiveStatus(siteIdStr) {
190
+ const cached = this.energyLiveCache.get(siteIdStr);
191
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
192
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
193
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/live_status`);
194
+ this.setCachedData(this.energyLiveCache, siteIdStr, data);
195
+ return data;
196
+ }
197
+ async getEnergySiteHistory(siteIdStr) {
198
+ const cached = this.energyHistoryCache.get(siteIdStr);
199
+ if (this.isCacheValid(cached, this.cacheTtl)) return cached.data;
200
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
201
+ const data = await this.apiGet(`/api/1/energy_sites/${siteId}/calendar_history`);
202
+ this.setCachedData(this.energyHistoryCache, siteIdStr, data);
203
+ return data;
204
+ }
205
+ async sendEnergySiteCommand(siteIdStr, command, body) {
206
+ const siteId = await this.resolveEnergySiteId(siteIdStr);
207
+ const response = await this.apiPost(`/api/1/energy_sites/${siteId}/${command}`, body);
208
+ this.assertCommandSucceeded(response, `Energy command '${command}'`);
209
+ return response;
210
+ }
211
+ clearAllCaches() {
212
+ this.vehicleListCache = null;
213
+ this.energySiteListCache = null;
214
+ this.vehicleDataCache.clear();
215
+ this.nearbyChargersCache.clear();
216
+ this.releaseNotesCache.clear();
217
+ this.energySiteInfoCache.clear();
218
+ this.energyLiveCache.clear();
219
+ this.energyHistoryCache.clear();
220
+ this.vinMapInitialized = false;
221
+ this.vinMap = {};
222
+ }
223
+ };
224
+
225
+ //#endregion
226
+ export { FleetClient };
227
+ //# sourceMappingURL=client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.mjs","names":[],"sources":["../src/client.ts"],"sourcesContent":["/**\n * Tesla Fleet API Client\n *\n * Handles API communication with token management and error mapping.\n */\n\nimport { AFSError, AFSNotFoundError } from \"@aigne/afs\";\nimport type {\n CachedData,\n TeslaEnergySite,\n TeslaVehicle,\n TeslaVehicleData,\n VINMap,\n} from \"./types.js\";\n\n// ============================================================================\n// Region base URLs\n// ============================================================================\n\nconst REGION_BASE_URLS: Record<string, string> = {\n na: \"https://fleet-api.prd.na.vn.cloud.tesla.com\",\n eu: \"https://fleet-api.prd.eu.vn.cloud.tesla.com\",\n cn: \"https://fleet-api.prd.cn.vn.cloud.tesla.com\",\n};\n\n// ============================================================================\n// Client\n// ============================================================================\n\nexport interface FleetClientOptions {\n token: string;\n region: string;\n baseUrl?: string;\n cacheTtl: number;\n cacheTtlStatic: number;\n}\n\nexport class FleetClient {\n private token: string;\n private baseUrl: string;\n private cacheTtl: number;\n private cacheTtlStatic: number;\n\n // Caches\n private vehicleListCache: CachedData<TeslaVehicle[]> | null = null;\n private energySiteListCache: CachedData<TeslaEnergySite[]> | null = null;\n private vinMap: VINMap = {};\n private vinMapInitialized = false;\n\n // Vehicle data cache: keyed by VIN\n private vehicleDataCache = new Map<string, CachedData<TeslaVehicleData>>();\n // Nearby chargers cache: keyed by VIN\n private nearbyChargersCache = new Map<string, CachedData<unknown>>();\n // Release notes cache: keyed by VIN\n private releaseNotesCache = new Map<string, CachedData<unknown>>();\n // Energy site info cache: keyed by siteId\n private energySiteInfoCache = new Map<string, CachedData<unknown>>();\n // Energy site live status cache: keyed by siteId\n private energyLiveCache = new Map<string, CachedData<unknown>>();\n // Energy site history cache: keyed by siteId\n private energyHistoryCache = new Map<string, CachedData<unknown>>();\n\n // In-flight request deduplication\n private inFlightRequests = new Map<string, Promise<unknown>>();\n\n constructor(options: FleetClientOptions) {\n this.token = options.token;\n this.baseUrl = options.baseUrl || REGION_BASE_URLS[options.region] || REGION_BASE_URLS.na!;\n this.cacheTtl = options.cacheTtl * 1000; // convert to ms\n this.cacheTtlStatic = options.cacheTtlStatic * 1000;\n }\n\n // ========== Core API Methods ==========\n\n private async apiGet<T>(path: string): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n\n // Deduplicate in-flight requests\n const existing = this.inFlightRequests.get(url);\n if (existing) {\n return existing as Promise<T>;\n }\n\n const promise = this.doFetch<T>(url, \"GET\");\n this.inFlightRequests.set(url, promise);\n\n try {\n const result = await promise;\n return result;\n } finally {\n this.inFlightRequests.delete(url);\n }\n }\n\n private async apiPost<T>(path: string, body?: Record<string, unknown>): Promise<T> {\n const url = `${this.baseUrl}${path}`;\n return this.doFetch<T>(url, \"POST\", body);\n }\n\n private async doFetch<T>(\n url: string,\n method: string,\n body?: Record<string, unknown>,\n ): Promise<T> {\n let response: Response;\n try {\n response = await fetch(url, {\n method,\n headers: {\n Authorization: `Bearer ${this.token}`,\n \"Content-Type\": \"application/json\",\n },\n body: body ? JSON.stringify(body) : undefined,\n });\n } catch {\n throw new AFSError(`Fleet API request failed: network error`, \"AFS_TIMEOUT\");\n }\n\n if (!response.ok) {\n return this.handleErrorResponse(response);\n }\n\n const json = (await response.json()) as { response: T };\n return json.response;\n }\n\n private async handleErrorResponse(response: Response): Promise<never> {\n const status = response.status;\n const body = (await response.json().catch(() => null)) as Record<string, unknown> | null;\n const apiReason = this.extractApiReason(body);\n\n if (status === 401 || status === 403) {\n throw new AFSError(`Fleet API authentication error (HTTP ${status})`, \"AFS_AUTH_ERROR\");\n }\n\n if (status === 429) {\n const retryAfter = response.headers.get(\"Retry-After\") || \"60\";\n throw new AFSError(`Fleet API rate limited. Retry after ${retryAfter}s`, \"AFS_RATE_LIMITED\");\n }\n\n if (status === 404) {\n throw new AFSNotFoundError(\"/\", \"Resource not found in Fleet API\");\n }\n\n if (status === 408) {\n if (apiReason) {\n throw new AFSError(`Fleet API request timeout: ${apiReason}`, \"AFS_TIMEOUT\");\n }\n throw new AFSError(\"Fleet API request timeout\", \"AFS_TIMEOUT\");\n }\n\n throw new AFSError(`Fleet API error (HTTP ${status})`, \"AFS_ERROR\");\n }\n\n private extractApiReason(body: Record<string, unknown> | null): string | undefined {\n if (!body) return undefined;\n if (typeof body.error_description === \"string\" && body.error_description.trim().length > 0) {\n return body.error_description;\n }\n const response = body.response;\n if (typeof response === \"object\" && response !== null) {\n const reason = (response as Record<string, unknown>).reason;\n if (typeof reason === \"string\" && reason.trim().length > 0) {\n return reason;\n }\n }\n return undefined;\n }\n\n private assertCommandSucceeded(data: unknown, commandLabel: string): void {\n if (typeof data !== \"object\" || data === null) return;\n const result = (data as Record<string, unknown>).result;\n if (result !== false) return;\n\n const reason = (data as Record<string, unknown>).reason;\n const reasonText =\n typeof reason === \"string\" && reason.trim().length > 0 ? reason : \"unknown reason\";\n throw new AFSError(`${commandLabel} failed: ${reasonText}`, \"AFS_ERROR\");\n }\n\n // ========== Cache Helpers ==========\n\n private isCacheValid<T>(\n cached: CachedData<T> | null | undefined,\n ttl: number,\n ): cached is CachedData<T> {\n if (!cached) return false;\n if (ttl === 0) return false;\n return Date.now() - cached.timestamp < ttl;\n }\n\n private setCachedData<T>(cache: Map<string, CachedData<T>>, key: string, data: T): void {\n cache.set(key, { data, timestamp: Date.now() });\n }\n\n // ========== Vehicle Methods ==========\n\n async getVehicles(): Promise<TeslaVehicle[]> {\n if (this.isCacheValid(this.vehicleListCache, this.cacheTtlStatic)) {\n return this.vehicleListCache.data;\n }\n\n const vehicles = await this.apiGet<TeslaVehicle[]>(\"/api/1/vehicles\");\n this.vehicleListCache = { data: vehicles, timestamp: Date.now() };\n\n // Update VIN map\n for (const v of vehicles) {\n this.vinMap[v.vin] = v.id;\n }\n this.vinMapInitialized = true;\n\n return vehicles;\n }\n\n async resolveVIN(vin: string): Promise<number> {\n // Ensure VIN map is initialized\n if (!this.vinMapInitialized) {\n await this.getVehicles();\n }\n\n // Check map\n const id = this.vinMap[vin];\n if (id !== undefined) return id;\n\n // Refresh map once and try again\n this.vehicleListCache = null;\n await this.getVehicles();\n\n const refreshedId = this.vinMap[vin];\n if (refreshedId !== undefined) return refreshedId;\n\n throw new AFSNotFoundError(`/vehicles/${vin}`, `Vehicle VIN not found: ${vin}`);\n }\n\n async getVehicleData(vin: string): Promise<TeslaVehicleData> {\n // Check cache\n const cached = this.vehicleDataCache.get(vin);\n if (this.isCacheValid(cached, this.cacheTtl)) {\n return cached.data;\n }\n\n const vehicleId = await this.resolveVIN(vin);\n const data = await this.apiGet<TeslaVehicleData>(`/api/1/vehicles/${vehicleId}/vehicle_data`);\n this.setCachedData(this.vehicleDataCache, vin, data);\n return data;\n }\n\n async getNearbyChargers(vin: string): Promise<unknown> {\n const cached = this.nearbyChargersCache.get(vin);\n if (this.isCacheValid(cached, this.cacheTtl)) {\n return cached.data;\n }\n\n const vehicleId = await this.resolveVIN(vin);\n const data = await this.apiGet<unknown>(`/api/1/vehicles/${vehicleId}/nearby_charging_sites`);\n this.setCachedData(this.nearbyChargersCache, vin, data);\n return data;\n }\n\n async getReleaseNotes(vin: string): Promise<unknown> {\n const cached = this.releaseNotesCache.get(vin);\n if (this.isCacheValid(cached, this.cacheTtlStatic)) {\n return cached.data;\n }\n\n const vehicleId = await this.resolveVIN(vin);\n const data = await this.apiGet<unknown>(`/api/1/vehicles/${vehicleId}/release_notes`);\n this.setCachedData(this.releaseNotesCache, vin, data);\n return data;\n }\n\n getVehicleDataTimestamp(vin: string): number | undefined {\n return this.vehicleDataCache.get(vin)?.timestamp;\n }\n\n // ========== Vehicle Commands ==========\n\n async wakeVehicle(vin: string): Promise<unknown> {\n const vehicleId = await this.resolveVIN(vin);\n return this.apiPost(`/api/1/vehicles/${vehicleId}/wake_up`);\n }\n\n async sendVehicleCommand(\n vin: string,\n command: string,\n body?: Record<string, unknown>,\n ): Promise<unknown> {\n const vehicleId = await this.resolveVIN(vin);\n const response = await this.apiPost<unknown>(\n `/api/1/vehicles/${vehicleId}/command/${command}`,\n body,\n );\n this.assertCommandSucceeded(response, `Vehicle command '${command}'`);\n return response;\n }\n\n // ========== Energy Methods ==========\n\n async getEnergySites(): Promise<TeslaEnergySite[]> {\n if (this.isCacheValid(this.energySiteListCache, this.cacheTtlStatic)) {\n return this.energySiteListCache.data;\n }\n\n // Products endpoint returns both vehicles and energy sites\n const products = await this.apiGet<unknown[]>(\"/api/1/products\");\n const energySites = products.filter(\n (p: unknown): p is TeslaEnergySite =>\n typeof p === \"object\" && p !== null && \"energy_site_id\" in p,\n );\n\n this.energySiteListCache = { data: energySites, timestamp: Date.now() };\n return energySites;\n }\n\n async resolveEnergySiteId(siteIdStr: string): Promise<number> {\n const siteId = Number.parseInt(siteIdStr, 10);\n if (Number.isNaN(siteId)) {\n throw new AFSNotFoundError(`/energy/${siteIdStr}`, `Invalid energy site ID: ${siteIdStr}`);\n }\n\n const sites = await this.getEnergySites();\n const found = sites.find((s) => s.energy_site_id === siteId);\n if (!found) {\n throw new AFSNotFoundError(`/energy/${siteIdStr}`, `Energy site not found: ${siteIdStr}`);\n }\n\n return siteId;\n }\n\n async getEnergySiteInfo(siteIdStr: string): Promise<unknown> {\n const cached = this.energySiteInfoCache.get(siteIdStr);\n if (this.isCacheValid(cached, this.cacheTtlStatic)) {\n return cached.data;\n }\n\n const siteId = await this.resolveEnergySiteId(siteIdStr);\n const data = await this.apiGet<unknown>(`/api/1/energy_sites/${siteId}/site_info`);\n this.setCachedData(this.energySiteInfoCache, siteIdStr, data);\n return data;\n }\n\n async getEnergySiteLiveStatus(siteIdStr: string): Promise<unknown> {\n const cached = this.energyLiveCache.get(siteIdStr);\n if (this.isCacheValid(cached, this.cacheTtl)) {\n return cached.data;\n }\n\n const siteId = await this.resolveEnergySiteId(siteIdStr);\n const data = await this.apiGet<unknown>(`/api/1/energy_sites/${siteId}/live_status`);\n this.setCachedData(this.energyLiveCache, siteIdStr, data);\n return data;\n }\n\n async getEnergySiteHistory(siteIdStr: string): Promise<unknown> {\n const cached = this.energyHistoryCache.get(siteIdStr);\n if (this.isCacheValid(cached, this.cacheTtl)) {\n return cached.data;\n }\n\n const siteId = await this.resolveEnergySiteId(siteIdStr);\n const data = await this.apiGet<unknown>(`/api/1/energy_sites/${siteId}/calendar_history`);\n this.setCachedData(this.energyHistoryCache, siteIdStr, data);\n return data;\n }\n\n // ========== Energy Commands ==========\n\n async sendEnergySiteCommand(\n siteIdStr: string,\n command: string,\n body?: Record<string, unknown>,\n ): Promise<unknown> {\n const siteId = await this.resolveEnergySiteId(siteIdStr);\n const response = await this.apiPost<unknown>(`/api/1/energy_sites/${siteId}/${command}`, body);\n this.assertCommandSucceeded(response, `Energy command '${command}'`);\n return response;\n }\n\n // ========== Cache Management ==========\n\n clearAllCaches(): void {\n this.vehicleListCache = null;\n this.energySiteListCache = null;\n this.vehicleDataCache.clear();\n this.nearbyChargersCache.clear();\n this.releaseNotesCache.clear();\n this.energySiteInfoCache.clear();\n this.energyLiveCache.clear();\n this.energyHistoryCache.clear();\n this.vinMapInitialized = false;\n this.vinMap = {};\n }\n}\n"],"mappings":"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"}
package/dist/index.cjs ADDED
@@ -0,0 +1,11 @@
1
+ Object.defineProperty(exports, '__esModule', { value: true });
2
+ const require_auth = require('./auth.cjs');
3
+ const require_tesla_provider = require('./tesla-provider.cjs');
4
+
5
+ exports.AFSTesla = require_tesla_provider.AFSTesla;
6
+ exports.TESLA_AUTH_URL = require_auth.TESLA_AUTH_URL;
7
+ exports.TESLA_SCOPES = require_auth.TESLA_SCOPES;
8
+ exports.TESLA_TOKEN_URL = require_auth.TESLA_TOKEN_URL;
9
+ exports.TeslaAuth = require_auth.TeslaAuth;
10
+ exports.afsTeslaOptionsSchema = require_tesla_provider.afsTeslaOptionsSchema;
11
+ exports.default = require_tesla_provider.AFSTesla;
@@ -0,0 +1,4 @@
1
+ import { TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth } from "./auth.cjs";
2
+ import { AFSTesla, AFSTeslaInput, AFSTeslaOptions, afsTeslaOptionsSchema } from "./tesla-provider.cjs";
3
+ import { CachedData, TeslaEnergySite, TeslaVehicle, TeslaVehicleData, VINMap } from "./types.cjs";
4
+ export { AFSTesla, type AFSTeslaInput, type AFSTeslaOptions, CachedData, TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth, TeslaEnergySite, TeslaVehicle, TeslaVehicleData, VINMap, afsTeslaOptionsSchema, AFSTesla as default };
@@ -0,0 +1,4 @@
1
+ import { TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth } from "./auth.mjs";
2
+ import { AFSTesla, AFSTeslaInput, AFSTeslaOptions, afsTeslaOptionsSchema } from "./tesla-provider.mjs";
3
+ import { CachedData, TeslaEnergySite, TeslaVehicle, TeslaVehicleData, VINMap } from "./types.mjs";
4
+ export { AFSTesla, type AFSTeslaInput, type AFSTeslaOptions, CachedData, TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth, TeslaEnergySite, TeslaVehicle, TeslaVehicleData, VINMap, afsTeslaOptionsSchema, AFSTesla as default };
package/dist/index.mjs ADDED
@@ -0,0 +1,4 @@
1
+ import { TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth } from "./auth.mjs";
2
+ import { AFSTesla, afsTeslaOptionsSchema } from "./tesla-provider.mjs";
3
+
4
+ export { AFSTesla, TESLA_AUTH_URL, TESLA_SCOPES, TESLA_TOKEN_URL, TeslaAuth, afsTeslaOptionsSchema, AFSTesla as default };