75 lines
2.4 KiB
TypeScript
75 lines
2.4 KiB
TypeScript
/* eslint-disable no-console */
|
|
|
|
import Ipfs from 'ipfs'
|
|
import { useEffect, useState } from 'react'
|
|
import os from 'os'
|
|
import shortid from 'shortid'
|
|
|
|
let ipfs: any = null
|
|
let ipfsMessage = ''
|
|
let ipfsVersion = ''
|
|
|
|
export default function useIpfs() {
|
|
const [isIpfsReady, setIpfsReady] = useState(Boolean(ipfs))
|
|
const [ipfsError, setIpfsError] = useState('')
|
|
|
|
useEffect(() => {
|
|
async function startIpfs() {
|
|
ipfsMessage = 'Starting IPFS...'
|
|
|
|
if (ipfs) {
|
|
console.log('IPFS already started')
|
|
// } else if (window.ipfs && window.ipfs.enable) {
|
|
// console.log('Found window.ipfs')
|
|
// ipfs = await window.ipfs.enable()
|
|
} else {
|
|
try {
|
|
const message = 'IPFS started'
|
|
console.time(message)
|
|
|
|
ipfs = await Ipfs.create({
|
|
repo: `${os.homedir()}/.jsipfs-${shortid.generate()}`,
|
|
config: {
|
|
Addresses: {
|
|
// 0 for port so system just assigns a new free port
|
|
// to allow multiple nodes running at same time
|
|
Swarm: ['/ip4/0.0.0.0/tcp/0']
|
|
}
|
|
}
|
|
})
|
|
console.timeEnd(message)
|
|
ipfsMessage = message
|
|
|
|
const { agentVersion } = await ipfs.id()
|
|
ipfsVersion = agentVersion
|
|
} catch (error) {
|
|
const message = `IPFS init error: ${error.message}`
|
|
ipfsMessage = message
|
|
console.error(message)
|
|
ipfs = null
|
|
setIpfsError(error.message)
|
|
}
|
|
}
|
|
setIpfsReady(Boolean(ipfs))
|
|
}
|
|
|
|
startIpfs()
|
|
|
|
// just like componentWillUnmount()
|
|
return function cleanup() {
|
|
if (ipfs && ipfs.stop) {
|
|
console.time('IPFS stopped')
|
|
ipfs.stop()
|
|
setIpfsReady(false)
|
|
ipfs = null
|
|
ipfsMessage = ''
|
|
ipfsVersion = ''
|
|
setIpfsError('')
|
|
console.timeEnd('IPFS stopped')
|
|
}
|
|
}
|
|
}, [])
|
|
|
|
return { ipfs, ipfsVersion, isIpfsReady, ipfsError, ipfsMessage }
|
|
}
|