import "../../_dnt.polyfills.js"; import { blake2_512, blake2_64, Hasher, hex } from "../../crypto/mod.js" import * as $ from "../../deps/scale.js" import { mapEntries } from "../../deps/std/collections/map_entries.js" import { gray, green } from "../../deps/std/fmt/colors.js" import { NetSpec } from "../../nets/mod.js" import { normalizePackageName, normalizeTypeName, withSignal } from "../../util/mod.js" import { $codegenSpec, CodegenEntry } from "../CodegenSpec.js" export async function syncNets( server: string, devnetTempDir: string, netSpecs: Record, ) { return withSignal(async (signal) => { const netSpecsEntries = Object.entries(netSpecs) let synced = 0 const entries = await Promise.all( netSpecsEntries.map(async ([name, netSpec]): Promise<[string, CodegenEntry]> => { const packageName = normalizePackageName(name) const chainName = normalizeTypeName(name) const metadata = await netSpec.metadata(signal, devnetTempDir) const metadataHash = await upload(server, "metadata", metadata, blake2_512) console.log( green("Synced"), gray(`(${++synced}/${netSpecsEntries.length})`), `@capi/${packageName}`, ) const connection = netSpec.connection(name) const targets = mapEntries( netSpec.targets ?? {}, ([targetName, targetNet]) => [targetName, targetNet.connection(targetNet.name)], ) return [packageName, { type: "frame", metadataHash, chainName, connection, targets, }] }), ) const sortedEntries = new $.ScaleMap($.str, [...entries].sort((a, b) => a[0] < b[0] ? 1 : -1)) const codegenSpec = $codegenSpec.encode({ type: "v0", codegen: sortedEntries }) const codegenHash = hex.encode(await upload(server, "codegen", codegenSpec, blake2_64)) return new URL(codegenHash + "/", server).toString() }) } async function upload(server: string, kind: string, data: Uint8Array, hasher: Hasher) { const hash = hasher.hash(data) const url = new URL(`upload/${kind}/${hex.encode(hash)}`, server) const exists = await fetch(url, { method: "HEAD" }) if (exists.ok) return hash const response = await fetch(url, { method: "PUT", body: data }) if (!response.ok) throw new Error(await response.text()) return hash }