From c6e328e968f04304f6b978a20cd7acb97f879a93 Mon Sep 17 00:00:00 2001 From: Piotr Kaminski Date: Wed, 11 Feb 2026 15:39:23 -0800 Subject: [PATCH] Upgrade to `lru-cache` 11. --- README.md | 4 +- dist/browser/firecrypt.js | 16 ++-- dist/browser/firecrypt.js.map | 2 +- dist/browser/firecrypt.min.js | 16 ++-- dist/browser/firecrypt.min.js.map | 2 +- dist/node/firecrypt.js | 16 ++-- dist/node/firecrypt.js.map | 2 +- eslint.config.mjs | 2 +- package.json | 2 +- src/crypto.js | 14 ++-- src/firecrypt.js | 2 +- tools/package-lock.json | 123 +++++++++++++++++++++++------- tools/package.json | 9 +-- tools/recrypt_worker.js | 8 +- yarn.lock | 10 +-- 15 files changed, 146 insertions(+), 82 deletions(-) diff --git a/README.md b/README.md index bc29348..bee6dbf 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ First: this library only makes sense if your clients sit behind a firewall, or i This library monkey-patches either the Firebase Admin SDK or the Firebase JavaScript Client SDK to automatically encrypt and decrypt keys and values of your choosing using AES-SIV, and to compress encrypted string values. Almost everything just works, except that `startAt` and `endAt` queries on encrypted data would produce randomly ordered results and so are forbidden. `equalTo` queries will work fine, however, since a given plaintext value will always encrypt to the same ciphertext — but it will also let an attacker know if any two values are equal, even if they don't know what they are. -The library works both in Node (20.x+) and in the browser. In the browser, you need to also load [`crypto-js`](https://github.com/brix/crypto-js) (the following modules are sufficient: `core.js`, `lib-typedarrays.js`, `enc-base64.js`, `enc-base64url.js`, `sha1.js`, `md5.js`, `evpkdf.js`, `cipher-core.js`, `aes.js`, `mode-ctr.js`) and [`cryptojs-extension`](https://github.com/artjomb/cryptojs-extension) (only `build/siv.js` is required). If you want to enable caching to enhance performance, then in the browser you'll also want to load [`node-lru-cache`](https://github.com/isaacs/node-lru-cache). All these libraries are automatically included in the Node distribution. +The library works both in Node (20.x+) and in the browser. In the browser, you need to also load [`crypto-js`](https://github.com/brix/crypto-js) (the following modules are sufficient: `core.js`, `lib-typedarrays.js`, `enc-base64.js`, `enc-base64url.js`, `sha1.js`, `md5.js`, `evpkdf.js`, `cipher-core.js`, `aes.js`, `mode-ctr.js`) and [`cryptojs-extension`](https://github.com/artjomb/cryptojs-extension) (only `build/siv.js` is required). If you want to enable caching to enhance performance, then in the browser you'll also want to load [`lru-cache`](https://github.com/isaacs/node-lru-cache) into the `lrucache` global variable. All these libraries are automatically included in the Node distribution. Upon requiring this library, the `admin.database()` or `firebase.database()` method as well as the `app.App.database()` methods are monkey-patched to return a custom `FireCrypt` instance in place of @@ -54,7 +54,7 @@ The `options` are as follows: * `keyCheckValue`: a value generated by a previous call to `configureFireCrypt()` used to verify that the `aes-siv` `key` used in both calls is the same. If a different key was used to generate the `keyCheckValue` then an error with `firecrypt === 'WRONG_KEY'` will be thrown. * For convenience, the `keyCheckValue` is also available at any time via `admin.database().encryptionKeyCheckValue` or `firebase.database().encryptionKeyCheckValue`. -* `cacheSize`: the maximum size in bytes of the encryption and decryption caches, used to improve performance. In the browser, the caches will only be activated if `LRUCache` is defined; it should conform to the API of [`node-lru-cache`](https://github.com/isaacs/node-lru-cache). You can also specify `encryptionCacheSize` and `decryptionCacheSize` separately. +* `cacheSize`: the maximum size in bytes of the encryption and decryption caches, used to improve performance. In the browser, the caches will only be activated if `lrucache.LRUCache` is defined; it should conform to the API of [`lru-cache`](https://github.com/isaacs/node-lru-cache). You can also specify `encryptionCacheSize` and `decryptionCacheSize` separately. * `compression`: the compression algorithm to use. Currently supported values are: * `deflate`: the classic, low-overhead deflate algorithm. * `none`: no compression. diff --git a/dist/browser/firecrypt.js b/dist/browser/firecrypt.js index 2b2996e..c205730 100644 --- a/dist/browser/firecrypt.js +++ b/dist/browser/firecrypt.js @@ -41,14 +41,14 @@ var firecrypt = (function (exports) { } this._compressionThreshold = options.compressionThreshold || 150; - if (typeof LRUCache === 'function') { - this._encryptionCache = new LRUCache({ - max: options.encryptionCacheSize, - length: this._computeCacheItemSize, + if (typeof lrucache !== 'undefined') { + this._encryptionCache = new lrucache.LRUCache({ + maxSize: options.encryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); - this._decryptionCache = new LRUCache({ - max: options.decryptionCacheSize, - length: this._computeCacheItemSize, + this._decryptionCache = new lrucache.LRUCache({ + maxSize: options.decryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); } @@ -921,7 +921,7 @@ var firecrypt = (function (exports) { if (typeof require !== 'undefined') { /* eslint-disable no-undef */ if (typeof fflate === 'undefined') global.fflate = require('fflate'); - if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache'); + if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache'); if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core'); require('crypto-js/lib-typedarrays'); require('crypto-js/enc-base64'); diff --git a/dist/browser/firecrypt.js.map b/dist/browser/firecrypt.js.map index e917213..ecafb81 100644 --- a/dist/browser/firecrypt.js.map +++ b/dist/browser/firecrypt.js.map @@ -1 +1 @@ -{"version":3,"file":"firecrypt.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof LRUCache === 'function') {\n this._encryptionCache = new LRUCache({\n max: options.encryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n this._decryptionCache = new LRUCache({\n max: options.decryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"firecrypt.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof lrucache !== 'undefined') {\n this._encryptionCache = new lrucache.LRUCache({\n maxSize: options.encryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n this._decryptionCache = new lrucache.LRUCache({\n maxSize: options.decryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":";;;EAAe,MAAM,cAAc,SAAS,KAAK,CAAC;EAClD,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE;EAC7B,IAAI,KAAK,CAAC,OAAO,CAAC;EAClB,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI;EACzB,EAAE;EACF;;ECHe,MAAM,MAAM,CAAC;EAC5B,EAAE,WAAW,CAAC,OAAO,EAAE,IAAI,EAAE;EAC7B,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,mBAAmB,CAAC,IAAI,CAAC;EAC/C,IAAI,IAAI,CAAC,eAAe,GAAG,EAAE;EAC7B,IAAI,IAAI,CAAC,KAAK,GAAG;EACjB,MAAM,WAAW,EAAE,CAAC,QAAQ,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;EACxF,KAAK;;EAEL,IAAI,QAAQ,OAAO,CAAC,WAAW;EAC/B,MAAM,KAAK,SAAS;EACpB,QAAQ,IAAI,CAAC,SAAS,GAAG,GAAG,IAAI;EAChC,UAAU,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC;EAC7C,UAAU,MAAM,QAAQ,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;EACjG,UAAU,MAAM,OAAO,GAAG,OAAO,CAAC,UAAU,GAAG,QAAQ,CAAC,UAAU;EAClE,UAAU,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW;EAC9C,UAAU,KAAK,CAAC,iBAAiB;EACjC,YAAY,CAAC,KAAK,CAAC,iBAAiB,GAAG,KAAK,CAAC,QAAQ,GAAG,OAAO,IAAI,EAAE,KAAK,CAAC,QAAQ;EACnF,UAAU,IAAI,OAAO,EAAE;EACvB,YAAY,KAAK,CAAC,OAAO,IAAI,OAAO,CAAC,UAAU;EAC/C,YAAY,KAAK,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU;EACjD,YAAY,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,QAAQ,GAAG,KAAK,CAAC,OAAO;EACxD,UAAU;EACV,UAAU,OAAO,OAAO,GAAG,QAAQ,GAAG,GAAG;EACzC,QAAQ,CAAC;EACT,QAAQ;EACR,MAAM,KAAK,MAAM;EACjB,QAAQ;EACR,MAAM;EACN,QAAQ,MAAM,IAAI,cAAc;EAChC,UAAU,CAAC,+BAA+B,EAAE,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;EAClF;EACA,IAAI,IAAI,CAAC,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,IAAI,GAAG;;EAEpE,IAAI,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE;EACzC,MAAM,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC;EACpD,QAAQ,OAAO,EAAE,OAAO,CAAC,mBAAmB;EAC5C,QAAQ,eAAe,EAAE,IAAI,CAAC,qBAAqB;EACnD,OAAO,CAAC;EACR,MAAM,IAAI,CAAC,gBAAgB,GAAG,IAAI,QAAQ,CAAC,QAAQ,CAAC;EACpD,QAAQ,OAAO,EAAE,OAAO,CAAC,mBAAmB;EAC5C,QAAQ,eAAe,EAAE,IAAI,CAAC,qBAAqB;EACnD,OAAO,CAAC;EACR,IAAI;;EAEJ,IAAI,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;EACvC;EACA,MAAM,IAAI,CAAC,gBAAgB,GAAG,EAAE,IAAI,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC;EACzE,MAAM,IAAI,CAAC,cAAc,GAAG,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC;EAChE;EACA,IAAI;EACJ,EAAE;;EAEF,EAAE,mBAAmB,CAAC,GAAG,EAAE,IAAI,EAAE;EACjC,IAAI,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;EACjC,IAAI,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE;EAC5B,MAAM,IAAI,GAAG,KAAK,UAAU,EAAE;EAC9B,QAAQ,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;EACjD,QAAQ,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE;EAC9C,UAAU,IAAI,UAAU,KAAK,KAAK,IAAI,UAAU,KAAK,OAAO,IAAI,UAAU,KAAK,KAAK,EAAE;EACtF,YAAY,MAAM,IAAI,cAAc,CAAC,CAAC,yBAAyB,EAAE,UAAU,CAAC,CAAC,EAAE,UAAU,CAAC;EAC1F,UAAU;EACV,QAAQ;EACR,MAAM,CAAC,MAAM;EACb;EACA,QAAQ,IAAI,+BAA+B,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE;EACnF,UAAU,MAAM,IAAI,cAAc,CAAC,CAAC,wCAAwC,EAAE,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;EAChG,QAAQ;EACR,QAAQ,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,IAAI,GAAG,GAAG,GAAG,CAAC;EACpE,MAAM;EACN,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;EAC3B,QAAQ,KAAK,GAAG;EAChB,UAAU,IAAI,GAAG,KAAK,GAAG,EAAE;EAC3B,UAAU,IAAI,GAAG,CAAC,CAAC,EAAE;EACrB,YAAY,MAAM,IAAI,cAAc;EACpC,cAAc,CAAC,2CAA2C,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,CAAC;EAC/E,UAAU;EACV,UAAU,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;EAC1B,UAAU,OAAO,GAAG,CAAC,GAAG,CAAC;EACzB,UAAU;EACV,QAAQ,KAAK,GAAG;EAChB,UAAU,IAAI,GAAG,KAAK,UAAU,EAAE;EAClC,YAAY,MAAM,IAAI,cAAc,CAAC,CAAC,qBAAqB,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC;EACxF,UAAU;EACV,UAAU;EACV;EACA,IAAI;EACJ,IAAI,OAAO,GAAG;EACd,EAAE;;EAEF,EAAE,qBAAqB,CAAC,KAAK,EAAE,GAAG,EAAE;EACpC,IAAI,OAAO,GAAG,CAAC,MAAM,IAAI,OAAO,KAAK,KAAK,QAAQ,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;EACtE,EAAE;;EAEF,EAAE,4BAA4B,CAAC,aAAa,EAAE,aAAa,EAAE;EAC7D,IAAI,IAAI,CAAC,cAAc,GAAG,aAAa;EACvC,IAAI,IAAI,CAAC,cAAc,GAAG,aAAa;EACvC,EAAE;;EAEF,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;EACzB,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;EACjC,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,EAAE;EACvB,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAC1C,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;EACjC,MAAM,IAAI,CAAC,GAAG,EAAE;EAChB,MAAM,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;EAClD,QAAQ,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;EAC7E,MAAM;EACN,IAAI;EACJ,IAAI,OAAO,IAAI;EACf,EAAE;;EAEF,EAAE,UAAU,CAAC,GAAG,EAAE,IAAI,EAAE;EACxB,IAAI,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;EACvE,IAAI,OAAO,aAAa,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,IAAI;EACpF,EAAE;;EAEF,EAAE,UAAU,CAAC,GAAG,EAAE;EAClB,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC;EAC1C,IAAI,IAAI;EACR,MAAM,IAAI,OAAO,GAAG,KAAK;EACzB,MAAM,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAC5C,QAAQ,MAAM,oBAAoB,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;EAC1D,QAAQ,IAAI,oBAAoB,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE;EAC9C,UAAU,IAAI,CAAC,CAAC,CAAC,GAAG,oBAAoB;EACxC,UAAU,OAAO,GAAG,IAAI;EACxB,QAAQ;EACR,MAAM;EACN,MAAM,OAAO,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG;EAC3D,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;EAChB,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;EACvD,MAAM,MAAM,CAAC;EACb,IAAI;EACJ,EAAE;;EAEF,EAAE,WAAW,CAAC,IAAI,EAAE,GAAG,EAAE;EACzB,IAAI,GAAG,GAAG,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK;EACjC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EACjD,MAAM,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;EACjC,IAAI;EACJ,IAAI,OAAO,GAAG;EACd,EAAE;;EAEF,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,aAAa,EAAE;EAC7C,IAAI,IAAI,aAAa,KAAK,SAAS,IAAI,aAAa,KAAK,SAAS,EAAE;EACpE,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,sEAAsE,CAAC;EAChF,QAAQ,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;EACpC,OAAO;EACP,IAAI;EACJ,IAAI,IAAI;EACR,MAAM,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,aAAa,CAAC;EAC9E,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE;EAChB,MAAM,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,aAAa,GAAG,IAAI;EAC7C,MAAM,MAAM,CAAC;EACb,IAAI;EACJ,EAAE;;EAEF,EAAE,cAAc,CAAC,KAAK,EAAE,GAAG,EAAE,aAAa,EAAE;EAC5C;EACA,IAAI,IAAI,CAAC,GAAG,IAAI,aAAa,KAAK,SAAS,EAAE,OAAO,KAAK;EACzD,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;EACpC,IAAI,IAAI,CAAC;EACT,IAAI,IAAI,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;EAChD,MAAM,MAAM,OAAO,GAAG,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC,KAAK;EACrE,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,OAAO,EAAE;EAClD,QAAQ,KAAK,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC;EAC/D,MAAM;EACN,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE;EACpD,MAAM,MAAM,gBAAgB,GAAG,EAAE;EACjC,MAAM,KAAK,IAAI,GAAG,IAAI,KAAK,EAAE;EAC7B,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE;EAC/D,QAAQ,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,CAAC;EACnC,QAAQ,IAAI,MAAM;EAClB,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE;EACnC,UAAU,IAAI,aAAa,KAAK,SAAS,EAAE;EAC3C,YAAY,MAAM,IAAI,KAAK,CAAC,CAAC,qDAAqD,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;EAC3F,UAAU;EACV,UAAU,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC;EACzC,UAAU,MAAM,GAAG,GAAG;EACtB,UAAU,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EAChD,YAAY,MAAM,GAAG,MAAM,KAAK,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC;EAChE,YAAY,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;EACxE,cAAc,QAAQ,CAAC,CAAC,CAAC;EACzB,gBAAgB,IAAI,CAAC,aAAa,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;EACzF,YAAY;EACZ,UAAU;EACV,UAAU,GAAG,GAAG,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;EAClC,QAAQ,CAAC,MAAM,IAAI,aAAa,KAAK,SAAS,EAAE;EAChD,UAAU,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;EACjC,UAAU,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;EAC7C,QAAQ,CAAC,MAAM;EACf,UAAU,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;EAC7C,UAAU,IAAI,MAAM,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE;EACtE,YAAY,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC;EACnF,UAAU;EACV,QAAQ;EACR,QAAQ,gBAAgB,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,aAAa,CAAC;EACpF,MAAM;EACN,MAAM,KAAK,GAAG,gBAAgB;EAC9B,IAAI,CAAC,MAAM,IAAI,IAAI,KAAK,OAAO,EAAE;EACjC,MAAM,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,KAAK;EAC7D,MAAM,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;EACzC,QAAQ,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,GAAG,CAAC,CAAC,EAAE,aAAa,CAAC;EAC7E,MAAM;EACN,IAAI;EACJ,IAAI,OAAO,KAAK;EAChB,EAAE;;EAEF,EAAE,SAAS,CAAC,GAAG,EAAE,SAAS,EAAE;EAC5B,IAAI,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI;EACzB,IAAI,IAAI,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE;EACpC,IAAI,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;EACpF,IAAI,IAAI,CAAC,SAAS,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG;EAC1D,QAAQ,+BAA+B,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE;EACvD,MAAM,MAAM,IAAI,cAAc,CAAC,CAAC,kCAAkC,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,CAAC;EAC1F,IAAI;EACJ,IAAI,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;EAC7B,EAAE;;EAEF,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,gBAAgB,EAAE;EAClD,IAAI,MAAM,cAAc;EACxB,MAAM,OAAO,KAAK,GAAG,IAAI,gBAAgB,IAAI,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS;EAChF,MAAM,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,qBAAqB;EAChD,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,CAAC,cAAc,EAAE,OAAO,KAAK;EAC7D,IAAI,IAAI,QAAQ;EAChB,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE;EAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,GAAG,MAAM,GAAG,KAAK;EAC1D,MAAM,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,CAAC;EACzF,IAAI;EACJ,IAAI,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE;EAC/C,IAAI,IAAI,MAAM;EACd,IAAI,IAAI,OAAO,KAAK,GAAG,EAAE;EACzB,MAAM,IAAI,cAAc,EAAE;EAC1B,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;EACrD,QAAQ,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,OAAO,eAAe,KAAK,QAAQ,EAAE,OAAO,KAAK;EACrF,QAAQ,IAAI,IAAI,CAAC,cAAc,EAAE;EACjC,UAAU,QAAQ,GAAG,GAAG;EACxB,UAAU,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,eAAe,EAAE,IAAI,CAAC;EAC3D,QAAQ,CAAC,MAAM;EACf,UAAU,QAAQ,GAAG,GAAG;EACxB,UAAU,MAAM,GAAG,IAAI,CAAC,gBAAgB,CAAC,eAAe,CAAC;EACzD,QAAQ;EACR,MAAM,CAAC,MAAM;EACb,QAAQ,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC;EAC/C,MAAM;EACN,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE;EAC5B,QAAQ,MAAM,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,IAAI,CAAC;EAC/C,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC;EAC9E,MAAM;EACN,IAAI,CAAC,MAAM;EACX,MAAM,IAAI,IAAI,KAAK,QAAQ,EAAE;EAC7B,QAAQ,MAAM,IAAI,cAAc,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,WAAW,CAAC;EACnG,MAAM;EACN,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,KAAK;EAC5C,MAAM,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;EAC7D,MAAM,IAAI,CAAC,KAAK,EAAE;EAClB,QAAQ,MAAM,IAAI,cAAc;EAChC,UAAU,CAAC,8CAA8C,EAAE,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,EAAE,WAAW,CAAC;EAC7F,MAAM;EACN,MAAM,IAAI,CAAC,GAAG,CAAC;EACf,MAAM,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,WAAW,IAAI;EACvD,QAAQ,IAAI,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC;EAC7B,QAAQ,IAAI,WAAW,KAAK,GAAG,EAAE,IAAI,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC;EACvF,QAAQ,OAAO,IAAI;EACnB,MAAM,CAAC,CAAC;EACR,IAAI;EACJ,IAAI,OAAO,MAAM;EACjB,EAAE;;EAEF,EAAE,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE;EAC5B,IAAI,IAAI,CAAC,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;EACjD,MAAM,MAAM,IAAI,cAAc,CAAC,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAC,EAAE,WAAW,CAAC;EACtE,IAAI;EACJ,IAAI,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,OAAO,KAAK;EAC1C,IAAI,QAAQ,IAAI;EAChB,MAAM,KAAK,QAAQ,EAAE,KAAK,GAAG,EAAE,GAAG,KAAK,CAAC,CAAC;EACzC,MAAM,KAAK,SAAS,EAAE,KAAK,GAAG,KAAK,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC;EACjD;EACA,IAAI,OAAO,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC;EACrC,EAAE;;EAEF,EAAE,OAAO,CAAC,KAAK,EAAE;EACjB,IAAI,IAAI,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;EACnE,MAAM,OAAO,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;EAC7C,IAAI;EACJ,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK;EACzC,IAAI,IAAI,MAAM;EACd,IAAI,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC,yBAAyB,CAAC;EACxD,IAAI,IAAI,KAAK,EAAE;EACf,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;EACpD,QAAQ,MAAM,IAAI,cAAc,CAAC,uDAAuD,EAAE,QAAQ,CAAC;EACnG,MAAM;EACN,MAAM,QAAQ,KAAK,CAAC,CAAC,CAAC;EACtB,QAAQ,KAAK,GAAG;EAChB,UAAU,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EACzF,UAAU;EACV,QAAQ,KAAK,GAAG;EAChB,UAAU,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc;EACzD,YAAY,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;EACnE,UAAU;EACV,QAAQ,KAAK,GAAG;EAChB,UAAU,MAAM,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;EACtD,UAAU;EACV,QAAQ,KAAK,GAAG,EAAE;EAClB,UAAU,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;EACtE,UAAU,MAAM,GAAG,MAAM,CAAC,gBAAgB,CAAC;EAC3C;EACA;EACA,UAAU,IAAI,MAAM,KAAK,MAAM,EAAE;EACjC,YAAY,MAAM,IAAI,cAAc,CAAC,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC;EAClG,UAAU;EACV,UAAU;EACV,QAAQ;EACR,QAAQ,KAAK,GAAG,EAAE;EAClB,UAAU,MAAM,gBAAgB,GAAG,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC;EACtE,UAAU,QAAQ,gBAAgB;EAClC,YAAY,KAAK,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC;EACrC,YAAY,KAAK,GAAG,EAAE,MAAM,GAAG,KAAK,CAAC,CAAC;EACtC,YAAY;EACZ,cAAc,MAAM,IAAI,cAAc;EACtC,gBAAgB,CAAC,2BAA2B,EAAE,gBAAgB,CAAC,CAAC,EAAE,WAAW,CAAC;EAC9E;EACA,UAAU;EACV,QAAQ;EACR,QAAQ;EACR,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,mDAAmD,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;EAC3F;EACA,IAAI,CAAC,MAAM;EACX,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE;EAChC,QAAQ,MAAM,IAAI,cAAc,CAAC,uDAAuD,EAAE,QAAQ,CAAC;EACnG,MAAM;EACN,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,wBAAwB,EAAE,CAAC,OAAO,EAAE,QAAQ,EAAE,eAAe,KAAK;EAC/F,QAAQ,IAAI,QAAQ,KAAK,GAAG,EAAE;EAC9B,UAAU,MAAM,IAAI,KAAK,CAAC,CAAC,uDAAuD,EAAE,QAAQ,CAAC,CAAC,CAAC;EAC/F,QAAQ;EACR,QAAQ,OAAO,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,IAAI,CAAC;EACzD,MAAM,CAAC,CAAC;EACR,IAAI;EACJ,IAAI,IAAI,IAAI,CAAC,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC;EACvE,IAAI,OAAO,MAAM;EACjB,EAAE;;EAEF,EAAE,UAAU,CAAC,SAAS,EAAE;EACxB,IAAI,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,GAAG,SAAS;EACvC,IAAI,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,QAAQ,CAAC;EAC/C,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE;EACvC;EACA,MAAM,UAAU,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,IAAI;EACpE,IAAI;EACJ,IAAI,OAAO,UAAU;EACrB,EAAE,CAAC;;EAEH,EAAE,OAAO,CAAC,KAAK,EAAE;EACjB,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,OAAO;EAC5C,IAAI,IAAI,IAAI,GAAG,OAAO,KAAK;EAC3B,IAAI,IAAI,IAAI,KAAK,QAAQ,EAAE;EAC3B,MAAM,IAAI,KAAK,YAAY,MAAM,EAAE,IAAI,GAAG,QAAQ;EAClD,WAAW,IAAI,KAAK,YAAY,MAAM,EAAE,IAAI,GAAG,QAAQ;EACvD,WAAW,IAAI,KAAK,YAAY,OAAO,EAAE,IAAI,GAAG,SAAS;EACzD,IAAI;EACJ,IAAI,OAAO,IAAI;EACf,EAAE;;EAEF,EAAE,cAAc,CAAC,OAAO,EAAE;EAC1B,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC;EAC7C,IAAI,IAAI,CAAC,KAAK,EAAE;EAChB,MAAM,KAAK,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG;EAC/D,SAAS,OAAO,CAAC,KAAK,EAAE,GAAG;EAC3B,SAAS,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC;EACjD,SAAS,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,GAAG,CAAC;EACtC,IAAI;EACJ,IAAI,OAAO,KAAK;EAChB,EAAE;;EAEF,EAAE,gBAAgB,CAAC,KAAK,EAAE;EAC1B,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;EACvE,OAAO,OAAO,CAAC,KAAK,EAAE,GAAG;EACzB,OAAO,OAAO,CAAC,KAAK,EAAE,GAAG;EACzB,OAAO,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC;EACzB,EAAE;;EAEF,EAAE,cAAc,CAAC,MAAM,EAAE;EACzB,IAAI,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI;EAC/B,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG;EAC9B,SAAS,OAAO,CAAC,IAAI,EAAE,GAAG;EAC1B,SAAS,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG;EACrD,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;EAC5B,EAAE;EACF;;ECpYe,MAAM,iBAAiB,CAAC;EACvC,EAAE,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE;EAC/B,IAAI,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;EACtD,IAAI,IAAI,CAAC,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;EACvD,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI;EACrB,IAAI,IAAI,CAAC,UAAU,GAAG,SAAS;EAC/B,EAAE;;EAEF,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG;EACxB,EAAE;;EAEF,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC;EACjE,EAAE;;EAEF,EAAE,GAAG,GAAG;EACR,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC;EAC1F,EAAE;;EAEF,EAAE,KAAK,CAAC,SAAS,EAAE;EACnB,IAAI,OAAO,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;EAC9E,EAAE;;EAEF,EAAE,OAAO,CAAC,MAAM,EAAE;EAClB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,IAAI;EAC3C,MAAM,OAAO,MAAM,CAAC,IAAI,iBAAiB,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;EACtE,IAAI,CAAC,CAAC;EACN,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;EACzD,EAAE;;EAEF,EAAE,QAAQ,CAAC,SAAS,EAAE;EACtB,IAAI,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW;EACnD,MAAM,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;EACtF,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC;EACzC,EAAE;;EAEF,EAAE,WAAW,GAAG;EAChB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;EAC9D,EAAE;;EAEF,EAAE,WAAW,GAAG;EAChB,IAAI,OAAO,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;EAC9D,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC;EAC/D,IAAI,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC;EAC9E,EAAE;EACF;;ECnDe,MAAM,cAAc,CAAC;EACpC,EAAE,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE;EACpD,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK;EACvB,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,IAAI,EAAE;EAC7B,IAAI,IAAI,CAAC,YAAY,GAAG,WAAW,IAAI,KAAK;EAC5C,IAAI,IAAI,CAAC,UAAU,GAAG,SAAS;EAC/B,EAAE;;EAEF,EAAE,kBAAkB,CAAC,QAAQ,EAAE;EAC/B,IAAI,IAAI,CAAC,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE;EACjD,IAAI,MAAM,IAAI,GAAG,IAAI;EACrB,IAAI,MAAM,eAAe,GAAG,SAAS,IAAI,EAAE,gBAAgB,EAAE;EAC7D,MAAM,OAAO,QAAQ,CAAC,IAAI;EAC1B,QAAQ,IAAI,EAAE,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,gBAAgB,EAAE,IAAI,CAAC,UAAU,CAAC;EAC9F,IAAI,CAAC;EACL,IAAI,eAAe,CAAC,iBAAiB,GAAG,eAAe;EACvD,IAAI,QAAQ,CAAC,iBAAiB,GAAG,eAAe;EAChD,EAAE;;EAEF,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,OAAO,IAAI,kBAAkB;EACjC,MAAM,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;EAC3E,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE;EAC/B,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,OAAO,CAAC,UAAU,EAAE;EACtB,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,KAAK,UAAU,CAAC,MAAM,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;EACpF,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,QAAQ,GAAG;EACb,IAAI,OAAO,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;EACjC,EAAE;;EAEF,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE;EACnD,IAAI,IAAI,CAAC,kBAAkB,CAAC,QAAQ,CAAC;EACrC,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,CAAC,IAAI;EACpC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,iBAAiB,EAAE,cAAc,EAAE,OAAO,CAAC;EAClF,EAAE;;EAEF,EAAE,GAAG,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE;EACpC,IAAI,IAAI,QAAQ,IAAI,QAAQ,CAAC,iBAAiB,EAAE,QAAQ,GAAG,QAAQ,CAAC,iBAAiB;EACrF,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC;EAChF,EAAE;;EAEF,EAAE,IAAI,CAAC,SAAS,EAAE,eAAe,EAAE,eAAe,EAAE,OAAO,EAAE;EAC7D,IAAI,IAAI,CAAC,kBAAkB,CAAC,eAAe,CAAC;EAC5C,IAAI,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI;EACtC,MAAM,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,eAAe,IAAI,eAAe,CAAC,iBAAiB,EAAE,eAAe;EACnG,MAAM;EACN,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI;EACnB,MAAM,OAAO,IAAI,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;EACzD,IAAI,CAAC,CAAC;EACN,EAAE;;EAEF,EAAE,YAAY,CAAC,GAAG,EAAE;EACpB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,EAAE,GAAG,CAAC;EACtD,EAAE;;EAEF,EAAE,UAAU,GAAG;EACf,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;EAC7C,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;EACjD,EAAE;;EAEF,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE;EACtB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,SAAS,CAAC;EACzC,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,SAAS,CAAC;EAC/C,EAAE;;EAEF,EAAE,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE;EACpB,IAAI,IAAI,CAAC,aAAa,CAAC,GAAG,KAAK,SAAS,CAAC;EACzC,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,SAAS,CAAC;EAC7C,EAAE;;EAEF,EAAE,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE;EACtB,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC,EAAE;EACnD,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO;EAC7C,QAAQ,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,WAAW,CAAC,CAAC;EACjG,IAAI;EACJ,IAAI,IAAI,GAAG,KAAK,SAAS,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE;EACvD,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC;EACpF,IAAI;EACJ,IAAI,OAAO,IAAI,cAAc;EAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY;EAC7F,MAAM,IAAI,CAAC;EACX,KAAK;EACL,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,SAAS,CAAC;EACpD,EAAE;;EAEF,EAAE,WAAW,GAAG;EAChB,IAAI,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,EAAE,SAAS,CAAC;EACnD,EAAE;;EAEF,EAAE,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE;EAC9B,IAAI,OAAO,IAAI,cAAc;EAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY;EAC5F,MAAM,IAAI,CAAC;EACX,KAAK;EACL,EAAE;;EAEF,EAAE,aAAa,CAAC,WAAW,EAAE;EAC7B,IAAI,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,KAAK;EACxD,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY;EAC9B,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,IAAI,WAAW,IAAI,IAAI,CAAC,MAAM,CAAC,YAAY;EAC3E,IAAI,IAAI,mBAAmB,EAAE,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC;EACjF,EAAE;;EAEF,EAAE,QAAQ,CAAC,UAAU,EAAE,EAAE,EAAE,QAAQ,EAAE;EACrC,IAAI,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;EAChG,IAAI,MAAM,KAAK,GAAG,CAAC,EAAE,CAAC;;EAEtB,IAAI,IAAI,iBAAiB;EACzB,IAAI,IAAI,GAAG,EAAE;EACb,MAAM,MAAM,SAAS,GAAG,QAAQ,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC;EACvD,MAAM,KAAK,MAAM,MAAM,IAAI,GAAG,EAAE;EAChC,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,EAAE;EAChE,QAAQ,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;EAClC,QAAQ,IAAI,MAAM,CAAC,UAAU,CAAC,EAAE;EAChC,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG;EACjF,UAAU,IAAI,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,cAAc,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,KAAK;EACvF,QAAQ;EACR,QAAQ,IAAI,QAAQ,EAAE;EACtB,UAAU,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC;EACjF,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK,EAAE;EAC9E,YAAY,KAAK,CAAC,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,KAAK;EAC7D,UAAU;EACV,UAAU,MAAM,0BAA0B;EAC1C,YAAY,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,WAAW,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC;EAC5E,UAAU,IAAI,iBAAiB,IAAI,0BAA0B,KAAK,iBAAiB,EAAE;EACrF,YAAY,MAAM,IAAI,KAAK;EAC3B,cAAc,2DAA2D,GAAG,QAAQ,GAAG,IAAI,CAAC;EAC5F,UAAU;EACV,UAAU,iBAAiB,GAAG,0BAA0B;EACxD,QAAQ;EACR,MAAM;EACN,IAAI;EACJ,IAAI,IAAI,QAAQ,EAAE;EAClB,MAAM,OAAO,IAAI,cAAc;EAC/B,QAAQ,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,IAAI,QAAQ,CAAC,EAAE,KAAK;EAC7F,QAAQ,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;EAChC,OAAO;EACP,IAAI;EACJ,IAAI,OAAO,IAAI,cAAc;EAC7B,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC;EACtF,KAAK;EACL,EAAE;EACF;;EC3Ke,MAAM,qBAAqB,CAAC;EAC3C,EAAE,WAAW,CAAC,IAAI,EAAE,oBAAoB,EAAE,MAAM,EAAE;EAClD,IAAI,IAAI,CAAC,KAAK,GAAG,IAAI;EACrB,IAAI,IAAI,CAAC,OAAO,GAAG,MAAM;EACzB,IAAI,IAAI,CAAC,qBAAqB,GAAG,oBAAoB;EACrD,EAAE;;EAEF,EAAE,2BAA2B,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE;EACvE,IAAI,MAAM,IAAI,GAAG,IAAI;;EAErB,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,WAAW;EAClC,MAAM,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;EAChE,MAAM,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;EACnD,QAAQ,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;EAC3F,MAAM;;EAEN,MAAM,OAAO,IAAI,CAAC,qBAAqB,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,qBAAqB,EAAE,IAAI,CAAC;EAC3F,IAAI,CAAC;EACL,EAAE;;EAEF,EAAE,GAAG,GAAG;EACR,IAAI,OAAO,IAAI,CAAC,2BAA2B,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;EAChE,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;EACnE,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,SAAS,CAAC;EAChE,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,2BAA2B,CAAC,QAAQ,EAAE,SAAS,CAAC;EAChE,EAAE;EACF;;EC/BA,IAAI,mBAAmB;EACvB,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;EACpC,EAAE,IAAI;EACN,IAAI,mBAAmB,GAAG,OAAO,CAAC,uBAAuB,CAAC,CAAC;EAC3D,EAAE,CAAC,CAAC,MAAM;EACV;EACA,EAAE;EACF;;EAEe,MAAM,kBAAkB,CAAC;EACxC,EAAE,WAAW,CAAC,GAAG,EAAE,SAAS,EAAE;EAC9B,IAAI,IAAI,CAAC,IAAI,GAAG,GAAG;EACnB,IAAI,IAAI,CAAC,UAAU,GAAG,SAAS;EAC/B,EAAE;;EAEF,EAAE,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE;EACjD,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;EACtE,IAAI,MAAM,KAAK,GAAG,IAAI,cAAc,CAAC,YAAY,EAAE,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;EAClF,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,iBAAiB,CAAC;EAC5D,EAAE;;EAEF,EAAE,eAAe,CAAC,UAAU,EAAE,iBAAiB,EAAE,QAAQ,EAAE;EAC3D,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;;EAEtE,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC;EAC9D,IAAI,IAAI,QAAQ,IAAI,CAAC,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE;EACjD,MAAM,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;EAC/D,MAAM,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,EAAE,SAAS,CAAC;EAC9F,IAAI;;EAEJ,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC;EAC1D,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA,EAAE,WAAW,gBAAgB,GAAG;EAChC,IAAI,OAAO;EACX,MAAM,KAAK,EAAE;EACb,KAAK;EACL,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG;EACxB,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,IAAI,IAAI,GAAG;EACb,IAAI,OAAO,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;EAC/F,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI;EACrD,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC;EACjE,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,IAAI,IAAI,GAAG;EACb,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,IAAI;EACtD,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;EAClE,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA,EAAE,IAAI,MAAM,GAAG;EACf,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,IAAI,EAAE,OAAO,IAAI;EAC9C,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC;EACpE,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,IAAI,QAAQ,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,UAAU;EAC1B,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA,EAAE,KAAK,CAAC,IAAI,EAAE;EACd,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC;EACzE,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE;EAC7B,EAAE;;EAEF;EACA;EACA;EACA;EACA;EACA;EACA;EACA,EAAE,OAAO,CAAC,QAAQ,EAAE;EACpB,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,CAAC,CAAC;EAC5E,EAAE;;EAEF;EACA;EACA;EACA;EACA,EAAE,QAAQ,GAAG;EACb,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;EAC/B,EAAE;;EAEF,EAAE,IAAI,GAAG;EACT,IAAI,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC;;EAEtD,IAAI,IAAI,OAAO;EACf,IAAI,IAAI,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,WAAW,EAAE;EAC7C;EACA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,EAAE;EACjC,IAAI,CAAC,MAAM;EACX,MAAM,OAAO,GAAG,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC;EACzD,IAAI;;EAEJ,IAAI,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;EAC/C,IAAI,SAAS,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC;EACjD,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,SAAS,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;;EAE1E,IAAI,OAAO,SAAS;EACpB,EAAE;;EAEF,EAAE,GAAG,GAAG;EACR,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;EACpD,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,CAAC;EACpD,EAAE;;EAEF,EAAE,MAAM,GAAG;EACX,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;EACvD,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,MAAM,cAAc,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,IAAI,mBAAmB;;EAExE,IAAI,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE;EAC9C,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC;AACT,yFAAyF;EACzF,OAAO;EACP,IAAI;;EAEJ,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;EACtE,IAAI,OAAO,cAAc,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC,YAAY,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI;EACzF,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE;EAC/C,QAAQ,OAAO,IAAI;EACnB,MAAM;EACN,MAAM,OAAO,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;EACpF,IAAI,CAAC,CAAC;EACN,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;EACtE,IAAI,OAAO,IAAI,qBAAqB;EACpC,MAAM,YAAY,EAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,CAAC,OAAO,CAAC;EAC5E,EAAE;;EAEF,EAAE,EAAE,GAAG;EACP,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,SAAS,CAAC;EAChD,EAAE;;EAEF,EAAE,GAAG,GAAG;EACR,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,SAAS,CAAC;EACjD,EAAE;;EAEF,EAAE,IAAI,GAAG;EACT,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC;EAClD,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC;EAC1D,EAAE;;EAEF,EAAE,UAAU,GAAG;EACf,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,SAAS,CAAC;EACxD,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC;EAC1D,EAAE;;EAEF,EAAE,OAAO,GAAG;EACZ,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC;EACrD,EAAE;;EAEF,EAAE,KAAK,GAAG;EACV,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,OAAO,EAAE,SAAS,CAAC;EACnD,EAAE;;EAEF,EAAE,OAAO,GAAG;EACZ,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,SAAS,CAAC;EACrD,EAAE;;EAEF,EAAE,YAAY,GAAG;EACjB,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,cAAc,EAAE,SAAS,CAAC;EAC1D,EAAE;;EAEF,EAAE,WAAW,GAAG;EAChB,IAAI,OAAO,IAAI,CAAC,eAAe,CAAC,aAAa,EAAE,SAAS,CAAC;EACzD,EAAE;;EAEF,EAAE,WAAW,GAAG;EAChB,IAAI,MAAM,YAAY,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC;EACtE,IAAI,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC;;EAE7D,IAAI,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;EACtD,IAAI,MAAM,eAAe,GAAG,IAAI,CAAC,CAAC,CAAC;EACnC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,eAAe,KAAK,KAAK,IAAI;EAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;EAC5E,MAAM,KAAK,GAAG,eAAe,CAAC,KAAK,CAAC;EACpC,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,cAAc,CAAC,IAAI,EAAE,KAAK,EAAE,SAAS,CAAC;EAC5E,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,CAAC;EACN,IAAI,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE;EACzB,MAAM,MAAM,kBAAkB,GAAG,IAAI,CAAC,CAAC,CAAC;EACxC,MAAM,IAAI,CAAC,CAAC,CAAC,GAAG,kBAAkB,KAAK,CAAC,KAAK,EAAE,SAAS,EAAE,QAAQ,KAAK;EACvE,QAAQ,OAAO,kBAAkB;EACjC,UAAU,KAAK,EAAE,SAAS,EAAE,QAAQ,IAAI,IAAI,iBAAiB,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;EACzF,MAAM,CAAC,CAAC;EACR,IAAI;EACJ,IAAI,OAAO,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,IAAI;EAC1E,MAAM,MAAM,CAAC,QAAQ;EACrB,QAAQ,MAAM,CAAC,QAAQ,IAAI,IAAI,iBAAiB,CAAC,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC;EAClF,MAAM,OAAO,MAAM;EACnB,IAAI,CAAC,CAAC;EACN,EAAE;EACF;;ECrQA,IAAI,OAAO,OAAO,KAAK,WAAW,EAAE;EACpC;EACA,EAAE,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,MAAM,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC;EACtE,EAAE,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC;EAC7E,EAAE,IAAI,OAAO,QAAQ,KAAK,WAAW,EAAE,MAAM,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,CAAC;EAClF,EAAE,OAAO,CAAC,2BAA2B,CAAC;EACtC,EAAE,OAAO,CAAC,sBAAsB,CAAC;EACjC,EAAE,OAAO,CAAC,yBAAyB,CAAC;EACpC,EAAE,OAAO,CAAC,mCAAmC,CAAC;EAC9C;EACA;;EAMA,MAAM,SAAS,CAAC;EAChB,EAAE,WAAW,CAAC,EAAE,EAAE;EAClB,IAAI,MAAM,iBAAiB,GAAG,OAAO,EAAE,KAAK,QAAQ,IAAI,EAAE,KAAK,IAAI;EACnE,IAAI,IAAI,CAAC,iBAAiB,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,QAAQ,IAAI,OAAO,EAAE,CAAC,GAAG,KAAK,UAAU,EAAE;EAC1F,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,kFAAkF,CAAC;EAC5F,QAAQ,CAAC,mBAAmB,EAAE,EAAE,CAAC,EAAE;EACnC,OAAO;EACP,IAAI;;EAEJ,IAAI,IAAI,CAAC,GAAG,GAAG,EAAE;EACjB,IAAI,IAAI,CAAC,OAAO,GAAG,SAAS;EAC5B,EAAE;;EAEF,EAAE,2BAA2B,GAAG;EAChC,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,WAAW,EAAE;EAC7C,MAAM,MAAM,IAAI,cAAc;EAC9B,QAAQ,sEAAsE,EAAE,YAAY,CAAC;EAC7F,IAAI;EACJ,EAAE;;EAEF,EAAE,YAAY,CAAC,GAAG,EAAE,UAAU,EAAE;EAChC,IAAI,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EACnE,IAAI,MAAM,aAAa,GAAG,OAAO,IAAI;EACrC,MAAM,MAAM,GAAG,GAAG,OAAO,OAAO,KAAK,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,CAAC;EAChG,MAAM,OAAO,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;EAC/D,IAAI,CAAC;EACL,IAAI,MAAM,aAAa,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK;EAC3C,MAAM,MAAM,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;EACnE,MAAM,IAAI,MAAM,KAAK,KAAK,EAAE,MAAM,IAAI,cAAc,CAAC,sBAAsB,EAAE,WAAW,CAAC;EACzF,MAAM,OAAO,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,MAAM;EAClE,IAAI,CAAC;;EAEL,IAAI,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,aAAa,EAAE,aAAa,CAAC;;EAE3E,IAAI,IAAI,UAAU,EAAE,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC;EACnD,IAAI,OAAO,aAAa,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;EAC7F,EAAE;;EAEF,EAAE,kBAAkB,CAAC,OAAO,GAAG,EAAE,EAAE,aAAa,GAAG,EAAE,EAAE;EACvD,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE;EACzD,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,iFAAiF,CAAC;EAC3F,QAAQ,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE;EACtB,OAAO;EACP,IAAI,CAAC,MAAM,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,aAAa,KAAK,IAAI,EAAE;EAC5E,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,gFAAgF,CAAC;EAC1F,QAAQ,CAAC,CAAC,EAAE,aAAa,CAAC,EAAE;EAC5B,OAAO;EACP,IAAI;;EAEJ,IAAI,OAAO,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI;EAC5D,IAAI,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,SAAS;EAClF,IAAI,OAAO,CAAC,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,OAAO,CAAC,SAAS;;EAElF,IAAI,IAAI,CAAC,OAAO,GAAG,IAAI,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC;;EAErD,IAAI,IAAI,MAAM;;EAEd,IAAI,QAAQ,OAAO,CAAC,UAAU;EAC9B,MAAM,KAAK,SAAS;EACpB,QAAQ,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;EAC1B,UAAU,MAAM,IAAI,cAAc,CAAC,+CAA+C,EAAE,YAAY,CAAC;EACjG,QAAQ;EACR,QAAQ,MAAM,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC;EACtE,QAAQ;EACR,MAAM,KAAK,MAAM;EACjB;EACA,QAAQ;EACR,MAAM,KAAK,UAAU,EAAE;EACvB,QAAQ,SAAS,kBAAkB,GAAG;EACtC,UAAU,MAAM,IAAI,cAAc,CAAC,uBAAuB,EAAE,QAAQ,CAAC;EACrE,QAAQ;EACR,QAAQ,IAAI,CAAC,OAAO,CAAC,4BAA4B,CAAC,kBAAkB,EAAE,kBAAkB,CAAC;EACzF,QAAQ;EACR,MAAM;EACN,MAAM;EACN,QAAQ,MAAM,IAAI,cAAc;EAChC,UAAU,CAAC,8BAA8B,EAAE,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC,EAAE,YAAY,CAAC;EAChF;;EAEA;EACA;EACA,IAAI,IAAI,CAAC,uBAAuB,GAAG,MAAM;;EAEzC,IAAI,OAAO,MAAM;EACjB,EAAE;;EAEF,EAAE,IAAI,cAAc,GAAG;EACvB,IAAI,IAAI,CAAC,2BAA2B,EAAE;EACtC,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK;EAC7B,EAAE;;EAEF,EAAE,QAAQ,GAAG;EACb,IAAI,IAAI,CAAC,2BAA2B,EAAE;EACtC,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,QAAQ,EAAE;EAC9B,EAAE;;EAEF,EAAE,SAAS,GAAG;EACd,IAAI,IAAI,CAAC,2BAA2B,EAAE;EACtC,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE;EAC/B,EAAE;;EAEF,EAAE,IAAI,GAAG,GAAG;EACZ,IAAI,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG;EACvB,EAAE;;EAEF,EAAE,GAAG,CAAC,IAAI,EAAE;EACZ,IAAI,IAAI,CAAC,2BAA2B,EAAE;;EAEtC,IAAI,IAAI,OAAO,IAAI,KAAK,WAAW,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;EACjE,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,8EAA8E,EAAE,IAAI,CAAC,EAAE;EAChG,OAAO;EACP,IAAI;;EAEJ,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC;EAC3D,EAAE;;EAEF,EAAE,UAAU,CAAC,GAAG,EAAE;EAClB,IAAI,IAAI,CAAC,2BAA2B,EAAE;;EAEtC,IAAI,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,KAAK,CAAC,gBAAgB,CAAC,KAAK,IAAI,EAAE;EACzE,MAAM,MAAM,IAAI,KAAK;EACrB,QAAQ,CAAC,4EAA4E,EAAE,GAAG,CAAC,EAAE;EAC7F,OAAO;EACP,IAAI;;EAEJ,IAAI,OAAO,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC;EACjE,EAAE;EACF;;;EAGO,SAAS,YAAY,CAAC,QAAQ,EAAE;EACvC,EAAE,MAAM,EAAE,GAAG,IAAI,SAAS,CAAC,QAAQ,CAAC;EACpC,EAAE,IAAI,QAAQ,CAAC,QAAQ,EAAE;EACzB,IAAI,EAAE,CAAC,QAAQ,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE;EAC3C,IAAI,EAAE,CAAC,YAAY,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE;EACnD,IAAI,EAAE,CAAC,QAAQ,GAAG,MAAM,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC;EACrD,EAAE;EACF,EAAE,OAAO,EAAE;EACX;;;;;;;;;;"} \ No newline at end of file diff --git a/dist/browser/firecrypt.min.js b/dist/browser/firecrypt.min.js index b6f3a81..71882d7 100644 --- a/dist/browser/firecrypt.min.js +++ b/dist/browser/firecrypt.min.js @@ -41,14 +41,14 @@ var firecrypt = (function (exports) { } this._compressionThreshold = options.compressionThreshold || 150; - if (typeof LRUCache === 'function') { - this._encryptionCache = new LRUCache({ - max: options.encryptionCacheSize, - length: this._computeCacheItemSize, + if (typeof lrucache !== 'undefined') { + this._encryptionCache = new lrucache.LRUCache({ + maxSize: options.encryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); - this._decryptionCache = new LRUCache({ - max: options.decryptionCacheSize, - length: this._computeCacheItemSize, + this._decryptionCache = new lrucache.LRUCache({ + maxSize: options.decryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); } @@ -921,7 +921,7 @@ var firecrypt = (function (exports) { if (typeof require !== 'undefined') { /* eslint-disable no-undef */ if (typeof fflate === 'undefined') global.fflate = require('fflate'); - if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache'); + if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache'); if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core'); require('crypto-js/lib-typedarrays'); require('crypto-js/enc-base64'); diff --git a/dist/browser/firecrypt.min.js.map b/dist/browser/firecrypt.min.js.map index e847519..a546e48 100644 --- a/dist/browser/firecrypt.min.js.map +++ b/dist/browser/firecrypt.min.js.map @@ -1 +1 @@ -{"version":3,"file":"firecrypt.min.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof LRUCache === 'function') {\n this._encryptionCache = new LRUCache({\n max: options.encryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n this._decryptionCache = new LRUCache({\n max: options.decryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"firecrypt.min.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof lrucache !== 'undefined') {\n this._encryptionCache = new lrucache.LRUCache({\n maxSize: options.encryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n this._decryptionCache = new lrucache.LRUCache({\n maxSize: options.decryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/node/firecrypt.js b/dist/node/firecrypt.js index b0769e6..e27b05e 100644 --- a/dist/node/firecrypt.js +++ b/dist/node/firecrypt.js @@ -40,14 +40,14 @@ class Crypto { } this._compressionThreshold = options.compressionThreshold || 150; - if (typeof LRUCache === 'function') { - this._encryptionCache = new LRUCache({ - max: options.encryptionCacheSize, - length: this._computeCacheItemSize, + if (typeof lrucache !== 'undefined') { + this._encryptionCache = new lrucache.LRUCache({ + maxSize: options.encryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); - this._decryptionCache = new LRUCache({ - max: options.decryptionCacheSize, - length: this._computeCacheItemSize, + this._decryptionCache = new lrucache.LRUCache({ + maxSize: options.decryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); } @@ -920,7 +920,7 @@ class FireCryptReference { if (typeof require !== 'undefined') { /* eslint-disable no-undef */ if (typeof fflate === 'undefined') global.fflate = require('fflate'); - if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache'); + if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache'); if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core'); require('crypto-js/lib-typedarrays'); require('crypto-js/enc-base64'); diff --git a/dist/node/firecrypt.js.map b/dist/node/firecrypt.js.map index 570c357..db4fad1 100644 --- a/dist/node/firecrypt.js.map +++ b/dist/node/firecrypt.js.map @@ -1 +1 @@ -{"version":3,"file":"firecrypt.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof LRUCache === 'function') {\n this._encryptionCache = new LRUCache({\n max: options.encryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n this._decryptionCache = new LRUCache({\n max: options.decryptionCacheSize,\n length: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"firecrypt.js","sources":["../../src/FireCryptError.js","../../src/crypto.js","../../src/FireCryptSnapshot.js","../../src/FireCryptQuery.js","../../src/FireCryptOnDisconnect.js","../../src/FireCryptReference.js","../../src/firecrypt.js"],"sourcesContent":["export default class FireCryptError extends Error {\n constructor(message, code) {\n super(message);\n this.firecrypt = code;\n }\n}\n","import FireCryptError from './FireCryptError';\n\nexport default class Crypto {\n constructor(options, spec) {\n this._spec = this._cleanSpecification(spec);\n this._patternRegexes = {};\n this.stats = {\n compression: {attempts: 0, thresholdAccuracy: 0, bytesIn: 0, bytesOut: 0, ratio: 0}\n };\n\n switch (options.compression) {\n case 'deflate':\n this._compress = str => {\n const inputU8 = fflate.strToU8(str);\n const outputU8 = fflate.deflateSync(inputU8, {level: 9, ...options.compressionOptions});\n const reduced = inputU8.byteLength > outputU8.byteLength;\n const stats = this.stats.compression;\n stats.thresholdAccuracy =\n (stats.thresholdAccuracy * stats.attempts + reduced) / ++stats.attempts;\n if (reduced) {\n stats.bytesIn += inputU8.byteLength;\n stats.bytesOut += outputU8.byteLength;\n stats.ratio = stats.bytesOut / stats.bytesIn;\n }\n return reduced ? outputU8 : str;\n };\n break;\n case 'none':\n break;\n default:\n throw new FireCryptError(\n `Unknown compression algorithm \"${options.compression}\".`, 'BAD_CONFIG');\n }\n this._compressionThreshold = options.compressionThreshold || 150;\n\n if (typeof lrucache !== 'undefined') {\n this._encryptionCache = new lrucache.LRUCache({\n maxSize: options.encryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n this._decryptionCache = new lrucache.LRUCache({\n maxSize: options.decryptionCacheSize,\n sizeCalculation: this._computeCacheItemSize,\n });\n }\n\n if (typeof Buffer !== 'undefined') {\n /* eslint-disable no-undef */\n this._base64UrlFromU8 = u8 => Buffer.from(u8).toString('base64url');\n this._base64UrlToU8 = str => Buffer.from(str, 'base64url');\n /* eslint-enable no-undef */\n }\n }\n\n _cleanSpecification(def, path) {\n const keys = Object.keys(def);\n for (const key of keys) {\n if (key === '.encrypt') {\n const encryptKeys = Object.keys(def[key]);\n for (const encryptKey of encryptKeys) {\n if (encryptKey !== 'key' && encryptKey !== 'value' && encryptKey !== 'few') {\n throw new FireCryptError(`Illegal .encrypt subkey: ${encryptKey}`, 'BAD_SPEC');\n }\n }\n } else {\n // eslint-disable-next-line no-control-regex\n if (/[\\x00-\\x1f\\x7f\\x91\\x92.#[\\]/]/.test(key) || /[$]/.test(key.slice(1))) {\n throw new FireCryptError(`Illegal character in specification key: ${key}`, 'BAD_SPEC');\n }\n this._cleanSpecification(def[key], (path || '') + '/' + key);\n }\n switch (key.charAt(0)) {\n case '$':\n if (key === '$') break;\n if (def.$) {\n throw new FireCryptError(\n `Multiple wildcard keys in specification at ${path}`, 'BAD_SPEC');\n }\n def.$ = def[key];\n delete def[key];\n break;\n case '.':\n if (key !== '.encrypt') {\n throw new FireCryptError(`Unknown directive at ${path}: ${key}`, 'BAD_SPEC');\n }\n break;\n }\n }\n return def;\n }\n\n _computeCacheItemSize(value, key) {\n return key.length + (typeof value === 'string' ? value.length : 4);\n }\n\n setStringEncryptionFunctions(encryptString, decryptString) {\n this._encryptString = encryptString;\n this._decryptString = decryptString;\n }\n\n encryptPath(path, def) {\n def = def || this._spec.rules;\n path = path.slice();\n for (let i = 0; i < path.length; i++) {\n def = def[path[i]] || def.$;\n if (!def) break;\n if (def['.encrypt'] && def['.encrypt'].key) {\n path[i] = this.encrypt(path[i], 'string', def['.encrypt'].key, false);\n }\n }\n return path;\n }\n\n encryptRef(ref, path) {\n const encryptedPath = this.encryptPath(path || this.refToPath(ref));\n return encryptedPath.length ? ref.root.child(encryptedPath.join('/')) : ref.root;\n }\n\n decryptRef(ref) {\n const path = this.refToPath(ref, true);\n try {\n let changed = false;\n for (let i = 0; i < path.length; i++) {\n const decryptedPathSegment = this.decrypt(path[i]);\n if (decryptedPathSegment !== path[i]) {\n path[i] = decryptedPathSegment;\n changed = true;\n }\n }\n return changed ? ref.root.child(path.join('/')) : ref;\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path.join('/');\n throw e;\n }\n }\n\n specForPath(path, def) {\n def = def || this._spec.rules;\n for (let i = 0; def && i < path.length; i++) {\n def = def[path[i]] || def.$;\n }\n return def;\n }\n\n transformValue(path, value, transformType) {\n if (transformType !== 'encrypt' && transformType !== 'decrypt') {\n throw new Error(\n `Internal error: transform type must be either \"encrypt\" or \"decrypt\", ` +\n `but got \"${transformType}\".`\n );\n }\n try {\n return this._transformTree(value, this.specForPath(path), transformType);\n } catch (e) {\n if (e.firecrypt) e.firecryptPath = path;\n throw e;\n }\n }\n\n _transformTree(value, def, transformType) {\n // transformType is either 'encrypt' or 'decrypt'.\n if (!def && transformType === 'encrypt') return value;\n const type = this.getType(value);\n let i;\n if (/^(string|number|boolean)$/.test(type)) {\n const pattern = def && def['.encrypt'] && def['.encrypt'].value;\n if (transformType === 'decrypt' || pattern) {\n value = this[transformType](value, type, pattern, true);\n }\n } else if (type === 'object' && value !== null) {\n const transformedValue = {};\n for (let key in value) {\n if (!Object.prototype.hasOwnProperty.call(value, key)) continue;\n const subValue = value[key];\n let subDef;\n if (key.indexOf('/') >= 0) { // for deep update keys\n if (transformType === 'decrypt') {\n throw new Error(`Internal error: attempting to decrypt deep path key \"${key}\"`);\n }\n const keyParts = key.split('/');\n subDef = def;\n for (i = 0; i < keyParts.length; i++) {\n subDef = subDef && (subDef[keyParts[i]] || subDef.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n keyParts[i] =\n this[transformType](keyParts[i], 'string', subDef['.encrypt'].key, false);\n }\n }\n key = keyParts.join('/');\n } else if (transformType === 'decrypt') {\n key = this.decrypt(key);\n subDef = def && (def[key] || def.$);\n } else {\n subDef = def && (def[key] || def.$);\n if (subDef && subDef['.encrypt'] && subDef['.encrypt'].key) {\n key = this[transformType](key, 'string', subDef['.encrypt'].key, false);\n }\n }\n transformedValue[key] = this._transformTree(subValue, subDef, transformType);\n }\n value = transformedValue;\n } else if (type === 'array') {\n if (transformType === 'encrypt' && !def.$) return value;\n for (i = 0; i < value.length; i++) {\n value[i] = this._transformTree(value[i], def && def.$, transformType);\n }\n }\n return value;\n }\n\n refToPath(ref, encrypted) {\n const root = ref.root;\n if (ref.isEqual(root)) return [];\n const pathStr = decodeURIComponent(ref.toString().slice(root.toString().length));\n if (!encrypted && pathStr && pathStr.charAt(0) !== '.' &&\n /[\\x00-\\x1f\\x7f\\x91\\x92.#$[\\]]/.test(pathStr)) { // eslint-disable-line no-control-regex\n throw new FireCryptError(`Path contains invalid characters: ${pathStr}`, 'BAD_PATH');\n }\n return pathStr.split('/');\n }\n\n encrypt(value, type, pattern, allowCompression) {\n const shouldCompress =\n pattern === '#' && allowCompression && type === 'string' && this._compress &&\n value.length >= this._compressionThreshold;\n if (!this._encryptString && !shouldCompress) return value;\n let cacheKey;\n if (this._encryptionCache) {\n cacheKey = type.charAt(0) + pattern + '\\x91' + value;\n if (this._encryptionCache.has(cacheKey)) return this._encryptionCache.get(cacheKey);\n }\n let typeCode = type.charAt(0).toUpperCase();\n let result;\n if (pattern === '#') {\n if (shouldCompress) {\n const compressedValue = this._compress(value);\n if (!this._encryptString && typeof compressedValue === 'string') return value;\n if (this._encryptString) {\n typeCode = 'E';\n result = this.encryptValue(compressedValue, type);\n } else {\n typeCode = 'C';\n result = this._base64UrlFromU8(compressedValue);\n }\n } else {\n result = this.encryptValue(value, type);\n }\n if (result !== value) {\n result = `\\x91${typeCode}${result}\\x92`;\n if (this._encryptionCache) this._encryptionCache.set(cacheKey, result);\n }\n } else {\n if (type !== 'string') {\n throw new FireCryptError(`Can't encrypt a ${type} using pattern [${pattern}]`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n const match = value.match(this.compilePattern(pattern));\n if (!match) {\n throw new FireCryptError(\n `Can't encrypt as value doesn't match pattern [${pattern}]: ${value}`, 'BAD_VALUE');\n }\n let i = 0;\n result = pattern.replace(/[#.]/g, placeholder => {\n let part = match[++i];\n if (placeholder === '#') part = `\\x91S${this.encryptValue(part, 'string')}\\x92`;\n return part;\n });\n }\n return result;\n }\n\n encryptValue(value, type) {\n if (!/^(string|number|boolean)$/.test(type)) {\n throw new FireCryptError(`Can't encrypt a ${type}`, 'BAD_VALUE');\n }\n if (!this._encryptString) return value;\n switch (type) {\n case 'number': value = '' + value; break;\n case 'boolean': value = value ? 't' : 'f'; break;\n }\n return this._encryptString(value);\n }\n\n decrypt(value) {\n if (this._decryptionCache && this._decryptionCache.has(value)) {\n return this._decryptionCache.get(value);\n }\n if (!/\\x91/.test(value)) return value;\n let result;\n const match = value.match(/^\\x91(.)([^\\x92]*)\\x92$/);\n if (match) {\n if (match[1] !== 'C' && !this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n switch (match[1]) {\n case 'C': // compressed, not encrypted string\n result = fflate.strFromU8(fflate.decompressSync(this._base64UrlToU8(match[2])));\n break;\n case 'E': // compressed, encrypted string\n result = fflate.strFromU8(fflate.decompressSync(\n this._wordsToU8(this._decryptString(match[2], false))));\n break;\n case 'S': // encrypted string\n result = this._decryptString(match[2], true);\n break;\n case 'N': { // encrypted number\n const decryptionResult = this._decryptString(match[2], true);\n result = Number(decryptionResult);\n // Check for NaN, since it's the only value where x !== x.\n // eslint-disable-next-line no-self-compare\n if (result !== result) {\n throw new FireCryptError(`Invalid encrypted number: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n case 'B': { // encrypted boolean\n const decryptionResult = this._decryptString(match[2], true);\n switch (decryptionResult) {\n case 't': result = true; break;\n case 'f': result = false; break;\n default:\n throw new FireCryptError(\n `Invalid encrypted boolean: ${decryptionResult}`, 'BAD_VALUE');\n }\n break;\n }\n default:\n throw new Error(`Internal error: invalid encrypted value type code: ${match[1]}`);\n }\n } else {\n if (!this._decryptString) {\n throw new FireCryptError('Unable to decrypt value because encryption turned off', 'NO_KEY');\n }\n result = value.replace(/\\x91(.)([^\\x92]*)\\x92/g, (ignored, typeCode, encryptedString) => {\n if (typeCode !== 'S') {\n throw new Error(`Internal error: invalid multi-segment encrypted value: ${typeCode}`);\n }\n return this._decryptString(encryptedString, true);\n });\n }\n if (this._decryptionCache) this._decryptionCache.set(value, result);\n return result;\n }\n\n _wordsToU8(wordArray) {\n const {sigBytes, words} = wordArray;\n const uint8Array = new Uint8Array(sigBytes);\n for (let i = 0; i < sigBytes; i++) {\n // eslint-disable-next-line no-bitwise\n uint8Array[i] = (words[i >>> 2] >>> (24 - (i % 4) * 8)) & 0xff;\n }\n return uint8Array;\n };\n\n getType(value) {\n if (Array.isArray(value)) return 'array';\n let type = typeof value;\n if (type === 'object') {\n if (value instanceof String) type = 'string';\n else if (value instanceof Number) type = 'number';\n else if (value instanceof Boolean) type = 'boolean';\n }\n return type;\n }\n\n compilePattern(pattern) {\n let regex = this._patternRegexes[pattern];\n if (!regex) {\n regex = this._patternRegexes[pattern] = new RegExp('^' + pattern\n .replace(/\\./g, '#')\n .replace(/[-[\\]/{}()*+?.\\\\^$|]/g, '\\\\$&') // escape regex chars\n .replace(/#/g, '(.*?)') + '$');\n }\n return regex;\n }\n\n _base64UrlFromU8(bytes) {\n return btoa(Array.from(bytes, b => String.fromCharCode(b)).join(''))\n .replace(/\\+/g, '-')\n .replace(/\\//g, '_')\n .replace(/=+$/, '');\n }\n\n _base64UrlToU8(b64url) {\n return Uint8Array.from(atob(\n b64url.replace(/-/g, '+')\n .replace(/_/g, '/')\n .padEnd(Math.ceil(b64url.length / 4) * 4, '=')\n ), c => c.charCodeAt(0));\n }\n}\n","import FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptSnapshot {\n constructor(snap, firecrypt) {\n this._ref = firecrypt._crypto.decryptRef(snap.ref);\n this._path = firecrypt._crypto.refToPath(this._ref);\n this._snap = snap;\n this._firecrypt = firecrypt;\n }\n\n get key() {\n return this._ref.key;\n }\n\n get ref() {\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n val() {\n return this._firecrypt._crypto.transformValue(this._path, this._snap.val(), 'decrypt');\n }\n\n child(childPath) {\n return new FireCryptSnapshot(this._snap.child(childPath), this._firecrypt);\n }\n\n forEach(action) {\n return this._snap.forEach(childSnap => {\n return action(new FireCryptSnapshot(childSnap), this._firecrypt);\n });\n }\n\n exists() {\n return this._snap.exists.apply(this._snap, arguments);\n }\n\n hasChild(childPath) {\n childPath = this._firecrypt._crypto.encryptPath(\n childPath.split('/'), this._firecrypt._crypto.specForPath(this._path)).join('/');\n return this._snap.hasChild(childPath);\n }\n\n hasChildren() {\n return this._snap.hasChildren.apply(this._snap, arguments);\n }\n\n numChildren() {\n return this._snap.numChildren.apply(this._snap, arguments);\n }\n\n toJSON() {\n const json = this._snap.toJSON.apply(this._snap, arguments);\n return this._firecrypt._crypto.transformValue(this._path, json, 'decrypt');\n }\n}\n","import FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptReference from './FireCryptReference';\n\nexport default class FireCryptQuery {\n constructor(query, order, originalRef, firecrypt) {\n this._query = query;\n this._order = order || {};\n this._originalRef = originalRef || query;\n this._firecrypt = firecrypt;\n }\n\n _wrapQueryCallback(callback) {\n if (!callback || callback.firecryptCallback) return;\n const self = this;\n const wrappedCallback = function(snap, previousChildKey) {\n return callback.call( // eslint-disable-next-line no-invalid-this\n this, new FireCryptSnapshot(snap, self._firecrypt), previousChildKey, self._firecrypt);\n };\n wrappedCallback.firecryptCallback = wrappedCallback;\n callback.firecryptCallback = wrappedCallback;\n }\n\n get ref() {\n return new FireCryptReference(\n this._firecrypt._crypto.decryptRef(this._query.ref), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._query.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptQuery is equivalent to the provided\n * FireCryptQuery.\n * @param {FireCryptQuery} otherQuery Another FireCryptQuery instance against which to compare.\n * @return {boolean} Whether the two queries are equivalent.\n */\n isEqual(otherQuery) {\n return this._query.isEqual(otherQuery && (otherQuery._query || otherQuery._ref));\n }\n\n /**\n * Stringifies the wrapped query.\n * @return {string} The Firebase URL wrapped by this FireCryptQuery object.\n */\n toString() {\n return this._query.toString();\n }\n\n on(eventType, callback, cancelCallback, context) {\n this._wrapQueryCallback(callback);\n return this._originalRef.on.call(\n this._query, eventType, callback.firecryptCallback, cancelCallback, context);\n }\n\n off(eventType, callback, context) {\n if (callback && callback.firecryptCallback) callback = callback.firecryptCallback;\n return this._originalRef.off.call(this._query, eventType, callback, context);\n }\n\n once(eventType, successCallback, failureCallback, context) {\n this._wrapQueryCallback(successCallback);\n return this._originalRef.once.call(\n this._query, eventType, successCallback && successCallback.firecryptCallback, failureCallback,\n context\n ).then(snap => {\n return new FireCryptSnapshot(snap, this._firecrypt);\n });\n }\n\n orderByChild(key) {\n return this._orderBy('orderByChild', 'child', key);\n }\n\n orderByKey() {\n return this._orderBy('orderByKey', 'key');\n }\n\n orderByValue() {\n return this._orderBy('orderByValue', 'value');\n }\n\n startAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('startAt', arguments);\n }\n\n endAt(value, key) {\n this._checkCanSort(key !== undefined);\n return this._delegate('endAt', arguments);\n }\n\n equalTo(value, key) {\n if (this._order[this._order.by + 'Encrypted']) {\n value = this._firecrypt._crypto.encrypt(\n value, this._firecrypt._crypto.getType(value), this._order[this._order.by + 'Encrypted']);\n }\n if (key !== undefined && this._order.keyEncrypted) {\n key = this._firecrypt._crypto.encrypt(key, 'string', this._order.keyEncrypted);\n }\n return new FireCryptQuery(\n this._originalRef.equalTo.call(this._query, value, key), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n limitToFirst() {\n return this._delegate('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._delegate('limitToLast', arguments);\n }\n\n _delegate(methodName, args) {\n return new FireCryptQuery(\n this._originalRef[methodName].apply(this._query, args), this._order, this._originalRef,\n this._firecrypt\n );\n }\n\n _checkCanSort(hasExtraKey) {\n const orderedAndEncrypted = this._order.by === 'key' ?\n this._order.keyEncrypted :\n this._order.valueEncrypted || hasExtraKey && this._order.keyEncrypted;\n if (orderedAndEncrypted) throw new Error('Encrypted items cannot be ordered');\n }\n\n _orderBy(methodName, by, childKey) {\n const def = this._firecrypt._crypto.specForPath(this._firecrypt._crypto.refToPath(this.ref));\n const order = {by};\n\n let encryptedChildKey;\n if (def) {\n const childPath = childKey && childKey.split('/');\n for (const subKey in def) {\n if (!Object.prototype.hasOwnProperty.call(def, subKey)) continue;\n const subDef = def[subKey];\n if (subDef['.encrypt']) {\n if (subDef['.encrypt'].key) order.keyEncrypted = subDef['.encrypt'].key;\n if (subDef['.encrypt'].value) order.valueEncrypted = subDef['.encrypt'].value;\n }\n if (childKey) {\n const childDef = this._firecrypt._crypto.specForPath(childPath, subDef);\n if (childDef && childDef['.encrypt'] && childDef['.encrypt'].value) {\n order.childEncrypted = childDef['.encrypt'].value;\n }\n const encryptedChildKeyCandidate =\n this._firecrypt._crypto.encryptPath(childPath, subDef).join('/');\n if (encryptedChildKey && encryptedChildKeyCandidate !== encryptedChildKey) {\n throw new Error(\n 'Incompatible encryption specifications for orderByChild(\"' + childKey + '\")');\n }\n encryptedChildKey = encryptedChildKeyCandidate;\n }\n }\n }\n if (childKey) {\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query, encryptedChildKey || childKey), order,\n this._originalRef, this._firecrypt\n );\n }\n return new FireCryptQuery(\n this._originalRef[methodName].call(this._query), order, this._originalRef, this._firecrypt\n );\n }\n}\n","export default class FireCryptOnDisconnect {\n constructor(path, originalOnDisconnect, crypto) {\n this._path = path;\n this._crypto = crypto;\n this._originalOnDisconnect = originalOnDisconnect;\n }\n\n _interceptOnDisconnectWrite(methodName, originalArguments, argIndex) {\n const self = this;\n\n this[methodName] = function() {\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n args[argIndex] = self._crypto.transformValue(self._path, args[argIndex], 'encrypt');\n }\n\n return self._originalOnDisconnect[methodName].apply(self._originalOnDisconnect, args);\n };\n }\n\n set() {\n return this._interceptOnDisconnectWrite('set', arguments, 0);\n }\n\n update() {\n return this._interceptOnDisconnectWrite('update', arguments, 0);\n }\n\n remove() {\n return this._interceptOnDisconnectWrite('remove', arguments);\n }\n\n cancel() {\n return this._interceptOnDisconnectWrite('cancel', arguments);\n }\n}\n","import FireCryptQuery from './FireCryptQuery';\nimport FireCryptSnapshot from './FireCryptSnapshot';\nimport FireCryptOnDisconnect from './FireCryptOnDisconnect';\n\nlet childrenKeysFromLib;\nif (typeof require !== 'undefined') {\n try {\n childrenKeysFromLib = require('firebase-childrenkeys'); // eslint-disable-line no-undef\n } catch {\n // Library is optional, so ignore any errors from failure to load it.\n }\n}\n\nexport default class FireCryptReference {\n constructor(ref, firecrypt) {\n this._ref = ref;\n this._firecrypt = firecrypt;\n }\n\n _interceptQuery(methodName, originalArguments) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const query = new FireCryptQuery(encryptedRef, {}, this._ref, this._firecrypt);\n return query[methodName].apply(query, originalArguments);\n }\n\n _interceptWrite(methodName, originalArguments, argIndex) {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n\n const args = Array.prototype.slice.call(originalArguments);\n if (argIndex >= 0 && argIndex < args.length) {\n const path = this._firecrypt._crypto.refToPath(this._ref);\n args[argIndex] = this._firecrypt._crypto.transformValue(path, args[argIndex], 'encrypt');\n }\n\n return this._ref[methodName].apply(encryptedRef, args);\n }\n\n /**\n * Returns a placeholder value for auto-populating the current timestamp (time since the Unix\n * epoch, in milliseconds) as determined by the Firebase servers.\n * @return {Object} A timestamp placeholder value.\n */\n static get SERVER_TIMESTAMP() {\n return {\n '.sv': 'timestamp'\n };\n }\n\n /**\n * Returns the last part of this reference's path. The key of a root reference is `null`.\n * @return {string|null} The last part this reference's path.\n */\n get key() {\n return this._ref.key;\n }\n\n /**\n * Returns just the path component of the reference's URL.\n * @return {string} The path component of the Firebase URL wrapped by this reference.\n */\n get path() {\n return decodeURIComponent(this._ref.toString()).slice(this._ref.root.toString().length - 1);\n }\n\n /**\n * Returns a FireCryptReference at the same location as this query or reference.\n * @return {FireCryptReference|null} A FireCryptReference at the same location as this query or\n * reference.\n */\n get ref() {\n if (this._ref.isEqual(this._ref.ref)) return this;\n return new FireCryptReference(this._ref.ref, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference reference to the root of the database.\n * @return {FireCryptReference} The root reference of the database.\n */\n get root() {\n if (this._ref.isEqual(this._ref.root)) return this;\n return new FireCryptReference(this._ref.root, this._firecrypt);\n }\n\n /**\n * Returns a FireCryptReference to the parent location of this reference. The parent of a root\n * reference is `null`.\n * @return {FireCryptReference|null} The parent location of this reference.\n */\n get parent() {\n if (this._ref.parent === null) return null;\n return new FireCryptReference(this._ref.parent, this._firecrypt);\n }\n\n /**\n * Returns the FireCrypt instance associated with this reference.\n * @return {FireCrypt} The FireCrypt instance associated with this reference.\n */\n get database() {\n return this._firecrypt;\n }\n\n /**\n * Creates a new FireCryptReference object on a child of this one.\n * @param {string} path The path to the desired child, relative to this reference.\n * @return {FireCryptReference} The child reference.\n */\n child(path) {\n return new FireCryptReference(this._ref.child(path), this._firecrypt);\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n * @return {Object} A JSON-serializable representation of this object.\n */\n toJSON() {\n return this._ref.toJSON();\n }\n\n /**\n * Returns whether or not this FireCryptReference is equivalent to the provided\n * FireCryptReference.\n * @param {FireCryptReference} otherRef Another FireCryptReference instance against which to\n * compare.\n * @return {boolean} Whether the two references are equivalent.\n */\n isEqual(otherRef) {\n return this._ref.isEqual(otherRef && (otherRef._ref || otherRef._query));\n }\n\n /**\n * Stringifies the wrapped reference.\n * @return {string} The Firebase URL wrapped by this FireCryptReference object.\n */\n toString() {\n return this._ref.toString();\n }\n\n push() {\n const pushedRef = this.child(this._ref.push().key);\n\n let promise;\n if (typeof arguments[0] === 'undefined') {\n // A bare pushed ref should also be thennable.\n promise = Promise.resolve();\n } else {\n promise = pushedRef.set.apply(pushedRef, arguments);\n }\n\n pushedRef.then = promise.then.bind(promise);\n pushedRef.catch = promise.catch.bind(promise);\n if (promise.finally) pushedRef.finally = promise.finally.bind(promise);\n\n return pushedRef;\n }\n\n set() {\n return this._interceptWrite('set', arguments, 0);\n }\n\n remove() {\n return this._interceptWrite('remove', arguments);\n }\n\n update() {\n return this._interceptWrite('update', arguments, 0);\n }\n\n childrenKeys() {\n const originalMethod = this._ref.childrenKeys || childrenKeysFromLib;\n\n if (typeof originalMethod !== 'function') {\n throw new Error(\n `childrenKeys() is not implemented. You must either provide a Firebase Database Reference\n which implements childrenKeys() or npm install the firebase-children keys libary.`\n );\n }\n\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return originalMethod.apply(encryptedRef, [encryptedRef, ...arguments]).then(keys => {\n if (!keys.some(key => /\\x91/.test(key))) {\n return keys;\n }\n return keys.map(this._firecrypt._crypto.decrypt.bind(this._firecrypt._crypto));\n });\n }\n\n onDisconnect() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n return new FireCryptOnDisconnect(\n encryptedRef, this._ref.onDisconnect.call(encryptedRef), this._crypto);\n }\n\n on() {\n return this._interceptQuery('on', arguments);\n }\n\n off() {\n return this._interceptQuery('off', arguments);\n }\n\n once() {\n return this._interceptQuery('once', arguments);\n }\n\n orderByChild() {\n return this._interceptQuery('orderByChild', arguments);\n }\n\n orderByKey() {\n return this._interceptQuery('orderByKey', arguments);\n }\n\n orderByValue() {\n return this._interceptQuery('orderByValue', arguments);\n }\n\n startAt() {\n return this._interceptQuery('startAt', arguments);\n }\n\n endAt() {\n return this._interceptQuery('endAt', arguments);\n }\n\n equalTo() {\n return this._interceptQuery('equalTo', arguments);\n }\n\n limitToFirst() {\n return this._interceptQuery('limitToFirst', arguments);\n }\n\n limitToLast() {\n return this._interceptQuery('limitToLast', arguments);\n }\n\n transaction() {\n const encryptedRef = this._firecrypt._crypto.encryptRef(this._ref);\n const path = this._firecrypt._crypto.refToPath(this._ref);\n\n const args = Array.prototype.slice.call(arguments);\n const originalCompute = args[0];\n args[0] = originalCompute && (value => {\n value = this._firecrypt._crypto.transformValue(path, value, 'decrypt');\n value = originalCompute(value);\n value = this._firecrypt._crypto.transformValue(path, value, 'encrypt');\n return value;\n });\n if (args.length > 1) {\n const originalOnComplete = args[1];\n args[1] = originalOnComplete && ((error, committed, snapshot) => {\n return originalOnComplete(\n error, committed, snapshot && new FireCryptSnapshot(snapshot, this._firecrypt));\n });\n }\n return this._ref.transaction.apply(encryptedRef, args).then(result => {\n result.snapshot =\n result.snapshot && new FireCryptSnapshot(result.snapshot, this._firecrypt);\n return result;\n });\n }\n}\n","if (typeof require !== 'undefined') {\n /* eslint-disable no-undef */\n if (typeof fflate === 'undefined') global.fflate = require('fflate');\n if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache');\n if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core');\n require('crypto-js/lib-typedarrays');\n require('crypto-js/enc-base64');\n require('crypto-js/enc-base64url');\n require('cryptojs-extension/build_node/siv');\n /* eslint-enable no-undef */\n}\n\nimport Crypto from './crypto';\nimport FireCryptError from './FireCryptError';\nimport FireCryptReference from './FireCryptReference';\n\nclass FireCrypt {\n constructor(db) {\n const dbIsNonNullObject = typeof db === 'object' && db !== null;\n if (!dbIsNonNullObject || typeof db.app !== 'object' || typeof db.ref !== 'function') {\n throw new Error(\n `Expected first argument passed to FireCrypt constructor to be a Firebase Database ` +\n `instance, but got \"${db}\".`\n );\n }\n\n this._db = db;\n this._crypto = undefined;\n }\n\n _ensureEncryptionConfigured() {\n if (typeof this._crypto === 'undefined') {\n throw new FireCryptError(\n 'Encryption for this FireCrypt reference has not been configured yet.', 'BAD_CONFIG');\n }\n }\n\n _setupAesSiv(key, checkValue) {\n const siv = CryptoJS.SIV.create(CryptoJS.enc.Base64.parse(key));\n const encryptString = strOrU8 => {\n const str = typeof strOrU8 === 'string' ? strOrU8 : CryptoJS.lib.WordArray.create(strOrU8);\n return CryptoJS.enc.Base64url.stringify(siv.encrypt(str));\n };\n const decryptString = (str, decode) => {\n const result = siv.decrypt(CryptoJS.enc.Base64url.parse(str));\n if (result === false) throw new FireCryptError('Wrong decryption key', 'WRONG_KEY');\n return decode ? CryptoJS.enc.Utf8.stringify(result) : result;\n };\n\n this._crypto.setStringEncryptionFunctions(encryptString, decryptString);\n\n if (checkValue) decryptString(checkValue, true);\n return encryptString(CryptoJS.enc.Base64url.stringify(CryptoJS.lib.WordArray.random(10)));\n }\n\n configureFireCrypt(options = {}, specification = {}) {\n if (typeof options !== 'object' || options === null) {\n throw new Error(\n `Expected second argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${options}\".`\n );\n } else if (typeof specification !== 'object' || specification === null) {\n throw new Error(\n `Expected third argument passed to configureFireCrypt() to be an object, but got ` +\n `\"${specification}\".`\n );\n }\n\n options.cacheSize = options.cacheSize || 5 * 1000 * 1000;\n options.encryptionCacheSize = options.encryptionCacheSize || options.cacheSize;\n options.decryptionCacheSize = options.decryptionCacheSize || options.cacheSize;\n\n this._crypto = new Crypto(options, specification);\n\n let result;\n\n switch (options.encryption) {\n case 'aes-siv':\n if (!options.key) {\n throw new FireCryptError('You must specify a key to use AES encryption.', 'BAD_CONFIG');\n }\n result = this._setupAesSiv(options.key, options.keyCheckValue);\n break;\n case 'none':\n // Don't set any string encryption functions.\n break;\n case 'notready': {\n function throwNotSetUpError() {\n throw new FireCryptError('Encryption not set up', 'NO_KEY');\n }\n this._crypto.setStringEncryptionFunctions(throwNotSetUpError, throwNotSetUpError);\n break;\n }\n default:\n throw new FireCryptError(\n `Unknown encryption algorithm \"${options.encryption}\".`, 'BAD_CONFIG');\n }\n\n // Make the encryption key check value available off of this FireCrypt instance and therefore\n // off of admin.database().\n this.encryptionKeyCheckValue = result;\n\n return result;\n }\n\n get fireCryptStats() {\n this._ensureEncryptionConfigured();\n return this._crypto.stats;\n }\n\n goOnline() {\n this._ensureEncryptionConfigured();\n return this._db.goOnline();\n }\n\n goOffline() {\n this._ensureEncryptionConfigured();\n return this._db.goOffline();\n }\n\n get app() {\n return this._db.app;\n }\n\n ref(path) {\n this._ensureEncryptionConfigured();\n\n if (typeof path !== 'undefined' && typeof path !== 'string') {\n throw new Error(\n `Expected first argument passed to ref() to be undefined or a string, but got \"${path}\".`\n );\n }\n\n return new FireCryptReference(this._db.ref(path), this);\n }\n\n refFromURL(url) {\n this._ensureEncryptionConfigured();\n\n if (typeof url !== 'string' || url.match(/^https:\\/\\/.*/g) === null) {\n throw new Error(\n `Expected first argument passed to refFromURL() to be a string URL, but got \"${url}\".`\n );\n }\n\n return new FireCryptReference(this._db.refFromURL(url), this);\n }\n}\n\n\nexport function wrapDatabase(database) {\n const fc = new FireCrypt(database);\n if (database.getRules) {\n fc.getRules = () => database.getRules();\n fc.getRulesJSON = () => database.getRulesJSON();\n fc.setRules = source => database.setRules(source);\n }\n return fc;\n}\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/eslint.config.mjs b/eslint.config.mjs index b9b5b21..5716f78 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -17,7 +17,7 @@ export default [ ...globals.es2017, CryptoJS: false, fflate: false, - LRUCache: false, + lrucache: false, }, ecmaVersion: 2019, sourceType: 'module', diff --git a/package.json b/package.json index 0ac07ef..0ccd4fa 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,7 @@ "crypto-js": "^4.0.0", "cryptojs-extension": "github:reviewable/cryptojs-extension", "fflate": "^0.8.2", - "serialized-lru-cache": "^3.1.0" + "lru-cache": "^11.2.6" }, "peerDependencies": { "firebase": "9.x || 10.x", diff --git a/src/crypto.js b/src/crypto.js index 95a337a..722cd1b 100644 --- a/src/crypto.js +++ b/src/crypto.js @@ -33,14 +33,14 @@ export default class Crypto { } this._compressionThreshold = options.compressionThreshold || 150; - if (typeof LRUCache === 'function') { - this._encryptionCache = new LRUCache({ - max: options.encryptionCacheSize, - length: this._computeCacheItemSize, + if (typeof lrucache !== 'undefined') { + this._encryptionCache = new lrucache.LRUCache({ + maxSize: options.encryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); - this._decryptionCache = new LRUCache({ - max: options.decryptionCacheSize, - length: this._computeCacheItemSize, + this._decryptionCache = new lrucache.LRUCache({ + maxSize: options.decryptionCacheSize, + sizeCalculation: this._computeCacheItemSize, }); } diff --git a/src/firecrypt.js b/src/firecrypt.js index ea83cee..b5e6fbe 100644 --- a/src/firecrypt.js +++ b/src/firecrypt.js @@ -1,7 +1,7 @@ if (typeof require !== 'undefined') { /* eslint-disable no-undef */ if (typeof fflate === 'undefined') global.fflate = require('fflate'); - if (typeof LRUCache === 'undefined') global.LRUCache = require('lru-cache'); + if (typeof lrucache === 'undefined') global.lrucache = require('lru-cache'); if (typeof CryptoJS === 'undefined') global.CryptoJS = require('crypto-js/core'); require('crypto-js/lib-typedarrays'); require('crypto-js/enc-base64'); diff --git a/tools/package-lock.json b/tools/package-lock.json index bc1d1b2..ba9f327 100644 --- a/tools/package-lock.json +++ b/tools/package-lock.json @@ -1,23 +1,23 @@ { "name": "firecrypt-tools", - "version": "0.7.0", + "version": "0.7.1", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "firecrypt-tools", - "version": "0.7.0", + "version": "0.7.1", "license": "MIT", "dependencies": { "agentkeepalive": "^4.1.3", "command-line-args": "^5.1.1", "command-line-usage": "^6.1.0", "crypto-js": "^4.0.0", - "cryptojs-extension": "github:pkaminski/cryptojs-extension", + "cryptojs-extension": "github:Reviewable/cryptojs-extension", "fflate": "^0.8.2", "firebase-admin": "^11.4.1", "lodash": "^4.17.20", - "lru-cache": "^6.0.0", + "lru-cache": "^11.2.6", "ms": "^2.1.2", "nodefire": "^3.1.2", "pace": "0.0.4", @@ -745,16 +745,17 @@ "optional": true }, "node_modules/crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==", + "license": "MIT" }, "node_modules/cryptojs-extension": { "version": "0.2.2-dev", - "resolved": "git+ssh://git@github.com/pkaminski/cryptojs-extension.git#347c0e22a83ab631158356d96fa403c4ea8b9d49", + "resolved": "git+ssh://git@github.com/Reviewable/cryptojs-extension.git#7804ff5c0fa250e19a9ea81abb609d88783ab9d8", "license": "MIT", "dependencies": { - "crypto-js": "^4.0.0" + "crypto-js": "^4.2.0" } }, "node_modules/debug": { @@ -1257,6 +1258,19 @@ "node": ">=12" } }, + "node_modules/google-auth-library/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "optional": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/google-gax": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/google-gax/-/google-gax-3.5.2.tgz", @@ -1598,14 +1612,12 @@ "optional": true }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==", + "license": "BlueOak-1.0.0", "engines": { - "node": ">=10" + "node": "20 || >=22" } }, "node_modules/lru-memoizer": { @@ -1788,6 +1800,18 @@ "node": ">=8.0" } }, + "node_modules/nodefire/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/object-hash": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", @@ -2140,6 +2164,18 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/sleep-promise": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/sleep-promise/-/sleep-promise-9.1.0.tgz", @@ -2519,7 +2555,8 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" }, "node_modules/yargs": { "version": "16.2.0", @@ -3168,15 +3205,15 @@ "optional": true }, "crypto-js": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", - "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.2.0.tgz", + "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==" }, "cryptojs-extension": { - "version": "git+ssh://git@github.com/pkaminski/cryptojs-extension.git#347c0e22a83ab631158356d96fa403c4ea8b9d49", - "from": "cryptojs-extension@github:pkaminski/cryptojs-extension", + "version": "git+ssh://git@github.com/Reviewable/cryptojs-extension.git#7804ff5c0fa250e19a9ea81abb609d88783ab9d8", + "from": "cryptojs-extension@github:Reviewable/cryptojs-extension", "requires": { - "crypto-js": "^4.0.0" + "crypto-js": "^4.2.0" } }, "debug": { @@ -3550,6 +3587,17 @@ "gtoken": "^6.1.0", "jws": "^4.0.0", "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "optional": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "google-gax": { @@ -3841,12 +3889,9 @@ "optional": true }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } + "version": "11.2.6", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.2.6.tgz", + "integrity": "sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ==" }, "lru-memoizer": { "version": "2.1.4", @@ -3975,6 +4020,16 @@ "lodash": "4.17.21", "lru-cache": "6.x", "safe-timers": "1.x" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "object-hash": { @@ -4228,6 +4283,16 @@ "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", "requires": { "lru-cache": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + } } }, "sleep-promise": { diff --git a/tools/package.json b/tools/package.json index 8939b78..69f075f 100644 --- a/tools/package.json +++ b/tools/package.json @@ -1,15 +1,14 @@ { "name": "firecrypt-tools", - "version": "0.7.1", + "version": "0.8.0", "description": "Utilities for managing a Firebase encrypted with firecrypt", "main": "recrypt.js", "bin": { "recrypt": "./recrypt.js" }, - "scripts": { - }, + "scripts": {}, "engines": { - "node": ">=12.x" + "node": ">=20.x" }, "repository": "https://github.com/Reviewable/firecrypt", "keywords": [ @@ -32,7 +31,7 @@ "fflate": "^0.8.2", "firebase-admin": "^11.4.1", "lodash": "^4.17.20", - "lru-cache": "^6.0.0", + "lru-cache": "^11.2.6", "ms": "^2.1.2", "nodefire": "^3.1.2", "pace": "0.0.4", diff --git a/tools/recrypt_worker.js b/tools/recrypt_worker.js index 5513d14..1a04f97 100644 --- a/tools/recrypt_worker.js +++ b/tools/recrypt_worker.js @@ -2,7 +2,7 @@ const _ = require('lodash'); const NodeFire = require('nodefire').default; -const LRUCache = require('lru-cache'); +const {LRUCache} = require('lru-cache'); const fflate = require('fflate'); const CryptoJS = require('crypto-js/core'); @@ -15,9 +15,9 @@ const ALREADY_RECRYPTED = {}; const CACHE_SIZE = 10 * 1000 * 1000; const caches = { - encryptNew: new LRUCache({max: CACHE_SIZE, length: computeCacheItemSize}), - encryptOld: new LRUCache({max: CACHE_SIZE, length: computeCacheItemSize}), - decrypt: new LRUCache({max: CACHE_SIZE, length: computeCacheItemSize}) + encryptNew: new LRUCache({maxSize: CACHE_SIZE, sizeCalculation: computeCacheItemSize}), + encryptOld: new LRUCache({maxSize: CACHE_SIZE, sizeCalculation: computeCacheItemSize}), + decrypt: new LRUCache({maxSize: CACHE_SIZE, sizeCalculation: computeCacheItemSize}) }; _.forEach(caches, cache => {cache.stats = {hits: 0, misses: 0};}); diff --git a/yarn.lock b/yarn.lock index 2e422d8..bb36902 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1394,6 +1394,11 @@ lodash@^4.17.21: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== +lru-cache@^11.2.6: + version "11.2.6" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-11.2.6.tgz#356bf8a29e88a7a2945507b31f6429a65a192c58" + integrity sha512-ESL2CrkS/2wTPfuend7Zhkzo2u0daGJ/A2VucJOgQ/C48S/zB8MMeMHSGKYpXhIjbPxfuezITkaBH1wqv00DDQ== + math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9" @@ -1698,11 +1703,6 @@ semver@^7.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.3.tgz#4b5f4143d007633a8dc671cd0a6ef9147b8bb946" integrity sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q== -serialized-lru-cache@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/serialized-lru-cache/-/serialized-lru-cache-3.1.0.tgz#df31926dc0b260d2028f75c6ee015c7896f1b71e" - integrity sha512-0H0SDeQ6cF/hE+JjzxWJRMVlgbqgS6o8p7zottQC9RBw8HtQgqEDQhPCzTjK1QGc6o7vhIrUm0CZSQJFdKbutw== - set-function-length@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"