@cubejs-client/core
Advanced tools
Comparing version 0.10.61 to 0.11.0
@@ -6,2 +6,13 @@ # Change Log | ||
# [0.11.0](https://github.com/statsbotco/cubejs-client/compare/v0.10.62...v0.11.0) (2019-10-15) | ||
### Features | ||
* Sockets Preview ([#231](https://github.com/statsbotco/cubejs-client/issues/231)) ([89fc762](https://github.com/statsbotco/cubejs-client/commit/89fc762)), closes [#221](https://github.com/statsbotco/cubejs-client/issues/221) | ||
## [0.10.61](https://github.com/statsbotco/cubejs-client/compare/v0.10.60...v0.10.61) (2019-10-10) | ||
@@ -8,0 +19,0 @@ |
@@ -0,12 +1,11 @@ | ||
import _objectSpread from '@babel/runtime/helpers/objectSpread'; | ||
import _regeneratorRuntime from '@babel/runtime/regenerator'; | ||
import 'regenerator-runtime/runtime'; | ||
import _asyncToGenerator from '@babel/runtime/helpers/asyncToGenerator'; | ||
import 'core-js/modules/es6.object.assign'; | ||
import _typeof from '@babel/runtime/helpers/typeof'; | ||
import _classCallCheck from '@babel/runtime/helpers/classCallCheck'; | ||
import _createClass from '@babel/runtime/helpers/createClass'; | ||
import 'core-js/modules/es6.promise'; | ||
import fetch from 'cross-fetch'; | ||
import 'core-js/modules/es6.number.constructor'; | ||
import 'core-js/modules/es6.number.parse-float'; | ||
import _objectSpread from '@babel/runtime/helpers/objectSpread'; | ||
import 'core-js/modules/web.dom.iterable'; | ||
@@ -16,2 +15,3 @@ import 'core-js/modules/es6.array.iterator'; | ||
import _slicedToArray from '@babel/runtime/helpers/slicedToArray'; | ||
import 'core-js/modules/es6.object.assign'; | ||
import _defineProperty from '@babel/runtime/helpers/defineProperty'; | ||
@@ -32,2 +32,4 @@ import 'core-js/modules/es6.array.reduce'; | ||
import 'core-js/modules/es6.function.name'; | ||
import fetch from 'cross-fetch'; | ||
import 'url-search-params-polyfill'; | ||
@@ -736,2 +738,75 @@ var moment = momentRange.extendMoment(Moment); | ||
var HttpTransport = | ||
/*#__PURE__*/ | ||
function () { | ||
function HttpTransport(_ref) { | ||
var authorization = _ref.authorization, | ||
apiUrl = _ref.apiUrl; | ||
_classCallCheck(this, HttpTransport); | ||
this.authorization = authorization; | ||
this.apiUrl = apiUrl; | ||
} | ||
_createClass(HttpTransport, [{ | ||
key: "request", | ||
value: function request(method, params) { | ||
var _this = this; | ||
var searchParams = new URLSearchParams(params && Object.keys(params).map(function (k) { | ||
return _defineProperty({}, k, _typeof(params[k]) === 'object' ? JSON.stringify(params[k]) : params[k]); | ||
}).reduce(function (a, b) { | ||
return _objectSpread({}, a, b); | ||
}, {})); | ||
var runRequest = function runRequest() { | ||
return fetch("".concat(_this.apiUrl).concat(method, "?").concat(searchParams), { | ||
headers: { | ||
Authorization: _this.authorization, | ||
'Content-Type': 'application/json' | ||
} | ||
}); | ||
}; | ||
return { | ||
subscribe: function () { | ||
var _subscribe = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee(callback) { | ||
var _this2 = this; | ||
var result; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return runRequest(); | ||
case 2: | ||
result = _context.sent; | ||
return _context.abrupt("return", callback(result, function () { | ||
return _this2.subscribe(callback); | ||
})); | ||
case 4: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
return function subscribe(_x) { | ||
return _subscribe.apply(this, arguments); | ||
}; | ||
}() | ||
}; | ||
} | ||
}]); | ||
return HttpTransport; | ||
}(); | ||
var API_URL = "https://statsbot.co/cubejs-api/v1"; | ||
@@ -762,5 +837,15 @@ var mutexCounter = 0; | ||
if (_typeof(apiToken) === 'object') { | ||
options = apiToken; | ||
apiToken = undefined; | ||
} | ||
options = options || {}; | ||
this.apiToken = apiToken; | ||
this.apiUrl = options.apiUrl || API_URL; | ||
this.transport = options.transport || new HttpTransport({ | ||
authorization: apiToken, | ||
apiUrl: this.apiUrl | ||
}); | ||
this.pollInterval = options.pollInterval || 5; | ||
} | ||
@@ -770,9 +855,4 @@ | ||
key: "request", | ||
value: function request(url, config) { | ||
return fetch("".concat(this.apiUrl).concat(url), Object.assign({ | ||
headers: { | ||
Authorization: this.apiToken, | ||
'Content-Type': 'application/json' | ||
} | ||
}, config || {})); | ||
value: function request(method, params) { | ||
return this.transport.request(method, params); | ||
} | ||
@@ -782,2 +862,4 @@ }, { | ||
value: function loadMethod(request, toResult, options, callback) { | ||
var _this = this; | ||
var mutexValue = ++mutexCounter; | ||
@@ -797,9 +879,6 @@ | ||
var checkMutex = function checkMutex() { | ||
if (options.mutexObj && options.mutexObj[mutexKey] !== mutexValue) { | ||
throw MUTEX_ERROR; | ||
} | ||
}; | ||
var requestInstance = request(); | ||
var unsubscribed = false; | ||
var loadImpl = | ||
var checkMutex = | ||
/*#__PURE__*/ | ||
@@ -810,3 +889,2 @@ function () { | ||
_regeneratorRuntime.mark(function _callee() { | ||
var response, body; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
@@ -816,30 +894,166 @@ while (1) { | ||
case 0: | ||
_context.next = 2; | ||
return request(); | ||
if (!(options.mutexObj && options.mutexObj[mutexKey] !== mutexValue)) { | ||
_context.next = 6; | ||
break; | ||
} | ||
case 2: | ||
response = _context.sent; | ||
unsubscribed = true; | ||
if (!requestInstance.unsubscribe) { | ||
_context.next = 5; | ||
break; | ||
} | ||
_context.next = 5; | ||
return requestInstance.unsubscribe(); | ||
case 5: | ||
throw MUTEX_ERROR; | ||
case 6: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
return function checkMutex() { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
var loadImpl = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref2 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee4(response, next) { | ||
var subscribeNext, continueWait, body, error, result; | ||
return _regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
subscribeNext = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref3 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee2() { | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
if (!(options.subscribe && !unsubscribed)) { | ||
_context2.next = 8; | ||
break; | ||
} | ||
if (!requestInstance.unsubscribe) { | ||
_context2.next = 5; | ||
break; | ||
} | ||
return _context2.abrupt("return", next()); | ||
case 5: | ||
_context2.next = 7; | ||
return new Promise(function (resolve) { | ||
return setTimeout(function () { | ||
return resolve(); | ||
}, _this.pollInterval * 1000); | ||
}); | ||
case 7: | ||
return _context2.abrupt("return", next()); | ||
case 8: | ||
return _context2.abrupt("return", null); | ||
case 9: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
return function subscribeNext() { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}(); | ||
continueWait = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref4 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee3(wait) { | ||
return _regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
if (unsubscribed) { | ||
_context3.next = 5; | ||
break; | ||
} | ||
if (!wait) { | ||
_context3.next = 4; | ||
break; | ||
} | ||
_context3.next = 4; | ||
return new Promise(function (resolve) { | ||
return setTimeout(function () { | ||
return resolve(); | ||
}, _this.pollInterval * 1000); | ||
}); | ||
case 4: | ||
return _context3.abrupt("return", next()); | ||
case 5: | ||
return _context3.abrupt("return", null); | ||
case 6: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
})); | ||
return function continueWait(_x3) { | ||
return _ref4.apply(this, arguments); | ||
}; | ||
}(); | ||
if (!(response.status === 502)) { | ||
_context.next = 6; | ||
_context4.next = 6; | ||
break; | ||
} | ||
checkMutex(); | ||
return _context.abrupt("return", loadImpl()); | ||
_context4.next = 5; | ||
return checkMutex(); | ||
case 5: | ||
return _context4.abrupt("return", continueWait(true)); | ||
case 6: | ||
_context.next = 8; | ||
_context4.next = 8; | ||
return response.json(); | ||
case 8: | ||
body = _context.sent; | ||
body = _context4.sent; | ||
if (!(body.error === 'Continue wait')) { | ||
_context.next = 13; | ||
_context4.next = 14; | ||
break; | ||
} | ||
checkMutex(); | ||
_context4.next = 12; | ||
return checkMutex(); | ||
case 12: | ||
if (options.progressCallback) { | ||
@@ -849,38 +1063,123 @@ options.progressCallback(new ProgressResult(body)); | ||
return _context.abrupt("return", loadImpl()); | ||
return _context4.abrupt("return", continueWait()); | ||
case 13: | ||
case 14: | ||
if (!(response.status !== 200)) { | ||
_context.next = 16; | ||
_context4.next = 27; | ||
break; | ||
} | ||
checkMutex(); | ||
throw new Error(body.error); | ||
_context4.next = 17; | ||
return checkMutex(); | ||
case 16: | ||
checkMutex(); | ||
return _context.abrupt("return", toResult(body)); | ||
case 17: | ||
if (!(!options.subscribe && requestInstance.unsubscribe)) { | ||
_context4.next = 20; | ||
break; | ||
} | ||
case 18: | ||
_context4.next = 20; | ||
return requestInstance.unsubscribe(); | ||
case 20: | ||
error = new Error(body.error); // TODO error class | ||
if (!callback) { | ||
_context4.next = 25; | ||
break; | ||
} | ||
callback(error); | ||
_context4.next = 26; | ||
break; | ||
case 25: | ||
throw error; | ||
case 26: | ||
return _context4.abrupt("return", subscribeNext()); | ||
case 27: | ||
_context4.next = 29; | ||
return checkMutex(); | ||
case 29: | ||
if (!(!options.subscribe && requestInstance.unsubscribe)) { | ||
_context4.next = 32; | ||
break; | ||
} | ||
_context4.next = 32; | ||
return requestInstance.unsubscribe(); | ||
case 32: | ||
result = toResult(body); | ||
if (!callback) { | ||
_context4.next = 37; | ||
break; | ||
} | ||
callback(null, result); | ||
_context4.next = 38; | ||
break; | ||
case 37: | ||
return _context4.abrupt("return", result); | ||
case 38: | ||
return _context4.abrupt("return", subscribeNext()); | ||
case 39: | ||
case "end": | ||
return _context.stop(); | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
}, _callee4, this); | ||
})); | ||
return function loadImpl() { | ||
return _ref.apply(this, arguments); | ||
return function loadImpl(_x, _x2) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
var promise = mutexPromise(requestInstance.subscribe(loadImpl)); | ||
if (callback) { | ||
mutexPromise(loadImpl()).then(function (r) { | ||
return callback(null, r); | ||
}, function (e) { | ||
return callback(e); | ||
}); | ||
return { | ||
unsubscribe: function () { | ||
var _unsubscribe = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee5() { | ||
return _regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
unsubscribed = true; | ||
if (!requestInstance.unsubscribe) { | ||
_context5.next = 3; | ||
break; | ||
} | ||
return _context5.abrupt("return", requestInstance.unsubscribe()); | ||
case 3: | ||
return _context5.abrupt("return", null); | ||
case 4: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
})); | ||
return function unsubscribe() { | ||
return _unsubscribe.apply(this, arguments); | ||
}; | ||
}() | ||
}; | ||
} else { | ||
return mutexPromise(loadImpl()); | ||
return promise; | ||
} | ||
@@ -919,6 +1218,8 @@ } | ||
value: function load(query, options, callback) { | ||
var _this = this; | ||
var _this2 = this; | ||
return this.loadMethod(function () { | ||
return _this.request("/load?query=".concat(encodeURIComponent(JSON.stringify(query)))); | ||
return _this2.request("load", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
@@ -939,6 +1240,8 @@ return new ResultSet(body); | ||
value: function sql(query, options, callback) { | ||
var _this2 = this; | ||
var _this3 = this; | ||
return this.loadMethod(function () { | ||
return _this2.request("/sql?query=".concat(JSON.stringify(query))); | ||
return _this3.request("sql", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
@@ -958,6 +1261,6 @@ return new SqlQuery(body); | ||
value: function meta(options, callback) { | ||
var _this3 = this; | ||
var _this4 = this; | ||
return this.loadMethod(function () { | ||
return _this3.request("/meta"); | ||
return _this4.request("meta"); | ||
}, function (body) { | ||
@@ -967,2 +1270,17 @@ return new Meta(body); | ||
} | ||
}, { | ||
key: "subscribe", | ||
value: function subscribe(query, options, callback) { | ||
var _this5 = this; | ||
return this.loadMethod(function () { | ||
return _this5.request("subscribe", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
return new ResultSet(body); | ||
}, _objectSpread({}, options, { | ||
subscribe: true | ||
}), callback); | ||
} | ||
}]); | ||
@@ -1000,1 +1318,2 @@ | ||
export default index; | ||
export { HttpTransport }; |
'use strict'; | ||
Object.defineProperty(exports, '__esModule', { value: true }); | ||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; } | ||
var _objectSpread = _interopDefault(require('@babel/runtime/helpers/objectSpread')); | ||
var _regeneratorRuntime = _interopDefault(require('@babel/runtime/regenerator')); | ||
require('regenerator-runtime/runtime'); | ||
var _asyncToGenerator = _interopDefault(require('@babel/runtime/helpers/asyncToGenerator')); | ||
require('core-js/modules/es6.object.assign'); | ||
var _typeof = _interopDefault(require('@babel/runtime/helpers/typeof')); | ||
var _classCallCheck = _interopDefault(require('@babel/runtime/helpers/classCallCheck')); | ||
var _createClass = _interopDefault(require('@babel/runtime/helpers/createClass')); | ||
require('core-js/modules/es6.promise'); | ||
var fetch = _interopDefault(require('cross-fetch')); | ||
require('core-js/modules/es6.number.constructor'); | ||
require('core-js/modules/es6.number.parse-float'); | ||
var _objectSpread = _interopDefault(require('@babel/runtime/helpers/objectSpread')); | ||
require('core-js/modules/web.dom.iterable'); | ||
@@ -20,2 +21,3 @@ require('core-js/modules/es6.array.iterator'); | ||
var _slicedToArray = _interopDefault(require('@babel/runtime/helpers/slicedToArray')); | ||
require('core-js/modules/es6.object.assign'); | ||
var _defineProperty = _interopDefault(require('@babel/runtime/helpers/defineProperty')); | ||
@@ -36,2 +38,4 @@ require('core-js/modules/es6.array.reduce'); | ||
require('core-js/modules/es6.function.name'); | ||
var fetch = _interopDefault(require('cross-fetch')); | ||
require('url-search-params-polyfill'); | ||
@@ -740,2 +744,75 @@ var moment = momentRange.extendMoment(Moment); | ||
var HttpTransport = | ||
/*#__PURE__*/ | ||
function () { | ||
function HttpTransport(_ref) { | ||
var authorization = _ref.authorization, | ||
apiUrl = _ref.apiUrl; | ||
_classCallCheck(this, HttpTransport); | ||
this.authorization = authorization; | ||
this.apiUrl = apiUrl; | ||
} | ||
_createClass(HttpTransport, [{ | ||
key: "request", | ||
value: function request(method, params) { | ||
var _this = this; | ||
var searchParams = new URLSearchParams(params && Object.keys(params).map(function (k) { | ||
return _defineProperty({}, k, _typeof(params[k]) === 'object' ? JSON.stringify(params[k]) : params[k]); | ||
}).reduce(function (a, b) { | ||
return _objectSpread({}, a, b); | ||
}, {})); | ||
var runRequest = function runRequest() { | ||
return fetch("".concat(_this.apiUrl).concat(method, "?").concat(searchParams), { | ||
headers: { | ||
Authorization: _this.authorization, | ||
'Content-Type': 'application/json' | ||
} | ||
}); | ||
}; | ||
return { | ||
subscribe: function () { | ||
var _subscribe = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee(callback) { | ||
var _this2 = this; | ||
var result; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
while (1) { | ||
switch (_context.prev = _context.next) { | ||
case 0: | ||
_context.next = 2; | ||
return runRequest(); | ||
case 2: | ||
result = _context.sent; | ||
return _context.abrupt("return", callback(result, function () { | ||
return _this2.subscribe(callback); | ||
})); | ||
case 4: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
return function subscribe(_x) { | ||
return _subscribe.apply(this, arguments); | ||
}; | ||
}() | ||
}; | ||
} | ||
}]); | ||
return HttpTransport; | ||
}(); | ||
var API_URL = "https://statsbot.co/cubejs-api/v1"; | ||
@@ -766,5 +843,15 @@ var mutexCounter = 0; | ||
if (_typeof(apiToken) === 'object') { | ||
options = apiToken; | ||
apiToken = undefined; | ||
} | ||
options = options || {}; | ||
this.apiToken = apiToken; | ||
this.apiUrl = options.apiUrl || API_URL; | ||
this.transport = options.transport || new HttpTransport({ | ||
authorization: apiToken, | ||
apiUrl: this.apiUrl | ||
}); | ||
this.pollInterval = options.pollInterval || 5; | ||
} | ||
@@ -774,9 +861,4 @@ | ||
key: "request", | ||
value: function request(url, config) { | ||
return fetch("".concat(this.apiUrl).concat(url), Object.assign({ | ||
headers: { | ||
Authorization: this.apiToken, | ||
'Content-Type': 'application/json' | ||
} | ||
}, config || {})); | ||
value: function request(method, params) { | ||
return this.transport.request(method, params); | ||
} | ||
@@ -786,2 +868,4 @@ }, { | ||
value: function loadMethod(request, toResult, options, callback) { | ||
var _this = this; | ||
var mutexValue = ++mutexCounter; | ||
@@ -801,9 +885,6 @@ | ||
var checkMutex = function checkMutex() { | ||
if (options.mutexObj && options.mutexObj[mutexKey] !== mutexValue) { | ||
throw MUTEX_ERROR; | ||
} | ||
}; | ||
var requestInstance = request(); | ||
var unsubscribed = false; | ||
var loadImpl = | ||
var checkMutex = | ||
/*#__PURE__*/ | ||
@@ -814,3 +895,2 @@ function () { | ||
_regeneratorRuntime.mark(function _callee() { | ||
var response, body; | ||
return _regeneratorRuntime.wrap(function _callee$(_context) { | ||
@@ -820,30 +900,166 @@ while (1) { | ||
case 0: | ||
_context.next = 2; | ||
return request(); | ||
if (!(options.mutexObj && options.mutexObj[mutexKey] !== mutexValue)) { | ||
_context.next = 6; | ||
break; | ||
} | ||
case 2: | ||
response = _context.sent; | ||
unsubscribed = true; | ||
if (!requestInstance.unsubscribe) { | ||
_context.next = 5; | ||
break; | ||
} | ||
_context.next = 5; | ||
return requestInstance.unsubscribe(); | ||
case 5: | ||
throw MUTEX_ERROR; | ||
case 6: | ||
case "end": | ||
return _context.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
})); | ||
return function checkMutex() { | ||
return _ref.apply(this, arguments); | ||
}; | ||
}(); | ||
var loadImpl = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref2 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee4(response, next) { | ||
var subscribeNext, continueWait, body, error, result; | ||
return _regeneratorRuntime.wrap(function _callee4$(_context4) { | ||
while (1) { | ||
switch (_context4.prev = _context4.next) { | ||
case 0: | ||
subscribeNext = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref3 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee2() { | ||
return _regeneratorRuntime.wrap(function _callee2$(_context2) { | ||
while (1) { | ||
switch (_context2.prev = _context2.next) { | ||
case 0: | ||
if (!(options.subscribe && !unsubscribed)) { | ||
_context2.next = 8; | ||
break; | ||
} | ||
if (!requestInstance.unsubscribe) { | ||
_context2.next = 5; | ||
break; | ||
} | ||
return _context2.abrupt("return", next()); | ||
case 5: | ||
_context2.next = 7; | ||
return new Promise(function (resolve) { | ||
return setTimeout(function () { | ||
return resolve(); | ||
}, _this.pollInterval * 1000); | ||
}); | ||
case 7: | ||
return _context2.abrupt("return", next()); | ||
case 8: | ||
return _context2.abrupt("return", null); | ||
case 9: | ||
case "end": | ||
return _context2.stop(); | ||
} | ||
} | ||
}, _callee2, this); | ||
})); | ||
return function subscribeNext() { | ||
return _ref3.apply(this, arguments); | ||
}; | ||
}(); | ||
continueWait = | ||
/*#__PURE__*/ | ||
function () { | ||
var _ref4 = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee3(wait) { | ||
return _regeneratorRuntime.wrap(function _callee3$(_context3) { | ||
while (1) { | ||
switch (_context3.prev = _context3.next) { | ||
case 0: | ||
if (unsubscribed) { | ||
_context3.next = 5; | ||
break; | ||
} | ||
if (!wait) { | ||
_context3.next = 4; | ||
break; | ||
} | ||
_context3.next = 4; | ||
return new Promise(function (resolve) { | ||
return setTimeout(function () { | ||
return resolve(); | ||
}, _this.pollInterval * 1000); | ||
}); | ||
case 4: | ||
return _context3.abrupt("return", next()); | ||
case 5: | ||
return _context3.abrupt("return", null); | ||
case 6: | ||
case "end": | ||
return _context3.stop(); | ||
} | ||
} | ||
}, _callee3, this); | ||
})); | ||
return function continueWait(_x3) { | ||
return _ref4.apply(this, arguments); | ||
}; | ||
}(); | ||
if (!(response.status === 502)) { | ||
_context.next = 6; | ||
_context4.next = 6; | ||
break; | ||
} | ||
checkMutex(); | ||
return _context.abrupt("return", loadImpl()); | ||
_context4.next = 5; | ||
return checkMutex(); | ||
case 5: | ||
return _context4.abrupt("return", continueWait(true)); | ||
case 6: | ||
_context.next = 8; | ||
_context4.next = 8; | ||
return response.json(); | ||
case 8: | ||
body = _context.sent; | ||
body = _context4.sent; | ||
if (!(body.error === 'Continue wait')) { | ||
_context.next = 13; | ||
_context4.next = 14; | ||
break; | ||
} | ||
checkMutex(); | ||
_context4.next = 12; | ||
return checkMutex(); | ||
case 12: | ||
if (options.progressCallback) { | ||
@@ -853,38 +1069,123 @@ options.progressCallback(new ProgressResult(body)); | ||
return _context.abrupt("return", loadImpl()); | ||
return _context4.abrupt("return", continueWait()); | ||
case 13: | ||
case 14: | ||
if (!(response.status !== 200)) { | ||
_context.next = 16; | ||
_context4.next = 27; | ||
break; | ||
} | ||
checkMutex(); | ||
throw new Error(body.error); | ||
_context4.next = 17; | ||
return checkMutex(); | ||
case 16: | ||
checkMutex(); | ||
return _context.abrupt("return", toResult(body)); | ||
case 17: | ||
if (!(!options.subscribe && requestInstance.unsubscribe)) { | ||
_context4.next = 20; | ||
break; | ||
} | ||
case 18: | ||
_context4.next = 20; | ||
return requestInstance.unsubscribe(); | ||
case 20: | ||
error = new Error(body.error); // TODO error class | ||
if (!callback) { | ||
_context4.next = 25; | ||
break; | ||
} | ||
callback(error); | ||
_context4.next = 26; | ||
break; | ||
case 25: | ||
throw error; | ||
case 26: | ||
return _context4.abrupt("return", subscribeNext()); | ||
case 27: | ||
_context4.next = 29; | ||
return checkMutex(); | ||
case 29: | ||
if (!(!options.subscribe && requestInstance.unsubscribe)) { | ||
_context4.next = 32; | ||
break; | ||
} | ||
_context4.next = 32; | ||
return requestInstance.unsubscribe(); | ||
case 32: | ||
result = toResult(body); | ||
if (!callback) { | ||
_context4.next = 37; | ||
break; | ||
} | ||
callback(null, result); | ||
_context4.next = 38; | ||
break; | ||
case 37: | ||
return _context4.abrupt("return", result); | ||
case 38: | ||
return _context4.abrupt("return", subscribeNext()); | ||
case 39: | ||
case "end": | ||
return _context.stop(); | ||
return _context4.stop(); | ||
} | ||
} | ||
}, _callee, this); | ||
}, _callee4, this); | ||
})); | ||
return function loadImpl() { | ||
return _ref.apply(this, arguments); | ||
return function loadImpl(_x, _x2) { | ||
return _ref2.apply(this, arguments); | ||
}; | ||
}(); | ||
var promise = mutexPromise(requestInstance.subscribe(loadImpl)); | ||
if (callback) { | ||
mutexPromise(loadImpl()).then(function (r) { | ||
return callback(null, r); | ||
}, function (e) { | ||
return callback(e); | ||
}); | ||
return { | ||
unsubscribe: function () { | ||
var _unsubscribe = _asyncToGenerator( | ||
/*#__PURE__*/ | ||
_regeneratorRuntime.mark(function _callee5() { | ||
return _regeneratorRuntime.wrap(function _callee5$(_context5) { | ||
while (1) { | ||
switch (_context5.prev = _context5.next) { | ||
case 0: | ||
unsubscribed = true; | ||
if (!requestInstance.unsubscribe) { | ||
_context5.next = 3; | ||
break; | ||
} | ||
return _context5.abrupt("return", requestInstance.unsubscribe()); | ||
case 3: | ||
return _context5.abrupt("return", null); | ||
case 4: | ||
case "end": | ||
return _context5.stop(); | ||
} | ||
} | ||
}, _callee5, this); | ||
})); | ||
return function unsubscribe() { | ||
return _unsubscribe.apply(this, arguments); | ||
}; | ||
}() | ||
}; | ||
} else { | ||
return mutexPromise(loadImpl()); | ||
return promise; | ||
} | ||
@@ -923,6 +1224,8 @@ } | ||
value: function load(query, options, callback) { | ||
var _this = this; | ||
var _this2 = this; | ||
return this.loadMethod(function () { | ||
return _this.request("/load?query=".concat(encodeURIComponent(JSON.stringify(query)))); | ||
return _this2.request("load", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
@@ -943,6 +1246,8 @@ return new ResultSet(body); | ||
value: function sql(query, options, callback) { | ||
var _this2 = this; | ||
var _this3 = this; | ||
return this.loadMethod(function () { | ||
return _this2.request("/sql?query=".concat(JSON.stringify(query))); | ||
return _this3.request("sql", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
@@ -962,6 +1267,6 @@ return new SqlQuery(body); | ||
value: function meta(options, callback) { | ||
var _this3 = this; | ||
var _this4 = this; | ||
return this.loadMethod(function () { | ||
return _this3.request("/meta"); | ||
return _this4.request("meta"); | ||
}, function (body) { | ||
@@ -971,2 +1276,17 @@ return new Meta(body); | ||
} | ||
}, { | ||
key: "subscribe", | ||
value: function subscribe(query, options, callback) { | ||
var _this5 = this; | ||
return this.loadMethod(function () { | ||
return _this5.request("subscribe", { | ||
query: query | ||
}); | ||
}, function (body) { | ||
return new ResultSet(body); | ||
}, _objectSpread({}, options, { | ||
subscribe: true | ||
}), callback); | ||
} | ||
}]); | ||
@@ -1003,2 +1323,3 @@ | ||
module.exports = index; | ||
exports.default = index; | ||
exports.HttpTransport = HttpTransport; |
{ | ||
"name": "@cubejs-client/core", | ||
"version": "0.10.61", | ||
"version": "0.11.0", | ||
"description": "cube.js client", | ||
@@ -13,3 +13,4 @@ "main": "dist/cubejs-client-core.js", | ||
"moment-range": "^4.0.1", | ||
"ramda": "^0.25.0" | ||
"ramda": "^0.25.0", | ||
"url-search-params-polyfill": "^7.0.0" | ||
}, | ||
@@ -30,3 +31,3 @@ "scripts": { | ||
}, | ||
"gitHead": "cc5aa4570e7bf9f920686e3574f657ec474bceaf" | ||
"gitHead": "b62d0e18bc793a1182fb2e3d26baf114a9cd848c" | ||
} |
130
src/index.js
@@ -9,3 +9,2 @@ /** | ||
import fetch from 'cross-fetch'; | ||
import ResultSet from './ResultSet'; | ||
@@ -15,2 +14,3 @@ import SqlQuery from './SqlQuery'; | ||
import ProgressResult from './ProgressResult'; | ||
import HttpTransport from './HttpTransport'; | ||
@@ -23,7 +23,5 @@ const API_URL = process.env.CUBEJS_API_URL; | ||
const mutexPromise = (promise) => { | ||
return new Promise((resolve, reject) => { | ||
promise.then(r => resolve(r), e => e !== MUTEX_ERROR && reject(e)); | ||
}); | ||
}; | ||
const mutexPromise = (promise) => new Promise((resolve, reject) => { | ||
promise.then(r => resolve(r), e => e !== MUTEX_ERROR && reject(e)); | ||
}); | ||
@@ -36,12 +34,15 @@ /** | ||
constructor(apiToken, options) { | ||
if (typeof apiToken === 'object') { | ||
options = apiToken; | ||
apiToken = undefined; | ||
} | ||
options = options || {}; | ||
this.apiToken = apiToken; | ||
this.apiUrl = options.apiUrl || API_URL; | ||
this.transport = options.transport || new HttpTransport({ authorization: apiToken, apiUrl: this.apiUrl }); | ||
this.pollInterval = options.pollInterval || 5; | ||
} | ||
request(url, config) { | ||
return fetch( | ||
`${this.apiUrl}${url}`, | ||
Object.assign({ headers: { Authorization: this.apiToken, 'Content-Type': 'application/json' }}, config || {}) | ||
); | ||
request(method, params) { | ||
return this.transport.request(method, params); | ||
} | ||
@@ -63,4 +64,12 @@ | ||
const checkMutex = () => { | ||
const requestInstance = request(); | ||
let unsubscribed = false; | ||
const checkMutex = async () => { | ||
if (options.mutexObj && options.mutexObj[mutexKey] !== mutexValue) { | ||
unsubscribed = true; | ||
if (requestInstance.unsubscribe) { | ||
await requestInstance.unsubscribe(); | ||
} | ||
throw MUTEX_ERROR; | ||
@@ -70,27 +79,79 @@ } | ||
const loadImpl = async () => { | ||
const response = await request(); | ||
const loadImpl = async (response, next) => { | ||
const subscribeNext = async () => { | ||
if (options.subscribe && !unsubscribed) { | ||
if (requestInstance.unsubscribe) { | ||
return next(); | ||
} else { | ||
await new Promise(resolve => setTimeout(() => resolve(), this.pollInterval * 1000)); | ||
return next(); | ||
} | ||
} | ||
return null; | ||
}; | ||
const continueWait = async (wait) => { | ||
if (!unsubscribed) { | ||
if (wait) { | ||
await new Promise(resolve => setTimeout(() => resolve(), this.pollInterval * 1000)); | ||
} | ||
return next(); | ||
} | ||
return null; | ||
}; | ||
if (response.status === 502) { | ||
checkMutex(); | ||
return loadImpl(); // TODO backoff wait | ||
await checkMutex(); | ||
return continueWait(true); | ||
} | ||
const body = await response.json(); | ||
if (body.error === 'Continue wait') { | ||
checkMutex(); | ||
await checkMutex(); | ||
if (options.progressCallback) { | ||
options.progressCallback(new ProgressResult(body)); | ||
} | ||
return loadImpl(); | ||
return continueWait(); | ||
} | ||
if (response.status !== 200) { | ||
checkMutex(); | ||
throw new Error(body.error); // TODO error class | ||
await checkMutex(); | ||
if (!options.subscribe && requestInstance.unsubscribe) { | ||
await requestInstance.unsubscribe(); | ||
} | ||
const error = new Error(body.error); // TODO error class | ||
if (callback) { | ||
callback(error); | ||
} else { | ||
throw error; | ||
} | ||
return subscribeNext(); | ||
} | ||
checkMutex(); | ||
return toResult(body); | ||
await checkMutex(); | ||
if (!options.subscribe && requestInstance.unsubscribe) { | ||
await requestInstance.unsubscribe(); | ||
} | ||
const result = toResult(body); | ||
if (callback) { | ||
callback(null, result); | ||
} else { | ||
return result; | ||
} | ||
return subscribeNext(); | ||
}; | ||
const promise = mutexPromise(requestInstance.subscribe(loadImpl)); | ||
if (callback) { | ||
mutexPromise(loadImpl()).then(r => callback(null, r), e => callback(e)); | ||
return { | ||
unsubscribe: async () => { | ||
unsubscribed = true; | ||
if (requestInstance.unsubscribe) { | ||
return requestInstance.unsubscribe(); | ||
} | ||
return null; | ||
} | ||
}; | ||
} else { | ||
return mutexPromise(loadImpl()); | ||
return promise; | ||
} | ||
@@ -128,3 +189,3 @@ } | ||
return this.loadMethod( | ||
() => this.request(`/load?query=${encodeURIComponent(JSON.stringify(query))}`), | ||
() => this.request(`load`, { query }), | ||
(body) => new ResultSet(body), | ||
@@ -145,3 +206,3 @@ options, | ||
return this.loadMethod( | ||
() => this.request(`/sql?query=${JSON.stringify(query)}`), | ||
() => this.request(`sql`, { query }), | ||
(body) => new SqlQuery(body), | ||
@@ -161,3 +222,3 @@ options, | ||
return this.loadMethod( | ||
() => this.request(`/meta`), | ||
() => this.request(`meta`), | ||
(body) => new Meta(body), | ||
@@ -168,2 +229,11 @@ options, | ||
} | ||
subscribe(query, options, callback) { | ||
return this.loadMethod( | ||
() => this.request(`subscribe`, { query }), | ||
(body) => new ResultSet(body), | ||
{ ...options, subscribe: true }, | ||
callback | ||
); | ||
} | ||
} | ||
@@ -192,4 +262,4 @@ | ||
*/ | ||
export default (apiToken, options) => { | ||
return new CubejsApi(apiToken, options); | ||
}; | ||
export default (apiToken, options) => new CubejsApi(apiToken, options); | ||
export { HttpTransport }; |
@@ -13,2 +13,2 @@ export default class ProgressResult { | ||
} | ||
} | ||
} |
@@ -13,2 +13,2 @@ export default class SqlQuery { | ||
} | ||
} | ||
} |
Sorry, the diff of this file is too big to display
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
598925
14
16350
7
+ Addedurl-search-params-polyfill@7.0.1(transitive)