declare module "hypercore" { import { EventEmitter } from "node:events"; import type RocksDB from "rocksdb-native"; type Key = Buffer | Uint8Array; interface KeyPair { publicKey: Key; secretKey: Key; } type EncodingType = "json" | "utf-8" | "binary"; type Stringable = string | { toString(): string }; // Plain JSON object based on this stack overflow answer // https://stackoverflow.com/a/59647842 type Primitive = bigint | boolean | null | number | string; type JSONValue = Primitive | JSONObject | JSONArray; interface JSONObject { [key: string]: JSONValue; } interface JSONArray extends Array {} interface CoreOpts { valueEncoding?: EncodingType; keyPair?: KeyPair; encryption?: { key: Key }; timeout?: number; writable?: boolean; inflightRange?: [number, number]; userData?: { [key: string]: any }; key?: Key; } interface GetOpts { wait?: boolean; onwait?: () => void; timeout?: number; activeRequests?: any[]; valueEncoding?: EncodingType; decrypt?: boolean; raw?: boolean; } interface Peer { remotePublicKey: Key; readonly paused: boolean; readonly removed: boolean; readonly extensions: Map } interface Extension { send(message: Encoding, peer: Peer): void; broadcast(message: Encoding): void; destroy(): void; } interface ExtensionOpts { onmessage: (message: Encoding, peer: Peer) => void; } interface HypercoreEvents { close: []; ready: []; append: []; "peer-add": [peer: Peer]; "peer-remove": [peer: Peer]; upload: [index: number, byteLength: number, peer: Peer]; download: [index: number, byteLength: number, peer: Peer]; } export default class Hypercore< DataType = string | Buffer | Uint8Array > extends EventEmitter { constructor(storage: string | RocksDB, opts?: CoreOpts); readonly key: Buffer; readonly url: string; readonly id: string; readonly discoveryKey: Buffer; discovery: object; readonly writable: boolean; readonly length: number; readonly closed: boolean; readonly peers: Peer[]; readonly extensions: Map findingPeers(): () => void; ready(): Promise; update(options?: { wait?: false; activeRequests?: any[]; force?: false; }): Promise; close(options?: { error?: Error }): Promise; get(index: number, opts?: GetOpts): Promise; append( data: DataType | DataType[], options?: { writable?: boolean } ): Promise; registerExtension( name: string, extensionOpts: ExtensionOpts & { encoding: "utf-8" } ): Extension; registerExtension( name: string, extensionOpts: ExtensionOpts & { encoding?: "buffer"; } ): Extension; registerExtension( name: string, extensionOpts: ExtensionOpts & { encoding: "json" } ): Extension; } }