incyclist-devices 3.0.6 → 3.0.8

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 (63) hide show
  1. package/lib/cjs/antv2/base/adapter.js +13 -7
  2. package/lib/cjs/antv2/base/interface.js +4 -4
  3. package/lib/cjs/base/adpater.js +2 -5
  4. package/lib/cjs/ble/base/adapter.js +9 -1
  5. package/lib/cjs/ble/base/interface.js +83 -38
  6. package/lib/cjs/ble/base/peripheral.js +14 -7
  7. package/lib/cjs/ble/base/sensor.js +11 -4
  8. package/lib/cjs/ble/bindings/linux.js +2 -5
  9. package/lib/cjs/ble/bindings/mock.js +3 -6
  10. package/lib/cjs/ble/bindings/types.js +2 -5
  11. package/lib/cjs/direct-connect/base/interface.js +8 -7
  12. package/lib/cjs/direct-connect/base/peripheral.js +17 -3
  13. package/lib/cjs/modes/antble-smarttrainer.js +1 -1
  14. package/lib/cjs/serial/base/serial-interface.js +9 -9
  15. package/lib/cjs/serial/base/serial-provider.js +113 -0
  16. package/lib/cjs/serial/daum/DaumAdapter.js +3 -3
  17. package/lib/cjs/serial/daum/classic/mock.js +2 -2
  18. package/lib/cjs/serial/index.js +3 -3
  19. package/lib/cjs/serial/kettler/comms.js +2 -5
  20. package/lib/cjs/utils/task.js +2 -5
  21. package/lib/esm/antv2/base/adapter.js +12 -6
  22. package/lib/esm/antv2/base/interface.js +2 -2
  23. package/lib/esm/base/adpater.js +1 -1
  24. package/lib/esm/ble/base/adapter.js +9 -1
  25. package/lib/esm/ble/base/interface.js +81 -33
  26. package/lib/esm/ble/base/peripheral.js +14 -7
  27. package/lib/esm/ble/base/sensor.js +11 -4
  28. package/lib/esm/ble/bindings/linux.js +1 -1
  29. package/lib/esm/ble/bindings/mock.js +1 -1
  30. package/lib/esm/ble/bindings/types.js +1 -1
  31. package/lib/esm/direct-connect/base/interface.js +6 -2
  32. package/lib/esm/direct-connect/base/peripheral.js +16 -2
  33. package/lib/esm/modes/antble-smarttrainer.js +1 -1
  34. package/lib/esm/serial/base/serial-interface.js +2 -2
  35. package/lib/esm/serial/base/serial-provider.js +75 -0
  36. package/lib/esm/serial/base/serialport.js +0 -2
  37. package/lib/esm/serial/daum/DaumAdapter.js +1 -1
  38. package/lib/esm/serial/daum/classic/mock.js +1 -1
  39. package/lib/esm/serial/index.js +1 -1
  40. package/lib/esm/serial/kettler/comms.js +1 -1
  41. package/lib/esm/utils/task.js +1 -1
  42. package/lib/types/antv2/base/adapter.d.ts +2 -2
  43. package/lib/types/antv2/base/binding.d.ts +1 -1
  44. package/lib/types/antv2/base/interface.d.ts +2 -2
  45. package/lib/types/antv2/types.d.ts +1 -1
  46. package/lib/types/base/adpater.d.ts +1 -1
  47. package/lib/types/ble/base/adapter.d.ts +1 -0
  48. package/lib/types/ble/base/interface.d.ts +6 -2
  49. package/lib/types/ble/bindings/linux.d.ts +1 -1
  50. package/lib/types/ble/bindings/types.d.ts +1 -1
  51. package/lib/types/ble/types.d.ts +1 -1
  52. package/lib/types/direct-connect/base/interface.d.ts +1 -1
  53. package/lib/types/direct-connect/base/peripheral.d.ts +2 -1
  54. package/lib/types/direct-connect/bindings/types.d.ts +1 -1
  55. package/lib/types/serial/base/serial-interface.d.ts +1 -1
  56. package/lib/types/serial/base/serial-provider.d.ts +16 -0
  57. package/lib/types/serial/daum/DaumAdapter.d.ts +1 -1
  58. package/lib/types/serial/index.d.ts +1 -1
  59. package/lib/types/serial/kettler/comms.d.ts +1 -1
  60. package/lib/types/types/adapter.d.ts +1 -1
  61. package/lib/types/types/interface.d.ts +1 -1
  62. package/lib/types/utils/task.d.ts +1 -1
  63. package/package.json +1 -1
@@ -12,7 +12,7 @@ const utils_js_2 = require("../utils.js");
12
12
  const consts_js_1 = require("../consts.js");
13
13
  const sensor_factory_js_1 = __importDefault(require("../factories/sensor-factory.js"));
14
14
  const gd_eventlog_1 = require("gd-eventlog");
15
- const node_events_1 = __importDefault(require("node:events"));
15
+ const node_events_1 = require("node:events");
16
16
  const INTERFACE_NAME = 'ant';
17
17
  const MAX_RETRIES = 3;
18
18
  class AntAdapter extends adpater_js_1.default {
@@ -30,7 +30,7 @@ class AntAdapter extends adpater_js_1.default {
30
30
  sensorConnected;
31
31
  startStatus;
32
32
  startupRetryPause = 1000;
33
- internalEmitter = new node_events_1.default();
33
+ internalEmitter = new node_events_1.EventEmitter();
34
34
  constructor(settings, props) {
35
35
  super(settings, props);
36
36
  const profile = this.getProfileName();
@@ -334,21 +334,27 @@ class AntAdapter extends adpater_js_1.default {
334
334
  async initSensor(props) {
335
335
  this.startStatus.sensorStarted = this.sensorConnected;
336
336
  if (this.startStatus.sensorStarted)
337
- return;
338
- this.logEvent({ message: 'start sensor', device: this.getName(), props });
337
+ return true;
338
+ const logProps = structuredClone(props ?? {});
339
+ logProps.routeName = logProps?.route?.title;
340
+ logProps.routeId = logProps?.route?.id;
341
+ delete logProps.route;
342
+ this.logEvent({ message: 'start sensor', device: this.getName(), props: logProps });
339
343
  try {
340
344
  this.sensorConnected = await this.startSensor();
341
345
  if (this.sensorConnected) {
342
- this.logEvent({ message: 'sensor started', device: this.getName(), channel: this.sensor?.getChannel()?.getChannelNo(), props });
346
+ this.logEvent({ message: 'sensor started', device: this.getName(), channelNo: this.sensor?.getChannel()?.getChannelNo(), props: logProps });
343
347
  this.startStatus.sensorStarted = true;
348
+ return true;
344
349
  }
345
350
  else {
346
- this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: 'unknown', props });
351
+ this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: 'unknown', props: logProps });
347
352
  }
348
353
  }
349
354
  catch (err) {
350
- this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: err.message, props });
355
+ this.logEvent({ message: 'start sensor failed', device: this.getName(), reason: err.message, props: logProps });
351
356
  }
357
+ return false;
352
358
  }
353
359
  getLogProps(startProps) {
354
360
  const { user, userWeight, bikeWeight, startupTimeout, automaticReconnect } = startProps ?? {};
@@ -3,12 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const node_events_1 = __importDefault(require("node:events"));
6
+ const node_events_1 = require("node:events");
7
7
  const gd_eventlog_1 = require("gd-eventlog");
8
8
  const sensor_factory_js_1 = __importDefault(require("../factories/sensor-factory.js"));
9
9
  const utils_js_1 = require("../../utils/utils.js");
10
10
  const adapter_factory_js_1 = __importDefault(require("../factories/adapter-factory.js"));
11
- class AntInterface extends node_events_1.default {
11
+ class AntInterface extends node_events_1.EventEmitter {
12
12
  static _instance = undefined;
13
13
  static INTERFACE_NAME = 'ant';
14
14
  static getInstance(props = {}) {
@@ -178,7 +178,7 @@ class AntInterface extends node_events_1.default {
178
178
  if (this.isScanning()) {
179
179
  return await this.scanPromise;
180
180
  }
181
- this.activeScan = { emitter: new node_events_1.default() };
181
+ this.activeScan = { emitter: new node_events_1.EventEmitter() };
182
182
  const detected = [];
183
183
  const _scan = () => new Promise(async (done) => {
184
184
  const onDetected = (profile, deviceID) => {
@@ -340,7 +340,7 @@ class AntInterface extends node_events_1.default {
340
340
  this.logEvent({ message: 'could not start sensor' });
341
341
  channel.off('data', onData);
342
342
  }
343
- this.logEvent({ message: 'sensor started', channel: sensor.getChannel()?.getChannelNo(), profile: sensor.getProfile(), deviceID: sensor.getDeviceID() });
343
+ this.logEvent({ message: 'sensor started', channelNo: sensor.getChannel()?.getChannelNo(), profile: sensor.getProfile(), deviceID: sensor.getDeviceID() });
344
344
  return started;
345
345
  }
346
346
  catch (err) {
@@ -1,13 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  const index_js_1 = require("../types/index.js");
7
- const node_events_1 = __importDefault(require("node:events"));
4
+ const node_events_1 = require("node:events");
8
5
  const consts_js_1 = require("./consts.js");
9
6
  const utils_js_1 = require("../utils/utils.js");
10
- class IncyclistDevice extends node_events_1.default {
7
+ class IncyclistDevice extends node_events_1.EventEmitter {
11
8
  onDataFn;
12
9
  settings;
13
10
  lastUpdate;
@@ -15,6 +15,7 @@ class BleAdapter extends adpater_js_1.default {
15
15
  device;
16
16
  onDeviceDataHandler = this.onDeviceData.bind(this);
17
17
  onDeviceDisconnectHandler = this.emit.bind(this);
18
+ onDisconnectDoneHandler = this.onDisconnectDone.bind(this);
18
19
  startTask;
19
20
  constructor(settings, props) {
20
21
  super(settings, props);
@@ -198,7 +199,7 @@ class BleAdapter extends adpater_js_1.default {
198
199
  await this.stop();
199
200
  }
200
201
  const ble = this.getBle();
201
- ble.once('disconnect-done', this.onDisconnectDone.bind(this));
202
+ ble.once('disconnect-done', this.onDisconnectDoneHandler);
202
203
  this.startTask = new task_js_1.InteruptableTask(this.startAdapter(startProps), {
203
204
  timeout: startProps?.timeout,
204
205
  name: 'start',
@@ -206,6 +207,9 @@ class BleAdapter extends adpater_js_1.default {
206
207
  log: this.logEvent.bind(this)
207
208
  });
208
209
  const res = await this.startTask.run();
210
+ if (!res) {
211
+ ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
212
+ }
209
213
  return res;
210
214
  }
211
215
  isStarting() {
@@ -303,6 +307,8 @@ class BleAdapter extends adpater_js_1.default {
303
307
  this.logEvent({ message: 'start result: error', error: err.message, device: this.getName(), interface: this.getInterface(), protocol: this.getProtocolName() });
304
308
  this.started = false;
305
309
  this.stopped = true;
310
+ const ble = this.getBle();
311
+ ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
306
312
  return false;
307
313
  }
308
314
  }
@@ -380,6 +386,8 @@ class BleAdapter extends adpater_js_1.default {
380
386
  sensor.off('data', this.onDeviceDataHandler);
381
387
  sensor.off('disconnected', this.onDeviceDisconnectHandler);
382
388
  sensor.off('error', console.log);
389
+ const ble = this.getBle();
390
+ ble.removeListener('disconnect-done', this.onDisconnectDoneHandler);
383
391
  sensor.reset();
384
392
  this.resetData();
385
393
  this.stopped = true;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.BleInterfaceFactory = exports.BleInterface = void 0;
7
- const node_events_1 = __importDefault(require("node:events"));
4
+ const node_events_1 = require("node:events");
8
5
  const gd_eventlog_1 = require("gd-eventlog");
9
6
  const task_js_1 = require("../../utils/task.js");
10
7
  const peripheral_js_1 = require("./peripheral.js");
@@ -14,7 +11,7 @@ const index_js_1 = require("../factories/index.js");
14
11
  const BLE_EXPIRATION_TIMEOUT = 10 * 1000 * 60;
15
12
  const BLE_DEFAULT_CONNECT_TIMEOUT = 30 * 1000;
16
13
  let instanceCount = 0;
17
- class BleInterface extends node_events_1.default {
14
+ class BleInterface extends node_events_1.EventEmitter {
18
15
  static _instance;
19
16
  static INTERFACE_NAME = 'ble';
20
17
  logger;
@@ -39,6 +36,8 @@ class BleInterface extends node_events_1.default {
39
36
  emitted = [];
40
37
  confirmedBleState;
41
38
  currentBleState;
39
+ isAutoStart = false;
40
+ stateChangeEventHandler = null;
42
41
  static getInstance(props = {}) {
43
42
  if (BleInterface._instance === undefined)
44
43
  BleInterface._instance = new BleInterface(props);
@@ -66,7 +65,7 @@ class BleInterface extends node_events_1.default {
66
65
  if (binding) {
67
66
  this.setBinding(binding);
68
67
  }
69
- this.internalEvents = new node_events_1.default();
68
+ this.internalEvents = new node_events_1.EventEmitter();
70
69
  this.onDiscovered = this.onPeripheralFound.bind(this);
71
70
  const { enabled = true } = props;
72
71
  if (this.binding && enabled)
@@ -94,10 +93,23 @@ class BleInterface extends node_events_1.default {
94
93
  getBinding() {
95
94
  return this.binding;
96
95
  }
97
- autoConnect() {
98
- this.connect();
96
+ async autoConnect() {
97
+ this.isAutoStart = true;
98
+ await this.connectInternal();
99
99
  }
100
100
  async connect(reconnect) {
101
+ if (this.isAutoStart)
102
+ return this.isConnected();
103
+ else
104
+ return this.connectInternal(reconnect);
105
+ }
106
+ async connectInternal(reconnect) {
107
+ if (this.isConnected())
108
+ return true;
109
+ if (!this.stateChangeEventHandler) {
110
+ this.stateChangeEventHandler = this.onBleStateChange.bind(this);
111
+ this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
112
+ }
101
113
  if (!this.getBinding()) {
102
114
  this.logEvent({ message: 'BLE not available' });
103
115
  return false;
@@ -106,8 +118,6 @@ class BleInterface extends node_events_1.default {
106
118
  this.logEvent({ message: 'BLE connect - already connecting' });
107
119
  return this.connectTask.getPromise();
108
120
  }
109
- if (this.isConnected())
110
- return true;
111
121
  this.logEvent({ message: 'BLE connect request' });
112
122
  this.connectTask = new task_js_1.InteruptableTask(this.connectBle(), {
113
123
  timeout: this.getConnectTimeout(),
@@ -116,6 +126,9 @@ class BleInterface extends node_events_1.default {
116
126
  log: this.logEvent.bind(this),
117
127
  });
118
128
  const success = await this.connectTask.run().catch(() => false);
129
+ this.removeAllListeners('ble-state-change');
130
+ if (success)
131
+ this.emit('connected');
119
132
  return success;
120
133
  }
121
134
  async disconnect(connectionLost) {
@@ -126,7 +139,7 @@ class BleInterface extends node_events_1.default {
126
139
  this.confirmedBleState = 'poweredOff';
127
140
  return false;
128
141
  }
129
- this.getBinding().removeAllListeners('error');
142
+ this.getBinding()?.removeAllListeners('error');
130
143
  if (!this.isConnected() && !connectionLost) {
131
144
  this.confirmedBleState = 'poweredOff';
132
145
  return true;
@@ -144,11 +157,19 @@ class BleInterface extends node_events_1.default {
144
157
  if (this.isConnecting())
145
158
  await this.connectTask?.stop();
146
159
  this.emit('disconnect-done');
147
- this.getBinding().removeAllListeners('stateChange');
148
- this.getBinding().on('stateChange', this.onBleStateChange.bind(this));
149
- this.getBinding().on('error', this.onError.bind(this));
160
+ if (connectionLost) {
161
+ this.getBinding()?.removeAllListeners('stateChange');
162
+ this.stateChangeEventHandler = this.stateChangeEventHandler ?? this.onBleStateChange.bind(this);
163
+ this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
164
+ }
165
+ else {
166
+ this.getBinding()?.removeAllListeners('stateChange');
167
+ this.stateChangeEventHandler = null;
168
+ }
169
+ this.getBinding()?.on('error', this.onError.bind(this));
150
170
  this.logEvent({ message: 'interface disconnected', interface: 'BLE' });
151
171
  this.confirmedBleState = 'poweredOff';
172
+ this.emit('disconnect');
152
173
  return true;
153
174
  };
154
175
  if (this.isDisconnecting()) {
@@ -156,7 +177,7 @@ class BleInterface extends node_events_1.default {
156
177
  }
157
178
  this.disconnectTask = new task_js_1.InteruptableTask(performDisconnect(), {
158
179
  timeout: this.getConnectTimeout(),
159
- name: 'BLE connect',
180
+ name: 'BLE disconnect',
160
181
  errorOnTimeout: false,
161
182
  log: this.logEvent.bind(this),
162
183
  });
@@ -225,13 +246,13 @@ class BleInterface extends node_events_1.default {
225
246
  this.logEvent({ message: 'pausing logging' });
226
247
  this.logDisabled = true;
227
248
  try {
228
- this.getBinding().pauseLogging();
249
+ this.getBinding()?.pauseLogging();
229
250
  }
230
251
  catch { }
231
252
  }
232
253
  resumeLogging() {
233
254
  try {
234
- this.getBinding().resumeLogging();
255
+ this.getBinding()?.resumeLogging();
235
256
  }
236
257
  catch { }
237
258
  this.logDisabled = false;
@@ -289,7 +310,7 @@ class BleInterface extends node_events_1.default {
289
310
  }
290
311
  this.logEvent({ message: 'reconnecting interface', stack: error.stack });
291
312
  await this.disconnect();
292
- await this.connect(true);
313
+ await this.connectInternal(true);
293
314
  }
294
315
  async startPeripheralScan(retry = false) {
295
316
  if (!this.isConnected() || this.isDiscovering()) {
@@ -568,27 +589,41 @@ class BleInterface extends node_events_1.default {
568
589
  addKnownDevice(_settings) {
569
590
  }
570
591
  async connectBle() {
571
- this.currentBleState = this.getBinding().state;
572
- if (this.currentBleState === 'poweredOn') {
592
+ const prev = this.currentBleState;
593
+ this.currentBleState = this.currentBleState ?? this.getBinding()?.state;
594
+ if (this.currentBleState === 'poweredOn' && prev !== 'poweredOn') {
573
595
  this.onConnected();
574
596
  return true;
575
597
  }
598
+ else if (this.currentBleState === 'unauthorized' || this.currentBleState === 'unsupported') {
599
+ return false;
600
+ }
576
601
  const res = await this.waitForBleConnected();
577
602
  return res;
578
603
  }
579
604
  waitForBleConnected() {
580
605
  return new Promise((done) => {
581
- this.getBinding().once('error', (err) => {
606
+ this.getBinding()?.once('error', (err) => {
582
607
  this.logEvent({ message: 'Ble connect result: error', error: err.message });
583
608
  return done(false);
584
609
  });
585
- this.getBinding().on('stateChange', (state) => {
586
- if (state === this.confirmedBleState)
587
- return;
588
- this.logEvent({ message: 'BLE state change', state });
589
- if (state === 'poweredOn') {
590
- this.onConnected();
591
- return done(true);
610
+ this.on('ble-state-change', (state) => {
611
+ try {
612
+ this.currentBleState = state;
613
+ if (state === 'poweredOn') {
614
+ this.onConnected();
615
+ this.removeAllListeners('ble-state-change');
616
+ this.currentBleState = state;
617
+ return done(true);
618
+ }
619
+ if (state === 'unauthorized') {
620
+ this.removeAllListeners('ble-state-change');
621
+ this.currentBleState = state;
622
+ return done(false);
623
+ }
624
+ }
625
+ catch (err) {
626
+ console.log('# BLE waitForBleConnected error', err);
592
627
  }
593
628
  });
594
629
  });
@@ -599,13 +634,16 @@ class BleInterface extends node_events_1.default {
599
634
  async onConnected() {
600
635
  if (this.isConnected())
601
636
  return;
602
- this.confirmedBleState = 'poweredOn';
603
- this.getBinding().removeAllListeners('error');
604
- this.getBinding().removeAllListeners('stateChange');
605
- this.getBinding().on('stateChange', this.onBleStateChange.bind(this));
606
- this.getBinding().on('error', this.onError.bind(this));
607
- this.logEvent({ message: 'BLE connected' });
608
- this.startPeripheralScan();
637
+ try {
638
+ this.confirmedBleState = 'poweredOn';
639
+ this.getBinding()?.removeAllListeners('error');
640
+ this.getBinding()?.on('error', this.onError.bind(this));
641
+ this.logEvent({ message: 'BLE connected' });
642
+ this.startPeripheralScan();
643
+ }
644
+ catch (err) {
645
+ console.log('# BLE onConnected error', err);
646
+ }
609
647
  }
610
648
  async onDisconnected() {
611
649
  if (this.isDisconnecting() || !this.isConnected())
@@ -616,15 +654,22 @@ class BleInterface extends node_events_1.default {
616
654
  async onBleStateChange(state) {
617
655
  if (state === this.currentBleState)
618
656
  return;
657
+ this.logEvent({ message: 'BLE state change', state });
619
658
  this.currentBleState = state;
620
- if (state === 'poweredOff') {
621
- this.onDisconnected();
659
+ if (this.isConnecting()) {
660
+ this.emit('ble-state-change', state);
661
+ return;
662
+ }
663
+ if (state === 'poweredOff' || state === 'unauthorized') {
664
+ if (this.isConnected()) {
665
+ this.onDisconnected();
666
+ }
622
667
  }
623
668
  else {
624
669
  if (this.isDisconnecting()) {
625
670
  await this.disconnectTask.getPromise();
626
671
  }
627
- this.onConnected();
672
+ this.connectInternal();
628
673
  }
629
674
  }
630
675
  getAdapterFactory() {
@@ -61,6 +61,10 @@ class BlePeripheral {
61
61
  peripheral.on('error', this.onErrorHandler);
62
62
  this.connected = true;
63
63
  done();
64
+ })
65
+ .catch(() => {
66
+ this.connected = false;
67
+ done();
64
68
  });
65
69
  });
66
70
  await this.connectPromise;
@@ -69,10 +73,9 @@ class BlePeripheral {
69
73
  }
70
74
  async disconnect(connectionLost = false) {
71
75
  this.disconnecting = true;
72
- if (!this.isConnected()) {
73
- return true;
76
+ if (this.isConnected()) {
77
+ await this.unsubscribeAll(connectionLost);
74
78
  }
75
- await this.unsubscribeAll(connectionLost);
76
79
  Object.keys(this.characteristics).forEach(uuid => {
77
80
  const c = this.characteristics[uuid];
78
81
  c.removeAllListeners();
@@ -88,7 +91,8 @@ class BlePeripheral {
88
91
  return new Promise((done) => { this.getPeripheral().disconnect(() => { done(); }); });
89
92
  };
90
93
  }
91
- await this.getPeripheral().disconnectAsync();
94
+ await this.getPeripheral().disconnectAsync()
95
+ .catch(() => { });
92
96
  }
93
97
  peripheral.removeAllListeners();
94
98
  }
@@ -116,6 +120,7 @@ class BlePeripheral {
116
120
  if (this.disconnectedSignalled || this.disconnecting)
117
121
  return;
118
122
  this.disconnectedSignalled = true;
123
+ this.getPeripheral().removeAllListeners();
119
124
  this.ble.resumeLogging();
120
125
  this.logEvent({ message: 'peripheral disconnected', address: this.getPeripheral()?.address });
121
126
  try {
@@ -137,7 +142,8 @@ class BlePeripheral {
137
142
  const peripheral = this.getPeripheral();
138
143
  let services = [];
139
144
  if (peripheral?.discoverServicesAsync) {
140
- services = await peripheral.discoverServicesAsync([]);
145
+ services = await peripheral.discoverServicesAsync([])
146
+ .catch(() => []);
141
147
  }
142
148
  this.discoveredServiceUUIds = services.map(s => (0, utils_js_1.beautifyUUID)(s.uuid));
143
149
  this.logEvent({ message: 'discover services result', address: this.getPeripheral().address, services: this.discoveredServiceUUIds });
@@ -155,7 +161,8 @@ class BlePeripheral {
155
161
  if (!this.getPeripheral())
156
162
  return [];
157
163
  this.logEvent({ message: 'discover services and characteristics', service: serviceUUID, address: this.getPeripheral().address });
158
- const res = await this.getPeripheral().discoverSomeServicesAndCharacteristicsAsync([serviceUUID], []);
164
+ const res = await this.getPeripheral().discoverSomeServicesAndCharacteristicsAsync([serviceUUID], [])
165
+ .catch(() => ({ services: [], characteristics: [] }));
159
166
  res.characteristics.forEach(c => this.characteristics[(0, utils_js_1.beautifyUUID)(c.uuid)] = c);
160
167
  return res.characteristics.map(c => {
161
168
  const { uuid, properties, name, _serviceUuid } = c;
@@ -182,7 +189,7 @@ class BlePeripheral {
182
189
  }
183
190
  return true;
184
191
  }
185
- let c = await this.queryRawCharacteristic(characteristicUUID);
192
+ let c = await this.queryRawCharacteristic(characteristicUUID).catch(() => null);
186
193
  if (!c) {
187
194
  return false;
188
195
  }
@@ -122,17 +122,24 @@ class TBleSensor extends node_events_1.EventEmitter {
122
122
  let connected = false;
123
123
  let subscribed = false;
124
124
  let success = false;
125
+ await (0, utils_js_1.sleep)(500);
125
126
  do {
126
- if (!connected) {
127
- connected = await this.startSensor(true);
127
+ try {
128
+ if (!connected) {
129
+ connected = await this.startSensor(true);
130
+ }
131
+ if (connected && !subscribed) {
132
+ subscribed = await this.subscribe();
133
+ }
128
134
  }
129
- if (connected && !subscribed) {
130
- subscribed = await this.subscribe();
135
+ catch {
131
136
  }
132
137
  success = connected && subscribed;
133
138
  if (!success) {
134
139
  await (0, utils_js_1.sleep)(1000);
135
140
  }
141
+ if (!this.stopRequested)
142
+ this.logEvent({ message: 'reconnect sensor retry' });
136
143
  } while (!success || this.stopRequested);
137
144
  this.logEvent({ message: 'reconnect sensor completed', success, stopRequested: this.stopRequested });
138
145
  return success;
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.BleLinuxBinding = void 0;
7
- const events_1 = __importDefault(require("events"));
8
- class BleLinuxBinding extends events_1.default {
4
+ const events_1 = require("events");
5
+ class BleLinuxBinding extends events_1.EventEmitter {
9
6
  static _instance;
10
7
  _bindings;
11
8
  state;
@@ -1,11 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- const events_1 = __importDefault(require("events"));
3
+ const events_1 = require("events");
7
4
  const utils_js_1 = require("../../utils/utils.js");
8
- class Binding extends events_1.default {
5
+ class Binding extends events_1.EventEmitter {
9
6
  static _instance;
10
7
  _bindings;
11
8
  state;
@@ -64,7 +61,7 @@ class Binding extends events_1.default {
64
61
  callback();
65
62
  }
66
63
  }
67
- class MockPeripheral extends events_1.default {
64
+ class MockPeripheral extends events_1.EventEmitter {
68
65
  id;
69
66
  address;
70
67
  name;
@@ -1,16 +1,13 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.StaticNotifyCharacteristic = exports.StaticWriteCharacteristic = exports.StaticReadCharacteristic = exports.MockCharacteristic = exports.RESULT_UNLIKELY_ERROR = exports.RESULT_INVALID_ATTRIBUTE_LENGTH = exports.RESULT_ATTR_NOT_LONG = exports.RESULT_INVALID_OFFSET = exports.RESULT_SUCCESS = void 0;
7
- const node_events_1 = __importDefault(require("node:events"));
4
+ const node_events_1 = require("node:events");
8
5
  exports.RESULT_SUCCESS = 0x00;
9
6
  exports.RESULT_INVALID_OFFSET = 0x07;
10
7
  exports.RESULT_ATTR_NOT_LONG = 0x0b;
11
8
  exports.RESULT_INVALID_ATTRIBUTE_LENGTH = 0x0d;
12
9
  exports.RESULT_UNLIKELY_ERROR = 0x0e;
13
- class MockCharacteristic extends node_events_1.default {
10
+ class MockCharacteristic extends node_events_1.EventEmitter {
14
11
  uuid;
15
12
  properties;
16
13
  secure;
@@ -1,10 +1,7 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.DirectConnectInterfaceFactory = void 0;
7
- const node_events_1 = __importDefault(require("node:events"));
4
+ const node_events_1 = require("node:events");
8
5
  const gd_eventlog_1 = require("gd-eventlog");
9
6
  const task_js_1 = require("../../utils/task.js");
10
7
  const peripheral_js_1 = require("./peripheral.js");
@@ -16,7 +13,7 @@ const DC_TYPE = 'wahoo-fitness-tnp';
16
13
  const DC_PORT = 36866;
17
14
  const DC_EXPIRATION_TIMEOUT = 10 * 1000 * 60;
18
15
  let instanceId = 0;
19
- class DirectConnectInterface extends node_events_1.default {
16
+ class DirectConnectInterface extends node_events_1.EventEmitter {
20
17
  static _instance;
21
18
  static INTERFACE_NAME = 'wifi';
22
19
  logger;
@@ -57,7 +54,7 @@ class DirectConnectInterface extends node_events_1.default {
57
54
  if (binding) {
58
55
  this.setBinding(binding);
59
56
  }
60
- this.internalEvents = new node_events_1.default();
57
+ this.internalEvents = new node_events_1.EventEmitter();
61
58
  this.instance = ++instanceId;
62
59
  const { enabled } = props;
63
60
  if (this.binding && (enabled ?? false))
@@ -139,6 +136,7 @@ class DirectConnectInterface extends node_events_1.default {
139
136
  return false;
140
137
  }
141
138
  this.connected = true;
139
+ this.emit('connected');
142
140
  return true;
143
141
  }
144
142
  async disconnect() {
@@ -149,7 +147,10 @@ class DirectConnectInterface extends node_events_1.default {
149
147
  this.getBinding()?.mdns?.disconnect();
150
148
  this.internalEvents.removeAllListeners();
151
149
  this.connected = false;
152
- return !this.isConnected();
150
+ const disconnected = !this.isConnected();
151
+ if (disconnected)
152
+ this.emit('disconnect');
153
+ return disconnected;
153
154
  }
154
155
  isConnected() {
155
156
  return this.connected && this.getBinding()?.mdns !== undefined && this.binding.mdns !== null;