import { type Libp2p, type Libp2pOptions } from 'libp2p'; import { Signer } from 'ethers'; import { StorageObject, FileInfo, ComputeJob, ComputeOutput, ComputeAlgorithm, ComputeAsset, ComputeEnvironment, ProviderInitialize, ProviderComputeInitializeResults, UserCustomParameters, ComputeResourceRequest, ComputeJobMetadata, PolicyServerInitializeCommand, PolicyServerPassthroughCommand, dockerRegistryAuth, DownloadResponse, ComputeResultStream, NodeStatus, NodeComputeJob, PersistentStorageAccessList, PersistentStorageBucket, PersistentStorageCreateBucketRequest, PersistentStorageDeleteFileResponse, PersistentStorageFileEntry, PersistentStorageObject, PersistentStorageUpdateBucketResponse, OceanNode, SignerOrAuthTokenOrSignature } from '../../@types/index.js'; import { NodeLogEntry } from '../../@types/Provider.js'; import { type DDO, type ValidateMetadata } from '@oceanprotocol/ddo-js'; import { CID } from 'multiformats/cid'; export declare const OCEAN_P2P_PROTOCOL = "/ocean/nodes/1.0.0"; /** * Optional request payload sent as LP frames after the command JSON; ends with an empty LP frame. * This mirrors ocean-node's `p2pStreamBody` mechanism introduced for true streaming uploads. */ export type P2PRequestBodyStream = AsyncIterable; export interface P2PConfig { /** * Bootstrap peer multiaddrs for DHT peer discovery. * Required when dialing bare peer IDs; defaults to Ocean Protocol's * public bootstrap nodes. Ignored if `libp2p.peerDiscovery` is set. */ bootstrapPeers?: string[]; /** Timeout per dial + stream operation in ms. Default: 10000 */ dialTimeout?: number; /** Max retry attempts on connection errors. Default: 5 */ maxRetries?: number; /** Base delay between retries in ms. Default: 1000 */ retryDelay?: number; /** * Timeout for DHT peer lookup when dialing a bare peer ID, in ms. Default: 60000. * Intentionally separate from dialTimeout — DHT resolution needs more time than * a direct dial. Once a peer is found and connected, subsequent calls skip this. */ dhtLookupTimeout?: number; /** * Enable TCP transport in addition to WebSockets. Default: false. * Required in Node.js/Electron environments to reach nodes over plain TCP. * Do NOT enable in browser builds — TCP is not available in browsers. */ enableTcp?: boolean; /** * Full libp2p node configuration. Fields provided here override ocean.js * defaults (transports, encrypters, services, connectionManager, etc.). * Unset fields keep ocean.js defaults. */ libp2p?: Partial; /** Additional roles to be marked. Will be used in the future */ additionalRoles?: string[]; } export declare class P2pProvider { private p2pConfig; private libp2pNode; /** * Configure the internal libp2p node used for P2P transport. * Call this once before making P2P requests, e.g.: * ProviderInstance.setupP2P({ bootstrapPeers: ['/ip4/1.2.3.4/tcp/9000/ws/p2p/16Uiu2...'] }) * * Required when using bare peer IDs as nodeUri — the bootstrap peers * provide DHT entry points so the peer can be located. */ setupP2P(config: P2PConfig): Promise; getMultiaddrFromPeerId(peerId: string): Promise; /** Returns the underlying libp2p node instance, or null if P2P is not initialized. */ getLibp2pNode(): Libp2p | null; /** Returns all peers known to the peerStore (discovered via bootstrap, DHT, or connections). */ getDiscoveredNodes(): Promise>; private bufToHex; private handleProtocolCommands; private getOrCreateLibp2pNode; private toUint8Array; cidFromRawString(data: string): Promise>; getProvidersForString(input: string, signal?: AbortSignal): Promise>; private isDialable; /** * True when the multiaddr does not include the relay `p2p-circuit` protocol segment. * (Direct / transport paths omit it; relay paths contain `/p2p-circuit/...`.) */ private isNotP2PCircuit; private peerIdFromMultiaddr; private getConnection; private getNodePublicKey; protected getAuthorization(s: SignerOrAuthTokenOrSignature): string; private getSignedCommandParams; private dialAndStream; private sendP2pCommand; /** * Returns node status via P2P STATUS command. * @param {string} nodeUri - multiaddr of the node */ getEndpoints(nodeUri: OceanNode): Promise; getNodeStatus(nodeUri: OceanNode, signal?: AbortSignal): Promise; getNodeJobs(nodeUri: OceanNode, fromTimestamp?: number, signal?: AbortSignal): Promise; /** * Get current nonce from the node via P2P. */ getNonce(nodeUri: OceanNode, consumerAddress: string, signal?: AbortSignal): Promise; /** * Encrypt data via P2P ENCRYPT command. */ encrypt(data: any, chainId: number, nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, _policyServer?: any, signal?: AbortSignal): Promise; /** * Get file details for a given DID and service ID via P2P. */ checkDidFiles(did: string, serviceId: string, nodeUri: OceanNode, withChecksum?: boolean, signal?: AbortSignal): Promise; /** * Get File details via P2P. */ getFileInfo(file: StorageObject, nodeUri: OceanNode, withChecksum?: boolean, signal?: AbortSignal): Promise; /** * Returns compute environments via P2P. */ getComputeEnvironments(nodeUri: OceanNode, signal?: AbortSignal): Promise; /** * Initializes the provider for a service (download) request via P2P. */ initialize(did: string, serviceId: string, fileIndex: number, consumerAddress: string, nodeUri: OceanNode, signal?: AbortSignal, userCustomParameters?: UserCustomParameters, computeEnv?: string, validUntil?: number): Promise; /** * Initializes compute request via P2P. No auth required -- the node only * validates parameters and applies rate limits. */ initializeCompute(assets: ComputeAsset[], algorithm: ComputeAlgorithm, computeEnv: string, token: string, validUntil: number, nodeUri: OceanNode, consumerAddress: string, resources: ComputeResourceRequest[], chainId: number, policyServer?: any, signal?: AbortSignal, queueMaxWaitTime?: number, dockerRegistryAuthData?: dockerRegistryAuth, output?: ComputeOutput): Promise; /** * Sends a DOWNLOAD command to the peer via P2P, reads the binary stream * directly from the lpStream, and returns a DownloadResponse. * The node decrypts the service file and streams raw file data back. */ getDownloadUrl(did: string, serviceId: string, fileIndex: number, transferTxId: string, nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, policyServer?: any, userCustomParameters?: UserCustomParameters): Promise; /** * Start a paid compute job via P2P. */ computeStart(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, computeEnv: string, datasets: ComputeAsset[], algorithm: ComputeAlgorithm, maxJobDuration: number, token: string, resources: ComputeResourceRequest[], chainId: number, metadata?: ComputeJobMetadata, additionalViewers?: string[], output?: ComputeOutput, policyServer?: any, signal?: AbortSignal, queueMaxWaitTime?: number, dockerRegistryAuth?: dockerRegistryAuth, outputBucketId?: string): Promise; /** * Start a free compute job via P2P. */ freeComputeStart(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, computeEnv: string, datasets: ComputeAsset[], algorithm: ComputeAlgorithm, resources?: ComputeResourceRequest[], metadata?: ComputeJobMetadata, additionalViewers?: string[], output?: ComputeOutput, policyServer?: any, signal?: AbortSignal, queueMaxWaitTime?: number, dockerRegistryAuth?: dockerRegistryAuth, outputBucketId?: string): Promise; /** * Get streamable compute logs via P2P. Returns an async generator of Uint8Array chunks. */ computeStreamableLogs(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, jobId: string, signal?: AbortSignal): Promise; /** * Stop a compute job via P2P. */ computeStop(jobId: string, nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, agreementId?: string, signal?: AbortSignal): Promise; /** * Get compute status via P2P. */ computeStatus(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, jobId?: string, agreementId?: string, signal?: AbortSignal): Promise; /** * Get compute result as an async generator of Uint8Array chunks via P2P. * Supports resumable downloads via `offset` (byte position to resume from). */ getComputeResult(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, jobId: string, index: number, offset?: number): Promise; getComputeResultUrl(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, jobId: string, index: number): Promise; /** * Generate an auth token via P2P (auto-signs with Signer). */ generateAuthToken(consumer: Signer, nodeUri: OceanNode, signal?: AbortSignal): Promise; /** * Generate an auth token from a pre-signed request (no Signer needed). */ generateSignedAuthToken(address: string, signature: string, nonce: string, nodeUri: OceanNode, validUntil?: number, signal?: AbortSignal): Promise; /** * Resolve a DDO by DID via P2P GET_DDO command. */ resolveDdo(nodeUri: OceanNode, did: string, signal?: AbortSignal): Promise; /** * Validate a DDO via P2P VALIDATE_DDO command. */ validateDdo(nodeUri: OceanNode, ddo: DDO, signerOrAuthToken: SignerOrAuthTokenOrSignature, signal?: AbortSignal): Promise; /** * Invalidate an auth token via P2P. */ invalidateAuthToken(consumer: Signer, token: string, nodeUri: OceanNode, signal?: AbortSignal): Promise<{ success: boolean; }>; /** * Check if a P2P node is reachable by calling STATUS. */ isValidProvider(nodeUri: OceanNode, signal?: AbortSignal): Promise; /** * PolicyServer passthrough via P2P. */ PolicyServerPassthrough(nodeUri: OceanNode, request: PolicyServerPassthroughCommand, signal?: AbortSignal): Promise; /** * Initialize Policy Server verification via P2P. */ initializePSVerification(nodeUri: OceanNode, request: PolicyServerInitializeCommand, signal?: AbortSignal): Promise; /** * Download node logs via P2P. */ downloadNodeLogs(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, startTime: string, endTime: string, maxLogs?: number, moduleName?: string, level?: string, page?: number, signal?: AbortSignal): Promise; /** * Fetch node configuration via P2P. Accepts a pre-signed payload — * the caller is responsible for nonce retrieval and signing. */ fetchConfig(nodeUri: OceanNode, payload: Record): Promise; /** * Push node configuration via P2P. Accepts a pre-signed payload — * the caller is responsible for nonce retrieval and signing. */ pushConfig(nodeUri: OceanNode, payload: Record): Promise; createPersistentStorageBucket(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, payload: PersistentStorageCreateBucketRequest, signal?: AbortSignal): Promise<{ bucketId: string; owner: string; accessList: PersistentStorageAccessList[]; label?: string | null; }>; updatePersistentStorageBucket(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, bucketId: string, label: string | null, signal?: AbortSignal): Promise; getPersistentStorageBuckets(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, owner: string, signal?: AbortSignal): Promise; listPersistentStorageFiles(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, bucketId: string, signal?: AbortSignal): Promise; getPersistentStorageFileObject(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, bucketId: string, fileName: string, signal?: AbortSignal): Promise; uploadPersistentStorageFile(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, bucketId: string, fileName: string, content: P2PRequestBodyStream, signal?: AbortSignal): Promise; deletePersistentStorageFile(nodeUri: OceanNode, signerOrAuthToken: SignerOrAuthTokenOrSignature, bucketId: string, fileName: string, signal?: AbortSignal): Promise; }