Я пытаюсь эмулировать встроенную функцию обмена сообщениями Chrome, используя дополнительный SDK Firefox. В частности, я использую модуль child_process. вместе с методом отправки для связи с дочерним процессом python.
Я могу успешно отправлять сообщения дочернему процессу, но у меня возникают проблемы с отправкой сообщений обратно надстройке. Собственная функция обмена сообщениями Chrome использует stdin/stdout. Первые 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, но я изо всех сил пытаюсь собрать все вместе.