const ElmLocalStoragePorts = function () {} const localStorage = window.localStorage ElmLocalStoragePorts.prototype.subscribe = function (app, getPortName, setPortName, clearPortName, responsePortName, listKeysPortName) { if (!getPortName) getPortName = 'getItem' if (!setPortName) setPortName = 'setItem' if (!clearPortName) clearPortName = 'clear' if (!listKeysPortName) listKeysPortName = 'listKeys' if (!responsePortName) responsePortName = 'response' if (app.ports[responsePortName]) { const responsePort = app.ports[responsePortName] if (app.ports[getPortName]) { app.ports[getPortName].subscribe(function (key) { let val = null try { val = JSON.parse(localStorage.getItem(key)) } catch (e) {} responsePort.send({ key, value: val }) }) } else { console.warn(getPortName + ': This port is not connected.') } if (app.ports[setPortName]) { app.ports[setPortName].subscribe(function (kv) { const key = kv[0] const json = kv[1] if (json === null) { localStorage.removeItem(key) } else { localStorage.setItem(key, JSON.stringify(json)) } }) } else { console.warn(setPortName + ': This port is not connected.') } if (app.ports[clearPortName]) { app.ports[clearPortName].subscribe(function (prefix) { if (prefix) { const cnt = localStorage.length for (let i = cnt - 1; i >= 0; --i) { const key = localStorage.key(i) if (key && key.startsWith(prefix)) { localStorage.removeItem(key) } } } else { localStorage.clear() } }) } else { console.warn(clearPortName + ': This port is not connected.') } if (app.ports[listKeysPortName]) { app.ports[listKeysPortName].subscribe(function (prefix) { const cnt = localStorage.length const keys = [] for (let i = 0; i < cnt; i++) { const key = localStorage.key(i) if (key && key.startsWith(prefix)) { keys.push(key) } } responsePort.send(keys) }) } else { console.warn(listKeysPortName + ': This port is not connected.') } } else { console.warn(responsePortName + ': This port is not connected.') } }