UNPKG

@looker/sdk-rtl

Version:
329 lines (328 loc) 15 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.StatusCode = exports.ResponseMode = exports.MaxTries = exports.LookerAppId = void 0; exports.addQueryParams = addQueryParams; exports.agentPrefix = void 0; exports.canRetry = canRetry; exports.defaultTimeout = exports.contentPatternString = exports.contentPatternBinary = exports.charsetUtf8Pattern = void 0; exports.encodeParam = encodeParam; exports.encodeParams = encodeParams; exports.initResponse = initResponse; exports.isErrorLike = isErrorLike; exports.isUtf8 = isUtf8; exports.jittery = jittery; exports.mergeOptions = void 0; exports.pauseForRetry = pauseForRetry; exports.responseMode = responseMode; exports.retryError = retryError; exports.retryWait = retryWait; exports.safeBase64 = safeBase64; exports.sdkError = sdkError; exports.sdkOk = sdkOk; exports.sdkTimeout = sdkTimeout; exports.trace = trace; exports.verifySsl = verifySsl; var _constants = require("./constants"); var _delimArray = require("./delimArray"); var _lookerSDKError = require("./lookerSDKError"); var _sleep = require("./sleep"); function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } var agentPrefix = exports.agentPrefix = 'TS-SDK'; var LookerAppId = exports.LookerAppId = 'x-looker-appid'; var MaxTries = exports.MaxTries = 3; var tracing = false; function trace(message, info) { if (tracing) { console.debug(message); if (info) { console.debug({ info }); } } } function canRetry(statusCode) { return statusCode === StatusCode.Accepted || statusCode === StatusCode.TooManyRequests || statusCode === StatusCode.ServiceUnavailable; } var ResponseMode = exports.ResponseMode = function (ResponseMode) { ResponseMode[ResponseMode["binary"] = 0] = "binary"; ResponseMode[ResponseMode["string"] = 1] = "string"; ResponseMode[ResponseMode["unknown"] = 2] = "unknown"; return ResponseMode; }({}); var contentPatternString = exports.contentPatternString = new RegExp(_constants.matchModeString, 'i'); var contentPatternBinary = exports.contentPatternBinary = new RegExp(_constants.matchModeBinary, 'i'); var charsetUtf8Pattern = exports.charsetUtf8Pattern = new RegExp(_constants.matchCharsetUtf8, 'i'); var defaultTimeout = exports.defaultTimeout = 120; var StatusCode = exports.StatusCode = function (StatusCode) { StatusCode[StatusCode["OK"] = 200] = "OK"; StatusCode[StatusCode["Created"] = 201] = "Created"; StatusCode[StatusCode["Accepted"] = 202] = "Accepted"; StatusCode[StatusCode["NonAuthoritative"] = 203] = "NonAuthoritative"; StatusCode[StatusCode["NoContent"] = 204] = "NoContent"; StatusCode[StatusCode["ResetContent"] = 205] = "ResetContent"; StatusCode[StatusCode["PartialContent"] = 206] = "PartialContent"; StatusCode[StatusCode["MultiStatus"] = 207] = "MultiStatus"; StatusCode[StatusCode["MultiStatusDav"] = 208] = "MultiStatusDav"; StatusCode[StatusCode["IMUsed"] = 226] = "IMUsed"; StatusCode[StatusCode["MultipleChoice"] = 300] = "MultipleChoice"; StatusCode[StatusCode["MovedPermanently"] = 301] = "MovedPermanently"; StatusCode[StatusCode["Found"] = 302] = "Found"; StatusCode[StatusCode["SeeOther"] = 303] = "SeeOther"; StatusCode[StatusCode["NotModified"] = 304] = "NotModified"; StatusCode[StatusCode["UseProxy"] = 305] = "UseProxy"; StatusCode[StatusCode["UnusedRedirect"] = 306] = "UnusedRedirect"; StatusCode[StatusCode["TemporaryRedirect"] = 307] = "TemporaryRedirect"; StatusCode[StatusCode["PermanentRedirect"] = 308] = "PermanentRedirect"; StatusCode[StatusCode["BadRequest"] = 400] = "BadRequest"; StatusCode[StatusCode["Unauthorized"] = 401] = "Unauthorized"; StatusCode[StatusCode["PaymentRequired"] = 402] = "PaymentRequired"; StatusCode[StatusCode["Forbidden"] = 403] = "Forbidden"; StatusCode[StatusCode["NotFound"] = 404] = "NotFound"; StatusCode[StatusCode["MethodNotAllowed"] = 405] = "MethodNotAllowed"; StatusCode[StatusCode["NotAcceptable"] = 406] = "NotAcceptable"; StatusCode[StatusCode["ProxyAuthRequired"] = 407] = "ProxyAuthRequired"; StatusCode[StatusCode["RequestTimeout"] = 408] = "RequestTimeout"; StatusCode[StatusCode["Conflict"] = 409] = "Conflict"; StatusCode[StatusCode["Gone"] = 410] = "Gone"; StatusCode[StatusCode["LengthRequired"] = 411] = "LengthRequired"; StatusCode[StatusCode["PreconditionFailed"] = 412] = "PreconditionFailed"; StatusCode[StatusCode["PayloadTooLarge"] = 413] = "PayloadTooLarge"; StatusCode[StatusCode["UriTooLong"] = 414] = "UriTooLong"; StatusCode[StatusCode["UnsupportedMediaType"] = 415] = "UnsupportedMediaType"; StatusCode[StatusCode["RequestedRangeNotSatisfiable"] = 416] = "RequestedRangeNotSatisfiable"; StatusCode[StatusCode["ExpectationFailed"] = 417] = "ExpectationFailed"; StatusCode[StatusCode["ImATeapot"] = 418] = "ImATeapot"; StatusCode[StatusCode["MisdirectedRequest"] = 421] = "MisdirectedRequest"; StatusCode[StatusCode["UnprocessableEntity"] = 422] = "UnprocessableEntity"; StatusCode[StatusCode["Locked"] = 423] = "Locked"; StatusCode[StatusCode["FailedDependency"] = 424] = "FailedDependency"; StatusCode[StatusCode["TooEarly"] = 425] = "TooEarly"; StatusCode[StatusCode["UpgradeRequired"] = 426] = "UpgradeRequired"; StatusCode[StatusCode["PreconditionRequired"] = 428] = "PreconditionRequired"; StatusCode[StatusCode["TooManyRequests"] = 429] = "TooManyRequests"; StatusCode[StatusCode["RequestHeaderFieldsTooLarge"] = 431] = "RequestHeaderFieldsTooLarge"; StatusCode[StatusCode["UnavailableForLegalReasons"] = 451] = "UnavailableForLegalReasons"; StatusCode[StatusCode["InternalServerError"] = 500] = "InternalServerError"; StatusCode[StatusCode["NotImplemented"] = 501] = "NotImplemented"; StatusCode[StatusCode["BadGateway"] = 502] = "BadGateway"; StatusCode[StatusCode["ServiceUnavailable"] = 503] = "ServiceUnavailable"; StatusCode[StatusCode["GatewayTimeout"] = 504] = "GatewayTimeout"; StatusCode[StatusCode["HttpVersionNotSupported"] = 505] = "HttpVersionNotSupported"; StatusCode[StatusCode["VariantAlsoNegotiates"] = 506] = "VariantAlsoNegotiates"; StatusCode[StatusCode["InsufficientStorage"] = 507] = "InsufficientStorage"; StatusCode[StatusCode["LoopDetected"] = 508] = "LoopDetected"; StatusCode[StatusCode["NotExtended"] = 510] = "NotExtended"; StatusCode[StatusCode["NetworkAuthRequired"] = 511] = "NetworkAuthRequired"; return StatusCode; }({}); function responseMode(contentType) { if (contentType.match(contentPatternString)) { return ResponseMode.string; } if (contentType.match(contentPatternBinary)) { return ResponseMode.binary; } return ResponseMode.unknown; } function isUtf8(contentType) { return contentType.match(/;.*\bcharset\b=\butf-8\b/i); } function encodeParam(value) { if (value instanceof Date) { value = value.toISOString(); } else if (value instanceof _delimArray.DelimArray) { value = value.toString(); } var encoded = typeof value === 'object' ? JSON.stringify(value) : value.toString(); try { var decoded = decodeURIComponent(value); if (value === decoded) { encoded = encodeURIComponent(value); } } catch (e) { if (e instanceof URIError) { encoded = encodeURIComponent(value); } else { throw e; } } return encoded; } function encodeParams(values) { if (!values) return ''; var keys = Object.keys(values); return keys.filter(k => values[k] !== undefined).map(k => k + '=' + encodeParam(values[k])).join('&'); } function addQueryParams(path, obj) { if (!obj) { return path; } var qp = encodeParams(obj); return "".concat(path).concat(qp ? '?' + qp : ''); } var utf8 = 'utf-8'; function bufferString(val) { var result = 'Unknown error'; try { var decoder = new TextDecoder(utf8); result = decoder.decode(val); } catch (e) { try { if (val instanceof Buffer) { result = Buffer.from(val).toString(utf8); } else { result = JSON.stringify(val); } } catch (err) { result = JSON.stringify(val); } } return result; } function sdkError(response) { if (typeof response === 'string') { return new _lookerSDKError.LookerSDKError(response); } if ('error' in response) { var _error = response.error; if (typeof _error === 'string') { return new _lookerSDKError.LookerSDKError(_error); } if ('error' in _error) { var _result = bufferString(_error.error); return new _lookerSDKError.LookerSDKError(_result); } if ('message' in _error) { var _error$errors, _error$documentation_; return new _lookerSDKError.LookerSDKError(response.error.message.toString(), { errors: (_error$errors = _error === null || _error === void 0 ? void 0 : _error.errors) !== null && _error$errors !== void 0 ? _error$errors : [], documentation_url: (_error$documentation_ = _error === null || _error === void 0 ? void 0 : _error.documentation_url) !== null && _error$documentation_ !== void 0 ? _error$documentation_ : '' }); } if ('statusMessage' in _error) { return new _lookerSDKError.LookerSDKError(_error.statusMessage); } var result = bufferString(_error); return new _lookerSDKError.LookerSDKError(result); } if ('message' in response) { return new _lookerSDKError.LookerSDKError(response.message); } var error = JSON.stringify(response); return new _lookerSDKError.LookerSDKError("Unknown error with SDK method ".concat(error)); } function sdkOk(_x) { return _sdkOk.apply(this, arguments); } function _sdkOk() { _sdkOk = _asyncToGenerator(function* (promise) { var result = yield promise; if (result.ok) { return result.value; } else { throw sdkError(result); } }); return _sdkOk.apply(this, arguments); } function safeBase64(u8) { var rawBase64 = btoa(String.fromCharCode(...u8)); return rawBase64.replace(/\+/g, '-').replace(/\//g, '_'); } function isErrorLike(error) { if (typeof error !== 'object') return false; if (!error) return false; if (!Object.prototype.hasOwnProperty.call(error, 'message')) return false; if (typeof error.message !== 'string') return false; return true; } function jittery(attempt) { var baseDelayMs = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1000; var maxDelayMs = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 10000; var jitterFactor = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0.5; var exponentialDelay = baseDelayMs * Math.pow(2, attempt); exponentialDelay = Math.min(exponentialDelay, maxDelayMs); var jitter = Math.random() * jitterFactor * exponentialDelay; var delayWithJitter = exponentialDelay + jitter; return delayWithJitter; } function retryWait(_x2) { return _retryWait.apply(this, arguments); } function _retryWait() { _retryWait = _asyncToGenerator(function* (wait) { yield (0, _sleep.sleep)(wait.waitMS); return { response: 'retry', reason: "waited ".concat(wait.waitMS, " ms") }; }); return _retryWait.apply(this, arguments); } function pauseForRetry(_x3, _x4, _x5) { return _pauseForRetry.apply(this, arguments); } function _pauseForRetry() { _pauseForRetry = _asyncToGenerator(function* (rawRequest, rawResponse, attempt) { var waiter = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : retryWait; var retryAfter = rawResponse.headers['Retry-After']; var after = (retryAfter ? Number(retryAfter) : 1.0) * 1000; var jitter = jittery(attempt, after); var response = yield waiter({ request: rawRequest, response: rawResponse, attempt, waitMS: jitter }); return response; }); return _pauseForRetry.apply(this, arguments); } var mergeOptions = (base, custom) => { var _base$headers$custom$; var headers = (_base$headers$custom$ = _objectSpread(_objectSpread({}, base.headers), custom.headers)) !== null && _base$headers$custom$ !== void 0 ? _base$headers$custom$ : {}; var result = _objectSpread(_objectSpread(_objectSpread({}, base), custom), {}, { headers }); return result; }; exports.mergeOptions = mergeOptions; function initResponse(method, requestPath) { return { method, url: requestPath, body: 'no reply at all', contentType: 'text/plain', ok: false, statusCode: 404, statusMessage: 'Not found', headers: {}, requestStarted: 0, responseCompleted: 0 }; } function retryError(response) { response.statusCode = StatusCode.RequestTimeout; response.ok = false; if (!response.statusMessage) { response.statusMessage = 'Retry waiting exited with an error condition'; } return response; } function verifySsl(options) { return options && 'verify_ssl' in options ? options.verify_ssl : true; } function sdkTimeout(options) { if (options && 'timeout' in options && options.timeout && options.timeout > 0) return options.timeout; return defaultTimeout; } //# sourceMappingURL=transport.js.map