/** * Test harness exports: createTestRouter, wrapTestRouter, FakeClock, and types. * Usage: import { test } from "@ws-kit/core" or import * from "@ws-kit/core/testing" * * ## Basic Usage * * ```ts * import { test } from "@ws-kit/core"; * import { createRouter } from "@ws-kit/zod"; * * const tr = test.createTestRouter({ create: () => createRouter() }); * const conn = await tr.connect(); * conn.send("PING", { text: "hello" }); * await tr.flush(); * expect(conn.outgoing()).toContainEqual({ type: "PONG", ... }); * expect(tr.capture.errors()).toHaveLength(0); * ``` * * ## Observing Events with `router.observe()` * * The router provides a public observation API for tests and monitoring plugins * to tap into lifecycle events without accessing internals. * * ```ts * const router = createRouter(); * * // Register observer for publish, error, and connection events * const off = router.observe({ * onPublish: (record) => { * console.log(`Published to ${record.topic}`); * }, * onError: (err, meta) => { * console.error(`Error on ${meta?.type}:`, err.message); * }, * onConnectionOpen: (clientId, data) => { * console.log(`Client connected: ${clientId}`); * }, * onConnectionClose: (clientId, meta) => { * console.log(`Client disconnected: ${clientId}`); * }, * }); * * // Later, unsubscribe * off(); * ``` * * ## Key Semantics * * - **Synchronous dispatch**: Callbacks fire in registration order during event * - **Error isolation**: If an observer throws, the error is logged and other observers still run * - **Re-entrancy safe**: Observers can add/remove other observers without breaking dispatch (snapshot-based) * - **No payload redaction**: Publish records include full payload (don't expose sensitive data in observers) * - **Partial observers**: Only define callbacks for events you care about * * ## Use Cases * * - **Testing**: Capture publishes/errors for assertions (automatically done by test harness) * - **Monitoring**: Log/collect metrics on publishes, errors, and connection churn * - **Debugging**: Trace message flow without modifying handler code * - **Integration**: Plugin into router from monitoring/telemetry libraries */ export { createTestRouter, wrapTestRouter } from "./test-harness.js"; export type { CreateTestRouterOptions } from "./test-harness.js"; export { FakeClock, SystemClock } from "./fake-clock.js"; export type { Clock } from "./fake-clock.js"; export { mockPlugin } from "./plugin.js"; export type { ConnectionInfo, OutgoingFrame, PublishRecord, TestCapture, TestConnection, TestRouter, } from "./types.js"; export { act } from "./act.js"; export { createDescriptor, createRpcDescriptor } from "./test-schemas.js"; export { InMemoryPlatformAdapter } from "./test-adapter.js"; export { TestWebSocket, type ConnectionState } from "./test-websocket.js"; import * as fakeClock from "./fake-clock.js"; import * as pluginModule from "./plugin.js"; import * as testHarness from "./test-harness.js"; export declare const testing: { createTestRouter: typeof testHarness.createTestRouter; wrapTestRouter: typeof testHarness.wrapTestRouter; FakeClock: typeof fakeClock.FakeClock; SystemClock: typeof fakeClock.SystemClock; act: { emit(conn: import("./types.js").TestConnection, schema: import("../index.js").MessageDescriptor, payload?: unknown, meta?: Record): void; call(conn: import("./types.js").TestConnection, schema: import("../index.js").MessageDescriptor & { response?: import("../index.js").MessageDescriptor; }, payload?: unknown, meta?: Record): { progress: AsyncIterable; result: Promise; }; }; mockPlugin: typeof pluginModule.mockPlugin; }; export declare const test: { createTestRouter: typeof testHarness.createTestRouter; wrapTestRouter: typeof testHarness.wrapTestRouter; FakeClock: typeof fakeClock.FakeClock; SystemClock: typeof fakeClock.SystemClock; act: { emit(conn: import("./types.js").TestConnection, schema: import("../index.js").MessageDescriptor, payload?: unknown, meta?: Record): void; call(conn: import("./types.js").TestConnection, schema: import("../index.js").MessageDescriptor & { response?: import("../index.js").MessageDescriptor; }, payload?: unknown, meta?: Record): { progress: AsyncIterable; result: Promise; }; }; mockPlugin: typeof pluginModule.mockPlugin; }; //# sourceMappingURL=index.d.ts.map