Make short TRACE captures independently explain OneBot action and event lifecycles from complete input through a truthful terminal conclusion. Preserve request correlation across asynchronous work while keeping disabled TRACE paths allocation-free and lazy. Cover shutdown rejection, stream cancellation, event conversion and suppression, reporter invocation settlement, and HTTP delivery outcomes without changing established transport or observer behavior. Add focused regression coverage for lifecycle uniqueness, context reuse, disconnect handling, and quiesce ingress boundaries.
52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
import { describe, expect, it, vi } from 'vitest';
|
|
import type { WebSocket } from '@snowluma/websocket';
|
|
import { StreamTransportClosedError } from '../src/streaming';
|
|
import { safeSendAsync } from '../src/network/utils';
|
|
|
|
describe('safeSendAsync', () => {
|
|
it('resolves after a successful WebSocket write callback', async () => {
|
|
const socket = {
|
|
readyState: 1,
|
|
send: vi.fn((_payload: string, callback: (error?: Error | null) => void) => {
|
|
callback(null);
|
|
}),
|
|
} as unknown as WebSocket;
|
|
|
|
await expect(safeSendAsync(socket, 'frame')).resolves.toBeUndefined();
|
|
expect(socket.send).toHaveBeenCalledWith('frame', expect.any(Function));
|
|
});
|
|
|
|
it('rejects when the socket is not open', async () => {
|
|
const socket = {
|
|
readyState: 3,
|
|
send: vi.fn(),
|
|
} as unknown as WebSocket;
|
|
|
|
await expect(safeSendAsync(socket, 'frame'))
|
|
.rejects.toBeInstanceOf(StreamTransportClosedError);
|
|
expect(socket.send).not.toHaveBeenCalled();
|
|
});
|
|
|
|
it('rejects a synchronous WebSocket send failure', async () => {
|
|
const socket = {
|
|
readyState: 1,
|
|
send: vi.fn(() => { throw new Error('socket gone'); }),
|
|
} as unknown as WebSocket;
|
|
|
|
await expect(safeSendAsync(socket, 'frame'))
|
|
.rejects.toBeInstanceOf(StreamTransportClosedError);
|
|
});
|
|
|
|
it('rejects an asynchronous WebSocket write failure', async () => {
|
|
const socket = {
|
|
readyState: 1,
|
|
send: vi.fn((_payload: string, callback: (error?: Error | null) => void) => {
|
|
callback(new Error('write failed'));
|
|
}),
|
|
} as unknown as WebSocket;
|
|
|
|
await expect(safeSendAsync(socket, 'frame'))
|
|
.rejects.toBeInstanceOf(StreamTransportClosedError);
|
|
});
|
|
});
|