2010-12-11 10 views
3

私はBeSpinをハッキングしてCDNで動作させようとしていましたが、JSONPを使用するように変換することによって、XHRクロスドメイン要求をテーマにしています。次の問題は、js_fileが別のドメインにある新しいWorker(js_file)です。クロスドメインに対してWorker()を機能させるにはどうすればよいですか?

方法/ワーカー()のクロスドメインを有効にすることはできますか?

Workerにソースコードを直接与えることはできますか? (つまり、別のファイルが埋め込まれた超大規模のJavaScriptファイルを作成する)[これは理想的ではありませんが、うまくいくはずです]。

答えて

2

はこれを試してみてください。

  • は、労働者のコード
  • 機能(.toString)の文字列表現を取得し、最初と最後の行を削除して関数を作成します。今、あなたは労働者のコードの文字列を持っている
  • 作成新しいBlobBuilder(window.MozBlobBuilder || || window.WebKitBlobBuilder window.BlobBuilder)それは
  • コールのgetBlob()を取得するに
  • ワーカー文字列を追加ウィンドウのURLを使用して
  • をBLOB(window.URL || window.webkitURL)createObjectURL
  • 労働者

のURL

  • 使用はここでは、コード

    だを使用してオブジェクトの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()) 
    } 
    
  • +0

    これは、 'heap'に' new Object'を作成し、ファイル自体を使用しません。同じドメインのタブ間で使用できる 'SharedWorker'を使用したいが、複数のドメイン(規約上)が分散ネットワークのサービスとしてそのドメインを使用できるようにするため、私は尋ねる。 – Cody

    +0

    醜いですが、それは動作します。しかし、 "最初と最後の行を削除する"は "{}}"の間に関数本体を抽出するべきです。 –

    0

    一つの方法は、私は「ウィンドウ・プロキシ」と呼ぶものを作成することです....

    は、あなたがあなたのnew Worker('at.yourCDN.com/worker.js')とを指しているCDN上の労働者をホストしてみたいと思います。このワーカーは、共有された状態を維持するために同じドメイン上の異なるタブを許可するSharedWorkerかもしれません。おそらく、あなたは、この労働者が異なる地域のすべてのTABSにアクセスできるようにしたいと思うかもしれません。つまり、ワーカーをService/Serverプラットフォームとして使用したいと考えています。

    問題: 異なるドメインにある、またはファイルプロトコルを使用するWorker()/ SharedWorker()を指すことはできません。このようCDNとして、あるいはファイルから()

    1. があなたのSharedWorkerのための専用の場所を持っている://プロトコル

      これは、私は今週テストをすることがありますものです。

    2. 新しいウィンドウまたはiframeを使用してこの場所を開きます。
    3. このウィンドウまたはiframeを介して、このワーカーとのやりとりを代理的に行い、ワーカーにメッセージを転送します。このウィンドウ/ iframeは、単にDOM内のスクリプトタグであって、ワーカー。

    詳細: は単純に、この労働者にアクセスする必要がある任意のウィンドウ/タブがmyWindow.postMessage('my message')を実行し、myWindowは、作業者にport.postMessage(myMsg)を実行してみましょうしています。

    私が言ったように、私はこれをまだテストしていませんが、これが助けてくれることを願っています。

    また、iframe-injectionとwindow.postMessageingをうまく軽減するために、ヘッドレスブラウザ、またはCORSの「Forever Server」を探しています。

    解決策を見つけるときに私はポストバックします。

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

    私はSharedWorkerを使用して状態を共有する方法について研究しているだけではなく、同一ドメイン上の複数のタブのために、だけでなく、複数のドメイン間で状態を共有する - ローカルでホストされたサービスとしてSharedWorkerを使用。これは解決策ではありませんが、ここではFileReader APIから労働者を構築する方法を実証するためのコードです:

    // DOMのCODE:

    <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> 
    

    //デスクトップ上WORKERファイルのコード:

    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(); 
    }; 
    

    POSSIBLE SOLUTIONS:

    は限りCDN-労働者が行くように、我々がを使用できないようです/BlobBuilderこれらはローカルheapに独自のworker objectを作成します。 CORSをサーバーとして使用することはできません。CORSを有効にすると、XMLHttpRequestを介してワーカーコードを投げることができますが、new Worker('http://from.mycors.com/enabled/server')を作成すると、同じ "DOM Exception 18" SecurityErrorが多すぎます。

    上記の「ウィンドウプロキシ」方式(iframe.postMessage()、別のサーバのiframeには独自のワーカー、window.onmessageのメッセージをワーカーに転送する)が最適なソリューションです。 http以外の別のインターネットプロトコルを利用する予定の場合、window.postMessageはhttpを使用することに注意してください。

    また、google-chrome --allow-file-access-from-filesを実行しているものもありますが、これは生産シナリオでは明らかに危険です。

    もう1つの方法は、WebRTCアーキテクチャ用のランデブーポイントを作成することです。これはおそらく最も堅牢です。

    これにより、多くの不必要な研究が省け、より良い解決策が得られることを願っています。

    乾杯、

    関連する問題