91 lines
3.2 KiB
JavaScript
91 lines
3.2 KiB
JavaScript
'use strict'
|
|
|
|
// Convert `manufacturerData` to an array of bluetooth.BluetoothManufacturerData
|
|
// defined in
|
|
// https://webbluetoothcg.github.io/web-bluetooth/#bluetooth-bidi-definitions.
|
|
function convertToBidiManufacturerData(manufacturerData) {
|
|
const bidiManufacturerData = [];
|
|
for (const key in manufacturerData) {
|
|
bidiManufacturerData.push(
|
|
{key: parseInt(key), data: btoa(manufacturerData[key].buffer)})
|
|
}
|
|
return bidiManufacturerData;
|
|
}
|
|
|
|
class FakeBluetooth {
|
|
constructor() {
|
|
this.fake_central_ = null;
|
|
}
|
|
|
|
// Returns a promise that resolves with a FakeCentral that clients can use
|
|
// to simulate events that a device in the Central/Observer role would
|
|
// receive as well as monitor the operations performed by the device in the
|
|
// Central/Observer role.
|
|
//
|
|
// A "Central" object would allow its clients to receive advertising events
|
|
// and initiate connections to peripherals i.e. operations of two roles
|
|
// defined by the Bluetooth Spec: Observer and Central.
|
|
// See Bluetooth 4.2 Vol 3 Part C 2.2.2 "Roles when Operating over an
|
|
// LE Physical Transport".
|
|
async simulateCentral({state}) {
|
|
if (this.fake_central_) {
|
|
throw 'simulateCentral() should only be called once';
|
|
}
|
|
|
|
await test_driver.bidi.bluetooth.simulate_adapter({state: state});
|
|
this.fake_central_ = new FakeCentral();
|
|
return this.fake_central_;
|
|
}
|
|
}
|
|
|
|
// FakeCentral allows clients to simulate events that a device in the
|
|
// Central/Observer role would receive as well as monitor the operations
|
|
// performed by the device in the Central/Observer role.
|
|
class FakeCentral {
|
|
constructor() {
|
|
this.peripherals_ = new Map();
|
|
}
|
|
|
|
// Simulates a peripheral with |address|, |name|, |manufacturerData| and
|
|
// |known_service_uuids| that has already been connected to the system. If the
|
|
// peripheral existed already it updates its name, manufacturer data, and
|
|
// known UUIDs. |known_service_uuids| should be an array of
|
|
// BluetoothServiceUUIDs
|
|
// https://webbluetoothcg.github.io/web-bluetooth/#typedefdef-bluetoothserviceuuid
|
|
//
|
|
// Platforms offer methods to retrieve devices that have already been
|
|
// connected to the system or weren't connected through the UA e.g. a user
|
|
// connected a peripheral through the system's settings. This method is
|
|
// intended to simulate peripherals that those methods would return.
|
|
async simulatePreconnectedPeripheral(
|
|
{address, name, manufacturerData = {}, knownServiceUUIDs = []}) {
|
|
await test_driver.bidi.bluetooth.simulate_preconnected_peripheral({
|
|
address: address,
|
|
name: name,
|
|
manufacturerData: convertToBidiManufacturerData(manufacturerData),
|
|
knownServiceUuids: knownServiceUUIDs
|
|
});
|
|
|
|
return this.fetchOrCreatePeripheral_(address);
|
|
}
|
|
|
|
// Create a fake_peripheral object from the given address.
|
|
fetchOrCreatePeripheral_(address) {
|
|
let peripheral = this.peripherals_.get(address);
|
|
if (peripheral === undefined) {
|
|
peripheral = new FakePeripheral(address);
|
|
this.peripherals_.set(address, peripheral);
|
|
}
|
|
return peripheral;
|
|
}
|
|
}
|
|
|
|
class FakePeripheral {
|
|
constructor(address) {
|
|
this.address = address;
|
|
}
|
|
}
|
|
|
|
function initializeBluetoothBidiResources() {
|
|
navigator.bluetooth.test = new FakeBluetooth();
|
|
}
|