ipfs-repo
Version:
IPFS Repo implementation
325 lines (271 loc) • 7.23 kB
text/typescript
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>> }