etcher-sdk
Version:
98 lines • 3.73 kB
JavaScript
;
/*
* Copyright 2018 balena.io
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.DriverlessDeviceAdapter = void 0;
const process_1 = require("process");
const lazy_1 = require("../../lazy");
const driverless_1 = require("../../source-destination/driverless");
const utils_1 = require("../../utils");
const adapter_1 = require("./adapter");
const SCAN_INTERVAL = 1000;
class DriverlessDeviceAdapter$ extends adapter_1.Adapter {
constructor() {
super(...arguments);
// Emits 'attach', 'detach' and 'ready'
this.drives = new Map();
this.running = false;
this.ready = false;
}
start() {
this.running = true;
this.scanLoop();
}
stop() {
this.running = false;
this.ready = false;
this.drives.clear();
}
async scanLoop() {
if (this.listDriverlessDevices === undefined) {
// This import fails on anything else than win32 and this class will only be exported on win32
this.listDriverlessDevices = (await Promise.resolve().then(() => require('winusb-driver-generator'))).listDriverlessDevices;
}
while (this.running) {
this.scan();
if (!this.ready) {
this.ready = true;
this.emit('ready');
}
await (0, utils_1.delay)(SCAN_INTERVAL);
}
}
scan() {
let drives;
try {
// winusb-driver-generator may fail with "Requested resource busy or similar call already in progress"
drives = this.listDrives();
}
catch (error) {
return;
}
if (this.running) {
// we may have been stopped while listing the drives.
const oldDevices = new Set(this.drives.keys());
const newDevices = new Set(drives.keys());
for (const removed of (0, utils_1.difference)(oldDevices, newDevices)) {
this.emit('detach', this.drives.get(removed));
this.drives.delete(removed);
}
for (const added of (0, utils_1.difference)(newDevices, oldDevices)) {
const drive = drives.get(added);
const driverlessDevice = new driverless_1.DriverlessDevice(drive);
this.emit('attach', driverlessDevice);
this.drives.set(added, driverlessDevice);
}
}
}
listDrives() {
var _a;
const isUsbBootCapableUSBDevice = (_a = (0, lazy_1.getRaspberrypiUsbboot)()) === null || _a === void 0 ? void 0 : _a.isUsbBootCapableUSBDevice;
const result = new Map();
if (isUsbBootCapableUSBDevice == null) {
return result;
}
const devices = this.listDriverlessDevices();
for (const device of devices) {
if (isUsbBootCapableUSBDevice(device.vid, device.pid)) {
result.set(device.did, device);
}
}
return result;
}
}
exports.DriverlessDeviceAdapter = process_1.platform === 'win32' ? DriverlessDeviceAdapter$ : undefined;
//# sourceMappingURL=driverless.js.map