4

I've been hacking away at BeSpin trying to make it work on my CDN, and I got past the XHR cross domain request for the theme.less by converting to use JSONP. The next problem I've been at is the new Worker(js_file) where js_file is on a different domain.

How do/Can I enable cross-domain for a Worker()?

Can I give the Worker the source code directly? (i.e. build a super large JavaScript file with another file embedded in it) [this is less than ideal, but it should work].

4

2 回答 2

2

尝试这个:

  • 用工人的代码创建一个函数
  • 获取函数的字符串表示(.toString),删除第一行和最后一行。现在你有一个带有工人代码的字符串
  • 创建一个新的 BlobBuilder ( window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder)
  • 将工人字符串附加到它
  • 调用 getBlob() 获取 blob
  • 使用窗口的 URL (window.URL || window.webkitURL) 使用 createObjectURL 创建一个对象 url
  • 为工人使用该网址

这是代码

function getUrlForWorker(workerFunction) {
    var BlobBuilder = window.MozBlobBuilder || window.WebKitBlobBuilder || window.BlobBuilder,
    URL = window.URL || window.webkitURL,
        mainString = workerFunction.toString(),
        bodyString     = mainString.substring( mainString.indexOf("{")+1, mainString.lastIndexOf("}") ),
        bb = new BlobBuilder()

    bb.append(bodyString)

    return URL.createObjectURL(bb.getBlob())
}
于 2011-06-24T13:34:05.420 回答
0

一种方法是创建我所说的“窗口代理”......

假设您想在您使用new Worker('at.yourCDN.com/worker.js'). 该工作人员可能是一个 SharedWorker,它允许您在同一域上的不同选项卡保持共享状态。也许您希望这个工作人员也可以访问不同域上的所有选项卡。换句话说,您希望将工作人员用作服务/服务器平台。

问题:您不能指向位于不同域或使用文件协议的 Worker()/SHAredWorker()。

这就是我本周要测试的内容:

  1. 为您的 SharedWorker() 提供一个专用位置,例如 CDN 或来自 file:// 协议。
  2. 使用新窗口或 iframe 打开此位置。
  3. 使与该工作人员的所有交互都通过此窗口或 iframe 进行交互,然后将消息转发给工作人员——此窗口/iframe 可能只是 DOM 中的一个脚本标签,它可以拉动工作人员,也可以是内联工作人员。

详细信息:只需让任何需要访问此工作人员的窗口/选项卡运行 a myWindow.postMessage('my message'),然后让工作人员运行myWindowa port.postMessage(myMsg)

就像我说的,我还没有测试过这个,但我希望这会有所帮助。

此外,我正在寻找一个正在运行的无头浏览器,或者一个带有 CORS 的“永远服务器”,以希望减轻这么多的 iframe-injection 和 window.postMessageing。

当我找到解决方案时,我会回复。

************************************ EDIT ************************************

我研究了如何使用 a 共享状态SharedWorker,不仅适用于同一域上的多个选项卡,而且还可以在多个域之间共享状态 - 使用SharedWorker作为本地托管服务。这不是一个解决方案,但这里是演示如何从FileReaderAPI 构建工作器的代码:

//DOM 代码:

<b>1</b>
<input id="uploadImage" type="file" name="myPhoto" onchange="onSelect();" autofocus="true" />
<script>
var fReader = new FileReader();
fReader.onload = function(e){
  var blob = new Blob([e.target.result], {type: 'text/javascript'});
  var blobURL = URL.createObjectURL(blob);
  var w = new SharedWorker(blobURL);
  w.port.onmessage = function(e){
    console.log('%%^', e);
  };
  w.port.start();
  w.port.postMessage('Echo');
};
function onSelect(e){
  var file = document.getElementById("uploadImage").files[0];
  var dataURL = fReader.readAsText(file);
}
</script>

//桌面上工人文件的代码:

var ports = ports || [];
self.onconnect = function(e){
  var port = e.ports[0];
  ports.push(port);

  port.addEventListener('message', function(e){
    port = e.target;
    ports.forEach(function(p){
      p.postMessage('gWorker:: ' + e.data);
    });
  }, false);

  port.start();
};

可能的解决方案:

就 CDN-Worker 而言,似乎我们不能使用FileReader/因为它们会在本地BlobBuilder创建我们自己的. 似乎我们不能用作启用的服务器,可以通过 来推销工作代码,但是创建一个失败的“ ” ,我们已经见过太多了。worker objectheapCORSCORSXMLHttpRequestnew Worker('http://from.mycors.com/enabled/server')DOM Exception 18SecurityError

最好的解决方案可能是上面详述的“Window-Proxy”方法(iframe.postMessage()在具有自己的工作人员的另一台服务器上的 iframe 上,window.onmessage将消息转发给工作人员)。请注意,如果您计划利用 http 以外的其他 Internet 协议,window.postMessage 将使用 http。

或者,有些人求助于运行google-chrome --allow-file-access-from-files——但这对于生产场景来说显然是有风险的。

另一种途径是为 WebRTC 架构创建一个集合点,这可能是最健壮的。

我希望这可以为您节省大量不必要的研究,并激发更好的解决方案。

干杯,

于 2013-08-12T18:15:38.463 回答