如何将消息从用 Node.js 编写的本机应用程序发送到 Chrome 扩展程序?

How to send message from native app written in Node.js to Chrome extension?

这个问题是 that one 的延续,因为那个问题已经 6 年没有用 Nodejs 代码回答了。

我在 windows 10 中使用 Chrome 79 和 Nodejs 13。

我有一个 Nodejs 脚本(见下文)充当本机消息传递主机,还有一个 Chrome 扩展。
我想从 Nodejs 脚本向我的分机发送消息。

我知道如何在我的 Chrome 分机中接收消息 - 这是它的 background.js:

var port = chrome.runtime.connectNative('my_messaging_host');

port.onMessage.addListener((message) => {
  console.log("Received: " + message);
});

我拥有的 Nodejs 脚本(见下文)是本机消息传递主机。我将我能找到的唯一 Nodejs 消息传递主机代码示例用作参考,from MDN.
我注意到这个 Nodejs 代码示例是在 10 天前最近添加到 MDN wiki 页面中的,它 有 issues/needs 改进.

无论如何,我已经按如下方式对其进行了修改,但是在发送消息时我的扩展程序出现了以下错误:Failed to connect: Error when communicating with the native messaging host,根据文档 表示不正确在本机消息传递主机中实现通信协议。

那么,为什么我的 Nodejs 脚本不能正常工作?
你能给我一个有效的 Nodejs 主机代码示例吗?

function sendMessage(msg) {
    var buffer = Buffer.from(JSON.stringify(msg));

    var header = Buffer.alloc(4);
    header.writeUInt32LE(buffer.length, 0);

    var data = Buffer.concat([header, buffer]);
    process.stdout.write(data);
}

供参考,各种本机消息传递主机示例:

我已经修复了 MDN wiki 页面中的 sendMessage 函数,如下所示,即:

  • 无需通过将 string/wrongly 字符串化为 JSON、msg
  • 来分配新的 Buffer
  • header 的 4 个字节中的第一个字节(在 little-endian 中转换)应该采用给定 msg 的长度作为 string
  • msg 应该按原样使用 stout 发送,即 string
function sendMessage(msg) {

    var header = Buffer.alloc(4);
    header.writeUInt32LE(msg.length, 0);

    process.stdout.write(header);
    process.stdout.write(msg);

}

此外,这里是要发送的示例消息:

sendMessage('{"test": "content"}');

PS:我还用它更新了那个 MDN wiki 页面。