From 33f72ba09e5af6e18db4559357eccc955a24be95 Mon Sep 17 00:00:00 2001 From: literallyvoid Date: Tue, 23 Sep 2025 10:20:59 -0700 Subject: [PATCH 1/3] rename test event:valuechanged to event:connect --- test/Device.spec.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/Device.spec.js b/test/Device.spec.js index cb6196d..39a25d2 100644 --- a/test/Device.spec.js +++ b/test/Device.spec.js @@ -89,7 +89,7 @@ test('gatt server initialization', async () => { expect(gattServer.init).toHaveBeenCalledTimes(1) }) -test('event:valuechanged', async () => { +test('event:connect', async () => { const device = new Device(dbus, 'hci0', 'dev_00_00_00_00_00_00') const connectedFn = jest.fn() From 0350accbace6fb0a3ff30e0677f7722c901dda8f Mon Sep 17 00:00:00 2001 From: literallyvoid Date: Tue, 23 Sep 2025 10:16:59 -0700 Subject: [PATCH 2/3] test that `connect` event is fired once per connection --- test/Device.spec.js | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/test/Device.spec.js b/test/Device.spec.js index 39a25d2..7069d80 100644 --- a/test/Device.spec.js +++ b/test/Device.spec.js @@ -114,3 +114,36 @@ test('event:connect', async () => { await device.disconnect() }) + +test('event:connect once per connect', async () => { + const device = new Device(dbus, 'hci0', 'dev_00_00_00_00_00_00') + + const connectedFn = jest.fn() + const disconnectedFn = jest.fn() + + device.on('connect', connectedFn) + device.on('disconnect', disconnectedFn) + + await device.connect() + device.helper.emit('PropertiesChanged', + { Connected: { signature: 'b', value: true } } + ) + + await device.disconnect() + device.helper.emit('PropertiesChanged', + { Connected: { signature: 'b', value: false } } + ) + + await device.connect() + device.helper.emit('PropertiesChanged', + { Connected: { signature: 'b', value: true } } + ) + + await device.disconnect() + device.helper.emit('PropertiesChanged', + { Connected: { signature: 'b', value: false } } + ) + + expect(connectedFn).toHaveBeenCalledTimes(2) + expect(disconnectedFn).toHaveBeenCalledTimes(2) +}) From d1ec7a9cee5a625b5ae9d77cc5eedaafa567513f Mon Sep 17 00:00:00 2001 From: literallyvoid Date: Tue, 23 Sep 2025 10:26:14 -0700 Subject: [PATCH 3/3] Move Device's built-in {dis-}connection watcher to constructor Previously, every time `connect` was called, the device's `connect` event would be fired one more time. --- src/Device.js | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/Device.js b/src/Device.js index c4c8585..ff91d58 100644 --- a/src/Device.js +++ b/src/Device.js @@ -16,6 +16,19 @@ class Device extends EventEmitter { this.adapter = adapter this.device = device this.helper = new BusHelper(dbus, 'org.bluez', `/org/bluez/${adapter}/${device}`, 'org.bluez.Device1', { usePropsEvents: true }) + + const cb = (propertiesChanged) => { + if ('Connected' in propertiesChanged) { + const { value } = propertiesChanged.Connected + if (value) { + this.emit('connect', { connected: true }) + } else { + this.emit('disconnect', { connected: false }) + } + } + } + + this.helper.on('PropertiesChanged', cb) } /** @@ -124,18 +137,6 @@ class Device extends EventEmitter { * Connect to remote device */ async connect () { - const cb = (propertiesChanged) => { - if ('Connected' in propertiesChanged) { - const { value } = propertiesChanged.Connected - if (value) { - this.emit('connect', { connected: true }) - } else { - this.emit('disconnect', { connected: false }) - } - } - } - - this.helper.on('PropertiesChanged', cb) await this.helper.callMethod('Connect') }