UNPKG

electron-browser-storage

Version:

Access localStorage and sessionStorage from the main process

77 lines (60 loc) 3.35 kB
# electron-browser-storage Access [`localStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/localStorage) and [`sessionStorage`](https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage) from the Electron Main process. ## Install ```shell npm install electron-browser-storage ``` ## Usage The methods are promise-based and have the same code signature as the [`Storage` interface methods](https://developer.mozilla.org/en-US/docs/Web/API/Storage#Properties). The only exception is that [`.length`](https://developer.mozilla.org/en-US/docs/Web/API/Storage/length) is implemented as a method `.length()`. **Note**: storage methods must be called **after** the app's [`ready`](https://electronjs.org/docs/api/app#event-ready) event. ```javascript // In main process const { localStorage, sessionStorage } = require('electron-browser-storage'); app.on('ready', async () => { // Async/await await localStorage.setItem('favorite_number', 12); await localStorage.getItem('favorite_number'); // '12' await localStorage.key(0); // 'favorite_number' await localStorage.length(); // 1 await localStorage.removeItem('favorite_number'); await localStorage.clear(); // Promises sessionStorage.setItem('favorite_color', 'blue') .then(() => sessionStorage.getItem('favorite_color')) // 'blue' .then(() => sessionStorage.key(0)) // 'favorite_color' .then(() => sessionStorage.length()) // 1 .then(() => sessionStorage.removeItem('favorite_color')) .then(() => sessionStorage.clear()); }); ``` ## API Promise-based versions of the [`Storage` interface methods](https://developer.mozilla.org/en-US/docs/Web/API/Storage#Properties). ### `Storage.length()` Returns a promise that resolves to the number of items in the storage. ### `Storage.key(index)` Returns a promise that resolves to the key at the given index. ### `Storage.getItem(key)` Returns a promise that resolves to the value for the given key. ### `Storage.setItem(key, value)` Sets the value for the given key and returns a promise that resolves when complete. ### `Storage.removeItem(key)` Removes the item at the given key and returns a promise that resolves when complete. ### `Storage.clear()` Removes all keys and values and returns a promise that resolves when complete. ## Security Concerns Under the covers, this uses [`webContents.executeJavaScript()`](https://electronjs.org/docs/api/web-contents#contentsexecutejavascriptcode-usergesture-callback) to access `localStorage` and `sessionStorage` in the renderer process. ```javascript // This is what the call to setItem() looks like localStorage.setItem = (key, value) => { return win.webContents.executeJavaScript(`window.localStorage.setItem('${key}', '${value}');`); }; ``` Because nothing is being escaped, **be careful** when saving user input, since code injection is possible. ```javascript // Example of code injection const userInput = `'); someInjectedCode(); ('`; await localStorage.setItem('user_name', userInput); // Resulting in this getting executed win.webContents.executeJavaScript(`window.localStorage.setItem('user_name', ''); someInjectedCode(); ('');`); ``` I'm still trying to figure out how to get around this. If you have any ideas, feel free to DM me or [open an issue](https://github.com/jerry1100/electron-browser-storage/issues/new).