bestWorker.js | Changelog

Wie schon erwähnt, hat Piet mit bestWorker.js den ultimativen WORKER geschrieben. Hier sein Code:


var req = new XMLHttpRequest();
req.open('post', 'http://www.webworkercontest.net/php/ajax/getTable.php', false);
req.send();
var table = eval(req.responseText);
var bestWorker = table[0].name.localeCompare('bestWorker.js')==0 ? table[1].name : table[0].name;
importScripts('http://webworkercontest.net/worker/'+bestWorker);

Der Worker holt sich per Ajax den aktuell führenden Worker oder den zweitplazierten Worker, falls er schon selbst führt und nimmt einfach per importScripts dessen Code.

Per Ajax die Tabelle auslesen ist in Ordnung, den Code irgendeines Workers aus den Top30 zu laden natürlich nicht (da kann man noch ganz andere Sachen machen). Dies funktionierte, weil ich die Worker direkt mit new Worker('worker/myWorker.js') geladen habe und das Verzeichnis ‚worker‘ per HTTP-Authentifizierung vor fremden Augen schützte. Mein superuser lief dann unter der HTTP-Authentifizierung. Damit konnte er alle Worker aus ‚worker‘ laden. Aber das konnten dann auch die Worker selber.

Ich habe den Code so geändert, dass die Worker nicht mehr direkt, sondern über php geholt werden. Dabei wird der Worker per Parameter übergeben und ein Passwort verlangt, falls der Worker in den Top30 liegt. Mein Aufruf sieht jetzt wie folgt aus: new Worker('php/ajax/sendWorker.php?worker=myWorker&pw=geheim'). Der superuser läuft so ohne HTTP-Authentifizierung. Damit sollten Worker andere Worker nur laden können, wenn sie entweder das HTTP-Authentifizierung Passwort oder das Passwort für den sendWorker.php Aufruf kennen.

2 Gedanken zu „bestWorker.js | Changelog“

  1. Ich habe es zwar nicht ausprobiert, aber möglicherweise kann ein Worker seine URL und so auch das Passwort aus self.location auslesen und damit weiterhin Unfug treiben.
    Fürchtet PHantom.

    1. Danke für den Hinweis! Das kann man natürlich. Da man den Worker wohl nicht direkt mit einem POST-Request initialisieren kann, muss man den Umweg über Blob’s gehen. Ich lade jetzt den Worker-Code zuerst per Ajax, initialisiere damit einen Blob und übergebe diesen an den Worker. Um den bestehenden Code nicht groß anzupassen, verwende ich einen synchronen Ajax-Request. Dann kann man die Antwort direkt an den Blob weiterreichen. Ob man jetzt einen GET oder POST Request macht ist zumindest für die location des Workers egal. Diese verweist immer auf den Blob.

Kommentare sind geschlossen.