是否可以通过广播频道API向Web Workers广播SharedArrayBuffer?

问题描述

广播频道API 似乎是 postMessage Channel Messaging API (又称为 MessageChannel )的替代。 ) 我已经在最新版本的Google Chrome浏览器中成功使用了这两种方法来发送共享数组缓冲区;但是,使用广播频道API发送共享数组缓冲区时遇到了麻烦。

Mozilla在https://developer.mozilla.org/en-US/docs/Web/API/BroadcastChannel的文档引用了https://html.spec.whatwg.org/multipage/web-messaging.html#broadcastchannel上的规范,内容为:

对于目的地中的每个目的地...

  1. 让数据成为StructuredDeserialize(serialized,targetRealm)。 如果引发异常,请捕获该异常,并使用MessageEvent在目标处激发一个名为messageerror的事件,并将origin属性初始化为sourceOrigin的序列化,然后中止这些步骤。

StructuredDeserialize是在https://html.spec.whatwg.org/multipage/structured-data.html#structureddeserialize上定义的,似乎表明它涵盖了SharedArrayBuffers:

  1. 否则,如果已序列化。[[Type]]为“ SharedArrayBuffer”,则: 如果targetRealm的相应代理群集未序列化。[[AgentCluster]],则引发“ DataCloneError” DOMException。 否则,将值设置为targetRealm中新的SharedArrayBuffer对象,该对象的[[ArrayBufferData]]内部插槽值被序列化。[[ArrayBufferData]],并且其[[ArrayBufferByteLength]]内部插槽值被序列化。[[ArrayBufferByteLength]]。

阅读此书,在我看来这应该可行,但是我收到一个消息事件,其中的数据只是null。 如果这是一个安全问题,我希望得到一个messageerror事件而不是一个消息事件。

这是我的最小测试用例:

broadcast-test.html(必须从http服务器提供-不能通过file://起作用)

<!DOCTYPE html>
<html>
  <head><title></title></head>
  <body>
    <script src="broadcast-test.js"></script>
  </body>
</html>

broadcast-test.js

const isThisTheWorker = this.document === undefined
const broadcastChannel = new broadcastChannel('foo')

if (!isThisTheWorker) {
  broadcastChannel.addEventListener('message',(event) => {
    console.log('main received',event.data)
    const sab = new SharedArrayBuffer(100)
    broadcastChannel.postMessage({ hello: 'from main',sab })
  })
  var myWorker = new Worker('broadcast-test.js')
}
else {
  broadcastChannel.addEventListener('message',(event) => {
    console.log('worker received',event.data)
  })
  broadcastChannel.postMessage({ hello: 'from worker' })
}

观察到的控制台输出:(Windows 10上为Chrome 84.0.4147.135)

主要收到了{hello:“来自工人”}

工人收到空值

Google Chrome的实现是否不正确,还是我误解了规范?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...