Asynchronous nativemessaging应用程序和webextension之间的异步双向消息传递?

Asynchronous nativemessaging应用程序和webextension之间的异步双向消息传递?,asynchronous,firefox-addon-webextensions,bidirectional,chrome-native-messaging,Asynchronous,Firefox Addon Webextensions,Bidirectional,Chrome Native Messaging,似乎的协议要求本机应用程序通过阻塞先读后写循环与扩展进行通信 首先,这是正确的吗? 如果是这样,那就很难在双方之间建立双向异步通信 在我开始做一些愚蠢而复杂的事情来解决这个限制之前,是否有一些简单的API来实现本地应用程序的双向异步消息传递? 我想支持的事情: 基于连接的Nativemessaging(即:长时间运行) 具有异步响应的来自任意一端的请求 来自任意一端但没有响应的通知 我实现这一目标的第一个“愚蠢而复杂”的想法是: 使用Nativemessaging启动本机应用程序并管理其生

似乎的协议要求本机应用程序通过阻塞先读后写循环与扩展进行通信

首先,这是正确的吗?

如果是这样,那就很难在双方之间建立双向异步通信

在我开始做一些愚蠢而复杂的事情来解决这个限制之前,是否有一些简单的API来实现本地应用程序的双向异步消息传递?


我想支持的事情:

  • 基于连接的Nativemessaging(即:长时间运行)
  • 具有异步响应的来自任意一端的请求
  • 来自任意一端但没有响应的通知
我实现这一目标的第一个“愚蠢而复杂”的想法是:

  • 使用Nativemessaging启动本机应用程序并管理其生命周期
  • 启动时,让本机应用程序启动并使用WebSocket URI响应第一个请求,Webextension将从中使用该URI

  • 是的,您可以对本机应用程序使用基于连接的双向异步通信

    上的MDN文档页的“”部分对此进行了说明

    创建/返回支持异步通信的。从WebExtension端,然后使用
    port.postMessage()
    发送消息,并监听是否使用
    port.onMessage
    ,该消息“包含使用WebExtension API构建的扩展的所有事件所共有的
    addListener()
    RemovelListener()
    函数。”


    您似乎只读过有关“”的内容。该方法提供只发送一条消息,然后接收一条消息的功能。这就是它的目的,大致相当于

    有点晚了,但是对于我正在开发的扩展,我能够修改您引用的示例,以消除stdin读取中的阻塞(到目前为止,我可以说stdout写入似乎是非阻塞的,但我认为如果这是错误的,同样的想法也可以应用于它们)


    我在Windows上工作,所以其他很多建议使用该模块的帖子对我来说都不起作用。在发现这一点之前,我已经在我的项目中设置了要使用的线程,因此,对的回答指示我建议使用该方法来处理这些情况(据我所知,这会从主事件循环中创建一个单独的线程,而不是它被阻塞)。使用该方法包装从示例中读取的stdin.buffer,为我消除了阻塞。

    我在别处多次阅读了整篇文章和许多支持文章。webextension端的postMessage/onMessage似乎可以支持双向异步通信,但应用端文档似乎表明情况并非如此。正如我在问题中所说的,文档似乎暗示了一个应用程序端阻塞读写循环,它阻止了双向异步消息传递。我还检查了我在别处找到的一大堆实现,它们都有相同的结构。你明白我所说的这种构造的含义吗?如果文档仅仅缺少支持双向异步消息传递的应用程序端构造示例,如果给出了允许它的协议/API的详细信息,我很乐意自己编写一个。@David SkyMesh它通过读取标准输入和写入标准输出与本机应用程序进行通信,这是大多数操作系统/语言下的正常I/O方法,而这些操作系统/语言本身并不阻塞。我不知道你对什么有意见。如果它们被阻塞,那么这是操作系统/语言约束,或者是您访问它们的方式。这个例子是一个简单的Python脚本,它确实以您描述的方式实现了它,但这只是因为它是一个简单的例子。
    ,它本身并不阻塞,这取决于协议。您是否了解/访问任何协议文档,以确定浏览器端的API实现中不存在此限制?很明显,API端只允许一次同时连接到它启动的每个本机应用程序进程……要使双向异步消息在这些条件下工作(webextension端没有低效的轮询),webextension端的API需要使用某种select()/epoll()/etc循环。它是(在Firefox上)还是真的期望得到这个简单示例所暗示的消息模式?