jimhigson / oboe.js

A streaming approach to JSON. Oboe.js speeds up web applications by providing parsed objects before the response completes.
http://oboejs.com
Other
4.77k stars 209 forks source link

Oboe.js cannot be used in a web worker because window is not defined #225

Open paulsmithkc opened 3 years ago

paulsmithkc commented 3 years ago

Line 2774 references window.location instead of location Line 2788 references window.setTimeout instead of setTimeout

Simply changing these two lines so that they refer to the default global object instead window makes oboe.js usable in a web worker.

paulsmithkc commented 3 years ago

Simple example web worker, enabled by this patch:

importScripts('/js/oboe-browser.min.js');

self.onmessage = (evt) => {
  const cmd = evt.data.cmd;
  const url = evt.data.url;
  switch (cmd) {
    case 'start':
      return start(url);
  }
};

const start = (url) => {
  console.log('worker started');
  let chunk = [];

  oboe(url)
    .node('![*]', (item) => {
      if (item) {
        chunk.push(item);
        if (chunk.length >= 1000) {
          self.postMessage({ cmd: 'chunk', chunk: chunk });
          chunk = [];
        }
      }
      return oboe.drop;
    })
    .done((_) => {
      self.postMessage({ cmd: 'done', chunk: chunk });
    })
    .fail((res) => {
      if (res.thrown) {
        console.error(res.thrown.stack);
        self.postMessage({ cmd: 'error', error: res.thrown.message });
      } else {
        console.error(res);
        self.postMessage({ cmd: 'error', error: 'network error' });
      }
    });
};
paulsmithkc commented 2 years ago

ping @jimhigson