用灵犀做个web服务,代替ntfy
wils
Lv.4 核心创作者
之前两个帖子,分享了利用ntfy发消息,以及txikijs这个只有5M的js引擎
今天正好试试这个js环境,能否做个web服务,初步代替ntfy的sub/pub作用
直接问灵犀:
学习这个文档:https://txikijs.org/docs/guides/serve,写个web服务,收到get请求阻塞,直到收到post请求,返回所有get,环境里没有事件发射器
一次得到结果,阻塞和返回都没问题,但没有传递消息,需要稍加修改
post请求本身只返回204,每个get请求返回post请求的body
// GET 请求阻塞,直到收到 POST 请求;POST 返回 204,每个被阻塞的 GET 返回 POST 的 body
// 运行: tjs serve serve.js
// 挂起的 GET 请求队列,每项为 { resolve }
let pendingGets = [];
export default {
async fetch(request, context) {
const method = request.method.toUpperCase();
if (method === 'GET') {
// 收到 GET:挂起并阻塞,直到 POST 唤醒
return new Promise((resolve) => {
pendingGets.push({ resolve });
});
}
if (method === 'POST') {
// 收到 POST:读取 body,唤醒所有挂起的 GET,让它们各自返回该 body
const body = await request.text();
const waiting = pendingGets;
pendingGets = [];
for (const { resolve } of waiting) {
resolve(new Response(body));
}
return new Response(null, { status: 204 });
}
return new Response('Method Not Allowed\n', { status: 405 });
}
};真心写的漂亮:
收到get后返回个最终返回Response的Promise,并将resolve放入数组
收到post后遍历数组,真正返回Response
图中启动服务
图中先发get阻塞,后发post,相当于订阅/发布模型,也就是用长轮询初步替代了ntfy的sse
过去如果让我自己写,不知要薅掉多少头发
现在有了灵犀,做这些尝试,我只需要围观叫好就行,哈哈🤣