Puede un WebWorker de acceso a la localStorage?

Si no ¿por qué no? Es problemático desde el punto de vista de la seguridad?

InformationsquelleAutor ciochPep | 2011-05-30

3 Comentarios

  1. 62

    No, localStorage y sessionStorage son tanto indefinido en un webworker proceso.

    Usted tendría que llamar a postMessage() de vuelta para el Trabajador origina código, y que el código de almacenar los datos en localStorage.

    Curiosamente, un webworker puede el uso de una llamada AJAX para enviar/recuperar información de un servidor, por lo que puede abrir posibilidades, dependiendo de lo que estamos tratando de hacer.

    • la mayoría de los entornos de apoyo webworker acceso a indexeddb
  2. 92

    Web los trabajadores sólo tienen acceso a los siguientes:

    • XMLHttpRequest
    • Caché De La Aplicación
    • crear otras web a los trabajadores
    • objeto navigator
    • objeto de ubicación de
    • método setTimeout
    • clearTimeout método
    • método setInterval
    • clearInterval método
    • importScripts método
    • JSON
    • Trabajador

    La ventana o el padre de los objetos no son accesibles desde una Web trabajador, por tanto, no se puede acceder a la localStorage.

    Para la comunicación entre la ventana y la workerglobalscope puede utilizar postMessage() función y onmessage evento.

    El acceso al DOM y la ventana no sería seguro para subprocesos, ya que el niño hilo tendría los mismos privilegios que su padre.

    • se puede acceder a indexedDB sin embargo.
    • Y el hilo de seguridad no es una preocupación para localStorage, ya que debe proporcionar el acceso sincronizado para acomodar varias pestañas del navegador y accediendo a la misma hora. stackoverflow.com/questions/22001112/…
    • Una web trabajador no puede siempre crear otras web a los trabajadores (por ejemplo Chrome no es compatible con esta)… de Verificación de preguntas y respuestas acerca de este here.
    • actualmente indexedDB no es accesible en la web del trabajador en Safari
  3. 32

    Puede utilizar IndexedDB en WebWorkers que es una manera de guardar las cosas de forma local en un valor clave de la tienda. No es lo mismo como objeto localStorage, pero tiene un uso similar al de los casos y puede almacenar gran cantidad de datos. Utilizamos IndexedDB en WebWorkers en mi trabajo.

    De agosto de 2019 EDICIÓN:

    Hay una propuesta de la API que puede ser que en algún momento en el futuro (aunque en la actualidad está disponible en Chrome Canary con la web experimental características del indicador de encendido). Se llama KV de Almacenamiento (KV es corto para el Valor de la Clave). Tiene casi un interfaz idéntica a la localStorage API y vendrá en JavaScript módulos. Es construido fuera de la API indexeddb, pero tiene una mucho más simple API. Mirando el Spec parece que esto va a funcionar en WebWorkers así. Para ejemplos, vea la página de github de la especificación. Aquí está un ejemplo:

    import storage, { StorageArea } from "std:kv-storage";
    import {test, assert} from "./florence-test";
    
    test("kv-storage test",async () => {
      await storage.clear()
      await storage.set("mycat", "Tom");
      assert(await storage.get("mycat") === "Tom", "storage: mycat is Tom");
    
      const otherStorage = new StorageArea("unique string");
      await otherStorage.clear()
      assert(await otherStorage.get("mycat") === undefined, "otherStorage: mycat is undefined");
      await otherStorage.set("mycat", "Jerry");
      assert(await otherStorage.get("mycat") === "Jerry", "otherStorage: mycat is Jerry");
    });

    He aquí las pruebas que pasa en Chrome Canary:

    El acceso a localStorage de un webWorker

    Aunque no es necesario utilizar el kv-api de almacenamiento de el código de abajo, es el marco de pruebas utilizado para el código anterior:

    //./florence-test.js
    
    //Ryan Florence's Basic Testing Framework modified to support async functions
    //https://twitter.com/ryanflorence/status/1162792430422200320
    const lock = AsyncLock();
    
    export async function test (name, fn) {
      //we have to lock, so that console.groups are grouped together when
      //async functions are used.
      for await (const _ of lock) {
        console.group(name);
        await fn();
        console.groupEnd(name);
      }
    };
    
    export function assert (cond, desc) {
      if (cond) {
        console.log("%c✔️", "font-size: 18px; color: green", desc);
      } else {
        console.assert(cond, desc);
      }
    };
    
    //https://codereview.stackexchange.com/questions/177935/asynclock-implementation-for-js
    function AsyncLock() { 
      const p = () => new Promise(next => nextIter = next ); 
      var nextIter, next = p(); 
      const nextP = () => { const result = next; next = result.then(() => p() ); return result;} 
      nextIter(); 
      return Object.assign({}, { 
        async * [Symbol.asyncIterator] () {
          try { 
            yield nextP() 
          } finally {
          nextIter() 
          } 
        }
      });
    } 
    • No se puede ver por qué esto era por votó así que hasta se votó por lo que volvió a cero. LocalStorage no puede ser utilizado en un webworker y si una de las necesidades de almacenamiento en el navegador IndexedDB es la alternativa que hacer el trabajo de un trabajador.
    • actualmente indexedDB no es accesible en la web del trabajador en Safari

Dejar respuesta

Please enter your comment!
Please enter your name here