58 lines
2.2 KiB
TypeScript
58 lines
2.2 KiB
TypeScript
import { describe, test } from 'node:test';
|
|
import assert from 'node:assert/strict';
|
|
|
|
describe('VS Code webview bridge requests', () => {
|
|
test('rejects immediately when signal is already aborted', async () => {
|
|
const originalWindow = globalThis.window;
|
|
const originalAcquire = (globalThis as typeof globalThis & { acquireVsCodeApi?: unknown }).acquireVsCodeApi;
|
|
const messages: unknown[] = [];
|
|
|
|
try {
|
|
Object.defineProperty(globalThis, 'window', {
|
|
configurable: true,
|
|
value: new EventTarget(),
|
|
});
|
|
Object.defineProperty(globalThis, 'acquireVsCodeApi', {
|
|
configurable: true,
|
|
value: () => ({
|
|
postMessage: (message: unknown) => messages.push(message),
|
|
getState: () => undefined,
|
|
setState: () => undefined,
|
|
}),
|
|
});
|
|
|
|
const { sendBridgeMessageWithOptions, startSseProxy } = await import('./bridge');
|
|
const controller = new AbortController();
|
|
controller.abort();
|
|
|
|
const result = await Promise.race([
|
|
sendBridgeMessageWithOptions('api:proxy', undefined, { signal: controller.signal }).then(
|
|
() => 'resolved',
|
|
(error: unknown) => error,
|
|
),
|
|
new Promise((resolve) => setTimeout(() => resolve('timeout'), 20)),
|
|
]);
|
|
|
|
assert.ok(result instanceof DOMException);
|
|
assert.equal(result.name, 'AbortError');
|
|
assert.equal(messages.length, 0);
|
|
|
|
const startPromise = startSseProxy({ path: '/global/event', streamId: 'sse_webview_1_1' });
|
|
const request = messages[0] as { id: string; payload?: { streamId?: string } };
|
|
assert.equal(request.payload?.streamId, 'sse_webview_1_1');
|
|
globalThis.window.dispatchEvent(new MessageEvent('message', {
|
|
data: {
|
|
id: request.id,
|
|
type: 'api:sse:start',
|
|
success: true,
|
|
data: { status: 200, headers: {}, streamId: 'sse_webview_1_1' },
|
|
},
|
|
}));
|
|
assert.equal((await startPromise).streamId, 'sse_webview_1_1');
|
|
} finally {
|
|
Object.defineProperty(globalThis, 'window', { configurable: true, value: originalWindow });
|
|
Object.defineProperty(globalThis, 'acquireVsCodeApi', { configurable: true, value: originalAcquire });
|
|
}
|
|
});
|
|
});
|