airtable
Version:
The official Airtable JavaScript library.
182 lines • 8.7 kB
JavaScript
;
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