import type { Socket, ServerProxy, StreamTypeBase } from '../server/server.js'; import A from 'aberdeen'; import type { PromiseProxy } from 'aberdeen'; /** Set to 0-3 for increasing verbosity. */ export declare function setLogLevel(level: number): void; /** * Transforms server-side `Socket` arguments to client-side callback functions `(data: T) => void`. * * @typeParam A - The server-side argument type */ type ClientProxyArg = A extends Socket ? (data: U) => void : A; /** * Recursively transforms all server-side function arguments for client-side use. * * @typeParam Args - Tuple of server-side argument types */ type ClientProxyArgs = { [K in keyof Args]: ClientProxyArg; }; /** * Transforms server-side return types for client-side use. * * - Strips `Promise` wrappers * - `ServerProxy>` → `PromiseProxy & {serverProxy: ClientProxyObject}` * - `ServerProxy` → `PromiseProxy & {serverProxy: ClientProxyObject}` * - Other types → `PromiseProxy` * * @typeParam R - The server-side return type */ type ClientProxyReturn = R extends Promise ? ClientProxyReturn : R extends ServerProxy ? RETURN extends StreamTypeBase ? PromiseProxy & { promise: Promise; serverProxy: ClientProxyObject; } : PromiseProxy & { promise: Promise; serverProxy: ClientProxyObject; } : R extends StreamTypeBase ? PromiseProxy & { promise: Promise; } : PromiseProxy & { promise: Promise; }; /** * Transforms server-side function signatures for client-side proxy use. * This type correctly handles function overloads by explicitly matching * up to 8 signatures and creating an intersection of the transformed types. * * @typeParam T - The server-side function type, which may be overloaded. */ type ClientProxyFunction = T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4; (...args: infer A5): infer R5; (...args: infer A6): infer R6; (...args: infer A7): infer R7; (...args: infer A8): infer R8; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4; (...args: infer A5): infer R5; (...args: infer A6): infer R6; (...args: infer A7): infer R7; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4; (...args: infer A5): infer R5; (...args: infer A6): infer R6; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4; (...args: infer A5): infer R5; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; (...args: infer A4): infer R4; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; (...args: infer A3): infer R3; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends { (...args: infer A1): infer R1; (...args: infer A2): infer R2; } ? ((...args: ClientProxyArgs) => ClientProxyReturn) & ((...args: ClientProxyArgs) => ClientProxyReturn) : T extends (...args: infer A) => infer R ? (...args: ClientProxyArgs) => ClientProxyReturn : never; /** * Transforms server-side API objects to client-side proxy objects with type-safe RPC methods. * * @typeParam T - The server-side API object type */ export type ClientProxyObject = { [K in keyof T]: ClientProxyFunction; }; /** * WebSocket connection to a Lowlander server with type-safe RPC, automatic reconnection, * and reactive updates. * * @typeParam T - The server-side API type (import from your server API file) * * @example * ```ts * import type * as API from './server/api.js'; * const conn = new Connection('ws://localhost:8080/'); * * // Simple RPC - returns PromiseProxy * const sum = conn.api.add(1, 2); * * // Server proxy for stateful APIs * const auth = conn.api.authenticate('token'); * const secret = auth.serverProxy.getSecret(); * * // Streaming with callbacks * conn.api.streamData(data => console.log(data)); * * // Use within Aberdeen reactive scopes * $(() => { * dump(conn.isOnline()); * dump(sum); * }); * ``` */ export declare class Connection { [A.OPAQUE]: true; url: string | (() => WebSocket); private ws?; private activeRequests; private requestCounter; private reconnectAttempts; /** @internal */ _proxyCounter: number; private $state; private streamCache; /** * Type-safe proxy to the server-side API. Methods return `PromiseProxy` objects * that work reactively in Aberdeen scopes. `ServerProxy` returns include a * `.serverProxy` property for accessing stateful server APIs. */ api: ClientProxyObject; /** * @param url - WebSocket URL (e.g., 'ws://localhost:8080/'), or a fake WebSocket object for testing */ constructor(url: string | (() => WebSocket)); /** * Returns the current connection status. Reactive in Aberdeen scopes. */ isOnline(): boolean; /** * Returns the last WebSocket error message, or `undefined` if there is none. * Clears automatically when the connection comes online. Reactive in Aberdeen scopes. */ getError(): string | undefined; private connect; private reconnect; private pruneCommitIds; /** @internal */ _createMethodStub(methodName: string, proxyId?: number): (...params: any[]) => PromiseProxy; private cancelRequest; private startLinger; } export {};