UNPKG

airtable

Version:

The official Airtable JavaScript library.

182 lines 8.7 kB
"use strict"; var __assign = (this && this.__assign) || function () { __assign = Object.assign || function(t) { for (var s, i = 1, n = arguments.length; i < n; i++) { s = arguments[i]; for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; } return t; }; return __assign.apply(this, arguments); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; var get_1 = __importDefault(require("lodash/get")); var isPlainObject_1 = __importDefault(require("lodash/isPlainObject")); var keys_1 = __importDefault(require("lodash/keys")); var fetch_1 = __importDefault(require("./fetch")); var abort_controller_1 = __importDefault(require("./abort-controller")); var object_to_query_param_string_1 = __importDefault(require("./object_to_query_param_string")); var airtable_error_1 = __importDefault(require("./airtable_error")); var table_1 = __importDefault(require("./table")); var http_headers_1 = __importDefault(require("./http_headers")); var run_action_1 = __importDefault(require("./run_action")); var package_version_1 = __importDefault(require("./package_version")); var exponential_backoff_with_jitter_1 = __importDefault(require("./exponential_backoff_with_jitter")); var userAgent = "Airtable.js/" + package_version_1.default; var Base = /** @class */ (function () { function Base(airtable, baseId) { this._airtable = airtable; this._id = baseId; } Base.prototype.table = function (tableName) { return new table_1.default(this, null, tableName); }; Base.prototype.makeRequest = function (options) { var _this = this; var _a; if (options === void 0) { options = {}; } var method = get_1.default(options, 'method', 'GET').toUpperCase(); var url = this._airtable._endpointUrl + "/v" + this._airtable._apiVersionMajor + "/" + this._id + get_1.default(options, 'path', '/') + "?" + object_to_query_param_string_1.default(get_1.default(options, 'qs', {})); var controller = new abort_controller_1.default(); var headers = this._getRequestHeaders(Object.assign({}, this._airtable._customHeaders, (_a = options.headers) !== null && _a !== void 0 ? _a : {})); var requestOptions = { method: method, headers: headers, signal: controller.signal, }; if ('body' in options && _canRequestMethodIncludeBody(method)) { requestOptions.body = JSON.stringify(options.body); } var timeout = setTimeout(function () { controller.abort(); }, this._airtable._requestTimeout); return new Promise(function (resolve, reject) { fetch_1.default(url, requestOptions) .then(function (resp) { clearTimeout(timeout); if (resp.status === 429 && !_this._airtable._noRetryIfRateLimited) { var numAttempts_1 = get_1.default(options, '_numAttempts', 0); var backoffDelayMs = exponential_backoff_with_jitter_1.default(numAttempts_1); setTimeout(function () { var newOptions = __assign(__assign({}, options), { _numAttempts: numAttempts_1 + 1 }); _this.makeRequest(newOptions) .then(resolve) .catch(reject); }, backoffDelayMs); } else { resp.json() .then(function (body) { var err = _this._checkStatusForError(resp.status, body) || _getErrorForNonObjectBody(resp.status, body); if (err) { reject(err); } else { resolve({ statusCode: resp.status, headers: resp.headers, body: body, }); } }) .catch(function () { var err = _getErrorForNonObjectBody(resp.status); reject(err); }); } }) .catch(function (err) { clearTimeout(timeout); err = new airtable_error_1.default('CONNECTION_ERROR', err.message, null); reject(err); }); }); }; /** * @deprecated This method is deprecated. */ Base.prototype.runAction = function (method, path, queryParams, bodyData, callback) { run_action_1.default(this, method, path, queryParams, bodyData, callback, 0); }; Base.prototype._getRequestHeaders = function (headers) { var result = new http_headers_1.default(); result.set('Authorization', "Bearer " + this._airtable._apiKey); result.set('User-Agent', userAgent); result.set('Content-Type', 'application/json'); for (var _i = 0, _a = keys_1.default(headers); _i < _a.length; _i++) { var headerKey = _a[_i]; result.set(headerKey, headers[headerKey]); } return result.toJSON(); }; Base.prototype._checkStatusForError = function (statusCode, body) { var _a = (body !== null && body !== void 0 ? body : { error: {} }).error, error = _a === void 0 ? {} : _a; var type = error.type, message = error.message; if (statusCode === 401) { return new airtable_error_1.default('AUTHENTICATION_REQUIRED', 'You should provide valid api key to perform this operation', statusCode); } else if (statusCode === 403) { return new airtable_error_1.default('NOT_AUTHORIZED', 'You are not authorized to perform this operation', statusCode); } else if (statusCode === 404) { return new airtable_error_1.default('NOT_FOUND', message !== null && message !== void 0 ? message : 'Could not find what you are looking for', statusCode); } else if (statusCode === 413) { return new airtable_error_1.default('REQUEST_TOO_LARGE', 'Request body is too large', statusCode); } else if (statusCode === 422) { return new airtable_error_1.default(type !== null && type !== void 0 ? type : 'UNPROCESSABLE_ENTITY', message !== null && message !== void 0 ? message : 'The operation cannot be processed', statusCode); } else if (statusCode === 429) { return new airtable_error_1.default('TOO_MANY_REQUESTS', 'You have made too many requests in a short period of time. Please retry your request later', statusCode); } else if (statusCode === 500) { return new airtable_error_1.default('SERVER_ERROR', 'Try again. If the problem persists, contact support.', statusCode); } else if (statusCode === 503) { return new airtable_error_1.default('SERVICE_UNAVAILABLE', 'The service is temporarily unavailable. Please retry shortly.', statusCode); } else if (statusCode >= 400) { return new airtable_error_1.default(type !== null && type !== void 0 ? type : 'UNEXPECTED_ERROR', message !== null && message !== void 0 ? message : 'An unexpected error occurred', statusCode); } else { return null; } }; Base.prototype.doCall = function (tableName) { return this.table(tableName); }; Base.prototype.getId = function () { return this._id; }; Base.createFunctor = function (airtable, baseId) { var base = new Base(airtable, baseId); var baseFn = function (tableName) { return base.doCall(tableName); }; baseFn._base = base; baseFn.table = base.table.bind(base); baseFn.makeRequest = base.makeRequest.bind(base); baseFn.runAction = base.runAction.bind(base); baseFn.getId = base.getId.bind(base); return baseFn; }; return Base; }()); function _canRequestMethodIncludeBody(method) { return method !== 'GET' && method !== 'DELETE'; } function _getErrorForNonObjectBody(statusCode, body) { if (isPlainObject_1.default(body)) { return null; } else { return new airtable_error_1.default('UNEXPECTED_ERROR', 'The response from Airtable was invalid JSON. Please try again soon.', statusCode); } } module.exports = Base; //# sourceMappingURL=base.js.map