filecoin-pin
Version:
Bridge IPFS content to Filecoin Onchain Cloud using familiar tools
116 lines (95 loc) • 4.05 kB
text/typescript
import type { EnhancedDataSetInfo, Synapse } from '@filoz/synapse-sdk'
import pc from 'picocolors'
import { type DataSetSummary, getDetailedDataSet, listDataSets } from '../core/data-set/index.js'
import { cleanupSynapseService } from '../core/synapse/index.js'
import { getCliSynapse } from '../utils/cli-auth.js'
import { cancel, createSpinner, intro, outro } from '../utils/cli-helpers.js'
import { log } from '../utils/cli-logger.js'
import { displayDataSets } from './display.js'
import type { DataSetCommandOptions, DataSetListCommandOptions } from './types.js'
/**
* Entry point invoked by the Commander command.
*
* @param dataSetIdArg - Optional dataset identifier provided on the command line
* @param options - Normalised CLI options
*/
export async function runDataSetDetailsCommand(dataSetId: number, options: DataSetCommandOptions): Promise<void> {
intro(pc.bold(`Filecoin Onchain Cloud Data Set Details for #${dataSetId}`))
const spinner = createSpinner()
spinner.start('Connecting to Synapse...')
let synapse: Synapse | null = null
try {
synapse = await getCliSynapse(options)
const network = synapse.getNetwork()
const client = synapse.getClient()
const address = await client.getAddress()
spinner.message('Fetching data set details...')
const dataSet: DataSetSummary = await getDetailedDataSet(synapse, dataSetId)
spinner.stop('━━━ Data Set ━━━')
displayDataSets([dataSet], network, address)
outro('Data set inspection complete')
} catch (error) {
spinner.stop(`${pc.red('✗')} Failed to inspect data set`)
log.line('')
log.line(`${pc.red('Error:')} ${error instanceof Error ? error.message : String(error)}`)
log.flush()
cancel('Inspection failed')
process.exitCode = 1
} finally {
await cleanupSynapseService()
}
}
export async function runDataSetListCommand(options: DataSetListCommandOptions): Promise<void> {
intro(pc.bold('Filecoin Onchain Cloud Data Sets'))
const spinner = createSpinner()
spinner.start('Connecting to Synapse...')
let synapse: Synapse | null = null
try {
// Parse and validate provider ID
const providerId: number | undefined = options.providerId != null ? Number(options.providerId) : undefined
if (providerId != null && Number.isNaN(providerId)) {
throw new Error('Invalid provider ID')
}
const metadataEntries = options.dataSetMetadata ? Object.entries(options.dataSetMetadata) : []
let filter: ((dataSet: EnhancedDataSetInfo) => boolean) | undefined
if (providerId != null || metadataEntries.length > 0) {
// TODO: synapse is supposed to be able to filter on dataset metadata, but synapse.storage.findDataSets doesn't accept metadata? How do we filter..
filter = (dataSet) => {
if (providerId != null && dataSet.providerId !== providerId) {
return false
}
if (
metadataEntries.length > 0 &&
!metadataEntries.every(([key, value]) => (dataSet.metadata?.[key] ?? '') === value)
) {
return false
}
return true
}
}
synapse = await getCliSynapse(options)
const network = synapse.getNetwork()
const client = synapse.getClient()
const address = await client.getAddress()
spinner.message('Fetching data sets...')
const allDataSets = await listDataSets(synapse, {
withProviderDetails: false,
filter,
})
const dataSets: DataSetSummary[] = options.all
? allDataSets
: allDataSets.filter((dataSet) => dataSet.createdWithFilecoinPin)
spinner.stop('━━━ Data Sets ━━━')
displayDataSets(dataSets, network, address)
outro('Data set list complete')
} catch (error) {
spinner.stop(`${pc.red('✗')} Failed to list data sets`)
log.line('')
log.line(`${pc.red('Error:')} ${error instanceof Error ? error.message : String(error)}`)
log.flush()
cancel('Listing failed')
process.exitCode = 1
} finally {
await cleanupSynapseService()
}
}