要使用SharedArrayBuffer,我们必须添加两个响应标头:
Cross-Origin-Opener-Policy: same-origin
Cross-Origin-Embedder-Policy: require-corp
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使用 GitHub Pages 添加这些标头吗SharedArrayBuffer?
github-pages webassembly sharedarraybuffer cross-origin-embedder-policy cross-origin-opener-policy
我没有在JavaScript规范中看到任何内容,建议的DOM规范扩展相关SharedArrayBuffer,或者当前的WHAT-WG HTML规范建议当一个线程将消息发布到另一个线程和另一个线程时,将跨线程同步/更新共享内存处理消息.(在已经将共享内存发送给另一个之后.)但是,我也无法通过实验验证它没有发生(在我的测试中,我没有看到陈旧的值).是否有一些这样的保证,我错过了,如果是这样,它在哪里得到保证?例如,它是否记录在案postMessage而且我错过了它,或者有什么东西可以回到事件循环/作业队列来保证它(因为处理来自另一个线程的消息涉及这样做)等等?或者,它绝对不能保证(并且信息在某个地方的规范中)?
请不要推测或做出"合理猜测".我正在寻找难以获得的信息:来自规范来源的引文,一个可复制的实验,表明它不能得到保证(尽管我认为这是一个问题,它是否仅仅是一个实现错误),那样的事情.
下面是我的测试的源,但尚未能够捕获不同步的内存.要运行它,您需要使用当前支持的浏览器,SharedArrayBuffer我认为此刻意味着Chrome v67或更高版本(Firefox,Edge和Safari都有支持,但在2018年1月禁用它以响应Spectre和Meltdown Chrome也做了,但是在启用了网站隔离功能的平台上的v67 [2018年7月]重新启用了它.
sync-test-postMessage.html:
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Sync Test postMessage</title>
</head>
<body>
<script src="sync-test-postMessage-main.js"></script>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
sync-test-postMessage-main.js:
const array = new Uint32Array(new SharedArrayBuffer(Uint32Array.BYTES_PER_ELEMENT));
const worker = new Worker("./sync-test-postMessage-worker.js");
let counter = 0;
const limit = 1000000;
const report = Math.floor(limit / 10);
let mismatches = 0;
const now = performance.now();
const log …Run Code Online (Sandbox Code Playgroud) 我需要在客户端应用程序和 Web Worker 之间共享一个对象,我听说了 SharedArrayBuffers。这就是我想做的。
main.js
let myWorker = new Worker('/worker.js')
let mySab = new SharedArrayBuffer(1024)
let myObj = { foo: 'bar', bar: 'foo' }
// Save 'myObj' to 'mySab'
worker.postMessage(sab)
Run Code Online (Sandbox Code Playgroud)
工人.js
self.onmessage = (e) => {
let myObj = BLANK // Get 'myObj' from SharedArrayBuffer
}
Run Code Online (Sandbox Code Playgroud)
这可能吗?我见过的 ShareArrayBuffers 示例仅在缓冲区中保存数字。任何帮助表示赞赏!
因此,SharedArrayBuffer 最近被限制为跨源隔离页面作为安全修复。
我们有一个依赖于 SharedArrayBuffer 的工具,我对其进行了重新设计,将其移动到一个剥离了所有其他站点 UI 和其他内容的准系统页面,并发送以下标头:
Cross-Origin-Embedder-Policy: require-corp
Cross-Origin-Opener-Policy: same-origin
Run Code Online (Sandbox Code Playgroud)
尝试将其加载到成熟网站的 iframe 中会出现控制台错误,SharedArrayBuffer will require cross-origin isolation as of M92然后是ReferenceError: SharedArrayBuffer is not defined- 与我在跨源隔离最小页面本身上的工具之前遇到的情况相同。
我尝试包含 iframe 的页面不是跨域隔离的。这样做即使不是不可能,也是非常困难的。我根本不需要从父页面与 iframe 进行交互,这只是一个方便/风格的事情。目前的生产解决方案只是将用户链接到新窗口中的最小跨源工具页面,但这非常尴尬。
我希望有一些 iframe沙箱属性的组合或者可以使这项工作正常进行的东西?我为此奋斗了几个小时。
据我所知,这可能是不可能的。
(对于某些人来说,这个问题可能等于“如果我不能sharedArrayBuffer在我的主站点中使用,我可以打开一个 iframe 并sharedArrayBuffer在 iframe 内部使用吗?”)
所以我想在我的站点中使用一些带有sharedArrayBuffer的wasm,但是使站点跨域隔离是不切实际的,所以我创建了另一个站点https://my-wasm-function.app,它是跨域隔离的。我希望将它用作 iframe,并通过 与我的主站点进行通信postMessage。
然而,我发现一旦它作为 iframe 嵌入,它就失去了隔离状态。
2021 年 3 月曾有人提出过类似的问题,当时接受的答案是“否”。然而,最近的一篇谷歌博客文章似乎暗示不然,所以我想再问一遍。
该博文有一些关于如何隔离 iframe 的模糊说明,其中之一是添加标题Cross-Origin-Resource-Policy: cross-origin(我认为在COOP和 的顶部COEP),我尝试过,但没有成功。还有一个就是这样打开iframe:<iframe allow="cross-origin-isolated">,我也尝试了,也没用。
webassembly sharedarraybuffer cross-origin-embedder-policy cross-origin-opener-policy cross-origin-resource-policy
我在 SharedArrayBuffer 上遇到解码()问题。
代码:
var sharedArrayBuffer = new SharedArrayBuffer(2);
var uint8Array = new Uint8Array(sharedArrayBuffer);
uint8Array[0] = 20;
var decoder = new TextDecoder();
decoder.decode(uint8Array);
Run Code Online (Sandbox Code Playgroud)
错误:
Failed to execute 'decode' on 'TextDecoder': The provided ArrayBufferView value must not be shared.
Run Code Online (Sandbox Code Playgroud)
这里有一个规范警告开发人员有关此类内存的竞争条件。我可以以某种方式强制解码吗?我确信解码期间数据不会改变。或者有解决方法吗?
原因: 我想创建 Uint8Array 的单个副本并将其传递,而不通过 postmessage 复制(如果未指定可传输,则默认复制)到多个(> 3)IFrame(带有沙箱标记)。也许还有其他可能的解决方案?
javascript postmessage uint8array sharedarraybuffer textdecoder
我正在尝试在 React 应用程序中加载 ffmpeg.wasm 来执行一个小型视频转换器项目。该代码在 Chrome 上运行良好,但在 Firefox 开发版 (83.0b) 中出现以下错误:
ReferenceError:SharedArrayBuffer 未定义
这是捕获错误的组件部分(变量 ready 永远不会变为 true):
import React, { useState, useEffect } from 'react'
import styles from './App.module.css'
import { createFFmpeg, fetchFile } from '@ffmpeg/ffmpeg'
const ffmpeg = createFFmpeg({ log: true })
function App() {
// load state
const [ready, setReady] = useState(false)
// files state
const [video, setVideo] = useState('')
const [gif, setGif] = useState()
// UI state
const [dragOver, setDragOver ] = useState(false)
const [nOfEnters, setNOfEnters] = …Run Code Online (Sandbox Code Playgroud) 所以我读到 Chrome 即将发生变化,以启用 SharedArrayBuffer 的使用,特别是“使您的网站“跨域隔离””。我的站点使用不符合此要求的外部 API。所以我所做的是,使用子域将使用 SharedArrayBuffer 的代码卸载到 iframe 中,并将所需的标头添加到该页面。现在阅读更多内容,似乎我仍然需要为顶级文档提供所需的标题,否则我仍然会在控制台中收到警告。
澄清一下,我的网站现在使用以下结构:
app.website.com -> 包含完整的应用程序功能service.website.com -> 包含使用 SharedArrayBuffer 的功能我以为我可以简单地添加所需的标题service.website.com,一切都会正常工作,但我仍然收到跨源警告。有任何想法吗?
我们有一个使用 ShareArrayBuffer 的电子应用程序。它是用非常旧的电子版本编写的。当我们更新电子版本以便在 WASM 中使用 SIMD 指令时,它开始显示错误,指出 ShareArrayBuffer 未定义。看来这是由于 Chromeum 中的安全更新,并且在设置跨源隔离的情况下 ShareArrayBuffer 可用。
谷歌显示了一些文章解释如何在网页上启用跨源隔离,但我没有找到任何文章解释如何在电子应用程序上执行此操作。有人有信息的指针或可以尝试的想法吗?
谢谢你,
取以下片段:
const arr = [1.1, 2.2, 3.3]
const arrBuffer = (Float32Array.from(arr)).buffer
Run Code Online (Sandbox Code Playgroud)
如何将这个ArrayBuffer转换为SharedArrayBuffer?
const sharedArrBuffer = ...?
Run Code Online (Sandbox Code Playgroud) javascript node.js typed-arrays arraybuffer sharedarraybuffer
所以有一天,我问了这个关于 javascript webworkers 的问题: Javascript Webworker how to put json information into array buffer。我收到的答案之一是使用 SharedArrayBuffer 在主 javascript 和 webworker 之间共享内存。我知道有一段时间,这可以在 Microsoft Edge 上使用,但出于安全考虑,不久前被禁用了。我的边缘版本是 96.0.1054.62。有什么方法可以在浏览器配置或设置中启用共享数组缓冲区吗?目前,当我尝试使用它时,它说 SharedArrayBuffer 未定义。
javascript ×7
cross-origin-embedder-policy ×3
webassembly ×3
web-worker ×2
arraybuffer ×1
cross-origin-resource-policy ×1
electron ×1
ffmpeg ×1
firefox ×1
github-pages ×1
html ×1
iframe ×1
node.js ×1
postmessage ×1
textdecoder ×1
typed-arrays ×1
uint8array ×1