Typescript异步生成器,用于套接字

时间:2017-08-13 03:09:17

标签: node.js sockets typescript asynchronous generator

我正在尝试了解TS异步生成器。

在Node.js中,我打开一个套接字,从中读取所有数据,然后关闭它。

我试图通过数据块将其变成异步生成器。

core_config_data

可以为从套接字读取的数据创建异步生成器吗?

1 个答案:

答案 0 :(得分:1)

有可能,这样的东西应该可以工作,直到Node.js流自己实现异步迭代协议:

import net from "net";

async function* socketIterator(
    host: string, port: number, initialSend?: Buffer | string,
): AsyncIterableIterator<Buffer> {
    let ended: boolean = false;
    let error: Error | undefined;
    let wake: () => void;

    const socket = net.connect(port, host)
        .on("readable", () => { wake(); })
        .on("end", () => { ended = true; wake(); })
        .on("error", (err) => { error = err; wake(); });

    if (initialSend) {
        socket.write(initialSend);
    }

    try {
        for (;;) {
            // wait for next event on socket
            await new Promise<void>((res) => wake = res);
            // yield all data available on socket
            for (let chunk = socket.read(); chunk; chunk = socket.read()) {
                yield chunk;
            }
            if (error) { throw error; }
            if (ended) { break; }
        }
    }
    finally {
        socket.end();
    }
}

async function main(): Promise<void> {
    const iter = socketIterator("httpbin.org", 80, "GET / HTTP/1.0\r\n\r\n");
    for await (const chunk of iter) {
        console.log(chunk.toString());
    }
}

main().catch(console.error);