@dao-xyz/peerbit
Version:
Distributed p2p database on IPFS
127 lines (126 loc) • 5.49 kB
TypeScript
import LazyLevel from "@dao-xyz/lazy-level";
import { Multiaddr } from "@multiformats/multiaddr";
import { MinReplicas } from "./exchange-heads.js";
import { Entry, Log } from "@dao-xyz/peerbit-log";
import { X25519PublicKey, Ed25519Keypair, PublicKeyEncryptionResolver, Ed25519PublicKey } from "@dao-xyz/peerbit-crypto";
import { FastKeychain } from "./encryption.js";
import { Program, Address, LogCallbackOptions } from "@dao-xyz/peerbit-program";
import { PubSubData, Subscription, SubscriptionEvent, UnsubcriptionEvent } from "@dao-xyz/libp2p-direct-sub";
import "@libp2p/peer-id";
import { Libp2pExtended } from "@dao-xyz/peerbit-libp2p";
import { SubscriptionType } from "@dao-xyz/peerbit-program";
import { TrimToByteLengthOption } from "@dao-xyz/peerbit-log";
import { TrimToLengthOption } from "@dao-xyz/peerbit-log";
import { CreateOptions as ClientCreateOptions } from "@dao-xyz/peerbit-libp2p";
export declare const logger: import("pino").Logger<import("pino").LoggerOptions | import("pino").DestinationStream>;
interface ProgramWithMetadata {
program: Program;
openCounter: number;
}
interface LogWithMetaata {
open: number;
log: Log<any>;
sync?: SyncFilter;
minReplicas: MinReplicas;
}
export type OptionalCreateOptions = {
limitSigning?: boolean;
minReplicas?: number;
refreshIntreval?: number;
libp2pExternal?: boolean;
};
export type CreateOptions = {
directory?: string;
cache: LazyLevel;
identity: Ed25519Keypair;
keychain: FastKeychain;
} & OptionalCreateOptions;
export type SyncFilter = (entries: Entry<any>) => Promise<boolean> | boolean;
export type CreateInstanceOptions = {
libp2p?: Libp2pExtended | ClientCreateOptions;
directory?: string;
cache?: LazyLevel;
} & OptionalCreateOptions;
export type OpenOptions = {
entryToReplicate?: Entry<any>;
role?: SubscriptionType;
sync?: SyncFilter;
timeout?: number;
minReplicas?: MinReplicas | number;
trim?: TrimToByteLengthOption | TrimToLengthOption;
reset?: boolean;
} & {
log?: LogCallbackOptions;
};
export declare class Peerbit {
_libp2p: Libp2pExtended;
directory?: string;
_minReplicas: number;
programs: Map<string, ProgramWithMetadata>;
limitSigning: boolean;
logs: Map<string, LogWithMetaata>;
private _sortedPeersCache;
private _gidPeersHistory;
private _openProgramQueue;
private _disconnected;
private _disconnecting;
private _refreshInterval;
private _lastSubscriptionMessageId;
private _cache;
private _libp2pExternal?;
private _identityHash;
private _identity;
private _keychain;
constructor(libp2p: Libp2pExtended, options: CreateOptions);
static create(options?: CreateInstanceOptions): Promise<Peerbit>;
get libp2p(): Libp2pExtended;
get cache(): LazyLevel;
get encryption(): PublicKeyEncryptionResolver;
get disconnected(): boolean;
get disconnecting(): boolean;
get identityHash(): string;
get identity(): Ed25519Keypair;
importKeypair(keypair: Ed25519Keypair): Promise<void>;
exportKeypair<T extends Ed25519PublicKey | X25519PublicKey>(publicKey: T): Promise<T extends X25519PublicKey ? X25519PublicKey extends T ? import("@dao-xyz/peerbit-crypto").X25519Keypair : Ed25519Keypair : Ed25519Keypair>;
/**
* Dial a peer with an Ed25519 peerId
*/
dial(address: string | Multiaddr | Multiaddr[] | Peerbit): Promise<boolean | undefined>;
stop(): Promise<void>;
onWrite<T>(_program: Program, log: Log<any>, entry: Entry<T>): void;
_maybeOpenStorePromise: Promise<boolean>;
_onMessage(evt: CustomEvent<PubSubData>): Promise<void>;
_onUnsubscription(evt: CustomEvent<UnsubcriptionEvent>): Promise<void>;
_onSubscription(evt: CustomEvent<SubscriptionEvent>): Promise<void>;
private modifySortedSubscriptionCache;
handleSubscriptionChange(fromHash: string, changes: Subscription[], subscribed: boolean): Promise<void>;
/**
* When a peers join the networkk and want to participate the leaders for particular log subgraphs might change, hence some might start replicating, might some stop
* This method will go through my owned entries, and see whether I should share them with a new leader, and/or I should stop care about specific entries
* @param channel
*/
replicationReorganization(changedLogs: Set<string> | string[]): Promise<boolean>;
_onClose(program: Program, log: Log<any>): Promise<void>;
_onProgamClose(program: Program, programCache: LazyLevel): Promise<void>;
addProgram(program: Program): ProgramWithMetadata;
getReplicatorsSorted(log: Log<any>): string[] | undefined;
getObservers(address: Address): string[] | undefined;
isLeader(log: Log<any>, slot: {
toString(): string;
}, numberOfLeaders: number): Promise<boolean>;
findLeaders(log: Log<any>, subject: {
toString(): string;
}, numberOfLeaders: number): Promise<string[]>;
private subscribeToProgram;
private unsubscribeToProgram;
hasSubscribedToTopic(topic: string): boolean;
/**
* Default behaviour of a store is only to accept heads that are forks (new roots) with some probability
* and to replicate heads (and updates) which is requested by another peer
* @param store
* @param options
* @returns
*/
open<S extends Program>(storeOrAddress: /* string | Address | */ S | Address | string, options?: OpenOptions): Promise<S>;
}
export {};