@vercel/sdk
Version:
<p align="center"> <a href="https://vercel.com"> <img src="https://assets.vercel.com/image/upload/v1588805858/repositories/vercel/logo.png" height="96"> <h3 align="center">Vercel</h3> </a> <p align="center">Develop. Preview. Ship.</p> </p>
179 lines (165 loc) • 5.85 kB
text/typescript
/*
* Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT.
*/
import { VercelCore } from "../core.js";
import { encodeJSON, encodeSimple } from "../lib/encodings.js";
import { matchStatusCode } from "../lib/http.js";
import * as M from "../lib/matchers.js";
import { compactMap } from "../lib/primitives.js";
import { safeParse } from "../lib/schemas.js";
import { RequestOptions } from "../lib/sdks.js";
import { extractSecurity, resolveGlobalSecurity } from "../lib/security.js";
import { pathToFunc } from "../lib/url.js";
import {
ConnectionError,
InvalidRequestError,
RequestAbortedError,
RequestTimeoutError,
UnexpectedClientError,
} from "../models/httpclienterrors.js";
import { ResponseValidationError } from "../models/responsevalidationerror.js";
import {
RotateInstallationCredentialRequest,
RotateInstallationCredentialRequest$outboundSchema,
RotateInstallationCredentialResponseBody,
RotateInstallationCredentialResponseBody$inboundSchema,
} from "../models/rotateinstallationcredentialop.js";
import { SDKValidationError } from "../models/sdkvalidationerror.js";
import { VercelError } from "../models/vercelerror.js";
import { APICall, APIPromise } from "../types/async.js";
import { Result } from "../types/fp.js";
/**
* Rotate Installation Credential
*
* @remarks
* Issues a replacement access token for an installation, so a partner can rotate a credential it believes is compromised without the customer having to reinstall. Authenticated by the credential being replaced plus the integration's client secret: a leaked access token on its own cannot rotate itself, which would otherwise let an attacker take over the installation and lock the partner out. The previous credential intentionally stays valid so in-flight requests keep working. Retiring it is a separate, explicit operation — a partner is never left mid-rotation without a working credential.
*
* If set, this operation will use {@link Security.bearerToken} from the global security.
*/
export function marketplaceRotateInstallationCredential(
client: VercelCore,
request: RotateInstallationCredentialRequest,
options?: RequestOptions,
): APIPromise<
Result<
RotateInstallationCredentialResponseBody,
| VercelError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>
> {
return new APIPromise($do(
client,
request,
options,
));
}
async function $do(
client: VercelCore,
request: RotateInstallationCredentialRequest,
options?: RequestOptions,
): Promise<
[
Result<
RotateInstallationCredentialResponseBody,
| VercelError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>,
APICall,
]
> {
const parsed = safeParse(
request,
(value) => RotateInstallationCredentialRequest$outboundSchema.parse(value),
"Input validation failed",
);
if (!parsed.ok) {
return [parsed, { status: "invalid" }];
}
const payload = parsed.value;
const body = encodeJSON("body", payload.RequestBody, { explode: true });
const pathParams = {
integrationConfigurationId: encodeSimple(
"integrationConfigurationId",
payload.integrationConfigurationId,
{ explode: false, charEncoding: "percent" },
),
};
const path = pathToFunc(
"/v1/installations/{integrationConfigurationId}/credentials/rotate",
)(pathParams);
const headers = new Headers(compactMap({
"Content-Type": "application/json",
Accept: "application/json",
}));
const secConfig = await extractSecurity(client._options.bearerToken);
const securityInput = secConfig == null ? {} : { bearerToken: secConfig };
const requestSecurity = resolveGlobalSecurity(securityInput, [0]);
const context = {
options: client._options,
baseURL: options?.serverURL ?? client._baseURL ?? "",
operationID: "rotate-installation-credential",
oAuth2Scopes: null,
resolvedSecurity: requestSecurity,
securitySource: client._options.bearerToken,
retryConfig: options?.retries
|| client._options.retryConfig
|| { strategy: "none" },
retryCodes: options?.retryCodes || ["429", "500", "502", "503", "504"],
};
const requestRes = client._createRequest(context, {
security: requestSecurity,
method: "POST",
baseURL: options?.serverURL,
path: path,
headers: headers,
body: body,
userAgent: client._options.userAgent,
timeoutMs: options?.timeoutMs || client._options.timeoutMs || -1,
}, options);
if (!requestRes.ok) {
return [requestRes, { status: "invalid" }];
}
const req = requestRes.value;
const doResult = await client._do(req, {
context,
isErrorStatusCode: (statusCode: number) =>
matchStatusCode({ status: statusCode } as Response, ["4XX", "5XX"]),
retryConfig: context.retryConfig,
retryCodes: context.retryCodes,
});
if (!doResult.ok) {
return [doResult, { status: "request-error", request: req }];
}
const response = doResult.value;
const [result] = await M.match<
RotateInstallationCredentialResponseBody,
| VercelError
| ResponseValidationError
| ConnectionError
| RequestAbortedError
| RequestTimeoutError
| InvalidRequestError
| UnexpectedClientError
| SDKValidationError
>(
M.json(200, RotateInstallationCredentialResponseBody$inboundSchema),
M.fail([400, 401, 403, 404, 409, 410, "4XX"]),
M.fail("5XX"),
)(response, req);
if (!result.ok) {
return [result, { status: "complete", request: req, response }];
}
return [result, { status: "complete", request: req, response }];
}