UNPKG

ipfs-repo

Version:
325 lines (271 loc) 7.23 kB
import type { Datastore } from 'interface-datastore' import type { Blockstore } from 'interface-blockstore' import type { CID } from 'multiformats/cid' import type { BlockCodec } from 'multiformats/codecs/interface' export type AwaitIterable<T> = Iterable<T> | AsyncIterable<T> export type Await<T> = Promise<T> | T export interface Options { /** * Controls automatic migrations of repository. (defaults: true) */ autoMigrate: boolean /** * Callback function to be notified of migration progress */ onMigrationProgress: (version: number, percentComplete: string, message: string) => void /** * If multiple processes 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 /** * A lock implementation that prevents multiple processes accessing the same repo */ repoLock: RepoLock } export interface IPFSRepo { closed: boolean path: string root: Datastore datastore: Datastore keys: Datastore pins: Pins blocks: Blockstore version: { exists: () => Promise<any> get: () => Promise<number> set: (version: number) => Promise<void> check: (expected: number) => Promise<boolean> } config: { getAll: (options?: { signal?: AbortSignal }) => Promise<import('./types').Config> get: (key: string, options?: { signal?: AbortSignal }) => Promise<any> set: (key: string, value?: any, options?: { signal?: AbortSignal }) => Promise<void> replace: (value?: import('./types').Config, options?: { signal?: AbortSignal }) => Promise<void> exists: () => Promise<any> } spec: { exists: () => Promise<boolean> get: () => Promise<Uint8Array> set: (spec: any) => Promise<void> } apiAddr: { get: () => Promise<string> set: (value: string) => Promise<void> delete: () => Promise<void> } gcLock: GCLock gc: () => AsyncGenerator<GCErrorResult | GCSuccessResult, void, unknown> /** * Initialize a new repo. * * @param {import('./types').Config} config - config to write into `config`. * @returns {Promise<void>} */ init: (config: Config) => Promise<void> /** * Check if the repo is already initialized. * * @returns {Promise<boolean>} */ isInitialized: () => Promise<boolean> /** * Open the repo. If the repo is already open an error will be thrown. * If the repo is not initialized it will throw an error. * * @returns {Promise<void>} */ open: () => Promise<void> /** * Close the repo and cleanup. * * @returns {Promise<void>} */ close: () => Promise<void> /** * Check if a repo exists. * * @returns {Promise<boolean>} */ exists: () => Promise<boolean> /** * Get repo status. * * @returns {Promise<Stat>} */ stat: () => Promise<Stat> } export interface Backends { root: Datastore blocks: Blockstore keys: Datastore datastore: Datastore pins: Datastore } export interface LockCloser { close: () => Promise<void> } export interface RepoLock { /** * Sets the lock if one does not already exist. If a lock already exists, should throw an error. */ lock: (path: string) => Promise<LockCloser> /** * Checks the existence of the lock. */ locked: (path: string) => Promise<boolean> } export interface ReleaseLock { (): void } export interface GCLock { readLock: () => Promise<ReleaseLock> writeLock: () => Promise<ReleaseLock> } export interface GCErrorResult { err: Error cid?: undefined } export interface GCSuccessResult { cid: CID err?: undefined } export interface Stat { repoPath: string storageMax: BigInt version: number numObjects: BigInt repoSize: BigInt } export interface Config { Addresses?: AddressConfig API?: APIConfig Profiles?: string Bootstrap?: string[] Discovery?: DiscoveryConfig Datastore?: DatastoreConfig Identity?: IdentityConfig Keychain?: KeychainConfig Pubsub?: PubsubConfig Swarm?: SwarmConfig Routing?: RoutingConfig } /** * Contains information about various listener addresses to be used by this node */ export interface AddressConfig { API?: string RPC?: string Delegates?: string[] Gateway?: string Swarm?: string[] Announce?: string[] NoAnnounce?: string[] } export interface APIConfig { HTTPHeaders?: Record<string, string[]> } export interface DiscoveryConfig { MDNS?: MDNSDiscovery webRTCStar?: WebRTCStarDiscovery } export interface MDNSDiscovery { Enabled?: boolean Interval?: number } export interface WebRTCStarDiscovery { Enabled?: boolean } export interface DatastoreConfig { Spec?: DatastoreSpec } export interface DatastoreType { type: string path: string sync?: boolean shardFunc?: string compression?: string } export interface DatastoreMountPoint { mountpoint: string type: string prefix: string child: DatastoreType } export interface DatastoreSpec { type?: string mounts?: DatastoreMountPoint[] } export interface IdentityConfig { /** * The unique PKI identity label for this configs peer. Set on init and never * read, its merely here for convenience. IPFS will always generate the peerID * from its keypair at runtime. */ PeerID: string /** * The base64 encoded protobuf describing (and containing) the nodes private key. */ PrivKey: string } export interface KeychainConfig { DEK?: DEK } export interface DEK { keyLength?: number iterationCount?: number salt?: string hash?: string } export interface PubsubConfig { PubSubRouter?: 'gossipsub' | 'floodsub' Enabled?: boolean } export interface SwarmConfig { ConnMgr?: ConnMgrConfig DisableNatPortMap?: boolean } export interface ConnMgrConfig { LowWater?: number HighWater?: number } export interface RoutingConfig { Type?: string } export type PinType = 'recursive' | 'direct' | 'indirect' | 'all' export type PinQueryType = 'recursive' | 'direct' | 'indirect' | 'all' export interface PinOptions extends AbortOptions { metadata?: Record<string, any> } export interface Pin { cid: CID metadata?: Record<string, any> } export interface PinnedWithTypeResult { cid: CID pinned: boolean reason?: PinType metadata?: Record<string, any> parent?: CID } export interface Pins { pinDirectly: (cid: CID, options?: PinOptions) => Promise<void> pinRecursively: (cid: CID, options?: PinOptions) => Promise<void> unpin: (cid: CID, options?: AbortOptions) => Promise<void> directKeys: (options?: AbortOptions) => AsyncGenerator<Pin, void, undefined> recursiveKeys: (options?: AbortOptions) => AsyncGenerator<Pin, void, undefined> indirectKeys: (options?: AbortOptions) => AsyncGenerator<CID, void, undefined> isPinnedWithType: (cid: CID, types: PinQueryType|PinQueryType[], options?: AbortOptions) => Promise<PinnedWithTypeResult> } export interface AbortOptions { signal?: AbortSignal } export interface loadCodec { (codeOrName: number | string): Promise<BlockCodec<any, any>> }