import { type Error as ConnectionError, type ErrorTypes } from './errors.js'; import type { EventListener, SerializableObject, SocketAdapter, SocketAdapterAkalaEventMap, SocketAdapterEventMap, Subscription } from '@akala/core'; import { SocketProtocolAdapter } from '@akala/core'; export type PayloadDataType = number | SerializableObject | SerializableObject[] | boolean | boolean[] | number[] | string | string[] | null | undefined | void | { event: string; isBuffer: boolean; data: string | SerializedBuffer; } | T; export type SerializedBuffer = { type: 'Buffer'; data: Uint8Array | number[]; }; export type Payload = SerializablePayload | StreamPayload; export declare class JsonRpcSocketAdapter extends SocketProtocolAdapter | Payload[]> implements SocketAdapter> { constructor(socket: SocketAdapter); } interface CommonPayload { jsonrpc?: '2.0'; id?: string | number; method?: string; error?: ConnectionError; } export interface SerializablePayload extends CommonPayload { params?: PayloadDataType; result?: PayloadDataType; stream?: false; } export interface StreamPayload extends CommonPayload { params?: T; result?: PayloadDataType; stream?: true; } export type Handler, TStreamable, ParamType extends PayloadDataType, ParamCallbackType extends PayloadDataType> = (this: TConnection, params: ParamType, reply: ReplyCallback) => void; export type ReplyCallback = (error: ConnectionError, params?: ParamType) => void; export interface Parent> { type: string; getHandler: (method: string) => Handler, PayloadDataType>; disconnected: (connection: TConnection) => void; } /** * json-rpc-ws connection * * @constructor * @param {SocketAdapter} socket - socket adapter for this connection * @param {Object} parent - parent that controls this connection */ export declare abstract class Connection { readonly socket: SocketAdapter>; readonly parent: Parent>; sub: Subscription; /** * */ constructor(socket: SocketAdapter>, parent: Parent>); on(event: K, handler: EventListener>[K]>): Subscription; once(event: K, handler: EventListener>[K]>): Subscription; readonly id: `${string}-${string}-${string}-${string}-${string}`; protected readonly responseHandlers: { [messageId: string]: ReplyCallback; }; /** * Send json payload to the socket connection * * @param {Object} payload - data to be stringified * @private * @todo validate payload * @todo make sure this.connection exists, is connected * @todo if we're not connected look up the response handler from payload.id */ sendRaw(payload: Payload): void; /** * Validate payload as valid jsonrpc 2.0 * http://www.jsonrpc.org/specification * Reply or delegate as needed * * @param {Object} payload - payload coming in to be validated * @returns {void} */ processPayload(payload: Payload): void; protected abstract buildStream(id: string | number, result: PayloadDataType): TStreamable; protected abstract sendStream(id: string | number, result: TStreamable): Promise | void; protected abstract isStream(result: PayloadDataType): result is TStreamable; /** * Send a result message * * @param {String} id - id for the message * @param {Object} error - error for the message * @param {String|Object|Array|Number} result - result for the message * @public * */ sendResult(id: string | number | undefined, error: ConnectionError | undefined, result?: PayloadDataType, isStream?: boolean): void; /** * Send a method message * * @param {String} method - method for the message * @param {Array|Object|null} params - params for the message * @param {function} callback - optional callback for a reply from the message * @public */ sendMethod, TReplyType extends PayloadDataType>(method: string, params?: TParamType, callback?: ReplyCallback): void; /** * Send an error message * * @param {Object} error - json-rpc error object (See Connection.errors) * @param {String|Number|null} id - Optional id for reply * @param {Any} data - Optional value for data portion of reply * @public */ sendError(error: ErrorTypes, id: number | string | undefined, data?: SerializableObject): void; /** * Called when socket gets 'close' event * * @param {ConnectionError} error - optional error object of close wasn't expected * @private */ close(error?: ConnectionError | 1000 | Error | Event): void; /** * Hang up the current socket */ hangup(): Promise; /** * Incoming message handler * * @param {String} data - message from the websocket * @returns {void} * @private */ private message; } export {};