似乎Nativemessaging的协议要求本机App通过阻塞读写然后写循环与扩展进行通信。
首先,这是正确的吗?
如果是这样,这使得在双方之间建立双向异步通信变得非常困难。
在我做一些愚蠢的事情来解决这个限制之前,是否有一些简单的API来实现与本机应用程序的双向异步消息传递?
我想支持的事情:
我的第一个'愚蠢的复杂'以为达到这个目的是:
答案 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()
。