worker.js 1.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. // declare global: tern, server
  2. var server;
  3. this.onmessage = function(e) {
  4. var data = e.data;
  5. switch (data.type) {
  6. case "init": return startServer(data.defs, data.plugins, data.scripts);
  7. case "add": return server.addFile(data.name, data.text);
  8. case "del": return server.delFile(data.name);
  9. case "req": return server.request(data.body, function(err, reqData) {
  10. postMessage({id: data.id, body: reqData, err: err && String(err)});
  11. });
  12. case "getFile":
  13. var c = pending[data.id];
  14. delete pending[data.id];
  15. return c(data.err, data.text);
  16. default: throw new Error("Unknown message type: " + data.type);
  17. }
  18. };
  19. var nextId = 0, pending = {};
  20. function getFile(file, c) {
  21. postMessage({type: "getFile", name: file, id: ++nextId});
  22. pending[nextId] = c;
  23. }
  24. function startServer(defs, plugins, scripts) {
  25. if (scripts) importScripts.apply(null, scripts);
  26. server = new tern.Server({
  27. getFile: getFile,
  28. async: true,
  29. defs: defs,
  30. plugins: plugins
  31. });
  32. }
  33. var console = {
  34. log: function(v) { postMessage({type: "debug", message: v}); }
  35. };