UNPKG

@gitbeaker/rest

Version:

Cross Platform implementation of the GitLab API

288 lines (285 loc) 10.3 kB
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 };