59 lines
1.7 KiB
JavaScript
59 lines
1.7 KiB
JavaScript
import http from 'http';
|
|
import logger from '#root/utils/logger.js';
|
|
|
|
export default class CreateWebhookServer {
|
|
constructor() {
|
|
this.http = null;
|
|
this.handlers = [];
|
|
}
|
|
|
|
startListen(port) {
|
|
this.http = http
|
|
.createServer((request, response) => {
|
|
const { url, method } = request;
|
|
logger(`监听到请求:${url}, 方法: ${method}`);
|
|
if (method.toLowerCase() !== 'post') return;
|
|
let body = '';
|
|
request
|
|
.on('error', (err) => {
|
|
console.error(err);
|
|
})
|
|
.on('data', (chunk) => {
|
|
body += chunk;
|
|
})
|
|
.on('end', () => {
|
|
try {
|
|
const jsonData = JSON.parse(body);
|
|
Promise.all(
|
|
this.handlers.map((val) =>
|
|
jsonData.event === val.event
|
|
? val.handler(jsonData)
|
|
: Promise.resolve(),
|
|
),
|
|
)
|
|
.then(() => {
|
|
response.writeHead(200, { 'Content-Type': 'text/plain' });
|
|
response.write('Hello World');
|
|
response.end();
|
|
})
|
|
.catch((e) => {
|
|
response.writeHead(405, { 'Content-Type': 'text/plain' });
|
|
response.write(e);
|
|
response.end();
|
|
});
|
|
} catch (e) {
|
|
response.writeHead(405, { 'Content-Type': 'text/plain' });
|
|
response.write(e);
|
|
response.end();
|
|
}
|
|
});
|
|
})
|
|
.listen(port || 8080);
|
|
}
|
|
|
|
registerHandler(handlers) {
|
|
logger(`${handlers.map((item) => item.event).join('、')}函数已引入`);
|
|
this.handlers.push(...handlers);
|
|
}
|
|
}
|