@varco/client 0.1.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 (42) hide show
  1. package/README.md +52 -0
  2. package/dist/client.d.ts +2 -0
  3. package/dist/client.js +302 -0
  4. package/dist/client.js.map +1 -0
  5. package/dist/consumer-client.d.ts +2 -0
  6. package/dist/consumer-client.js +19 -0
  7. package/dist/consumer-client.js.map +1 -0
  8. package/dist/domain-helpers.d.ts +12 -0
  9. package/dist/domain-helpers.js +83 -0
  10. package/dist/domain-helpers.js.map +1 -0
  11. package/dist/encoding.d.ts +4 -0
  12. package/dist/encoding.js +32 -0
  13. package/dist/encoding.js.map +1 -0
  14. package/dist/hass-like.d.ts +7 -0
  15. package/dist/hass-like.js +13 -0
  16. package/dist/hass-like.js.map +1 -0
  17. package/dist/identity.d.ts +11 -0
  18. package/dist/identity.js +96 -0
  19. package/dist/identity.js.map +1 -0
  20. package/dist/index.d.ts +9 -0
  21. package/dist/index.js +8 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/local-client.d.ts +2 -0
  24. package/dist/local-client.js +90 -0
  25. package/dist/local-client.js.map +1 -0
  26. package/dist/manifest-helpers.d.ts +94 -0
  27. package/dist/manifest-helpers.js +105 -0
  28. package/dist/manifest-helpers.js.map +1 -0
  29. package/dist/memory-storage.d.ts +7 -0
  30. package/dist/memory-storage.js +7 -0
  31. package/dist/memory-storage.js.map +1 -0
  32. package/dist/transport-noble.d.ts +34 -0
  33. package/dist/transport-noble.js +257 -0
  34. package/dist/transport-noble.js.map +1 -0
  35. package/dist/transport.d.ts +29 -0
  36. package/dist/transport.js +195 -0
  37. package/dist/transport.js.map +1 -0
  38. package/dist/types.d.ts +185 -0
  39. package/dist/types.js +2 -0
  40. package/dist/types.js.map +1 -0
  41. package/dist/varco-client.js +5139 -0
  42. package/package.json +54 -0
package/README.md ADDED
@@ -0,0 +1,52 @@
1
+ # @varco/client
2
+
3
+ Browser client for Varco consumers.
4
+
5
+ Varco lets an external browser app use Home Assistant through a stored grant without receiving a Home Assistant token and without requiring Home Assistant to be publicly reachable.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ npm install @varco/client
11
+ ```
12
+
13
+ ## Minimal relay consumer
14
+
15
+ ```ts
16
+ import { createVarcoConsumerClient } from "@varco/client";
17
+
18
+ const client = createVarcoConsumerClient({
19
+ authorityId: "PASTE_AUTHORITY_ID_FROM_HOME_ASSISTANT",
20
+ bridgeUrl: "wss://varco-bridge.andreabaccega.com",
21
+ manifest: {
22
+ name: "My dashboard",
23
+ version: "0.1.0",
24
+ read_entities: ["sensor.temperature"],
25
+ subscriptions: ["sensor.temperature"],
26
+ history: [],
27
+ camera_snapshots: [],
28
+ actions: [],
29
+ },
30
+ });
31
+
32
+ const access = await client.requestAccess();
33
+ console.log(access.pairing_code);
34
+
35
+ await client.connect();
36
+ const states = await client.getStates(["sensor.temperature"]);
37
+ ```
38
+
39
+ Approve the pairing code in the Home Assistant Varco panel before calling `connect()`.
40
+
41
+ ## Inside Home Assistant
42
+
43
+ Inside a Home Assistant custom card or panel, pass the frontend `hass` object. This uses the already-authenticated Home Assistant frontend session and does not pair through the relay.
44
+
45
+ ```ts
46
+ import { createVarcoConsumerClient } from "@varco/client";
47
+
48
+ const client = createVarcoConsumerClient({ hass });
49
+ const states = await client.getStates(["sensor.temperature"]);
50
+ ```
51
+
52
+ Full docs: https://vekexasia.github.io/varco/reference/client-api/
@@ -0,0 +1,2 @@
1
+ import type { VarcoClient, VarcoClientOptions } from "./types.js";
2
+ export declare function createVarcoClient(options: VarcoClientOptions): VarcoClient;
package/dist/client.js ADDED
@@ -0,0 +1,302 @@
1
+ import { loadIdentitySync, loadOrCreateIdentity, randomId, signAccessRequest, signAuthenticate } from "./identity.js";
2
+ import { attachDomainHelpers } from "./domain-helpers.js";
3
+ import { RelayTransport } from "./transport.js";
4
+ function assertManifest(manifest) {
5
+ if (!manifest || typeof manifest.name !== "string" || !manifest.name)
6
+ throw new Error("Varco manifest requires a non-empty name");
7
+ if (manifest.read_entities && manifest.readEntities)
8
+ throw new Error("Varco manifest must not set both read_entities and readEntities");
9
+ if (manifest.camera_snapshots && manifest.cameraSnapshots)
10
+ throw new Error("Varco manifest must not set both camera_snapshots and cameraSnapshots");
11
+ }
12
+ export function createVarcoClient(options) {
13
+ assertManifest(options.manifest);
14
+ let identity = loadIdentitySync(options.storage);
15
+ const identityPromise = identity ? Promise.resolve(identity) : loadOrCreateIdentity(options.storage).then((resolved) => { identity = resolved; return resolved; });
16
+ const createRelay = () => options.transport ?? new RelayTransport(options.bridgeUrl, options.authorityId);
17
+ let relayTransport = createRelay();
18
+ let activeTransport = relayTransport;
19
+ let transportStatus = { mode: "relay", detail: "connected via relay" };
20
+ let closedByUser = false;
21
+ let reconnecting = false;
22
+ const subscriptions = new Map();
23
+ const callbacks = new Map();
24
+ const attachEvents = (transport) => transport.onEvent?.((event) => {
25
+ if ((event.type === "state_snapshot" || event.type === "state_delta") && event.subscription_id)
26
+ callbacks.get(event.subscription_id)?.(event);
27
+ });
28
+ const setStatus = (status) => {
29
+ transportStatus = status;
30
+ options.onTransportStatus?.(status);
31
+ };
32
+ const establish = async () => {
33
+ const id = await identityPromise;
34
+ const nonce = randomId(12);
35
+ const binding = (await relayTransport.channelBinding?.()) ?? "";
36
+ await relayTransport.request({
37
+ type: "authenticate",
38
+ consumer_pk: id.publicKey,
39
+ nonce,
40
+ signature: await signAuthenticate(id, nonce, binding),
41
+ });
42
+ setStatus({ mode: "relay", detail: "relay authenticated" });
43
+ if (options.webrtc !== false) {
44
+ const p2p = await tryWebRtcUpgrade(relayTransport, setStatus);
45
+ if (p2p) {
46
+ activeTransport = p2p;
47
+ attachEvents(activeTransport);
48
+ activeTransport.onClose?.(scheduleReconnect);
49
+ setStatus({ mode: "p2p", detail: "WebRTC data channel connected" });
50
+ }
51
+ }
52
+ // No silent fallback on a signaling-only bridge: relay data is rejected
53
+ // there, so surface the failure instead of leaving a dead relay transport.
54
+ if (activeTransport === relayTransport && transportStatus.detail !== undefined && isSignalingOnlyError(transportStatus.detail)) {
55
+ throw new Error(transportStatus.detail);
56
+ }
57
+ };
58
+ const scheduleReconnect = () => {
59
+ if (!options.reconnect || closedByUser || reconnecting)
60
+ return;
61
+ reconnecting = true;
62
+ let attempt = 0;
63
+ const tryOnce = async () => {
64
+ if (closedByUser) {
65
+ reconnecting = false;
66
+ return;
67
+ }
68
+ attempt += 1;
69
+ setStatus({ mode: "relay", detail: `reconnecting (attempt ${attempt})` });
70
+ try {
71
+ await relayTransport.close?.();
72
+ relayTransport = createRelay();
73
+ activeTransport = relayTransport;
74
+ attachEvents(relayTransport);
75
+ relayTransport.onClose?.(scheduleReconnect);
76
+ await establish();
77
+ for (const record of subscriptions.values()) {
78
+ const response = await activeTransport.request({ type: "subscribe_states", entity_ids: record.entityIds });
79
+ callbacks.delete(record.currentId);
80
+ record.currentId = response.subscription_id;
81
+ callbacks.set(record.currentId, record.cb);
82
+ record.cb(response);
83
+ }
84
+ reconnecting = false;
85
+ setStatus({ ...transportStatus, detail: transportStatus.detail ?? "reconnected" });
86
+ }
87
+ catch (err) {
88
+ const message = err instanceof Error ? err.message : String(err);
89
+ if (isSignalingOnlyError(message)) {
90
+ reconnecting = false;
91
+ setStatus({ mode: "relay", detail: message });
92
+ return;
93
+ }
94
+ const delay = Math.min(30_000, 1_000 * 2 ** Math.min(attempt, 5)) * (0.5 + Math.random() * 0.5);
95
+ setTimeout(() => { void tryOnce(); }, delay);
96
+ }
97
+ };
98
+ void tryOnce();
99
+ };
100
+ attachEvents(relayTransport);
101
+ relayTransport.onClose?.(scheduleReconnect);
102
+ return attachDomainHelpers({
103
+ get consumerPublicKey() { return identity?.publicKey ?? ""; },
104
+ get transportStatus() { return transportStatus; },
105
+ async requestAccess() {
106
+ const id = await identityPromise;
107
+ const nonce = randomId(12);
108
+ const response = await relayTransport.request({
109
+ type: "access_request",
110
+ consumer_pk: id.publicKey,
111
+ manifest: options.manifest,
112
+ nonce,
113
+ signature: await signAccessRequest(id, nonce, options.manifest),
114
+ });
115
+ return { request_id: response.access_request_id, pairing_code: response.pairing_code, status: response.status };
116
+ },
117
+ async connect() {
118
+ await establish();
119
+ },
120
+ async getStates(entityIds) {
121
+ const response = await activeTransport.request({ type: "get_states", entity_ids: entityIds });
122
+ return response.states;
123
+ },
124
+ async subscribeEntities(entityIds, cb) {
125
+ const key = [...entityIds].sort().join("\0");
126
+ const existing = [...subscriptions.values()].some((record) => [...record.entityIds].sort().join("\0") === key);
127
+ if (existing)
128
+ options.warn?.(`Duplicate Varco subscription for ${entityIds.join(", ")}`);
129
+ const response = await activeTransport.request({ type: "subscribe_states", entity_ids: entityIds });
130
+ const subscriptionId = response.subscription_id;
131
+ subscriptions.set(subscriptionId, { entityIds: [...entityIds], cb, currentId: subscriptionId });
132
+ callbacks.set(subscriptionId, cb);
133
+ cb(response);
134
+ return subscriptionId;
135
+ },
136
+ async unsubscribe(subscriptionId) {
137
+ const record = subscriptions.get(subscriptionId);
138
+ await activeTransport.request({ type: "unsubscribe_states", subscription_id: record?.currentId ?? subscriptionId });
139
+ if (record)
140
+ callbacks.delete(record.currentId);
141
+ subscriptions.delete(subscriptionId);
142
+ callbacks.delete(subscriptionId);
143
+ },
144
+ async queryHistory(entityIds, range = {}) {
145
+ if (entityIds.length > 10) {
146
+ options.warn?.(`Varco history_query with ${entityIds.length} entities exceeds the Authority limit of 10 and will be rejected`);
147
+ }
148
+ const start = typeof range.start_time === "string" ? Date.parse(range.start_time) : NaN;
149
+ const end = typeof range.end_time === "string" ? Date.parse(range.end_time) : Date.now();
150
+ if (Number.isFinite(start) && end - start > 30 * 24 * 60 * 60 * 1000) {
151
+ options.warn?.("Varco history_query range exceeds 30 days; the Authority will clamp it");
152
+ }
153
+ const response = await activeTransport.request({ type: "history_query", entity_ids: entityIds, ...range });
154
+ return response.history;
155
+ },
156
+ async cameraSnapshot(entityId) {
157
+ const response = await activeTransport.request({ type: "camera_snapshot", entity_id: entityId });
158
+ return { contentType: response.content_type, body: response.body };
159
+ },
160
+ async callService(domain, service, data = {}) {
161
+ const { entity_id, pin, pins, ...service_data } = data;
162
+ await activeTransport.request({
163
+ type: "call_service",
164
+ domain,
165
+ service,
166
+ service_data,
167
+ target: entity_id ? { entity_id } : {},
168
+ ...(pin ? { pin } : {}),
169
+ ...(pins ? { pins } : {}),
170
+ });
171
+ },
172
+ async close() {
173
+ closedByUser = true;
174
+ await activeTransport.close?.();
175
+ if (activeTransport !== relayTransport)
176
+ await relayTransport.close?.();
177
+ },
178
+ });
179
+ }
180
+ class DataChannelTransport {
181
+ pc;
182
+ channel;
183
+ requestTimeoutMs;
184
+ pending = new Map();
185
+ eventHandler = null;
186
+ constructor(pc, channel, requestTimeoutMs = 30_000) {
187
+ this.pc = pc;
188
+ this.channel = channel;
189
+ this.requestTimeoutMs = requestTimeoutMs;
190
+ this.channel.addEventListener("message", (event) => {
191
+ try {
192
+ this.handleMessage(String(event.data));
193
+ }
194
+ catch (err) {
195
+ this.failPending(err instanceof Error ? err : new Error(String(err)));
196
+ }
197
+ });
198
+ this.channel.addEventListener("close", () => this.failPending(new Error("Varco transport closed")));
199
+ this.channel.addEventListener("error", () => this.failPending(new Error("Varco data channel error")));
200
+ }
201
+ onEvent(handler) { this.eventHandler = handler; }
202
+ async request(message) {
203
+ const requestId = message.request_id ?? randomId(8);
204
+ const withId = { ...message, request_id: requestId };
205
+ const response = new Promise((resolve, reject) => {
206
+ const timer = setTimeout(() => {
207
+ this.pending.delete(requestId);
208
+ reject(new Error(`Varco request timed out: ${String(message.type)}`));
209
+ }, this.requestTimeoutMs);
210
+ this.pending.set(requestId, { resolve, reject, timer });
211
+ });
212
+ this.channel.send(JSON.stringify(withId));
213
+ return response;
214
+ }
215
+ async close() {
216
+ this.channel.close();
217
+ this.pc.close();
218
+ this.failPending(new Error("Varco transport closed"));
219
+ }
220
+ failPending(err) {
221
+ for (const entry of this.pending.values()) {
222
+ clearTimeout(entry.timer);
223
+ entry.reject(err);
224
+ }
225
+ this.pending.clear();
226
+ }
227
+ handleMessage(data) {
228
+ const payload = JSON.parse(data);
229
+ const requestId = payload.request_id;
230
+ if (requestId && this.pending.has(requestId)) {
231
+ const pending = this.pending.get(requestId);
232
+ this.pending.delete(requestId);
233
+ clearTimeout(pending.timer);
234
+ if (payload.type === "error")
235
+ pending.reject(Object.assign(new Error(payload.message), { code: payload.code }));
236
+ else
237
+ pending.resolve(payload);
238
+ return;
239
+ }
240
+ this.eventHandler?.(payload);
241
+ }
242
+ }
243
+ function isSignalingOnlyError(message) {
244
+ return message.includes("signaling-only");
245
+ }
246
+ async function tryWebRtcUpgrade(relayTransport, setStatus) {
247
+ const Peer = globalThis.RTCPeerConnection;
248
+ if (!Peer) {
249
+ setStatus({ mode: "relay", detail: "WebRTC unavailable in this browser" });
250
+ return null;
251
+ }
252
+ const pc = new Peer({ iceServers: [{ urls: "stun:stun.l.google.com:19302" }] });
253
+ const channel = pc.createDataChannel("varco", { ordered: true });
254
+ try {
255
+ const opened = waitForDataChannelOpen(channel);
256
+ const offer = await pc.createOffer();
257
+ await pc.setLocalDescription(offer);
258
+ await waitForIceGathering(pc);
259
+ const local = pc.localDescription ?? offer;
260
+ const answer = await relayTransport.request({ type: "webrtc_offer", sdp: local.sdp, sdp_type: local.type });
261
+ if (answer.type !== "webrtc_answer") {
262
+ setStatus({ mode: "relay", detail: answer.reason || "Authority kept relay fallback" });
263
+ pc.close();
264
+ return null;
265
+ }
266
+ await pc.setRemoteDescription({ type: answer.sdp_type ?? "answer", sdp: answer.sdp });
267
+ await opened;
268
+ return new DataChannelTransport(pc, channel);
269
+ }
270
+ catch (err) {
271
+ const detail = err instanceof Error ? err.message : "WebRTC failed";
272
+ setStatus({ mode: "relay", detail });
273
+ pc.close();
274
+ return null;
275
+ }
276
+ }
277
+ function waitForIceGathering(pc) {
278
+ if (pc.iceGatheringState === "complete")
279
+ return Promise.resolve();
280
+ return new Promise((resolve) => {
281
+ const done = () => {
282
+ if (pc.iceGatheringState === "complete") {
283
+ pc.removeEventListener("icegatheringstatechange", done);
284
+ resolve();
285
+ }
286
+ };
287
+ pc.addEventListener("icegatheringstatechange", done);
288
+ setTimeout(resolve, 5000);
289
+ });
290
+ }
291
+ function waitForDataChannelOpen(channel) {
292
+ if (channel.readyState === "open")
293
+ return Promise.resolve();
294
+ return new Promise((resolve, reject) => {
295
+ const timeout = setTimeout(() => reject(new Error("WebRTC data channel timeout")), 10_000);
296
+ channel.addEventListener("open", () => {
297
+ clearTimeout(timeout);
298
+ resolve();
299
+ }, { once: true });
300
+ });
301
+ }
302
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { VarcoConsumerClient, VarcoConsumerClientOptions } from "./types.js";
2
+ export declare function createVarcoConsumerClient(options: VarcoConsumerClientOptions): VarcoConsumerClient;
@@ -0,0 +1,19 @@
1
+ import { createVarcoClient } from "./client.js";
2
+ import { createLocalHomeAssistantClient } from "./local-client.js";
3
+ const EMPTY_READ_ONLY_MANIFEST = {
4
+ name: "Varco consumer",
5
+ version: "0.1.0",
6
+ read_entities: [],
7
+ subscriptions: [],
8
+ history: [],
9
+ camera_snapshots: [],
10
+ actions: [],
11
+ };
12
+ export function createVarcoConsumerClient(options) {
13
+ if ("hass" in options && options.hass)
14
+ return createLocalHomeAssistantClient(options.hass);
15
+ const relayOptions = options;
16
+ const client = createVarcoClient({ ...relayOptions, manifest: relayOptions.manifest ?? EMPTY_READ_ONLY_MANIFEST });
17
+ return Object.assign(client, { updateHass() { } });
18
+ }
19
+ //# sourceMappingURL=consumer-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"consumer-client.js","sourceRoot":"","sources":["../src/consumer-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,8BAA8B,EAAE,MAAM,mBAAmB,CAAC;AAGnE,MAAM,wBAAwB,GAAkB;IAC9C,IAAI,EAAE,gBAAgB;IACtB,OAAO,EAAE,OAAO;IAChB,aAAa,EAAE,EAAE;IACjB,aAAa,EAAE,EAAE;IACjB,OAAO,EAAE,EAAE;IACX,gBAAgB,EAAE,EAAE;IACpB,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF,MAAM,UAAU,yBAAyB,CAAC,OAAmC;IAC3E,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI;QAAE,OAAO,8BAA8B,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAE3F,MAAM,YAAY,GAAG,OAA+B,CAAC;IACrD,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,GAAG,YAAY,EAAE,QAAQ,EAAE,YAAY,CAAC,QAAQ,IAAI,wBAAwB,EAAE,CAAC,CAAC;IACnH,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,UAAU,KAAI,CAAC,EAAE,CAAC,CAAC;AACpD,CAAC"}
@@ -0,0 +1,12 @@
1
+ import type { HassState, VarcoDomainHelpers } from "./types.js";
2
+ type HelperClient = {
3
+ getStates(entityIds: string[]): Promise<Record<string, HassState | null>>;
4
+ subscribeEntities(entityIds: string[], cb: (event: any) => void): Promise<string>;
5
+ queryHistory(entityIds: string[], range?: Record<string, unknown>): Promise<any>;
6
+ callService(domain: string, service: string, data?: {
7
+ entity_id?: string;
8
+ [key: string]: unknown;
9
+ }): Promise<void>;
10
+ };
11
+ export declare function attachDomainHelpers<T extends HelperClient>(client: T): T & VarcoDomainHelpers;
12
+ export {};
@@ -0,0 +1,83 @@
1
+ export function attachDomainHelpers(client) {
2
+ const service = (domain, name, entityId, data = {}) => client.callService(domain, name, { entity_id: entityId, ...data });
3
+ return Object.assign(client, {
4
+ entity: {
5
+ async get(entityId) { return (await client.getStates([entityId]))[entityId] ?? null; },
6
+ subscribe(entityId, cb) { return client.subscribeEntities([entityId], cb); },
7
+ history(entityId, range = {}) { return client.queryHistory([entityId], range); },
8
+ call(entityId, name, data = {}) {
9
+ const domain = entityId.split(".", 1)[0];
10
+ return service(domain, name, entityId, data);
11
+ },
12
+ },
13
+ light: {
14
+ turnOn: (entityId, options = {}) => service("light", "turn_on", entityId, options),
15
+ turnOff: (entityId) => service("light", "turn_off", entityId),
16
+ toggle: (entityId) => service("light", "toggle", entityId),
17
+ setBrightness: (entityId, brightnessPct) => service("light", "turn_on", entityId, { brightness_pct: brightnessPct }),
18
+ setColor: (entityId, color) => service("light", "turn_on", entityId, color),
19
+ },
20
+ switch: {
21
+ turnOn: (entityId) => service("switch", "turn_on", entityId),
22
+ turnOff: (entityId) => service("switch", "turn_off", entityId),
23
+ toggle: (entityId) => service("switch", "toggle", entityId),
24
+ },
25
+ climate: {
26
+ setTemperature: (entityId, temperature, options = {}) => service("climate", "set_temperature", entityId, { temperature, ...options }),
27
+ setTemperatureRange: (entityId, targetTempLow, targetTempHigh, options = {}) => service("climate", "set_temperature", entityId, { target_temp_low: targetTempLow, target_temp_high: targetTempHigh, ...options }),
28
+ setHvacMode: (entityId, hvacMode) => service("climate", "set_hvac_mode", entityId, { hvac_mode: hvacMode }),
29
+ setPresetMode: (entityId, presetMode) => service("climate", "set_preset_mode", entityId, { preset_mode: presetMode }),
30
+ setFanMode: (entityId, fanMode) => service("climate", "set_fan_mode", entityId, { fan_mode: fanMode }),
31
+ setSwingMode: (entityId, swingMode) => service("climate", "set_swing_mode", entityId, { swing_mode: swingMode }),
32
+ setHumidity: (entityId, humidity) => service("climate", "set_humidity", entityId, { humidity }),
33
+ turnOn: (entityId) => service("climate", "turn_on", entityId),
34
+ turnOff: (entityId) => service("climate", "turn_off", entityId),
35
+ },
36
+ cover: {
37
+ open: (entityId) => service("cover", "open_cover", entityId),
38
+ close: (entityId) => service("cover", "close_cover", entityId),
39
+ stop: (entityId) => service("cover", "stop_cover", entityId),
40
+ setPosition: (entityId, position) => service("cover", "set_cover_position", entityId, { position }),
41
+ openTilt: (entityId) => service("cover", "open_cover_tilt", entityId),
42
+ closeTilt: (entityId) => service("cover", "close_cover_tilt", entityId),
43
+ stopTilt: (entityId) => service("cover", "stop_cover_tilt", entityId),
44
+ setTiltPosition: (entityId, tiltPosition) => service("cover", "set_cover_tilt_position", entityId, { tilt_position: tiltPosition }),
45
+ },
46
+ fan: {
47
+ turnOn: (entityId) => service("fan", "turn_on", entityId),
48
+ turnOff: (entityId) => service("fan", "turn_off", entityId),
49
+ toggle: (entityId) => service("fan", "toggle", entityId),
50
+ setPercentage: (entityId, percentage) => service("fan", "set_percentage", entityId, { percentage }),
51
+ setPresetMode: (entityId, presetMode) => service("fan", "set_preset_mode", entityId, { preset_mode: presetMode }),
52
+ setDirection: (entityId, direction) => service("fan", "set_direction", entityId, { direction }),
53
+ oscillate: (entityId, oscillating) => service("fan", "oscillate", entityId, { oscillating }),
54
+ },
55
+ lock: {
56
+ lock: (entityId) => service("lock", "lock", entityId),
57
+ unlock: (entityId) => service("lock", "unlock", entityId),
58
+ open: (entityId) => service("lock", "open", entityId),
59
+ },
60
+ mediaPlayer: {
61
+ turnOn: (entityId) => service("media_player", "turn_on", entityId),
62
+ turnOff: (entityId) => service("media_player", "turn_off", entityId),
63
+ volumeUp: (entityId) => service("media_player", "volume_up", entityId),
64
+ volumeDown: (entityId) => service("media_player", "volume_down", entityId),
65
+ setVolume: (entityId, volumeLevel) => service("media_player", "volume_set", entityId, { volume_level: volumeLevel }),
66
+ mute: (entityId, muted) => service("media_player", "volume_mute", entityId, { is_volume_muted: muted }),
67
+ play: (entityId) => service("media_player", "media_play", entityId),
68
+ pause: (entityId) => service("media_player", "media_pause", entityId),
69
+ stop: (entityId) => service("media_player", "media_stop", entityId),
70
+ playPause: (entityId) => service("media_player", "media_play_pause", entityId),
71
+ nextTrack: (entityId) => service("media_player", "media_next_track", entityId),
72
+ previousTrack: (entityId) => service("media_player", "media_previous_track", entityId),
73
+ seek: (entityId, seconds) => service("media_player", "media_seek", entityId, { seek_position: seconds }),
74
+ selectSource: (entityId, source) => service("media_player", "select_source", entityId, { source }),
75
+ playMedia: (entityId, mediaContentId, mediaContentType, options = {}) => service("media_player", "play_media", entityId, { media_content_id: mediaContentId, media_content_type: mediaContentType, ...options }),
76
+ },
77
+ button: { press: (entityId) => service("button", "press", entityId) },
78
+ scene: { turnOn: (entityId) => service("scene", "turn_on", entityId) },
79
+ number: { setValue: (entityId, value) => service("number", "set_value", entityId, { value }) },
80
+ select: { selectOption: (entityId, option) => service("select", "select_option", entityId, { option }) },
81
+ });
82
+ }
83
+ //# sourceMappingURL=domain-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-helpers.js","sourceRoot":"","sources":["../src/domain-helpers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ export declare function b64urlEncode(bytes: Uint8Array): string;
2
+ export declare function b64urlDecode(value: string): Uint8Array;
3
+ export declare function canonicalJson(value: unknown): string;
4
+ export declare function utf8(value: string): Uint8Array;
@@ -0,0 +1,32 @@
1
+ export function b64urlEncode(bytes) {
2
+ let binary = "";
3
+ bytes.forEach((byte) => { binary += String.fromCharCode(byte); });
4
+ return btoa(binary).replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
5
+ }
6
+ export function b64urlDecode(value) {
7
+ const normalized = value.replace(/-/g, "+").replace(/_/g, "/") + "=".repeat((4 - (value.length % 4)) % 4);
8
+ const binary = atob(normalized);
9
+ const out = new Uint8Array(binary.length);
10
+ for (let i = 0; i < binary.length; i += 1)
11
+ out[i] = binary.charCodeAt(i);
12
+ return out;
13
+ }
14
+ // Matches Python json.dumps(..., ensure_ascii=True): escape everything above U+007E.
15
+ function asciiJsonString(value) {
16
+ return JSON.stringify(value).replace(/[\u007f-\uffff]/g, (ch) => `\\u${ch.charCodeAt(0).toString(16).padStart(4, "0")}`);
17
+ }
18
+ export function canonicalJson(value) {
19
+ if (typeof value === "string")
20
+ return asciiJsonString(value);
21
+ if (value === null || typeof value !== "object")
22
+ return JSON.stringify(value);
23
+ if (Array.isArray(value))
24
+ return `[${value.map(canonicalJson).join(",")}]`;
25
+ // Codepoint key ordering, matching Python json.dumps(sort_keys=True). Not localeCompare.
26
+ const entries = Object.entries(value).sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0));
27
+ return `{${entries.map(([key, val]) => `${asciiJsonString(key)}:${canonicalJson(val)}`).join(",")}}`;
28
+ }
29
+ export function utf8(value) {
30
+ return new TextEncoder().encode(value);
31
+ }
32
+ //# sourceMappingURL=encoding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encoding.js","sourceRoot":"","sources":["../src/encoding.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,YAAY,CAAC,KAAiB;IAC5C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,GAAG,MAAM,IAAI,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;AACjF,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1G,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC;QAAE,GAAG,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED,qFAAqF;AACrF,SAAS,eAAe,CAAC,KAAa;IACpC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,kBAAkB,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,MAAM,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;AAC3H,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,KAAc;IAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,eAAe,CAAC,KAAK,CAAC,CAAC;IAC7D,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC9E,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAC3E,yFAAyF;IACzF,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,KAAgC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClH,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AACvG,CAAC;AAED,MAAM,UAAU,IAAI,CAAC,KAAa;IAChC,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { VarcoClient } from "./types.js";
2
+ export declare function createHassLikeClient(client: VarcoClient): {
3
+ callService(domain: string, service: string, serviceData?: Record<string, unknown>, target?: Record<string, unknown>): Promise<void>;
4
+ fetchStates(entityIds: string[]): Promise<Record<string, import("./types.js").HassState | null>>;
5
+ subscribeEntities: (entityIds: string[], cb: (event: any) => void) => Promise<string>;
6
+ unsubscribe: (subscriptionId: string) => Promise<void>;
7
+ };
@@ -0,0 +1,13 @@
1
+ export function createHassLikeClient(client) {
2
+ return {
3
+ async callService(domain, service, serviceData = {}, target = {}) {
4
+ await client.callService(domain, service, { ...serviceData, ...(target.entity_id ? { entity_id: target.entity_id } : {}) });
5
+ },
6
+ async fetchStates(entityIds) {
7
+ return client.getStates(entityIds);
8
+ },
9
+ subscribeEntities: client.subscribeEntities,
10
+ unsubscribe: client.unsubscribe,
11
+ };
12
+ }
13
+ //# sourceMappingURL=hass-like.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hass-like.js","sourceRoot":"","sources":["../src/hass-like.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,oBAAoB,CAAC,MAAmB;IACtD,OAAO;QACL,KAAK,CAAC,WAAW,CAAC,MAAc,EAAE,OAAe,EAAE,cAAuC,EAAE,EAAE,SAAkC,EAAE;YAChI,MAAM,MAAM,CAAC,WAAW,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE,GAAG,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,MAAM,CAAC,SAAmB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QACxI,CAAC;QACD,KAAK,CAAC,WAAW,CAAC,SAAmB;YACnC,OAAO,MAAM,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,CAAC;QACD,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;QAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;KAChC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { StorageLike, VarcoManifest } from "./types.js";
2
+ export type ConsumerIdentity = {
3
+ publicKey: string;
4
+ sign(message: Uint8Array): Promise<string>;
5
+ };
6
+ export declare function loadIdentitySync(storage?: StorageLike): ConsumerIdentity | null;
7
+ export declare function loadOrCreateIdentity(storage?: StorageLike): Promise<ConsumerIdentity>;
8
+ export declare function accessRequestBytes(nonce: string, manifest: VarcoManifest): Uint8Array;
9
+ export declare function signAccessRequest(identity: ConsumerIdentity, nonce: string, manifest: VarcoManifest): Promise<string>;
10
+ export declare function signAuthenticate(identity: ConsumerIdentity, nonce: string, channelBinding: string): Promise<string>;
11
+ export declare function randomId(bytes?: number): string;