UNPKG

dav

Version:

WebDAV, CalDAV, and CardDAV client for nodejs and the browser

309 lines (237 loc) 11.2 kB
'use strict'; Object.defineProperty(exports, '__esModule', { value: true }); var _get = function get(_x2, _x3, _x4) { var _again = true; _function: while (_again) { var object = _x2, property = _x3, receiver = _x4; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x2 = parent; _x3 = property; _x4 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } }; 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; }; })(); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } var _co = require('co'); var _co2 = _interopRequireDefault(_co); var _querystring = require('querystring'); var _querystring2 = _interopRequireDefault(_querystring); var _xmlhttprequest = require('./xmlhttprequest'); var _xmlhttprequest2 = _interopRequireDefault(_xmlhttprequest); var Transport = (function () { /** * @param {dav.Credentials} credentials user authorization. */ function Transport(credentials) { _classCallCheck(this, Transport); this.credentials = credentials || null; } /** * @param {dav.Request} request object with request info. * @return {Promise} a promise that will be resolved with an xhr request after * its readyState is 4 or the result of applying an optional request * `transformResponse` function to the xhr object after its readyState is 4. * * Options: * * (Object) sandbox - optional request sandbox. */ _createClass(Transport, [{ key: 'send', value: function send() {} }]); return Transport; })(); exports.Transport = Transport; var Basic = (function (_Transport) { _inherits(Basic, _Transport); /** * @param {dav.Credentials} credentials user authorization. */ function Basic(credentials) { _classCallCheck(this, Basic); _get(Object.getPrototypeOf(Basic.prototype), 'constructor', this).call(this, credentials); } /** * @param {dav.Credentials} credentials user authorization. */ _createClass(Basic, [{ key: 'send', value: function send(request, url, options) { return (0, _co2['default'])(regeneratorRuntime.mark(function callee$2$0() { var sandbox, transformRequest, transformResponse, onerror, xhr, result; return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: sandbox = options && options.sandbox; transformRequest = request.transformRequest; transformResponse = request.transformResponse; onerror = request.onerror; xhr = new _xmlhttprequest2['default'](); if (sandbox) sandbox.add(xhr); xhr.open(request.method, url, true, /* async */ this.credentials.username, this.credentials.password); if (transformRequest) transformRequest(xhr); result = undefined; context$3$0.prev = 9; context$3$0.next = 12; return xhr.send(request.requestData); case 12: result = transformResponse ? transformResponse(xhr) : xhr; context$3$0.next = 19; break; case 15: context$3$0.prev = 15; context$3$0.t0 = context$3$0['catch'](9); if (onerror) onerror(context$3$0.t0); throw context$3$0.t0; case 19: return context$3$0.abrupt('return', result); case 20: case 'end': return context$3$0.stop(); } }, callee$2$0, this, [[9, 15]]); }).bind(this)); } }]); return Basic; })(Transport); exports.Basic = Basic; var OAuth2 = (function (_Transport2) { _inherits(OAuth2, _Transport2); function OAuth2(credentials) { _classCallCheck(this, OAuth2); _get(Object.getPrototypeOf(OAuth2.prototype), 'constructor', this).call(this, credentials); } /** * @return {Promise} promise that will resolve with access token. */ _createClass(OAuth2, [{ key: 'send', value: function send(request, url) { var options = arguments.length <= 2 || arguments[2] === undefined ? {} : arguments[2]; return (0, _co2['default'])(regeneratorRuntime.mark(function callee$2$0() { var sandbox, transformRequest, transformResponse, onerror, result, xhr, token; return regeneratorRuntime.wrap(function callee$2$0$(context$3$0) { while (1) switch (context$3$0.prev = context$3$0.next) { case 0: sandbox = options.sandbox; transformRequest = request.transformRequest; transformResponse = request.transformResponse; onerror = request.onerror; if (!('retry' in options)) options.retry = true; result = undefined, xhr = undefined; context$3$0.prev = 6; context$3$0.next = 9; return access(this.credentials, options); case 9: token = context$3$0.sent; xhr = new _xmlhttprequest2['default'](); if (sandbox) sandbox.add(xhr); xhr.open(request.method, url, true /* async */); xhr.setRequestHeader('Authorization', 'Bearer ' + token); if (transformRequest) transformRequest(xhr); context$3$0.next = 17; return xhr.send(request.requestData); case 17: result = transformResponse ? transformResponse(xhr) : xhr; context$3$0.next = 28; break; case 20: context$3$0.prev = 20; context$3$0.t0 = context$3$0['catch'](6); if (!(options.retry && xhr.status === 401)) { context$3$0.next = 26; break; } // Force expiration. this.credentials.expiration = 0; // Retry once at most. options.retry = false; return context$3$0.abrupt('return', this.send(request, url, options)); case 26: if (onerror) onerror(context$3$0.t0); throw context$3$0.t0; case 28: return context$3$0.abrupt('return', result); case 29: case 'end': return context$3$0.stop(); } }, callee$2$0, this, [[6, 20]]); }).bind(this)); } }]); return OAuth2; })(Transport); exports.OAuth2 = OAuth2; function access(credentials, options) { if (!credentials.accessToken) { return getAccessToken(credentials, options); } if (credentials.refreshToken && isExpired(credentials)) { return refreshAccessToken(credentials, options); } return Promise.resolve(credentials.accessToken); } function isExpired(credentials) { return typeof credentials.expiration === 'number' && Date.now() > credentials.expiration; } var getAccessToken = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$0(credentials, options) { var sandbox, xhr, data, now, response; return regeneratorRuntime.wrap(function callee$0$0$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: sandbox = options.sandbox; xhr = new _xmlhttprequest2['default'](); if (sandbox) sandbox.add(xhr); xhr.open('POST', credentials.tokenUrl, true /* async */); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); data = _querystring2['default'].stringify({ code: credentials.authorizationCode, redirect_uri: credentials.redirectUrl, client_id: credentials.clientId, client_secret: credentials.clientSecret, grant_type: 'authorization_code' }); now = Date.now(); context$1$0.next = 9; return xhr.send(data); case 9: response = JSON.parse(xhr.responseText); credentials.accessToken = response.access_token; credentials.refreshToken = 'refresh_token' in response ? response.refresh_token : null; credentials.expiration = 'expires_in' in response ? now + response.expires_in : null; return context$1$0.abrupt('return', response.access_token); case 14: case 'end': return context$1$0.stop(); } }, callee$0$0, this); })); var refreshAccessToken = _co2['default'].wrap(regeneratorRuntime.mark(function callee$0$0(credentials, options) { var sandbox, xhr, data, now, response; return regeneratorRuntime.wrap(function callee$0$0$(context$1$0) { while (1) switch (context$1$0.prev = context$1$0.next) { case 0: sandbox = options.sandbox; xhr = new _xmlhttprequest2['default'](); if (sandbox) sandbox.add(xhr); xhr.open('POST', credentials.tokenUrl, true /* async */); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); data = _querystring2['default'].stringify({ client_id: credentials.clientId, client_secret: credentials.clientSecret, refresh_token: credentials.refreshToken, grant_type: 'refresh_token' }); now = Date.now(); context$1$0.next = 9; return xhr.send(data); case 9: response = JSON.parse(xhr.responseText); credentials.accessToken = response.access_token; credentials.expiration = 'expires_in' in response ? now + response.expires_in : null; return context$1$0.abrupt('return', response.access_token); case 13: case 'end': return context$1$0.stop(); } }, callee$0$0, this); }));