mock-service-plugin
Version:
Simulated backend interface service
111 lines (107 loc) • 2.93 kB
JavaScript
import Mock from 'mockjs';
import fs from 'fs';
// src/response/sse-handler.ts
var BaseResponseHandler = class {
constructor(options = {}) {
this.options = options;
}
/**
* 设置响应头
* @param {Response} res - 响应对象
* @param {string} contentType - 内容类型
*/
setHeaders(res, contentType) {
res.set("Content-Type", contentType);
res.set("Access-Control-Allow-Origin", "*");
res.set("Access-Control-Allow-Methods", "GET,HEAD,PUT,POST,DELETE,PATCH");
}
/**
* 处理文件响应
* @param {string} filePath - 文件路径
* @returns {Promise<Buffer>}
*/
async readFile(filePath) {
return new Promise((resolve, reject) => {
fs.readFile(filePath, (err, data) => {
if (err) reject(err);
else resolve(data);
});
});
}
/**
* 处理错误
* @param {Response} res - 响应对象
* @param {Error} error - 错误对象
*/
handleError(res, error) {
console.error(`[Response Error] ${error.message}`);
res.status(500).json({
error: "Internal Server Error",
message: error.message
});
}
};
// src/response/sse-handler.ts
var SseResponseHandler = class extends BaseResponseHandler {
async handle(req, res, route) {
res.writeHead(200, {
"Content-Type": "text/event-stream",
"Cache-Control": "no-cache",
Connection: "keep-alive"
});
const sendEvent = (item) => {
let message = "";
if (item.id) message += `id: ${item.id}
`;
if (item.event) message += `event: ${item.event}
`;
if (item.data) {
const dataStr = typeof item.data === "string" ? item.data : JSON.stringify(item.data);
message += `data: ${dataStr}
`;
}
if (item.retry) message += `retry: ${item.retry}
`;
res.write(message + "\n");
};
try {
const mockData = new Function(
"return (" + route.responseTemplate + ")"
)();
if (mockData) {
const data = Mock.mock(mockData);
const interval = data.interval || 1e3;
if (Array.isArray(data.items)) {
let index = 0;
const sendNext = () => {
if (index < data.items.length) {
sendEvent(data.items[index]);
index++;
setTimeout(sendNext, interval);
} else {
res.end();
}
};
sendNext();
} else {
sendEvent({ data });
res.end();
}
} else {
sendEvent({ data: Mock.mock(mockData) });
res.end();
}
} catch (e) {
console.error("[SSE Error]:", e);
res.write(`data: ${JSON.stringify({ error: "Mock data error" })}
`);
res.end();
}
req.on("close", () => {
console.log("Client closed SSE connection");
});
}
};
export { SseResponseHandler };
//# sourceMappingURL=sse-handler.js.map
//# sourceMappingURL=sse-handler.js.map