1import { verifyIpfsPins } from './verifyIpfsPinsAI.mts'2import { verifyMfsReplication } from './verifyMfsReplicationAI.mts'3import { wrapDbEnv } from '../deployF/wrapDbEnvF.mts'4import { collectMfsRootCids, type MfsRootCidEntry } from './collectAppCidsAI.mts'5import { deriveMfsParamsFromQs } from './ipfsMfsRootAI.mts'6import { backupIpfsContent } from './ipfsBackupAI.mts'7import { getEnvConf } from '../serverF/envConfF.mts'8import { assertDefined } from '../sharedF/assertsF/assertDefinedF.mts'9import { betLog } from '../sharedF/betterConsLogF.mts'10import { ossEnsName } from '../sharedF/ossRepoConfigF.mts'11import { ensGetContenthash, contenthashToCid } from '../serverF/ethersF/ensSetContenthashAI.mts'13const collectEnsSiteCids = async (): Promise<MfsRootCidEntry[]> => {14 try {15 const contenthash = await ensGetContenthash({ensName: ossEnsName})16 const cid = contenthash ? contenthashToCid(contenthash) : null17 return cid ? [{label: `ens/${ossEnsName}`, cid}] : []18 } catch (err) {20 return []21 }22}24export const mkIpfsPinsJob = ({dbConfigs}: {dbConfigs: {label: string, appConfig: object}[]}) => ({25 name: 'ipfs3pins',26 intervalSec: 60 * 60,27 runFnc: async () => {28 const rootCids: MfsRootCidEntry[] = []29 const mfsParamsMap: Record<string, {mfsRoot: string, kvKey: string}> = {}30 for (const {label, appConfig} of dbConfigs) {32 const cids = await collectMfsRootCids()33 rootCids.push(...cids.map(c => ({...c, label: `${label}/${c.label}`})))34 const qsName = getEnvConf().dbSecrets?.db35 assertDefined(qsName, {label})36 const params = deriveMfsParamsFromQs(qsName)37 for (const c of cids) {38 if (c.label === params.kvKey) {39 mfsParamsMap[c.label] = {mfsRoot: params.mfsRoot, kvKey: params.kvKey}40 }41 }42 })43 }44 await verifyIpfsPins({rootCids: [...rootCids, ...await collectEnsSiteCids()]})45 await verifyMfsReplication({rootCids, mfsParamsMap})46 await backupIpfsContent({47 rootCids: rootCids.map(r => ({label: r.label.split('/').pop()!, cid: r.cid})),48 mfsParamsMap,49 })50 },51})