UNPKG

@orbitdb/core

Version:

Distributed p2p database on IPFS

93 lines (78 loc) 2.37 kB
/** * @module Address * @description OrbitDB database address verification. */ import { CID } from 'multiformats/cid' import { base58btc } from 'multiformats/bases/base58' import { posixJoin } from './utils/path-join.js' /** * Validates an OrbitDB database address. * @function * @param {module:Address~OrbitDBAddress|string} address An OrbitDB database address. * @return {boolean} True if the address is a valid OrbitDB database address, * false otherwise. * @static */ const isValidAddress = (address) => { address = address.toString() if (!address.startsWith('/orbitdb') && !address.startsWith('\\orbitdb')) { return false } address = address.replaceAll('/orbitdb/', '') address = address.replaceAll('\\orbitdb\\', '') address = address.replaceAll('/', '') address = address.replaceAll('\\', '') let cid try { cid = CID.parse(address, base58btc) } catch (e) { return false } return cid !== undefined } /** * Parses an OrbitDB database address. * @function * @param {module:Address~OrbitDBAddress|string} address A valid OrbitDB database address. * @return {module:Address~OrbitDBAddress} An instance of OrbitDBAddress. * @throws Not a valid OrbitDB address if no address if provided. * @throws Not a valid OrbitDB address if address is invalid. * @static */ const parseAddress = (address) => { if (!address) { throw new Error(`Not a valid OrbitDB address: ${address}`) } if (!isValidAddress(address)) { throw new Error(`Not a valid OrbitDB address: ${address}`) } return OrbitDBAddress(address) } /** * @typedef {Object} OrbitDBAddress * @property {string} protocol Protocol prefix "/orbitdb/". * @property {string} hash The hash of the database manifest. * @property {string} address The full database address. */ const OrbitDBAddress = (address) => { if (address && address.protocol === 'orbitdb' && address.hash) { return address } const protocol = 'orbitdb' const hash = address.replace('/orbitdb/', '').replace('\\orbitdb\\', '') /** * Returns address as a string. * @typedef {Function} toString * @returns {string} Address as a string. */ const toString = () => { return posixJoin('/', protocol, hash) } return { protocol, hash, address, toString } } export { OrbitDBAddress as default, isValidAddress, parseAddress }