From a01cd04cfe2f1c9c1955aa22d6733e0d6eb33ef3 Mon Sep 17 00:00:00 2001 From: Ben Newman Date: Mon, 6 Feb 2017 15:01:17 -0500 Subject: [PATCH] Polyfill Meteor._localStorage on the server too. Although Meteor._localStorage has historically been used only in browsers, it can be helpful on the server for writing isomorphic code. --- packages/localstorage/localstorage.js | 58 +++++++++++---------------- packages/localstorage/package.js | 12 +++--- 2 files changed, 29 insertions(+), 41 deletions(-) diff --git a/packages/localstorage/localstorage.js b/packages/localstorage/localstorage.js index fb72c0bf59..4eb5719830 100644 --- a/packages/localstorage/localstorage.js +++ b/packages/localstorage/localstorage.js @@ -5,52 +5,42 @@ // trying to use it throws. // Accessing window.localStorage can also immediately throw an error in IE (#1291). +var hasOwn = Object.prototype.hasOwnProperty; +var storage = global.localStorage; var key = '_localstorage_test_' + Random.id(); var retrieved; + try { - if (window.localStorage) { - window.localStorage.setItem(key, key); - retrieved = window.localStorage.getItem(key); - window.localStorage.removeItem(key); + if (storage) { + storage.setItem(key, key); + retrieved = storage.getItem(key); + storage.removeItem(key); } -} catch (e) { - // ... ignore -} +} catch (ignored) {} + if (key === retrieved) { - Meteor._localStorage = { - getItem: function (key) { - return window.localStorage.getItem(key); - }, - setItem: function (key, value) { - window.localStorage.setItem(key, value); - }, - removeItem: function (key) { - window.localStorage.removeItem(key); - } - }; + Meteor._localStorage = storage; } -if (!Meteor._localStorage) { - Meteor._debug( - "You are running a browser with no localStorage or userData " - + "support. Logging in from one tab will not cause another " - + "tab to be logged in."); - - Meteor._localStorage = { - _data: {}, +if (! Meteor._localStorage) { + if (Meteor.isClient) { + Meteor._debug( + "You are running a browser with no localStorage or userData " + + "support. Logging in from one tab will not cause another " + + "tab to be logged in."); + } + Meteor._localStorage = Object.create({ setItem: function (key, val) { - this._data[key] = val; + this[key] = val; }, + removeItem: function (key) { - delete this._data[key]; + delete this[key]; }, + getItem: function (key) { - var value = this._data[key]; - if (value === undefined) - return null; - else - return value; + return hasOwn.call(this, key) ? this[key] : null; } - }; + }); } diff --git a/packages/localstorage/package.js b/packages/localstorage/package.js index 3b4cc80c50..744d9eee5f 100644 --- a/packages/localstorage/package.js +++ b/packages/localstorage/package.js @@ -1,17 +1,15 @@ Package.describe({ summary: "Simulates local storage on IE 6,7 using userData", - version: "1.0.12" + version: "1.1.0" }); Package.onUse(function (api) { - api.use('random', 'client'); - - api.addFiles('localstorage.js', 'client'); + api.use('random'); + api.addFiles('localstorage.js'); }); Package.onTest(function (api) { - api.use('localstorage', 'client'); + api.use('localstorage'); api.use('tinytest'); - - api.addFiles('localstorage_tests.js', 'client'); + api.addFiles('localstorage_tests.js'); });