ipfs-core
Version:
JavaScript implementation of the IPFS specification
261 lines (222 loc) • 8.76 kB
text/typescript
import type { KeyType } from '@libp2p/interface-keys'
import type { PeerId } from '@libp2p/interface-peer-id'
import type { Config as IPFSConfig } from 'ipfs-core-types/src/config'
import type { Libp2p, Libp2pOptions } from 'libp2p'
import type { IPFSRepo } from 'ipfs-repo'
import type { ProgressCallback as MigrationProgressCallback } from 'ipfs-repo-migrations'
import type { Network, Options as NetworkOptions } from './components/network'
import type { Datastore } from 'interface-datastore'
import type { Service } from './utils/service'
import type { CID } from 'multiformats/cid'
import type { BlockCodec } from 'multiformats/codecs/interface'
import type { MultibaseCodec } from 'multiformats/bases/interface'
import type { MultihashHasher } from 'multiformats/hashes/interface'
export interface Options {
/**
* Initialization options of the IPFS node.
* Note that *initializing* a repo is different from creating an instance of
* [`ipfs-repo`](https://github.com/ipfs/js-ipfs-repo). The IPFS constructor
* sets many special properties when initializing a repo, so you should usually
* not try and call `repoInstance.init()` yourself.
*/
init?: InitOptions
/**
* If `false`, do not automatically start the IPFS node. Instead, you’ll need to manually call
* [`node.start()`](https://github.com/ipfs/js-ipfs/blob/master/packages/ipfs/docs/MODULE.md#nodestart)
* yourself.
*/
start?: boolean
/**
* A passphrase to encrypt/decrypt keys stored in your keychain
*/
pass?: string
/**
* Configure circuit relay (see the [circuit relay tutorial](https://github.com/ipfs-examples/js-ipfs-examples/tree/master/examples/circuit-relaying)
* to learn more)
*/
relay?: RelayOptions
/**
* Run ipfs node offline. The node does not connect to the rest of the network
* but APIs that do not require network access will still work.
*/
offline?: boolean
/**
* Configure remote preload nodes. The remote will preload content added on this node,
* and also attempt to preload objects requested by this node.
*/
preload?: PreloadOptions
/**
* Enable and configure experimental features
*/
EXPERIMENTAL?: ExperimentalOptions
/**
* Modify the default IPFS node config. This object will be *merged* with the default config; it will not replace it.
* (Default: [`config-nodejs.js`](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/config-nodejs.js)
* in Node.js, [`config-browser.js`](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/config-browser.js)
* in browsers)
*/
config?: IPFSConfig
/**
* If multiple instances of IPFS are accessing the same repo - e.g. via node cluster or browser UI and webworkers
* one instance must be designated the repo owner to hold the lock on shared resources like the datastore.
*
* Set this property to true on one instance only if this is how your application is set up.
*/
repoOwner?: boolean
/**
* The file path at which to store the IPFS node’s data. Alternatively, you can set up a customized
* storage system by providing an Repo implementation. (In browser default is 'ipfs').
*/
repo?: IPFSRepo | string
/**
* Occasionally a repo migration is necessary - pass true here to to this automatically at startup
* when a new version of IPFS is being run for the first time and a migration is necessary, otherwise
* the node will refuse to start
*/
repoAutoMigrate?: boolean
/**
* Pass a function here to be notified of progress when a repo migration is taking place
*/
onMigrationProgress?: MigrationProgressCallback
/**
* To speed up peers store access, the data associated with this many peers is kept in memory in
* a least-recently used cache. The default is 1024. To hold all peers in memory at all times set
* this to Infinity.
*/
peerStoreCacheSize?: number
/**
* Modify the default IPLD config. This object
* will be *merged* with the default config; it will not replace it. Check IPLD
* [docs](https://github.com/ipld/js-ipld#ipld-constructor) for more information
* on the available options. (Default: [`ipld.js`]
* (https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/ipld-nodejs.js) in Node.js, [`ipld-browser.js`](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/ipld-browser.js)
* (https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/ipld.js)
* in browsers)
*/
ipld?: Partial<IPLDOptions>
/**
* The libp2p option allows you to build
* your libp2p node by configuration, or via a bundle function. If you are
* looking to just modify the below options, using the object format is the
* quickest way to get the default features of libp2p. If you need to create a
* more customized libp2p node, such as with custom transports or peer/content
* routers that need some of the ipfs data on startup, a custom bundle is a
* great way to achieve this.
* - You can see the bundle in action in the [custom libp2p example](https://github.com/ipfs-examples/js-ipfs-examples/tree/master/examplescustom-libp2p).
* - Please see [libp2p/docs/CONFIGURATION.md](https://github.com/libp2p/js-libp2p/blob/master/doc/CONFIGURATION.md)
* for the list of options libp2p supports.
* - Default: [`libp2p-nodejs.js`](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/libp2p-nodejs.js)
* in Node.js, [`libp2p-browser.js`](https://github.com/ipfs/js-ipfs/tree/master/packages/ipfs-core-config/src/libp2p-browser.js) in
* browsers.
*/
libp2p?: Partial<Libp2pOptions> | Libp2pFactoryFn
silent?: boolean
}
export interface Libp2pFactoryFnArgs {
libp2pOptions: Libp2pOptions
options: Options
config: IPFSConfig
datastore: Datastore
peerId: PeerId
}
export interface Libp2pFactoryFn {
(args: Libp2pFactoryFnArgs): Promise<Libp2p>
}
/**
* On first run js-IPFS will initialize a repo which can be customized through this settings
*/
export interface InitOptions {
/**
* Whether to remove built-in assets, like the instructional tour and empty mutable file system, from the repo
*/
emptyRepo?: boolean
/**
* The type of key to use
*/
algorithm?: KeyType
/**
* Number of bits to use in the generated key pair (rsa only)
*/
bits?: number
/**
* A pre-generated private key to use
* **NOTE: This overrides `bits`.**
*/
privateKey?: PeerId|string
/**
* Apply profile settings to config
*/
profiles?: string[]
/**
* Set to `false` to disallow initialization if the repo does not already exist
*/
allowNew?: boolean
}
export interface RelayOptions {
/**
* Enable circuit relay dialer and listener. (Default: `true`)
*/
enabled?: boolean
hop?: {
/**
* Make this node a relay (other nodes can connect *through* it). (Default: `false`)
*/
enabled?: boolean
/**
* Make this an active relay node. Active relay nodes will attempt to dial a destination peer even if that peer is not yet connected to the relay. (Default: false)
*/
active?: boolean
}
}
export interface PreloadOptions {
/**
* Whether to preload anything
*/
enabled?: boolean
/**
* How many CIDs to cache
*/
cache?: number
/**
* Which preload servers to use. **NOTE:** nodes specified here should also be added to your node's
* bootstrap address list at `config.Boostrap`
*/
addresses?: string[]
}
export interface ExperimentalOptions {
/**
* Enable pub-sub on IPNS. (Default: `false`)
*/
ipnsPubsub?: boolean
/**
* Enable directory sharding. Directories that have many child objects will be represented by multiple
* DAG nodes instead of just one. It can improve lookup performance when a directory has several
* thousand files or more. (Default: `false`)
*/
sharding?: boolean
}
/**
* Prints output to the console
*/
export interface Print { (...args: any[]): void }
export interface Preload {
(cid: CID): void
start: () => void
stop: () => void
}
export interface MfsPreload {
start: () => void
stop: () => void
}
export type NetworkService = Service<NetworkOptions, Network>
export interface LoadBaseFn { (codeOrName: number | string): Promise<MultibaseCodec<any>> }
export interface LoadCodecFn { (codeOrName: number | string): Promise<BlockCodec<any, any>> }
export interface LoadHasherFn { (codeOrName: number | string): Promise<MultihashHasher> }
export interface IPLDOptions {
loadBase: LoadBaseFn
loadCodec: LoadCodecFn
loadHasher: LoadHasherFn
bases: Array<MultibaseCodec<any>>
codecs: Array<BlockCodec<any, any>>
hashers: MultihashHasher[]
}