@merkur/plugin-session-storage 0.33.0 → 0.34.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/index.cjs CHANGED
@@ -55,6 +55,12 @@ function sessionStorageAPI() {
55
55
  try {
56
56
  const item = JSON.parse(sessionStorage.getItem(keyPrefix + key));
57
57
 
58
+ if (shouldDeleteItem(item)) {
59
+ widget.sessionStorage.delete(key);
60
+
61
+ return undefined;
62
+ }
63
+
58
64
  return item && typeof item === 'object' ? item.value : undefined;
59
65
  } catch (error) {
60
66
  throw new Error(
@@ -70,10 +76,13 @@ function sessionStorageAPI() {
70
76
  * @param {object} widget A widget object.
71
77
  * @param {string} key A key
72
78
  * @param {*} value A value
79
+ * @param {object} [options] An options object.
80
+ * @param {number} [options.ttl] Number of milliseconds after which the
81
+ * value should be removed.
73
82
  * @return {boolean} It's `true` when the operation was successful,
74
83
  * otherwise `false`.
75
84
  */
76
- set(widget, key, value) {
85
+ set(widget, key, value, options) {
77
86
  const {
78
87
  $dependencies: { sessionStorage },
79
88
  $in: {
@@ -85,14 +94,23 @@ function sessionStorageAPI() {
85
94
  return false;
86
95
  }
87
96
 
97
+ const item = {
98
+ created: Date.now(),
99
+ value,
100
+ };
101
+
102
+ if (options && Number.isFinite(Number.parseInt(options.ttl))) {
103
+ item.ttl = Number.parseInt(options.ttl);
104
+ }
105
+
106
+ if (shouldDeleteItem(item)) {
107
+ widget.sessionStorage.delete(key);
108
+
109
+ return true;
110
+ }
111
+
88
112
  try {
89
- sessionStorage.setItem(
90
- keyPrefix + key,
91
- JSON.stringify({
92
- created: Date.now(),
93
- value,
94
- }),
95
- );
113
+ sessionStorage.setItem(keyPrefix + key, JSON.stringify(item));
96
114
  } catch (error) {
97
115
  console.error(error);
98
116
 
@@ -126,5 +144,20 @@ function getNativeSessionStorage() {
126
144
  return typeof window === 'undefined' ? undefined : window.sessionStorage;
127
145
  }
128
146
 
147
+ function shouldDeleteItem(item) {
148
+ if (!item || !('ttl' in item) || !item.created) {
149
+ return false;
150
+ }
151
+
152
+ if (item.ttl <= 0) {
153
+ return true;
154
+ }
155
+
156
+ const now = Date.now();
157
+ const age = now - item.created;
158
+
159
+ return age > item.ttl;
160
+ }
161
+
129
162
  exports.sessionStoragePlugin = sessionStoragePlugin;
130
163
  exports.setKeyPrefix = setKeyPrefix;
package/lib/index.es9.cjs CHANGED
@@ -41,6 +41,10 @@ function sessionStorageAPI() {
41
41
  }
42
42
  try {
43
43
  const item = JSON.parse(sessionStorage.getItem(keyPrefix + key));
44
+ if (shouldDeleteItem(item)) {
45
+ widget.sessionStorage.delete(key);
46
+ return undefined;
47
+ }
44
48
  return item && typeof item === 'object' ? item.value : undefined;
45
49
  } catch (error) {
46
50
  throw new Error(`merkur.plugin-session-storage.get: Failed to parse a session storage item value identified by the key ${keyPrefix + key}: ${error.message}`);
@@ -51,10 +55,13 @@ function sessionStorageAPI() {
51
55
  * @param {object} widget A widget object.
52
56
  * @param {string} key A key
53
57
  * @param {*} value A value
58
+ * @param {object} [options] An options object.
59
+ * @param {number} [options.ttl] Number of milliseconds after which the
60
+ * value should be removed.
54
61
  * @return {boolean} It's `true` when the operation was successful,
55
62
  * otherwise `false`.
56
63
  */
57
- set(widget, key, value) {
64
+ set(widget, key, value, options) {
58
65
  const {
59
66
  $dependencies: {
60
67
  sessionStorage
@@ -68,11 +75,19 @@ function sessionStorageAPI() {
68
75
  if (!sessionStorage) {
69
76
  return false;
70
77
  }
78
+ const item = {
79
+ created: Date.now(),
80
+ value
81
+ };
82
+ if (options && Number.isFinite(Number.parseInt(options.ttl))) {
83
+ item.ttl = Number.parseInt(options.ttl);
84
+ }
85
+ if (shouldDeleteItem(item)) {
86
+ widget.sessionStorage.delete(key);
87
+ return true;
88
+ }
71
89
  try {
72
- sessionStorage.setItem(keyPrefix + key, JSON.stringify({
73
- created: Date.now(),
74
- value
75
- }));
90
+ sessionStorage.setItem(keyPrefix + key, JSON.stringify(item));
76
91
  } catch (error) {
77
92
  console.error(error);
78
93
  return false;
@@ -102,5 +117,16 @@ function sessionStorageAPI() {
102
117
  function getNativeSessionStorage() {
103
118
  return typeof window === 'undefined' ? undefined : window.sessionStorage;
104
119
  }
120
+ function shouldDeleteItem(item) {
121
+ if (!item || !('ttl' in item) || !item.created) {
122
+ return false;
123
+ }
124
+ if (item.ttl <= 0) {
125
+ return true;
126
+ }
127
+ const now = Date.now();
128
+ const age = now - item.created;
129
+ return age > item.ttl;
130
+ }
105
131
  exports.sessionStoragePlugin = sessionStoragePlugin;
106
132
  exports.setKeyPrefix = setKeyPrefix;
package/lib/index.es9.mjs CHANGED
@@ -39,6 +39,10 @@ function sessionStorageAPI() {
39
39
  }
40
40
  try {
41
41
  const item = JSON.parse(sessionStorage.getItem(keyPrefix + key));
42
+ if (shouldDeleteItem(item)) {
43
+ widget.sessionStorage.delete(key);
44
+ return undefined;
45
+ }
42
46
  return item && typeof item === 'object' ? item.value : undefined;
43
47
  } catch (error) {
44
48
  throw new Error(`merkur.plugin-session-storage.get: Failed to parse a session storage item value identified by the key ${keyPrefix + key}: ${error.message}`);
@@ -49,10 +53,13 @@ function sessionStorageAPI() {
49
53
  * @param {object} widget A widget object.
50
54
  * @param {string} key A key
51
55
  * @param {*} value A value
56
+ * @param {object} [options] An options object.
57
+ * @param {number} [options.ttl] Number of milliseconds after which the
58
+ * value should be removed.
52
59
  * @return {boolean} It's `true` when the operation was successful,
53
60
  * otherwise `false`.
54
61
  */
55
- set(widget, key, value) {
62
+ set(widget, key, value, options) {
56
63
  const {
57
64
  $dependencies: {
58
65
  sessionStorage
@@ -66,11 +73,19 @@ function sessionStorageAPI() {
66
73
  if (!sessionStorage) {
67
74
  return false;
68
75
  }
76
+ const item = {
77
+ created: Date.now(),
78
+ value
79
+ };
80
+ if (options && Number.isFinite(Number.parseInt(options.ttl))) {
81
+ item.ttl = Number.parseInt(options.ttl);
82
+ }
83
+ if (shouldDeleteItem(item)) {
84
+ widget.sessionStorage.delete(key);
85
+ return true;
86
+ }
69
87
  try {
70
- sessionStorage.setItem(keyPrefix + key, JSON.stringify({
71
- created: Date.now(),
72
- value
73
- }));
88
+ sessionStorage.setItem(keyPrefix + key, JSON.stringify(item));
74
89
  } catch (error) {
75
90
  console.error(error);
76
91
  return false;
@@ -100,4 +115,15 @@ function sessionStorageAPI() {
100
115
  function getNativeSessionStorage() {
101
116
  return typeof window === 'undefined' ? undefined : window.sessionStorage;
102
117
  }
118
+ function shouldDeleteItem(item) {
119
+ if (!item || !('ttl' in item) || !item.created) {
120
+ return false;
121
+ }
122
+ if (item.ttl <= 0) {
123
+ return true;
124
+ }
125
+ const now = Date.now();
126
+ const age = now - item.created;
127
+ return age > item.ttl;
128
+ }
103
129
  export { sessionStoragePlugin, setKeyPrefix };
package/lib/index.js CHANGED
@@ -55,6 +55,12 @@ function sessionStorageAPI() {
55
55
  try {
56
56
  const item = JSON.parse(sessionStorage.getItem(keyPrefix + key));
57
57
 
58
+ if (shouldDeleteItem(item)) {
59
+ widget.sessionStorage.delete(key);
60
+
61
+ return undefined;
62
+ }
63
+
58
64
  return item && typeof item === 'object' ? item.value : undefined;
59
65
  } catch (error) {
60
66
  throw new Error(
@@ -70,10 +76,13 @@ function sessionStorageAPI() {
70
76
  * @param {object} widget A widget object.
71
77
  * @param {string} key A key
72
78
  * @param {*} value A value
79
+ * @param {object} [options] An options object.
80
+ * @param {number} [options.ttl] Number of milliseconds after which the
81
+ * value should be removed.
73
82
  * @return {boolean} It's `true` when the operation was successful,
74
83
  * otherwise `false`.
75
84
  */
76
- set(widget, key, value) {
85
+ set(widget, key, value, options) {
77
86
  const {
78
87
  $dependencies: { sessionStorage },
79
88
  $in: {
@@ -85,14 +94,23 @@ function sessionStorageAPI() {
85
94
  return false;
86
95
  }
87
96
 
97
+ const item = {
98
+ created: Date.now(),
99
+ value,
100
+ };
101
+
102
+ if (options && Number.isFinite(Number.parseInt(options.ttl))) {
103
+ item.ttl = Number.parseInt(options.ttl);
104
+ }
105
+
106
+ if (shouldDeleteItem(item)) {
107
+ widget.sessionStorage.delete(key);
108
+
109
+ return true;
110
+ }
111
+
88
112
  try {
89
- sessionStorage.setItem(
90
- keyPrefix + key,
91
- JSON.stringify({
92
- created: Date.now(),
93
- value,
94
- }),
95
- );
113
+ sessionStorage.setItem(keyPrefix + key, JSON.stringify(item));
96
114
  } catch (error) {
97
115
  console.error(error);
98
116
 
@@ -126,5 +144,20 @@ function getNativeSessionStorage() {
126
144
  return typeof window === 'undefined' ? undefined : window.sessionStorage;
127
145
  }
128
146
 
147
+ function shouldDeleteItem(item) {
148
+ if (!item || !('ttl' in item) || !item.created) {
149
+ return false;
150
+ }
151
+
152
+ if (item.ttl <= 0) {
153
+ return true;
154
+ }
155
+
156
+ const now = Date.now();
157
+ const age = now - item.created;
158
+
159
+ return age > item.ttl;
160
+ }
161
+
129
162
  exports.sessionStoragePlugin = sessionStoragePlugin;
130
163
  exports.setKeyPrefix = setKeyPrefix;
package/lib/index.mjs CHANGED
@@ -53,6 +53,12 @@ function sessionStorageAPI() {
53
53
  try {
54
54
  const item = JSON.parse(sessionStorage.getItem(keyPrefix + key));
55
55
 
56
+ if (shouldDeleteItem(item)) {
57
+ widget.sessionStorage.delete(key);
58
+
59
+ return undefined;
60
+ }
61
+
56
62
  return item && typeof item === 'object' ? item.value : undefined;
57
63
  } catch (error) {
58
64
  throw new Error(
@@ -68,10 +74,13 @@ function sessionStorageAPI() {
68
74
  * @param {object} widget A widget object.
69
75
  * @param {string} key A key
70
76
  * @param {*} value A value
77
+ * @param {object} [options] An options object.
78
+ * @param {number} [options.ttl] Number of milliseconds after which the
79
+ * value should be removed.
71
80
  * @return {boolean} It's `true` when the operation was successful,
72
81
  * otherwise `false`.
73
82
  */
74
- set(widget, key, value) {
83
+ set(widget, key, value, options) {
75
84
  const {
76
85
  $dependencies: { sessionStorage },
77
86
  $in: {
@@ -83,14 +92,23 @@ function sessionStorageAPI() {
83
92
  return false;
84
93
  }
85
94
 
95
+ const item = {
96
+ created: Date.now(),
97
+ value,
98
+ };
99
+
100
+ if (options && Number.isFinite(Number.parseInt(options.ttl))) {
101
+ item.ttl = Number.parseInt(options.ttl);
102
+ }
103
+
104
+ if (shouldDeleteItem(item)) {
105
+ widget.sessionStorage.delete(key);
106
+
107
+ return true;
108
+ }
109
+
86
110
  try {
87
- sessionStorage.setItem(
88
- keyPrefix + key,
89
- JSON.stringify({
90
- created: Date.now(),
91
- value,
92
- }),
93
- );
111
+ sessionStorage.setItem(keyPrefix + key, JSON.stringify(item));
94
112
  } catch (error) {
95
113
  console.error(error);
96
114
 
@@ -124,4 +142,19 @@ function getNativeSessionStorage() {
124
142
  return typeof window === 'undefined' ? undefined : window.sessionStorage;
125
143
  }
126
144
 
145
+ function shouldDeleteItem(item) {
146
+ if (!item || !('ttl' in item) || !item.created) {
147
+ return false;
148
+ }
149
+
150
+ if (item.ttl <= 0) {
151
+ return true;
152
+ }
153
+
154
+ const now = Date.now();
155
+ const age = now - item.created;
156
+
157
+ return age > item.ttl;
158
+ }
159
+
127
160
  export { sessionStoragePlugin, setKeyPrefix };
package/lib/index.umd.js CHANGED
@@ -1 +1 @@
1
- !function(e,n){if("function"==typeof define&&define.amd)define("@merkur/plugin-session-storage",["exports","@merkur/core"],n);else if("undefined"!=typeof exports)n(exports,require("@merkur/core"));else{var t={exports:{}};n(t.exports,e.Merkur.Core),e.merkurPluginSessionStorage=t.exports}}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:this,(function(e,n){function t(e){return t="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},t(e)}function r(e,n,t,r,o,i,s){try{var u=e[i](s),a=u.value}catch(e){return void t(e)}u.done?n(a):Promise.resolve(a).then(r,o)}function o(e){return function(){var n=this,t=arguments;return new Promise((function(o,i){var s=e.apply(n,t);function u(e){r(s,o,i,u,a,"next",e)}function a(e){r(s,o,i,u,a,"throw",e)}u(void 0)}))}}function i(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,n){if(!e)return;if("string"==typeof e)return s(e,n);var t=Object.prototype.toString.call(e).slice(8,-1);"Object"===t&&e.constructor&&(t=e.constructor.name);if("Map"===t||"Set"===t)return Array.from(e);if("Arguments"===t||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t))return s(e,n)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,n){(null==n||n>e.length)&&(n=e.length);for(var t=0,r=new Array(n);t<n;t++)r[t]=e[t];return r}Object.defineProperty(e,"__esModule",{value:!0}),e.sessionStoragePlugin=function(){return{setup:function(e){return o((function*(){return(0,n.assignMissingKeys)(e,{sessionStorage:{get:function(e,n){var r=e.$dependencies.sessionStorage,o=e.$in.sessionStorage.keyPrefix;if(!r)return null;try{var i=JSON.parse(r.getItem(o+n));return i&&"object"===t(i)?i.value:void 0}catch(e){throw new Error("merkur.plugin-session-storage.get: Failed to parse a session storage item value identified by the key ".concat(o+n,": ").concat(e.message))}},set:function(e,n,t){var r=e.$dependencies.sessionStorage,o=e.$in.sessionStorage.keyPrefix;if(!r)return!1;try{r.setItem(o+n,JSON.stringify({created:Date.now(),value:t}))}catch(e){return console.error(e),!1}return!0},delete:function(e,n){var t=e.$dependencies.sessionStorage,r=e.$in.sessionStorage.keyPrefix;return!!t&&(t.removeItem(r+n),!0)}}}),e.$in.sessionStorage={},a(e),e.$dependencies.sessionStorage="undefined"==typeof window?void 0:window.sessionStorage,e}))()},create:function(e){return o((function*(){return(0,n.bindWidgetToFunctions)(e,e.sessionStorage),e}))()}}},e.setKeyPrefix=a;var u="__";function a(e){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],t=arguments.length>2&&void 0!==arguments[2]?arguments[2]:["widget",e.name,e.version],r=[].concat(i(t),i(n)).filter(Boolean),o="".concat(u).concat(r.join(u)).concat(u);e.$in.sessionStorage.keyPrefix=o}}));
1
+ !function(e,t){if("function"==typeof define&&define.amd)define("@merkur/plugin-session-storage",["exports","@merkur/core"],t);else if("undefined"!=typeof exports)t(exports,require("@merkur/core"));else{var n={exports:{}};t(n.exports,e.Merkur.Core),e.merkurPluginSessionStorage=n.exports}}("undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:this,(function(e,t){function n(e){return n="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},n(e)}function r(e,t,n,r,o,i,s){try{var u=e[i](s),a=u.value}catch(e){return void n(e)}u.done?t(a):Promise.resolve(a).then(r,o)}function o(e){return function(){var t=this,n=arguments;return new Promise((function(o,i){var s=e.apply(t,n);function u(e){r(s,o,i,u,a,"next",e)}function a(e){r(s,o,i,u,a,"throw",e)}u(void 0)}))}}function i(e){return function(e){if(Array.isArray(e))return s(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||function(e,t){if(!e)return;if("string"==typeof e)return s(e,t);var n=Object.prototype.toString.call(e).slice(8,-1);"Object"===n&&e.constructor&&(n=e.constructor.name);if("Map"===n||"Set"===n)return Array.from(e);if("Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return s(e,t)}(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}Object.defineProperty(e,"__esModule",{value:!0}),e.sessionStoragePlugin=function(){return{setup:function(e){return o((function*(){return(0,t.assignMissingKeys)(e,{sessionStorage:{get:function(e,t){var r=e.$dependencies.sessionStorage,o=e.$in.sessionStorage.keyPrefix;if(!r)return null;try{var i=JSON.parse(r.getItem(o+t));return f(i)?void e.sessionStorage.delete(t):i&&"object"===n(i)?i.value:void 0}catch(e){throw new Error("merkur.plugin-session-storage.get: Failed to parse a session storage item value identified by the key ".concat(o+t,": ").concat(e.message))}},set:function(e,t,n,r){var o=e.$dependencies.sessionStorage,i=e.$in.sessionStorage.keyPrefix;if(!o)return!1;var s={created:Date.now(),value:n};if(r&&Number.isFinite(Number.parseInt(r.ttl))&&(s.ttl=Number.parseInt(r.ttl)),f(s))return e.sessionStorage.delete(t),!0;try{o.setItem(i+t,JSON.stringify(s))}catch(e){return console.error(e),!1}return!0},delete:function(e,t){var n=e.$dependencies.sessionStorage,r=e.$in.sessionStorage.keyPrefix;return!!n&&(n.removeItem(r+t),!0)}}}),e.$in.sessionStorage={},a(e),e.$dependencies.sessionStorage="undefined"==typeof window?void 0:window.sessionStorage,e}))()},create:function(e){return o((function*(){return(0,t.bindWidgetToFunctions)(e,e.sessionStorage),e}))()}}},e.setKeyPrefix=a;var u="__";function a(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:["widget",e.name,e.version],r=[].concat(i(n),i(t)).filter(Boolean),o="".concat(u).concat(r.join(u)).concat(u);e.$in.sessionStorage.keyPrefix=o}function f(e){return!!(e&&"ttl"in e&&e.created)&&(e.ttl<=0||Date.now()-e.created>e.ttl)}}));
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@merkur/plugin-session-storage",
3
- "version": "0.33.0",
3
+ "version": "0.34.1",
4
4
  "description": "Merkur session storage.",
5
5
  "main": "lib/index",
6
6
  "module": "lib/index",
@@ -48,10 +48,10 @@
48
48
  },
49
49
  "homepage": "https://merkur.js.org/",
50
50
  "devDependencies": {
51
- "@merkur/core": "^0.33.0"
51
+ "@merkur/core": "^0.34.0"
52
52
  },
53
53
  "peerDependencies": {
54
54
  "@merkur/core": "*"
55
55
  },
56
- "gitHead": "3e88b57abfad267ac3f3b20b2ae6bf50f93f5375"
56
+ "gitHead": "bc4804eb04687f272dce2c4e63f9111b192f9d24"
57
57
  }