UNPKG

application-prototype

Version:
288 lines (276 loc) 7.55 kB
/* jshint -W014 */ /* jshint -W002 */ var sessionDbConnection = false; var dbConnectionBuilder = false; /** * browserSessionBuilder description * @interface BrowserSessionModule * @param {string|object} objectStoreArg name or object of strategyStore * @param {object} [objectStoreConf] */ var browserSessionBuilder = function (objectStoreArg, objectStoreConf) { var app = new ApplicationPrototype(); var loader = Application.Promise(); if (typeof(objectStoreArg) === "string") { var strategyName = objectStoreArg; objectStoreArg = module.require('strategy/'+strategyName).then(function (strategyStore) { loader.resolve(new strategyStore(objectStoreConf)); }, function (err) { loader.reject(err); }); } else { if (typeof(objectStoreArg) === "object") { objectStoreArg.initialization.then(function () { loader.resolve(objectStoreArg); }, function (err) { loader.reject(err); }); } else { loader.resolve(sessionDbConnection); } } loader.then(function (objectStore) { var newId = ((function () { var k = 0; return function (p) { return (p || '') + (new Date().valueOf().toString(36)) + '_' + (++k).toString(36) + '_' + Math.floor(Math.random() * 100000000).toString(36); }; })()); ;((function () { var sid = newId('sid_'); app.bind("id", function () { return sid; }, ""); })()); app.bind("getItem", /** * @method getItem * @memberof BrowserSessionModule * @param {string} key * @param {boolean} returnResult * @returns {Promise<any>} */ function (key, returnResult) { return new Application.Promise(function (resolve, reject) { objectStore.getItem(key).then(function (event) { resolve( (typeof(event.target.result) === "object" && event.target.result && !returnResult) ? event.target.result.v : event.target.result ); }, function (event) { reject(event); }); }); }, ""); app.bind("setItem", /** * @method setItem * @memberof BrowserSessionModule * @param {string} key * @param {any} val * @param {boolean} returnResult * @returns {Promise<any>} */ function (key, val, returnResult) { return new Application.Promise(function (resolve, reject) { app.getItem(key, true).then(function (result) { var setValue = function () { objectStore.setItem(key, val).then(function (event) { resolve( (typeof(event.target.result) === "object" && event.target.result && !returnResult) ? event.target.result.v : event.target.result ); app.emit("setItem::"+key, [key, val]); }, function (event) { reject(event); }); }; if (typeof(result) !== undefined) { app.removeItem(key).then(function () { setValue(); }, function (event) { reject(event); }); } else { setValue(); } }, function (event) { reject(event); }); }); }); app.bind("removeItem", /** * @method removeItem * @memberof BrowserSessionModule * @param {string} key * @param {boolean} returnResult * @returns {Promise<any>} */ function (key, returnResult) { return new Application.Promise(function (resolve, reject) { objectStore.removeItem(key).then(function (event) { resolve( (typeof(event.target.result) === "object" && event.target.result && !returnResult) ? event.target.result.v : event.target.result ); app.emit("removeItem::"+key, [key]); }, function (event) { reject(event); }); }); }); app.bind("getItems", /** * @method getItems * @memberof BrowserSessionModule * @param {string[]} keys * @returns {Promise<Object<string,any>>} */ function (keys) { return new Application.Promise(function (resolve, reject) { Application.Promise.all(keys.map(function (key) { return app.getItem(key); })).then(function (values) { var result = {}; keys.forEach(function (key, index) { result[key] = values[index]; }); resolve(result); }, function (event) { reject(event); }); }); }); app.bind("setItems", /** * @method setItems * @memberof BrowserSessionModule * @param {Object<string,any>} obj * @returns {Promise<any[]>} */ function (obj) { var i, arr = []; for (i in obj) { arr.push((function (key, value) { return app.setItem(key, value); })(i, obj[i])); } return Application.Promise.all(arr); }); app.bind("removeItems", /** * @method removeItems * @memberof BrowserSessionModule * @param {string[]} keys * @returns {Promise<any[]>} */ function (keys) { return Application.Promise.all(keys.map(function (key) { return app.removeItem(key); })); }); app.bind("findItems", /** * @method findItems * @memberof BrowserSessionModule * @param {function(any):boolean} filter * @returns {Promise<Object<string,any>>} */ function (filter) { return new Application.Promise(function (resolve, reject) { objectStore.filter(filter).then(function (event) { var result = {}; event.target.result.forEach(function (row) { result[row.k] = row.v; }); resolve(result); }, function (event) { reject(event); }); }); }); app.bind("clear", /** * @method clear * @memberof BrowserSessionModule * @returns {Promise<any>} */ function () { return new Application.Promise(function (resolve, reject) { objectStore.filter(function (k ,v) { var er; try { app.removeItem(k); return true; } catch (er) {} }).then(function (event) { var result = {}; event.target.result.forEach(function (row) { result[row.k] = row.v; }); resolve(result); }, function (event) { reject(event); }); }); }); }, function (err) { console.error(err); app.emit('error', [err]); }); return Application.Promise(function (resolve, reject) { loader.then(function (store) { resolve(app); }, function (err) { reject(err); }) }); }; module.require('strategy/indexed-db').then(function (dbConnectionBuilder) { var loader = new Application.Promise(); var _sessionConnection; var er; try { _sessionConnection = dbConnectionBuilder({ name: "browserDefaultSession", table: "references" }); } catch (er) {} _sessionConnection.initialization.then(function () { loader.resolve(_sessionConnection); }, function (err) { console.error(err); var er; try { console.warn("IndexDB not supported, fallback to localStorage or polyfill emulation"); module.require('strategy/local-storage').then(function (strategyStore) { _sessionConnection = strategyStore(); _sessionConnection.initialization.then(function () { loader.resolve(_sessionConnection); }, function (event) { loader.reject(event); }); }, function (err) { loader.reject(err); }); } catch (er) { loader.reject(er); } }); loader.then(function (_sessionConnection) { sessionDbConnection = _sessionConnection; if (typeof(module) === "object" && module) { module.exports = browserSessionBuilder; } else if (typeof(window) === "object" && window) { window.browserSession = new browserSessionBuilder(); } }, function (err) { console.error("browserSession Error", err); }); // browserSessionBuilder.dbConnectionBuilder = dbConnectionBuilder; }).catch(function (reason) { console.error(reason); });