@matter/react-native 0.11.0-alpha.0-20241005-e3e4e4a7a
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/LICENSE +201 -0
- package/README.md +56 -0
- package/dist/cjs/ble/BleReactNative.d.ts +17 -0
- package/dist/cjs/ble/BleReactNative.d.ts.map +1 -0
- package/dist/cjs/ble/BleReactNative.js +61 -0
- package/dist/cjs/ble/BleReactNative.js.map +6 -0
- package/dist/cjs/ble/BleScanner.d.ts +52 -0
- package/dist/cjs/ble/BleScanner.d.ts.map +1 -0
- package/dist/cjs/ble/BleScanner.js +239 -0
- package/dist/cjs/ble/BleScanner.js.map +6 -0
- package/dist/cjs/ble/ReactNativeBleChannel.d.ts +33 -0
- package/dist/cjs/ble/ReactNativeBleChannel.d.ts.map +1 -0
- package/dist/cjs/ble/ReactNativeBleChannel.js +252 -0
- package/dist/cjs/ble/ReactNativeBleChannel.js.map +6 -0
- package/dist/cjs/ble/ReactNativeBleClient.d.ts +25 -0
- package/dist/cjs/ble/ReactNativeBleClient.d.ts.map +1 -0
- package/dist/cjs/ble/ReactNativeBleClient.js +143 -0
- package/dist/cjs/ble/ReactNativeBleClient.js.map +6 -0
- package/dist/cjs/ble/export.d.ts +8 -0
- package/dist/cjs/ble/export.d.ts.map +1 -0
- package/dist/cjs/ble/export.js +25 -0
- package/dist/cjs/ble/export.js.map +6 -0
- package/dist/cjs/crypto/ReactNativeCrypto.d.ts +12 -0
- package/dist/cjs/crypto/ReactNativeCrypto.d.ts.map +1 -0
- package/dist/cjs/crypto/ReactNativeCrypto.js +95 -0
- package/dist/cjs/crypto/ReactNativeCrypto.js.map +6 -0
- package/dist/cjs/crypto/export.d.ts +7 -0
- package/dist/cjs/crypto/export.d.ts.map +1 -0
- package/dist/cjs/crypto/export.js +24 -0
- package/dist/cjs/crypto/export.js.map +6 -0
- package/dist/cjs/crypto/register.d.ts +7 -0
- package/dist/cjs/crypto/register.d.ts.map +1 -0
- package/dist/cjs/crypto/register.js +15 -0
- package/dist/cjs/crypto/register.js.map +6 -0
- package/dist/cjs/environment/ReactNativeEnvironment.d.ts +16 -0
- package/dist/cjs/environment/ReactNativeEnvironment.d.ts.map +1 -0
- package/dist/cjs/environment/ReactNativeEnvironment.js +60 -0
- package/dist/cjs/environment/ReactNativeEnvironment.js.map +6 -0
- package/dist/cjs/environment/export.d.ts +7 -0
- package/dist/cjs/environment/export.d.ts.map +1 -0
- package/dist/cjs/environment/export.js +24 -0
- package/dist/cjs/environment/export.js.map +6 -0
- package/dist/cjs/environment/register.d.ts +7 -0
- package/dist/cjs/environment/register.d.ts.map +1 -0
- package/dist/cjs/environment/register.js +12 -0
- package/dist/cjs/environment/register.js.map +6 -0
- package/dist/cjs/export.d.ts +9 -0
- package/dist/cjs/export.d.ts.map +1 -0
- package/dist/cjs/export.js +10 -0
- package/dist/cjs/export.js.map +6 -0
- package/dist/cjs/net/NetworkReactNative.d.ts +20 -0
- package/dist/cjs/net/NetworkReactNative.d.ts.map +1 -0
- package/dist/cjs/net/NetworkReactNative.js +173 -0
- package/dist/cjs/net/NetworkReactNative.js.map +6 -0
- package/dist/cjs/net/UdpChannelReactNative.d.ts +39 -0
- package/dist/cjs/net/UdpChannelReactNative.d.ts.map +1 -0
- package/dist/cjs/net/UdpChannelReactNative.js +184 -0
- package/dist/cjs/net/UdpChannelReactNative.js.map +6 -0
- package/dist/cjs/net/export.d.ts +8 -0
- package/dist/cjs/net/export.d.ts.map +1 -0
- package/dist/cjs/net/export.js +35 -0
- package/dist/cjs/net/export.js.map +6 -0
- package/dist/cjs/net/register.d.ts +7 -0
- package/dist/cjs/net/register.d.ts.map +1 -0
- package/dist/cjs/net/register.js +15 -0
- package/dist/cjs/net/register.js.map +6 -0
- package/dist/cjs/package.json +10 -0
- package/dist/cjs/storage/StorageBackendAsyncStorage.d.ts +31 -0
- package/dist/cjs/storage/StorageBackendAsyncStorage.d.ts.map +1 -0
- package/dist/cjs/storage/StorageBackendAsyncStorage.js +142 -0
- package/dist/cjs/storage/StorageBackendAsyncStorage.js.map +6 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/ble/BleReactNative.d.ts +17 -0
- package/dist/esm/ble/BleReactNative.d.ts.map +1 -0
- package/dist/esm/ble/BleReactNative.js +41 -0
- package/dist/esm/ble/BleReactNative.js.map +6 -0
- package/dist/esm/ble/BleScanner.d.ts +52 -0
- package/dist/esm/ble/BleScanner.d.ts.map +1 -0
- package/dist/esm/ble/BleScanner.js +219 -0
- package/dist/esm/ble/BleScanner.js.map +6 -0
- package/dist/esm/ble/ReactNativeBleChannel.d.ts +33 -0
- package/dist/esm/ble/ReactNativeBleChannel.d.ts.map +1 -0
- package/dist/esm/ble/ReactNativeBleChannel.js +257 -0
- package/dist/esm/ble/ReactNativeBleChannel.js.map +6 -0
- package/dist/esm/ble/ReactNativeBleClient.d.ts +25 -0
- package/dist/esm/ble/ReactNativeBleClient.d.ts.map +1 -0
- package/dist/esm/ble/ReactNativeBleClient.js +123 -0
- package/dist/esm/ble/ReactNativeBleClient.js.map +6 -0
- package/dist/esm/ble/export.d.ts +8 -0
- package/dist/esm/ble/export.d.ts.map +1 -0
- package/dist/esm/ble/export.js +8 -0
- package/dist/esm/ble/export.js.map +6 -0
- package/dist/esm/crypto/ReactNativeCrypto.d.ts +12 -0
- package/dist/esm/crypto/ReactNativeCrypto.d.ts.map +1 -0
- package/dist/esm/crypto/ReactNativeCrypto.js +65 -0
- package/dist/esm/crypto/ReactNativeCrypto.js.map +6 -0
- package/dist/esm/crypto/export.d.ts +7 -0
- package/dist/esm/crypto/export.d.ts.map +1 -0
- package/dist/esm/crypto/export.js +7 -0
- package/dist/esm/crypto/export.js.map +6 -0
- package/dist/esm/crypto/register.d.ts +7 -0
- package/dist/esm/crypto/register.d.ts.map +1 -0
- package/dist/esm/crypto/register.js +14 -0
- package/dist/esm/crypto/register.js.map +6 -0
- package/dist/esm/environment/ReactNativeEnvironment.d.ts +16 -0
- package/dist/esm/environment/ReactNativeEnvironment.d.ts.map +1 -0
- package/dist/esm/environment/ReactNativeEnvironment.js +40 -0
- package/dist/esm/environment/ReactNativeEnvironment.js.map +6 -0
- package/dist/esm/environment/export.d.ts +7 -0
- package/dist/esm/environment/export.d.ts.map +1 -0
- package/dist/esm/environment/export.js +7 -0
- package/dist/esm/environment/export.js.map +6 -0
- package/dist/esm/environment/register.d.ts +7 -0
- package/dist/esm/environment/register.d.ts.map +1 -0
- package/dist/esm/environment/register.js +11 -0
- package/dist/esm/environment/register.js.map +6 -0
- package/dist/esm/export.d.ts +9 -0
- package/dist/esm/export.d.ts.map +1 -0
- package/dist/esm/export.js +9 -0
- package/dist/esm/export.js.map +6 -0
- package/dist/esm/net/NetworkReactNative.d.ts +20 -0
- package/dist/esm/net/NetworkReactNative.d.ts.map +1 -0
- package/dist/esm/net/NetworkReactNative.js +151 -0
- package/dist/esm/net/NetworkReactNative.js.map +6 -0
- package/dist/esm/net/UdpChannelReactNative.d.ts +39 -0
- package/dist/esm/net/UdpChannelReactNative.d.ts.map +1 -0
- package/dist/esm/net/UdpChannelReactNative.js +162 -0
- package/dist/esm/net/UdpChannelReactNative.js.map +6 -0
- package/dist/esm/net/export.d.ts +8 -0
- package/dist/esm/net/export.d.ts.map +1 -0
- package/dist/esm/net/export.js +14 -0
- package/dist/esm/net/export.js.map +6 -0
- package/dist/esm/net/register.d.ts +7 -0
- package/dist/esm/net/register.d.ts.map +1 -0
- package/dist/esm/net/register.js +14 -0
- package/dist/esm/net/register.js.map +6 -0
- package/dist/esm/package.json +10 -0
- package/dist/esm/storage/StorageBackendAsyncStorage.d.ts +31 -0
- package/dist/esm/storage/StorageBackendAsyncStorage.d.ts.map +1 -0
- package/dist/esm/storage/StorageBackendAsyncStorage.js +112 -0
- package/dist/esm/storage/StorageBackendAsyncStorage.js.map +6 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +105 -0
- package/src/ble/BleReactNative.ts +45 -0
- package/src/ble/BleScanner.ts +277 -0
- package/src/ble/ReactNativeBleChannel.ts +313 -0
- package/src/ble/ReactNativeBleClient.ts +132 -0
- package/src/ble/export.ts +8 -0
- package/src/crypto/ReactNativeCrypto.ts +108 -0
- package/src/crypto/export.ts +7 -0
- package/src/crypto/register.ts +16 -0
- package/src/environment/ReactNativeEnvironment.ts +53 -0
- package/src/environment/export.ts +7 -0
- package/src/environment/register.ts +16 -0
- package/src/export.ts +11 -0
- package/src/net/NetworkReactNative.ts +190 -0
- package/src/net/UdpChannelReactNative.ts +219 -0
- package/src/net/export.ts +13 -0
- package/src/net/register.ts +17 -0
- package/src/storage/StorageBackendAsyncStorage.ts +145 -0
- package/src/tsconfig.json +17 -0
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { Channel, ChannelType, NetInterface, ServerAddress, TransportInterface } from "#general";
|
|
7
|
+
import { BleChannel, BtpSessionHandler } from "#protocol";
|
|
8
|
+
import { Characteristic, Device } from "react-native-ble-plx";
|
|
9
|
+
export declare class ReactNativeBleCentralInterface implements NetInterface {
|
|
10
|
+
private openChannels;
|
|
11
|
+
private onMatterMessageListener;
|
|
12
|
+
openChannel(address: ServerAddress): Promise<Channel<Uint8Array>>;
|
|
13
|
+
onData(listener: (socket: Channel<Uint8Array>, data: Uint8Array) => void): TransportInterface.Listener;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
supports(type: ChannelType): type is ChannelType.BLE;
|
|
16
|
+
}
|
|
17
|
+
export declare class ReactNativeBleChannel extends BleChannel<Uint8Array> {
|
|
18
|
+
private readonly peripheral;
|
|
19
|
+
private readonly btpSession;
|
|
20
|
+
static create(peripheral: Device, characteristicC1ForWrite: Characteristic, characteristicC2ForSubscribe: Characteristic, onMatterMessageListener: (socket: Channel<Uint8Array>, data: Uint8Array) => void, _additionalCommissioningRelatedData?: Uint8Array): Promise<ReactNativeBleChannel>;
|
|
21
|
+
private connected;
|
|
22
|
+
private disconnectSubscription;
|
|
23
|
+
constructor(peripheral: Device, btpSession: BtpSessionHandler);
|
|
24
|
+
/**
|
|
25
|
+
* Send a Matter message to the connected device - need to do BTP assembly first.
|
|
26
|
+
*
|
|
27
|
+
* @param data
|
|
28
|
+
*/
|
|
29
|
+
send(data: Uint8Array): Promise<void>;
|
|
30
|
+
get name(): string;
|
|
31
|
+
close(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=ReactNativeBleChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeBleChannel.d.ts","sourceRoot":"","sources":["../../../src/ble/ReactNativeBleChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAEH,OAAO,EACP,WAAW,EAGX,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAErB,MAAM,UAAU,CAAC;AAClB,OAAO,EAUH,UAAU,EAIV,iBAAiB,EACpB,MAAM,WAAW,CAAC;AACnB,OAAO,EAEH,cAAc,EACd,MAAM,EAGT,MAAM,sBAAsB,CAAC;AAK9B,qBAAa,8BAA+B,YAAW,YAAY;IAC/D,OAAO,CAAC,YAAY,CAAyC;IAC7D,OAAO,CAAC,uBAAuB,CAAwE;IAEjG,WAAW,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IA6FvE,MAAM,CAAC,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,GAAG,kBAAkB,CAAC,QAAQ;IAOhG,KAAK;IAMX,QAAQ,CAAC,IAAI,EAAE,WAAW;CAG7B;AAED,qBAAa,qBAAsB,SAAQ,UAAU,CAAC,UAAU,CAAC;IAkHzD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;WAlHlB,MAAM,CACf,UAAU,EAAE,MAAM,EAClB,wBAAwB,EAAE,cAAc,EACxC,4BAA4B,EAAE,cAAc,EAC5C,uBAAuB,EAAE,CAAC,MAAM,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,UAAU,KAAK,IAAI,EAChF,mCAAmC,CAAC,EAAE,UAAU,GACjD,OAAO,CAAC,qBAAqB,CAAC;IAuGjC,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,sBAAsB,CAAe;gBAGxB,UAAU,EAAE,MAAM,EAClB,UAAU,EAAE,iBAAiB;IAWlD;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU;IAY3B,IAAI,IAAI,WAEP;IAEK,KAAK;CAKd"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var ReactNativeBleChannel_exports = {};
|
|
20
|
+
__export(ReactNativeBleChannel_exports, {
|
|
21
|
+
ReactNativeBleCentralInterface: () => ReactNativeBleCentralInterface,
|
|
22
|
+
ReactNativeBleChannel: () => ReactNativeBleChannel
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(ReactNativeBleChannel_exports);
|
|
25
|
+
var import_general = require("#general");
|
|
26
|
+
var import_protocol = require("#protocol");
|
|
27
|
+
var import_react_native_ble_plx = require("react-native-ble-plx");
|
|
28
|
+
/**
|
|
29
|
+
* @license
|
|
30
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
31
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
32
|
+
*/
|
|
33
|
+
const logger = import_general.Logger.get("BleChannel");
|
|
34
|
+
class ReactNativeBleCentralInterface {
|
|
35
|
+
openChannels = /* @__PURE__ */ new Map();
|
|
36
|
+
onMatterMessageListener;
|
|
37
|
+
async openChannel(address) {
|
|
38
|
+
if (address.type !== "ble") {
|
|
39
|
+
throw new import_general.InternalError(`Unsupported address type ${address.type}.`);
|
|
40
|
+
}
|
|
41
|
+
if (this.onMatterMessageListener === void 0) {
|
|
42
|
+
throw new import_general.InternalError(`Network Interface was not added to the system yet.`);
|
|
43
|
+
}
|
|
44
|
+
const { peripheral, hasAdditionalAdvertisementData } = import_protocol.Ble.get().getBleScanner().getDiscoveredDevice(address.peripheralAddress);
|
|
45
|
+
if (this.openChannels.has(address)) {
|
|
46
|
+
throw new import_protocol.BleError(
|
|
47
|
+
`Peripheral ${address.peripheralAddress} is already connected. Only one connection supported right now.`
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
logger.debug(`Connect to Peripheral now`);
|
|
51
|
+
let device;
|
|
52
|
+
try {
|
|
53
|
+
device = await peripheral.connect();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
if (error instanceof import_react_native_ble_plx.BleError && error.errorCode === import_react_native_ble_plx.BleErrorCode.DeviceAlreadyConnected) {
|
|
56
|
+
device = peripheral;
|
|
57
|
+
} else {
|
|
58
|
+
throw new import_protocol.BleError(`Error connecting to peripheral: ${error.message}`);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
logger.debug(`Peripheral connected successfully, MTU = ${device.mtu}`);
|
|
62
|
+
device = await device.discoverAllServicesAndCharacteristics();
|
|
63
|
+
const services = await device.services();
|
|
64
|
+
for (const service of services) {
|
|
65
|
+
logger.debug(`found service: ${service.uuid}`);
|
|
66
|
+
if (service.uuid !== import_protocol.BLE_MATTER_SERVICE_UUID) continue;
|
|
67
|
+
const characteristics = await device.characteristicsForService(service.uuid);
|
|
68
|
+
let characteristicC1ForWrite;
|
|
69
|
+
let characteristicC2ForSubscribe;
|
|
70
|
+
let additionalCommissioningRelatedData;
|
|
71
|
+
for (const characteristic of characteristics) {
|
|
72
|
+
logger.debug("found characteristic:", characteristic.uuid);
|
|
73
|
+
switch (characteristic.uuid) {
|
|
74
|
+
case import_protocol.BLE_MATTER_C1_CHARACTERISTIC_UUID:
|
|
75
|
+
logger.debug("found C1 characteristic");
|
|
76
|
+
characteristicC1ForWrite = characteristic;
|
|
77
|
+
break;
|
|
78
|
+
case import_protocol.BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
79
|
+
logger.debug("found C2 characteristic");
|
|
80
|
+
characteristicC2ForSubscribe = characteristic;
|
|
81
|
+
break;
|
|
82
|
+
case import_protocol.BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
83
|
+
logger.debug("found C3 characteristic");
|
|
84
|
+
if (hasAdditionalAdvertisementData) {
|
|
85
|
+
logger.debug("reading additional commissioning related data");
|
|
86
|
+
const characteristicWithValue = await service.readCharacteristic(characteristic.uuid);
|
|
87
|
+
if (characteristicWithValue.value !== null) {
|
|
88
|
+
additionalCommissioningRelatedData = import_general.Bytes.fromBase64(characteristicWithValue.value);
|
|
89
|
+
} else {
|
|
90
|
+
logger.debug("no value in characteristic C3");
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
if (!characteristicC1ForWrite || !characteristicC2ForSubscribe) {
|
|
96
|
+
logger.debug("missing characteristics");
|
|
97
|
+
continue;
|
|
98
|
+
}
|
|
99
|
+
this.openChannels.set(address, peripheral);
|
|
100
|
+
return await ReactNativeBleChannel.create(
|
|
101
|
+
peripheral,
|
|
102
|
+
characteristicC1ForWrite,
|
|
103
|
+
characteristicC2ForSubscribe,
|
|
104
|
+
this.onMatterMessageListener,
|
|
105
|
+
additionalCommissioningRelatedData
|
|
106
|
+
);
|
|
107
|
+
}
|
|
108
|
+
throw new import_protocol.BleError(`No Matter service found on peripheral ${peripheral.id}`);
|
|
109
|
+
}
|
|
110
|
+
onData(listener) {
|
|
111
|
+
this.onMatterMessageListener = listener;
|
|
112
|
+
return {
|
|
113
|
+
close: async () => await this.close()
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
async close() {
|
|
117
|
+
for (const peripheral of this.openChannels.values()) {
|
|
118
|
+
await peripheral.cancelConnection();
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
supports(type) {
|
|
122
|
+
return type === import_general.ChannelType.BLE;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
class ReactNativeBleChannel extends import_protocol.BleChannel {
|
|
126
|
+
constructor(peripheral, btpSession) {
|
|
127
|
+
super();
|
|
128
|
+
this.peripheral = peripheral;
|
|
129
|
+
this.btpSession = btpSession;
|
|
130
|
+
this.disconnectSubscription = peripheral.onDisconnected((error) => {
|
|
131
|
+
logger.debug(`Disconnected from peripheral ${peripheral.id}: ${error}`);
|
|
132
|
+
this.connected = false;
|
|
133
|
+
this.disconnectSubscription.remove();
|
|
134
|
+
void this.btpSession.close();
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
static async create(peripheral, characteristicC1ForWrite, characteristicC2ForSubscribe, onMatterMessageListener, _additionalCommissioningRelatedData) {
|
|
138
|
+
let mtu = peripheral.mtu ?? 0;
|
|
139
|
+
if (mtu > import_protocol.BLE_MAXIMUM_BTP_MTU) {
|
|
140
|
+
mtu = import_protocol.BLE_MAXIMUM_BTP_MTU;
|
|
141
|
+
}
|
|
142
|
+
logger.debug(`Using MTU=${mtu} (Peripheral MTU=${peripheral.mtu})`);
|
|
143
|
+
const btpHandshakeRequest = import_protocol.BtpCodec.encodeBtpHandshakeRequest({
|
|
144
|
+
versions: import_protocol.BTP_SUPPORTED_VERSIONS,
|
|
145
|
+
attMtu: mtu,
|
|
146
|
+
clientWindowSize: import_protocol.BTP_MAXIMUM_WINDOW_SIZE
|
|
147
|
+
});
|
|
148
|
+
logger.debug(`sending BTP handshake request: ${import_general.Logger.toJSON(btpHandshakeRequest)}`);
|
|
149
|
+
characteristicC1ForWrite = await characteristicC1ForWrite.writeWithResponse(
|
|
150
|
+
import_general.Bytes.toBase64(btpHandshakeRequest)
|
|
151
|
+
);
|
|
152
|
+
const btpHandshakeTimeout = import_general.Time.getTimer("BLE handshake timeout", import_protocol.BTP_CONN_RSP_TIMEOUT_MS, async () => {
|
|
153
|
+
await peripheral.cancelConnection();
|
|
154
|
+
logger.debug("Handshake Response not received. Disconnected from peripheral");
|
|
155
|
+
}).start();
|
|
156
|
+
logger.debug("subscribing to C2 characteristic");
|
|
157
|
+
const { promise: handshakeResponseReceivedPromise, resolver } = (0, import_general.createPromise)();
|
|
158
|
+
let handshakeReceived = false;
|
|
159
|
+
const handshakeSubscription = characteristicC2ForSubscribe.monitor((error, characteristic) => {
|
|
160
|
+
if (error !== null || characteristic === null) {
|
|
161
|
+
if (error instanceof import_react_native_ble_plx.BleError && error.errorCode === 2 && handshakeReceived) {
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
logger.debug("Error while monitoring C2 characteristic", error);
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
167
|
+
const characteristicData = characteristic.value;
|
|
168
|
+
if (characteristicData === null) {
|
|
169
|
+
logger.debug("C2 characteristic value is null");
|
|
170
|
+
return;
|
|
171
|
+
}
|
|
172
|
+
const data = import_general.Bytes.fromBase64(characteristicData);
|
|
173
|
+
logger.debug(`received first data on C2: ${import_general.Bytes.toHex(data)}`);
|
|
174
|
+
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
175
|
+
logger.info(`Received Matter handshake response: ${import_general.Bytes.toHex(data)}.`);
|
|
176
|
+
btpHandshakeTimeout.stop();
|
|
177
|
+
resolver(data);
|
|
178
|
+
}
|
|
179
|
+
});
|
|
180
|
+
const handshakeResponse = await handshakeResponseReceivedPromise;
|
|
181
|
+
handshakeReceived = true;
|
|
182
|
+
handshakeSubscription.remove();
|
|
183
|
+
let connectionCloseExpected = false;
|
|
184
|
+
const btpSession = await import_protocol.BtpSessionHandler.createAsCentral(
|
|
185
|
+
new Uint8Array(handshakeResponse),
|
|
186
|
+
// callback to write data to characteristic C1
|
|
187
|
+
async (data) => {
|
|
188
|
+
characteristicC1ForWrite = await characteristicC1ForWrite.writeWithResponse(import_general.Bytes.toBase64(data));
|
|
189
|
+
},
|
|
190
|
+
// callback to disconnect the BLE connection
|
|
191
|
+
async () => {
|
|
192
|
+
connectionCloseExpected = true;
|
|
193
|
+
dataSubscription.remove();
|
|
194
|
+
await peripheral.cancelConnection();
|
|
195
|
+
logger.debug("disconnected from peripheral");
|
|
196
|
+
},
|
|
197
|
+
// callback to forward decoded and de-assembled Matter messages to ExchangeManager
|
|
198
|
+
async (data) => {
|
|
199
|
+
if (onMatterMessageListener === void 0) {
|
|
200
|
+
throw new import_general.InternalError(`No listener registered for Matter messages`);
|
|
201
|
+
}
|
|
202
|
+
onMatterMessageListener(bleChannel, data);
|
|
203
|
+
}
|
|
204
|
+
);
|
|
205
|
+
const dataSubscription = characteristicC2ForSubscribe.monitor((error, characteristic) => {
|
|
206
|
+
if (error !== null || characteristic === null) {
|
|
207
|
+
if (error instanceof import_react_native_ble_plx.BleError && error.errorCode === 2 && connectionCloseExpected) {
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
logger.debug("Error while monitoring C2 characteristic", error);
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
const characteristicData = characteristic.value;
|
|
214
|
+
if (characteristicData === null) {
|
|
215
|
+
logger.debug("C2 characteristic value is null");
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
const data = import_general.Bytes.fromBase64(characteristicData);
|
|
219
|
+
logger.debug(`received data on C2: ${import_general.Bytes.toHex(data)}`);
|
|
220
|
+
void btpSession.handleIncomingBleData(new Uint8Array(data));
|
|
221
|
+
});
|
|
222
|
+
const bleChannel = new ReactNativeBleChannel(peripheral, btpSession);
|
|
223
|
+
return bleChannel;
|
|
224
|
+
}
|
|
225
|
+
connected = true;
|
|
226
|
+
disconnectSubscription;
|
|
227
|
+
/**
|
|
228
|
+
* Send a Matter message to the connected device - need to do BTP assembly first.
|
|
229
|
+
*
|
|
230
|
+
* @param data
|
|
231
|
+
*/
|
|
232
|
+
async send(data) {
|
|
233
|
+
if (!this.connected) {
|
|
234
|
+
logger.debug("Cannot send data because not connected to peripheral.");
|
|
235
|
+
return;
|
|
236
|
+
}
|
|
237
|
+
if (this.btpSession === void 0) {
|
|
238
|
+
throw new import_protocol.BtpFlowError(`Cannot send data, no BTP session initialized`);
|
|
239
|
+
}
|
|
240
|
+
await this.btpSession.sendMatterMessage(data);
|
|
241
|
+
}
|
|
242
|
+
// Channel<Uint8Array>
|
|
243
|
+
get name() {
|
|
244
|
+
return `ble://${this.peripheral.id}`;
|
|
245
|
+
}
|
|
246
|
+
async close() {
|
|
247
|
+
await this.btpSession.close();
|
|
248
|
+
this.disconnectSubscription.remove();
|
|
249
|
+
await this.peripheral.cancelConnection();
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
//# sourceMappingURL=ReactNativeBleChannel.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ble/ReactNativeBleChannel.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["ReactNativeBleError"]
|
|
6
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { MatterError } from "#general";
|
|
7
|
+
import { Device } from "react-native-ble-plx";
|
|
8
|
+
export declare class BluetoothUnauthorizedError extends MatterError {
|
|
9
|
+
}
|
|
10
|
+
export declare class BluetoothUnsupportedError extends MatterError {
|
|
11
|
+
}
|
|
12
|
+
export declare class ReactNativeBleClient {
|
|
13
|
+
private readonly bleManager;
|
|
14
|
+
private readonly discoveredPeripherals;
|
|
15
|
+
private shouldScan;
|
|
16
|
+
private isScanning;
|
|
17
|
+
private bleState;
|
|
18
|
+
private deviceDiscoveredCallback;
|
|
19
|
+
constructor();
|
|
20
|
+
setDiscoveryCallback(callback: (peripheral: Device, manufacturerData: Uint8Array) => void): void;
|
|
21
|
+
startScanning(): Promise<void>;
|
|
22
|
+
stopScanning(): Promise<void>;
|
|
23
|
+
private handleDiscoveredDevice;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ReactNativeBleClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeBleClient.d.ts","sourceRoot":"","sources":["../../../src/ble/ReactNativeBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAiB,WAAW,EAAE,MAAM,UAAU,CAAC;AAEtD,OAAO,EAA+D,MAAM,EAAE,MAAM,sBAAsB,CAAC;AAI3G,qBAAa,0BAA2B,SAAQ,WAAW;CAAG;AAC9D,qBAAa,yBAA0B,SAAQ,WAAW;CAAG;AAE7D,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAoB;IAC/C,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAA4E;IAClH,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAA0B;IAC1C,OAAO,CAAC,wBAAwB,CAA2E;;IAqCpG,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOnF,aAAa;IA6Bb,YAAY;IAOzB,OAAO,CAAC,sBAAsB;CA8BjC"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __export = (target, all) => {
|
|
7
|
+
for (var name in all)
|
|
8
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
9
|
+
};
|
|
10
|
+
var __copyProps = (to, from, except, desc) => {
|
|
11
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
12
|
+
for (let key of __getOwnPropNames(from))
|
|
13
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
14
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
15
|
+
}
|
|
16
|
+
return to;
|
|
17
|
+
};
|
|
18
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
19
|
+
var ReactNativeBleClient_exports = {};
|
|
20
|
+
__export(ReactNativeBleClient_exports, {
|
|
21
|
+
BluetoothUnauthorizedError: () => BluetoothUnauthorizedError,
|
|
22
|
+
BluetoothUnsupportedError: () => BluetoothUnsupportedError,
|
|
23
|
+
ReactNativeBleClient: () => ReactNativeBleClient
|
|
24
|
+
});
|
|
25
|
+
module.exports = __toCommonJS(ReactNativeBleClient_exports);
|
|
26
|
+
var import_general = require("#general");
|
|
27
|
+
var import_protocol = require("#protocol");
|
|
28
|
+
var import_react_native_ble_plx = require("react-native-ble-plx");
|
|
29
|
+
/**
|
|
30
|
+
* @license
|
|
31
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
32
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
33
|
+
*/
|
|
34
|
+
const logger = import_general.Logger.get("ReactNativeBleClient");
|
|
35
|
+
class BluetoothUnauthorizedError extends import_general.MatterError {
|
|
36
|
+
}
|
|
37
|
+
class BluetoothUnsupportedError extends import_general.MatterError {
|
|
38
|
+
}
|
|
39
|
+
class ReactNativeBleClient {
|
|
40
|
+
bleManager = new import_react_native_ble_plx.BleManager();
|
|
41
|
+
discoveredPeripherals = /* @__PURE__ */ new Map();
|
|
42
|
+
shouldScan = false;
|
|
43
|
+
isScanning = false;
|
|
44
|
+
bleState = import_react_native_ble_plx.State.Unknown;
|
|
45
|
+
deviceDiscoveredCallback;
|
|
46
|
+
constructor() {
|
|
47
|
+
const subscription = this.bleManager.onStateChange((state) => {
|
|
48
|
+
this.bleState = state;
|
|
49
|
+
logger.debug(`BLE state changed to ${state}`);
|
|
50
|
+
switch (state) {
|
|
51
|
+
case import_react_native_ble_plx.State.PoweredOff:
|
|
52
|
+
this.bleManager.enable().catch((error) => {
|
|
53
|
+
subscription.remove();
|
|
54
|
+
if (error instanceof import_react_native_ble_plx.BleError && error.errorCode === import_react_native_ble_plx.BleErrorCode.BluetoothUnauthorized) {
|
|
55
|
+
throw new BluetoothUnauthorizedError("Bluetooth is unauthorized");
|
|
56
|
+
}
|
|
57
|
+
throw error;
|
|
58
|
+
});
|
|
59
|
+
break;
|
|
60
|
+
case import_react_native_ble_plx.State.PoweredOn:
|
|
61
|
+
subscription.remove();
|
|
62
|
+
if (this.shouldScan) {
|
|
63
|
+
void this.startScanning();
|
|
64
|
+
}
|
|
65
|
+
break;
|
|
66
|
+
case import_react_native_ble_plx.State.Unauthorized:
|
|
67
|
+
subscription.remove();
|
|
68
|
+
throw new BluetoothUnauthorizedError("Bluetooth is unauthorized");
|
|
69
|
+
case import_react_native_ble_plx.State.Unsupported:
|
|
70
|
+
subscription.remove();
|
|
71
|
+
throw new BluetoothUnsupportedError("Bluetooth is unsupported");
|
|
72
|
+
default:
|
|
73
|
+
logger.error("Unexpected BLE state", state);
|
|
74
|
+
subscription.remove();
|
|
75
|
+
void this.stopScanning();
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
79
|
+
setDiscoveryCallback(callback) {
|
|
80
|
+
this.deviceDiscoveredCallback = callback;
|
|
81
|
+
for (const { peripheral, matterServiceData } of this.discoveredPeripherals.values()) {
|
|
82
|
+
this.deviceDiscoveredCallback(peripheral, matterServiceData);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async startScanning() {
|
|
86
|
+
if (this.isScanning) return;
|
|
87
|
+
this.shouldScan = true;
|
|
88
|
+
if (this.bleState === import_react_native_ble_plx.State.PoweredOn) {
|
|
89
|
+
logger.debug("Start BLE scanning for Matter Services ...");
|
|
90
|
+
this.isScanning = true;
|
|
91
|
+
await this.bleManager.startDeviceScan([import_protocol.BLE_MATTER_SERVICE_UUID], {}, (error, peripheral) => {
|
|
92
|
+
if (error !== null || peripheral === null) {
|
|
93
|
+
this.isScanning = false;
|
|
94
|
+
logger.error("Error while scanning for BLE devices", error);
|
|
95
|
+
if (this.shouldScan) {
|
|
96
|
+
this.startScanning().catch(
|
|
97
|
+
(error2) => logger.error("Error while restarting scanning after error", error2)
|
|
98
|
+
);
|
|
99
|
+
} else {
|
|
100
|
+
this.stopScanning().catch(
|
|
101
|
+
(error2) => logger.error("Error while stopping scanning after error", error2)
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
this.handleDiscoveredDevice(peripheral);
|
|
107
|
+
});
|
|
108
|
+
} else {
|
|
109
|
+
logger.debug("ble state is not poweredOn ... delay scanning till poweredOn");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async stopScanning() {
|
|
113
|
+
this.shouldScan = false;
|
|
114
|
+
logger.debug("Stop BLE scanning for Matter Services ...");
|
|
115
|
+
await this.bleManager.stopDeviceScan();
|
|
116
|
+
this.isScanning = false;
|
|
117
|
+
}
|
|
118
|
+
handleDiscoveredDevice(peripheral) {
|
|
119
|
+
logger.debug(
|
|
120
|
+
`Found peripheral ${peripheral.id} (${peripheral.localName}) with serviceData ${import_general.Logger.toJSON(peripheral.serviceData)}`
|
|
121
|
+
);
|
|
122
|
+
if (!peripheral.isConnectable) {
|
|
123
|
+
logger.info(`Peripheral ${peripheral.id} is not connectable ... ignoring`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const matterServiceDataBase64 = peripheral.serviceData?.[import_protocol.BLE_MATTER_SERVICE_UUID];
|
|
127
|
+
if (matterServiceDataBase64 === void 0) {
|
|
128
|
+
logger.info(`Peripheral ${peripheral.id} does not advertise Matter Service ... ignoring`);
|
|
129
|
+
return;
|
|
130
|
+
}
|
|
131
|
+
const matterServiceData = import_general.Bytes.fromBase64(matterServiceDataBase64);
|
|
132
|
+
if (matterServiceData.length !== 8) {
|
|
133
|
+
logger.info(`Peripheral ${peripheral.id} does not advertise Matter Service ... ignoring`);
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
this.discoveredPeripherals.set(peripheral.id, {
|
|
137
|
+
peripheral,
|
|
138
|
+
matterServiceData
|
|
139
|
+
});
|
|
140
|
+
this.deviceDiscoveredCallback?.(peripheral, matterServiceData);
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=ReactNativeBleClient.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/ble/ReactNativeBleClient.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": ["BluetoothState", "error"]
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"export.d.ts","sourceRoot":"","sources":["../../../src/ble/export.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __defProp = Object.defineProperty;
|
|
3
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
4
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
5
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
6
|
+
var __copyProps = (to, from, except, desc) => {
|
|
7
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
8
|
+
for (let key of __getOwnPropNames(from))
|
|
9
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
10
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
11
|
+
}
|
|
12
|
+
return to;
|
|
13
|
+
};
|
|
14
|
+
var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
|
|
15
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
16
|
+
var export_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(export_exports);
|
|
18
|
+
__reExport(export_exports, require("./BleReactNative.js"), module.exports);
|
|
19
|
+
__reExport(export_exports, require("./BleScanner.js"), module.exports);
|
|
20
|
+
/**
|
|
21
|
+
* @license
|
|
22
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
23
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
24
|
+
*/
|
|
25
|
+
//# sourceMappingURL=export.js.map
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { CryptoDsaEncoding } from "#general";
|
|
7
|
+
import { NodeJsCrypto } from "#nodejs";
|
|
8
|
+
export declare class CryptoReactNative extends NodeJsCrypto {
|
|
9
|
+
sign(privateKey: JsonWebKey, data: Uint8Array | Uint8Array[], dsaEncoding?: CryptoDsaEncoding): Uint8Array;
|
|
10
|
+
verify(publicKey: JsonWebKey, data: Uint8Array, signature: Uint8Array, dsaEncoding?: CryptoDsaEncoding): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=ReactNativeCrypto.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ReactNativeCrypto.d.ts","sourceRoot":"","sources":["../../../src/crypto/ReactNativeCrypto.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,OAAO,EAAyB,iBAAiB,EAAqB,MAAM,UAAU,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAqDvC,qBAAa,iBAAkB,SAAQ,YAAY;IACtC,IAAI,CACT,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,UAAU,GAAG,UAAU,EAAE,EAC/B,WAAW,GAAE,iBAAgC,GAC9C,UAAU;IAkBJ,MAAM,CACX,SAAS,EAAE,UAAU,EACrB,IAAI,EAAE,UAAU,EAChB,SAAS,EAAE,UAAU,EACrB,WAAW,GAAE,iBAAgC;CAgBpD"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __export = (target, all) => {
|
|
9
|
+
for (var name in all)
|
|
10
|
+
__defProp(target, name, { get: all[name], enumerable: true });
|
|
11
|
+
};
|
|
12
|
+
var __copyProps = (to, from, except, desc) => {
|
|
13
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
14
|
+
for (let key of __getOwnPropNames(from))
|
|
15
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
16
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
17
|
+
}
|
|
18
|
+
return to;
|
|
19
|
+
};
|
|
20
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
21
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
22
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
23
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
24
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
25
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
26
|
+
mod
|
|
27
|
+
));
|
|
28
|
+
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
29
|
+
var ReactNativeCrypto_exports = {};
|
|
30
|
+
__export(ReactNativeCrypto_exports, {
|
|
31
|
+
CryptoReactNative: () => CryptoReactNative
|
|
32
|
+
});
|
|
33
|
+
module.exports = __toCommonJS(ReactNativeCrypto_exports);
|
|
34
|
+
var import_react_native_quick_crypto = require("react-native-quick-crypto");
|
|
35
|
+
var import_general = require("#general");
|
|
36
|
+
var import_nodejs = require("#nodejs");
|
|
37
|
+
var import_jwk_to_pem = __toESM(require("jwk-to-pem"), 1);
|
|
38
|
+
/**
|
|
39
|
+
* @license
|
|
40
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
41
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
42
|
+
*/
|
|
43
|
+
(0, import_react_native_quick_crypto.install)();
|
|
44
|
+
crypto.hkdf = (digest, ikm, salt, info, keylen) => {
|
|
45
|
+
const hashlen = parseInt(digest.substr(3), 10) >> 3 || 20;
|
|
46
|
+
const prk = crypto.createHmac(digest, salt.byteLength ? salt : new Uint8Array(hashlen)).update(ikm).digest();
|
|
47
|
+
const N = Math.ceil(keylen / hashlen);
|
|
48
|
+
const T = new Uint8Array(hashlen * N + info.byteLength + 1);
|
|
49
|
+
let prev = 0;
|
|
50
|
+
let start = 0;
|
|
51
|
+
for (let c = 1; c <= N; c++) {
|
|
52
|
+
T.set(info, start);
|
|
53
|
+
T[start + info.byteLength] = c;
|
|
54
|
+
T.set(
|
|
55
|
+
crypto.createHmac(digest, prk).update(T.subarray(prev, start + info.byteLength + 1)).digest(),
|
|
56
|
+
start
|
|
57
|
+
);
|
|
58
|
+
prev = start;
|
|
59
|
+
start += hashlen;
|
|
60
|
+
}
|
|
61
|
+
return T.slice(0, keylen);
|
|
62
|
+
};
|
|
63
|
+
class CryptoReactNative extends import_nodejs.NodeJsCrypto {
|
|
64
|
+
sign(privateKey, data, dsaEncoding = "ieee-p1363") {
|
|
65
|
+
const signer = crypto.createSign(import_general.CRYPTO_HASH_ALGORITHM);
|
|
66
|
+
if (Array.isArray(data)) {
|
|
67
|
+
data.forEach((chunk) => signer.update(chunk));
|
|
68
|
+
} else {
|
|
69
|
+
signer.update(data);
|
|
70
|
+
}
|
|
71
|
+
return new Uint8Array(
|
|
72
|
+
signer.sign({
|
|
73
|
+
key: (0, import_jwk_to_pem.default)(privateKey, { private: true }),
|
|
74
|
+
format: "pem",
|
|
75
|
+
type: "pkcs8",
|
|
76
|
+
dsaEncoding
|
|
77
|
+
})
|
|
78
|
+
);
|
|
79
|
+
}
|
|
80
|
+
verify(publicKey, data, signature, dsaEncoding = "ieee-p1363") {
|
|
81
|
+
const verifier = crypto.createVerify(import_general.CRYPTO_HASH_ALGORITHM);
|
|
82
|
+
verifier.update(data);
|
|
83
|
+
const success = verifier.verify(
|
|
84
|
+
{
|
|
85
|
+
key: (0, import_jwk_to_pem.default)(publicKey),
|
|
86
|
+
format: "pem",
|
|
87
|
+
type: "spki",
|
|
88
|
+
dsaEncoding
|
|
89
|
+
},
|
|
90
|
+
signature
|
|
91
|
+
);
|
|
92
|
+
if (!success) throw new import_general.CryptoVerifyError("Signature verification failed");
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=ReactNativeCrypto.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../src/crypto/ReactNativeCrypto.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,uCAAwB;AAIxB,qBAA4E;AAC5E,oBAA6B;AAC7B,wBAAoB;AAZpB;AAAA;AAAA;AAAA;AAAA;AAAA,IAQA,0CAAQ;AAOR,OAAO,OAAO,CACV,QACA,KACA,MACA,MACA,WACC;AACD,QAAM,UAAU,SAAS,OAAO,OAAO,CAAC,GAAG,EAAE,KAAK,KAAK;AACvD,QAAM,MAAM,OAEP,WAAW,QAAQ,KAAK,aAAa,OAAO,IAAI,WAAW,OAAO,CAAC,EACnE,OAAO,GAAG,EACV,OAAO;AASZ,QAAM,IAAI,KAAK,KAAK,SAAS,OAAO;AAIpC,QAAM,IAAI,IAAI,WAAW,UAAU,IAAI,KAAK,aAAa,CAAC;AAC1D,MAAI,OAAO;AACX,MAAI,QAAQ;AACZ,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AACzB,MAAE,IAAI,MAAM,KAAK;AACjB,MAAE,QAAQ,KAAK,UAAU,IAAI;AAE7B,MAAE;AAAA,MACE,OAEK,WAAW,QAAQ,GAAG,EACtB,OAAO,EAAE,SAAS,MAAM,QAAQ,KAAK,aAAa,CAAC,CAAC,EACpD,OAAO;AAAA,MACZ;AAAA,IACJ;AAEA,WAAO;AACP,aAAS;AAAA,EACb;AAGA,SAAO,EAAE,MAAM,GAAG,MAAM;AAC5B;AAEO,MAAM,0BAA0B,2BAAa;AAAA,EACvC,KACL,YACA,MACA,cAAiC,cACvB;AAEV,UAAM,SAAS,OAAO,WAAW,oCAAqB;AACtD,QAAI,MAAM,QAAQ,IAAI,GAAG;AACrB,WAAK,QAAQ,WAAS,OAAO,OAAO,KAAK,CAAC;AAAA,IAC9C,OAAO;AACH,aAAO,OAAO,IAAI;AAAA,IACtB;AACA,WAAO,IAAI;AAAA,MACP,OAAO,KAAK;AAAA,QACR,SAAK,kBAAAA,SAAQ,YAA2B,EAAE,SAAS,KAAK,CAAC;AAAA,QACzD,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,MACJ,CAAC;AAAA,IACL;AAAA,EACJ;AAAA,EAES,OACL,WACA,MACA,WACA,cAAiC,cACnC;AAEE,UAAM,WAAW,OAAO,aAAa,oCAAqB;AAC1D,aAAS,OAAO,IAAI;AACpB,UAAM,UAAU,SAAS;AAAA,MACrB;AAAA,QACI,SAAK,kBAAAA,SAAQ,SAAwB;AAAA,QACrC,QAAQ;AAAA,QACR,MAAM;AAAA,QACN;AAAA,MACJ;AAAA,MACA;AAAA,IACJ;AACA,QAAI,CAAC,QAAS,OAAM,IAAI,iCAAkB,+BAA+B;AAAA,EAC7E;AACJ;",
|
|
5
|
+
"names": ["jwk2pem"]
|
|
6
|
+
}
|