UNPKG

gopro-js

Version:

A Promise based JavaScript GoPro Controller/API Wrapper (Unofficial)

247 lines (210 loc) 8.85 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _axios = require('axios'); var _axios2 = _interopRequireDefault(_axios); var _macAddress = require('mac-address'); var _macAddress2 = _interopRequireDefault(_macAddress); var _GpControlValues = require('./GpControlValues'); var _GpControlValues2 = _interopRequireDefault(_GpControlValues); var _utils = require('./utils'); var _errors = require('./errors'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var EMPTY = 'empty'; var RETRIES = 10; var RETRY_DELAY = 200; var dgram = void 0; try { dgram = require('dgram'); } catch (_) { dgram = EMPTY; // Browser does not support dgram } var GpControlAPI = function () { function GpControlAPI() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, ip = _ref.ip, mac = _ref.mac; _classCallCheck(this, GpControlAPI); this.ip = ip || '10.5.5.9'; this._bufferMac(mac); } _createClass(GpControlAPI, [{ key: 'discover', value: function discover() { var _this = this; return this.request().then(function (_ref2) { var info = _ref2.info; return { model: info.model_name, mac: _this._bufferMac(info.ap_mac) }; }); } }, { key: 'request', value: function request() { var _this2 = this; var path = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var _ref3 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, _ref3$port = _ref3.port, port = _ref3$port === undefined ? '' : _ref3$port, _ref3$endpoint = _ref3.endpoint, endpoint = _ref3$endpoint === undefined ? 'gpControl' : _ref3$endpoint, _ref3$busyCheck = _ref3.busyCheck, busyCheck = _ref3$busyCheck === undefined ? true : _ref3$busyCheck, _ref3$retries = _ref3.retries, retries = _ref3$retries === undefined ? RETRIES : _ref3$retries; var url = 'http://' + this.ip + (0, _utils.prefixedStr)(port, ':') + '/gp/' + endpoint + (0, _utils.prefixedStr)(path, '/'); var promise = function promise() { return _axios2.default.get(url, { timeout: 5000 }).catch(function () { return new _errors.NotFoundError(); }).then(function (r) { return r.data; }); }; var retry = function retry() { return _this2.request(path, { endpoint: endpoint, port: port, retries: retries - 1, busyCheck: busyCheck }); }; if (!busyCheck) return promise();else if (retries === 0) return new _errors.PromiseError('Camera is Busy.');else return this.status('System.BUSY').then(function (busy) { return busy ? _this2.delay(RETRY_DELAY).then(retry).then(promise) : promise(); }); } }, { key: '_command', value: function _command(path, options) { return this.request('command' + (0, _utils.prefixedStr)(path, '/'), options); } }, { key: 'delay', value: function delay(t) { return new Promise(function (resolve) { return setTimeout(resolve, t); }); } }, { key: 'status', value: function status(path) { return this.request('status', { busyCheck: false }).then(function (s) { if (!path) return Promise.resolve(s); var _valueFinder = (0, _utils.valueFinder)(_GpControlValues2.default, 'Status.' + path), value = _valueFinder.value; value = value && s.status[value]; if (value !== undefined) return Promise.resolve(value);else return new _errors.PromiseError('Invalid \'Status.' + path + '\''); }); } }, { key: 'mode', value: function mode(_mode, submode) { var m = (0, _utils.valueFinder)(_GpControlValues2.default, 'Mode.' + _mode).value; if (m !== undefined && !submode) return this._command('mode?p=' + m); var s = (0, _utils.valueFinder)(_GpControlValues2.default, 'Mode.' + _mode + '.SubMode.' + submode).value; if ((m && s) !== undefined) return this._command('sub_mode?mode=' + m + '&sub_mode=' + (s || 0)); return new _errors.PromiseError('Invalid \'Mode.' + _mode + '\' or \'Mode.' + _mode + '.SubMode.' + submode + '\''); } }, { key: 'set', value: function set(path) { var fullPath = 'Mode.' + path; var _valueFinder2 = (0, _utils.valueFinder)(_GpControlValues2.default, fullPath), value = _valueFinder2.value, setting = _valueFinder2.setting; if ((value && setting) !== undefined) return this.request('setting/' + setting + '/' + value);else return new _errors.PromiseError('Invalid setting \'' + fullPath + '\''); } }, { key: 'shutter', value: function shutter() { var _this3 = this; var delay = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0; var duration = arguments[1]; var click = function click() { var on = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true; return _this3._command('shutter?p=' + (on ? 1 : 0), { busyCheck: false }); }; var start = function start() { return delay > 0 ? _this3.delay(delay).then(click) : click(); }; if (!duration) return start();else return start().then(function () { return _this3.delay(duration); }).then(function () { return click(false); }); } }, { key: 'powerOff', value: function powerOff() { return this._command('system/sleep'); } }, { key: 'listMedia', value: function listMedia() { return this.request('', { endpoint: 'gpMediaList', port: 8080 }); } }, { key: 'deleteLast', value: function deleteLast() { var _this4 = this; var files = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 1; var promise = Promise.resolve(); for (var i = 0; i < files; i += 1) { promise = promise.then(function () { return _this4._command('storage/delete/last'); }); } return promise; } }, { key: 'deleteFile', value: function deleteFile(folder, file) { return this._command('storage/delete?p=' + folder + '/' + file); } }, { key: 'deleteAll', value: function deleteAll() { return this._command('storage/delete/all'); } }, { key: '_bufferMac', value: function _bufferMac(macAddress) { if (macAddress instanceof Buffer && macAddress.length === _macAddress2.default.LENGTH) this.mac = macAddress;else if (macAddress instanceof Array) { this.mac = macAddress.length === _macAddress2.default.LENGTH && Buffer.from(macAddress); } else if (macAddress) { this.mac = _macAddress2.default.toBuffer(macAddress.replace(/^(..)(..)(..)(..)(..)(..)$/, '$1:$2:$3:$4:$5:$6')); } return this.mac; } }, { key: 'powerOn', value: function powerOn() { var _this5 = this; if (dgram === EMPTY) return new _errors.PromiseError('powerOn not supported on browser yet.');else if (!this.mac) return new _errors.PromiseError('Invalid MAC Address.'); return Promise.resolve().then(function () { var _ref4 = [new Buffer(102), _this5.mac.length], message = _ref4[0], size = _ref4[1]; for (var i = 0; i < 6; i += 1) { message[i] = 0xff; }for (var j = 0; j < 16; j += 1) { var c = 6 + j * size; for (var k = 0; k < size; k += 1) { message[c + k] = _this5.mac[k]; } } var socket = dgram.createSocket('udp4'); var send = function send(port) { var callback = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : function () { return socket.close(); }; return socket.send(message, 0, message.length, port, _this5.ip, callback); }; send(9, function () { return send(7); }); }); } }]); return GpControlAPI; }(); exports.default = GpControlAPI;