network/src/ipfs/ipfsService.ts
2025-05-16 11:56:23 +03:00

105 lines
2.1 KiB
TypeScript

import type { Libp2p } from 'libp2p';
import {
initIpfsNode,
stopIpfsNode,
getHeliaInstance,
getLibp2pInstance,
getProxyAgentInstance,
} from './services/ipfsCoreService';
import {
getConnectedPeers,
getOptimalPeer,
updateNodeLoad,
logPeersStatus,
} from './services/discoveryService';
import { createServiceLogger } from '../utils/logger';
// Create logger for IPFS service
const logger = createServiceLogger('IPFS');
// Interface definition for the IPFS module
export interface IPFSModule {
init: (externalProxyAgent?: any) => Promise<void>;
stop: () => Promise<void>;
getHelia: () => any;
getProxyAgent: () => any;
getInstance: (externalProxyAgent?: any) => Promise<{
getHelia: () => any;
getProxyAgent: () => any;
}>;
getLibp2p: () => Libp2p;
getConnectedPeers: () => Map<string, { lastSeen: number; load: number; publicAddress: string }>;
getOptimalPeer: () => string | null;
updateNodeLoad: (load: number) => void;
logPeersStatus: () => void;
}
const init = async (externalProxyAgent: any = null) => {
try {
await initIpfsNode(externalProxyAgent);
logger.info('IPFS service initialized successfully');
return getHeliaInstance();
} catch (error) {
logger.error('Failed to initialize IPFS service:', error);
throw error;
}
};
const stop = async () => {
await stopIpfsNode();
logger.info('IPFS service stopped');
};
const getHelia = () => {
return getHeliaInstance();
};
const getProxyAgent = () => {
return getProxyAgentInstance();
};
const getLibp2p = () => {
return getLibp2pInstance();
};
const getInstance = async (externalProxyAgent: any = null) => {
if (!getHeliaInstance()) {
await init(externalProxyAgent);
}
return {
getHelia,
getProxyAgent,
};
};
// Export individual functions
export {
init,
stop,
getHelia,
getProxyAgent,
getInstance,
getLibp2p,
getConnectedPeers,
getOptimalPeer,
updateNodeLoad,
logPeersStatus,
};
// Export as default module
export default {
init,
stop,
getHelia,
getProxyAgent,
getInstance,
getLibp2p,
getConnectedPeers,
getOptimalPeer,
updateNodeLoad,
logPeersStatus,
} as IPFSModule;