【问题标题】:Asynchronous bidirectional messaging between nativemessaging app and webextension?nativemessaging 应用程序和 webextension 之间的异步双向消息传递?
【发布时间】:2017-10-25 09:54:17
【问题描述】:

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

首先,正确吗?

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

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


我想支持的事情:

  • 基于连接的原生消息传递(即:长时间运行)
  • 来自任一端的请求都带有异步响应
  • 来自任一端的通知,但没有响应

我实现这一目标的第一个“极其复杂”的想法是:

  1. 使用 Nativemessaging 启动原生应用并管理其生命周期
  2. 在启动时让本机应用程序启动 WebSocket server 并使用 Web 扩展从其中使用的 WebSocket URI 响应第一个请求

【问题讨论】:

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


    【解决方案1】:

    有点晚了,但是对于我正在处理的扩展,我能够修改您引用的 mdn page 上的示例,以消除标准输入读取中的阻塞(标准输出写入似乎是非阻塞的据我目前所知,但我认为如果不正确,同样的想法也适用于他们)

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

    【讨论】:

      【解决方案2】:

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

      这在 Native messaging 上的 MDN 文档页面的“Connection-based messaging”部分进行了解释。

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

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

      【讨论】:

      • 我阅读了整篇文章,多次阅读并在其他地方阅读了许多支持文章。 webextension 端的 postMessage/onMessage 似乎可以支持双向异步通信,但 App 端文档似乎表明情况并非如此。正如我在我的问题中所说,文档似乎暗示了一个应用程序端阻塞读然后写循环,它排除了双向异步消息传递。我还检查了我在其他地方找到的一大堆实现,它们都具有相同的结构。你明白我所说的这种结构的含义吗?
      • 如果文档只是缺少一个支持双向异步消息传递的应用程序端构造示例,那么如果给出允许它的协议/API 的详细信息,我很乐意自己编写一个.
      • @David-SkyMesh 它通过从标准输入读取和写入标准输出与本机应用程序通信,这是大多数操作系统/语言下的正常 I/O 方法,而不是固有的阻塞。我不确定你有什么问题。如果它们被阻止,那么这是操作系统/语言限制或您访问它们的方式。 Native messaging 示例是一个简单的 Python 脚本,它确实以您描述的方式实现它,但这只是因为它是一个简单的示例。
      • which aren't inherently blocking / 这取决于协议。您是否了解/访问过协议的任何文档,这些文档可以确定浏览器端的 API 实现中不存在此限制?很明显,API 端只允许一个同时连接到它启动的每个本机应用进程......
      • 为了使双向异步消息在这些条件下工作(webextension 端的轮询效率低下),webextension 端的 API 需要使用某种 select()/epoll()/etc环形。它是(在 Firefox 上)还是实际上期望简单示例所暗示的消息模式?
      猜你喜欢
      • 2018-12-16
      • 2010-11-29
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多