| Index: chrome/browser/resources/bluetooth_internals/device_broker.js
|
| diff --git a/chrome/browser/resources/bluetooth_internals/device_broker.js b/chrome/browser/resources/bluetooth_internals/device_broker.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..60181338e34842d52cef69e4882565fea54c7f69
|
| --- /dev/null
|
| +++ b/chrome/browser/resources/bluetooth_internals/device_broker.js
|
| @@ -0,0 +1,55 @@
|
| +// Copyright 2017 The Chromium Authors. All rights reserved.
|
| +// Use of this source code is governed by a BSD-style license that can be
|
| +// found in the LICENSE file.
|
| +
|
| +/**
|
| + * Javascript for device_broker, served from chrome://bluetooth-internals/.
|
| + * Provides a single source to access DevicePtrs. DevicePtrs are cached for
|
| + * for repeated use. Multiple connection requests will result in the same
|
| + * DevicePtr being shared among all requesters.
|
| + */
|
| +
|
| +// Expose for testing.
|
| +/** @type {!Map<string, !interfaces.BluetoothDevice.DevicePtr|!Promise} */
|
| +var connectedDevices = null;
|
| +
|
| +cr.define('device_broker', function() {
|
| + connectedDevices = new Map();
|
| +
|
| + /**
|
| + * Creates a GATT connection to the device with |address|. If a connection to
|
| + * the device already exists, the promise is resolved with the existing
|
| + * DevicePtr. If a connection is in progress, the promise resolves when
|
| + * the existing connection request promise is fulfilled.
|
| + * @param {string} address
|
| + * @return {!Promise<!interfaces.BluetoothDevice.DevicePtr>}
|
| + */
|
| + function connectToDevice(address) {
|
| + var deviceOrPromise = connectedDevices.get(address) || null;
|
| + if (deviceOrPromise !== null)
|
| + return Promise.resolve(deviceOrPromise);
|
| +
|
| + var promise = adapter_broker.getAdapterBroker().then(
|
| + function(adapterBroker) {
|
| + return adapterBroker.connectToDevice(address);
|
| + }).then(function(device) {
|
| + connectedDevices.set(address, device);
|
| +
|
| + device.ptr.setConnectionErrorHandler(function() {
|
| + connectedDevices.delete(address);
|
| + });
|
| +
|
| + return device;
|
| + }).catch(function(error) {
|
| + connectedDevices.delete(address);
|
| + throw error;
|
| + });
|
| +
|
| + connectedDevices.set(address, promise);
|
| + return promise;
|
| + }
|
| +
|
| + return {
|
| + connectToDevice: connectToDevice
|
| + };
|
| +});
|
|
|