@onekeyfe/hd-transport-electron 1.2.8-alpha.1 → 1.2.8-alpha.3
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.
- package/dist/{index-e2e3d2ba.js → index-98d6f724.js} +2 -2
- package/dist/index.js +1 -1
- package/dist/{noble-ble-handler-d0991fa0.js → noble-ble-handler-688faeb6.js} +9 -28
- package/dist/noble-ble-handler.d.ts.map +1 -1
- package/package.json +5 -5
- package/src/__tests__/noble-ble-handler.test.ts +38 -104
- package/src/noble-ble-handler.ts +7 -31
|
@@ -55,13 +55,13 @@ function invokeNobleBleIpc(request) {
|
|
|
55
55
|
|
|
56
56
|
function initNobleBleSupport(webContents) {
|
|
57
57
|
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
-
const { setupNobleBleHandlers } = yield Promise.resolve().then(function () { return require('./noble-ble-handler-
|
|
58
|
+
const { setupNobleBleHandlers } = yield Promise.resolve().then(function () { return require('./noble-ble-handler-688faeb6.js'); });
|
|
59
59
|
setupNobleBleHandlers(webContents);
|
|
60
60
|
});
|
|
61
61
|
}
|
|
62
62
|
function disposeNobleBleSupport(releaseNoble) {
|
|
63
63
|
return __awaiter(this, void 0, void 0, function* () {
|
|
64
|
-
const handler = yield Promise.resolve().then(function () { return require('./noble-ble-handler-
|
|
64
|
+
const handler = yield Promise.resolve().then(function () { return require('./noble-ble-handler-688faeb6.js'); });
|
|
65
65
|
yield handler.disposeNobleBleSupport(releaseNoble);
|
|
66
66
|
});
|
|
67
67
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var index = require('./index-
|
|
3
|
+
var index = require('./index-98d6f724.js');
|
|
4
4
|
var hdShared = require('@onekeyfe/hd-shared');
|
|
5
5
|
var pRetry = require('p-retry');
|
|
6
6
|
|
|
@@ -123,13 +123,6 @@ function assertBleActive() {
|
|
|
123
123
|
}
|
|
124
124
|
function createNobleBleConnectionError(error, messagePrefix = '') {
|
|
125
125
|
const errorMessage = error.message;
|
|
126
|
-
const isInvalidMacOsBond = error.nativeErrorCode === 14 && error.nativeErrorDomain === 'CBErrorDomain';
|
|
127
|
-
if (isInvalidMacOsBond) {
|
|
128
|
-
const nativeErrorMessage = `${messagePrefix}${errorMessage}`;
|
|
129
|
-
return hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.BleBondInvalid, `${hdShared.HardwareErrorCodeMessage[hdShared.HardwareErrorCode.BleBondInvalid]} (${nativeErrorMessage})`, {
|
|
130
|
-
nativeErrorMessage,
|
|
131
|
-
});
|
|
132
|
-
}
|
|
133
126
|
return hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.BleConnectedError, `${messagePrefix}${errorMessage}`);
|
|
134
127
|
}
|
|
135
128
|
function createNobleBleIpcErrorResponse(error) {
|
|
@@ -425,7 +418,7 @@ function initializeNoble() {
|
|
|
425
418
|
}
|
|
426
419
|
else if (state === 'unauthorized') {
|
|
427
420
|
cleanup();
|
|
428
|
-
reject(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.
|
|
421
|
+
reject(hdShared.ERRORS.TypedError(hdShared.HardwareErrorCode.BleLocationError));
|
|
429
422
|
}
|
|
430
423
|
};
|
|
431
424
|
const cancel = () => {
|
|
@@ -434,6 +427,7 @@ function initializeNoble() {
|
|
|
434
427
|
};
|
|
435
428
|
pendingCancellations.add(cancel);
|
|
436
429
|
noble.on('stateChange', onStateChange);
|
|
430
|
+
onStateChange(noble.state);
|
|
437
431
|
});
|
|
438
432
|
assertBleActive();
|
|
439
433
|
if (!persistentDiscoverListener) {
|
|
@@ -446,7 +440,7 @@ function initializeNoble() {
|
|
|
446
440
|
}
|
|
447
441
|
catch (error) {
|
|
448
442
|
logger === null || logger === void 0 ? void 0 : logger.error('[NobleBLE] Failed to initialize Noble:', error);
|
|
449
|
-
bluetoothState.unsupported =
|
|
443
|
+
bluetoothState.unsupported = (noble === null || noble === void 0 ? void 0 : noble.state) === 'unsupported';
|
|
450
444
|
bluetoothState.initialized = true;
|
|
451
445
|
throw error;
|
|
452
446
|
}
|
|
@@ -1176,8 +1170,7 @@ function setupConnectionAndDiscoverServices(peripheral, deviceId, webContents) {
|
|
|
1176
1170
|
yield forceReconnectPeripheral(peripheral, deviceId);
|
|
1177
1171
|
}
|
|
1178
1172
|
catch (resetError) {
|
|
1179
|
-
if (
|
|
1180
|
-
(resetError === null || resetError === void 0 ? void 0 : resetError.errorCode) === hdShared.HardwareErrorCode.BleDeviceDisconnected) {
|
|
1173
|
+
if ((resetError === null || resetError === void 0 ? void 0 : resetError.errorCode) === hdShared.HardwareErrorCode.BleDeviceDisconnected) {
|
|
1181
1174
|
throw resetError;
|
|
1182
1175
|
}
|
|
1183
1176
|
logger === null || logger === void 0 ? void 0 : logger.error('[NobleBLE] Connection reset before discovery failed, continuing', resetError);
|
|
@@ -1313,29 +1306,17 @@ function connectDevice(deviceId, webContents) {
|
|
|
1313
1306
|
return undefined;
|
|
1314
1307
|
}
|
|
1315
1308
|
});
|
|
1316
|
-
let staleBondError;
|
|
1317
1309
|
const connectById = () => index.__awaiter(this, void 0, void 0, function* () {
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
discoveredDevices.set(deviceId, found);
|
|
1322
|
-
}
|
|
1323
|
-
return found;
|
|
1324
|
-
}
|
|
1325
|
-
catch (error) {
|
|
1326
|
-
if (error.errorCode !== hdShared.HardwareErrorCode.BleBondInvalid) {
|
|
1327
|
-
throw error;
|
|
1328
|
-
}
|
|
1329
|
-
staleBondError = error;
|
|
1330
|
-
return undefined;
|
|
1310
|
+
const found = yield tryDirectConnectById(deviceId);
|
|
1311
|
+
if (found) {
|
|
1312
|
+
discoveredDevices.set(deviceId, found);
|
|
1331
1313
|
}
|
|
1314
|
+
return found;
|
|
1332
1315
|
});
|
|
1333
1316
|
peripheral = byIdFirst ? yield connectById() : yield scanForPeripheral();
|
|
1334
1317
|
if (!peripheral) {
|
|
1335
1318
|
peripheral = byIdFirst ? yield scanForPeripheral() : yield connectById();
|
|
1336
1319
|
}
|
|
1337
|
-
if (!peripheral && staleBondError)
|
|
1338
|
-
throw staleBondError;
|
|
1339
1320
|
}
|
|
1340
1321
|
assertBleActive();
|
|
1341
1322
|
if (!peripheral) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"noble-ble-handler.d.ts","sourceRoot":"","sources":["../src/noble-ble-handler.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"noble-ble-handler.d.ts","sourceRoot":"","sources":["../src/noble-ble-handler.ts"],"names":[],"mappings":"AAiCA,OAAO,KAAK,EAA+B,WAAW,EAAE,MAAM,UAAU,CAAC;AAEzE,OAAO,KAAK,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAiC1F,KAAK,mBAAmB,GAAG,KAAK,GAAG;IACjC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAEF,wBAAgB,6BAA6B,CAAC,KAAK,EAAE,mBAAmB,EAAE,aAAa,SAAK,+CAG3F;AAED,wBAAgB,8BAA8B,CAAC,KAAK,EAAE,OAAO,GAAG,wBAAwB,CAgCvF;AA+KD,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE,oBAAoB,UAI7E;AAizDD,wBAAgB,qBAAqB,CAAC,WAAW,EAAE,WAAW,GAAG,IAAI,CAkOpE;AAOD,wBAAgB,sBAAsB,CACpC,YAAY,GAAE,CAAC,QAAQ,EAAE;IAAE,IAAI,IAAI,IAAI,CAAA;CAAE,KAAK,IAAkC,GAC/E,OAAO,CAAC,IAAI,CAAC,CAiEf"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@onekeyfe/hd-transport-electron",
|
|
3
|
-
"version": "1.2.8-alpha.
|
|
3
|
+
"version": "1.2.8-alpha.3",
|
|
4
4
|
"author": "OneKey",
|
|
5
5
|
"homepage": "https://github.com/OneKeyHQ/hardware-js-sdk#readme",
|
|
6
6
|
"license": "MIT",
|
|
@@ -25,9 +25,9 @@
|
|
|
25
25
|
"electron-log": ">=4.0.0"
|
|
26
26
|
},
|
|
27
27
|
"dependencies": {
|
|
28
|
-
"@onekeyfe/hd-core": "1.2.8-alpha.
|
|
29
|
-
"@onekeyfe/hd-shared": "1.2.8-alpha.
|
|
30
|
-
"@onekeyfe/hd-transport": "1.2.8-alpha.
|
|
28
|
+
"@onekeyfe/hd-core": "1.2.8-alpha.3",
|
|
29
|
+
"@onekeyfe/hd-shared": "1.2.8-alpha.3",
|
|
30
|
+
"@onekeyfe/hd-transport": "1.2.8-alpha.3",
|
|
31
31
|
"@stoprocent/noble": "2.3.16",
|
|
32
32
|
"p-retry": "^4.6.2"
|
|
33
33
|
},
|
|
@@ -36,5 +36,5 @@
|
|
|
36
36
|
"electron": "^25.0.0",
|
|
37
37
|
"typescript": "^5.3.3"
|
|
38
38
|
},
|
|
39
|
-
"gitHead": "
|
|
39
|
+
"gitHead": "18c57239359413a079fffa730b36149c8516aa85"
|
|
40
40
|
}
|
|
@@ -31,22 +31,17 @@ describe('Electron Noble BLE device discovery', () => {
|
|
|
31
31
|
expect(NOBLE_BLE_SUBSCRIBE_TIMEOUT_MS).toBe(10_000);
|
|
32
32
|
});
|
|
33
33
|
|
|
34
|
-
test('maps
|
|
34
|
+
test('maps native macOS connection failures to the generic connection error', async () => {
|
|
35
35
|
const { createNobleBleConnectionError } = await import('../noble-ble-handler');
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
params: {
|
|
46
|
-
nativeErrorMessage: 'Peer removed pairing information on the device side',
|
|
47
|
-
},
|
|
48
|
-
});
|
|
49
|
-
expect(staleBondError.message).toContain('Peer removed pairing information on the device side');
|
|
37
|
+
expect(
|
|
38
|
+
createNobleBleConnectionError(
|
|
39
|
+
Object.assign(new Error('Peer removed pairing information on the device side'), {
|
|
40
|
+
nativeErrorCode: 14,
|
|
41
|
+
nativeErrorDomain: 'CBErrorDomain',
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
).toMatchObject({ errorCode: HardwareErrorCode.BleConnectedError });
|
|
50
45
|
expect(createNobleBleConnectionError(new Error('Encryption is insufficient'))).toMatchObject({
|
|
51
46
|
errorCode: HardwareErrorCode.BleConnectedError,
|
|
52
47
|
});
|
|
@@ -81,18 +76,16 @@ describe('Electron Noble BLE device discovery', () => {
|
|
|
81
76
|
expect(
|
|
82
77
|
createNobleBleIpcErrorResponse({
|
|
83
78
|
name: 'HardwareError',
|
|
84
|
-
message: 'Bluetooth
|
|
85
|
-
errorCode: HardwareErrorCode.
|
|
86
|
-
params: { nativeErrorMessage: 'native message' },
|
|
79
|
+
message: 'Bluetooth connection failed',
|
|
80
|
+
errorCode: HardwareErrorCode.BleConnectedError,
|
|
87
81
|
})
|
|
88
82
|
).toEqual({
|
|
89
83
|
type: 'NobleBleIpcError',
|
|
90
84
|
success: false,
|
|
91
85
|
error: {
|
|
92
86
|
name: 'HardwareError',
|
|
93
|
-
message: 'Bluetooth
|
|
94
|
-
errorCode: HardwareErrorCode.
|
|
95
|
-
params: { nativeErrorMessage: 'native message' },
|
|
87
|
+
message: 'Bluetooth connection failed',
|
|
88
|
+
errorCode: HardwareErrorCode.BleConnectedError,
|
|
96
89
|
},
|
|
97
90
|
});
|
|
98
91
|
|
|
@@ -135,14 +128,14 @@ describe('Electron Noble BLE device discovery', () => {
|
|
|
135
128
|
success: false as const,
|
|
136
129
|
error: {
|
|
137
130
|
name: 'HardwareError',
|
|
138
|
-
message: 'Bluetooth
|
|
139
|
-
errorCode: HardwareErrorCode.
|
|
131
|
+
message: 'Bluetooth connection failed',
|
|
132
|
+
errorCode: HardwareErrorCode.BleConnectedError,
|
|
140
133
|
},
|
|
141
134
|
})
|
|
142
135
|
)
|
|
143
136
|
).rejects.toMatchObject({
|
|
144
137
|
name: 'HardwareError',
|
|
145
|
-
errorCode: HardwareErrorCode.
|
|
138
|
+
errorCode: HardwareErrorCode.BleConnectedError,
|
|
146
139
|
});
|
|
147
140
|
|
|
148
141
|
await expect(invokeNobleBleIpc(Promise.resolve('connected'))).resolves.toBe('connected');
|
|
@@ -352,87 +345,6 @@ describe('Electron Noble BLE device discovery', () => {
|
|
|
352
345
|
}
|
|
353
346
|
);
|
|
354
347
|
|
|
355
|
-
test.each([
|
|
356
|
-
{ rediscovered: false, expectedCode: HardwareErrorCode.BleBondInvalid },
|
|
357
|
-
{ rediscovered: true, expectedCode: HardwareErrorCode.BleConnectedError },
|
|
358
|
-
])(
|
|
359
|
-
'reports a macOS stale bond only when fallback scan misses (rediscovered=$rediscovered)',
|
|
360
|
-
async ({ rediscovered, expectedCode }) => {
|
|
361
|
-
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
362
|
-
const handlers = new Map<string, IpcHandler>();
|
|
363
|
-
const stalePeripheral = createPeripheral('device', 'Pro2 A1B2');
|
|
364
|
-
const freshPeripheral = Object.assign(
|
|
365
|
-
new EventEmitter(),
|
|
366
|
-
createPeripheral('device', 'Pro2 A1B2'),
|
|
367
|
-
{
|
|
368
|
-
connect: jest.fn((callback: (error?: Error) => void) => {
|
|
369
|
-
callback(new Error('fresh connection failed'));
|
|
370
|
-
}),
|
|
371
|
-
}
|
|
372
|
-
);
|
|
373
|
-
const staleBondError = Object.assign(new Error('Peer removed pairing information'), {
|
|
374
|
-
nativeErrorCode: 14,
|
|
375
|
-
nativeErrorDomain: 'CBErrorDomain',
|
|
376
|
-
});
|
|
377
|
-
let scanStarted: (() => void) | undefined;
|
|
378
|
-
const scanning = new Promise<void>(resolve => {
|
|
379
|
-
scanStarted = resolve;
|
|
380
|
-
});
|
|
381
|
-
const noble = Object.assign(new EventEmitter(), {
|
|
382
|
-
state: 'poweredOn',
|
|
383
|
-
startScanning: jest.fn((_services, _duplicates, callback) => {
|
|
384
|
-
callback?.();
|
|
385
|
-
if (rediscovered) noble.emit('discover', freshPeripheral);
|
|
386
|
-
scanStarted?.();
|
|
387
|
-
}),
|
|
388
|
-
stopScanning: jest.fn(callback => callback?.()),
|
|
389
|
-
connectAsync: jest.fn(() => Promise.reject(staleBondError)),
|
|
390
|
-
});
|
|
391
|
-
jest.doMock('@stoprocent/noble', () => noble);
|
|
392
|
-
jest.doMock('electron', () => ({
|
|
393
|
-
ipcMain: {
|
|
394
|
-
handle: (channel: string, handler: IpcHandler) => handlers.set(channel, handler),
|
|
395
|
-
removeHandler: (channel: string) => handlers.delete(channel),
|
|
396
|
-
},
|
|
397
|
-
}));
|
|
398
|
-
jest.doMock('electron-log', () => ({
|
|
399
|
-
info: jest.fn(),
|
|
400
|
-
debug: jest.fn(),
|
|
401
|
-
error: jest.fn(),
|
|
402
|
-
}));
|
|
403
|
-
const { setupNobleBleHandlers } = await import('../noble-ble-handler');
|
|
404
|
-
setupNobleBleHandlers({ on: jest.fn(), send: jest.fn() } as unknown as WebContents);
|
|
405
|
-
const availability = handlers.get(EOneKeyBleMessageKeys.BLE_AVAILABILITY_CHECK);
|
|
406
|
-
const connect = handlers.get(EOneKeyBleMessageKeys.NOBLE_BLE_CONNECT);
|
|
407
|
-
if (!availability || !connect) throw new Error('Noble handlers were not registered');
|
|
408
|
-
await availability();
|
|
409
|
-
noble.emit('discover', stalePeripheral);
|
|
410
|
-
|
|
411
|
-
const connecting = Promise.resolve(connect(undefined, stalePeripheral.id));
|
|
412
|
-
await scanning;
|
|
413
|
-
jest.advanceTimersByTime(1500);
|
|
414
|
-
await expect(connecting).resolves.toMatchObject({
|
|
415
|
-
success: false,
|
|
416
|
-
error: { errorCode: expectedCode },
|
|
417
|
-
});
|
|
418
|
-
if (!rediscovered) {
|
|
419
|
-
const secondScan = new Promise<void>(resolve => {
|
|
420
|
-
scanStarted = resolve;
|
|
421
|
-
});
|
|
422
|
-
const retry = Promise.resolve(connect(undefined, stalePeripheral.id));
|
|
423
|
-
await secondScan;
|
|
424
|
-
jest.advanceTimersByTime(1500);
|
|
425
|
-
await expect(retry).resolves.toMatchObject({
|
|
426
|
-
success: false,
|
|
427
|
-
error: { errorCode: HardwareErrorCode.BleBondInvalid },
|
|
428
|
-
});
|
|
429
|
-
}
|
|
430
|
-
expect(noble.connectAsync).toHaveBeenCalledTimes(rediscovered ? 1 : 2);
|
|
431
|
-
expect(noble.startScanning).toHaveBeenCalledTimes(rediscovered ? 1 : 2);
|
|
432
|
-
expect(freshPeripheral.connect).toHaveBeenCalledTimes(rediscovered ? 1 : 0);
|
|
433
|
-
}
|
|
434
|
-
);
|
|
435
|
-
|
|
436
348
|
test('waits for a targeted scan to stop before connecting', async () => {
|
|
437
349
|
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
438
350
|
|
|
@@ -1006,6 +918,28 @@ describe('Noble BLE process shutdown', () => {
|
|
|
1006
918
|
expect(handlers.size).toBe(0);
|
|
1007
919
|
});
|
|
1008
920
|
|
|
921
|
+
test.each([
|
|
922
|
+
['poweredOff', HardwareErrorCode.BlePoweredOff],
|
|
923
|
+
['unauthorized', HardwareErrorCode.BleLocationError],
|
|
924
|
+
['unsupported', HardwareErrorCode.BleUnsupported],
|
|
925
|
+
])(
|
|
926
|
+
'classifies the initial adapter state %s without waiting for another event',
|
|
927
|
+
async (state, errorCode) => {
|
|
928
|
+
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
929
|
+
const { sdk, native, handlers } = await setup(state);
|
|
930
|
+
await expect(
|
|
931
|
+
handlers.get(EOneKeyBleMessageKeys.NOBLE_BLE_ENUMERATE)?.({})
|
|
932
|
+
).resolves.toMatchObject({
|
|
933
|
+
success: false,
|
|
934
|
+
error: { errorCode },
|
|
935
|
+
});
|
|
936
|
+
expect(native.startScanning).not.toHaveBeenCalled();
|
|
937
|
+
expect(native.listenerCount('stateChange')).toBe(1);
|
|
938
|
+
expect(jest.getTimerCount()).toBe(0);
|
|
939
|
+
await sdk.disposeNobleBleSupport();
|
|
940
|
+
}
|
|
941
|
+
);
|
|
942
|
+
|
|
1009
943
|
test('cancels an active scan, ignores its late callback and releases native once', async () => {
|
|
1010
944
|
jest.useFakeTimers({ doNotFake: ['performance'] });
|
|
1011
945
|
const { sdk, native, handlers } = await setup();
|
package/src/noble-ble-handler.ts
CHANGED
|
@@ -16,7 +16,6 @@ import {
|
|
|
16
16
|
ONEKEY_WRITE_CHARACTERISTIC_UUID,
|
|
17
17
|
createKnownBleUuidAliases,
|
|
18
18
|
hasOnekeyCommunicationService,
|
|
19
|
-
isBleStaleBondHardwareError,
|
|
20
19
|
isOnekeyBluetoothDevice,
|
|
21
20
|
isPro2FamilyBleName,
|
|
22
21
|
matchesKnownBleUuid,
|
|
@@ -74,19 +73,6 @@ type NobleBleNativeError = Error & {
|
|
|
74
73
|
|
|
75
74
|
export function createNobleBleConnectionError(error: NobleBleNativeError, messagePrefix = '') {
|
|
76
75
|
const errorMessage = error.message;
|
|
77
|
-
const isInvalidMacOsBond =
|
|
78
|
-
error.nativeErrorCode === 14 && error.nativeErrorDomain === 'CBErrorDomain';
|
|
79
|
-
if (isInvalidMacOsBond) {
|
|
80
|
-
const nativeErrorMessage = `${messagePrefix}${errorMessage}`;
|
|
81
|
-
return ERRORS.TypedError(
|
|
82
|
-
HardwareErrorCode.BleBondInvalid,
|
|
83
|
-
`${HardwareErrorCodeMessage[HardwareErrorCode.BleBondInvalid]} (${nativeErrorMessage})`,
|
|
84
|
-
{
|
|
85
|
-
nativeErrorMessage,
|
|
86
|
-
}
|
|
87
|
-
);
|
|
88
|
-
}
|
|
89
|
-
|
|
90
76
|
return ERRORS.TypedError(HardwareErrorCode.BleConnectedError, `${messagePrefix}${errorMessage}`);
|
|
91
77
|
}
|
|
92
78
|
|
|
@@ -496,7 +482,7 @@ async function initializeNoble(): Promise<void> {
|
|
|
496
482
|
reject(ERRORS.TypedError(HardwareErrorCode.BlePoweredOff));
|
|
497
483
|
} else if (state === 'unauthorized') {
|
|
498
484
|
cleanup();
|
|
499
|
-
reject(ERRORS.TypedError(HardwareErrorCode.
|
|
485
|
+
reject(ERRORS.TypedError(HardwareErrorCode.BleLocationError));
|
|
500
486
|
}
|
|
501
487
|
};
|
|
502
488
|
|
|
@@ -508,6 +494,7 @@ async function initializeNoble(): Promise<void> {
|
|
|
508
494
|
};
|
|
509
495
|
pendingCancellations.add(cancel);
|
|
510
496
|
noble.on('stateChange', onStateChange);
|
|
497
|
+
onStateChange(noble.state);
|
|
511
498
|
});
|
|
512
499
|
|
|
513
500
|
assertBleActive();
|
|
@@ -522,7 +509,7 @@ async function initializeNoble(): Promise<void> {
|
|
|
522
509
|
logger?.info('[NobleBLE] Noble initialized successfully');
|
|
523
510
|
} catch (error) {
|
|
524
511
|
logger?.error('[NobleBLE] Failed to initialize Noble:', error);
|
|
525
|
-
bluetoothState.unsupported =
|
|
512
|
+
bluetoothState.unsupported = noble?.state === 'unsupported';
|
|
526
513
|
bluetoothState.initialized = true;
|
|
527
514
|
throw error;
|
|
528
515
|
}
|
|
@@ -1634,7 +1621,6 @@ async function setupConnectionAndDiscoverServices(
|
|
|
1634
1621
|
await forceReconnectPeripheral(peripheral, deviceId);
|
|
1635
1622
|
} catch (resetError) {
|
|
1636
1623
|
if (
|
|
1637
|
-
isBleStaleBondHardwareError(resetError) ||
|
|
1638
1624
|
(resetError as { errorCode?: unknown })?.errorCode === HardwareErrorCode.BleDeviceDisconnected
|
|
1639
1625
|
) {
|
|
1640
1626
|
throw resetError;
|
|
@@ -1812,21 +1798,12 @@ async function connectDevice(deviceId: string, webContents: WebContents): Promis
|
|
|
1812
1798
|
}
|
|
1813
1799
|
};
|
|
1814
1800
|
|
|
1815
|
-
let staleBondError: Error | undefined;
|
|
1816
1801
|
const connectById = async () => {
|
|
1817
|
-
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
discoveredDevices.set(deviceId, found);
|
|
1821
|
-
}
|
|
1822
|
-
return found;
|
|
1823
|
-
} catch (error) {
|
|
1824
|
-
if ((error as { errorCode?: number }).errorCode !== HardwareErrorCode.BleBondInvalid) {
|
|
1825
|
-
throw error;
|
|
1826
|
-
}
|
|
1827
|
-
staleBondError = error as Error;
|
|
1828
|
-
return undefined;
|
|
1802
|
+
const found = await tryDirectConnectById(deviceId);
|
|
1803
|
+
if (found) {
|
|
1804
|
+
discoveredDevices.set(deviceId, found);
|
|
1829
1805
|
}
|
|
1806
|
+
return found;
|
|
1830
1807
|
};
|
|
1831
1808
|
|
|
1832
1809
|
peripheral = byIdFirst ? await connectById() : await scanForPeripheral();
|
|
@@ -1835,7 +1812,6 @@ async function connectDevice(deviceId: string, webContents: WebContents): Promis
|
|
|
1835
1812
|
// silent), or not reachable by id. Try the other one before giving up.
|
|
1836
1813
|
peripheral = byIdFirst ? await scanForPeripheral() : await connectById();
|
|
1837
1814
|
}
|
|
1838
|
-
if (!peripheral && staleBondError) throw staleBondError;
|
|
1839
1815
|
}
|
|
1840
1816
|
|
|
1841
1817
|
assertBleActive();
|