用灵犀做个web服务,代替ntfy

wils
wils Lv.4 核心创作者

Lv.4 核心创作者

之前两个帖子,分享了利用ntfy发消息,以及txikijs这个只有5M的js引擎

今天正好试试这个js环境,能否做个web服务,初步代替ntfy的sub/pub作用

直接问灵犀:

一次得到结果,阻塞和返回都没问题,但没有传递消息,需要稍加修改

  • 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


过去如果让我自己写,不知要薅掉多少头发

现在有了灵犀,做这些尝试,我只需要围观叫好就行,哈哈🤣

海南省
浏览 54
收藏
3
分享
3 +1
+1
全部评论