Передача MessagePort через WebWorker.postMessage()
В мире 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]}
Дарт бросил все это обратно 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, спасибо, кто пытался помочь...