Skip to content

Built for people who want to own their automations. Join the waitlist for an invite.

Package listing

@kody/origin

src/request.ts

68 lines · 1.8 KB · TypeScript
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