1
0
mirror of https://github.com/fazo96/ipfs-boards synced 2025-02-03 16:24:20 +01:00
ipfs-boards/components/system.js

184 lines
4.7 KiB
JavaScript
Raw Normal View History

2019-10-22 23:38:21 +02:00
export function getGlobalScope() {
try {
return window
} catch (error) {
return global
}
}
export function isServer() {
try {
window.document
return false
} catch (error) {
return true
}
}
2019-10-22 23:38:21 +02:00
export function getGlobalData() {
const scope = getGlobalScope()
if (!scope.ipfsBoards) scope.ipfsBoards = {}
return scope.ipfsBoards
}
2019-11-13 01:02:56 +01:00
async function getIPFSOptions() {
const common = {
libp2p: {
config: {
pubsub: { enabled: true }
}
}
}
if (isServer()) {
return {
relay: { enabled: true, hop: { enabled: true, active: true } },
...common
}
} else {
const serverInfo = await getServerInfo()
let additionalOptions = {}
if (serverInfo) {
additionalOptions = {
config: {
Bootstrap: [ ...serverInfo.multiaddrs ]
}
}
}
return {
...common,
...additionalOptions
}
}
}
2019-10-22 23:38:21 +02:00
export async function getIPFS() {
const data = getGlobalData()
if (data.ipfs) return data.ipfs
2019-11-13 01:02:56 +01:00
const IPFS = await import(/* webpackChunkName: "ipfs" */ 'ipfs')
const options = await getIPFSOptions()
if (!data.ipfsPromise) {
2019-11-13 01:02:56 +01:00
data.ipfsPromise = IPFS.create(options)
}
data.ipfs = await data.ipfsPromise
delete data.ipfsPromise
2019-10-22 23:38:21 +02:00
return data.ipfs
}
export async function getOrbitDB() {
2019-11-13 01:02:56 +01:00
try {
const data = getGlobalData()
if (data.orbitDb) return data.orbitDb
const ipfs = await getIPFS()
const OrbitDB = await import(/* webpackChunkName: "orbit-db" */ 'orbit-db').then(m => m.default)
const BoardStore = await import(/* webpackChunkName: "orbit-db-discussion-board" */ 'orbit-db-discussion-board').then(m => m.default)
2019-11-13 01:02:56 +01:00
if (!data.orbitDbPromise) {
OrbitDB.addDatabaseType(BoardStore.type, BoardStore)
data.orbitDbPromise = OrbitDB.createInstance(ipfs)
}
data.orbitDb = await data.orbitDbPromise
delete data.orbitDbPromise
if (!data.boards) data.boards = {}
return data.orbitDb
} catch (error) {
console.log('FATAL: COULD NOT LOAD ORBITDB', error)
throw error
}
2019-10-22 23:38:21 +02:00
}
export async function openBoard(id) {
2019-10-26 23:58:20 +02:00
const data = getGlobalData()
2019-10-22 23:38:21 +02:00
if (data.boards && data.boards[id]) return data.boards[id]
const BoardStore = await import(/* webpackChunkName: "orbit-db-discussion-board" */ 'orbit-db-discussion-board').then(m => m.default)
2019-10-22 23:38:21 +02:00
const options = {
type: BoardStore.type,
create: true,
write: ['*']
}
const orbitDb = await getOrbitDB()
2019-10-26 23:58:20 +02:00
const db = await orbitDb.open(id, options)
2019-10-22 23:38:21 +02:00
data.boards[id] = db
2019-10-26 23:58:20 +02:00
await db.load()
2019-10-22 23:38:21 +02:00
return db
}
2019-10-26 23:58:20 +02:00
const defaultLocalStorage = {
favouriteBoards: ['general', 'test']
}
export function getLocalStorage() {
try {
return window.localStorage
} catch (error) {
const data = getGlobalData()
if (!data.localStorage) data.localStorage = { ...defaultLocalStorage }
return {
getItem: name => data.localStorage[name],
setItem: (name, value) => data.localStorage[name] = value,
removeItem: name => delete data.localStorage[name],
}
}
}
export async function getIPFSPeers() {
const data = getGlobalData()
return data.ipfs ? (await data.ipfs.swarm.peers()).map(x => x.peer._idB58String) : []
}
export async function getPubsubInfo() {
const data = getGlobalData()
if (!data.ipfs) return {}
const rooms = await data.ipfs.pubsub.ls()
const pubsubInfo = {}
for (const room of rooms) {
pubsubInfo[room] = await data.ipfs.pubsub.peers(room)
}
return pubsubInfo
}
export function getInfo() {
const data = getGlobalData()
return data.info
}
export async function refreshInfo() {
const data = getGlobalData()
2019-11-13 01:02:56 +01:00
const ipfsReady = Boolean(data.ipfs)
const multiaddrs = ipfsReady ? data.ipfs.libp2p.peerInfo.multiaddrs.toArray().map(m => m.toJSON()) : []
data.info = {
isServer: isServer(),
2019-11-13 01:02:56 +01:00
ipfsReady,
ipfsLoading: Boolean(data.ipfsPromise),
orbitDbReady: Boolean(data.orbitDb),
2019-11-13 01:02:56 +01:00
orbitDbPromise: Boolean(data.orbitDbPromise),
openBoards: Object.keys(data.boards || {}),
ipfsPeers: await getIPFSPeers(),
2019-11-13 01:02:56 +01:00
pubsub: await getPubsubInfo(),
multiaddrs
}
return data.info
2019-11-13 01:02:56 +01:00
}
export async function getServerInfo() {
const response = await fetch('/api/status')
if (response.status === 200) {
return response.json()
}
return null
}
export async function connectoToIPFSMultiaddr(multiaddr) {
const ipfs = await getIPFS()
try {
// console.log(`Connecting to ${multiaddr}...`)
await ipfs.swarm.connect(multiaddr)
console.log(`Connected to ${multiaddr}!`)
} catch (error) {
// console.log(`Connection to ${multiaddr} failed:`, error.message)
}
}
export async function connectIPFSToBackend() {
const serverInfo = await getServerInfo()
const addresses = serverInfo.multiaddrs
return Promise.race(addresses.map(connectoToIPFSMultiaddr))
}