@matter/nodejs-ble 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 +55 -0
- package/dist/cjs/BleBroadcaster.d.ts +20 -0
- package/dist/cjs/BleBroadcaster.d.ts.map +1 -0
- package/dist/cjs/BleBroadcaster.js +121 -0
- package/dist/cjs/BleBroadcaster.js.map +6 -0
- package/dist/cjs/BlePeripheralInterface.d.ts +15 -0
- package/dist/cjs/BlePeripheralInterface.d.ts.map +1 -0
- package/dist/cjs/BlePeripheralInterface.js +54 -0
- package/dist/cjs/BlePeripheralInterface.js.map +6 -0
- package/dist/cjs/BleScanner.d.ts +52 -0
- package/dist/cjs/BleScanner.d.ts.map +1 -0
- package/dist/cjs/BleScanner.js +240 -0
- package/dist/cjs/BleScanner.js.map +6 -0
- package/dist/cjs/BlenoBleServer.d.ts +70 -0
- package/dist/cjs/BlenoBleServer.d.ts.map +1 -0
- package/dist/cjs/BlenoBleServer.js +337 -0
- package/dist/cjs/BlenoBleServer.js.map +6 -0
- package/dist/cjs/NobleBleChannel.d.ts +32 -0
- package/dist/cjs/NobleBleChannel.d.ts.map +1 -0
- package/dist/cjs/NobleBleChannel.js +266 -0
- package/dist/cjs/NobleBleChannel.js.map +6 -0
- package/dist/cjs/NobleBleClient.d.ts +20 -0
- package/dist/cjs/NobleBleClient.d.ts.map +1 -0
- package/dist/cjs/NobleBleClient.js +108 -0
- package/dist/cjs/NobleBleClient.js.map +6 -0
- package/dist/cjs/NodeJsBle.d.ts +22 -0
- package/dist/cjs/NodeJsBle.d.ts.map +1 -0
- package/dist/cjs/NodeJsBle.js +68 -0
- package/dist/cjs/NodeJsBle.js.map +6 -0
- package/dist/cjs/index.d.ts +9 -0
- package/dist/cjs/index.d.ts.map +1 -0
- package/dist/cjs/index.js +26 -0
- package/dist/cjs/index.js.map +6 -0
- package/dist/cjs/package.json +3 -0
- package/dist/cjs/tsconfig.tsbuildinfo +1 -0
- package/dist/esm/BleBroadcaster.d.ts +20 -0
- package/dist/esm/BleBroadcaster.d.ts.map +1 -0
- package/dist/esm/BleBroadcaster.js +101 -0
- package/dist/esm/BleBroadcaster.js.map +6 -0
- package/dist/esm/BlePeripheralInterface.d.ts +15 -0
- package/dist/esm/BlePeripheralInterface.d.ts.map +1 -0
- package/dist/esm/BlePeripheralInterface.js +34 -0
- package/dist/esm/BlePeripheralInterface.js.map +6 -0
- package/dist/esm/BleScanner.d.ts +52 -0
- package/dist/esm/BleScanner.d.ts.map +1 -0
- package/dist/esm/BleScanner.js +220 -0
- package/dist/esm/BleScanner.js.map +6 -0
- package/dist/esm/BlenoBleServer.d.ts +70 -0
- package/dist/esm/BlenoBleServer.d.ts.map +1 -0
- package/dist/esm/BlenoBleServer.js +327 -0
- package/dist/esm/BlenoBleServer.js.map +6 -0
- package/dist/esm/NobleBleChannel.d.ts +32 -0
- package/dist/esm/NobleBleChannel.d.ts.map +1 -0
- package/dist/esm/NobleBleChannel.js +266 -0
- package/dist/esm/NobleBleChannel.js.map +6 -0
- package/dist/esm/NobleBleClient.d.ts +20 -0
- package/dist/esm/NobleBleClient.d.ts.map +1 -0
- package/dist/esm/NobleBleClient.js +88 -0
- package/dist/esm/NobleBleClient.js.map +6 -0
- package/dist/esm/NodeJsBle.d.ts +22 -0
- package/dist/esm/NodeJsBle.d.ts.map +1 -0
- package/dist/esm/NodeJsBle.js +48 -0
- package/dist/esm/NodeJsBle.js.map +6 -0
- package/dist/esm/index.d.ts +9 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +9 -0
- package/dist/esm/index.js.map +6 -0
- package/dist/esm/package.json +3 -0
- package/dist/esm/tsconfig.tsbuildinfo +1 -0
- package/package.json +83 -0
- package/require/package.json +4 -0
- package/require/require.cjs +1 -0
- package/require/require.d.ts +1 -0
- package/require/require.mjs +3 -0
- package/src/BleBroadcaster.ts +126 -0
- package/src/BlePeripheralInterface.ts +36 -0
- package/src/BleScanner.ts +279 -0
- package/src/BlenoBleServer.ts +403 -0
- package/src/NobleBleChannel.ts +337 -0
- package/src/NobleBleClient.ts +117 -0
- package/src/NodeJsBle.ts +56 -0
- package/src/index.ts +9 -0
- package/src/tsconfig.json +16 -0
|
@@ -0,0 +1,32 @@
|
|
|
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 "@matter/general";
|
|
7
|
+
import { BleChannel, BtpSessionHandler } from "@project-chip/matter.js/ble";
|
|
8
|
+
import type { Characteristic, Peripheral } from "@stoprocent/noble";
|
|
9
|
+
export declare class NobleBleCentralInterface implements NetInterface {
|
|
10
|
+
private openChannels;
|
|
11
|
+
private onMatterMessageListener;
|
|
12
|
+
openChannel(address: ServerAddress, tryCount?: number): Promise<Channel<Uint8Array>>;
|
|
13
|
+
onData(listener: (socket: Channel<Uint8Array>, data: Uint8Array) => void): TransportInterface.Listener;
|
|
14
|
+
close(): Promise<void>;
|
|
15
|
+
supports(type: ChannelType, _address?: string): boolean;
|
|
16
|
+
}
|
|
17
|
+
export declare class NobleBleChannel extends BleChannel<Uint8Array> {
|
|
18
|
+
private readonly peripheral;
|
|
19
|
+
private readonly btpSession;
|
|
20
|
+
static create(peripheral: Peripheral, characteristicC1ForWrite: Characteristic, characteristicC2ForSubscribe: Characteristic, onMatterMessageListener: (socket: Channel<Uint8Array>, data: Uint8Array) => void, _additionalCommissioningRelatedData?: Uint8Array): Promise<NobleBleChannel>;
|
|
21
|
+
private connected;
|
|
22
|
+
constructor(peripheral: Peripheral, btpSession: BtpSessionHandler);
|
|
23
|
+
/**
|
|
24
|
+
* Send a Matter message to the connected device - need to do BTP assembly first.
|
|
25
|
+
*
|
|
26
|
+
* @param data
|
|
27
|
+
*/
|
|
28
|
+
send(data: Uint8Array): Promise<void>;
|
|
29
|
+
get name(): string;
|
|
30
|
+
close(): Promise<void>;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=NobleBleChannel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleBleChannel.d.ts","sourceRoot":"","sources":["../../src/NobleBleChannel.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EACH,OAAO,EACP,WAAW,EAGX,YAAY,EACZ,aAAa,EAEb,kBAAkB,EAErB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAUH,UAAU,EAGV,iBAAiB,EACpB,MAAM,6BAA6B,CAAC;AAErC,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AA6BpE,qBAAa,wBAAyB,YAAW,YAAY;IACzD,OAAO,CAAC,YAAY,CAA6C;IACjE,OAAO,CAAC,uBAAuB,CAAwE;IAEvG,WAAW,CAAC,OAAO,EAAE,aAAa,EAAE,QAAQ,SAAI,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;IAwI/E,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,EAAE,QAAQ,CAAC,EAAE,MAAM;CAMhD;AAED,qBAAa,eAAgB,SAAQ,UAAU,CAAC,UAAU,CAAC;IA6EnD,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,UAAU;WA7ElB,MAAM,CACf,UAAU,EAAE,UAAU,EACtB,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,eAAe,CAAC;IAmE3B,OAAO,CAAC,SAAS,CAAQ;gBAGJ,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,iBAAiB;IAUlD;;;;OAIG;IACG,IAAI,CAAC,IAAI,EAAE,UAAU;IAY3B,IAAI,IAAI,WAEP;IAEK,KAAK;CAId"}
|
|
@@ -0,0 +1,266 @@
|
|
|
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 NobleBleChannel_exports = {};
|
|
20
|
+
__export(NobleBleChannel_exports, {
|
|
21
|
+
NobleBleCentralInterface: () => NobleBleCentralInterface,
|
|
22
|
+
NobleBleChannel: () => NobleBleChannel
|
|
23
|
+
});
|
|
24
|
+
module.exports = __toCommonJS(NobleBleChannel_exports);
|
|
25
|
+
var import_general = require("@matter/general");
|
|
26
|
+
var import_ble = require("@project-chip/matter.js/ble");
|
|
27
|
+
var import_codec = require("@project-chip/matter.js/codec");
|
|
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
|
+
function nobleUuidToUuid(uuid) {
|
|
35
|
+
uuid = uuid.toUpperCase();
|
|
36
|
+
if (uuid.length !== 32) {
|
|
37
|
+
return uuid;
|
|
38
|
+
}
|
|
39
|
+
const parts = [
|
|
40
|
+
uuid.substring(0, 8),
|
|
41
|
+
uuid.substring(8, 12),
|
|
42
|
+
uuid.substring(12, 16),
|
|
43
|
+
uuid.substring(16, 20),
|
|
44
|
+
uuid.substring(20, 32)
|
|
45
|
+
];
|
|
46
|
+
return parts.join("-");
|
|
47
|
+
}
|
|
48
|
+
class NobleBleCentralInterface {
|
|
49
|
+
openChannels = /* @__PURE__ */ new Map();
|
|
50
|
+
onMatterMessageListener;
|
|
51
|
+
openChannel(address, tryCount = 1) {
|
|
52
|
+
return new Promise((resolve, reject) => {
|
|
53
|
+
if (this.onMatterMessageListener === void 0) {
|
|
54
|
+
reject(new import_general.InternalError(`Network Interface was not added to the system yet.`));
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
if (address.type !== "ble") {
|
|
58
|
+
reject(new import_general.InternalError(`Unsupported address type ${address.type}.`));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const { peripheral, hasAdditionalAdvertisementData } = import_ble.Ble.get().getBleScanner().getDiscoveredDevice(address.peripheralAddress);
|
|
62
|
+
if (tryCount > 3) {
|
|
63
|
+
reject(new import_ble.BleError(`Failed to connect to peripheral ${peripheral.address}`));
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
logger.debug("BLE peripheral state", peripheral.state);
|
|
67
|
+
if (peripheral.state === "connected" || peripheral.state === "connecting") {
|
|
68
|
+
reject(
|
|
69
|
+
new import_ble.BleError(
|
|
70
|
+
`Peripheral ${address.peripheralAddress} is already connected or connecting. Only one connection supported right now.`
|
|
71
|
+
)
|
|
72
|
+
);
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
75
|
+
if (this.openChannels.has(address)) {
|
|
76
|
+
reject(
|
|
77
|
+
new import_ble.BleError(
|
|
78
|
+
`Peripheral ${address.peripheralAddress} is already connected. Only one connection supported right now.`
|
|
79
|
+
)
|
|
80
|
+
);
|
|
81
|
+
return;
|
|
82
|
+
}
|
|
83
|
+
if (peripheral.state !== "disconnected") {
|
|
84
|
+
peripheral.disconnectAsync().then(() => this.openChannel(address, tryCount), reject);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
peripheral.once("connect", async () => {
|
|
88
|
+
if (this.onMatterMessageListener === void 0) {
|
|
89
|
+
reject(new import_general.InternalError(`Network Interface was not added to the system yet.`));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const services = await peripheral.discoverServicesAsync([import_ble.BLE_MATTER_SERVICE_UUID]);
|
|
93
|
+
logger.debug(`Found services: ${services.map((s) => s.uuid).join(", ")}`);
|
|
94
|
+
for (const service of services) {
|
|
95
|
+
logger.debug(`found service: ${service.uuid}`);
|
|
96
|
+
if (service.uuid !== import_ble.BLE_MATTER_SERVICE_UUID) continue;
|
|
97
|
+
const characteristics = await service.discoverCharacteristicsAsync();
|
|
98
|
+
let characteristicC1ForWrite;
|
|
99
|
+
let characteristicC2ForSubscribe;
|
|
100
|
+
let additionalCommissioningRelatedData;
|
|
101
|
+
for (const characteristic of characteristics) {
|
|
102
|
+
logger.debug("found characteristic:", characteristic.uuid, characteristic.properties);
|
|
103
|
+
switch (nobleUuidToUuid(characteristic.uuid)) {
|
|
104
|
+
case import_ble.BLE_MATTER_C1_CHARACTERISTIC_UUID:
|
|
105
|
+
logger.debug("found C1 characteristic");
|
|
106
|
+
characteristicC1ForWrite = characteristic;
|
|
107
|
+
break;
|
|
108
|
+
case import_ble.BLE_MATTER_C2_CHARACTERISTIC_UUID:
|
|
109
|
+
logger.debug("found C2 characteristic");
|
|
110
|
+
characteristicC2ForSubscribe = characteristic;
|
|
111
|
+
break;
|
|
112
|
+
case import_ble.BLE_MATTER_C3_CHARACTERISTIC_UUID:
|
|
113
|
+
logger.debug("found C3 characteristic");
|
|
114
|
+
if (hasAdditionalAdvertisementData) {
|
|
115
|
+
logger.debug("reading additional commissioning related data");
|
|
116
|
+
const data = await characteristic.readAsync();
|
|
117
|
+
additionalCommissioningRelatedData = new Uint8Array(data);
|
|
118
|
+
logger.debug("additional data", data);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
if (!characteristicC1ForWrite || !characteristicC2ForSubscribe) {
|
|
123
|
+
logger.debug("missing characteristics");
|
|
124
|
+
continue;
|
|
125
|
+
}
|
|
126
|
+
peripheral.removeAllListeners("disconnect");
|
|
127
|
+
this.openChannels.set(address, peripheral);
|
|
128
|
+
resolve(
|
|
129
|
+
await NobleBleChannel.create(
|
|
130
|
+
peripheral,
|
|
131
|
+
characteristicC1ForWrite,
|
|
132
|
+
characteristicC2ForSubscribe,
|
|
133
|
+
this.onMatterMessageListener,
|
|
134
|
+
additionalCommissioningRelatedData
|
|
135
|
+
)
|
|
136
|
+
);
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
peripheral.removeAllListeners("disconnect");
|
|
140
|
+
reject(new import_ble.BleError(`Peripheral ${peripheral.address} does not have the required characteristics`));
|
|
141
|
+
});
|
|
142
|
+
const reTryHandler = async (error) => {
|
|
143
|
+
if (error) {
|
|
144
|
+
logger.error(
|
|
145
|
+
`Peripheral ${peripheral.address} disconnected while trying to connect, try again`,
|
|
146
|
+
error
|
|
147
|
+
);
|
|
148
|
+
} else {
|
|
149
|
+
logger.info(`Peripheral ${peripheral.address} disconnected while trying to connect, try gain`);
|
|
150
|
+
}
|
|
151
|
+
peripheral.removeAllListeners("disconnect");
|
|
152
|
+
peripheral.removeAllListeners("connect");
|
|
153
|
+
this.openChannel(address, tryCount + 1).then(resolve).catch(reject);
|
|
154
|
+
};
|
|
155
|
+
peripheral.once("disconnect", reTryHandler);
|
|
156
|
+
logger.debug(`Connect to Peripheral now (try ${tryCount})`);
|
|
157
|
+
peripheral.connectAsync().catch(reTryHandler);
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
onData(listener) {
|
|
161
|
+
this.onMatterMessageListener = listener;
|
|
162
|
+
return {
|
|
163
|
+
close: async () => await this.close()
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
async close() {
|
|
167
|
+
for (const peripheral of this.openChannels.values()) {
|
|
168
|
+
await peripheral.disconnectAsync();
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
supports(type, _address) {
|
|
172
|
+
if (type !== import_general.ChannelType.BLE) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
return true;
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
class NobleBleChannel extends import_ble.BleChannel {
|
|
179
|
+
constructor(peripheral, btpSession) {
|
|
180
|
+
super();
|
|
181
|
+
this.peripheral = peripheral;
|
|
182
|
+
this.btpSession = btpSession;
|
|
183
|
+
peripheral.once("disconnect", () => {
|
|
184
|
+
logger.debug(`Disconnected from peripheral ${peripheral.address}`);
|
|
185
|
+
this.connected = false;
|
|
186
|
+
void this.btpSession.close();
|
|
187
|
+
});
|
|
188
|
+
}
|
|
189
|
+
static async create(peripheral, characteristicC1ForWrite, characteristicC2ForSubscribe, onMatterMessageListener, _additionalCommissioningRelatedData) {
|
|
190
|
+
let mtu = peripheral.mtu ?? 0;
|
|
191
|
+
if (mtu > import_ble.BLE_MAXIMUM_BTP_MTU) {
|
|
192
|
+
mtu = import_ble.BLE_MAXIMUM_BTP_MTU;
|
|
193
|
+
}
|
|
194
|
+
logger.debug(`Using MTU=${mtu} (Peripheral MTU=${peripheral.mtu})`);
|
|
195
|
+
const btpHandshakeRequest = import_codec.BtpCodec.encodeBtpHandshakeRequest({
|
|
196
|
+
versions: import_ble.BTP_SUPPORTED_VERSIONS,
|
|
197
|
+
attMtu: mtu,
|
|
198
|
+
clientWindowSize: import_ble.BTP_MAXIMUM_WINDOW_SIZE
|
|
199
|
+
});
|
|
200
|
+
logger.debug(`sending BTP handshake request: ${import_general.Logger.toJSON(btpHandshakeRequest)}`);
|
|
201
|
+
await characteristicC1ForWrite.writeAsync(Buffer.from(btpHandshakeRequest.buffer), false);
|
|
202
|
+
const btpHandshakeTimeout = import_general.Time.getTimer("BLE handshake timeout", import_ble.BTP_CONN_RSP_TIMEOUT_MS, async () => {
|
|
203
|
+
await peripheral.disconnectAsync();
|
|
204
|
+
logger.debug("Handshake Response not received. Disconnected from peripheral");
|
|
205
|
+
}).start();
|
|
206
|
+
logger.debug("subscribing to C2 characteristic");
|
|
207
|
+
await characteristicC2ForSubscribe.subscribeAsync();
|
|
208
|
+
const { promise: handshakeResponseReceivedPromise, resolver } = (0, import_general.createPromise)();
|
|
209
|
+
characteristicC2ForSubscribe.once("data", (data, isNotification) => {
|
|
210
|
+
logger.debug(`received first data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`);
|
|
211
|
+
if (data[0] === 101 && data[1] === 108 && data.length === 6) {
|
|
212
|
+
logger.info(`Received Matter handshake response: ${data.toString("hex")}.`);
|
|
213
|
+
btpHandshakeTimeout.stop();
|
|
214
|
+
resolver(data);
|
|
215
|
+
}
|
|
216
|
+
});
|
|
217
|
+
const handshakeResponse = await handshakeResponseReceivedPromise;
|
|
218
|
+
const btpSession = await import_ble.BtpSessionHandler.createAsCentral(
|
|
219
|
+
new Uint8Array(handshakeResponse),
|
|
220
|
+
// callback to write data to characteristic C1
|
|
221
|
+
async (data) => {
|
|
222
|
+
return await characteristicC1ForWrite.writeAsync(Buffer.from(data.buffer), false);
|
|
223
|
+
},
|
|
224
|
+
// callback to disconnect the BLE connection
|
|
225
|
+
async () => void characteristicC2ForSubscribe.unsubscribeAsync().then(() => peripheral.disconnectAsync().then(() => logger.debug("disconnected from peripheral"))),
|
|
226
|
+
// callback to forward decoded and de-assembled Matter messages to ExchangeManager
|
|
227
|
+
async (data) => {
|
|
228
|
+
if (onMatterMessageListener === void 0) {
|
|
229
|
+
throw new import_general.InternalError(`No listener registered for Matter messages`);
|
|
230
|
+
}
|
|
231
|
+
onMatterMessageListener(nobleChannel, data);
|
|
232
|
+
}
|
|
233
|
+
);
|
|
234
|
+
characteristicC2ForSubscribe.on("data", (data, isNotification) => {
|
|
235
|
+
logger.debug(`received data on C2: ${data.toString("hex")} (isNotification: ${isNotification})`);
|
|
236
|
+
void btpSession.handleIncomingBleData(new Uint8Array(data));
|
|
237
|
+
});
|
|
238
|
+
const nobleChannel = new NobleBleChannel(peripheral, btpSession);
|
|
239
|
+
return nobleChannel;
|
|
240
|
+
}
|
|
241
|
+
connected = true;
|
|
242
|
+
/**
|
|
243
|
+
* Send a Matter message to the connected device - need to do BTP assembly first.
|
|
244
|
+
*
|
|
245
|
+
* @param data
|
|
246
|
+
*/
|
|
247
|
+
async send(data) {
|
|
248
|
+
if (!this.connected) {
|
|
249
|
+
logger.debug("Cannot send data because not connected to peripheral.");
|
|
250
|
+
return;
|
|
251
|
+
}
|
|
252
|
+
if (this.btpSession === void 0) {
|
|
253
|
+
throw new import_ble.BtpFlowError(`Cannot send data, no BTP session initialized`);
|
|
254
|
+
}
|
|
255
|
+
await this.btpSession.sendMatterMessage(data);
|
|
256
|
+
}
|
|
257
|
+
// Channel<Uint8Array>
|
|
258
|
+
get name() {
|
|
259
|
+
return `${this.type}://${this.peripheral.address}`;
|
|
260
|
+
}
|
|
261
|
+
async close() {
|
|
262
|
+
await this.btpSession.close();
|
|
263
|
+
await this.peripheral.disconnectAsync();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# sourceMappingURL=NobleBleChannel.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/NobleBleChannel.ts"],
|
|
4
|
+
"mappings": "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",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import type { Peripheral } from "@stoprocent/noble";
|
|
7
|
+
import { BleOptions } from "./NodeJsBle.js";
|
|
8
|
+
export declare class NobleBleClient {
|
|
9
|
+
private readonly discoveredPeripherals;
|
|
10
|
+
private shouldScan;
|
|
11
|
+
private isScanning;
|
|
12
|
+
private nobleState;
|
|
13
|
+
private deviceDiscoveredCallback;
|
|
14
|
+
constructor(options?: BleOptions);
|
|
15
|
+
setDiscoveryCallback(callback: (peripheral: Peripheral, manufacturerData: Uint8Array) => void): void;
|
|
16
|
+
startScanning(): Promise<void>;
|
|
17
|
+
stopScanning(): Promise<void>;
|
|
18
|
+
private handleDiscoveredDevice;
|
|
19
|
+
}
|
|
20
|
+
//# sourceMappingURL=NobleBleClient.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NobleBleClient.d.ts","sourceRoot":"","sources":["../../src/NobleBleClient.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAkB5C,qBAAa,cAAc;IACvB,OAAO,CAAC,QAAQ,CAAC,qBAAqB,CAGlC;IACJ,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,wBAAwB,CAA+E;gBAEnG,OAAO,CAAC,EAAE,UAAU;IA2BzB,oBAAoB,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,UAAU,KAAK,IAAI;IAOvF,aAAa;IAYb,YAAY;IAMzB,OAAO,CAAC,sBAAsB;CA0BjC"}
|
|
@@ -0,0 +1,108 @@
|
|
|
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 NobleBleClient_exports = {};
|
|
20
|
+
__export(NobleBleClient_exports, {
|
|
21
|
+
NobleBleClient: () => NobleBleClient
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(NobleBleClient_exports);
|
|
24
|
+
var import_general = require("@matter/general");
|
|
25
|
+
var import_require = require("@matter/nodejs-ble/require");
|
|
26
|
+
var import_ble = require("@project-chip/matter.js/ble");
|
|
27
|
+
/**
|
|
28
|
+
* @license
|
|
29
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
30
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
31
|
+
*/
|
|
32
|
+
const logger = import_general.Logger.get("NobleBleClient");
|
|
33
|
+
let noble;
|
|
34
|
+
function loadNoble(hciId) {
|
|
35
|
+
if (hciId !== void 0) {
|
|
36
|
+
process.env.NOBLE_HCI_DEVICE_ID = hciId.toString();
|
|
37
|
+
}
|
|
38
|
+
noble = (0, import_require.require)("@stoprocent/noble");
|
|
39
|
+
if (typeof noble.on !== "function") {
|
|
40
|
+
noble = noble({ extended: false });
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
class NobleBleClient {
|
|
44
|
+
discoveredPeripherals = /* @__PURE__ */ new Map();
|
|
45
|
+
shouldScan = false;
|
|
46
|
+
isScanning = false;
|
|
47
|
+
nobleState = "unknown";
|
|
48
|
+
deviceDiscoveredCallback;
|
|
49
|
+
constructor(options) {
|
|
50
|
+
loadNoble(options?.hciId);
|
|
51
|
+
noble.on("stateChange", (state) => {
|
|
52
|
+
this.nobleState = state;
|
|
53
|
+
logger.debug(`Noble state changed to ${state}`);
|
|
54
|
+
if (state === "poweredOn") {
|
|
55
|
+
if (this.shouldScan) {
|
|
56
|
+
void this.startScanning();
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
void this.stopScanning();
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
noble.on("discover", (peripheral) => this.handleDiscoveredDevice(peripheral));
|
|
63
|
+
noble.on("scanStart", () => this.isScanning = true);
|
|
64
|
+
noble.on("scanStop", () => this.isScanning = false);
|
|
65
|
+
}
|
|
66
|
+
setDiscoveryCallback(callback) {
|
|
67
|
+
this.deviceDiscoveredCallback = callback;
|
|
68
|
+
for (const { peripheral, matterServiceData } of this.discoveredPeripherals.values()) {
|
|
69
|
+
this.deviceDiscoveredCallback(peripheral, matterServiceData);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async startScanning() {
|
|
73
|
+
if (this.isScanning) return;
|
|
74
|
+
this.shouldScan = true;
|
|
75
|
+
if (this.nobleState === "poweredOn") {
|
|
76
|
+
logger.debug("Start BLE scanning for Matter Services ...");
|
|
77
|
+
await noble.startScanningAsync([import_ble.BLE_MATTER_SERVICE_UUID], false);
|
|
78
|
+
} else {
|
|
79
|
+
logger.debug("noble state is not poweredOn ... delay scanning till poweredOn");
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
async stopScanning() {
|
|
83
|
+
this.shouldScan = false;
|
|
84
|
+
logger.debug("Stop BLE scanning for Matter Services ...");
|
|
85
|
+
await noble.stopScanningAsync();
|
|
86
|
+
}
|
|
87
|
+
handleDiscoveredDevice(peripheral) {
|
|
88
|
+
logger.debug(
|
|
89
|
+
`Found peripheral ${peripheral.address} (${peripheral.advertisement.localName}): ${import_general.Logger.toJSON(
|
|
90
|
+
peripheral.advertisement
|
|
91
|
+
)}`
|
|
92
|
+
);
|
|
93
|
+
if (!peripheral.connectable) {
|
|
94
|
+
logger.info(`Peripheral ${peripheral.address} is not connectable ... ignoring`);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const matterServiceData = peripheral.advertisement.serviceData.find(
|
|
98
|
+
(serviceData) => serviceData.uuid === import_ble.BLE_MATTER_SERVICE_UUID
|
|
99
|
+
);
|
|
100
|
+
if (matterServiceData === void 0 || matterServiceData.data.length !== 8) {
|
|
101
|
+
logger.info(`Peripheral ${peripheral.address} does not advertise Matter Service ... ignoring`);
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
this.discoveredPeripherals.set(peripheral.address, { peripheral, matterServiceData: matterServiceData.data });
|
|
105
|
+
this.deviceDiscoveredCallback?.(peripheral, matterServiceData.data);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
//# sourceMappingURL=NobleBleClient.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/NobleBleClient.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAMA,qBAAuB;AACvB,qBAAwB;AACxB,iBAAwC;AARxC;AAAA;AAAA;AAAA;AAAA;AAYA,MAAM,SAAS,sBAAO,IAAI,gBAAgB;AAC1C,IAAI;AAEJ,SAAS,UAAU,OAAgB;AAE/B,MAAI,UAAU,QAAW;AACrB,YAAQ,IAAI,sBAAsB,MAAM,SAAS;AAAA,EACrD;AACA,cAAQ,wBAAQ,mBAAmB;AACnC,MAAI,OAAO,MAAM,OAAO,YAAY;AAGhC,YAAS,MAAc,EAAE,UAAU,MAAM,CAAC;AAAA,EAC9C;AACJ;AAEO,MAAM,eAAe;AAAA,EACP,wBAAwB,oBAAI,IAG3C;AAAA,EACM,aAAa;AAAA,EACb,aAAa;AAAA,EACb,aAAa;AAAA,EACb;AAAA,EAER,YAAY,SAAsB;AAC9B,cAAU,SAAS,KAAK;AAUxB,UAAM,GAAG,eAAe,WAAS;AAC7B,WAAK,aAAa;AAClB,aAAO,MAAM,0BAA0B,KAAK,EAAE;AAC9C,UAAI,UAAU,aAAa;AACvB,YAAI,KAAK,YAAY;AACjB,eAAK,KAAK,cAAc;AAAA,QAC5B;AAAA,MACJ,OAAO;AACH,aAAK,KAAK,aAAa;AAAA,MAC3B;AAAA,IACJ,CAAC;AACD,UAAM,GAAG,YAAY,gBAAc,KAAK,uBAAuB,UAAU,CAAC;AAC1E,UAAM,GAAG,aAAa,MAAO,KAAK,aAAa,IAAK;AACpD,UAAM,GAAG,YAAY,MAAO,KAAK,aAAa,KAAM;AAAA,EACxD;AAAA,EAEO,qBAAqB,UAA0E;AAClG,SAAK,2BAA2B;AAChC,eAAW,EAAE,YAAY,kBAAkB,KAAK,KAAK,sBAAsB,OAAO,GAAG;AACjF,WAAK,yBAAyB,YAAY,iBAAiB;AAAA,IAC/D;AAAA,EACJ;AAAA,EAEA,MAAa,gBAAgB;AACzB,QAAI,KAAK,WAAY;AAErB,SAAK,aAAa;AAClB,QAAI,KAAK,eAAe,aAAa;AACjC,aAAO,MAAM,4CAA4C;AACzD,YAAM,MAAM,mBAAmB,CAAC,kCAAuB,GAAG,KAAK;AAAA,IACnE,OAAO;AACH,aAAO,MAAM,gEAAgE;AAAA,IACjF;AAAA,EACJ;AAAA,EAEA,MAAa,eAAe;AACxB,SAAK,aAAa;AAClB,WAAO,MAAM,2CAA2C;AACxD,UAAM,MAAM,kBAAkB;AAAA,EAClC;AAAA,EAEQ,uBAAuB,YAAwB;AAInD,WAAO;AAAA,MACH,oBAAoB,WAAW,OAAO,KAAK,WAAW,cAAc,SAAS,MAAM,sBAAO;AAAA,QACtF,WAAW;AAAA,MACf,CAAC;AAAA,IACL;AAEA,QAAI,CAAC,WAAW,aAAa;AACzB,aAAO,KAAK,cAAc,WAAW,OAAO,kCAAkC;AAC9E;AAAA,IACJ;AACA,UAAM,oBAAoB,WAAW,cAAc,YAAY;AAAA,MAC3D,iBAAe,YAAY,SAAS;AAAA,IACxC;AACA,QAAI,sBAAsB,UAAa,kBAAkB,KAAK,WAAW,GAAG;AACxE,aAAO,KAAK,cAAc,WAAW,OAAO,iDAAiD;AAC7F;AAAA,IACJ;AAEA,SAAK,sBAAsB,IAAI,WAAW,SAAS,EAAE,YAAY,mBAAmB,kBAAkB,KAAK,CAAC;AAE5G,SAAK,2BAA2B,YAAY,kBAAkB,IAAI;AAAA,EACtE;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
4
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
5
|
+
*/
|
|
6
|
+
import { NetInterface, TransportInterface } from "@matter/general";
|
|
7
|
+
import { Ble } from "@project-chip/matter.js/ble";
|
|
8
|
+
import { InstanceBroadcaster, Scanner } from "@project-chip/matter.js/common";
|
|
9
|
+
export type BleOptions = {
|
|
10
|
+
hciId?: number;
|
|
11
|
+
};
|
|
12
|
+
export declare class NodeJsBle extends Ble {
|
|
13
|
+
private readonly options?;
|
|
14
|
+
private blePeripheral;
|
|
15
|
+
private bleCentral;
|
|
16
|
+
constructor(options?: BleOptions | undefined);
|
|
17
|
+
getBlePeripheralInterface(): TransportInterface;
|
|
18
|
+
getBleCentralInterface(): NetInterface;
|
|
19
|
+
getBleBroadcaster(additionalAdvertisementData?: Uint8Array): InstanceBroadcaster;
|
|
20
|
+
getBleScanner(): Scanner;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=NodeJsBle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NodeJsBle.d.ts","sourceRoot":"","sources":["../../src/NodeJsBle.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AACnE,OAAO,EAAE,GAAG,EAAE,MAAM,6BAA6B,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,MAAM,gCAAgC,CAAC;AAQ9E,MAAM,MAAM,UAAU,GAAG;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,qBAAa,SAAU,SAAQ,GAAG;IAIlB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAHrC,OAAO,CAAC,aAAa,CAA6B;IAClD,OAAO,CAAC,UAAU,CAA6B;gBAElB,OAAO,CAAC,EAAE,UAAU,YAAA;IAIjD,yBAAyB,IAAI,kBAAkB;IAO/C,sBAAsB,IAAI,YAAY;IAOtC,iBAAiB,CAAC,2BAA2B,CAAC,EAAE,UAAU,GAAG,mBAAmB;IAOhF,aAAa,IAAI,OAAO;CAM3B"}
|
|
@@ -0,0 +1,68 @@
|
|
|
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 NodeJsBle_exports = {};
|
|
20
|
+
__export(NodeJsBle_exports, {
|
|
21
|
+
NodeJsBle: () => NodeJsBle
|
|
22
|
+
});
|
|
23
|
+
module.exports = __toCommonJS(NodeJsBle_exports);
|
|
24
|
+
var import_ble = require("@project-chip/matter.js/ble");
|
|
25
|
+
var import_BleBroadcaster = require("./BleBroadcaster.js");
|
|
26
|
+
var import_BlePeripheralInterface = require("./BlePeripheralInterface.js");
|
|
27
|
+
var import_BleScanner = require("./BleScanner.js");
|
|
28
|
+
var import_BlenoBleServer = require("./BlenoBleServer.js");
|
|
29
|
+
var import_NobleBleChannel = require("./NobleBleChannel.js");
|
|
30
|
+
var import_NobleBleClient = require("./NobleBleClient.js");
|
|
31
|
+
/**
|
|
32
|
+
* @license
|
|
33
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
34
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
35
|
+
*/
|
|
36
|
+
class NodeJsBle extends import_ble.Ble {
|
|
37
|
+
constructor(options) {
|
|
38
|
+
super();
|
|
39
|
+
this.options = options;
|
|
40
|
+
}
|
|
41
|
+
blePeripheral;
|
|
42
|
+
bleCentral;
|
|
43
|
+
getBlePeripheralInterface() {
|
|
44
|
+
if (this.blePeripheral === void 0) {
|
|
45
|
+
this.blePeripheral = new import_BlenoBleServer.BlenoBleServer(this.options);
|
|
46
|
+
}
|
|
47
|
+
return new import_BlePeripheralInterface.BlePeripheralInterface(this.blePeripheral);
|
|
48
|
+
}
|
|
49
|
+
getBleCentralInterface() {
|
|
50
|
+
if (this.bleCentral === void 0) {
|
|
51
|
+
this.bleCentral = new import_NobleBleClient.NobleBleClient(this.options);
|
|
52
|
+
}
|
|
53
|
+
return new import_NobleBleChannel.NobleBleCentralInterface();
|
|
54
|
+
}
|
|
55
|
+
getBleBroadcaster(additionalAdvertisementData) {
|
|
56
|
+
if (this.blePeripheral === void 0) {
|
|
57
|
+
this.blePeripheral = new import_BlenoBleServer.BlenoBleServer(this.options);
|
|
58
|
+
}
|
|
59
|
+
return new import_BleBroadcaster.BleBroadcaster(this.blePeripheral, additionalAdvertisementData);
|
|
60
|
+
}
|
|
61
|
+
getBleScanner() {
|
|
62
|
+
if (this.bleCentral === void 0) {
|
|
63
|
+
this.bleCentral = new import_NobleBleClient.NobleBleClient(this.options);
|
|
64
|
+
}
|
|
65
|
+
return new import_BleScanner.BleScanner(this.bleCentral);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
//# sourceMappingURL=NodeJsBle.js.map
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../src/NodeJsBle.ts"],
|
|
4
|
+
"mappings": ";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAOA,iBAAoB;AAEpB,4BAA+B;AAC/B,oCAAuC;AACvC,wBAA2B;AAC3B,4BAA+B;AAC/B,6BAAyC;AACzC,4BAA+B;AAd/B;AAAA;AAAA;AAAA;AAAA;AAoBO,MAAM,kBAAkB,eAAI;AAAA,EAI/B,YAA6B,SAAsB;AAC/C,UAAM;AADmB;AAAA,EAE7B;AAAA,EALQ;AAAA,EACA;AAAA,EAMR,4BAAgD;AAC5C,QAAI,KAAK,kBAAkB,QAAW;AAClC,WAAK,gBAAgB,IAAI,qCAAe,KAAK,OAAO;AAAA,IACxD;AACA,WAAO,IAAI,qDAAuB,KAAK,aAAa;AAAA,EACxD;AAAA,EAEA,yBAAuC;AACnC,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,qCAAe,KAAK,OAAO;AAAA,IACrD;AACA,WAAO,IAAI,gDAAyB;AAAA,EACxC;AAAA,EAEA,kBAAkB,6BAA+D;AAC7E,QAAI,KAAK,kBAAkB,QAAW;AAClC,WAAK,gBAAgB,IAAI,qCAAe,KAAK,OAAO;AAAA,IACxD;AACA,WAAO,IAAI,qCAAe,KAAK,eAAe,2BAA2B;AAAA,EAC7E;AAAA,EAEA,gBAAyB;AACrB,QAAI,KAAK,eAAe,QAAW;AAC/B,WAAK,aAAa,IAAI,qCAAe,KAAK,OAAO;AAAA,IACrD;AACA,WAAO,IAAI,6BAAW,KAAK,UAAU;AAAA,EACzC;AACJ;",
|
|
5
|
+
"names": []
|
|
6
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,cAAc,qBAAqB,CAAC;AACpC,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
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 src_exports = {};
|
|
17
|
+
module.exports = __toCommonJS(src_exports);
|
|
18
|
+
__reExport(src_exports, require("./BleBroadcaster.js"), module.exports);
|
|
19
|
+
__reExport(src_exports, require("./BleScanner.js"), module.exports);
|
|
20
|
+
__reExport(src_exports, require("./NodeJsBle.js"), module.exports);
|
|
21
|
+
/**
|
|
22
|
+
* @license
|
|
23
|
+
* Copyright 2022-2024 Matter.js Authors
|
|
24
|
+
* SPDX-License-Identifier: Apache-2.0
|
|
25
|
+
*/
|
|
26
|
+
//# sourceMappingURL=index.js.map
|