import "../_dnt.polyfills.js"; import { CapiBinary } from "../deps/capi_binary_builds.js" import { mapEntries } from "../deps/std/collections/map_entries.js" import { AsyncMemo } from "../util/memo.js" export type CapiBinaryArgs = ConstructorParameters export type BinaryResolver = (signal: AbortSignal) => Promise const memo = new AsyncMemo() // TODO: use `_signal` in capi-binary-builds export function bins( binariesProps: Record, ): Record export function bins( binariesProps: Record, ): Record { return mapEntries(binariesProps, ([k, v]) => { if (typeof v === "string") return [k, () => Promise.resolve(v)] const binary = new CapiBinary(...v as CapiBinaryArgs) const key = `${v[0]}@${v[1]}` return [k, (_signal: AbortSignal) => memo.run(key, async () => { if (!(await binary.exists())) { console.log("Downloading", key) await binary.download() } return binary.path })] }) }