worker.js 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. // CodeMirror, copyright (c) by Marijn Haverbeke and others
  2. // Distributed under an MIT license: https://codemirror.net/LICENSE
  3. // declare global: tern, server
  4. var server
  5. this.onmessage = function (e) {
  6. var data = e.data
  7. switch (data.type) {
  8. case 'init':
  9. return startServer(data.defs, data.plugins, data.scripts)
  10. case 'add':
  11. return server.addFile(data.name, data.text)
  12. case 'del':
  13. return server.delFile(data.name)
  14. case 'req':
  15. return server.request(data.body, function (err, reqData) {
  16. postMessage({ id: data.id, body: reqData, err: err && String(err) })
  17. })
  18. case 'getFile':
  19. var c = pending[data.id]
  20. delete pending[data.id]
  21. return c(data.err, data.text)
  22. default:
  23. throw new Error('Unknown message type: ' + data.type)
  24. }
  25. }
  26. var nextId = 0,
  27. pending = {}
  28. function getFile(file, c) {
  29. postMessage({ type: 'getFile', name: file, id: ++nextId })
  30. pending[nextId] = c
  31. }
  32. function startServer(defs, plugins, scripts) {
  33. if (scripts) importScripts.apply(null, scripts)
  34. server = new tern.Server({
  35. getFile: getFile,
  36. async: true,
  37. defs: defs,
  38. plugins: plugins,
  39. })
  40. }
  41. this.console = {
  42. log: function (v) {
  43. postMessage({ type: 'debug', message: v })
  44. },
  45. }