Передача MessagePort через WebWorker.postMessage () - PullRequest
0 голосов
/ 19 января 2019

В мире JS мы знаем, что можем передать порт MessageChannel работающему веб-работнику через worker.postMessage(message, [transfer]), так как MessagePort, ArrayBuffer и ImageBitmap все могут быть переданы .

Но делать то же самое в Дартсе не так просто и не очевидно. Ниже приведены некоторые попытки с их проблемами.

Настройка

main.dart

Worker wrk = Worker('lib/worker_code.dart.js');

worker_code.dart

DedicatedWorkerGlobalScope.instance.onMessage.listen((MessageEvent msg) {
    var result = msg.data;
})

Попытка 1:

MessageChannel msgChn = MessageChannel()
HashMap msg = HashMap.from({'port': msg.port2})
wrk.postMessage(msg, [msg.port2])

Результат:

JsLinkedHashMap<dynamic, dymanic>
{_collection$_length: 1, _collection$_strings: {port: [object MessagePort]}, _collection$_nums: null, _collection$_rest: null, _collection$_keys: null, $ti: [null, null]}

Дарт бросил все это обратно в источник goto JsLinkedHashMap здесь . Если вы откроете эту карту, получив ключи _collection$_strings, а затем port, вы получите JsObject, который не может быть возвращен к MessagePort.

Попытка 2:

MessageChannel msgChn = MessageChannel()
LinkedHashMap msg = LinkedHashMap.from({'port': msg.port2})
wrk.postMessage(msg, [msg.port2])

Результат:

JsLinkedHashMap<dynamic, dymanic>
{__js_helper$_length: 1, _strings: {port: {hashMapCellKey: port, hashMapCellValue: [object MessagePort], _next: null, _previous: null}}, _nums: null, _rest: null, _first: {hashMapCellKey: port, hashMapCellValue: [object MessagePort], _next: null, _previous: null}, _last: {hashMapCellKey: port, hashMapCellValue: [object MessagePort], _next: null, _previous: null}, _modifications: 1, $ti: [null, null]}

Теперь это больше похоже на LinkedHashMap, но снова проблема, нет способа выловить MessagePort

Попытка 3:

MessageChannel msgChn = MessageChannel()
JsObject msg = JsObject.jsify({'port': msg.port2})
wrk.postMessage(msg, [msg.port2])

Результат:

JsLinkedHashMap<dynamic, dymanic>
{_js$_jsObject: {port: {o: [object MessagePort]}}}

Проще, но по-прежнему нет возможности добраться до MessagePort, чтобы его можно было использовать.

Другие способы Рассматривал это, но это только приводит к тому же самому месту.

@JS()
@anonymous
class PortExchange {
  external String get use;

  external MessagePort get port;

  external factory PortExchange({String use, MessagePort port});
}

Идея решения

Любое решение, где мы можем получить типизированный MessagePort, является хорошим результатом. Все идеи и отзывы приветствуются.

** РЕДАКТИРОВАТЬ

  • Выпуск , созданный в репозитории SDK, благодаря тому, кто пытался помочь ...
...