filecoin-pin
Version:
Bridge IPFS content to Filecoin Onchain Cloud using familiar tools
79 lines • 2.98 kB
JavaScript
import { noise } from '@chainsafe/libp2p-noise';
import { yamux } from '@chainsafe/libp2p-yamux';
import { bitswap } from '@helia/block-brokers';
import { identify } from '@libp2p/identify';
import { tcp } from '@libp2p/tcp';
import { multiaddr } from '@multiformats/multiaddr';
import { MemoryDatastore } from 'datastore-core';
import { createHelia } from 'helia';
import { createLibp2p } from 'libp2p';
import { CARWritingBlockstore } from './car-blockstore.js';
/**
* Create a Helia node with CAR-writing blockstore for a specific pin operation
* This combines the server and CAR Helia functionality into one instance
*/
export async function createPinningHeliaNode(options) {
const { logger, rootCID, outputPath, origins = [] } = options;
// Parse origins into multiaddrs
const dialTargets = origins
.map((origin) => {
try {
return multiaddr(origin);
}
catch (error) {
logger.warn({ origin, error }, 'Failed to parse origin multiaddr');
return null;
}
})
.filter((addr) => addr != null);
const libp2p = await createLibp2p({
addresses: {
listen: ['/ip4/0.0.0.0/tcp/0'], // Random port
},
transports: [tcp()],
connectionEncrypters: [noise()],
streamMuxers: [yamux()],
services: {
identify: identify(),
},
// No bootstrap or mdns - we'll connect directly to origins
});
// Create CAR-writing blockstore
const carBlockstore = new CARWritingBlockstore({
rootCID,
outputPath,
logger,
});
// Set up event handlers for monitoring
carBlockstore.on('block:stored', (data) => {
logger.debug({ cid: data.cid.toString(), size: data.size }, 'Block stored to CAR file');
});
carBlockstore.on('block:missing', (data) => {
logger.warn({ cid: data.cid.toString() }, 'Block not found during fetch');
});
const helia = await createHelia({
libp2p,
blockstore: carBlockstore,
datastore: new MemoryDatastore(),
blockBrokers: [bitswap()],
});
logger.info(`Pinning Helia node started with peer ID: ${helia.libp2p.peerId.toString()}`);
logger.info(`Writing blocks to CAR file: ${outputPath}`);
// Connect to origin nodes if provided
if (dialTargets.length > 0) {
logger.info({ origins: dialTargets.length }, 'Connecting to origin nodes');
for (const addr of dialTargets) {
try {
if (addr != null) {
await helia.libp2p.dial(addr);
logger.info({ addr: addr.toString() }, 'Connected to origin node');
}
}
catch (error) {
logger.warn({ addr: addr?.toString(), error }, 'Failed to connect to origin node');
}
}
}
return { helia, blockstore: carBlockstore };
}
//# sourceMappingURL=create-pinning-helia.js.map