@gitbeaker/rest
Version:
Cross Platform implementation of the GitLab API
288 lines (285 loc) • 10.3 kB
JavaScript
import * as CORE from '@gitbeaker/core';
import { createRequesterFn, presetResourceArguments, getMatchingRateLimiter, GitbeakerTimeoutError, GitbeakerRetryError, GitbeakerRequestError } from '@gitbeaker/requester-utils';
export { GitbeakerRequestError, GitbeakerRetryError, GitbeakerTimeoutError } from '@gitbeaker/requester-utils';
// src/index.ts
async function processBody(response) {
const contentType = (response.headers.get("content-type") || "").split(";")[0].trim();
if (contentType === "application/json") {
return response.json().then((v) => v || {});
}
if (contentType.startsWith("text/")) {
return response.text().then((t) => t || "");
}
return response.blob();
}
function delay(ms) {
return new Promise((resolve) => {
setTimeout(resolve, ms);
});
}
async function parseResponse(response, asStream = false) {
const { status, headers: rawHeaders } = response;
const headers = Object.fromEntries(rawHeaders.entries());
let body;
if (asStream) {
body = response.body;
} else {
body = status === 204 ? null : await processBody(response);
}
return { body, headers, status };
}
async function throwFailedRequestError(request, response) {
const content = await response.text();
const contentType = response.headers.get("Content-Type");
let description;
if (contentType?.includes("application/json")) {
const output = JSON.parse(content);
const contentProperty = output?.error || output?.message || "";
description = typeof contentProperty === "string" ? contentProperty : JSON.stringify(contentProperty);
} else {
description = content;
}
throw new GitbeakerRequestError(description, {
cause: {
description,
request,
response
}
});
}
function getConditionalMode(endpoint) {
if (endpoint.includes("repository/archive")) return "same-origin";
return void 0;
}
async function defaultRequestHandler(endpoint, options) {
const retryCodes = [429, 502];
const maxRetries = 10;
const { prefixUrl, asStream, searchParams, rateLimiters, method, ...opts } = options || {};
const rateLimit = getMatchingRateLimiter(endpoint, rateLimiters, method);
let lastStatus;
let baseUrl;
if (prefixUrl) baseUrl = prefixUrl.endsWith("/") ? prefixUrl : `${prefixUrl}/`;
const url = new URL(endpoint, baseUrl);
url.search = searchParams || "";
const mode = getConditionalMode(endpoint);
for (let i = 0; i < maxRetries; i += 1) {
const request = new Request(url, { ...opts, method, mode });
await rateLimit();
const response = await fetch(request).catch((e) => {
if (e.name === "TimeoutError" || e.name === "AbortError") {
throw new GitbeakerTimeoutError("Query timeout was reached");
}
throw e;
});
if (response.ok) return parseResponse(response, asStream);
if (!retryCodes.includes(response.status)) await throwFailedRequestError(request, response);
lastStatus = response.status;
await delay(2 ** i * 0.25);
continue;
}
throw new GitbeakerRetryError(
`Could not successfully complete this request after ${maxRetries} retries, last status code: ${lastStatus}. ${lastStatus === 429 ? "Check the applicable rate limits for this endpoint" : "Verify the status of the endpoint"}.`
);
}
var requesterFn = createRequesterFn(
(_, reqo) => Promise.resolve(reqo),
defaultRequestHandler
);
var { AccessLevel: AL, ...Resources } = CORE;
var API = presetResourceArguments(Resources, { requesterFn });
var AccessLevel = AL;
var {
Agents,
AlertManagement,
ApplicationAppearance,
ApplicationPlanLimits,
Applications,
ApplicationSettings,
ApplicationStatistics,
AuditEvents,
Avatar,
BroadcastMessages,
CodeSuggestions,
Composer,
Conan,
DashboardAnnotations,
Debian,
DependencyProxy,
DeployKeys,
DeployTokens,
DockerfileTemplates,
Events,
Experiments,
GeoNodes,
GeoSites,
GitignoreTemplates,
GitLabCIYMLTemplates,
Import,
InstanceLevelCICDVariables,
Keys,
License,
LicenseTemplates,
Lint,
Markdown,
Maven,
Metadata,
Migrations,
Namespaces,
NotificationSettings,
NPM,
NuGet,
PersonalAccessTokens,
PyPI,
RubyGems,
Search,
SearchAdmin,
ServiceAccounts,
ServiceData,
SidekiqMetrics,
SidekiqQueues,
SnippetRepositoryStorageMoves,
Snippets,
Suggestions,
SystemHooks,
TodoLists,
Topics,
Branches,
CommitDiscussions,
Commits,
ContainerRegistry,
Deployments,
Environments,
ErrorTrackingClientKeys,
ErrorTrackingSettings,
ExternalStatusChecks,
FeatureFlags,
FeatureFlagUserLists,
FreezePeriods,
GitlabPages,
GoProxy,
Helm,
Integrations,
IssueAwardEmojis,
IssueDiscussions,
IssueIterationEvents,
IssueLabelEvents,
IssueLinks,
IssueMilestoneEvents,
IssueNoteAwardEmojis,
IssueNotes,
Issues,
IssuesStatistics,
IssueStateEvents,
IssueWeightEvents,
JobArtifacts,
Jobs,
MergeRequestApprovals,
MergeRequestAwardEmojis,
MergeRequestContextCommits,
MergeRequestDiscussions,
MergeRequestLabelEvents,
MergeRequestMilestoneEvents,
MergeRequestDraftNotes,
MergeRequestNotes,
MergeRequestNoteAwardEmojis,
MergeRequests,
MergeTrains,
PackageRegistry,
Packages,
PagesDomains,
Pipelines,
PipelineSchedules,
PipelineScheduleVariables,
PipelineTriggerTokens,
ProductAnalytics,
ProjectAccessRequests,
ProjectAccessTokens,
ProjectAliases,
ProjectBadges,
ProjectCustomAttributes,
ProjectDORA4Metrics,
ProjectHooks,
ProjectImportExports,
ProjectInvitations,
ProjectIssueBoards,
ProjectIterations,
ProjectJobTokenScopes,
ProjectLabels,
ProjectMarkdownUploads,
ProjectMembers,
ProjectMilestones,
ProjectProtectedEnvironments,
ProjectPushRules,
ProjectRelationsExport,
ProjectReleases,
ProjectRemoteMirrors,
ProjectRepositoryStorageMoves,
Projects,
ProjectSnippetAwardEmojis,
ProjectSnippetDiscussions,
ProjectSnippetNotes,
ProjectSnippets,
ProjectStatistics,
ProjectTemplates,
ProjectTerraformState,
ProjectVariables,
ProjectVulnerabilities,
ProjectWikis,
ProtectedBranches,
ProtectedTags,
ReleaseLinks,
Repositories,
RepositoryFiles,
RepositorySubmodules,
ResourceGroups,
Runners,
SecureFiles,
Tags,
UserStarredMetricsDashboard,
EpicAwardEmojis,
EpicDiscussions,
EpicIssues,
EpicLabelEvents,
EpicLinks,
EpicNotes,
Epics,
GroupAccessRequests,
GroupAccessTokens,
GroupActivityAnalytics,
GroupBadges,
GroupCustomAttributes,
GroupDORA4Metrics,
GroupEpicBoards,
GroupHooks,
GroupImportExports,
GroupInvitations,
GroupIssueBoards,
GroupIterations,
GroupLabels,
GroupLDAPLinks,
GroupMarkdownUploads,
GroupMembers,
GroupMemberRoles,
GroupMilestones,
GroupProtectedEnvironments,
GroupPushRules,
GroupRelationExports,
GroupReleases,
GroupRepositoryStorageMoves,
Groups,
GroupSAMLIdentities,
GroupSAMLLinks,
GroupSCIMIdentities,
GroupServiceAccounts,
GroupVariables,
GroupWikis,
LinkedEpics,
UserCustomAttributes,
UserEmails,
UserGPGKeys,
UserImpersonationTokens,
Users,
UserSSHKeys,
Gitlab
} = API;
export { AccessLevel, Agents, AlertManagement, ApplicationAppearance, ApplicationPlanLimits, ApplicationSettings, ApplicationStatistics, Applications, AuditEvents, Avatar, Branches, BroadcastMessages, CodeSuggestions, CommitDiscussions, Commits, Composer, Conan, ContainerRegistry, DashboardAnnotations, Debian, DependencyProxy, DeployKeys, DeployTokens, Deployments, DockerfileTemplates, Environments, EpicAwardEmojis, EpicDiscussions, EpicIssues, EpicLabelEvents, EpicLinks, EpicNotes, Epics, ErrorTrackingClientKeys, ErrorTrackingSettings, Events, Experiments, ExternalStatusChecks, FeatureFlagUserLists, FeatureFlags, FreezePeriods, GeoNodes, GeoSites, GitLabCIYMLTemplates, GitignoreTemplates, Gitlab, GitlabPages, GoProxy, GroupAccessRequests, GroupAccessTokens, GroupActivityAnalytics, GroupBadges, GroupCustomAttributes, GroupDORA4Metrics, GroupEpicBoards, GroupHooks, GroupImportExports, GroupInvitations, GroupIssueBoards, GroupIterations, GroupLDAPLinks, GroupLabels, GroupMarkdownUploads, GroupMemberRoles, GroupMembers, GroupMilestones, GroupProtectedEnvironments, GroupPushRules, GroupRelationExports, GroupReleases, GroupRepositoryStorageMoves, GroupSAMLIdentities, GroupSAMLLinks, GroupSCIMIdentities, GroupServiceAccounts, GroupVariables, GroupWikis, Groups, Helm, Import, InstanceLevelCICDVariables, Integrations, IssueAwardEmojis, IssueDiscussions, IssueIterationEvents, IssueLabelEvents, IssueLinks, IssueMilestoneEvents, IssueNoteAwardEmojis, IssueNotes, IssueStateEvents, IssueWeightEvents, Issues, IssuesStatistics, JobArtifacts, Jobs, Keys, License, LicenseTemplates, LinkedEpics, Lint, Markdown, Maven, MergeRequestApprovals, MergeRequestAwardEmojis, MergeRequestContextCommits, MergeRequestDiscussions, MergeRequestDraftNotes, MergeRequestLabelEvents, MergeRequestMilestoneEvents, MergeRequestNoteAwardEmojis, MergeRequestNotes, MergeRequests, MergeTrains, Metadata, Migrations, NPM, Namespaces, NotificationSettings, NuGet, PackageRegistry, Packages, PagesDomains, PersonalAccessTokens, PipelineScheduleVariables, PipelineSchedules, PipelineTriggerTokens, Pipelines, ProductAnalytics, ProjectAccessRequests, ProjectAccessTokens, ProjectAliases, ProjectBadges, ProjectCustomAttributes, ProjectDORA4Metrics, ProjectHooks, ProjectImportExports, ProjectInvitations, ProjectIssueBoards, ProjectIterations, ProjectJobTokenScopes, ProjectLabels, ProjectMarkdownUploads, ProjectMembers, ProjectMilestones, ProjectProtectedEnvironments, ProjectPushRules, ProjectRelationsExport, ProjectReleases, ProjectRemoteMirrors, ProjectRepositoryStorageMoves, ProjectSnippetAwardEmojis, ProjectSnippetDiscussions, ProjectSnippetNotes, ProjectSnippets, ProjectStatistics, ProjectTemplates, ProjectTerraformState, ProjectVariables, ProjectVulnerabilities, ProjectWikis, Projects, ProtectedBranches, ProtectedTags, PyPI, ReleaseLinks, Repositories, RepositoryFiles, RepositorySubmodules, ResourceGroups, RubyGems, Runners, Search, SearchAdmin, SecureFiles, ServiceAccounts, ServiceData, SidekiqMetrics, SidekiqQueues, SnippetRepositoryStorageMoves, Snippets, Suggestions, SystemHooks, Tags, TodoLists, Topics, UserCustomAttributes, UserEmails, UserGPGKeys, UserImpersonationTokens, UserSSHKeys, UserStarredMetricsDashboard, Users };