nativemessaging app和webextension之间的异步双向消息传递?

时间:2017-10-25 09:54:18

标签: asynchronous firefox-webextensions bidirectional chrome-native-messaging

似乎Nativemessaging的协议要求本机App通过阻塞读写然后写循环与扩展进行通信。

首先,这是正确的吗?

如果是这样,这使得在双方之间建立双向异步通信变得非常困难。

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

我想支持的事情:

  • 基于连接的Nativemessaging(即:长时间运行)
  • 来自两端的异步响应请求
  • 来自任何一方的通知没有回复

我的第一个'愚蠢的复杂'以为达到这个目的是:

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

2 个答案:

答案 0 :(得分:1)

有点晚了,但是对于我正在研究的扩展,我能够适应您引用的mdn page上的示例,以消除stdin读取中的阻塞(stdout写入似乎不是-到目前为止,我无法说出什么,但我认为如果不正确,同样的想法也可能适用于他们)

我正在Windows上工作,因此许多其他建议使用select模块的SO帖子对我来说都行不通。在发现之前,我已经在项目中设置使用asyncio,因此对this SO post的回答将我引导至this page,建议使用loop.run_in_executor方法进行处理这些情况(据我了解,这会从主事件循环中创建一个单独的线程,而不是被阻塞)。用该方法包装从示例读取的stdin.buffer摆脱了阻塞。

答案 1 :(得分:0)

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

" Connection-based messaging" Native messaging上的MDN文档页面部分。

runtime.connectNative()创建/返回支持异步通信的runtime.Port。在WebExtension端,然后使用port.postMessage()发送消息并使用port.onMessage进行监听,其中"包含所有扩展事件通用的addListener()removeListener()函数使用WebExtension API构建。" MDN

您似乎只阅读了" Connectionless messaging"。方法runtime.sendNativeMessage()提供仅发送一条消息,然后接收一条消息的功能。这是它的目的,大致相当于runtime.sendMessage()