luci-base: luci.js: add LuCI.session class
authorJo-Philipp Wich <jo@mein.io>
Wed, 15 Apr 2020 19:50:26 +0000 (21:50 +0200)
committerJo-Philipp Wich <jo@mein.io>
Thu, 7 May 2020 17:40:49 +0000 (19:40 +0200)
Signed-off-by: Jo-Philipp Wich <jo@mein.io>
(cherry picked from commit ef718246b17d322ae001129c04e117d17e2373a0)

modules/luci-base/htdocs/luci-static/resources/luci.js

index ea656e21c869b2de38b1f298fa60eacb9ee5cee9..77f1d8fa18284432f820e4be6c791fc3116e008b 100644 (file)
                }
        });
 
+       /**
+        * @class session
+        * @memberof LuCI
+        * @hideconstructor
+        * @classdesc
+        *
+        * The `session` class provides various session related functionality.
+        */
+       var Session = Class.singleton(/** @lends LuCI.session.prototype */ {
+               __name__: 'LuCI.session',
+
+               /**
+                * Retrieve the current session ID.
+                *
+                * @returns {string}
+                * Returns the current session ID.
+                */
+               getID: function() {
+                       return env.sessionid || '00000000000000000000000000000000';
+               },
+
+               /**
+                * Retrieve data from the local session storage.
+                *
+                * @param {string} [key]
+                * The key to retrieve from the session data store. If omitted, all
+                * session data will be returned.
+                *
+                * @returns {*}
+                * Returns the stored session data or `null` if the given key wasn't
+                * found.
+                */
+               getLocalData: function(key) {
+                       try {
+                               var sid = this.getID(),
+                                   item = 'luci-session-store',
+                                   data = JSON.parse(window.sessionStorage.getItem(item));
+
+                               if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
+                                       data = {};
+                                       data[sid] = {};
+                               }
+
+                               if (key != null)
+                                       return data[sid].hasOwnProperty(key) ? data[sid][key] : null;
+
+                               return data[sid];
+                       }
+                       catch (e) {
+                               return (key != null) ? null : {};
+                       }
+               },
+
+               /**
+                * Set data in the local session storage.
+                *
+                * @param {string} key
+                * The key to set in the session data store.
+                *
+                * @param {*} value
+                * The value to store. It will be internally converted to JSON before
+                * being put in the session store.
+                *
+                * @returns {boolean}
+                * Returns `true` if the data could be stored or `false` on error.
+                */
+               setLocalData: function(key, value) {
+                       if (key == null)
+                               return false;
+
+                       try {
+                               var sid = this.getID(),
+                                   item = 'luci-session-store',
+                                   data = JSON.parse(window.sessionStorage.getItem(item));
+
+                               if (!LuCI.prototype.isObject(data) || !data.hasOwnProperty(sid)) {
+                                       data = {};
+                                       data[sid] = {};
+                               }
+
+                               if (value != null)
+                                       data[sid][key] = value;
+                               else
+                                       delete data[sid][key];
+
+                               window.sessionStorage.setItem(item, JSON.stringify(data));
+
+                               return true;
+                       }
+                       catch (e) {
+                               return false;
+                       }
+               }
+       });
+
        /**
         * @class view
         * @memberof LuCI
                dom: DOM,
                poll: Poll,
                request: Request,
+               session: Session,
                view: View
        };