storage.js.map
13.7 KB
{"version":3,"sources":["storage.js"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA,IAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;;;;IAIvB,YAAY;YAAZ,YAAY;;AAEL,WAFP,YAAY,CAEJ,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;0BAF/C,YAAY;;AAGd,+BAHE,YAAY,6CAGR,SAAS,EAAE;AACjB,QAAI,CAAC,QAAQ,GAAK,OAAO,CAAC;AAC1B,QAAI,CAAC,IAAI,GAAS,GAAG,CAAC;AACtB,QAAI,CAAC,IAAI,GAAS,GAAG,CAAC;AACtB,QAAI,CAAC,SAAS,GAAI,QAAQ,CAAC;AAC3B,QAAI,CAAC,SAAS,GAAI,QAAQ,CAAC;GAC5B;;;;;eATG,YAAY;;SAWT,eAAG;AACR,aAAO,IAAI,CAAC,IAAI,CAAC;KAClB;;;SACc,eAAG;AAChB,aAAO,IAAI,CAAC,QAAQ,CAAC;KACtB;;;SACM,eAAG;AACR,aAAO,IAAI,CAAC,IAAI,CAAC;KAClB;;;SACW,eAAG;AACb,aAAO,IAAI,CAAC,SAAS,CAAC;KACvB;;;SACW,eAAG;AACb,aAAO,IAAI,CAAC,SAAS,CAAC;KACvB;;;SAzBG,YAAY;GAAS,GAAG,CAAC,KAAK;;IA+B9B,WAAW;AAEJ,WAFP,WAAW,GAED;0BAFV,WAAW;;AAGb,QAAI,CAAC,MAAM,GAAO,UAAS,CAAA;AAC3B,QAAI,CAAC,SAAS,GAAI,EAAE,CAAC;GACtB;;;;;;;eALG,WAAW;;WASV,eAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE;;;;;;AACrC,0CAA8B,IAAI,CAAC,SAAS,4GAAE;;;cAApC,OAAO;cAAE,OAAM;;AACvB,cAAI,OAAO,KAAK,MAAM,EACpB,SAAS;AACX,cAAM,MAAK,GAAG,IAAI,YAAY,CAAC,OAAO,EAAE,OAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACvF,iBAAM,CAAC,aAAa,CAAC,MAAK,CAAC,CAAC;SAC7B;;;;;;;;;;;;;;;KACF;;;;;;;WAQE,aAAC,KAAK,EAAE;AACT,UAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACpC,UAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;AAC7B,WAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,CAAC;AAC5B,YAAI,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC;OAAA,AACzB,OAAO,IAAI,CAAC,KAAK,CAAC;KACnB;;;;;WAGE,aAAC,GAAG,EAAE;AACP,aAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;KAC3D;;;;;;WAIE,aAAC,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE;AACtB,UAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,UAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;AAC5B,UAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC;KAC1C;;;;;WAGK,gBAAC,MAAM,EAAE,GAAG,EAAE;AAClB,UAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AACtC,UAAI,CAAC,MAAM,UAAO,CAAC,GAAG,CAAC,CAAC;AACxB,UAAI,CAAC,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,QAAQ,CAAC,CAAC;KACnC;;;;;WAGI,eAAC,MAAM,EAAE;AACZ,UAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;AACpB,UAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;KACpB;;;WAMO,oBAAG;AACT,aAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC;KAC/B;;;;;WAGQ,mBAAC,OAAO,EAAE,MAAM,EAAE;AACzB,UAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC;KACxC;;;SAlDS,eAAG;AACX,aAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;KACzB;;;SAqCQ,eAAG;AACV,0CAAW,IAAI,CAAC,MAAM,GAAE;KACzB;;;SA5DG,WAAW;;;IA2EX,OAAO;AAEA,WAFP,OAAO,CAEC,IAAI,EAAE;0BAFd,OAAO;;AAGT,QAAI,CAAC,KAAK,GAAG,IAAI,CAAC;GACnB;;;;;;;;eAJG,OAAO;;;;;;WAgBR,aAAC,KAAK,EAAE;AACT,aAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;KAC9B;;;;;;;WAKM,iBAAC,GAAG,EAAE;AACX,aAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;KACvC;;;;;;;WAKM,iBAAC,GAAG,EAAE,KAAK,EAAE;AAClB,UAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC;KAC7C;;;;;;;WAKS,oBAAC,GAAG,EAAE;AACd,UAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC;KACzC;;;;;;;WAKI,iBAAG;AACN,UAAI,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;KACxB;;;;;WAGG,gBAA0B;UAAzB,MAAM,yDAAG,OAAO,CAAC,MAAM;;AAC1B,aAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;KAChC;;;SA1CS,eAAG;AACX,aAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;KAC1B;;;SAXG,OAAO;;;IA2DP,QAAQ;AAED,WAFP,QAAQ,GAEE;0BAFV,QAAQ;;AAGV,QAAI,CAAC,OAAO,GAAM,UAAS,CAAC;AAC5B,QAAI,CAAC,SAAS,GAAI,UAAS,CAAC;GAC7B;;;;eALG,QAAQ;;WAQP,eAAC,IAAI,EAAE;AACV,UAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;AAC5C,aAAO,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;KAC5C;;;;;WAGM,iBAAC,IAAI,EAAE;AACZ,UAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,EAC3B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,CAAC;AAC9C,aAAO,IAAI,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;KAC9C;;;;;WAGK,gBAAC,MAAM,EAAE;AACb,UAAM,QAAQ,GAAG,IAAI,CAAC;AACtB,YAAM,CAAC,YAAY,GAAG,YAAY,CAAC;AACnC,+BAAwB,MAAM,EAAE;AAC9B,oBAAY,EAAE;AACZ,aAAG,EAAA,eAAG;gBACI,QAAQ,GAAK,IAAI,CAAjB,QAAQ;;AAChB,gBAAI,CAAC,QAAQ,CAAC,aAAa,EACzB,QAAQ,CAAC,aAAa,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AAClE,mBAAO,QAAQ,CAAC,aAAa,CAAC;WAC/B;SACF;;AAED,sBAAc,EAAE;AACd,aAAG,EAAA,eAAG;gBACI,QAAQ,GAAK,IAAI,CAAjB,QAAQ;;AAChB,gBAAI,CAAC,QAAQ,CAAC,eAAe,EAC3B,QAAQ,CAAC,eAAe,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;AACtE,mBAAO,QAAQ,CAAC,eAAe,CAAC;WACjC;SACF;OACF,CAAC,CAAC;KACJ;;;;;WAGG,gBAA0B;UAAzB,MAAM,yDAAG,OAAO,CAAC,MAAM;;;;;;AAC1B,2CAA2B,IAAI,CAAC,OAAO,iHAAE;;;cAA/B,MAAM;cAAE,IAAI;;AACpB,gBAAM,CAAC,KAAK,CAAI,MAAM,eAAY,CAAC;;;;;;AACnC,+CAA0B,IAAI,CAAC,KAAK;;;kBAA1B,KAAI;kBAAE,KAAK;;AACnB,oBAAM,CAAC,KAAK,QAAM,KAAI,WAAM,KAAK,QAAK,CAAC;aAAA;;;;;;;;;;;;;;;SAC1C;;;;;;;;;;;;;;;;;;;;;AACD,2CAA2B,IAAI,CAAC,SAAS,iHAAE;;;cAAjC,MAAM;cAAE,IAAI;;AACpB,gBAAM,CAAC,IAAI,CAAI,MAAM,iBAAc,CAAC;;;;;;AACpC,+CAA0B,IAAI,CAAC,KAAK;;;kBAA1B,MAAI;kBAAE,KAAK;;AACnB,oBAAM,CAAC,KAAK,QAAM,MAAI,WAAM,KAAK,QAAK,CAAC;aAAA;;;;;;;;;;;;;;;SAC1C;;;;;;;;;;;;;;;KACF;;;;;WAGG,gBAAG;AACL,UAAM,UAAU,GAAG,iBAAe,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAG,CAAC;;;;;;AAC9D,2CAA2B,IAAI,CAAC,OAAO,iHAAE;;;cAA/B,MAAM;cAAE,IAAI;;AACpB,cAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,cAAI,KAAK,CAAC,MAAM,EAAE;AAChB,sBAAU,CAAC,IAAI,CAAI,MAAM,aAAU,CAAC;;;;;;AACpC,iDAA0B,IAAI,CAAC,KAAK;;;oBAA1B,MAAI;oBAAE,KAAK;;AACnB,0BAAU,CAAC,IAAI,QAAM,MAAM,CAAC,MAAI,CAAC,WAAM,MAAM,CAAC,KAAK,CAAC,CAAG,CAAC;eAAA;;;;;;;;;;;;;;;WAC3D;SACF;;;;;;;;;;;;;;;;;;;;;AACD,2CAA2B,IAAI,CAAC,SAAS,iHAAE;;;cAAjC,MAAM;cAAE,IAAI;;AACpB,cAAI,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;AACvB,cAAI,KAAK,CAAC,MAAM,EAAE;AAChB,sBAAU,CAAC,IAAI,CAAI,MAAM,eAAY,CAAC;;;;;;AACtC,iDAA0B,IAAI,CAAC,KAAK;;;oBAA1B,MAAI;oBAAE,KAAK;;AACnB,0BAAU,CAAC,IAAI,QAAM,MAAM,CAAC,MAAI,CAAC,WAAM,MAAM,CAAC,KAAK,CAAC,CAAG,CAAC;eAAA;;;;;;;;;;;;;;;WAC3D;SACF;;;;;;;;;;;;;;;;AACD,aAAO,UAAU,CAAC,IAAI,MAAM,OAAO,CAAC;KACrC;;;;;WAGG,cAAC,UAAU,EAAE;AACf,UAAI,OAAO,GAAG,IAAI,CAAC;;;;;;AACnB,4CAAiB,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,sHAAE;cAAjC,IAAI;;AACX,cAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,IAAI,KAAK,EAAE,EAChC,SAAS;AACX,cAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE;8BACE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;;;;gBAA7B,GAAG;gBAAE,KAAK;;AACjB,gBAAI,OAAO,EACT,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAE9D,MAAM,IAAI,KAAK,CAAC,oDAAoD,CAAC,CAAC;WACzE,MAAM;+BACkB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC;;;;gBAA/B,MAAM;gBAAE,IAAI;;AACnB,gBAAI,IAAI,KAAK,QAAQ,EACnB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,KAC1B,IAAI,IAAI,KAAK,UAAU,EAC1B,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,KAE/B,MAAM,IAAI,KAAK,0BAAwB,IAAI,CAAG,CAAC;WAClD;SACF;;;;;;;;;;;;;;;KACF;;;SAxGG,QAAQ;;;AA4Gd,MAAM,CAAC,OAAO,GAAG,QAAQ,CAAC","file":"storage.js","sourcesContent":["// See [Web Storage](http://dev.w3.org/html5/webstorage/)\nconst DOM = require('./dom');\n\n\n// Implementation of the StorageEvent.\nclass StorageEvent extends DOM.Event {\n\n constructor(storage, url, key, oldValue, newValue) {\n super('storage');\n this._storage = storage;\n this._url = url;\n this._key = key;\n this._oldValue = oldValue;\n this._newValue = newValue;\n }\n\n get url() {\n return this._url;\n }\n get storageArea() {\n return this._storage;\n }\n get key() {\n return this._key;\n }\n get oldValue() {\n return this._oldValue;\n }\n get newValue() {\n return this._newValue;\n }\n}\n\n\n// Storage area. The storage area is shared by multiple documents of the same\n// origin. For session storage, they must also share the same browsing context.\nclass StorageArea {\n\n constructor() {\n this._items = new Map()\n this._storages = [];\n }\n\n // Fire a storage event. Fire in all documents that share this storage area,\n // except for the source document.\n _fire(source, key, oldValue, newValue) {\n for (let [storage, window] of this._storages) {\n if (storage === source)\n continue;\n const event = new StorageEvent(storage, window.location.href, key, oldValue, newValue);\n window.dispatchEvent(event);\n }\n }\n\n // Return number of key/value pairs.\n get length() {\n return this._items.size;\n }\n\n // Get key by ordinal position.\n key(index) {\n const iterator = this._items.keys();\n let next = iterator.next();\n for (let i = 0; i < index; ++i)\n next = iterator.next();\n return next.value;\n }\n\n // Get value from key\n get(key) {\n return this._items.has(key) ? this._items.get(key) : null;\n }\n\n // Set the value of a key. We also need the source storage (so we don't send\n // it a storage event).\n set(source, key, value) {\n const oldValue = this._items.get(key);\n this._items.set(key, value);\n this._fire(source, key, oldValue, value);\n }\n\n // Remove the value at the key. We also need source storage (see set above).\n remove(source, key) {\n const oldValue = this._items.get(key);\n this._items.delete(key);\n this._fire(source, key, oldValue);\n }\n\n // Remove all values. We also need source storage (see set above).\n clear(source) {\n this._items.clear();\n this._fire(source);\n }\n\n get pairs() {\n return [...this._items];\n }\n\n toString() {\n return this._items.toString();\n }\n\n // Associate local/sessionStorage and window with this storage area. Used when firing events.\n associate(storage, window) {\n this._storages.push([storage, window]);\n }\n\n}\n\n\n// Implementation of the Storage interface, used by local and session storage.\nclass Storage {\n\n constructor(area) {\n this._area = area;\n }\n\n // ### storage.length => Number\n //\n // Returns the number of key/value pairs in this storage.\n get length() {\n return this._area.length;\n }\n\n // ### storage.key(index) => String\n //\n // Returns the key at this position.\n key(index) {\n return this._area.key(index);\n }\n\n // ### storage.getItem(key) => Object\n //\n // Returns item by key.\n getItem(key) {\n return this._area.get(key.toString());\n }\n\n // ### storage.setItem(key, Object)\n //\n // Add item or change value of existing item.\n setItem(key, value) {\n this._area.set(this, key.toString(), value);\n }\n\n // ### storage.removeItem(key)\n //\n // Remove item.\n removeItem(key) {\n this._area.remove(this, key.toString());\n }\n\n // ### storage.clear()\n //\n // Remove all items.\n clear() {\n this._area.clear(this);\n }\n\n // Dump to a string, useful for debugging.\n dump(output = process.stdout) {\n return this._area.dump(output);\n }\n\n}\n\n\n\n\n// Combined local/session storage.\nclass Storages {\n\n constructor() {\n this._locals = new Map();\n this._sessions = new Map();\n }\n\n // Return local Storage based on the document origin (hostname/port).\n local(host) {\n if (!this._locals.has(host))\n this._locals.set(host, new StorageArea());\n return new Storage(this._locals.get(host));\n }\n\n // Return session Storage based on the document origin (hostname/port).\n session(host) {\n if (!this._sessions.has(host))\n this._sessions.set(host, new StorageArea());\n return new Storage(this._sessions.get(host));\n }\n\n // Extend window with local/session storage support.\n extend(window) {\n const storages = this;\n window.StorageEvent = StorageEvent;\n Object.defineProperties(window, {\n localStorage: {\n get() {\n const { document } = this;\n if (!document._localStorage)\n document._localStorage = storages.local(document.location.host);\n return document._localStorage;\n }\n },\n\n sessionStorage: {\n get() {\n const { document } = this;\n if (!document._sessionStorage)\n document._sessionStorage = storages.session(document.location.host);\n return document._sessionStorage;\n }\n }\n });\n }\n\n // Used to dump state to console (debuggin)\n dump(output = process.stdout) {\n for (let [domain, area] of this._locals) {\n output.write(`${domain} local:\\n`);\n for (let [name, value] of area.pairs)\n output.write(` ${name} = ${value}\\n`);\n }\n for (let [domain, area] of this._sessions) {\n output.push(`${domain} session:\\n`);\n for (let [name, value] of area.pairs)\n output.write(` ${name} = ${value}\\n`);\n }\n }\n\n // browser.saveStorage uses this\n save() {\n const serialized = [`# Saved on ${new Date().toISOString()}`];\n for (let [domain, area] of this._locals) {\n let pairs = area.pairs;\n if (pairs.length) {\n serialized.push(`${domain} local:`);\n for (let [name, value] of area.pairs)\n serialized.push(` ${escape(name)} = ${escape(value)}`);\n }\n }\n for (let [domain, area] of this._sessions) {\n let pairs = area.pairs;\n if (pairs.length) {\n serialized.push(`${domain} session:`);\n for (let [name, value] of area.pairs)\n serialized.push(` ${escape(name)} = ${escape(value)}`);\n }\n }\n return serialized.join(`\\n`) + `\\n`;\n }\n\n // browser.loadStorage uses this\n load(serialized) {\n let storage = null;\n for (let item of serialized.split(/\\n+/)) {\n if (item[0] === '#' || item === '')\n continue;\n if (item[0] === ' ') {\n const [key, value] = item.split('=');\n if (storage)\n storage.setItem(unescape(key.trim()), unescape(value.trim()));\n else\n throw new Error('Must specify storage type using local: or session:');\n } else {\n const [domain, type] = item.split(' ');\n if (type === 'local:')\n storage = this.local(domain);\n else if (type === 'session:')\n storage = this.session(domain);\n else\n throw new Error(`Unkown storage type ${type}`);\n }\n }\n }\n}\n\n\nmodule.exports = Storages;\n\n"]}