@manekinekko/angular-web-bluetooth
Version:
The missing Web Bluetooth module for Angular
1 lines • 44.6 kB
Source Map (JSON)
{"version":3,"file":"manekinekko-angular-web-bluetooth.mjs","sources":["../../../../projects/manekinekko/angular-web-bluetooth/src/lib/platform/browser.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/platform/server.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/logger.service.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/bluetooth.service.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/bluetooth.module.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/lang/uuids/ti-sensortag2.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/lib/test.utils.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/public_api.ts","../../../../projects/manekinekko/angular-web-bluetooth/src/manekinekko-angular-web-bluetooth.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class BrowserWebBluetooth {\n private ble;\n\n constructor() {\n this.ble = navigator.bluetooth;\n if (!this.ble) {\n throw new Error('Your browser does not support Smart Bluetooth. See http://caniuse.com/#search=Bluetooth for more details.');\n }\n }\n\n requestDevice(options: RequestDeviceOptions): Promise<BluetoothDevice> {\n return this.ble.requestDevice(options);\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable()\nexport class ServerWebBluetooth {\n static instance() {\n // mocked object for now\n return {};\n }\n}\n","import { Injectable } from '@angular/core';\n\nexport interface Logger {\n log(args: string[]): void;\n error(args: string[]): void;\n warn(args: string[]): void;\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ConsoleLoggerService implements Logger {\n log(...args: any[]) {\n console.log.apply(console, args);\n }\n error(...args: any[]) {\n console.error.apply(console, args);\n }\n warn(...args: any[]) {\n console.warn.apply(console, args);\n }\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NoLoggerService implements Logger {\n log(...args: any[]) {}\n error(...args: any[]) {}\n warn(...args: any[]) {}\n}\n","import { EventEmitter, Injectable } from '@angular/core';\nimport { EMPTY, from, fromEvent, Observable, of, throwError } from 'rxjs';\nimport { filter, map, mergeMap, takeUntil } from 'rxjs/operators';\nimport { ConsoleLoggerService } from './logger.service';\nimport { BrowserWebBluetooth } from './platform/browser';\n\ntype ReadValueOptions = {\n acceptAllDevices?: boolean;\n optionalServices?: BluetoothServiceUUID[];\n characteristic: BluetoothCharacteristicUUID,\n service: BluetoothServiceUUID,\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BluetoothCore {\n private device$: EventEmitter<BluetoothDevice>;\n private gatt$: EventEmitter<BluetoothRemoteGATTServer>;\n private characteristicValueChanges$: EventEmitter<DataView>;\n private gattServer: BluetoothRemoteGATTServer | null;\n\n constructor(private readonly webBle: BrowserWebBluetooth, private readonly console: ConsoleLoggerService) {\n\n this.device$ = new EventEmitter<BluetoothDevice>();\n this.gatt$ = new EventEmitter<BluetoothRemoteGATTServer>();\n this.characteristicValueChanges$ = new EventEmitter<DataView>();\n\n this.gattServer = null;\n }\n\n getDevice$(): Observable<BluetoothDevice | null> {\n return this.device$;\n }\n\n getGATT$(): Observable<BluetoothRemoteGATTServer> {\n return this.gatt$;\n }\n\n streamValues$(): Observable<DataView> {\n return this.characteristicValueChanges$.pipe(filter(value => value && value.byteLength > 0));\n }\n\n /**\n * Run the discovery process and read the value form the provided service and characteristic\n * @param options the ReadValueOptions\n */\n async value(options: ReadValueOptions) {\n this.console.log('[BLE::Info] Reading value with options %o', options);\n\n if (typeof options.acceptAllDevices === 'undefined') {\n options.acceptAllDevices = true;\n }\n\n if (typeof options.optionalServices === 'undefined') {\n options.optionalServices = [options.service];\n }\n else {\n options.optionalServices = [...options.optionalServices];\n }\n\n this.console.log('[BLE::Info] Reading value with options %o', options);\n\n try {\n const device = await this.discover({\n acceptAllDevices: options.acceptAllDevices,\n optionalServices: options.optionalServices\n }) as BluetoothDevice;\n this.console.log('[BLE::Info] Device info %o', device);\n\n const gatt = await this.connectDevice(device);\n this.console.log('[BLE::Info] GATT info %o', gatt);\n\n const primaryService = await this.getPrimaryService(gatt, options.service) as BluetoothRemoteGATTService;\n this.console.log('[BLE::Info] Primary Service info %o', primaryService);\n\n const characteristic = await this.getCharacteristic(primaryService, options.characteristic) as BluetoothRemoteGATTCharacteristic;\n this.console.log('[BLE::Info] Characteristic info %o', characteristic);\n\n const value = await characteristic.readValue();\n this.console.log('[BLE::Info] Value info %o', value);\n\n return value;\n }\n catch (error) {\n throw new Error(error as any);\n }\n }\n\n value$(options: ReadValueOptions) {\n return from(this.value(options));\n }\n\n /**\n * Run the discovery process.\n *\n * @param Options such as filters and optional services\n * @return The GATT server for the chosen device\n */\n async discover(options: RequestDeviceOptions = {} as RequestDeviceOptions): Promise<BluetoothDevice | null> {\n options.optionalServices = options.optionalServices || ['generic_access'];\n\n this.console.log('[BLE::Info] Requesting devices with options %o', options);\n\n let device = null;\n try {\n device = await this.webBle.requestDevice(options);\n device.addEventListener('gattserverdisconnected', this.onDeviceDisconnected.bind(this));\n\n if (device) {\n this.device$.emit(device);\n }\n else {\n this.device$.error(`[BLE::Error] Can not get the Bluetooth Remote GATT Server. Abort.`);\n }\n\n } catch (error) {\n this.console.error(error);\n }\n\n return device;\n }\n\n /**\n * This handler will trigger when the client disconnets from the server.\n *\n * @param event The onDeviceDisconnected event\n */\n onDeviceDisconnected(event: Event) {\n const disconnectedDevice = event.target as BluetoothDevice;\n this.console.log('[BLE::Info] disconnected device %o', disconnectedDevice);\n\n this.device$.emit(undefined);\n }\n\n /**\n * Run the discovery process.\n *\n * @param Options such as filters and optional services\n * @return Emites the value of the requested service read from the device\n */\n discover$(options?: RequestDeviceOptions): Observable<void | BluetoothRemoteGATTServer | null> {\n return from(this.discover(options)).pipe(mergeMap((device: BluetoothDevice|null) => this.connectDevice$(device)));\n }\n\n /**\n * Connect to current device.\n *\n * @return Emites the gatt server instance of the requested device\n */\n async connectDevice(device: BluetoothDevice | null) {\n\n if (device === null || typeof device.gatt === \"undefined\") {\n this.console.error('[BLE::Error] Was not able to connect to Bluetooth Remote GATT Server');\n this.gatt$.error(null);\n return null;\n }\n\n this.console.log('[BLE::Info] Connecting to Bluetooth Remote GATT Server of %o', device);\n\n try {\n const gattServer = await device.gatt.connect();\n this.gattServer = gattServer;\n this.gatt$.emit(gattServer);\n return gattServer;\n } catch (error: any) {\n // probably the user has canceled the discovery\n Promise.reject(`${error.message}`);\n this.gatt$.error(`${error.message}`);\n }\n\n return null;\n }\n\n /**\n * Connect to current device.\n *\n * @return Emites the gatt server instance of the requested device\n */\n connectDevice$(device: BluetoothDevice | null) {\n return from(this.connectDevice(device));\n }\n\n /**\n * Disconnect the current connected device\n */\n disconnectDevice() {\n if (!this.gattServer) {\n return;\n }\n this.console.log('[BLE::Info] Disconnecting from Bluetooth Device %o', this.gattServer);\n\n if (this.gattServer.connected) {\n this.gattServer.disconnect();\n } else {\n this.console.log('[BLE::Info] Bluetooth device is already disconnected');\n }\n }\n\n /**\n * Requests the primary service.\n *\n * @param gatt The BluetoothRemoteGATTServer sever\n * @param service The UUID of the primary service\n * @return The remote service (as a Promise)\n */\n async getPrimaryService(gatt: BluetoothRemoteGATTServer | null, service: BluetoothServiceUUID): Promise<BluetoothRemoteGATTService> {\n try {\n const remoteService = await gatt!.getPrimaryService(service);\n return await Promise.resolve(remoteService);\n }\n catch (error: any) {\n return await Promise.reject(`${error.message} (${service})`);\n }\n }\n\n /**\n * Requests the primary service.\n *\n * @param gatt The BluetoothRemoteGATTServer sever\n * @param service The UUID of the primary service\n * @return The remote service (as an observable).\n */\n getPrimaryService$(gatt: BluetoothRemoteGATTServer | null, service: BluetoothServiceUUID): Observable<BluetoothRemoteGATTService> {\n this.console.log('[BLE::Info] Getting primary service \"%s\" (if available) of %o', service, gatt);\n\n\n if (gatt) {\n return from(\n this.getPrimaryService(gatt, service)\n );\n }\n else {\n return throwError(() => new Error('[BLE::Error] Was not able to connect to the Bluetooth Remote GATT Server'));\n }\n }\n\n /**\n * Requests a characteristic from the primary service.\n *\n * @param primaryService The primary service.\n * @param characteristic The characteristic's UUID.\n * @returns The characteristic description (as a Promise).\n */\n async getCharacteristic(\n primaryService: BluetoothRemoteGATTService,\n characteristic: BluetoothCharacteristicUUID\n ): Promise<BluetoothRemoteGATTCharacteristic | null> {\n this.console.log('[BLE::Info] Getting Characteristic \"%s\" of %o', characteristic, primaryService);\n\n try {\n const char = await primaryService.getCharacteristic(characteristic);\n // listen for characteristic value changes\n if (char.properties.notify) {\n char.startNotifications().then(_ => {\n this.console.log('[BLE::Info] Starting notifications of \"%s\"', characteristic);\n char.addEventListener('characteristicvaluechanged', this.onCharacteristicChanged.bind(this));\n }, (error: DOMException) => {\n Promise.reject(`${error.message} (${characteristic})`);\n });\n }\n else {\n char.addEventListener('characteristicvaluechanged', this.onCharacteristicChanged.bind(this));\n }\n return char;\n }\n catch (rejectionError) {\n Promise.reject(`${(rejectionError as any).message} (${characteristic})`);\n }\n\n return null;\n }\n\n /**\n * Requests a characteristic from the primary service.\n *\n * @param primaryService The primary service.\n * @param characteristic The characteristic's UUID.\n * @returns The characteristic description (as a Observable).\n */\n getCharacteristic$(\n primaryService: BluetoothRemoteGATTService,\n characteristic: BluetoothCharacteristicUUID\n ): Observable<null | BluetoothRemoteGATTCharacteristic> {\n this.console.log('[BLE::Info] Getting Characteristic \"%s\" of %o', characteristic, primaryService);\n\n return from(this.getCharacteristic(primaryService, characteristic));\n }\n\n /**\n * Sets the characteristic's state.\n *\n * @param service The parent service of the characteristic.\n * @param characteristic The requested characteristic\n * @param state An ArrayBuffer containing the value of the characteristic.\n * @return The primary service (useful for chaining).\n */\n setCharacteristicState(service: BluetoothServiceUUID, characteristic: BluetoothCharacteristicUUID, state: ArrayBuffer) {\n const primaryService = this.getPrimaryService$(this.gattServer, service);\n\n primaryService\n .pipe(mergeMap((_primaryService: BluetoothRemoteGATTService) => this.getCharacteristic$(_primaryService, characteristic)))\n .subscribe((characteristic: BluetoothRemoteGATTCharacteristic | null) => this.writeValue$(characteristic, state));\n\n return primaryService;\n }\n\n /**\n * Enables the specified characteristic of a given service.\n *\n * @param service The parent service of the characteristic.\n * @param characteristic The requested characteristic\n * @return The primary service (useful for chaining).\n */\n enableCharacteristic(service: BluetoothServiceUUID, characteristic: BluetoothCharacteristicUUID, state?: any) {\n state = state || new Uint8Array([1]);\n return this.setCharacteristicState(service, characteristic, state);\n }\n\n /**\n * Disables the specified characteristic of a given service.\n *\n * @param service The parent service of the characteristic.\n * @param characteristic The requested characteristic.\n * @return The primary service (useful for chaining).\n */\n disbaleCharacteristic(service: BluetoothServiceUUID, characteristic: BluetoothCharacteristicUUID, state?: any) {\n state = state || new Uint8Array([0]);\n return this.setCharacteristicState(service, characteristic, state);\n }\n\n /**\n * Dispatches new values emitted by a characteristic.\n *\n * @param event the distpatched event.\n */\n onCharacteristicChanged(event: Event) {\n this.console.log('[BLE::Info] Dispatching new characteristic value %o', event);\n\n const value = (event.target as BluetoothRemoteGATTCharacteristic).value;\n this.characteristicValueChanges$.emit(value);\n }\n\n /**\n * Reads a value from the characteristics, as a DataView.\n *\n * @param characteristic The requested characteristic.\n * @return the DataView value (as an Observable).\n */\n readValue$(characteristic: BluetoothRemoteGATTCharacteristic): Observable<DataView> {\n this.console.log('[BLE::Info] Reading Characteristic %o', characteristic);\n\n return from(\n characteristic\n .readValue()\n .then((data: DataView) => Promise.resolve(data), (error: DOMException) => Promise.reject(`${error.message}`))\n );\n }\n\n /**\n * Writes a value into the specified characteristic.\n *\n * @param characteristic The requested characteristic.\n * @param value The value to be written (as an ArrayBuffer or Uint8Array).\n * @return an void Observable.\n */\n writeValue$(characteristic: BluetoothRemoteGATTCharacteristic | null, value: ArrayBuffer | Uint8Array) {\n\n if (characteristic === null) {\n this.console.error('[BLE::Error] Was not able to write characteristic');\n return null;\n }\n\n this.console.log('[BLE::Info] Writing Characteristic %o', characteristic);\n\n return from(characteristic.writeValue(value).then(_ => Promise.resolve(), (error: DOMException) => Promise.reject(`${error.message}`)));\n }\n\n /**\n * A stream of DataView values emitted by the specified characteristic.\n *\n * @param characteristic The characteristic which value you want to observe\n * @return The stream of DataView values.\n */\n observeValue$(characteristic: BluetoothRemoteGATTCharacteristic): Observable<DataView> {\n\n if (characteristic === null || typeof characteristic.service === 'undefined') {\n this.console.error('[BLE::Error] Was not able to read characteristic');\n return EMPTY;\n }\n\n characteristic.startNotifications();\n const disconnected = fromEvent(characteristic.service.device, 'gattserverdisconnected');\n return fromEvent(characteristic, 'characteristicvaluechanged')\n .pipe(\n map((event: Event) => (event.target as BluetoothRemoteGATTCharacteristic).value as DataView),\n takeUntil(disconnected)\n );\n }\n\n /**\n * A utility method to convert LE to an unsigned 16-bit integer values.\n *\n * @param data The DataView binary data.\n * @param byteOffset The offset, in byte, from the start of the view where to read the data.\n * @return An unsigned 16-bit integer number.\n */\n littleEndianToUint16(data: any, byteOffset: number): number {\n return (this.littleEndianToUint8(data, byteOffset + 1) << 8) + this.littleEndianToUint8(data, byteOffset);\n }\n\n /**\n * A utility method to convert LE to an unsigned 8-bit integer values.\n *\n * @param data The DataView binary data.\n * @param byteOffset The offset, in byte, from the start of the view where to read the data.\n * @return An unsigned 8-bit integer number.\n */\n littleEndianToUint8(data: any, byteOffset: number): number {\n return data.getUint8(byteOffset);\n }\n\n /**\n * Sends random data (for testing purposes only).\n *\n * @return Random unsigned 8-bit integer values.\n */\n fakeNext(fakeValue?: () => DataView) {\n if (fakeValue === undefined) {\n fakeValue = () => {\n const dv = new DataView(new ArrayBuffer(8));\n dv.setUint8(0, (Math.random() * 110) | 0);\n return dv;\n };\n }\n\n this.characteristicValueChanges$.emit(fakeValue());\n }\n}\n","import { NgModule, ModuleWithProviders, InjectionToken, Optional } from '@angular/core';\nimport { CommonModule } from '@angular/common';\n\nimport { BluetoothCore } from './bluetooth.service';\nimport { BrowserWebBluetooth } from './platform/browser';\n\nimport { ConsoleLoggerService, NoLoggerService } from './logger.service';\n\nexport interface AWBOptions {\n enableTracing?: boolean;\n}\n\nexport function browserWebBluetooth() {\n return new BrowserWebBluetooth();\n}\n\nexport function consoleLoggerServiceConfig(options: AWBOptions) {\n if (options && options.enableTracing) {\n return new ConsoleLoggerService();\n } else {\n return new NoLoggerService();\n }\n}\nexport function makeMeTokenInjector() {\n return new InjectionToken('AWBOptions');\n}\n\n@NgModule({\n imports: [CommonModule]\n})\nexport class WebBluetoothModule {\n static forRoot(options: AWBOptions = {}): ModuleWithProviders<WebBluetoothModule> {\n return {\n ngModule: WebBluetoothModule,\n providers: [\n BluetoothCore,\n {\n provide: BrowserWebBluetooth,\n useFactory: browserWebBluetooth\n },\n {\n provide: makeMeTokenInjector,\n useValue: options\n },\n {\n provide: ConsoleLoggerService,\n useFactory: consoleLoggerServiceConfig,\n deps: [makeMeTokenInjector]\n }\n ]\n };\n }\n}\n","// http://processors.wiki.ti.com/images/a/a8/BLE_SensorTag_GATT_Server.pdf\n\n// prettier-ignore\nexport const TiTag = {\n\n DEVICE_INFORMATION : {\n SERVICE : 'f000180a-0451-4000-b000-000000000000',\n SYSTEM_ID : 'f0002a23-0451-4000-b000-000000000000',\n MODEL_NUMBER : 'f0002a24-0451-4000-b000-000000000000',\n SERIAL_NUMBER : 'f0002a25-0451-4000-b000-000000000000',\n FIRMWARE_REV : 'f0002a26-0451-4000-b000-000000000000',\n HARDWARE_REV : 'f0002a27-0451-4000-b000-000000000000',\n SOFTWARE_REV : 'f0002a28-0451-4000-b000-000000000000',\n MANIFACTURER : 'f0002a29-0451-4000-b000-000000000000',\n IEEE11073 : 'f0002a2a-0451-4000-b000-000000000000',\n PNP_ID : 'f0002a50-0451-4000-b000-000000000000'\n },\n\n BATTERY : {\n SERVICE : 'f000180f-0451-4000-b000-000000000000',\n LEVEL : 'f0002a19-0451-4000-b000-000000000000'\n },\n\n TEMPERATURE : {\n SERVICE : 'f000aa00-0451-4000-b000-000000000000',\n DATA : 'f000aa01-0451-4000-b000-000000000000',\n CONFIGURATION : 'f000aa02-0451-4000-b000-000000000000',\n PERIOD : 'f000aa03-0451-4000-b000-000000000000'\n },\n\n HUMIDITY : {\n SERVICE : 'f000aa20-0451-4000-b000-000000000000',\n DATA : 'f000aa21-0451-4000-b000-000000000000',\n CONFIGURATION : 'f000aa22-0451-4000-b000-000000000000',\n PERIOD : 'f000aa23-0451-4000-b000-000000000000'\n },\n\n BAROMETER : {\n SERVICE : 'f000aa40-0451-4000-b000-000000000000',\n DATA : 'f000aa41-0451-4000-b000-000000000000',\n CONFIGURATION : 'f000aa42-0451-4000-b000-000000000000',\n PERIOD : 'f000aa44-0451-4000-b000-000000000000'\n },\n\n // service not available in model CC2650\n // ACCELEROMETER : {\n // SERVICE : 'f000aa10-0451-4000-b000-000000000000',\n // DATA : 'f000aa11-0451-4000-b000-000000000000',\n // CONFIGURATION : 'f000aa12-0451-4000-b000-000000000000',\n // PERIOD : 'f000aa13-0451-4000-b000-000000000000'\n // },\n\n // service not available in model CC2650\n // MAGNETOMETER : {\n // SERVICE : 'f000aa30-0451-4000-b000-000000000000',\n // DATA : 'f000aa31-0451-4000-b000-000000000000',\n // CONFIGURATION : 'f000aa32-0451-4000-b000-000000000000',\n // PERIOD : 'f000aa33-0451-4000-b000-000000000000'\n // },\n\n // service not available in model CC2650\n // GYROSCOPE : {\n // SERVICE : 'f000aa50-0451-4000-b000-000000000000',\n // DATA : 'f000aa51-0451-4000-b000-000000000000',\n // CONFIGURATION : 'f000aa52-0451-4000-b000-000000000000',\n // PERIOD : 'f000aa53-0451-4000-b000-000000000000'\n // },\n\n MOVEMENT : {\n SERVICE : 'f000aa80-0451-4000-b000-000000000000',\n DATA : 'f000aa81-0451-4000-b000-000000000000',\n CONFIGURATION : 'f000aa82-0451-4000-b000-000000000000',\n PERIOD : 'f000aa83-0451-4000-b000-000000000000'\n },\n\n LIGHT : {\n SERVICE : 'f000aa70-0451-4000-b000-000000000000',\n DATA : 'f000aa71-0451-4000-b000-000000000000',\n CONFIGURATION : 'f000aa72-0451-4000-b000-000000000000',\n PERIOD : 'f000aa73-0451-4000-b000-000000000000'\n },\n\n KEYPRESS : {\n SERVICE : 'f000ffe0-0451-4000-b000-000000000000',\n STATE : 'f000ffe1-0451-4000-b000-000000000000'\n },\n\n __REGISTER__ : {\n SERVICE : 'f000ac00-0451-4000-b000-000000000000',\n DATA : 'f000ac01-0451-4000-b000-000000000000',\n ADDRESS : 'f000ac02-0451-4000-b000-000000000000',\n DEVICE_ID : 'f000ac03-0451-4000-b000-000000000000'\n },\n\n CONTROL : {\n SERVICE : 'f000ccc0-0451-4000-b000-000000000000',\n CURRENT_USED_PARAMETERS : 'f000ccc1-0451-4000-b000-000000000000',\n REQUEST_NEW_PARAMETERS : 'f000ccc2-0451-4000-b000-000000000000',\n DISCONNECT_REQUEST : 'f000ccc3-0451-4000-b000-000000000000'\n },\n\n OAD : {\n SERVICE : 'f000ffc0-0451-4000-b000-000000000000',\n IMAGE_NOTIFY : 'f000ffc1-0451-4000-b000-000000000000',\n IMAGE_BLOCK_REQUEST : 'f000ffc2-0451-4000-b000-000000000000',\n IMAGE_COUNT : 'f000ffc3-0451-4000-b000-000000000000',\n IMAGE_STATUS : 'f000ffc4-0451-4000-b000-000000000000'\n },\n\n IO : {\n SERVICE : 'f000aa64-0451-4000-b000-000000000000',\n DATA : 'f000aa65-0451-4000-b000-000000000000',\n CONFIG : 'f000aa66-0451-4000-b000-000000000000'\n }\n};\n\nexport const TI_SENSORAG_SERVICES: string[] = Object.keys(TiTag).map((key: string) => (TiTag as any)[key].SERVICE);\n","/*\n * Fake Web Bluetooth implementation\n * Replace real browser Bluetooth objects by a much simpler objects that implement some required functionalities\n */\n\nexport class FakeBluetoothDevice {\n gatt: BluetoothRemoteGATTServer | null = null;\n private listeners: {\n [key: string]: EventListener[]\n } = {\n gattserverdisconnected: []\n };\n\n constructor(public id: string, public name: string) {\n }\n\n addEventListener(type: string, listener: EventListener) {\n this.listeners[type] = [\n ...this.listeners[type],\n listener\n ];\n }\n\n disconnect() {\n const mockedEvent = {target: this} as unknown;\n this.listeners['gattserverdisconnected'].forEach(listener => listener(mockedEvent as Event));\n }\n\n clear() {\n this.id = \"\";\n this.name = \"\";\n this.listeners = {\n gattserverdisconnected: []\n };\n }\n}\n\nexport class FakeBluetoothRemoteGATTServer {\n connected = false;\n\n constructor(public device: any, public services: { [key: string]: { service: any, primary: boolean } }) {\n device.gatt = this;\n }\n\n connect() {\n this.connected = true;\n return Promise.resolve(this);\n }\n\n getPrimaryService(service: BluetoothServiceUUID) {\n return Promise.resolve(this.services[service].service);\n }\n\n disconnect() {\n this.device.disconnect();\n this.connected = false;\n }\n}\n\nexport class FakeBluetoothRemoteGATTService {\n constructor(public device: any, public characteristics: any) {\n this.characteristics.service = this;\n }\n\n getCharacteristic(characteristic: BluetoothCharacteristicUUID) {\n return Promise.resolve(this.characteristics[characteristic]);\n }\n}\n\nexport class FakeBluetoothRemoteGATTCharacteristic {\n value: DataView | undefined;\n properties: BluetoothCharacteristicProperties;\n private readonly initialValue: DataView | undefined;\n private listeners: {\n [key: string]: EventListener[]\n } = {\n characteristicvaluechanged: []\n };\n\n constructor(properties: BluetoothCharacteristicProperties, initialValue?: DataView) {\n this.properties = properties;\n this.value = initialValue;\n this.initialValue = initialValue;\n }\n\n readValue() {\n return Promise.resolve(this.value);\n }\n\n addEventListener(type: string, listener: EventListener) {\n this.listeners[type] = [\n ...this.listeners[type],\n listener\n ];\n }\n\n changeValue(value: DataView) {\n this.value = value;\n const mockedEvent = {target: this} as unknown;\n this.listeners['characteristicvaluechanged'].forEach(listener => listener(mockedEvent as Event));\n }\n\n clear() {\n this.value = this.initialValue;\n this.listeners = {\n characteristicvaluechanged: []\n };\n }\n}\n","/*\n * Public API Surface of angular-web-bluetooth\n */\n\nexport * from './lib/platform/browser';\nexport * from './lib/platform/server';\nexport * from './lib/bluetooth.service';\nexport * from './lib/logger.service';\nexport * from './lib/bluetooth.module';\nexport * from './lib/lang/uuids';\nexport * from './lib/test.utils';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":["i1.BrowserWebBluetooth","i2.ConsoleLoggerService"],"mappings":"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"}