import { assertMutationGuard, isMutatingMethod, originFetch } from './http.ts'
import {
mintInstallationAccessTokenInternal,
signOriginAppJwt,
} from './token.ts'
import { type OriginRequestParams, type OriginRequestResult } from './types.ts'
/**
* Make one authenticated Origin REST request.
*
* Mutating methods (`POST`, `PUT`, `PATCH`, `DELETE`) require `dryRun: true`
* or `confirm: true`. Token minting used internally by this package is not a
* caller-facing mutation.
*
* @example
* import originRequest from 'kody:@kody/origin/request'
* const response = await originRequest({ path: '/rate_limit', auth: 'app' })
*/
export async function originRequest(
params: OriginRequestParams,
): Promise<OriginRequestResult> {
const method = (params.method ?? (params.body === undefined ? 'GET' : 'POST')).toUpperCase()
const mutating = isMutatingMethod(method)
assertMutationGuard(mutating, params.dryRun, params.confirm, `${method} ${params.path}`)
if (params.dryRun === true && mutating) {
return {
ok: true,
status: 0,
body: {
dryRun: true,
method,
path: params.path,
query: params.query ?? null,
wouldRequest: true,
},
rateLimit: {
limit: null,
remaining: null,
used: null,
reset: null,
},
dryRun: true,
}
}
const auth = params.auth ?? 'installation'
const bearerToken =
auth === 'app'
? await signOriginAppJwt(params)
: (
await mintInstallationAccessTokenInternal({
account: params.account,
integrationName: params.integrationName,
secretName: params.secretName,
appId: params.appId,
installationId: params.installationId,
scopes: params.scopes,
})
).token
return originFetch({
path: params.path,
method,
query: params.query,
body: params.body,
bearerToken,
})
}
export default originRequest