ipfs-repo
Version:
IPFS Repo implementation
276 lines • 7.8 kB
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>>;
}
//# sourceMappingURL=types.d.ts.map