incyclist-devices 3.0.6 → 3.0.7

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 (58) 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/interface.js +68 -36
  5. package/lib/cjs/ble/base/peripheral.js +14 -7
  6. package/lib/cjs/ble/base/sensor.js +11 -4
  7. package/lib/cjs/ble/bindings/linux.js +2 -5
  8. package/lib/cjs/ble/bindings/mock.js +3 -6
  9. package/lib/cjs/ble/bindings/types.js +2 -5
  10. package/lib/cjs/direct-connect/base/interface.js +4 -6
  11. package/lib/cjs/direct-connect/base/peripheral.js +17 -3
  12. package/lib/cjs/serial/base/serial-interface.js +9 -9
  13. package/lib/cjs/serial/base/serial-provider.js +113 -0
  14. package/lib/cjs/serial/daum/DaumAdapter.js +3 -3
  15. package/lib/cjs/serial/daum/classic/mock.js +2 -2
  16. package/lib/cjs/serial/index.js +3 -3
  17. package/lib/cjs/serial/kettler/comms.js +2 -5
  18. package/lib/cjs/utils/task.js +2 -5
  19. package/lib/esm/antv2/base/adapter.js +12 -6
  20. package/lib/esm/antv2/base/interface.js +2 -2
  21. package/lib/esm/base/adpater.js +1 -1
  22. package/lib/esm/ble/base/interface.js +66 -31
  23. package/lib/esm/ble/base/peripheral.js +14 -7
  24. package/lib/esm/ble/base/sensor.js +11 -4
  25. package/lib/esm/ble/bindings/linux.js +1 -1
  26. package/lib/esm/ble/bindings/mock.js +1 -1
  27. package/lib/esm/ble/bindings/types.js +1 -1
  28. package/lib/esm/direct-connect/base/interface.js +2 -1
  29. package/lib/esm/direct-connect/base/peripheral.js +16 -2
  30. package/lib/esm/serial/base/serial-interface.js +2 -2
  31. package/lib/esm/serial/base/serial-provider.js +75 -0
  32. package/lib/esm/serial/base/serialport.js +0 -2
  33. package/lib/esm/serial/daum/DaumAdapter.js +1 -1
  34. package/lib/esm/serial/daum/classic/mock.js +1 -1
  35. package/lib/esm/serial/index.js +1 -1
  36. package/lib/esm/serial/kettler/comms.js +1 -1
  37. package/lib/esm/utils/task.js +1 -1
  38. package/lib/types/antv2/base/adapter.d.ts +2 -2
  39. package/lib/types/antv2/base/binding.d.ts +1 -1
  40. package/lib/types/antv2/base/interface.d.ts +2 -2
  41. package/lib/types/antv2/types.d.ts +1 -1
  42. package/lib/types/base/adpater.d.ts +1 -1
  43. package/lib/types/ble/base/interface.d.ts +4 -2
  44. package/lib/types/ble/bindings/linux.d.ts +1 -1
  45. package/lib/types/ble/bindings/types.d.ts +1 -1
  46. package/lib/types/ble/types.d.ts +1 -1
  47. package/lib/types/direct-connect/base/interface.d.ts +1 -1
  48. package/lib/types/direct-connect/base/peripheral.d.ts +2 -1
  49. package/lib/types/direct-connect/bindings/types.d.ts +1 -1
  50. package/lib/types/serial/base/serial-interface.d.ts +1 -1
  51. package/lib/types/serial/base/serial-provider.d.ts +16 -0
  52. package/lib/types/serial/daum/DaumAdapter.d.ts +1 -1
  53. package/lib/types/serial/index.d.ts +1 -1
  54. package/lib/types/serial/kettler/comms.d.ts +1 -1
  55. package/lib/types/types/adapter.d.ts +1 -1
  56. package/lib/types/types/interface.d.ts +1 -1
  57. package/lib/types/utils/task.d.ts +1 -1
  58. 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;
@@ -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,7 @@ class BleInterface extends node_events_1.default {
39
36
  emitted = [];
40
37
  confirmedBleState;
41
38
  currentBleState;
39
+ stateChangeEventHandler = null;
42
40
  static getInstance(props = {}) {
43
41
  if (BleInterface._instance === undefined)
44
42
  BleInterface._instance = new BleInterface(props);
@@ -66,7 +64,7 @@ class BleInterface extends node_events_1.default {
66
64
  if (binding) {
67
65
  this.setBinding(binding);
68
66
  }
69
- this.internalEvents = new node_events_1.default();
67
+ this.internalEvents = new node_events_1.EventEmitter();
70
68
  this.onDiscovered = this.onPeripheralFound.bind(this);
71
69
  const { enabled = true } = props;
72
70
  if (this.binding && enabled)
@@ -94,10 +92,16 @@ class BleInterface extends node_events_1.default {
94
92
  getBinding() {
95
93
  return this.binding;
96
94
  }
97
- autoConnect() {
98
- this.connect();
95
+ async autoConnect() {
96
+ await this.connect();
99
97
  }
100
98
  async connect(reconnect) {
99
+ if (this.isConnected())
100
+ return true;
101
+ if (!this.stateChangeEventHandler) {
102
+ this.stateChangeEventHandler = this.onBleStateChange.bind(this);
103
+ this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
104
+ }
101
105
  if (!this.getBinding()) {
102
106
  this.logEvent({ message: 'BLE not available' });
103
107
  return false;
@@ -106,8 +110,6 @@ class BleInterface extends node_events_1.default {
106
110
  this.logEvent({ message: 'BLE connect - already connecting' });
107
111
  return this.connectTask.getPromise();
108
112
  }
109
- if (this.isConnected())
110
- return true;
111
113
  this.logEvent({ message: 'BLE connect request' });
112
114
  this.connectTask = new task_js_1.InteruptableTask(this.connectBle(), {
113
115
  timeout: this.getConnectTimeout(),
@@ -116,6 +118,9 @@ class BleInterface extends node_events_1.default {
116
118
  log: this.logEvent.bind(this),
117
119
  });
118
120
  const success = await this.connectTask.run().catch(() => false);
121
+ this.removeAllListeners('ble-state-change');
122
+ if (success)
123
+ this.emit('connected');
119
124
  return success;
120
125
  }
121
126
  async disconnect(connectionLost) {
@@ -126,7 +131,7 @@ class BleInterface extends node_events_1.default {
126
131
  this.confirmedBleState = 'poweredOff';
127
132
  return false;
128
133
  }
129
- this.getBinding().removeAllListeners('error');
134
+ this.getBinding()?.removeAllListeners('error');
130
135
  if (!this.isConnected() && !connectionLost) {
131
136
  this.confirmedBleState = 'poweredOff';
132
137
  return true;
@@ -144,9 +149,16 @@ class BleInterface extends node_events_1.default {
144
149
  if (this.isConnecting())
145
150
  await this.connectTask?.stop();
146
151
  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));
152
+ if (connectionLost) {
153
+ this.getBinding()?.removeAllListeners('stateChange');
154
+ this.stateChangeEventHandler = this.stateChangeEventHandler ?? this.onBleStateChange.bind(this);
155
+ this.getBinding()?.on('stateChange', this.stateChangeEventHandler);
156
+ }
157
+ else {
158
+ this.getBinding()?.removeAllListeners('stateChange');
159
+ this.stateChangeEventHandler = null;
160
+ }
161
+ this.getBinding()?.on('error', this.onError.bind(this));
150
162
  this.logEvent({ message: 'interface disconnected', interface: 'BLE' });
151
163
  this.confirmedBleState = 'poweredOff';
152
164
  return true;
@@ -156,7 +168,7 @@ class BleInterface extends node_events_1.default {
156
168
  }
157
169
  this.disconnectTask = new task_js_1.InteruptableTask(performDisconnect(), {
158
170
  timeout: this.getConnectTimeout(),
159
- name: 'BLE connect',
171
+ name: 'BLE disconnect',
160
172
  errorOnTimeout: false,
161
173
  log: this.logEvent.bind(this),
162
174
  });
@@ -225,13 +237,13 @@ class BleInterface extends node_events_1.default {
225
237
  this.logEvent({ message: 'pausing logging' });
226
238
  this.logDisabled = true;
227
239
  try {
228
- this.getBinding().pauseLogging();
240
+ this.getBinding()?.pauseLogging();
229
241
  }
230
242
  catch { }
231
243
  }
232
244
  resumeLogging() {
233
245
  try {
234
- this.getBinding().resumeLogging();
246
+ this.getBinding()?.resumeLogging();
235
247
  }
236
248
  catch { }
237
249
  this.logDisabled = false;
@@ -568,27 +580,37 @@ class BleInterface extends node_events_1.default {
568
580
  addKnownDevice(_settings) {
569
581
  }
570
582
  async connectBle() {
571
- this.currentBleState = this.getBinding().state;
583
+ this.currentBleState = this.getBinding()?.state;
572
584
  if (this.currentBleState === 'poweredOn') {
573
585
  this.onConnected();
574
586
  return true;
575
587
  }
588
+ else if (this.currentBleState === 'unauthorized' || this.currentBleState === 'unsupported') {
589
+ return false;
590
+ }
576
591
  const res = await this.waitForBleConnected();
577
592
  return res;
578
593
  }
579
594
  waitForBleConnected() {
580
595
  return new Promise((done) => {
581
- this.getBinding().once('error', (err) => {
596
+ this.getBinding()?.once('error', (err) => {
582
597
  this.logEvent({ message: 'Ble connect result: error', error: err.message });
583
598
  return done(false);
584
599
  });
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);
600
+ this.on('ble-state-change', (state) => {
601
+ try {
602
+ if (state === 'poweredOn') {
603
+ this.onConnected();
604
+ this.removeAllListeners('ble-state-change');
605
+ return done(true);
606
+ }
607
+ if (state === 'unauthorized') {
608
+ this.removeAllListeners('ble-state-change');
609
+ return done(false);
610
+ }
611
+ }
612
+ catch (err) {
613
+ console.log('# BLE waitForBleConnected error', err);
592
614
  }
593
615
  });
594
616
  });
@@ -599,13 +621,16 @@ class BleInterface extends node_events_1.default {
599
621
  async onConnected() {
600
622
  if (this.isConnected())
601
623
  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();
624
+ try {
625
+ this.confirmedBleState = 'poweredOn';
626
+ this.getBinding()?.removeAllListeners('error');
627
+ this.getBinding()?.on('error', this.onError.bind(this));
628
+ this.logEvent({ message: 'BLE connected' });
629
+ this.startPeripheralScan();
630
+ }
631
+ catch (err) {
632
+ console.log('# BLE onConnected error', err);
633
+ }
609
634
  }
610
635
  async onDisconnected() {
611
636
  if (this.isDisconnecting() || !this.isConnected())
@@ -616,15 +641,22 @@ class BleInterface extends node_events_1.default {
616
641
  async onBleStateChange(state) {
617
642
  if (state === this.currentBleState)
618
643
  return;
644
+ this.logEvent({ message: 'BLE state change', state });
619
645
  this.currentBleState = state;
620
- if (state === 'poweredOff') {
621
- this.onDisconnected();
646
+ if (this.isConnecting()) {
647
+ this.emit('ble-state-change', state);
648
+ return;
649
+ }
650
+ if (state === 'poweredOff' || state === 'unauthorized') {
651
+ if (this.isConnected()) {
652
+ this.onDisconnected();
653
+ }
622
654
  }
623
655
  else {
624
656
  if (this.isDisconnecting()) {
625
657
  await this.disconnectTask.getPromise();
626
658
  }
627
- this.onConnected();
659
+ this.connect();
628
660
  }
629
661
  }
630
662
  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() {
@@ -7,9 +7,10 @@ exports.DirectConnectPeripheral = void 0;
7
7
  const task_js_1 = require("../../utils/task.js");
8
8
  const interface_js_1 = __importDefault(require("./interface.js"));
9
9
  const index_js_1 = require("../messages/index.js");
10
- const node_events_1 = __importDefault(require("node:events"));
10
+ const node_events_1 = require("node:events");
11
11
  const consts_js_1 = require("../consts.js");
12
12
  const utils_js_1 = require("../../ble/utils.js");
13
+ let IDS = 0;
13
14
  class DirectConnectPeripheral {
14
15
  announcement;
15
16
  static instances = {};
@@ -28,12 +29,14 @@ class DirectConnectPeripheral {
28
29
  onPortCloseHandler = this.onPortClose.bind(this);
29
30
  partialBuffer = null;
30
31
  remainingBuffer = null;
31
- eventEmitter = new node_events_1.default();
32
+ eventEmitter = new node_events_1.EventEmitter();
32
33
  subscribed = [];
33
34
  onDisconnectHandler;
34
35
  discoveredServiceUUIds;
36
+ id;
35
37
  constructor(announcement) {
36
38
  this.announcement = announcement;
39
+ this.id = ++IDS;
37
40
  }
38
41
  getInfo() {
39
42
  return {
@@ -57,6 +60,10 @@ class DirectConnectPeripheral {
57
60
  return true;
58
61
  if (this.isConnecting())
59
62
  await this.connectTask.getPromise();
63
+ const keys = Object.keys(DirectConnectPeripheral.instances);
64
+ const instances = [];
65
+ for (const key of keys)
66
+ instances.push(DirectConnectPeripheral.instances[key]);
60
67
  this.connectTask = new task_js_1.InteruptableTask(this.startConnection(), {
61
68
  timeout: 1000,
62
69
  });
@@ -378,6 +385,8 @@ class DirectConnectPeripheral {
378
385
  this.logEvent({ message: 'port error', path: this.getPath(), reason: err.message });
379
386
  }
380
387
  async onPortClose() {
388
+ if (this.isConnecting())
389
+ return;
381
390
  this.socket.removeAllListeners();
382
391
  this.socket.on('error', () => { });
383
392
  this.logEvent({ message: 'port closed', path: this.getPath() });
@@ -395,8 +404,12 @@ class DirectConnectPeripheral {
395
404
  }
396
405
  async stopConnection(connectionLost = false) {
397
406
  this.eventEmitter.removeAllListeners();
398
- if (!this.isConnected())
407
+ if (!this.isConnected()) {
408
+ this.socket.removeAllListeners();
409
+ this.socket.destroy();
410
+ delete this.socket;
399
411
  return true;
412
+ }
400
413
  await this.unsubscribeAll(connectionLost);
401
414
  this.socket.removeAllListeners();
402
415
  return new Promise(done => {
@@ -422,6 +435,7 @@ class DirectConnectPeripheral {
422
435
  return this.msgSeqNo;
423
436
  }
424
437
  async send(seqNo, data) {
438
+ await this.connect();
425
439
  this.socket.write(data);
426
440
  return new Promise(done => {
427
441
  this.eventEmitter.once(`response-${seqNo}`, (response) => {
@@ -3,15 +3,15 @@ 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"));
7
- const serialport_js_1 = __importDefault(require("./serialport.js"));
6
+ const node_events_1 = require("node:events");
7
+ const serial_provider_js_1 = __importDefault(require("./serial-provider.js"));
8
8
  const gd_eventlog_1 = require("gd-eventlog");
9
9
  const utils_js_1 = require("../../utils/utils.js");
10
10
  const adapter_factory_js_1 = __importDefault(require("../factories/adapter-factory.js"));
11
11
  const serial_scanner_js_1 = require("./serial-scanner.js");
12
12
  const DEFAULT_SCAN_TIMEOUT = 10000;
13
13
  const MAX_PARALLEL_SCANS = 5;
14
- class SerialInterface extends node_events_1.default {
14
+ class SerialInterface extends node_events_1.EventEmitter {
15
15
  ifaceName;
16
16
  binding;
17
17
  ports;
@@ -30,7 +30,7 @@ class SerialInterface extends node_events_1.default {
30
30
  if (binding)
31
31
  instance = new SerialInterface(props);
32
32
  else {
33
- instance = new SerialInterface({ ifaceName, binding: serialport_js_1.default.getInstance().getBinding(ifaceName), logger });
33
+ instance = new SerialInterface({ ifaceName, binding: serial_provider_js_1.default.getInstance().getBinding(ifaceName), logger });
34
34
  if (instance)
35
35
  SerialInterface._instances.push(instance);
36
36
  }
@@ -53,7 +53,7 @@ class SerialInterface extends node_events_1.default {
53
53
  this.inUse = [];
54
54
  this.isScanning = false;
55
55
  this.isStopScanRequested = false;
56
- this.scanEvents = new node_events_1.default();
56
+ this.scanEvents = new node_events_1.EventEmitter();
57
57
  this.scanEvents.setMaxListeners(100);
58
58
  this.logger = props.logger || new gd_eventlog_1.EventLogger(`Serial:${ifaceName}`);
59
59
  this.connected = false;
@@ -74,7 +74,7 @@ class SerialInterface extends node_events_1.default {
74
74
  }
75
75
  setBinding(binding) {
76
76
  this.binding = binding;
77
- serialport_js_1.default.getInstance().setBinding(this.ifaceName, binding);
77
+ serial_provider_js_1.default.getInstance().setBinding(this.ifaceName, binding);
78
78
  }
79
79
  getName() {
80
80
  return this.ifaceName;
@@ -96,7 +96,7 @@ class SerialInterface extends node_events_1.default {
96
96
  }
97
97
  async connect() {
98
98
  this.logEvent({ message: 'connecting', interface: this.ifaceName });
99
- const binding = serialport_js_1.default.getInstance().getBinding(this.ifaceName);
99
+ const binding = serial_provider_js_1.default.getInstance().getBinding(this.ifaceName);
100
100
  if (!binding || !this.binding) {
101
101
  this.connected = false;
102
102
  this.logEvent({ message: 'connecting error', interface: this.ifaceName, reason: 'no binfing found' });
@@ -131,7 +131,7 @@ class SerialInterface extends node_events_1.default {
131
131
  this.ports.splice(existing, 1);
132
132
  }
133
133
  }
134
- const port = serialport_js_1.default.getInstance().getSerialPort(this.ifaceName, { path });
134
+ const port = serial_provider_js_1.default.getInstance().getSerialPort(this.ifaceName, { path });
135
135
  if (!port) {
136
136
  this.logEvent({ message: 'opening port - port does not exist', port: path });
137
137
  return null;
@@ -181,7 +181,7 @@ class SerialInterface extends node_events_1.default {
181
181
  return [];
182
182
  if (!this.isConnected())
183
183
  await this.connect();
184
- const binding = serialport_js_1.default.getInstance().getBinding(this.ifaceName);
184
+ const binding = serial_provider_js_1.default.getInstance().getBinding(this.ifaceName);
185
185
  if (!binding || !this.binding)
186
186
  return [];
187
187
  const { port, timeout = DEFAULT_SCAN_TIMEOUT } = props;