UNPKG

instascan-last

Version:

Webcam-driven QR code scanner.

331 lines (262 loc) 10.5 kB
'use strict'; var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _asyncToGenerator2 = require('babel-runtime/helpers/asyncToGenerator'); var _asyncToGenerator3 = _interopRequireDefault(_asyncToGenerator2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function cameraName(label) { var clean = label.replace(/\s*\([0-9a-f]+(:[0-9a-f]+)?\)\s*$/, ''); return clean || label || null; } var MediaError = function (_Error) { (0, _inherits3.default)(MediaError, _Error); function MediaError(type) { (0, _classCallCheck3.default)(this, MediaError); var _this = (0, _possibleConstructorReturn3.default)(this, (MediaError.__proto__ || (0, _getPrototypeOf2.default)(MediaError)).call(this, 'Cannot access video stream (' + type + ').')); _this.type = type; return _this; } return MediaError; }(Error); var Camera = function () { function Camera(id, name) { (0, _classCallCheck3.default)(this, Camera); this.id = id; this.name = name; this._stream = null; } (0, _createClass3.default)(Camera, [{ key: 'start', value: function () { var _ref = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee2() { var _this2 = this; return _regenerator2.default.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: _context2.next = 2; return Camera._wrapErrors((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee() { return _regenerator2.default.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: _context.next = 2; return navigator.mediaDevices.getUserMedia({ audio: false, video: { deviceId: { exact: _this2.id } } }); case 2: return _context.abrupt('return', _context.sent); case 3: case 'end': return _context.stop(); } } }, _callee, _this2); }))); case 2: this._stream = _context2.sent; return _context2.abrupt('return', this._stream); case 4: case 'end': return _context2.stop(); } } }, _callee2, this); })); function start() { return _ref.apply(this, arguments); } return start; }() }, { key: 'stop', value: function stop() { if (!this._stream) { return; } var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(this._stream.getVideoTracks()), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var stream = _step.value; stream.stop(); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } this._stream = null; } }], [{ key: 'getCameras', value: function () { var _ref3 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee3() { var devices; return _regenerator2.default.wrap(function _callee3$(_context3) { while (1) { switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return this._ensureAccess(); case 2: _context3.next = 4; return navigator.mediaDevices.enumerateDevices(); case 4: devices = _context3.sent; return _context3.abrupt('return', devices.filter(function (d) { return d.kind === 'videoinput'; }).map(function (d) { return new Camera(d.deviceId, cameraName(d.label)); })); case 6: case 'end': return _context3.stop(); } } }, _callee3, this); })); function getCameras() { return _ref3.apply(this, arguments); } return getCameras; }() }, { key: '_ensureAccess', value: function () { var _ref4 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee5() { var _this3 = this; return _regenerator2.default.wrap(function _callee5$(_context5) { while (1) { switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return this._wrapErrors((0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee4() { var access, _iteratorNormalCompletion2, _didIteratorError2, _iteratorError2, _iterator2, _step2, stream; return _regenerator2.default.wrap(function _callee4$(_context4) { while (1) { switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return navigator.mediaDevices.getUserMedia({ video: true }); case 2: access = _context4.sent; _iteratorNormalCompletion2 = true; _didIteratorError2 = false; _iteratorError2 = undefined; _context4.prev = 6; for (_iterator2 = (0, _getIterator3.default)(access.getVideoTracks()); !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { stream = _step2.value; stream.stop(); } _context4.next = 14; break; case 10: _context4.prev = 10; _context4.t0 = _context4['catch'](6); _didIteratorError2 = true; _iteratorError2 = _context4.t0; case 14: _context4.prev = 14; _context4.prev = 15; if (!_iteratorNormalCompletion2 && _iterator2.return) { _iterator2.return(); } case 17: _context4.prev = 17; if (!_didIteratorError2) { _context4.next = 20; break; } throw _iteratorError2; case 20: return _context4.finish(17); case 21: return _context4.finish(14); case 22: case 'end': return _context4.stop(); } } }, _callee4, _this3, [[6, 10, 14, 22], [15,, 17, 21]]); }))); case 2: return _context5.abrupt('return', _context5.sent); case 3: case 'end': return _context5.stop(); } } }, _callee5, this); })); function _ensureAccess() { return _ref4.apply(this, arguments); } return _ensureAccess; }() }, { key: '_wrapErrors', value: function () { var _ref6 = (0, _asyncToGenerator3.default)( /*#__PURE__*/_regenerator2.default.mark(function _callee6(fn) { return _regenerator2.default.wrap(function _callee6$(_context6) { while (1) { switch (_context6.prev = _context6.next) { case 0: _context6.prev = 0; _context6.next = 3; return fn(); case 3: return _context6.abrupt('return', _context6.sent); case 6: _context6.prev = 6; _context6.t0 = _context6['catch'](0); if (!_context6.t0.name) { _context6.next = 12; break; } throw new MediaError(_context6.t0.name); case 12: throw _context6.t0; case 13: case 'end': return _context6.stop(); } } }, _callee6, this, [[0, 6]]); })); function _wrapErrors(_x) { return _ref6.apply(this, arguments); } return _wrapErrors; }() }]); return Camera; }(); module.exports = Camera;