@smarthome.exchange/api 0.1.0 → 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.
- package/changelog.md +25 -0
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/classes.smarthomeexchangeapiclient.d.ts +56 -13
- package/dist_ts/classes.smarthomeexchangeapiclient.js +351 -52
- package/package.json +10 -9
- package/readme.md +68 -11
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/classes.smarthomeexchangeapiclient.ts +444 -60
|
@@ -1,78 +1,364 @@
|
|
|
1
1
|
import * as plugins from './plugins.js';
|
|
2
|
+
const maxLifecycleOperationCount = 64;
|
|
2
3
|
export class SmarthomeExchangeApiClient {
|
|
3
|
-
|
|
4
|
+
#homeId;
|
|
5
|
+
#httpEndpoint;
|
|
6
|
+
#hubUrl;
|
|
7
|
+
#socketConnectionPreparationTimeoutMs;
|
|
8
|
+
#authorizationHeaderProvider;
|
|
9
|
+
lifecycleTail = Promise.resolve();
|
|
10
|
+
lifecycleOperationCount = 0;
|
|
11
|
+
queuedLifecycleOperation;
|
|
12
|
+
stopIntentGeneration = 0;
|
|
13
|
+
pendingStartAbortController;
|
|
14
|
+
socketPendingStop;
|
|
15
|
+
socketNeedsCleanup = false;
|
|
16
|
+
#typedsocketClient;
|
|
4
17
|
typedrouter = new plugins.typedrequest.TypedRouter();
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
18
|
+
constructor(optionsArg) {
|
|
19
|
+
this.assertKnownProperties(optionsArg, ['hubUrl', 'homeId', 'authorizationHeaderProvider', 'socketConnectionPreparationTimeoutMs'], 'Client options');
|
|
20
|
+
if (!optionsArg || typeof optionsArg.homeId !== 'string'
|
|
21
|
+
|| optionsArg.homeId.length < 1 || optionsArg.homeId.length > 200
|
|
22
|
+
|| optionsArg.homeId.trim() !== optionsArg.homeId
|
|
23
|
+
|| typeof optionsArg.authorizationHeaderProvider !== 'function'
|
|
24
|
+
|| (optionsArg.hubUrl !== undefined && typeof optionsArg.hubUrl !== 'string')) {
|
|
25
|
+
throw new TypeError('The API client requires a homeId and authorizationHeaderProvider.');
|
|
26
|
+
}
|
|
27
|
+
let hubUrl;
|
|
28
|
+
try {
|
|
29
|
+
hubUrl = new URL(optionsArg.hubUrl ?? 'http://localhost:8080');
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
throw new TypeError('hubUrl must be an absolute HTTP or HTTPS URL.');
|
|
33
|
+
}
|
|
34
|
+
if (!['http:', 'https:'].includes(hubUrl.protocol)
|
|
35
|
+
|| hubUrl.username || hubUrl.password || hubUrl.search || hubUrl.hash) {
|
|
36
|
+
throw new TypeError('hubUrl must be an HTTP or HTTPS URL without credentials, query, or fragment.');
|
|
37
|
+
}
|
|
38
|
+
const preparationTimeoutMs = optionsArg.socketConnectionPreparationTimeoutMs;
|
|
39
|
+
if (preparationTimeoutMs !== undefined && (!Number.isInteger(preparationTimeoutMs)
|
|
40
|
+
|| preparationTimeoutMs < 1
|
|
41
|
+
|| preparationTimeoutMs > plugins.typedsocket.TYPEDSOCKET_MAX_CONNECTION_PREPARATION_TIMEOUT_MS)) {
|
|
42
|
+
throw new TypeError('Socket credential preparation requires a positive deadline no greater than 10000ms.');
|
|
43
|
+
}
|
|
44
|
+
this.#socketConnectionPreparationTimeoutMs = preparationTimeoutMs;
|
|
45
|
+
this.#hubUrl = hubUrl.href.replace(/\/$/, '');
|
|
46
|
+
hubUrl.pathname = `${hubUrl.pathname.replace(/\/+$/, '')}/typedrequest`;
|
|
47
|
+
this.#httpEndpoint = hubUrl.href;
|
|
48
|
+
this.#homeId = optionsArg.homeId;
|
|
49
|
+
this.#authorizationHeaderProvider = optionsArg.authorizationHeaderProvider;
|
|
8
50
|
}
|
|
9
|
-
get
|
|
10
|
-
return
|
|
51
|
+
get homeId() {
|
|
52
|
+
return this.#homeId;
|
|
11
53
|
}
|
|
12
|
-
|
|
13
|
-
return this
|
|
54
|
+
get typedsocketClient() {
|
|
55
|
+
return this.#typedsocketClient;
|
|
14
56
|
}
|
|
15
57
|
createHttpRequest(operationArg) {
|
|
16
|
-
return new plugins.typedrequest.TypedRequest(this
|
|
58
|
+
return new plugins.typedrequest.TypedRequest(this.#httpEndpoint, operationArg);
|
|
17
59
|
}
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
60
|
+
captureRequestOptions(optionsArg) {
|
|
61
|
+
this.assertKnownProperties(optionsArg, ['abortSignal', 'timeoutMs', 'useCache'], 'Request options');
|
|
62
|
+
const options = { ...optionsArg };
|
|
63
|
+
if ((options.abortSignal !== undefined && !(options.abortSignal instanceof AbortSignal))
|
|
64
|
+
|| (options.useCache !== undefined && typeof options.useCache !== 'boolean')
|
|
65
|
+
|| (options.timeoutMs !== undefined && (!Number.isInteger(options.timeoutMs)
|
|
66
|
+
|| options.timeoutMs < 1 || options.timeoutMs > 2_147_483_647))) {
|
|
67
|
+
throw new TypeError('Request options require an AbortSignal, boolean cache option, and positive timer-safe deadline.');
|
|
22
68
|
}
|
|
23
|
-
return
|
|
69
|
+
return options;
|
|
24
70
|
}
|
|
25
|
-
async
|
|
26
|
-
|
|
71
|
+
async fire(operationArg, requestPayloadArg, optionsArg = {}) {
|
|
72
|
+
const requestOptions = this.captureRequestOptions(optionsArg);
|
|
73
|
+
requestOptions.abortSignal?.throwIfAborted();
|
|
74
|
+
if (this.#typedsocketClient) {
|
|
75
|
+
return this.#typedsocketClient.createTypedRequest(operationArg, undefined, {
|
|
76
|
+
timeoutMs: requestOptions.timeoutMs,
|
|
77
|
+
}).fire(requestPayloadArg, {
|
|
78
|
+
...requestOptions,
|
|
79
|
+
maxRetries: 0,
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
const authorization = await this.getAuthorization(Object.freeze({
|
|
83
|
+
homeId: this.#homeId,
|
|
84
|
+
endpoint: this.#httpEndpoint,
|
|
85
|
+
method: operationArg,
|
|
86
|
+
transport: 'http',
|
|
87
|
+
abortSignal: requestOptions.abortSignal,
|
|
88
|
+
}));
|
|
89
|
+
requestOptions.abortSignal?.throwIfAborted();
|
|
90
|
+
return this.createHttpRequest(operationArg).fire(requestPayloadArg, {
|
|
91
|
+
...requestOptions,
|
|
92
|
+
maxRetries: 0,
|
|
93
|
+
headers: { authorization },
|
|
94
|
+
});
|
|
27
95
|
}
|
|
28
|
-
async
|
|
29
|
-
|
|
30
|
-
|
|
96
|
+
async getAuthorization(contextArg) {
|
|
97
|
+
const signal = contextArg.abortSignal;
|
|
98
|
+
signal?.throwIfAborted();
|
|
99
|
+
let removeAbortHandler = () => { };
|
|
100
|
+
let authorization;
|
|
101
|
+
try {
|
|
102
|
+
authorization = await new Promise((resolve, reject) => {
|
|
103
|
+
const onAbort = () => reject(signal?.reason);
|
|
104
|
+
signal?.addEventListener('abort', onAbort, { once: true });
|
|
105
|
+
removeAbortHandler = () => signal?.removeEventListener('abort', onAbort);
|
|
106
|
+
if (signal?.aborted) {
|
|
107
|
+
onAbort();
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
void Promise.resolve(this.#authorizationHeaderProvider(contextArg)).then(resolve, reject);
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
finally {
|
|
114
|
+
removeAbortHandler();
|
|
115
|
+
}
|
|
116
|
+
if (typeof authorization !== 'string' || authorization.trim().length === 0) {
|
|
117
|
+
throw new TypeError('authorizationHeaderProvider must return a nonempty Authorization header.');
|
|
118
|
+
}
|
|
119
|
+
return authorization;
|
|
31
120
|
}
|
|
32
|
-
async
|
|
33
|
-
|
|
121
|
+
async prepareSocketConnection(contextArg) {
|
|
122
|
+
if (!contextArg.supportsHeaders) {
|
|
123
|
+
throw new plugins.typedsocket.TypedSocketConnectionPreparationError('unsupported-headers');
|
|
124
|
+
}
|
|
125
|
+
const authorization = await this.getAuthorization(Object.freeze({
|
|
126
|
+
homeId: this.#homeId,
|
|
127
|
+
endpoint: contextArg.url,
|
|
128
|
+
method: 'connect',
|
|
129
|
+
transport: 'websocket',
|
|
130
|
+
abortSignal: contextArg.abortSignal,
|
|
131
|
+
attempt: contextArg.attempt,
|
|
132
|
+
deadline: contextArg.deadline,
|
|
133
|
+
}));
|
|
134
|
+
contextArg.abortSignal.throwIfAborted();
|
|
135
|
+
return { headers: { authorization } };
|
|
34
136
|
}
|
|
35
|
-
|
|
36
|
-
|
|
137
|
+
prepareRequest(payloadArg, allowedKeysArg, omitUndefinedFiltersArg = false) {
|
|
138
|
+
this.assertKnownProperties(payloadArg, allowedKeysArg, 'Request');
|
|
139
|
+
const normalizedPayload = { ...payloadArg };
|
|
140
|
+
if (omitUndefinedFiltersArg) {
|
|
141
|
+
for (const key of allowedKeysArg) {
|
|
142
|
+
if (Object.getOwnPropertyDescriptor(normalizedPayload, key)?.value === undefined) {
|
|
143
|
+
Reflect.deleteProperty(normalizedPayload, key);
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
this.assertJsonData(normalizedPayload);
|
|
148
|
+
return { ...structuredClone(normalizedPayload), context: { homeId: this.#homeId } };
|
|
37
149
|
}
|
|
38
|
-
|
|
39
|
-
|
|
150
|
+
assertJsonData(valueArg) {
|
|
151
|
+
const activeObjects = new WeakSet();
|
|
152
|
+
const pending = [{ value: valueArg }];
|
|
153
|
+
while (pending.length > 0) {
|
|
154
|
+
const entry = pending.pop();
|
|
155
|
+
if (!entry)
|
|
156
|
+
continue;
|
|
157
|
+
const value = entry.value;
|
|
158
|
+
if (entry.exiting) {
|
|
159
|
+
if (value && typeof value === 'object')
|
|
160
|
+
activeObjects.delete(value);
|
|
161
|
+
continue;
|
|
162
|
+
}
|
|
163
|
+
if (value === null || typeof value === 'string' || typeof value === 'boolean')
|
|
164
|
+
continue;
|
|
165
|
+
if (typeof value === 'number' && Number.isFinite(value))
|
|
166
|
+
continue;
|
|
167
|
+
if (!value || typeof value !== 'object' || activeObjects.has(value)) {
|
|
168
|
+
throw new TypeError('Request payload must contain finite, acyclic JSON data.');
|
|
169
|
+
}
|
|
170
|
+
const isArray = Array.isArray(value);
|
|
171
|
+
if (!isArray && ![Object.prototype, null].includes(Object.getPrototypeOf(value))) {
|
|
172
|
+
throw new TypeError('Request payload must contain plain JSON objects.');
|
|
173
|
+
}
|
|
174
|
+
const keys = Reflect.ownKeys(value);
|
|
175
|
+
if (isArray && keys.length !== value.length + 1) {
|
|
176
|
+
throw new TypeError('Request payload arrays must contain only populated indices.');
|
|
177
|
+
}
|
|
178
|
+
activeObjects.add(value);
|
|
179
|
+
pending.push({ value, exiting: true });
|
|
180
|
+
for (const key of keys) {
|
|
181
|
+
if (isArray && key === 'length')
|
|
182
|
+
continue;
|
|
183
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, key);
|
|
184
|
+
if (typeof key !== 'string' || !descriptor || !('value' in descriptor)
|
|
185
|
+
|| !descriptor.enumerable
|
|
186
|
+
|| (isArray && (!/^(0|[1-9][0-9]*)$/.test(key) || Number(key) >= value.length))) {
|
|
187
|
+
throw new TypeError('Request payload cannot contain accessors or unsupported properties.');
|
|
188
|
+
}
|
|
189
|
+
pending.push({ value: descriptor.value });
|
|
190
|
+
}
|
|
191
|
+
}
|
|
40
192
|
}
|
|
41
|
-
|
|
42
|
-
|
|
193
|
+
assertKnownProperties(valueArg, allowedKeysArg, labelArg) {
|
|
194
|
+
if (!valueArg || typeof valueArg !== 'object' || Array.isArray(valueArg)
|
|
195
|
+
|| ![Object.prototype, null].includes(Object.getPrototypeOf(valueArg))) {
|
|
196
|
+
throw new TypeError(`${labelArg} must be a plain object.`);
|
|
197
|
+
}
|
|
198
|
+
for (const key of Reflect.ownKeys(valueArg)) {
|
|
199
|
+
const descriptor = Object.getOwnPropertyDescriptor(valueArg, key);
|
|
200
|
+
if (typeof key !== 'string' || !allowedKeysArg.includes(key)
|
|
201
|
+
|| !descriptor || !('value' in descriptor) || !descriptor.enumerable) {
|
|
202
|
+
throw new TypeError(`${labelArg} contains unsupported properties.`);
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
queueLifecycleOperation(targetArg) {
|
|
207
|
+
if (this.queuedLifecycleOperation?.target === targetArg) {
|
|
208
|
+
return this.queuedLifecycleOperation.promise;
|
|
209
|
+
}
|
|
210
|
+
if (this.lifecycleOperationCount >= maxLifecycleOperationCount) {
|
|
211
|
+
return Promise.reject(new Error(`SmarthomeExchangeApiClient lifecycle queue is limited to ${maxLifecycleOperationCount} active and queued operations.`));
|
|
212
|
+
}
|
|
213
|
+
const startStopIntentGeneration = this.stopIntentGeneration;
|
|
214
|
+
if (targetArg === 'stopped') {
|
|
215
|
+
this.stopIntentGeneration++;
|
|
216
|
+
this.pendingStartAbortController?.abort();
|
|
217
|
+
}
|
|
218
|
+
this.lifecycleOperationCount++;
|
|
219
|
+
const operationPromise = this.lifecycleTail.then(async () => {
|
|
220
|
+
if (targetArg === 'started') {
|
|
221
|
+
if (this.stopIntentGeneration !== startStopIntentGeneration) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
if (this.socketNeedsCleanup) {
|
|
225
|
+
throw new Error('Cannot start while the existing TypedSocket requires successful cleanup.');
|
|
226
|
+
}
|
|
227
|
+
if (!this.#typedsocketClient) {
|
|
228
|
+
const startAbortController = new AbortController();
|
|
229
|
+
this.pendingStartAbortController = startAbortController;
|
|
230
|
+
try {
|
|
231
|
+
const createdSocket = await plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.#hubUrl, {
|
|
232
|
+
abortSignal: startAbortController.signal,
|
|
233
|
+
autoReconnect: false,
|
|
234
|
+
prepareConnection: (contextArg) => this.prepareSocketConnection(contextArg),
|
|
235
|
+
connectionPreparationTimeoutMs: this.#socketConnectionPreparationTimeoutMs,
|
|
236
|
+
});
|
|
237
|
+
if (this.stopIntentGeneration !== startStopIntentGeneration) {
|
|
238
|
+
this.socketPendingStop = createdSocket;
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
this.#typedsocketClient = createdSocket;
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
catch (error) {
|
|
245
|
+
if (startAbortController.signal.aborted &&
|
|
246
|
+
this.stopIntentGeneration !== startStopIntentGeneration &&
|
|
247
|
+
error instanceof plugins.typedsocket.TypedSocketClientStartupAbortedError) {
|
|
248
|
+
return;
|
|
249
|
+
}
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
finally {
|
|
253
|
+
if (this.pendingStartAbortController === startAbortController) {
|
|
254
|
+
this.pendingStartAbortController = undefined;
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
return;
|
|
259
|
+
}
|
|
260
|
+
const socketToStop = this.socketPendingStop ?? this.#typedsocketClient;
|
|
261
|
+
if (!socketToStop) {
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
try {
|
|
265
|
+
await socketToStop.stop();
|
|
266
|
+
}
|
|
267
|
+
catch (error) {
|
|
268
|
+
this.socketNeedsCleanup = true;
|
|
269
|
+
throw error;
|
|
270
|
+
}
|
|
271
|
+
if (this.socketPendingStop === socketToStop) {
|
|
272
|
+
this.socketPendingStop = undefined;
|
|
273
|
+
}
|
|
274
|
+
if (this.#typedsocketClient === socketToStop) {
|
|
275
|
+
this.#typedsocketClient = undefined;
|
|
276
|
+
}
|
|
277
|
+
this.socketNeedsCleanup = false;
|
|
278
|
+
});
|
|
279
|
+
const lifecycleOperation = {
|
|
280
|
+
target: targetArg,
|
|
281
|
+
promise: operationPromise,
|
|
282
|
+
};
|
|
283
|
+
this.queuedLifecycleOperation = lifecycleOperation;
|
|
284
|
+
this.lifecycleTail = operationPromise.catch(() => undefined);
|
|
285
|
+
const finishOperation = () => {
|
|
286
|
+
this.lifecycleOperationCount--;
|
|
287
|
+
if (this.queuedLifecycleOperation === lifecycleOperation) {
|
|
288
|
+
this.queuedLifecycleOperation = undefined;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
void operationPromise.then(finishOperation, finishOperation);
|
|
292
|
+
return operationPromise;
|
|
293
|
+
}
|
|
294
|
+
start() {
|
|
295
|
+
return this.queueLifecycleOperation('started');
|
|
296
|
+
}
|
|
297
|
+
stop() {
|
|
298
|
+
return this.queueLifecycleOperation('stopped');
|
|
299
|
+
}
|
|
300
|
+
async listDevices(requestArg = {}, optionsArg) {
|
|
301
|
+
return this.fire('listDevices', this.prepareRequest(requestArg, ['room', 'capability'], true), optionsArg);
|
|
302
|
+
}
|
|
303
|
+
async listAgents(optionsArg) {
|
|
304
|
+
return this.fire('listAgents', this.prepareRequest({}, []), optionsArg);
|
|
305
|
+
}
|
|
306
|
+
async listTools(requestArg = {}, optionsArg) {
|
|
307
|
+
return this.fire('listTools', this.prepareRequest(requestArg, ['ownerId'], true), optionsArg);
|
|
308
|
+
}
|
|
309
|
+
async getHomeSnapshot(optionsArg) {
|
|
310
|
+
return this.fire('getHomeSnapshot', this.prepareRequest({}, []), optionsArg);
|
|
43
311
|
}
|
|
44
312
|
watchHomeSnapshot(callbackArg, optionsArg = {}) {
|
|
45
|
-
|
|
313
|
+
this.assertKnownProperties(optionsArg, ['abortSignal', 'timeoutMs', 'intervalMs', 'immediate', 'onError'], 'Watcher options');
|
|
314
|
+
const options = { ...optionsArg };
|
|
315
|
+
if (typeof callbackArg !== 'function'
|
|
316
|
+
|| (options.immediate !== undefined && typeof options.immediate !== 'boolean')
|
|
317
|
+
|| (options.onError !== undefined && typeof options.onError !== 'function')) {
|
|
318
|
+
throw new TypeError('Snapshot watchers require a callback, boolean immediate option, and optional error handler.');
|
|
319
|
+
}
|
|
320
|
+
this.captureRequestOptions({ abortSignal: options.abortSignal, timeoutMs: options.timeoutMs });
|
|
321
|
+
const intervalMs = options.intervalMs ?? 5000;
|
|
46
322
|
if (!Number.isInteger(intervalMs) || intervalMs < 1 || intervalMs > 2_147_483_647) {
|
|
47
323
|
throw new Error('watchHomeSnapshot intervalMs must be an integer from 1 through 2147483647.');
|
|
48
324
|
}
|
|
49
325
|
let stopped = false;
|
|
50
326
|
let timeout;
|
|
51
327
|
let activePoll;
|
|
328
|
+
let activeRequestController;
|
|
52
329
|
let userHandlerActive = false;
|
|
53
330
|
const clearScheduledPoll = () => {
|
|
54
|
-
if (timeout) {
|
|
331
|
+
if (timeout !== undefined) {
|
|
55
332
|
clearTimeout(timeout);
|
|
56
333
|
timeout = undefined;
|
|
57
334
|
}
|
|
58
335
|
};
|
|
336
|
+
const stopForReason = async (reasonArg) => {
|
|
337
|
+
stopped = true;
|
|
338
|
+
clearScheduledPoll();
|
|
339
|
+
options.abortSignal?.removeEventListener('abort', onExternalAbort);
|
|
340
|
+
activeRequestController?.abort(reasonArg);
|
|
341
|
+
const pollToWait = userHandlerActive ? undefined : activePoll;
|
|
342
|
+
await pollToWait;
|
|
343
|
+
};
|
|
344
|
+
const onExternalAbort = () => {
|
|
345
|
+
void stopForReason(options.abortSignal?.reason);
|
|
346
|
+
};
|
|
59
347
|
const scheduleNextPoll = () => {
|
|
60
|
-
if (stopped)
|
|
348
|
+
if (stopped)
|
|
61
349
|
return;
|
|
62
|
-
}
|
|
63
350
|
timeout = setTimeout(() => {
|
|
64
351
|
timeout = undefined;
|
|
65
352
|
activePoll = runPoll();
|
|
66
353
|
}, intervalMs);
|
|
67
354
|
};
|
|
68
355
|
const handlePollError = async (errorArg) => {
|
|
69
|
-
if (stopped)
|
|
356
|
+
if (stopped)
|
|
70
357
|
return;
|
|
71
|
-
|
|
72
|
-
if (optionsArg.onError) {
|
|
358
|
+
if (options.onError) {
|
|
73
359
|
userHandlerActive = true;
|
|
74
360
|
try {
|
|
75
|
-
await
|
|
361
|
+
await options.onError(errorArg);
|
|
76
362
|
}
|
|
77
363
|
catch (errorHandlerError) {
|
|
78
364
|
console.error('watchHomeSnapshot error handler failed:', errorHandlerError);
|
|
@@ -85,8 +371,13 @@ export class SmarthomeExchangeApiClient {
|
|
|
85
371
|
console.error('watchHomeSnapshot poll failed:', errorArg);
|
|
86
372
|
};
|
|
87
373
|
const runPoll = async () => {
|
|
374
|
+
const controller = new AbortController();
|
|
375
|
+
activeRequestController = controller;
|
|
88
376
|
try {
|
|
89
|
-
const snapshotResponse = await this.getHomeSnapshot(
|
|
377
|
+
const snapshotResponse = await this.getHomeSnapshot({
|
|
378
|
+
abortSignal: controller.signal,
|
|
379
|
+
timeoutMs: options.timeoutMs,
|
|
380
|
+
});
|
|
90
381
|
if (!stopped) {
|
|
91
382
|
userHandlerActive = true;
|
|
92
383
|
try {
|
|
@@ -101,33 +392,41 @@ export class SmarthomeExchangeApiClient {
|
|
|
101
392
|
await handlePollError(error);
|
|
102
393
|
}
|
|
103
394
|
finally {
|
|
395
|
+
controller.abort();
|
|
396
|
+
if (activeRequestController === controller)
|
|
397
|
+
activeRequestController = undefined;
|
|
104
398
|
activePoll = undefined;
|
|
105
399
|
scheduleNextPoll();
|
|
106
400
|
}
|
|
107
401
|
};
|
|
108
|
-
|
|
402
|
+
options.abortSignal?.addEventListener('abort', onExternalAbort, { once: true });
|
|
403
|
+
if (options.abortSignal?.aborted) {
|
|
404
|
+
stopped = true;
|
|
405
|
+
options.abortSignal.removeEventListener('abort', onExternalAbort);
|
|
406
|
+
}
|
|
407
|
+
else if (options.immediate === false) {
|
|
109
408
|
scheduleNextPoll();
|
|
110
409
|
}
|
|
111
410
|
else {
|
|
112
411
|
activePoll = runPoll();
|
|
113
412
|
}
|
|
114
|
-
return
|
|
115
|
-
stopped = true;
|
|
116
|
-
clearScheduledPoll();
|
|
117
|
-
const pollToWait = userHandlerActive ? undefined : activePoll;
|
|
118
|
-
await pollToWait;
|
|
119
|
-
};
|
|
413
|
+
return () => stopForReason();
|
|
120
414
|
}
|
|
121
|
-
async executeToolPlan(planArg) {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
415
|
+
async executeToolPlan(planArg, optionsArg) {
|
|
416
|
+
const request = this.prepareRequest({ plan: planArg }, ['plan']);
|
|
417
|
+
this.assertKnownProperties(request.plan, ['id', 'callerId', 'title', 'reason', 'confidence', 'calls'], 'Tool plan');
|
|
418
|
+
if (!Array.isArray(request.plan.calls))
|
|
419
|
+
throw new TypeError('Tool plan calls must be an array.');
|
|
420
|
+
for (const call of request.plan.calls) {
|
|
421
|
+
this.assertKnownProperties(call, ['id', 'toolId', 'callerId', 'input'], 'Tool call');
|
|
422
|
+
}
|
|
423
|
+
return this.fire('executeToolPlan', request, optionsArg);
|
|
125
424
|
}
|
|
126
|
-
async listApprovals(requestArg = {}) {
|
|
127
|
-
return this.fire('listApprovals', requestArg);
|
|
425
|
+
async listApprovals(requestArg = {}, optionsArg) {
|
|
426
|
+
return this.fire('listApprovals', this.prepareRequest(requestArg, ['status'], true), optionsArg);
|
|
128
427
|
}
|
|
129
|
-
async submitApproval(requestArg) {
|
|
130
|
-
return this.fire('submitApproval', requestArg);
|
|
428
|
+
async submitApproval(requestArg, optionsArg) {
|
|
429
|
+
return this.fire('submitApproval', this.prepareRequest(requestArg, ['approvalId', 'expectedActionDigest', 'decision']), optionsArg);
|
|
131
430
|
}
|
|
132
431
|
}
|
|
133
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGhvbWVleGNoYW5nZWFwaWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc21hcnRob21lZXhjaGFuZ2VhcGljbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUFrQnhDLE1BQU0sT0FBTywwQkFBMEI7SUFDN0IsTUFBTSxDQUFTO0lBQ2hCLFdBQVcsR0FBRyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDckQsaUJBQWlCLENBQW1DO0lBRTNELFlBQVksYUFBbUMsRUFBRTtRQUMvQyxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsVUFBVSxDQUFDLE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDbEYsQ0FBQztJQUVELElBQVksWUFBWTtRQUN0QixPQUFPLEdBQUcsSUFBSSxDQUFDLE1BQU0sZUFBZSxDQUFDO0lBQ3ZDLENBQUM7SUFFTyxlQUFlLENBQ3JCLFlBQXlCO1FBRXpCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixFQUFFLGtCQUFrQixDQUFJLFlBQVksQ0FBQyxDQUFDO0lBQ3JFLENBQUM7SUFFTyxpQkFBaUIsQ0FDdkIsWUFBeUI7UUFFekIsT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFJLElBQUksQ0FBQyxZQUFZLEVBQUUsWUFBWSxDQUFDLENBQUM7SUFDbkYsQ0FBQztJQUVPLEtBQUssQ0FBQyxJQUFJLENBQ2hCLFlBQXlCLEVBQ3pCLFVBQXdCO1FBRXhCLE1BQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUksWUFBWSxDQUFDLENBQUM7UUFDeEQsSUFBSSxTQUFTLEVBQUUsQ0FBQztZQUNkLE9BQU8sU0FBUyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUNwQyxDQUFD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
|
|
432
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xhc3Nlcy5zbWFydGhvbWVleGNoYW5nZWFwaWNsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3RzL2NsYXNzZXMuc21hcnRob21lZXhjaGFuZ2VhcGljbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxLQUFLLE9BQU8sTUFBTSxjQUFjLENBQUM7QUF3RXhDLE1BQU0sMEJBQTBCLEdBQUcsRUFBRSxDQUFDO0FBRXRDLE1BQU0sT0FBTywwQkFBMEI7SUFDNUIsT0FBTyxDQUFTO0lBQ2hCLGFBQWEsQ0FBUztJQUN0QixPQUFPLENBQVM7SUFDaEIscUNBQXFDLENBQVU7SUFDL0MsNEJBQTRCLENBQWtDO0lBQy9ELGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDbEMsdUJBQXVCLEdBQUcsQ0FBQyxDQUFDO0lBQzVCLHdCQUF3QixDQUc5QjtJQUNNLG9CQUFvQixHQUFHLENBQUMsQ0FBQztJQUN6QiwyQkFBMkIsQ0FBbUI7SUFDOUMsaUJBQWlCLENBQW1DO0lBQ3BELGtCQUFrQixHQUFHLEtBQUssQ0FBQztJQUNuQyxrQkFBa0IsQ0FBbUM7SUFDckMsV0FBVyxHQUFHLElBQUksT0FBTyxDQUFDLFlBQVksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUVyRSxZQUFZLFVBQWdDO1FBQzFDLElBQUksQ0FBQyxxQkFBcUIsQ0FDeEIsVUFBVSxFQUFFLENBQUMsUUFBUSxFQUFFLFFBQVEsRUFBRSw2QkFBNkIsRUFBRSxzQ0FBc0MsQ0FBQyxFQUFFLGdCQUFnQixDQUMxSCxDQUFDO1FBQ0YsSUFBSSxDQUFDLFVBQVUsSUFBSSxPQUFPLFVBQVUsQ0FBQyxNQUFNLEtBQUssUUFBUTtlQUNuRCxVQUFVLENBQUMsTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLElBQUksVUFBVSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEdBQUcsR0FBRztlQUM5RCxVQUFVLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxLQUFLLFVBQVUs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@smarthome.exchange/api",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "1.0.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Typed API client for smarthome.exchange hubs.",
|
|
6
6
|
"exports": {
|
|
@@ -10,18 +10,19 @@
|
|
|
10
10
|
"author": "Task Venture Capital GmbH",
|
|
11
11
|
"license": "MIT",
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@api.global/typedrequest": "
|
|
13
|
+
"@api.global/typedrequest": "9.1.0",
|
|
14
14
|
"@api.global/typedrequest-interfaces": "^7.0.0",
|
|
15
|
-
"@api.global/typedsocket": "
|
|
15
|
+
"@api.global/typedsocket": "9.0.0",
|
|
16
16
|
"@push.rocks/smartpromise": "^4.2.4",
|
|
17
|
-
"@smarthome.exchange/interfaces": "0.
|
|
17
|
+
"@smarthome.exchange/interfaces": "2.0.0"
|
|
18
18
|
},
|
|
19
19
|
"devDependencies": {
|
|
20
|
-
"@git.zone/tsbuild": "
|
|
21
|
-
"@git.zone/tsdoc": "^
|
|
22
|
-
"@git.zone/tsrun": "^
|
|
23
|
-
"@git.zone/tstest": "^
|
|
24
|
-
"@
|
|
20
|
+
"@git.zone/tsbuild": "6.0.0-beta.0",
|
|
21
|
+
"@git.zone/tsdoc": "^3.0.2",
|
|
22
|
+
"@git.zone/tsrun": "^3.0.2",
|
|
23
|
+
"@git.zone/tstest": "^7.2.0",
|
|
24
|
+
"@push.rocks/smartserve": "9.0.0",
|
|
25
|
+
"@types/node": "^26.6.3"
|
|
25
26
|
},
|
|
26
27
|
"files": [
|
|
27
28
|
"ts/**/*",
|