UNPKG

kubo-rpc-client

Version:
539 lines (466 loc) 13.9 kB
/* eslint-env browser */ import { isMultiaddr, type Multiaddr } from '@multiformats/multiaddr' import { createKuboRPCClient } from './client.js' import { HTTP } from './lib/http.js' import type { BitswapAPI } from './bitswap/index.js' import type { BlockAPI } from './block/index.js' import type { BootstrapAPI } from './bootstrap/index.js' import type { ConfigAPI } from './config/index.js' import type { DAGAPI } from './dag/index.js' import type { DHTAPI } from './dht/index.js' import type { DiagAPI } from './diag/index.js' import type { FilesAPI } from './files/index.js' import type { KeyAPI } from './key/index.js' import type { HTTPOptions } from './lib/http.js' import type { LoadBaseFn } from './lib/multibases.js' import type { LoadCodecFn } from './lib/multicodecs.js' import type { LoadHasherFn } from './lib/multihashes.js' import type { LogAPI } from './log/index.js' import type { NameAPI } from './name/index.js' import type { ObjectAPI } from './object/index.js' import type { PinAPI } from './pin/index.js' import type { PubSubAPI } from './pubsub/index.js' import type { RefsAPI } from './refs/index.js' import type { RepoAPI } from './repo/index.js' import type { RoutingAPI } from './routing/index.js' import type { StatsAPI } from './stats/index.js' import type { SwarmAPI } from './swarm/index.js' import type { AbortOptions, PeerId } from '@libp2p/interface' import type { Mtime, MtimeLike } from 'ipfs-unixfs' import type { MultibaseCodec } from 'multiformats/bases/interface' import type { CID, Version } from 'multiformats/cid' import type { BlockCodec } from 'multiformats/codecs/interface' import type { MultihashHasher } from 'multiformats/hashes/interface' import type { Agent as HttpAgent } from 'node:http' import type { Agent as HttpsAgent } from 'node:https' export type Await<T> = T | Promise<T> export type AwaitIterable<T> = Iterable<T> | AsyncIterable<T> export interface HTTPRPCOptions extends AbortOptions { headers?: Headers | Record<string, any> searchParams?: URLSearchParams timeout?: number | string verbose?: boolean } export interface Bases { getBase(code: string): Promise<MultibaseCodec<any>> listBases(): Array<MultibaseCodec<any>> } export interface Codecs { getCodec(code: number | string): Promise<BlockCodec<any, any>> listCodecs(): Array<BlockCodec<any, any>> } export interface Hashers { getHasher(code: number | string): Promise<MultihashHasher> listHashers(): MultihashHasher[] } /** * Tracks progress status as a file is transformed into a DAG */ export interface AddProgressFn { (bytes: number, path?: string): void } interface ProgressStatus { total: number loaded: number lengthComputable: boolean } /** * Tracks progress status as a file is uploaded to the RPC server */ export interface UploadProgressFn { (status: ProgressStatus): void } export interface EndpointConfig { host: string port: string protocol: string pathname: string 'api-path': string } export interface IPFSEntry { readonly type: 'dir' | 'file' readonly cid: CID readonly name: string readonly path: string mode?: number mtime?: Mtime size: number } export interface AddOptions extends HTTPRPCOptions { /** * Chunking algorithm used to build ipfs DAGs. (defaults to 'size-262144') */ chunker?: string /** * The CID version to use when storing the data */ cidVersion?: Version /** * Multihash hashing algorithm to use. (Defaults to 'sha2-256') */ hashAlg?: string /** * If true, will not add blocks to the blockstore. (Defaults to `false`) */ onlyHash?: boolean /** * Pin this object when adding. (Defaults to `true`) */ pin?: boolean /** * A function that will be called with the number of bytes added as a file is * added to ipfs and the path of the file being added. * * **Note** It will not be called for directory entries. */ progress?: AddProgressFn /** * If true, DAG leaves will contain raw file data and not be wrapped in a * protobuf. (Defaults to `false`) */ rawLeaves?: boolean /** * If true will use the * [trickle DAG](https://godoc.org/github.com/ipsn/go-ipfs/gxlibs/github.com/ipfs/go-unixfs/importer/trickle) * format for DAG generation. (Defaults to `false`). */ trickle?: boolean /** * Adds a wrapping node around the content. (Defaults to `false`) */ wrapWithDirectory?: boolean /** * Whether to preload all blocks created during this operation */ preload?: boolean /** * How many blocks from a file to write concurrently */ blockWriteConcurrency?: number } export interface AddAllOptions extends AddOptions { /** * Allows to create directories with an unlimited number of entries currently * size of unixfs directories is limited by the maximum block size. * ** Note ** that this is an experimental feature. (Defaults to `false`) */ enableShardingExperiment?: boolean /** * Directories with more than this number of files will be created as HAMT - * sharded directories. (Defaults to 1000) */ shardSplitThreshold?: number /** * How many files to write concurrently */ fileImportConcurrency?: number } export interface AddResult { cid: CID size: number path: string mode?: number mtime?: Mtime } export interface ShardingOptions { sharding?: boolean } export interface CatOptions extends HTTPRPCOptions { /** * An offset to start reading the file from */ offset?: number /** * An optional max length to read from the file */ length?: number } export interface GetOptions extends HTTPRPCOptions { archive?: boolean compress?: boolean compressionLevel?: -1 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 } export interface ListOptions extends HTTPRPCOptions { } export interface IDOptions extends HTTPRPCOptions { peerId?: PeerId } export interface IDResult { id: PeerId publicKey: string addresses: Multiaddr[] agentVersion: string protocolVersion: string protocols: string[] } /** * An object with the version information for the implementation, * the commit and the Repo. `js-ipfs` instances will also return * the version of `interface-ipfs-core` and `ipfs-http-client` * supported by this node */ export interface VersionResult { version: string commit?: string repo?: string system?: string golang?: string 'ipfs-core'?: string 'interface-ipfs-core'?: string 'ipfs-http-client'?: string } export interface PingOptions extends HTTPRPCOptions { count?: number } export interface PingResult { success: boolean time: number text: string } export interface ResolveOptions extends HTTPRPCOptions { recursive?: boolean cidBase?: string } export interface MountOptions extends HTTPRPCOptions { ipfsPath?: string ipnsPath?: string } export interface MountResult { fuseAllowOther?: boolean ipfs?: string ipns?: string } export type ImportCandidateStream = | AwaitIterable<ImportCandidate> | ReadableStream<ImportCandidate> export type ImportCandidate = | ToFile | ToDirectory | ToContent export interface ToFile extends ToFileMetadata { path?: string content: ToContent } export interface ToDirectory extends ToFileMetadata { path: string content?: undefined } export interface ToFileMetadata { mode?: ToMode mtime?: MtimeLike } /** * An IPFS path or CID */ export type IPFSPath = CID | string /** * File content in arbitrary (supported) representation. It is used in input * positions and is usually normalized to `Blob` in browser contexts and * `AsyncIterable<Uint8Array>` in node. */ export type ToContent = | string | InstanceType<typeof String> | ArrayBufferView | ArrayBuffer | Blob | AwaitIterable<Uint8Array> | ReadableStream<Uint8Array> export type ToMode = | string | number export interface KuboRPCClient { bases: Bases codecs: Codecs hashers: Hashers bitswap: BitswapAPI block: BlockAPI bootstrap: BootstrapAPI config: ConfigAPI dag: DAGAPI dht: DHTAPI diag: DiagAPI files: FilesAPI key: KeyAPI log: LogAPI name: NameAPI object: ObjectAPI pin: PinAPI pubsub: PubSubAPI refs: RefsAPI repo: RepoAPI routing: RoutingAPI stats: StatsAPI swarm: SwarmAPI /** * Import a file or data into IPFS */ add(entry: ImportCandidate, options?: AddOptions): Promise<AddResult> /** * Import multiple files and data into IPFS */ addAll(source: ImportCandidateStream, options?: AddAllOptions): AsyncIterable<AddResult> /** * Returns content of the file addressed by a valid IPFS Path or CID */ cat(ipfsPath: IPFSPath, options?: CatOptions): AsyncIterable<Uint8Array> /** * Fetch a file or an entire directory tree from IPFS that is addressed by a * valid IPFS Path */ get(ipfsPath: IPFSPath, options?: GetOptions): AsyncIterable<Uint8Array> /** * Lists a directory from IPFS that is addressed by a valid IPFS Path */ ls(ipfsPath: IPFSPath, options?: ListOptions): AsyncIterable<IPFSEntry> /** * Returns the identity of the Peer * * @example * ```js * const identity = await ipfs.id() * console.log(identity) * ``` */ id(options?: IDOptions): Promise<IDResult> /** * Returns the implementation version * * @example * ```js * const version = await ipfs.version() * console.log(version) * ``` */ version(options?: HTTPRPCOptions): Promise<VersionResult> /** * Stop the node */ stop(options?: HTTPRPCOptions): Promise<void> /** * Send echo request packets to IPFS hosts. * * @example * ```js * for await (const res of ipfs.ping('Qmhash')) { * if (res.time) { * console.log(`Pong received: time=${res.time} ms`) * } else { * console.log(res.text) * } * } * ``` */ ping(peerId: PeerId | string, options?: PingOptions): AsyncIterable<PingResult> /** * Resolve the value of names to IPFS * * There are a number of mutable name protocols that can link among themselves * and into IPNS. For example IPNS references can (currently) point at an IPFS * object, and DNS links can point at other DNS links, IPNS entries, or IPFS * objects. This command accepts any of these identifiers and resolves them * to the referenced item. * * @example * ```js * // Resolve the value of your identity: * const name = '/ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy' * * const res = await ipfs.resolve(name) * console.log(res) * // Logs: /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj * * // Resolve the value of another name recursively: * const name = '/ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n' * * // Where: * // /ipns/QmbCMUZw6JFeZ7Wp9jkzbye3Fzp2GGcPgC3nmeUjfVF87n * // ...resolves to: * // /ipns/QmatmE9msSfkKxoffpHwNLNKgwZG8eT9Bud6YoPab52vpy * // ...which in turn resolves to: * // /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj * * const res = await ipfs.resolve(name, { recursive: true }) * console.log(res) * // Logs: /ipfs/Qmcqtw8FfrVSBaRmbWwHxt3AuySBhJLcvmFYi3Lbc4xnwj * * // Resolve the value of an IPFS path: * const name = '/ipfs/QmeZy1fGbwgVSrqbfh9fKQrAWgeyRnj7h8fsHS1oy3k99x/beep/boop' * const res = await ipfs.resolve(name) * console.log(res) * // Logs: /ipfs/QmYRMjyvAiHKN9UTi8Bzt1HUspmSRD8T8DwxfSMzLgBon1 * ``` */ resolve(name: string, options?: ResolveOptions): Promise<string> /** * Returns a list of available commands */ commands(options?: HTTPRPCOptions): Promise<string[]> mount(options?: MountOptions): Promise<MountResult> /** * Returns true if this IPFS node is online - that is, it's listening on network addresses * for incoming connections */ isOnline(): Promise<boolean> getEndpointConfig(): EndpointConfig } export interface Options { host?: string port?: number | string protocol?: string headers?: Headers | Record<string, string> timeout?: number | string apiPath?: string url?: URL | string | Multiaddr ipld?: Partial<IPLDOptions> agent?: HttpAgent | HttpsAgent } export interface IPLDOptions { loadBase: LoadBaseFn loadCodec: LoadCodecFn loadHasher: LoadHasherFn bases: Array<MultibaseCodec<any>> codecs: Array<BlockCodec<any, any>> hashers: MultihashHasher[] } export function create (options: string | Multiaddr | URL | Options = {}): KuboRPCClient { if (typeof options === 'string' || isMultiaddr(options) || options instanceof URL) { options = { url: options } } return createKuboRPCClient(options) } export { create as createKuboRPCClient } export { CID } from 'multiformats/cid' export { multiaddr } from '@multiformats/multiaddr' export * from './lib/glob-source.js' export interface UrlSourceEntry { path: string content?: AsyncIterable<Uint8Array> } export function urlSource (url: string, options?: HTTPOptions): UrlSourceEntry { return { path: decodeURIComponent(new URL(url).pathname.split('/').pop() ?? ''), content: readURLContent(url, options) } } export async function * readURLContent (url: string, options?: HTTPOptions): AsyncIterable<Uint8Array> { const response = await HTTP.get(url, options) yield * response.iterator() } export * from './bitswap/index.js' export * from './block/index.js' export * from './bootstrap/index.js' export * from './config/index.js' export * from './dag/index.js' export * from './dht/index.js' export * from './diag/index.js' export * from './files/index.js' export * from './key/index.js' export * from './log/index.js' export * from './name/index.js' export * from './object/index.js' export * from './pin/index.js' export * from './pubsub/index.js' export * from './refs/index.js' export * from './repo/index.js' export * from './routing/index.js' export * from './stats/index.js' export * from './swarm/index.js'