56 lines
1.3 KiB
TypeScript
56 lines
1.3 KiB
TypeScript
import { HttpResponse, http, passthrough } from 'msw';
|
|
import { setupServer } from 'msw/node';
|
|
|
|
export const DEFAULT_TEST_URL = 'http://localhost:3030/';
|
|
|
|
export function createMockServer(
|
|
testConfigs: Array<{
|
|
url: string;
|
|
chunks: any[];
|
|
formatChunk: (chunk: any) => string;
|
|
suffix?: string;
|
|
}>,
|
|
passthroughUrls?: string[],
|
|
) {
|
|
return setupServer(
|
|
...testConfigs.map(({ url, chunks, formatChunk, suffix }) =>
|
|
http.all(url, createHandler(chunks, formatChunk, suffix)),
|
|
),
|
|
...(passthroughUrls ?? []).map(url => http.all(url, () => passthrough())),
|
|
);
|
|
}
|
|
|
|
function createHandler(
|
|
chunks: any[],
|
|
formatChunk: (chunk: any) => string,
|
|
suffix?: string,
|
|
) {
|
|
return () => {
|
|
const encoder = new TextEncoder();
|
|
const stream = new ReadableStream({
|
|
async start(controller) {
|
|
try {
|
|
for (const chunk of chunks) {
|
|
controller.enqueue(encoder.encode(formatChunk(chunk)));
|
|
}
|
|
|
|
if (suffix != null) {
|
|
controller.enqueue(encoder.encode(suffix));
|
|
}
|
|
} finally {
|
|
controller.close();
|
|
}
|
|
},
|
|
});
|
|
|
|
return new HttpResponse(stream, {
|
|
status: 200,
|
|
headers: {
|
|
'Content-Type': 'text/event-stream',
|
|
'Cache-Control': 'no-cache',
|
|
Connection: 'keep-alive',
|
|
},
|
|
});
|
|
};
|
|
}
|