Skip to content
← Public packages

@kody/openapi

Bind an OpenAPI spec and call selected operations with saved integration or secret names.

src/storage.ts

46 lines · 1.3 KB · TypeScript
import { packageStorage } from 'kody:runtime'
import {
	maxOpenApiBindings,
	type OpenApiBinding,
} from './selection.ts'

const storeKey = 'bindings'

function asBindingMap(value: unknown): Record<string, OpenApiBinding> {
	if (value == null || value === '') return {}
	const parsed =
		typeof value === 'string'
			? (JSON.parse(value) as unknown)
			: value
	if (typeof parsed !== 'object' || parsed == null || Array.isArray(parsed)) {
		throw new Error('Corrupt OpenAPI binding store in packageStorage()')
	}
	return parsed as Record<string, OpenApiBinding>
}

export async function loadBindings(): Promise<Record<string, OpenApiBinding>> {
	return asBindingMap(await packageStorage().get(storeKey))
}

export async function saveBindings(
	bindings: Record<string, OpenApiBinding>,
): Promise<void> {
	const names = Object.keys(bindings)
	if (names.length > maxOpenApiBindings) {
		throw new Error(
			`At most ${maxOpenApiBindings} OpenAPI bindings per forked copy. Unbind one before adding another.`,
		)
	}
	await packageStorage().set(storeKey, bindings)
}

export async function requireBinding(name: string): Promise<OpenApiBinding> {
	const bindings = await loadBindings()
	const binding = bindings[name]
	if (!binding) {
		throw new Error(
			`OpenAPI binding "${name}" was not found. Call bind() on this forked package first.`,
		)
	}
	return binding
}