@matter/react-native 0.17.0-alpha.0-20260507-059f7763b → 0.17.0-alpha.0-20260508-29ff5ae9e
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/package.json +4 -4
- package/dist/cjs/ble/BleScanner.d.ts +0 -16
- package/dist/cjs/ble/BleScanner.d.ts.map +0 -1
- package/dist/cjs/ble/BleScanner.js +0 -38
- package/dist/cjs/ble/BleScanner.js.map +0 -6
- package/dist/cjs/ble/ReactNativeBle.d.ts +0 -16
- package/dist/cjs/ble/ReactNativeBle.d.ts.map +0 -1
- package/dist/cjs/ble/ReactNativeBle.js +0 -58
- package/dist/cjs/ble/ReactNativeBle.js.map +0 -6
- package/dist/cjs/ble/ReactNativeBleChannel.d.ts +0 -36
- package/dist/cjs/ble/ReactNativeBleChannel.d.ts.map +0 -1
- package/dist/cjs/ble/ReactNativeBleChannel.js +0 -329
- package/dist/cjs/ble/ReactNativeBleChannel.js.map +0 -6
- package/dist/cjs/ble/ReactNativeBleClient.d.ts +0 -30
- package/dist/cjs/ble/ReactNativeBleClient.d.ts.map +0 -1
- package/dist/cjs/ble/ReactNativeBleClient.js +0 -156
- package/dist/cjs/ble/ReactNativeBleClient.js.map +0 -6
- package/dist/cjs/ble/index.d.ts +0 -10
- package/dist/cjs/ble/index.d.ts.map +0 -1
- package/dist/cjs/ble/index.js +0 -27
- package/dist/cjs/ble/index.js.map +0 -6
- package/dist/cjs/crypto/ReactNativeCrypto.d.ts +0 -14
- package/dist/cjs/crypto/ReactNativeCrypto.d.ts.map +0 -1
- package/dist/cjs/crypto/ReactNativeCrypto.js +0 -57
- package/dist/cjs/crypto/ReactNativeCrypto.js.map +0 -6
- package/dist/cjs/crypto/index.d.ts +0 -7
- package/dist/cjs/crypto/index.d.ts.map +0 -1
- package/dist/cjs/crypto/index.js +0 -24
- package/dist/cjs/crypto/index.js.map +0 -6
- package/dist/cjs/environment/ReactNativeEnvironment.d.ts +0 -16
- package/dist/cjs/environment/ReactNativeEnvironment.d.ts.map +0 -1
- package/dist/cjs/environment/ReactNativeEnvironment.js +0 -64
- package/dist/cjs/environment/ReactNativeEnvironment.js.map +0 -6
- package/dist/cjs/environment/index.d.ts +0 -8
- package/dist/cjs/environment/index.d.ts.map +0 -1
- package/dist/cjs/environment/index.js +0 -25
- package/dist/cjs/environment/index.js.map +0 -6
- package/dist/cjs/environment/register.d.ts +0 -7
- package/dist/cjs/environment/register.d.ts.map +0 -1
- package/dist/cjs/environment/register.js +0 -14
- package/dist/cjs/environment/register.js.map +0 -6
- package/dist/cjs/index.d.ts +0 -11
- package/dist/cjs/index.d.ts.map +0 -1
- package/dist/cjs/index.js +0 -28
- package/dist/cjs/index.js.map +0 -6
- package/dist/cjs/net/NetworkReactNative.d.ts +0 -22
- package/dist/cjs/net/NetworkReactNative.d.ts.map +0 -1
- package/dist/cjs/net/NetworkReactNative.js +0 -179
- package/dist/cjs/net/NetworkReactNative.js.map +0 -6
- package/dist/cjs/net/TcpConnectionReactNative.d.ts +0 -26
- package/dist/cjs/net/TcpConnectionReactNative.d.ts.map +0 -1
- package/dist/cjs/net/TcpConnectionReactNative.js +0 -148
- package/dist/cjs/net/TcpConnectionReactNative.js.map +0 -6
- package/dist/cjs/net/TcpListenerReactNative.d.ts +0 -19
- package/dist/cjs/net/TcpListenerReactNative.d.ts.map +0 -1
- package/dist/cjs/net/TcpListenerReactNative.js +0 -102
- package/dist/cjs/net/TcpListenerReactNative.js.map +0 -6
- package/dist/cjs/net/UdpSocketReactNative.d.ts +0 -40
- package/dist/cjs/net/UdpSocketReactNative.d.ts.map +0 -1
- package/dist/cjs/net/UdpSocketReactNative.js +0 -194
- package/dist/cjs/net/UdpSocketReactNative.js.map +0 -6
- package/dist/cjs/net/index.d.ts +0 -10
- package/dist/cjs/net/index.d.ts.map +0 -1
- package/dist/cjs/net/index.js +0 -39
- package/dist/cjs/net/index.js.map +0 -6
- package/dist/cjs/net/react-native-tcp-socket.d.js +0 -2
- package/dist/cjs/net/react-native-tcp-socket.d.js.map +0 -6
- package/dist/cjs/net/react-native-tcp-socket.d.ts +0 -71
- package/dist/cjs/package.json +0 -6
- package/dist/cjs/storage/ReactNativeWebStorageDriver.d.ts +0 -23
- package/dist/cjs/storage/ReactNativeWebStorageDriver.d.ts.map +0 -1
- package/dist/cjs/storage/ReactNativeWebStorageDriver.js +0 -42
- package/dist/cjs/storage/ReactNativeWebStorageDriver.js.map +0 -6
- package/dist/cjs/storage/ReactNativeWebStorageDriverV2.d.ts +0 -22
- package/dist/cjs/storage/ReactNativeWebStorageDriverV2.d.ts.map +0 -1
- package/dist/cjs/storage/ReactNativeWebStorageDriverV2.js +0 -108
- package/dist/cjs/storage/ReactNativeWebStorageDriverV2.js.map +0 -6
- package/dist/cjs/storage/index.d.ts +0 -18
- package/dist/cjs/storage/index.d.ts.map +0 -1
- package/dist/cjs/storage/index.js +0 -37
- package/dist/cjs/storage/index.js.map +0 -6
- package/dist/esm/ble/BleScanner.js +0 -18
- package/dist/esm/ble/BleScanner.js.map +0 -6
- package/dist/esm/ble/ReactNativeBle.js +0 -38
- package/dist/esm/ble/ReactNativeBle.js.map +0 -6
- package/dist/esm/ble/ReactNativeBleChannel.js +0 -321
- package/dist/esm/ble/ReactNativeBleChannel.js.map +0 -6
- package/dist/esm/ble/ReactNativeBleClient.js +0 -136
- package/dist/esm/ble/ReactNativeBleClient.js.map +0 -6
- package/dist/esm/ble/index.js +0 -10
- package/dist/esm/ble/index.js.map +0 -6
- package/dist/esm/crypto/ReactNativeCrypto.js +0 -27
- package/dist/esm/crypto/ReactNativeCrypto.js.map +0 -6
- package/dist/esm/crypto/index.js +0 -7
- package/dist/esm/crypto/index.js.map +0 -6
- package/dist/esm/environment/ReactNativeEnvironment.js +0 -44
- package/dist/esm/environment/ReactNativeEnvironment.js.map +0 -6
- package/dist/esm/environment/index.js +0 -8
- package/dist/esm/environment/index.js.map +0 -6
- package/dist/esm/environment/register.js +0 -13
- package/dist/esm/environment/register.js.map +0 -6
- package/dist/esm/index.js +0 -11
- package/dist/esm/index.js.map +0 -6
- package/dist/esm/net/NetworkReactNative.js +0 -158
- package/dist/esm/net/NetworkReactNative.js.map +0 -6
- package/dist/esm/net/TcpConnectionReactNative.js +0 -135
- package/dist/esm/net/TcpConnectionReactNative.js.map +0 -6
- package/dist/esm/net/TcpListenerReactNative.js +0 -88
- package/dist/esm/net/TcpListenerReactNative.js.map +0 -6
- package/dist/esm/net/UdpSocketReactNative.js +0 -174
- package/dist/esm/net/UdpSocketReactNative.js.map +0 -6
- package/dist/esm/net/index.js +0 -18
- package/dist/esm/net/index.js.map +0 -6
- package/dist/esm/net/react-native-tcp-socket.d.js +0 -1
- package/dist/esm/net/react-native-tcp-socket.d.js.map +0 -6
- package/dist/esm/net/react-native-tcp-socket.d.ts +0 -71
- package/dist/esm/package.json +0 -6
- package/dist/esm/storage/ReactNativeWebStorageDriver.js +0 -22
- package/dist/esm/storage/ReactNativeWebStorageDriver.js.map +0 -6
- package/dist/esm/storage/ReactNativeWebStorageDriverV2.js +0 -78
- package/dist/esm/storage/ReactNativeWebStorageDriverV2.js.map +0 -6
- package/dist/esm/storage/index.js +0 -16
- package/dist/esm/storage/index.js.map +0 -6
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { BleScanner as BaseBleScanner } from "@matter/protocol";
|
|
7
|
-
class BleScanner extends BaseBleScanner {
|
|
8
|
-
constructor(bleClient) {
|
|
9
|
-
super(bleClient);
|
|
10
|
-
}
|
|
11
|
-
getDiscoveredDevice(address) {
|
|
12
|
-
return super.getDiscoveredDevice(address);
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export {
|
|
16
|
-
BleScanner
|
|
17
|
-
};
|
|
18
|
-
//# sourceMappingURL=BleScanner.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ble/BleScanner.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc,sBAA2C;AAS3D,MAAM,mBAAmB,eAAe;AAAA,EAC3C,YAAY,WAAiC;AACzC,UAAM,SAAS;AAAA,EACnB;AAAA,EAES,oBAAoB,SAAiD;AAC1E,WAAO,MAAM,oBAAoB,OAAO;AAAA,EAC5C;AACJ;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { ChannelType, ImplementationError } from "@matter/general";
|
|
7
|
-
import { Ble } from "@matter/protocol";
|
|
8
|
-
import { BleScanner } from "./BleScanner.js";
|
|
9
|
-
import { ReactNativeBleCentralInterface } from "./ReactNativeBleChannel.js";
|
|
10
|
-
import { ReactNativeBleClient } from "./ReactNativeBleClient.js";
|
|
11
|
-
class ReactNativeBle extends Ble {
|
|
12
|
-
bleCentral;
|
|
13
|
-
constructor() {
|
|
14
|
-
super();
|
|
15
|
-
}
|
|
16
|
-
get centralInterface() {
|
|
17
|
-
if (this.bleCentral === void 0) {
|
|
18
|
-
this.bleCentral = new ReactNativeBleClient();
|
|
19
|
-
}
|
|
20
|
-
return new ReactNativeBleCentralInterface(this);
|
|
21
|
-
}
|
|
22
|
-
get scanner() {
|
|
23
|
-
if (this.bleCentral === void 0) {
|
|
24
|
-
this.bleCentral = new ReactNativeBleClient();
|
|
25
|
-
}
|
|
26
|
-
return new BleScanner(this.bleCentral);
|
|
27
|
-
}
|
|
28
|
-
get peripheralInterface() {
|
|
29
|
-
throw new ImplementationError("React Native can only act as a central device, not a peripheral.");
|
|
30
|
-
}
|
|
31
|
-
supports(type) {
|
|
32
|
-
return type === ChannelType.BLE;
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
export {
|
|
36
|
-
ReactNativeBle
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=ReactNativeBle.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ble/ReactNativeBle.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,aAAa,2BAAsC;AAC5D,SAAS,WAA4C;AACrD,SAAS,kBAAkB;AAC3B,SAAS,sCAAsC;AAC/C,SAAS,4BAA4B;AAE9B,MAAM,uBAAuB,IAAI;AAAA,EAC5B;AAAA,EAER,cAAc;AACV,UAAM;AAAA,EACV;AAAA,EAEA,IAAI,mBAA8B;AAC9B,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,qBAAqB;AAAA,IAC/C;AACA,WAAO,IAAI,+BAA+B,IAAI;AAAA,EAClD;AAAA,EAEA,IAAI,UAAmB;AACnB,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,qBAAqB;AAAA,IAC/C;AACA,WAAO,IAAI,WAAW,KAAK,UAAU;AAAA,EACzC;AAAA,EAEA,IAAI,sBAA8C;AAC9C,UAAM,IAAI,oBAAoB,kEAAkE;AAAA,EACpG;AAAA,EAEA,SAAS,MAAmB;AACxB,WAAO,SAAS,YAAY;AAAA,EAChC;AACJ;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
|
@@ -1,321 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import {
|
|
7
|
-
Bytes,
|
|
8
|
-
ChannelType,
|
|
9
|
-
Diagnostic,
|
|
10
|
-
InternalError,
|
|
11
|
-
Logger,
|
|
12
|
-
ServerAddress,
|
|
13
|
-
Time,
|
|
14
|
-
createPromise
|
|
15
|
-
} from "@matter/general";
|
|
16
|
-
import { BleChannel, BleError, BtpCodec, BtpFlowError, BtpSessionHandler, MatterBle } from "@matter/protocol";
|
|
17
|
-
import {
|
|
18
|
-
BleErrorCode,
|
|
19
|
-
BleError as ReactNativeBleError
|
|
20
|
-
} from "react-native-ble-plx";
|
|
21
|
-
const logger = Logger.get("BleChannel");
|
|
22
|
-
class ReactNativeBleCentralInterface {
|
|
23
|
-
#ble;
|
|
24
|
-
#openChannels = /* @__PURE__ */ new Map();
|
|
25
|
-
#onMatterMessageListener;
|
|
26
|
-
constructor(ble) {
|
|
27
|
-
this.#ble = ble;
|
|
28
|
-
}
|
|
29
|
-
async openChannel(address) {
|
|
30
|
-
if (!ServerAddress.isBle(address)) {
|
|
31
|
-
throw new InternalError(`Unsupported address type for BLE channel.`);
|
|
32
|
-
}
|
|
33
|
-
if (this.#onMatterMessageListener === void 0) {
|
|
34
|
-
throw new InternalError(`Network Interface was not added to the system yet.`);
|
|
35
|
-
}
|
|
36
|
-
const { peripheral: blePeripheral, hasAdditionalAdvertisementData } = this.#ble.scanner.getDiscoveredDevice(address.peripheralAddress);
|
|
37
|
-
const peripheral = blePeripheral.device;
|
|
38
|
-
if (this.#openChannels.has(address.peripheralAddress)) {
|
|
39
|
-
throw new BleError(
|
|
40
|
-
`Peripheral ${address.peripheralAddress} is already connected. Only one connection supported right now.`
|
|
41
|
-
);
|
|
42
|
-
}
|
|
43
|
-
logger.debug(`Connect to Peripheral now`);
|
|
44
|
-
let device;
|
|
45
|
-
try {
|
|
46
|
-
device = await peripheral.connect();
|
|
47
|
-
await device.requestMTU(MatterBle.MAXIMUM_BTP_MTU);
|
|
48
|
-
} catch (error) {
|
|
49
|
-
if (error instanceof ReactNativeBleError && error.errorCode === BleErrorCode.DeviceAlreadyConnected) {
|
|
50
|
-
device = peripheral;
|
|
51
|
-
} else {
|
|
52
|
-
throw new BleError(`Error connecting to peripheral: ${error.message}`);
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
logger.debug(`Peripheral connected successfully, MTU = ${device.mtu}`);
|
|
56
|
-
device = await device.discoverAllServicesAndCharacteristics();
|
|
57
|
-
const services = await device.services();
|
|
58
|
-
for (const service of services) {
|
|
59
|
-
logger.debug(`found service: ${service.uuid}`);
|
|
60
|
-
if (!MatterBle.isServiceUuid(service.uuid)) continue;
|
|
61
|
-
const characteristics = await device.characteristicsForService(service.uuid);
|
|
62
|
-
let characteristicC1ForWrite;
|
|
63
|
-
let characteristicC2ForSubscribe;
|
|
64
|
-
let additionalCommissioningRelatedData;
|
|
65
|
-
for (const characteristic of characteristics) {
|
|
66
|
-
logger.debug("found characteristic:", characteristic.uuid);
|
|
67
|
-
switch (characteristic.uuid.toUpperCase()) {
|
|
68
|
-
case MatterBle.C1_CHARACTERISTIC_UUID:
|
|
69
|
-
logger.debug("found C1 characteristic");
|
|
70
|
-
characteristicC1ForWrite = characteristic;
|
|
71
|
-
break;
|
|
72
|
-
case MatterBle.C2_CHARACTERISTIC_UUID:
|
|
73
|
-
logger.debug("found C2 characteristic");
|
|
74
|
-
characteristicC2ForSubscribe = characteristic;
|
|
75
|
-
break;
|
|
76
|
-
case MatterBle.C3_CHARACTERISTIC_UUID:
|
|
77
|
-
logger.debug("found C3 characteristic");
|
|
78
|
-
if (hasAdditionalAdvertisementData) {
|
|
79
|
-
logger.debug("reading additional commissioning related data");
|
|
80
|
-
const characteristicWithValue = await service.readCharacteristic(characteristic.uuid);
|
|
81
|
-
if (characteristicWithValue.value !== null) {
|
|
82
|
-
additionalCommissioningRelatedData = Bytes.fromBase64(characteristicWithValue.value);
|
|
83
|
-
} else {
|
|
84
|
-
logger.debug("no value in characteristic C3");
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
if (!characteristicC1ForWrite || !characteristicC2ForSubscribe) {
|
|
90
|
-
logger.debug("missing characteristics");
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
this.#openChannels.set(address.peripheralAddress, device);
|
|
94
|
-
const disconnectSub = device.onDisconnected(() => {
|
|
95
|
-
this.#openChannels.delete(address.peripheralAddress);
|
|
96
|
-
disconnectSub.remove();
|
|
97
|
-
});
|
|
98
|
-
try {
|
|
99
|
-
return await ReactNativeBleChannel.create(
|
|
100
|
-
device,
|
|
101
|
-
characteristicC1ForWrite,
|
|
102
|
-
characteristicC2ForSubscribe,
|
|
103
|
-
this.#onMatterMessageListener,
|
|
104
|
-
additionalCommissioningRelatedData
|
|
105
|
-
);
|
|
106
|
-
} catch (error) {
|
|
107
|
-
this.#openChannels.delete(address.peripheralAddress);
|
|
108
|
-
disconnectSub.remove();
|
|
109
|
-
throw error;
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
throw new BleError(`No Matter service found on peripheral ${device.id}`);
|
|
113
|
-
}
|
|
114
|
-
onData(listener) {
|
|
115
|
-
this.#onMatterMessageListener = listener;
|
|
116
|
-
return {
|
|
117
|
-
close: async () => await this.close()
|
|
118
|
-
};
|
|
119
|
-
}
|
|
120
|
-
async close() {
|
|
121
|
-
const peripherals = [...this.#openChannels.values()];
|
|
122
|
-
this.#openChannels.clear();
|
|
123
|
-
for (const peripheral of peripherals) {
|
|
124
|
-
await peripheral.cancelConnection();
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
supports(type) {
|
|
128
|
-
return type === ChannelType.BLE;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
class ReactNativeBleChannel extends BleChannel {
|
|
132
|
-
constructor(peripheral, btpSession) {
|
|
133
|
-
super();
|
|
134
|
-
this.peripheral = peripheral;
|
|
135
|
-
this.btpSession = btpSession;
|
|
136
|
-
this.disconnectSubscription = peripheral.onDisconnected((error) => {
|
|
137
|
-
logger.debug(`Disconnected from peripheral ${peripheral.id}: ${error}`);
|
|
138
|
-
this.connected = false;
|
|
139
|
-
this.disconnectSubscription.remove();
|
|
140
|
-
this.#terminateIterator();
|
|
141
|
-
for (const listener of this.#closeListeners) {
|
|
142
|
-
listener();
|
|
143
|
-
}
|
|
144
|
-
this.btpSession.close().catch((error2) => {
|
|
145
|
-
logger.debug(`Error closing BTP session on disconnect`, error2);
|
|
146
|
-
});
|
|
147
|
-
this.emitClosed();
|
|
148
|
-
});
|
|
149
|
-
this.btpSession.closed.on(() => this.emitClosed());
|
|
150
|
-
}
|
|
151
|
-
peripheral;
|
|
152
|
-
btpSession;
|
|
153
|
-
static async create(peripheral, characteristicC1ForWrite, characteristicC2ForSubscribe, onMatterMessageListener, _additionalCommissioningRelatedData) {
|
|
154
|
-
let mtu = peripheral.mtu ?? 0;
|
|
155
|
-
if (mtu > MatterBle.MAXIMUM_BTP_MTU) {
|
|
156
|
-
mtu = MatterBle.MAXIMUM_BTP_MTU;
|
|
157
|
-
}
|
|
158
|
-
logger.debug(`Using MTU=${mtu} (Peripheral MTU=${peripheral.mtu})`);
|
|
159
|
-
const btpHandshakeRequest = BtpCodec.encodeBtpHandshakeRequest({
|
|
160
|
-
versions: MatterBle.BTP_SUPPORTED_VERSIONS,
|
|
161
|
-
attMtu: mtu,
|
|
162
|
-
clientWindowSize: MatterBle.BTP_MAXIMUM_WINDOW_SIZE
|
|
163
|
-
});
|
|
164
|
-
logger.debug(`sending BTP handshake request: ${Diagnostic.json(btpHandshakeRequest)}`);
|
|
165
|
-
characteristicC1ForWrite = await characteristicC1ForWrite.writeWithResponse(
|
|
166
|
-
Bytes.toBase64(btpHandshakeRequest)
|
|
167
|
-
);
|
|
168
|
-
const btpHandshakeTimeout = Time.getTimer("BLE handshake timeout", MatterBle.BTP_CONN_RSP_TIMEOUT, () => {
|
|
169
|
-
characteristicSubscribe.remove();
|
|
170
|
-
peripheral.cancelConnection().catch((error) => logger.debug("Error cancelling connection on handshake timeout", error));
|
|
171
|
-
logger.debug("Handshake Response not received. Disconnected from peripheral");
|
|
172
|
-
rejecter(new BleError("Handshake Response not received"));
|
|
173
|
-
}).start();
|
|
174
|
-
logger.debug("subscribing to C2 characteristic");
|
|
175
|
-
const { promise: handshakeResponseReceivedPromise, resolver, rejecter } = createPromise();
|
|
176
|
-
let handshakeReceived = false;
|
|
177
|
-
let btpSession = void 0;
|
|
178
|
-
const characteristicSubscribe = characteristicC2ForSubscribe.monitor((error, characteristic) => {
|
|
179
|
-
if (error !== null || characteristic === null) {
|
|
180
|
-
if (error instanceof ReactNativeBleError && error.errorCode === 2) {
|
|
181
|
-
return;
|
|
182
|
-
}
|
|
183
|
-
if (!handshakeReceived) {
|
|
184
|
-
btpHandshakeTimeout.stop();
|
|
185
|
-
rejecter(new BleError(`BLE error during handshake: ${error?.message ?? "unknown"}`));
|
|
186
|
-
}
|
|
187
|
-
logger.debug("Error while monitoring C2 characteristic.", error?.message);
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
const characteristicData = characteristic.value;
|
|
191
|
-
if (characteristicData === null) {
|
|
192
|
-
logger.debug("C2 characteristic value is null");
|
|
193
|
-
return;
|
|
194
|
-
}
|
|
195
|
-
const data = Bytes.fromBase64(characteristicData);
|
|
196
|
-
logger.debug(`received data on C2: ${Bytes.toHex(data)}`);
|
|
197
|
-
if (!handshakeReceived) {
|
|
198
|
-
const _data = Bytes.of(data);
|
|
199
|
-
if (_data[0] === 101 && _data[1] === 108 && _data.length === 6) {
|
|
200
|
-
logger.info(`Received Matter handshake response: ${Bytes.toHex(_data)}.`);
|
|
201
|
-
btpHandshakeTimeout.stop();
|
|
202
|
-
handshakeReceived = true;
|
|
203
|
-
resolver(_data);
|
|
204
|
-
}
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
if (btpSession) {
|
|
208
|
-
btpSession.handleIncomingBleData(data).catch((error2) => {
|
|
209
|
-
logger.info("Error handling incoming BLE data", error2);
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
});
|
|
213
|
-
const handshakeResponse = await handshakeResponseReceivedPromise;
|
|
214
|
-
try {
|
|
215
|
-
btpSession = await BtpSessionHandler.createAsCentral(
|
|
216
|
-
handshakeResponse,
|
|
217
|
-
// callback to write data to characteristic C1
|
|
218
|
-
async (data) => {
|
|
219
|
-
characteristicC1ForWrite = await characteristicC1ForWrite.writeWithResponse(Bytes.toBase64(data));
|
|
220
|
-
},
|
|
221
|
-
// callback to disconnect the BLE connection
|
|
222
|
-
async () => {
|
|
223
|
-
characteristicSubscribe.remove();
|
|
224
|
-
if (await peripheral.isConnected()) {
|
|
225
|
-
await peripheral.cancelConnection();
|
|
226
|
-
}
|
|
227
|
-
logger.debug("disconnected from peripheral");
|
|
228
|
-
},
|
|
229
|
-
// callback to forward decoded and de-assembled Matter messages
|
|
230
|
-
async (data) => {
|
|
231
|
-
if (onMatterMessageListener === void 0) {
|
|
232
|
-
throw new InternalError(`No listener registered for Matter messages`);
|
|
233
|
-
}
|
|
234
|
-
bleChannel.#pushMessage(data);
|
|
235
|
-
onMatterMessageListener(bleChannel, data);
|
|
236
|
-
}
|
|
237
|
-
);
|
|
238
|
-
const bleChannel = new ReactNativeBleChannel(peripheral, btpSession);
|
|
239
|
-
return bleChannel;
|
|
240
|
-
} catch (error) {
|
|
241
|
-
characteristicSubscribe.remove();
|
|
242
|
-
btpHandshakeTimeout.stop();
|
|
243
|
-
throw error;
|
|
244
|
-
}
|
|
245
|
-
}
|
|
246
|
-
connected = true;
|
|
247
|
-
disconnectSubscription;
|
|
248
|
-
#closeListeners = /* @__PURE__ */ new Set();
|
|
249
|
-
#iteratorQueue = new Array();
|
|
250
|
-
#iteratorWaiter;
|
|
251
|
-
#iteratorDone = false;
|
|
252
|
-
/**
|
|
253
|
-
* Send a Matter message to the connected device - need to do BTP assembly first.
|
|
254
|
-
*
|
|
255
|
-
* @param data
|
|
256
|
-
*/
|
|
257
|
-
async send(data) {
|
|
258
|
-
if (!this.connected) {
|
|
259
|
-
logger.debug("Cannot send data because not connected to peripheral.");
|
|
260
|
-
return;
|
|
261
|
-
}
|
|
262
|
-
if (this.btpSession === void 0) {
|
|
263
|
-
throw new BtpFlowError(`Cannot send data, no BTP session initialized`);
|
|
264
|
-
}
|
|
265
|
-
await this.btpSession.sendMatterMessage(data);
|
|
266
|
-
}
|
|
267
|
-
// Channel<Bytes>
|
|
268
|
-
get name() {
|
|
269
|
-
return `ble://${this.peripheral.id}`;
|
|
270
|
-
}
|
|
271
|
-
onClose(listener) {
|
|
272
|
-
this.#closeListeners.add(listener);
|
|
273
|
-
return {
|
|
274
|
-
close: async () => {
|
|
275
|
-
this.#closeListeners.delete(listener);
|
|
276
|
-
}
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
[Symbol.asyncIterator]() {
|
|
280
|
-
return {
|
|
281
|
-
next: () => {
|
|
282
|
-
if (this.#iteratorQueue.length > 0) {
|
|
283
|
-
return Promise.resolve({ value: this.#iteratorQueue.shift(), done: false });
|
|
284
|
-
}
|
|
285
|
-
if (this.#iteratorDone || !this.connected) {
|
|
286
|
-
return Promise.resolve({ value: void 0, done: true });
|
|
287
|
-
}
|
|
288
|
-
return new Promise((resolve) => {
|
|
289
|
-
this.#iteratorWaiter = resolve;
|
|
290
|
-
});
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
#pushMessage(message) {
|
|
295
|
-
if (this.#iteratorWaiter) {
|
|
296
|
-
const resolve = this.#iteratorWaiter;
|
|
297
|
-
this.#iteratorWaiter = void 0;
|
|
298
|
-
resolve({ value: message, done: false });
|
|
299
|
-
} else if (!this.#iteratorDone) {
|
|
300
|
-
this.#iteratorQueue.push(message);
|
|
301
|
-
}
|
|
302
|
-
}
|
|
303
|
-
#terminateIterator() {
|
|
304
|
-
if (!this.#iteratorDone) {
|
|
305
|
-
this.#iteratorDone = true;
|
|
306
|
-
this.#iteratorWaiter?.({ value: void 0, done: true });
|
|
307
|
-
this.#iteratorWaiter = void 0;
|
|
308
|
-
}
|
|
309
|
-
}
|
|
310
|
-
async close() {
|
|
311
|
-
this.#terminateIterator();
|
|
312
|
-
this.disconnectSubscription.remove();
|
|
313
|
-
await this.btpSession.close();
|
|
314
|
-
this.emitClosed();
|
|
315
|
-
}
|
|
316
|
-
}
|
|
317
|
-
export {
|
|
318
|
-
ReactNativeBleCentralInterface,
|
|
319
|
-
ReactNativeBleChannel
|
|
320
|
-
};
|
|
321
|
-
//# sourceMappingURL=ReactNativeBleChannel.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ble/ReactNativeBleChannel.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": ["error"]
|
|
6
|
-
}
|
|
@@ -1,136 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { Bytes, Diagnostic, Logger, MatterError } from "@matter/general";
|
|
7
|
-
import { MatterBle } from "@matter/protocol";
|
|
8
|
-
import { BleError, BleErrorCode, BleManager, State as BluetoothState } from "react-native-ble-plx";
|
|
9
|
-
const logger = Logger.get("ReactNativeBleClient");
|
|
10
|
-
class BluetoothUnauthorizedError extends MatterError {
|
|
11
|
-
}
|
|
12
|
-
class BluetoothUnsupportedError extends MatterError {
|
|
13
|
-
}
|
|
14
|
-
class ReactNativeBleClient {
|
|
15
|
-
bleManager = new BleManager();
|
|
16
|
-
discoveredPeripherals = /* @__PURE__ */ new Map();
|
|
17
|
-
shouldScan = false;
|
|
18
|
-
isScanning = false;
|
|
19
|
-
bleState = BluetoothState.Unknown;
|
|
20
|
-
deviceDiscoveredCallback;
|
|
21
|
-
constructor() {
|
|
22
|
-
const subscription = this.bleManager.onStateChange((state) => {
|
|
23
|
-
this.bleState = state;
|
|
24
|
-
logger.debug(`BLE state changed to ${state}`);
|
|
25
|
-
switch (state) {
|
|
26
|
-
case BluetoothState.PoweredOff:
|
|
27
|
-
this.bleManager.enable().catch((error) => {
|
|
28
|
-
subscription.remove();
|
|
29
|
-
if (error instanceof BleError && error.errorCode === BleErrorCode.BluetoothUnauthorized) {
|
|
30
|
-
throw new BluetoothUnauthorizedError("Bluetooth is unauthorized");
|
|
31
|
-
}
|
|
32
|
-
throw error;
|
|
33
|
-
});
|
|
34
|
-
break;
|
|
35
|
-
case BluetoothState.PoweredOn:
|
|
36
|
-
subscription.remove();
|
|
37
|
-
if (this.shouldScan) {
|
|
38
|
-
void this.startScanning();
|
|
39
|
-
}
|
|
40
|
-
break;
|
|
41
|
-
case BluetoothState.Unauthorized:
|
|
42
|
-
subscription.remove();
|
|
43
|
-
throw new BluetoothUnauthorizedError("Bluetooth is unauthorized");
|
|
44
|
-
case BluetoothState.Unsupported:
|
|
45
|
-
subscription.remove();
|
|
46
|
-
throw new BluetoothUnsupportedError("Bluetooth is unsupported");
|
|
47
|
-
default:
|
|
48
|
-
logger.error("Unexpected BLE state", state);
|
|
49
|
-
subscription.remove();
|
|
50
|
-
void this.stopScanning();
|
|
51
|
-
}
|
|
52
|
-
}, true);
|
|
53
|
-
}
|
|
54
|
-
setDiscoveryCallback(callback) {
|
|
55
|
-
this.deviceDiscoveredCallback = callback;
|
|
56
|
-
for (const { peripheral, matterServiceData } of this.discoveredPeripherals.values()) {
|
|
57
|
-
this.deviceDiscoveredCallback(this.#asBlePeripheral(peripheral), matterServiceData);
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
async startScanning() {
|
|
61
|
-
if (this.isScanning) return;
|
|
62
|
-
this.shouldScan = true;
|
|
63
|
-
if (this.bleState === BluetoothState.PoweredOn) {
|
|
64
|
-
logger.debug("Start BLE scanning for Matter Services ...");
|
|
65
|
-
this.isScanning = true;
|
|
66
|
-
await this.bleManager.startDeviceScan(
|
|
67
|
-
null,
|
|
68
|
-
{
|
|
69
|
-
allowDuplicates: false,
|
|
70
|
-
scanMode: 2,
|
|
71
|
-
// Low Latency
|
|
72
|
-
callbackType: 1
|
|
73
|
-
// All matches
|
|
74
|
-
},
|
|
75
|
-
(error, peripheral) => {
|
|
76
|
-
if (error !== null || peripheral === null) {
|
|
77
|
-
this.isScanning = false;
|
|
78
|
-
logger.error("Error while scanning for BLE devices", error);
|
|
79
|
-
if (this.shouldScan) {
|
|
80
|
-
this.startScanning().catch(
|
|
81
|
-
(error2) => logger.error("Error while restarting scanning after error", error2)
|
|
82
|
-
);
|
|
83
|
-
} else {
|
|
84
|
-
this.stopScanning().catch(
|
|
85
|
-
(error2) => logger.error("Error while stopping scanning after error", error2)
|
|
86
|
-
);
|
|
87
|
-
}
|
|
88
|
-
return;
|
|
89
|
-
}
|
|
90
|
-
this.handleDiscoveredDevice(peripheral);
|
|
91
|
-
}
|
|
92
|
-
);
|
|
93
|
-
} else {
|
|
94
|
-
logger.debug("ble state is not poweredOn ... delay scanning till poweredOn");
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
async stopScanning() {
|
|
98
|
-
this.shouldScan = false;
|
|
99
|
-
logger.debug("Stop BLE scanning for Matter Services ...");
|
|
100
|
-
await this.bleManager.stopDeviceScan();
|
|
101
|
-
this.isScanning = false;
|
|
102
|
-
}
|
|
103
|
-
handleDiscoveredDevice(peripheral) {
|
|
104
|
-
logger.debug(
|
|
105
|
-
`Found peripheral ${peripheral.id} (${peripheral.localName}) with serviceData ${Diagnostic.json(peripheral.serviceData)}`
|
|
106
|
-
);
|
|
107
|
-
if (!peripheral.isConnectable) {
|
|
108
|
-
logger.debug(`Peripheral ${peripheral.id} is not connectable ... ignoring`);
|
|
109
|
-
return;
|
|
110
|
-
}
|
|
111
|
-
const matterServiceDataBase64 = peripheral.serviceData?.[MatterBle.SERVICE_UUID] ?? peripheral.serviceData?.[MatterBle.SERVICE_UUID_SHORT];
|
|
112
|
-
if (matterServiceDataBase64 === void 0) {
|
|
113
|
-
logger.info(`Peripheral ${peripheral.id} does not advertise Matter Service ... ignoring`);
|
|
114
|
-
return;
|
|
115
|
-
}
|
|
116
|
-
const matterServiceData = Bytes.fromBase64(matterServiceDataBase64);
|
|
117
|
-
if (matterServiceData.byteLength !== 8) {
|
|
118
|
-
logger.info(`Peripheral ${peripheral.id} does not advertise Matter Service ... ignoring`);
|
|
119
|
-
return;
|
|
120
|
-
}
|
|
121
|
-
this.discoveredPeripherals.set(peripheral.id, {
|
|
122
|
-
peripheral,
|
|
123
|
-
matterServiceData
|
|
124
|
-
});
|
|
125
|
-
this.deviceDiscoveredCallback?.(this.#asBlePeripheral(peripheral), matterServiceData);
|
|
126
|
-
}
|
|
127
|
-
#asBlePeripheral(device) {
|
|
128
|
-
return { device, address: device.id };
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
export {
|
|
132
|
-
BluetoothUnauthorizedError,
|
|
133
|
-
BluetoothUnsupportedError,
|
|
134
|
-
ReactNativeBleClient
|
|
135
|
-
};
|
|
136
|
-
//# sourceMappingURL=ReactNativeBleClient.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/ble/ReactNativeBleClient.ts"],
|
|
4
|
-
"mappings": "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",
|
|
5
|
-
"names": ["error"]
|
|
6
|
-
}
|
package/dist/esm/ble/index.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
export * from "./BleScanner.js";
|
|
7
|
-
export * from "./ReactNativeBle.js";
|
|
8
|
-
export * from "./ReactNativeBleChannel.js";
|
|
9
|
-
export * from "./ReactNativeBleClient.js";
|
|
10
|
-
//# sourceMappingURL=index.js.map
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { Buffer } from "@craftzdog/react-native-buffer";
|
|
7
|
-
import { Crypto, Entropy, Environment, StandardCrypto } from "@matter/general";
|
|
8
|
-
import QuickCrypto from "react-native-quick-crypto";
|
|
9
|
-
const crypto = QuickCrypto;
|
|
10
|
-
if (!("Buffer" in globalThis)) {
|
|
11
|
-
globalThis.Buffer = Buffer;
|
|
12
|
-
}
|
|
13
|
-
class ReactNativeCrypto extends StandardCrypto {
|
|
14
|
-
implementationName = "ReactNativeCrypto";
|
|
15
|
-
static provider() {
|
|
16
|
-
return new ReactNativeCrypto(crypto);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
{
|
|
20
|
-
const rnCrypto = new ReactNativeCrypto(crypto);
|
|
21
|
-
Environment.default.set(Entropy, rnCrypto);
|
|
22
|
-
Environment.default.set(Crypto, rnCrypto);
|
|
23
|
-
}
|
|
24
|
-
export {
|
|
25
|
-
ReactNativeCrypto
|
|
26
|
-
};
|
|
27
|
-
//# sourceMappingURL=ReactNativeCrypto.js.map
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
3
|
-
"sources": ["../../../src/crypto/ReactNativeCrypto.ts"],
|
|
4
|
-
"mappings": "AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,SAAS,cAAc;AACvB,SAAS,QAAQ,SAAS,aAAa,sBAAiC;AACxE,OAAO,iBAAiB;AAIxB,MAAM,SAAS;AAIf,IAAI,EAAE,YAAY,aAAa;AAC3B,EAAC,WAAoD,SAAS;AAClE;AAKO,MAAM,0BAA0B,eAAe;AAAA,EACzC,qBAAqB;AAAA,EAE9B,OAAgB,WAAW;AACvB,WAAO,IAAI,kBAAkB,MAA8B;AAAA,EAC/D;AACJ;AAEA;AACI,QAAM,WAAW,IAAI,kBAAkB,MAA8B;AACrE,cAAY,QAAQ,IAAI,SAAS,QAAQ;AACzC,cAAY,QAAQ,IAAI,QAAQ,QAAQ;AAC5C;",
|
|
5
|
-
"names": []
|
|
6
|
-
}
|
package/dist/esm/crypto/index.js
DELETED
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @license
|
|
3
|
-
* Copyright 2022-2026 Matter.js Authors
|
|
4
|
-
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
-
*/
|
|
6
|
-
import { ReactNativeBle } from "#ble/ReactNativeBle.js";
|
|
7
|
-
import { Environment, Network, StorageService } from "@matter/general";
|
|
8
|
-
import { Ble } from "@matter/protocol";
|
|
9
|
-
import { NetworkReactNative } from "../net/NetworkReactNative.js";
|
|
10
|
-
import { ReactNativeWebStorageDriver } from "../storage/ReactNativeWebStorageDriver.js";
|
|
11
|
-
function ReactNativeEnvironment() {
|
|
12
|
-
const env = new Environment("default");
|
|
13
|
-
loadVariables(env);
|
|
14
|
-
configureStorage(env);
|
|
15
|
-
configureNetwork(env);
|
|
16
|
-
configureBle(env);
|
|
17
|
-
return env;
|
|
18
|
-
}
|
|
19
|
-
function loadVariables(env) {
|
|
20
|
-
const vars = env.vars;
|
|
21
|
-
vars.addConfigStyle(getDefaults(vars));
|
|
22
|
-
}
|
|
23
|
-
function configureStorage(env) {
|
|
24
|
-
const service = env.get(StorageService);
|
|
25
|
-
service.registerDriver(ReactNativeWebStorageDriver);
|
|
26
|
-
service.defaultDriver = "async-storage";
|
|
27
|
-
}
|
|
28
|
-
function configureNetwork(env) {
|
|
29
|
-
env.set(Network, new NetworkReactNative());
|
|
30
|
-
}
|
|
31
|
-
function configureBle(env) {
|
|
32
|
-
env.set(Ble, new ReactNativeBle());
|
|
33
|
-
}
|
|
34
|
-
function getDefaults(vars) {
|
|
35
|
-
const envName = vars.get("environment", "default");
|
|
36
|
-
return {
|
|
37
|
-
environment: envName
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
export {
|
|
41
|
-
ReactNativeEnvironment,
|
|
42
|
-
getDefaults
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=ReactNativeEnvironment.js.map
|