{"version":3,"sources":["jsdelivr-header.js","/npm/react-native-mosquito-transport@0.0.49/src/index.js"],"names":[],"mappings":"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","file":"/npm/react-native-mosquito-transport@0.0.49/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/react-native-mosquito-transport@0.0.49/src/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import 'react-native-get-random-values';\nimport { deserializeE2E, listenReachableServer, serializeE2E } from \"./helpers/peripherals\";\nimport { awaitStore, releaseCacheStore } from \"./helpers/utils\";\nimport { CacheStore, Scoped } from \"./helpers/variables\";\nimport { MTCollection, batchWrite, onCollectionConnect, trySendPendingWrite } from \"./products/database\";\nimport { MTStorage } from \"./products/storage\";\nimport { ServerReachableListener, TokenRefreshListener } from \"./helpers/listeners\";\nimport { initTokenRefresher, listenToken, listenTokenReady, triggerAuthToken } from \"./products/auth/accessor\";\nimport { TIMESTAMP, DOCUMENT_EXTRACTION, FIND_GEO_JSON, GEO_JSON, TIMESTAMP_OFFSET } from \"./products/database/types\";\nimport { mfetch } from \"./products/http_callable\";\nimport { io } from \"socket.io-client\";\nimport { AUTH_PROVIDER_ID } from \"./helpers/values\";\nimport EngineApi from './helpers/engine_api';\nimport { Validator } from 'guard-object';\nimport { Buffer } from 'buffer';\nimport MTAuth, { purgePendingToken } from './products/auth';\nimport { BSON } from \"./vendor/bson\";\nimport { basicClone } from './helpers/basic_clone';\nimport { AppState } from \"react-native\";\n\nconst {\n    _listenCollection,\n    _listenDocument,\n    _startDisconnectWriteTask,\n    _cancelDisconnectWriteTask,\n    _listenUserVerification,\n    _areYouOk\n} = EngineApi;\n\n// https://socket.io/docs/v3/emit-cheatsheet/#reserved-events\nconst reservedEventName = [\n    'connect',\n    'connect_error',\n    'disconnect',\n    'disconnecting',\n    'newListener',\n    'removeListener'\n];\n\nclass RNMT {\n    constructor(config) {\n        validateMTConfig(config, this);\n        this.config = {\n            ...config,\n            dbName: config.dbName || '',\n            dbUrl: config.dbUrl || '',\n            serverE2E_PublicKey: config.serverE2E_PublicKey && new Uint8Array(Buffer.from(config.serverE2E_PublicKey, 'base64')),\n            castBSON: config.castBSON === undefined || config.castBSON,\n            maxRetries: config.maxRetries || 3,\n            uglify: config.enableE2E_Encryption\n        };\n        const { projectUrl, extraHeaders } = this.config;\n\n        this.config.secureUrl = projectUrl.startsWith('https');\n        this.config.baseUrl = projectUrl.split('://')[1];\n        this.config.wsPrefix = this.config.secureUrl ? 'wss' : 'ws';\n\n        if (!Scoped.ReleaseCacheData)\n            throw `initializeCache must be called before creating any ${this.constructor.name} instance`;\n\n        if (!Scoped.InitializedProject[projectUrl]) {\n            Scoped.InitializedProject[projectUrl] = basicClone(this.config);\n            triggerAuthToken(projectUrl);\n            initTokenRefresher({ config: this.config, forceRefresh: true });\n\n            let isConnected, recentToken, isVirtualMachineFocused = true;\n\n            const socket = io(`${this.config.wsPrefix}://${this.config.baseUrl}`, {\n                transports: ['websocket', 'polling', 'flashsocket'],\n                extraHeaders,\n                auth: {\n                    _m_internal: true,\n                    _from_base: true\n                }\n            });\n            let connectionIte = 0;\n            const onConnect = () => {\n                ++connectionIte;\n                isConnected = true;\n                Scoped.IS_CONNECTED[projectUrl] = true;\n                if (recentToken) updateMountedToken();\n                ServerReachableListener.dispatchPersist(projectUrl, true);\n                awaitStore().then(() => {\n                    if (isConnected) trySendPendingWrite(projectUrl);\n                });\n            };\n            const onDisconnect = () => {\n                ++connectionIte;\n                isConnected = isVirtualMachineFocused ? false : null;\n                Scoped.IS_CONNECTED[projectUrl] = isConnected;\n                ServerReachableListener.dispatchPersist(projectUrl, isConnected);\n            }\n\n            const manualCheckConnection = () => {\n                const ref = ++connectionIte;\n                fetch(_areYouOk(projectUrl), { credentials: 'omit' }).then(async r => {\n                    if ((await r.json()).status === 'yes') {\n                        if (ref === connectionIte) onConnect();\n                    } else throw null;\n                }).catch(() => {\n                    if (ref === connectionIte) onDisconnect();\n                });\n            }\n            manualCheckConnection();\n\n            socket.on('_signal_signout', () => {\n                this.auth().signOut();\n            });\n\n            socket.on('connect', onConnect);\n            socket.on('disconnect', () => {\n                manualCheckConnection();\n            });\n\n            AppState.addEventListener('change', (s) => {\n                isVirtualMachineFocused = s === 'active';\n                manualCheckConnection();\n            });\n\n            const updateMountedToken = () => {\n                socket.emit('_update_mounted_user', recentToken || null);\n            };\n\n            listenToken(token => {\n                recentToken = token;\n                if (isConnected) updateMountedToken();\n            }, projectUrl);\n\n            TokenRefreshListener.listenTo(projectUrl, v => {\n                Scoped.IS_TOKEN_READY[projectUrl] = v;\n            });\n        }\n    }\n\n    static initializeCache(prop) {\n        if (Scoped.ReleaseCacheData) throw `calling ${this.name}() multiple times is prohibited`;\n        validateReleaseCacheProp({ ...prop });\n        Scoped.ReleaseCacheData = { ...prop };\n        releaseCacheStore({ ...prop });\n        // purge residue tokens\n        awaitStore().then(() => {\n            Object.keys(CacheStore.PendingAuthPurge).forEach(k => {\n                purgePendingToken(k);\n            });\n        });\n    }\n\n    getDatabase = (dbName, dbUrl) => {\n        if (dbName) ConfigValidator.dbName(dbName);\n        if (dbUrl) ConfigValidator.dbUrl(dbUrl);\n\n        return {\n            collection: (path) => new MTCollection({\n                ...this.config,\n                path,\n                dbName: dbName || '',\n                dbUrl: dbUrl || ''\n            })\n        };\n    }\n\n    collection = (path) => new MTCollection({ ...this.config, path });\n\n    onConnect = () => onCollectionConnect({ ...this.config });\n\n    batchWrite = (map, configx) => batchWrite({ ...this.config }, map, configx);\n    auth = () => new MTAuth({ ...this.config });\n    storage = () => new MTStorage({ ...this.config });\n    fetchHttp = (endpoint, init, config) => mfetch(endpoint, init, { ...this.config, method: config });\n    listenReachableServer = (callback) => listenReachableServer(callback, this.config.projectUrl);\n\n    getSocket = (configOpts) => {\n        const { disableAuth, authHandshake, projectUrl: overidenUrl } = configOpts || {};\n        const { projectUrl, uglify, serverE2E_PublicKey, wsPrefix, extraHeaders } = this.config;\n\n        const restrictedRoute = [\n            _listenCollection,\n            _listenDocument,\n            _startDisconnectWriteTask,\n            _cancelDisconnectWriteTask,\n            _listenUserVerification\n        ].map(v => [v(), v(true)]).flat();\n\n        const makeSocketCallback = () =>\n            new Promise(resolve => {\n                socketReadyCallback = resolve;\n            });\n\n        let socketReadyCallback,\n            socketReadyPromise = makeSocketCallback(),\n            socketListenerList = [],\n            socketListenerIte = 0;\n\n        /**\n         * @type {import('socket.io-client').Socket}\n         */\n        let socket;\n        let hasCancelled,\n            tokenListener,\n            clientPrivateKey;\n\n        const listenerCallback = (route, callback) => async function () {\n            if (reservedEventName.includes(route)) {\n                callback?.(...[...arguments]);\n                return;\n            }\n\n            const [[args, not_encrypted], emitable] = [...arguments];\n            let res;\n\n            if (uglify) {\n                res = await deserializeE2E(args, serverE2E_PublicKey, clientPrivateKey);\n            } else res = args;\n            const sortedArgs = discloseSocketArguments([res, not_encrypted]);\n\n            callback?.(...sortedArgs, ...typeof emitable === 'function' ? [async function () {\n                const [args, not_encrypted] = encloseSocketArguments([...arguments]);\n                let res;\n\n                if (uglify) {\n                    res = (await serializeE2E(args, undefined, serverE2E_PublicKey))[0];\n                } else res = args;\n\n                emitable([res, not_encrypted]);\n            }] : []);\n        };\n\n        const emit = ({ timeout, promise, emittion: emittionx }) => new Promise(async (resolve, reject) => {\n            const [route, ...emittion] = emittionx;\n\n            if (typeof route !== 'string')\n                throw `expected ${promise ? 'emitWithAck' : 'emit'} first argument to be a string type`;\n\n            if (restrictedRoute.includes(route))\n                throw `${route} is a restricted socket path, avoid using any of ${restrictedRoute}`;\n\n            let hasResolved, stime = Date.now();\n\n            const timer = timeout ? setTimeout(() => {\n                hasResolved = true;\n                reject(new Error('emittion timeout'));\n            }, timeout) : undefined;\n\n            await socketReadyPromise;\n            if (hasResolved) return;\n            clearTimeout(timer);\n\n            try {\n                const thisSocket = timeout ? socket.timeout(Math.max(timeout - (Date.now() - stime), 0)) : socket;\n\n                const lastEmit = emittion.slice(-1)[0];\n                const hasEmitable = typeof lastEmit === 'function';\n                const [mit, not_encrypted] = encloseSocketArguments(hasEmitable ? emittion.slice(0, -1) : emittion);\n\n                const [reqBuilder, [privateKey]] = uglify ? await serializeE2E(mit, undefined, serverE2E_PublicKey) : [undefined, []];\n\n                if (hasEmitable && promise)\n                    throw 'emitWithAck cannot have function in it argument';\n\n                const result = await thisSocket[promise ? 'emitWithAck' : 'emit'](route,\n                    [uglify ? reqBuilder : mit, not_encrypted],\n                    ...hasEmitable ? [async function () {\n                        const [[args, not_encrypted]] = [...arguments];\n                        let res;\n\n                        if (uglify) {\n                            res = await deserializeE2E(args, serverE2E_PublicKey, privateKey);\n                        } else res = args;\n\n                        lastEmit(...discloseSocketArguments([res, not_encrypted]));\n                    }] : []\n                );\n                if (promise && result) {\n                    resolve(discloseSocketArguments([uglify ? await deserializeE2E(result[0], serverE2E_PublicKey, privateKey) : result[0], result[1]])[0]);\n                } else resolve();\n            } catch (e) {\n                reject(e);\n            }\n        });\n\n        const init = async () => {\n            if (hasCancelled) return;\n            const mtoken = disableAuth ? undefined : Scoped.AuthJWTToken[projectUrl];\n            const [reqBuilder, [privateKey]] = uglify ? await serializeE2E({ a_extras: authHandshake }, mtoken, serverE2E_PublicKey) : [null, []];\n\n            const getWsPrefix = url => url.startsWith('https') ? 'wss' : 'ws';\n            const wsUrl = overidenUrl ? `${getWsPrefix(overidenUrl)}://${overidenUrl.split('://')[1]}` : `${wsPrefix}://${projectUrl.split('://')[1]}`;\n\n            socket = io(wsUrl, {\n                transports: ['websocket', 'polling', 'flashsocket'],\n                extraHeaders,\n                auth: uglify ? {\n                    ugly: true,\n                    e2e: reqBuilder.toString('base64')\n                } : {\n                    ...mtoken ? { mtoken } : {},\n                    a_extras: authHandshake\n                }\n            });\n            clientPrivateKey = privateKey;\n\n            socketReadyCallback();\n            socketListenerList.forEach(([_, method, route, callback]) => {\n                socket[method](route, callback);\n            });\n        }\n\n        if (disableAuth) {\n            init();\n        } else {\n            let lastTokenStatus;\n\n            tokenListener = listenTokenReady(status => {\n                if (lastTokenStatus === (status || false)) return;\n\n                if (status) {\n                    init();\n                } else {\n                    socket?.close?.();\n                    socket = undefined;\n                    socketReadyPromise = makeSocketCallback();\n                }\n                lastTokenStatus = status || false;\n            }, projectUrl);\n        }\n\n        const resultant = {\n            timeout: (timeout) => {\n                if (timeout !== undefined && !Validator.POSITIVE_INTEGER(timeout))\n                    throw `expected a positive integer for timeout but got ${timeout}`;\n\n                return {\n                    emitWithAck: function () {\n                        return emit({\n                            timeout,\n                            promise: true,\n                            emittion: [...arguments]\n                        });\n                    }\n                };\n            },\n            emit: function () { emit({ emittion: [...arguments] }) },\n            emitWithAck: function () {\n                return emit({\n                    emittion: [...arguments],\n                    promise: true\n                });\n            },\n            on: async (route, callback) => {\n                if (restrictedRoute.includes(route))\n                    throw `${route} is a restricted socket path, avoid using any of ${restrictedRoute}`;\n                const ref = ++socketListenerIte,\n                    listener = listenerCallback(route, callback);\n\n                socketListenerList.push([ref, 'on', route, listener]);\n                if (socket) socket.on(route, listener);\n\n                return () => {\n                    if (socket) socket.off(route, listener);\n                    socketListenerList = socketListenerList.filter(([id]) => id !== ref);\n                }\n            },\n            once: async (route, callback) => {\n                if (restrictedRoute.includes(route))\n                    throw `${route} is a restricted socket path, avoid using any of ${restrictedRoute}`;\n                const ref = ++socketListenerIte,\n                    listener = listenerCallback(route, callback);\n\n                socketListenerList.push([ref, 'once', route, listener]);\n                if (socket) socket.once(route, listener);\n\n                return () => {\n                    if (socket) socket.off(route, listener);\n                    socketListenerList = socketListenerList.filter(([id]) => id !== ref);\n                }\n            },\n            destroy: () => {\n                hasCancelled = true;\n                tokenListener?.();\n                if (socket) socket.close();\n                socketListenerList = [];\n            }\n        };\n\n        Object.defineProperty(resultant, 'disconnected', {\n            get() {\n                return socket.disconnected;\n            },\n            enumerable: true,\n            configurable: false\n        });\n\n        return resultant;\n    }\n};\n\nclass DoNotEncrypt {\n    constructor(value) {\n        this.value = value;\n    }\n};\n\nconst encloseSocketArguments = (args) => {\n    const [encrypted, unencrypted] = [{}, {}];\n\n    args.forEach((v, i) => {\n        if (v instanceof DoNotEncrypt) {\n            unencrypted[i] = v.value;\n        } else encrypted[i] = v;\n    });\n    return [encrypted, unencrypted];\n}\n\nconst discloseSocketArguments = (args = []) => {\n    return args.map((obj, i) => Object.entries(obj).map(v => i ? [v[0], new DoNotEncrypt(v[1])] : v)).flat()\n        .sort((a, b) => (a[0] * 1) - (b[0] * 1)).map((v, i) => {\n            if (v[0] * 1 !== i) throw 'corrupted socket arguments';\n            return v[1];\n        });\n}\n\nconst validateReleaseCacheProp = (prop) => {\n    Object.entries(prop).forEach(([k, v]) => {\n        if (k === 'io') {\n            Object.entries(v).forEach(([k, v]) => {\n                if (k === 'input' || k === 'output') {\n                    if (typeof v !== 'function')\n                        throw `Invalid value supplied to \"io.${k}\", expected a function but got \"${v}\"`;\n                } else throw `Unexpected property named \"io.${k}\"`;\n            });\n            if (!v?.input || !v?.output) throw '\"input\" and \"output\" are required when \"io\" is provided';\n        } else if (k === 'promoteCache') {\n            if (typeof v !== 'boolean') throw 'promoteCache should be a boolean';\n        } else if (['maxLocalDatabaseSize', 'maxLocalFetchHttpSize'].includes(k)) {\n            if (!Validator.POSITIVE_INTEGER(v) || v <= 0)\n                throw `Invalid value supplied to ${k}, value must be a positive integer greater than zero`;\n        } else throw `Unexpected property named ${k}`;\n    });\n}\n\nconst ConfigValidator = {\n    dbName: (v) => {\n        if (typeof v !== 'string' || !v.trim())\n            throw `Invalid value supplied to dbName, value must be a non-empty string`;\n    },\n    dbUrl: (v) => {\n        if (typeof v !== 'string' || !v.trim())\n            throw `Invalid value supplied to dbUrl, value must be a non-empty string`;\n    },\n    projectUrl: (v) => {\n        if (typeof v !== 'string' || (!Validator.HTTPS(v) && !Validator.HTTP(v)))\n            throw `Expected \"projectUrl\" to be valid https or http link but got \"${v}\"`;\n        if (v.endsWith('/')) throw '\"projectUrl\" must not end with a trailing slash \"/\"';\n    },\n    disableCache: (v) => {\n        if (typeof v !== 'boolean' && v !== undefined)\n            throw `Invalid value supplied to disableCache, value must be a boolean`;\n    },\n    maxRetries: (v) => {\n        if (v <= 0 || !Validator.POSITIVE_INTEGER(v))\n            throw `Invalid value supplied to maxRetries, value must be positive integer greater than zero`;\n    },\n    enableE2E_Encryption: (v) => {\n        if (typeof v !== 'boolean' && v !== undefined)\n            throw `Invalid value supplied to enableE2E_Encryption, value must be a boolean`;\n    },\n    castBSON: v => {\n        if (typeof v !== 'boolean')\n            throw `Invalid value supplied to castBSON, value must be a boolean`;\n    },\n    borrowToken: v => {\n        if (typeof v !== 'string' || (!Validator.HTTPS(v) && !Validator.HTTP(v)))\n            throw `Expected \"borrowToken\" to be valid https or http link but got \"${v}\"`;\n    },\n    serverE2E_PublicKey: (v) => {\n        if (v !== undefined && (typeof v !== 'string' || !v.trim()))\n            throw `Invalid value supplied to serverETE_PublicKey, value must be a non-empty string`;\n    },\n    extraHeaders: v => {\n        if (!Validator.OBJECT(v)) throw '\"extraHeaders\" must be an object';\n        const reservedHeaders = ['mtoken', 'mosquito-token', 'init-content-type', 'content-type', 'uglified', 'entity-encoded'];\n\n        Object.entries(v).forEach(([k, v]) => {\n            if (typeof v !== 'string') throw `expected a string at extraHeaders.${k} but got \"${v}\"`;\n            if (reservedHeaders.includes(v.toLowerCase()))\n                throw `extraHeaders must not include any reserved props which are: ${reservedHeaders}`;\n        });\n    }\n};\n\nconst validateMTConfig = (config, that) => {\n    if (!Validator.OBJECT(config))\n        throw `${that.constructor.name} config is not an object`;\n\n    for (const [k, v] of Object.entries(config)) {\n        if (!ConfigValidator[k]) throw `Unexpected property named ${k}`;\n        ConfigValidator[k](v);\n    }\n\n    if (config.enableE2E_Encryption && !config.serverE2E_PublicKey)\n        throw '\"serverE2E_PublicKey\" is missing, enabling end-to-end encryption requires a public encryption key from the server';\n    if (!config.projectUrl) throw `projectUrl is a required property in ${that.constructor.name}() constructor`;\n}\n\nexport {\n    DoNotEncrypt,\n    TIMESTAMP,\n    TIMESTAMP_OFFSET,\n    DOCUMENT_EXTRACTION,\n    FIND_GEO_JSON,\n    GEO_JSON,\n    AUTH_PROVIDER_ID,\n    BSON\n};\n\nexport default RNMT;"]}