enumerate-devices
Version:
A small project to normalize browser differences for enumerating media devices
54 lines (51 loc) • 2.13 kB
JavaScript
module.exports = function (cb) {
if (typeof Promise !== 'function') {
var err = new Error('Device enumeration not supported.');
err.kind = 'METHOD_NOT_AVAILABLE';
if (cb) {
console.warn('module now uses promise based api - callback is deprecated');
return cb(err);
}
throw err;
}
return new Promise(function(resolve, reject) {
var processDevices = function (devices) {
var normalizedDevices = [];
for (var i = 0; i < devices.length; i++) {
var device = devices[i];
//make chrome values match spec
var kind = device.kind || null;
if (kind && kind.toLowerCase() === 'audio') {
kind = 'audioinput';
} else if (kind && kind.toLowerCase() === 'video') {
kind = 'videoinput';
}
normalizedDevices.push({
facing: device.facing || null,
deviceId: device.id || device.deviceId || null,
label: device.label || null,
kind: kind,
groupId: device.groupId || null
});
}
resolve(normalizedDevices);
if (cb) {
console.warn('module now uses promise based api - callback is deprecated');
cb(null, normalizedDevices);
}
};
if (window.navigator && window.navigator.mediaDevices && window.navigator.mediaDevices.enumerateDevices) {
window.navigator.mediaDevices.enumerateDevices().then(processDevices);
} else if (window.MediaStreamTrack && window.MediaStreamTrack.getSources) {
window.MediaStreamTrack.getSources(processDevices);
} else {
var err = new Error('Device enumeration not supported.');
err.kind = 'METHOD_NOT_AVAILABLE';
reject(err);
if (cb) {
console.warn('module now uses promise based api - callback is deprecated');
cb(err);
}
}
});
};