Persistent Browser (Client) Storage
- 👷 100% Tests coverage;
- 📦 No external dependencies;
- 💪 Bulletproof persistent Client storage;
- ㊗️ With Unicode support for values and keys;
- 👨💻 With
String
, Array
, Object
, and Boolean
support as values; - ♿ Works with disabled
localStorage
and cookies
; - Available via 📦 NPM and ☄️ Atmosphere.
Install:
npm install --save ClientStorage
Install Meteor:
# Via Atmosphere
meteor add ostrio:cstorage
# Via NPM
meteor npm install --save ClientStorage
Require:
var ClientStorage = require('ClientStorage').ClientStorage;
var clientStorage = new ClientStorage();
ES6 Import:
import { ClientStorage } from 'ClientStorage';
const clientStorage = new ClientStorage();
ES6 Import (Meteor):
import { ClientStorage } from 'meteor/ostrio:cstorage';
const clientStorage = new ClientStorage();
Usage:
clientStorage.get('key')
- Read a record. If the key doesn't exist a undefined value will be returned;
key
- {String} - Record's key;
clientStorage.set('key', value[, ttl])
- Create/overwrite a value in storage;
key
- {String} - Record's key;value
- {String|[mix]|Boolean|Object} - Record's value (content);ttl
- {Number} — [Optional] Record's TTL in seconds;
clientStorage.remove('key')
- Remove a record;
key
- {String} - Record's key;
clientStorage.has('key')
- Check whether a record exists, returns a boolean value;
key
- {String} - Record's key;
clientStorage.keys()
- Returns an array of all storage keys;clientStorage.empty()
- Empty storage (remove all key/value pairs). Use with caution! (May remove cookies which weren't set by you).
Alternate usage:
By default ClientStorage package handle selecting storage driver in the next order (descending priority):
localStorage
cookies
js
(JS Object driven storage)
To alter priority pass "preferred driver" to new ClientStorage(driverName)
constructor.
Use cookies
only:
Pass cookies
as an argument to new instance of ClientStorage
:
const { clientStorage } = require('ClientStorage');
var cookiesStorage = new ClientStorage('cookies');
cookiesStorage.has('locale');
cookiesStorage.set('locale', 'en_US');
Use localStorage
only:
Pass localStorage
as an argument to new instance of ClientStorage
:
const { clientStorage } = require('ClientStorage');
var locStorage = new ClientStorage('localStorage');
locStorage.has('locale');
locStorage.set('locale', 'en_US');
Use js
only:
Pass js
(in-memory js object) as an argument to new instance of ClientStorage
:
const { clientStorage } = require('ClientStorage');
var jsStorage = new ClientStorage('js');
jsStorage.has('locale');
jsStorage.set('locale', 'en_US');
Note: All instances are sharing same cookie and localStorage records!
[Meteor] Add reactivity:
Persistent ReactiveVar
implementation:
import { ReactiveVar } from 'meteor/reactive-var';
import { ClientStorage } from 'meteor/ostrio:cstorage';
const clientStorage = new ClientStorage();
const persistentReactive = (name, initial = undefined) => {
let reactive;
if (clientStorage.has(name)) {
reactive = new ReactiveVar(clientStorage.get(name));
} else {
clientStorage.set(name, initial);
reactive = new ReactiveVar(initial);
}
reactive.set = function (newValue) {
let oldValue = reactive.curValue;
if ((reactive.equalsFunc || ReactiveVar._isEqual)(oldValue, newValue)) {
return;
}
reactive.curValue = newValue;
clientStorage.set(name, newValue);
reactive.dep.changed();
};
return reactive;
};
const layout = persistentReactive('ui-layout', 'two-columns');
layout.get();
layout.set('single-column');
Examples:
const clientStorage = new (require('ClientStorage').ClientStorage);
clientStorage.set('locale', 'en');
clientStorage.set('country', 'usa');
clientStorage.set('gender', 'male');
clientStorage.get('gender');
clientStorage.has('locale');
clientStorage.has('city');
clientStorage.keys();
clientStorage.remove('locale');
clientStorage.get('locale');
clientStorage.keys();
clientStorage.empty();
clientStorage.keys();
clientStorage.empty();
Running Tests
- Clone this package
- In Terminal (Console) go to directory where package is cloned
- Then run:
Meteor/Tinytest
# Default
meteor test-packages ./
# With custom port
meteor test-packages ./ --port 8888
# With local MongoDB and custom port
MONGO_URL="mongodb://127.0.0.1:27017/client-storage-tests" meteor test-packages ./ --port 8888
Support this project: