odelic 0.2.0 → 0.2.2

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 (68) hide show
  1. package/README.md +93 -91
  2. package/bin/odelic-mcp.js +1 -1
  3. package/bin/odelic.js +1 -1
  4. package/dist/cli.d.ts +58 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +279 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/client.d.ts +140 -0
  9. package/dist/client.d.ts.map +1 -0
  10. package/dist/client.js +448 -0
  11. package/dist/client.js.map +1 -0
  12. package/dist/config.d.ts +34 -0
  13. package/dist/config.d.ts.map +1 -0
  14. package/dist/config.js +139 -0
  15. package/dist/config.js.map +1 -0
  16. package/dist/controller.d.ts +95 -0
  17. package/dist/controller.d.ts.map +1 -0
  18. package/dist/controller.js +239 -0
  19. package/dist/controller.js.map +1 -0
  20. package/dist/crypto.d.ts +34 -0
  21. package/dist/crypto.d.ts.map +1 -0
  22. package/dist/crypto.js +111 -0
  23. package/dist/crypto.js.map +1 -0
  24. package/dist/errors.d.ts +14 -0
  25. package/dist/errors.d.ts.map +1 -0
  26. package/dist/errors.js +17 -0
  27. package/dist/errors.js.map +1 -0
  28. package/dist/index.d.ts +18 -0
  29. package/dist/index.d.ts.map +1 -0
  30. package/{src → dist}/index.js +1 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/log.d.ts +18 -0
  33. package/dist/log.d.ts.map +1 -0
  34. package/dist/log.js +21 -0
  35. package/dist/log.js.map +1 -0
  36. package/dist/mcp.d.ts +23 -0
  37. package/dist/mcp.d.ts.map +1 -0
  38. package/dist/mcp.js +74 -0
  39. package/dist/mcp.js.map +1 -0
  40. package/dist/protocol.d.ts +90 -0
  41. package/dist/protocol.d.ts.map +1 -0
  42. package/dist/protocol.js +178 -0
  43. package/dist/protocol.js.map +1 -0
  44. package/dist/server.d.ts +24 -0
  45. package/dist/server.d.ts.map +1 -0
  46. package/dist/server.js +187 -0
  47. package/dist/server.js.map +1 -0
  48. package/dist/version.d.ts +2 -0
  49. package/dist/version.d.ts.map +1 -0
  50. package/dist/version.js +2 -0
  51. package/dist/version.js.map +1 -0
  52. package/package.json +19 -7
  53. package/src/{cli.js → cli.ts} +64 -50
  54. package/src/client.ts +497 -0
  55. package/src/{config.js → config.ts} +37 -23
  56. package/src/controller.ts +294 -0
  57. package/src/{crypto.js → crypto.ts} +46 -28
  58. package/src/{errors.js → errors.ts} +2 -2
  59. package/src/index.ts +17 -0
  60. package/src/log.ts +24 -0
  61. package/src/{mcp.js → mcp.ts} +31 -20
  62. package/src/{protocol.js → protocol.ts} +56 -30
  63. package/src/{server.js → server.ts} +57 -38
  64. package/src/version.ts +1 -0
  65. package/src/client.js +0 -362
  66. package/src/controller.js +0 -219
  67. package/src/log.js +0 -20
  68. package/src/version.js +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,140 @@
1
+ import * as P from './protocol.ts';
2
+ import { MeshCrypto } from './crypto.ts';
3
+ export declare const UUID_SERVICE = "9e5d1e475c1343a0863582adffc0386f";
4
+ export declare const UUID_WRITE = "9e5d1e475c1343a0863582adffc1386f";
5
+ export declare const UUID_NOTIFY = "9e5d1e475c1343a0863582adffc2386f";
6
+ /** Called with every received (decrypted) packet. */
7
+ export type PacketListener = (packet: Buffer) => void;
8
+ /**
9
+ * A noble `Peripheral`, typed structurally so that odelic's public types do not pull in noble's
10
+ * declarations (which fail to type-check without `skipLibCheck`).
11
+ */
12
+ export interface BlePeripheral {
13
+ readonly id: string;
14
+ readonly address: string;
15
+ readonly rssi: number;
16
+ readonly advertisement: {
17
+ localName?: string;
18
+ manufacturerData?: Buffer;
19
+ };
20
+ }
21
+ /** A mesh node found by {@link findNodes}. */
22
+ export interface MeshNode {
23
+ peripheral: BlePeripheral;
24
+ name: string | null;
25
+ address: string;
26
+ homeid: number;
27
+ rssi: number;
28
+ }
29
+ /**
30
+ * Scan for mesh nodes, sorted by signal strength (strongest first).
31
+ * @param opts.homeid only nodes of this mesh
32
+ * @param opts.timeout scan duration in seconds
33
+ */
34
+ export declare function findNodes({ homeid, timeout }?: {
35
+ homeid?: number | null;
36
+ timeout?: number;
37
+ }): Promise<MeshNode[]>;
38
+ export interface OdelicMeshOptions {
39
+ /** HomeID (instead of `appId`) */
40
+ homeid?: number;
41
+ /** 4-character password (instead of `appId`) */
42
+ password?: string;
43
+ /** noble Peripheral, or a node name / address / id; default = strongest node of the mesh */
44
+ device?: BlePeripheral | string | null;
45
+ /** scan duration in seconds when looking for a node */
46
+ scanTimeout?: number;
47
+ }
48
+ export interface SetLightOptions {
49
+ /** 0 = warm (電球色) .. 100 = cool (昼光色); default 50 */
50
+ color?: number | null;
51
+ /** 1..100 % (default 100) */
52
+ brightness?: number;
53
+ /** default: every light */
54
+ target?: P.VaddrLike;
55
+ /** raw colour 0..20 (overrides `color`) */
56
+ x?: number | null;
57
+ /** raw brightness 0..19, 0 = brightest (overrides `brightness`) */
58
+ y?: number | null;
59
+ }
60
+ export interface SetGroupOptions extends Omit<SetLightOptions, 'target'> {
61
+ /** true / false = plain on / off (ignores colour and brightness) */
62
+ on?: boolean | null;
63
+ }
64
+ /**
65
+ * One logged-in connection to an ODELIC mesh.
66
+ *
67
+ * ```ts
68
+ * const mesh = new OdelicMesh('12345678');
69
+ * await mesh.connect();
70
+ * await mesh.setLight({ color: 0, brightness: 100 }); // warm, full
71
+ * await mesh.off();
72
+ * await mesh.disconnect();
73
+ * ```
74
+ */
75
+ export declare class OdelicMesh {
76
+ readonly homeid: number;
77
+ readonly crypto: MeshCrypto;
78
+ device: BlePeripheral | string | null;
79
+ scanTimeout: number;
80
+ /** our vaddr in the mesh (assigned at login) */
81
+ own: Buffer | null;
82
+ nodeName: string | null;
83
+ private peripheral;
84
+ private writeChar;
85
+ private notifyChar;
86
+ private inbox;
87
+ private loggingIn;
88
+ private seg;
89
+ private segSeq;
90
+ private readonly listeners;
91
+ /** ms timestamp of the last packet we could decrypt (session health signal). */
92
+ lastRx: number;
93
+ /** True when the session may be out of sync with the node. */
94
+ suspect: boolean;
95
+ /** @param appId ID shown in the app, e.g. "12345678" (or pass `homeid` + `password`) */
96
+ constructor(appId?: string | null, { homeid, password, device, scanTimeout }?: OdelicMeshOptions);
97
+ private resolveDevice;
98
+ /** Scan (unless a peripheral was given), connect and log in. `timeout` in seconds. */
99
+ connect(timeout?: number): Promise<void>;
100
+ /**
101
+ * Re-run the login handshake on the existing link to pick up the node's current session.
102
+ *
103
+ * The node answers 08 ("already logged in") but still switches to the new challenge's
104
+ * session, which we answer too, so commands are understood again afterwards.
105
+ * A status of 00 means the node forgot us (reboot); wait for the new vaddr then.
106
+ */
107
+ resync(timeout?: number): Promise<void>;
108
+ /** Make sure the link can talk to the node; resync/reconnect when it looks stale. */
109
+ ensureLive(timeout?: number): Promise<void>;
110
+ get isConnected(): boolean;
111
+ private readonly onDisconnect;
112
+ disconnect(): Promise<void>;
113
+ private login;
114
+ private write;
115
+ private readonly onNotify;
116
+ private requireOwn;
117
+ /** Encrypt and send a type-3 data-event packet (see protocol.ts). */
118
+ send(packet: Uint8Array): Promise<void>;
119
+ /** Receive every (decrypted) packet. Returns an unsubscribe function. */
120
+ addListener(callback: PacketListener): () => void;
121
+ removeListener(callback: PacketListener): void;
122
+ /** Turn on (restores the previous colour/brightness). */
123
+ on(target?: P.VaddrLike): Promise<void>;
124
+ off(target?: P.VaddrLike): Promise<void>;
125
+ /** Turn on with a colour and brightness (or raw x / y). */
126
+ setLight({ color, brightness, target, x, y }?: SetLightOptions): Promise<void>;
127
+ /** Dim warm night light, level 0..2 (what the app does for plain lights). */
128
+ nightLight(level?: number, target?: P.VaddrLike): Promise<void>;
129
+ /** Same as setLight but for a group id (as configured in the app). */
130
+ setGroup(groupId: number, { color, brightness, x, y, on }?: SetGroupOptions): Promise<void>;
131
+ /** Cycle the colour preset of one light (light_change_color). */
132
+ changeColor(target: P.VaddrLike): Promise<void>;
133
+ saveScene(index: number): Promise<void>;
134
+ playScene(index: number): Promise<void>;
135
+ /** Ping the whole mesh and return the responding lights (`timeout` in seconds). */
136
+ devices(timeout?: number): Promise<P.Device[]>;
137
+ /** Ask one light for its state. Resolves to null on timeout (`timeout` in seconds). */
138
+ status(target: P.VaddrLike, timeout?: number): Promise<P.LightState | null>;
139
+ }
140
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
package/dist/client.js ADDED
@@ -0,0 +1,448 @@
1
+ /** BLE client for ODELIC lights (@stoprocent/noble). */
2
+ import { setTimeout as sleep } from 'node:timers/promises';
3
+ import { ConnectionError, InputError, LoginError } from './errors.js';
4
+ import { log } from './log.js';
5
+ import * as P from './protocol.js';
6
+ import { MeshCrypto } from './crypto.js';
7
+ export const UUID_SERVICE = '9e5d1e475c1343a0863582adffc0386f';
8
+ export const UUID_WRITE = '9e5d1e475c1343a0863582adffc1386f';
9
+ export const UUID_NOTIFY = '9e5d1e475c1343a0863582adffc2386f';
10
+ let noblePromise = null;
11
+ /** The noble instance, loaded on first use so that importing odelic never touches Bluetooth. */
12
+ function getNoble() {
13
+ noblePromise ??= import('@stoprocent/noble').then((m) => m.default);
14
+ return noblePromise;
15
+ }
16
+ async function poweredOn(noble, timeout = 10) {
17
+ try {
18
+ await noble.waitForPoweredOnAsync(timeout * 1000);
19
+ }
20
+ catch (e) {
21
+ throw new ConnectionError(`Bluetooth is not available (state: ${noble.state}); ` +
22
+ 'turn Bluetooth on and allow this terminal to use it', { cause: e });
23
+ }
24
+ }
25
+ function withTimeout(promise, seconds, message) {
26
+ let timer;
27
+ const t = new Promise((_, reject) => {
28
+ timer = setTimeout(() => reject(new ConnectionError(message)), seconds * 1000);
29
+ });
30
+ return Promise.race([promise, t]).finally(() => clearTimeout(timer));
31
+ }
32
+ const norm = (s) => String(s ?? '').toLowerCase().replace(/[-:]/g, '');
33
+ /**
34
+ * Scan for mesh nodes, sorted by signal strength (strongest first).
35
+ * @param opts.homeid only nodes of this mesh
36
+ * @param opts.timeout scan duration in seconds
37
+ */
38
+ export async function findNodes({ homeid = null, timeout = 8 } = {}) {
39
+ const noble = await getNoble();
40
+ await poweredOn(noble);
41
+ const found = new Map();
42
+ const onDiscover = (p) => {
43
+ const hid = P.advHomeid(p.advertisement?.manufacturerData);
44
+ if (hid === null || (homeid !== null && hid !== homeid))
45
+ return;
46
+ found.set(p.id, {
47
+ peripheral: p,
48
+ name: p.advertisement?.localName || null,
49
+ address: p.address && p.address !== 'unknown' ? p.address : p.id,
50
+ homeid: hid,
51
+ rssi: p.rssi,
52
+ });
53
+ };
54
+ noble.on('discover', onDiscover);
55
+ try {
56
+ await noble.startScanningAsync([], true);
57
+ await sleep(timeout * 1000);
58
+ }
59
+ finally {
60
+ noble.removeListener('discover', onDiscover);
61
+ await noble.stopScanningAsync().catch(() => { });
62
+ }
63
+ return [...found.values()].sort((a, b) => b.rssi - a.rssi);
64
+ }
65
+ /** Tiny async FIFO used while logging in. */
66
+ class Inbox {
67
+ items = [];
68
+ waiters = [];
69
+ push(v) {
70
+ const w = this.waiters.shift();
71
+ if (w)
72
+ w(v);
73
+ else
74
+ this.items.push(v);
75
+ }
76
+ next() {
77
+ if (this.items.length)
78
+ return Promise.resolve(this.items.shift());
79
+ return new Promise((resolve) => this.waiters.push(resolve));
80
+ }
81
+ }
82
+ /**
83
+ * One logged-in connection to an ODELIC mesh.
84
+ *
85
+ * ```ts
86
+ * const mesh = new OdelicMesh('12345678');
87
+ * await mesh.connect();
88
+ * await mesh.setLight({ color: 0, brightness: 100 }); // warm, full
89
+ * await mesh.off();
90
+ * await mesh.disconnect();
91
+ * ```
92
+ */
93
+ export class OdelicMesh {
94
+ homeid;
95
+ crypto;
96
+ device;
97
+ scanTimeout;
98
+ /** our vaddr in the mesh (assigned at login) */
99
+ own = null;
100
+ nodeName = null;
101
+ peripheral = null;
102
+ writeChar = null;
103
+ notifyChar = null;
104
+ inbox = null;
105
+ loggingIn = false;
106
+ seg = [];
107
+ segSeq = 0;
108
+ listeners = new Set();
109
+ /** ms timestamp of the last packet we could decrypt (session health signal). */
110
+ lastRx = 0;
111
+ /** True when the session may be out of sync with the node. */
112
+ suspect = false;
113
+ /** @param appId ID shown in the app, e.g. "12345678" (or pass `homeid` + `password`) */
114
+ constructor(appId = null, { homeid, password, device = null, scanTimeout = 8 } = {}) {
115
+ if (appId !== null && appId !== undefined)
116
+ ({ homeid, password } = P.parseAppId(appId));
117
+ if (homeid === undefined || password === undefined) {
118
+ throw new InputError("give appId (e.g. '12345678') or homeid + password");
119
+ }
120
+ this.homeid = homeid;
121
+ this.crypto = new MeshCrypto(homeid, password);
122
+ this.device = device;
123
+ this.scanTimeout = scanTimeout;
124
+ }
125
+ // ------------------------------------------------------------ connection
126
+ async resolveDevice() {
127
+ if (this.device !== null && typeof this.device !== 'string')
128
+ return this.device;
129
+ let nodes = await findNodes({ homeid: this.homeid, timeout: this.scanTimeout });
130
+ if (typeof this.device === 'string') {
131
+ const want = norm(this.device);
132
+ nodes = nodes.filter((n) => [n.name, n.address, n.peripheral.id].some((v) => v && norm(v) === want));
133
+ }
134
+ if (!nodes.length)
135
+ throw new ConnectionError(`no mesh node with HomeID ${this.homeid} found`);
136
+ log.info(`using node ${nodes[0].name} (${nodes[0].address}) rssi ${nodes[0].rssi}`);
137
+ return nodes[0].peripheral;
138
+ }
139
+ /** Scan (unless a peripheral was given), connect and log in. `timeout` in seconds. */
140
+ async connect(timeout = 10) {
141
+ const p = await this.resolveDevice();
142
+ await poweredOn(await getNoble());
143
+ this.nodeName = p.advertisement?.localName || p.id;
144
+ this.own = null;
145
+ this.inbox = new Inbox();
146
+ this.loggingIn = true;
147
+ this.peripheral = p;
148
+ p.on('disconnect', this.onDisconnect);
149
+ try {
150
+ await withTimeout(p.connectAsync(), timeout, `could not connect to ${this.nodeName}`);
151
+ const { characteristics } = await withTimeout(p.discoverSomeServicesAndCharacteristicsAsync([UUID_SERVICE], [UUID_WRITE, UUID_NOTIFY]), timeout, 'GATT discovery timed out');
152
+ this.writeChar = characteristics.find((c) => norm(c.uuid) === UUID_WRITE) ?? null;
153
+ this.notifyChar = characteristics.find((c) => norm(c.uuid) === UUID_NOTIFY) ?? null;
154
+ if (!this.writeChar || !this.notifyChar)
155
+ throw new ConnectionError(`${this.nodeName} is not an ODELIC mesh node`);
156
+ this.notifyChar.on('data', this.onNotify);
157
+ await this.notifyChar.subscribeAsync();
158
+ await this.write(Buffer.from([0x01, 0x20])); // ask for the login challenge
159
+ await withTimeout(this.login(this.inbox), timeout, 'login timed out');
160
+ }
161
+ catch (e) {
162
+ await this.disconnect();
163
+ throw e;
164
+ }
165
+ finally {
166
+ this.loggingIn = false;
167
+ this.inbox = null;
168
+ }
169
+ this.lastRx = Date.now();
170
+ this.suspect = false;
171
+ const vaddrHex = this.own?.toString('hex') ?? '?';
172
+ log.info(`logged in via ${this.nodeName} (own vaddr ${vaddrHex})`);
173
+ }
174
+ /**
175
+ * Re-run the login handshake on the existing link to pick up the node's current session.
176
+ *
177
+ * The node answers 08 ("already logged in") but still switches to the new challenge's
178
+ * session, which we answer too, so commands are understood again afterwards.
179
+ * A status of 00 means the node forgot us (reboot); wait for the new vaddr then.
180
+ */
181
+ async resync(timeout = 8) {
182
+ if (!this.peripheral || this.peripheral.state !== 'connected')
183
+ throw new LoginError('not connected');
184
+ const oldOwn = this.own ? Buffer.from(this.own) : null;
185
+ const inbox = new Inbox();
186
+ this.own = null;
187
+ this.inbox = inbox;
188
+ this.loggingIn = true;
189
+ try {
190
+ await this.write(Buffer.from([0x01, 0x20]));
191
+ await withTimeout(this.login(inbox, { resync: true, oldOwn }), timeout, 'resync timed out');
192
+ }
193
+ catch (e) {
194
+ if (this.own === null && oldOwn)
195
+ this.own = oldOwn;
196
+ throw e;
197
+ }
198
+ finally {
199
+ this.loggingIn = false;
200
+ if (this.inbox === inbox)
201
+ this.inbox = null;
202
+ }
203
+ this.suspect = false;
204
+ const vaddrHex = this.own?.toString('hex') ?? '?';
205
+ log.warning(`session resynchronised with ${this.nodeName} (vaddr ${vaddrHex})`);
206
+ }
207
+ /** Make sure the link can talk to the node; resync/reconnect when it looks stale. */
208
+ async ensureLive(timeout = 8) {
209
+ if (!this.peripheral || this.peripheral.state !== 'connected' || this.own === null) {
210
+ await this.disconnect();
211
+ await this.connect();
212
+ return;
213
+ }
214
+ if (this.suspect) {
215
+ try {
216
+ await this.resync(timeout);
217
+ }
218
+ catch {
219
+ await this.disconnect();
220
+ await this.connect();
221
+ }
222
+ }
223
+ }
224
+ get isConnected() {
225
+ return this.peripheral !== null && this.peripheral.state === 'connected' && this.own !== null;
226
+ }
227
+ onDisconnect = () => {
228
+ log.warning(`node ${this.nodeName} disconnected`);
229
+ this.own = null;
230
+ };
231
+ async disconnect() {
232
+ const p = this.peripheral;
233
+ if (!p)
234
+ return;
235
+ this.peripheral = null;
236
+ this.own = null;
237
+ p.removeListener('disconnect', this.onDisconnect);
238
+ this.notifyChar?.removeListener('data', this.onNotify);
239
+ this.writeChar = this.notifyChar = null;
240
+ try {
241
+ await withTimeout(p.disconnectAsync(), 5, 'disconnect timed out');
242
+ }
243
+ catch (e) {
244
+ log.debug(`disconnect: ${e.message}`);
245
+ }
246
+ }
247
+ async login(inbox, { resync = false, oldOwn = null } = {}) {
248
+ let answered = false;
249
+ for (;;) {
250
+ const p = await inbox.next();
251
+ if (p[0] === 0x02 && p[1] === 0x20 && p.length >= 18) {
252
+ await this.write(this.crypto.answerChallenge(p.subarray(2, 18)));
253
+ answered = true;
254
+ }
255
+ else if (p[0] === 0x02 && p[1] === 0x16 && answered) {
256
+ const status = p.length >= 3 ? p[2] : undefined;
257
+ if (resync && status === 0x08) {
258
+ if (this.own === null && oldOwn)
259
+ this.own = oldOwn; // 08 keeps our login; no new vaddr is sent
260
+ return;
261
+ }
262
+ if (status === 0x08) {
263
+ throw new LoginError('node is already in use by another controller ' +
264
+ '(close the ODELIC app / turn off phone Bluetooth and retry)');
265
+ }
266
+ if (status !== 0)
267
+ throw new LoginError(`login rejected (status ${p.subarray(2).toString('hex')})`);
268
+ if (resync) {
269
+ if (this.own !== null && oldOwn && !this.own.equals(oldOwn))
270
+ return; // 00 + fresh vaddr via onNotify
271
+ continue; // 00: wait for the new 01 0a vaddr assignment
272
+ }
273
+ }
274
+ else if (p[0] === 0x01 && p[1] === 0x0a && p.length >= 6) {
275
+ this.own = Buffer.from(p.subarray(2, 6));
276
+ }
277
+ if (!resync && this.own !== null)
278
+ return;
279
+ if (resync && this.own !== null && oldOwn && !this.own.equals(oldOwn))
280
+ return;
281
+ }
282
+ }
283
+ // ------------------------------------------------------------ transport
284
+ async write(data) {
285
+ if (!this.writeChar)
286
+ throw new ConnectionError('not connected');
287
+ log.debug(`-> ${data.toString('hex')}`);
288
+ await this.writeChar.writeAsync(data, true); // write without response
289
+ }
290
+ onNotify = (raw) => {
291
+ let data = Buffer.from(raw);
292
+ log.debug(`<- ${data.toString('hex')}`);
293
+ if (data.length >= 3 && data[0] === 4 && data[1] === 4) { // segmented PDU
294
+ const seq = data[2] & 0x0f;
295
+ const total = data[2] >> 4;
296
+ if (seq !== this.segSeq + 1) {
297
+ this.seg = [];
298
+ this.segSeq = 0;
299
+ return;
300
+ }
301
+ this.seg.push(data.subarray(3));
302
+ this.segSeq = seq;
303
+ if (seq !== total)
304
+ return;
305
+ data = Buffer.concat(this.seg);
306
+ this.seg = [];
307
+ this.segSeq = 0;
308
+ }
309
+ let plain;
310
+ try {
311
+ plain = this.crypto.decrypt(data);
312
+ }
313
+ catch {
314
+ log.debug(`undecryptable packet ${data.toString('hex')}`);
315
+ if (this.own !== null && !this.loggingIn)
316
+ this.suspect = true; // node encrypts with a session we do not have
317
+ return;
318
+ }
319
+ if (plain !== data && plain[0] === 0x03)
320
+ this.lastRx = Date.now();
321
+ data = plain;
322
+ if (data[0] === 0x01 && data[1] === 0x0a && data.length >= 6)
323
+ this.own = Buffer.from(data.subarray(2, 6));
324
+ if (this.loggingIn) {
325
+ this.inbox?.push(data);
326
+ }
327
+ else if (data[0] === 0x02 && data[1] === 0x20 && data.length >= 18 && this.own !== null) {
328
+ // someone else (another process on this Mac shares the link) started a login:
329
+ // the node now uses that challenge's session, so follow it
330
+ if (this.crypto.adoptChallenge(data.subarray(2, 18))) {
331
+ this.suspect = false;
332
+ log.warning('another controller started a login on this link; following its session');
333
+ }
334
+ }
335
+ for (const cb of [...this.listeners]) {
336
+ try {
337
+ cb(data);
338
+ }
339
+ catch (e) {
340
+ log.error('listener failed:', e);
341
+ }
342
+ }
343
+ };
344
+ requireOwn() {
345
+ if (this.own === null)
346
+ throw new LoginError('not connected');
347
+ return this.own;
348
+ }
349
+ /** Encrypt and send a type-3 data-event packet (see protocol.ts). */
350
+ async send(packet) {
351
+ this.requireOwn();
352
+ const enc = this.crypto.encrypt(packet);
353
+ const mtu = Math.max(20, (this.peripheral?.mtu ?? 23) - 3);
354
+ if (enc.length <= mtu)
355
+ return this.write(enc);
356
+ const chunk = mtu - 3;
357
+ const total = Math.ceil(enc.length / chunk);
358
+ for (let i = 0; i < total; i++) {
359
+ await this.write(Buffer.concat([Buffer.from([0x01, 0x21, (total << 4) | (i + 1)]),
360
+ enc.subarray(i * chunk, (i + 1) * chunk)]));
361
+ await sleep(15);
362
+ }
363
+ }
364
+ /** Receive every (decrypted) packet. Returns an unsubscribe function. */
365
+ addListener(callback) {
366
+ this.listeners.add(callback);
367
+ return () => this.listeners.delete(callback);
368
+ }
369
+ removeListener(callback) {
370
+ this.listeners.delete(callback);
371
+ }
372
+ // ------------------------------------------------------------ actions
373
+ /** Turn on (restores the previous colour/brightness). */
374
+ async on(target = P.BROADCAST) {
375
+ await this.send(P.light(this.requireOwn(), P.vaddr(target), ...P.XY_ON));
376
+ }
377
+ async off(target = P.BROADCAST) {
378
+ await this.send(P.light(this.requireOwn(), P.vaddr(target), ...P.XY_OFF));
379
+ }
380
+ /** Turn on with a colour and brightness (or raw x / y). */
381
+ async setLight({ color = null, brightness = 100, target = P.BROADCAST, x = null, y = null } = {}) {
382
+ x ??= P.colorToX(color ?? 50);
383
+ y ??= P.brightnessToY(brightness);
384
+ await this.send(P.light(this.requireOwn(), P.vaddr(target), x, y));
385
+ }
386
+ /** Dim warm night light, level 0..2 (what the app does for plain lights). */
387
+ async nightLight(level = 0, target = P.BROADCAST) {
388
+ await this.send(P.light(this.requireOwn(), P.vaddr(target), 0, 17 + Math.max(0, Math.min(2, level))));
389
+ }
390
+ /** Same as setLight but for a group id (as configured in the app). */
391
+ async setGroup(groupId, { color = null, brightness = 100, x = null, y = null, on = null } = {}) {
392
+ if (on !== null)
393
+ [x, y] = on ? P.XY_ON : P.XY_OFF;
394
+ x ??= P.colorToX(color ?? 50);
395
+ y ??= P.brightnessToY(brightness);
396
+ await this.send(P.groupLight(this.requireOwn(), groupId, x, y));
397
+ }
398
+ /** Cycle the colour preset of one light (light_change_color). */
399
+ async changeColor(target) {
400
+ await this.send(P.changeColor(this.requireOwn(), P.vaddr(target)));
401
+ }
402
+ async saveScene(index) {
403
+ await this.send(P.scene(this.requireOwn(), index, true));
404
+ }
405
+ async playScene(index) {
406
+ await this.send(P.scene(this.requireOwn(), index, false));
407
+ }
408
+ /** Ping the whole mesh and return the responding lights (`timeout` in seconds). */
409
+ async devices(timeout = 3) {
410
+ const found = new Map();
411
+ const off = this.addListener((p) => {
412
+ const d = P.parsePingResponse(p);
413
+ if (d)
414
+ found.set(d.vaddr.toString('hex'), d);
415
+ });
416
+ try {
417
+ await this.send(P.pingAll(this.requireOwn()));
418
+ await sleep(timeout * 1000);
419
+ }
420
+ finally {
421
+ off();
422
+ }
423
+ return [...found.values()];
424
+ }
425
+ /** Ask one light for its state. Resolves to null on timeout (`timeout` in seconds). */
426
+ async status(target, timeout = 3) {
427
+ const dst = P.vaddr(target);
428
+ let off = () => { };
429
+ let timer;
430
+ const reply = new Promise((resolve) => {
431
+ off = this.addListener((p) => {
432
+ const st = P.parseStatus(p);
433
+ if (st && st.vaddr.equals(dst))
434
+ resolve(st);
435
+ });
436
+ timer = setTimeout(() => resolve(null), timeout * 1000);
437
+ });
438
+ try {
439
+ await this.send(P.statusRequest(this.requireOwn(), dst));
440
+ return await reply;
441
+ }
442
+ finally {
443
+ clearTimeout(timer);
444
+ off();
445
+ }
446
+ }
447
+ }
448
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}