@smarthome.exchange/api 0.1.0 → 1.0.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.
@@ -1,78 +1,364 @@
1
1
  import * as plugins from './plugins.js';
2
+ const maxLifecycleOperationCount = 64;
2
3
  export class SmarthomeExchangeApiClient {
3
- hubUrl;
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
- typedsocketClient;
6
- constructor(optionsArg = {}) {
7
- this.hubUrl = (optionsArg.hubUrl || 'http://localhost:8080').replace(/\/$/, '');
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 httpEndpoint() {
10
- return `${this.hubUrl}/typedrequest`;
51
+ get homeId() {
52
+ return this.#homeId;
11
53
  }
12
- createWsRequest(operationArg) {
13
- return this.typedsocketClient?.createTypedRequest(operationArg);
54
+ get typedsocketClient() {
55
+ return this.#typedsocketClient;
14
56
  }
15
57
  createHttpRequest(operationArg) {
16
- return new plugins.typedrequest.TypedRequest(this.httpEndpoint, operationArg);
58
+ return new plugins.typedrequest.TypedRequest(this.#httpEndpoint, operationArg);
17
59
  }
18
- async fire(operationArg, payloadArg) {
19
- const wsRequest = this.createWsRequest(operationArg);
20
- if (wsRequest) {
21
- return wsRequest.fire(payloadArg);
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 this.createHttpRequest(operationArg).fire(payloadArg);
69
+ return options;
24
70
  }
25
- async start() {
26
- this.typedsocketClient = await plugins.typedsocket.TypedSocket.createClient(this.typedrouter, this.hubUrl);
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 stop() {
29
- await this.typedsocketClient?.stop();
30
- this.typedsocketClient = undefined;
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 listDevices(requestArg = {}) {
33
- return this.fire('listDevices', requestArg);
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
- async listAgents() {
36
- return this.fire('listAgents', {});
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
- async listTools(requestArg = {}) {
39
- return this.fire('listTools', requestArg);
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
- async getHomeSnapshot() {
42
- return this.fire('getHomeSnapshot', {});
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
- const intervalMs = optionsArg.intervalMs ?? 5000;
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 optionsArg.onError(errorArg);
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
- if (optionsArg.immediate === false) {
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 async () => {
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
- return this.fire('executeToolPlan', {
123
- plan: planArg,
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": "0.1.0",
3
+ "version": "1.0.1",
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": "^7.0.2",
13
+ "@api.global/typedrequest": "9.1.0",
14
14
  "@api.global/typedrequest-interfaces": "^7.0.0",
15
- "@api.global/typedsocket": "^7.1.0",
15
+ "@api.global/typedsocket": "9.0.0",
16
16
  "@push.rocks/smartpromise": "^4.2.4",
17
- "@smarthome.exchange/interfaces": "0.1.0"
17
+ "@smarthome.exchange/interfaces": "2.1.0"
18
18
  },
19
19
  "devDependencies": {
20
- "@git.zone/tsbuild": "^4.4.2",
21
- "@git.zone/tsdoc": "^2.1.1",
22
- "@git.zone/tsrun": "^2.0.6",
23
- "@git.zone/tstest": "^4.0.0",
24
- "@types/node": "^26.2.0"
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/**/*",