javascript - 如何在 Firefox 附加组件中向子进程发送消息,如 Chrome native 消息传递

标签 javascript python firefox-addon firefox-addon-sdk chrome-native-messaging

我正在尝试模拟 Chrome 的 native messaging feature使用 Firefox 的附加 SDK。具体来说,我正在使用 child_process module连同 emit method与 python 子进程通信。

我能够成功地向子进程发送消息,但是我无法将消息发送回附加组件。 Chrome 的 native 消息传递功能使用标准输入/标准输出。双向每条消息的前 4 个字节表示后续消息的字节大小,因此接收方知道要读取多少。这是我到目前为止所拥有的:

附加到子进程

var utf8 = new TextEncoder("utf-8").encode(message);
var latin = new TextDecoder("latin1").decode(utf8);

emit(childProcess.stdin, "data", new TextDecoder("latin1").decode(new Uint32Array([utf8.length])));
emit(childProcess.stdin, "data", latin);
emit(childProcess.stdin, "end");

来自附加组件的子进程 (Python)

text_length_bytes = sys.stdin.read(4)
text_length = struct.unpack('i', text_length_bytes)[0]
text = sys.stdin.read(text_length).decode('utf-8')

加载项的子进程

sys.stdout.write(struct.pack('I', len(message)))
sys.stdout.write(message)
sys.stdout.flush()

来自子进程的附加组件

这就是我挣扎的地方。当长度小于 255 时,我可以使用它。例如,如果长度为 55,则可以使用:

childProcess.stdout.on('data', (data) => { // data is '7' (55 UTF-8 encoded)
    var utf8Encoded = new TextEncoder("utf-8).encode(data);
    console.log(utf8Encoded[0]); // 55
}

但是,正如我所说,它并不适用于所有数字。我确定我必须对 TypedArrays 做一些事情,但我正在努力将所有内容放在一起。

最佳答案

这里的问题是,Firefox 默认尝试将标准输出读取为 UTF-8 流。由于 UTF-8 不使用完整的第一个字节,因此您会得到损坏的字符,例如 255。解决方案是告诉 Firefox 以二进制编码读取,这意味着您稍后必须手动解析实际的消息内容。

var childProcess = spawn("mybin", [ '-a' ], { encoding: null });

然后你的听众会像

var decoder = new TextDecoder("utf-8");
var readIncoming = (data) => {
    // read the first four bytes, which indicate the size of the following message
    var size = (new Uint32Array(data.subarray(0, 4).buffer))[0];
    //TODO: handle size > data.byteLength - 4
    // read the message
    var message = decoder.decode(data.subarray(4, size));
    //TODO: do stuff with message
    // Read the next message if there are more bytes.
    if(data.byteLength > 4 + size)
        readIncoming(data.subarray(4 + size));
};
childProcess.stdout.on('data', (data) => {
    // convert the data string to a byte array
    // The bytes got converted by char code, see https://dxr.mozilla.org/mozilla-central/source/addon-sdk/source/lib/sdk/system/child_process/subprocess.js#357
    var bytes = Uint8Array.from(data, (c) => c.charCodeAt(0));
    readIncoming(bytes);
});

关于javascript - 如何在 Firefox 附加组件中向子进程发送消息,如 Chrome native 消息传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36659258/

相关文章:

javascript - Firefox 扩展中的 localStorage 抛出 "The operation is insecure."异常

javascript - firebase 在添加新子项时监听路径上最近的 10 个项目,而不会丢失第 10 个项目

python - 带有 python 问题的嵌套 JSON

javascript - 如何在 Firefox 扩展中使用 "targetObj"参数到 loadSubScript()?

python - 如何仅选择 Tensorflow 数据集的一部分并更改维度

python - 保证找到四个单色点的最小 k X l 网格

firefox-addon - 火狐扩展 : Embed javascript in a webpage

javascript - 如何从 GMaps 信息窗口触发 jQuery

javascript - 了解 .call 和 .apply 在 Javascript 中的行为

javascript - 具有 jinja 渲染功能的 Flask 应用程序;不自动刷新网页