{"version":3,"sources":["jsdelivr-header.js","/npm/@cocreate/socket-client@1.40.4/src/index.js"],"names":[],"mappings":"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","file":"/npm/@cocreate/socket-client@1.40.4/src/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/@cocreate/socket-client@1.40.4/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","/********************************************************************************\r\n * Copyright (C) 2023 CoCreate and Contributors.\r\n *\r\n * This program is free software: you can redistribute it and/or modify\r\n * it under the terms of the GNU Affero General Public License as published\r\n * by the Free Software Foundation, either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU Affero General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU Affero General Public License\r\n * along with this program. If not, see <https://www.gnu.org/licenses/>.\r\n ********************************************************************************/\r\n\r\n/**\r\n * Commercial Licensing Information:\r\n * For commercial use of this software without the copyleft provisions of the AGPLv3,\r\n * you must obtain a commercial license from CoCreate LLC.\r\n * For details, visit <https://cocreate.app/licenses/> or contact us at sales@cocreate.app.\r\n */\r\n\r\n(function (root, factory) {\r\n\tif (typeof define === \"function\" && define.amd) {\r\n\t\t// AMD. Register as an anonymous module.\r\n\t\tdefine([\r\n\t\t\t\"@cocreate/uuid\",\r\n\t\t\t\"@cocreate/indexeddb\",\r\n\t\t\t\"@cocreate/config\"\r\n\t\t], function (uuid, indexeddb, config) {\r\n\t\t\treturn factory(\r\n\t\t\t\ttrue,\r\n\t\t\t\tWebSocket,\r\n\t\t\t\tuuid,\r\n\t\t\t\t(indexeddb = indexeddb.default),\r\n\t\t\t\t(config = config.default)\r\n\t\t\t);\r\n\t\t});\r\n\t} else if (typeof module === \"object\" && module.exports) {\r\n\t\tconst WebSocket = require(\"ws\");\r\n\t\tconst uuid = require(\"@cocreate/uuid\");\r\n\t\tmodule.exports = factory(false, WebSocket, uuid);\r\n\t} else {\r\n\t\t// Browser globals (root is window)\r\n\t\troot.returnExports = factory(\r\n\t\t\ttrue,\r\n\t\t\tWebSocket,\r\n\t\t\troot[\"@cocreate/uuid\"],\r\n\t\t\troot[\"@cocreate/indexeddb\"],\r\n\t\t\troot[\"@cocreate/config\"]\r\n\t\t);\r\n\t}\r\n})(\r\n\ttypeof self !== \"undefined\" ? self : this,\r\n\tfunction (isBrowser, WebSocket, uuid, indexeddb, config) {\r\n\t\tconst socketsByUrl = new Map();\r\n\t\tconst socketsById = new Map();\r\n\t\tconst delay = 1000 + Math.floor(Math.random() * 3000);\r\n\r\n\t\tlet organizationPromise = null;\r\n\t\tasync function getOrganization() {\r\n\t\t\tlet organization_id = config.get(\"organization_id\");\r\n\t\t\tif (!organization_id || organization_id === \"canceled\") {\r\n\t\t\t\tconst Organization = await import(\"@cocreate/organizations\");\r\n\t\t\t\torganization_id = await Organization.default.get();\r\n\t\t\t}\r\n\t\t\tif (organization_id) config.set(\"organization_id\", organization_id);\r\n\r\n\t\t\treturn organization_id;\r\n\t\t}\r\n\r\n\t\tconst CoCreateSocketClient = {\r\n\t\t\tframeId: uuid.generate(8),\r\n\t\t\tconnected: false,\r\n\t\t\tlisteners: new Map(),\r\n\t\t\tmessageEvents: {},\r\n\t\t\tmessageQueue: new Map(), // required per url already per url when isBrowser and indexeddb.\r\n\t\t\tconfigQueue: new Map(),\r\n\t\t\tmaxReconnectDelay: 600000,\r\n\t\t\torganization: false, // required per url\r\n\t\t\tserverStorage: true, // required per url\r\n\t\t\tserverOrganization: true, // required per url\r\n\t\t\torganizationBalance: true, // required per url\r\n\t\t\torganization_id: async () => {\r\n\t\t\t\treturn (\r\n\t\t\t\t\torganizationPromise ||\r\n\t\t\t\t\t(organizationPromise = getOrganization())\r\n\t\t\t\t);\r\n\t\t\t},\r\n\r\n\t\t\t//TODO: on app start up we can get the port and ip and public dns. Using config we can define if this app is behind an lb.\r\n\t\t\t// If behind an lb it can create a socket connection to the lb node in order to add node to the lb backend list.\r\n\r\n\t\t\tasync init() {\r\n\t\t\t\tfunction defaultHost() {\r\n\t\t\t\t\tlet host = window.location.host;\r\n\t\t\t\t\tif (host.startsWith(\"127.0.0.1\")) host = \"cocreate.app\";\r\n\t\t\t\t\treturn host;\r\n\t\t\t\t}\r\n\t\t\t\tconst defaults = {\r\n\t\t\t\t\tclientId: indexeddb.ObjectId().toString(),\r\n\t\t\t\t\thost: defaultHost()\r\n\t\t\t\t};\r\n\t\t\t\tconst keys = [\r\n\t\t\t\t\t\"clientId\",\r\n\t\t\t\t\t\"apikey\",\r\n\t\t\t\t\t\"host\",\r\n\t\t\t\t\t\"user_id\",\r\n\t\t\t\t\t\"balancer\"\r\n\t\t\t\t];\r\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\r\n\t\t\t\t\tthis[keys[i]] = config.get(keys[i]);\r\n\t\t\t\t\tif (!this[keys[i]] || this[keys[i]] === \"undefined\")\r\n\t\t\t\t\t\tthis[keys[i]] = defaults[keys[i]] || \"\";\r\n\r\n\t\t\t\t\tconfig.set(keys[i], this[keys[i]]);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tset(socket) {\r\n\t\t\t\tsocketsByUrl.set(socket.url, socket);\r\n\t\t\t\tsocketsById.set(socket.id, socket);\r\n\t\t\t},\r\n\r\n\t\t\tget(key) {\r\n\t\t\t\treturn socketsByUrl.get(key) || socketsById.get(key);\r\n\t\t\t},\r\n\r\n\t\t\thas(key) {\r\n\t\t\t\treturn socketsByUrl.has(key) || socketsById.has(key);\r\n\t\t\t},\r\n\r\n\t\t\tdelete(key) {\r\n\t\t\t\tlet socket;\r\n\t\t\t\tif (typeof key === \"string\") socket = this.get(key);\r\n\t\t\t\tif (!socket || (!socket.id && !socket.url)) return;\r\n\t\t\t\tsocketsByUrl.delete(socket.url);\r\n\t\t\t\tsocketsById.delete(socket.id);\r\n\t\t\t\tif (socket.readyState === WebSocket.OPEN) socket.close();\r\n\t\t\t},\r\n\r\n\t\t\t/**\r\n\t\t\t * config: {organization_id, namespace, room, host}\r\n\t\t\t */\r\n\t\t\tasync create(data = {}) {\r\n\t\t\t\tconst self = this;\r\n\r\n\t\t\t\tif (this.organization === \"canceled\") return;\r\n\r\n\t\t\t\tconst urls = await this.getUrls(data);\r\n\t\t\t\tfor (let url of urls) {\r\n\t\t\t\t\tlet socket = this.get(url);\r\n\t\t\t\t\tif (socket) return;\r\n\r\n\t\t\t\t\tthis.set({ url });\r\n\r\n\t\t\t\t\ttry {\r\n\t\t\t\t\t\tlet token = null;\r\n\t\t\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\t\t\ttoken = config.get(\"token\");\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlet socketId;\r\n\t\t\t\t\t\tif (isBrowser)\r\n\t\t\t\t\t\t\tsocketId = sessionStorage.getItem(\"socketId\");\r\n\t\t\t\t\t\t// else\r\n\t\t\t\t\t\t//     socketId = config.get('socketId');\r\n\r\n\t\t\t\t\t\tif (!socketId) {\r\n\t\t\t\t\t\t\tsocketId = uuid.generate(8);\r\n\t\t\t\t\t\t\tif (isBrowser)\r\n\t\t\t\t\t\t\t\tsocketId = sessionStorage.setItem(\r\n\t\t\t\t\t\t\t\t\t\"socketId\",\r\n\t\t\t\t\t\t\t\t\tsocketId\r\n\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t// else\r\n\t\t\t\t\t\t\t//     socketId = config.set('socketId', socketId);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tconst options = {\r\n\t\t\t\t\t\t\tsocketId,\r\n\t\t\t\t\t\t\tclientId: this.clientId,\r\n\t\t\t\t\t\t\tuser_id: data.user_id || this.user_id,\r\n\t\t\t\t\t\t\ttoken: token || \"\"\r\n\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\t\t\toptions.lastSynced = config.get(url);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tlet opt = JSON.stringify(options);\r\n\t\t\t\t\t\topt = encodeURIComponent(opt);\r\n\r\n\t\t\t\t\t\tsocket = new WebSocket(url, opt);\r\n\t\t\t\t\t\tsocket.id = options.socketId;\r\n\t\t\t\t\t\tsocket.connected = false;\r\n\t\t\t\t\t\tsocket.clientId = this.clientId;\r\n\t\t\t\t\t\tsocket.frameId = this.frameId;\r\n\t\t\t\t\t\tsocket.organization_id =\r\n\t\t\t\t\t\t\tdata.organization_id ||\r\n\t\t\t\t\t\t\t(await this.organization_id());\r\n\t\t\t\t\t\tsocket.user_id = data.user_id || this.user_id;\r\n\t\t\t\t\t\tsocket.host = data.host || this.host;\r\n\t\t\t\t\t\tsocket.key = url;\r\n\r\n\t\t\t\t\t\tthis.set(socket);\r\n\t\t\t\t\t} catch (error) {\r\n\t\t\t\t\t\tconsole.log(error);\r\n\t\t\t\t\t\treturn;\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tsocket.onopen = function (event) {\r\n\t\t\t\t\t\tself.connected = true;\r\n\t\t\t\t\t\tsocket.connected = true;\r\n\t\t\t\t\t\tdelete data.currentReconnectDelay;\r\n\t\t\t\t\t\tself.checkMessageQueue(data);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tsocket.onclose = function (event) {\r\n\t\t\t\t\t\tsocket.connected = false;\r\n\t\t\t\t\t\tswitch (event.code) {\r\n\t\t\t\t\t\t\tcase 1000: // close normal\r\n\t\t\t\t\t\t\t\tconsole.log(\"websocket: closed\");\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\tself.reconnect(data, socket);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tsocket.onerror = function (event) {\r\n\t\t\t\t\t\tif (!isBrowser) console.log(event.error);\r\n\t\t\t\t\t\telse if (!window.navigator.onLine)\r\n\t\t\t\t\t\t\tconsole.log(\"offline\");\r\n\r\n\t\t\t\t\t\tself.reconnect(data, socket);\r\n\t\t\t\t\t};\r\n\r\n\t\t\t\t\tsocket.onmessage = function (message) {\r\n\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\tmessage = JSON.parse(message.data);\r\n\t\t\t\t\t\t\tif (message.error) {\r\n\t\t\t\t\t\t\t\tconsole.error(message.method, message.error);\r\n\t\t\t\t\t\t\t\tif (message.serverOrganization === false)\r\n\t\t\t\t\t\t\t\t\tself.serverOrganization =\r\n\t\t\t\t\t\t\t\t\t\tself.serverStorage = false;\r\n\t\t\t\t\t\t\t\telse if (message.serverStorage === false)\r\n\t\t\t\t\t\t\t\t\tself.serverStorage = false;\r\n\t\t\t\t\t\t\t\telse if (message.organizationBalance === false)\r\n\t\t\t\t\t\t\t\t\tself.organizationBalance = false;\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\tmessage.method != \"connect\" &&\r\n\t\t\t\t\t\t\t\ttypeof message == \"object\"\r\n\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\tif (isBrowser && message._id) {\r\n\t\t\t\t\t\t\t\t\tlet lastSynced = config.get(socket.url);\r\n\r\n\t\t\t\t\t\t\t\t\tif (!lastSynced) {\r\n\t\t\t\t\t\t\t\t\t\tconfig.set(socket.url, message._id);\r\n\t\t\t\t\t\t\t\t\t} else if (lastSynced !== message._id) {\r\n\t\t\t\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\t\t\t\tindexeddb.ObjectId(lastSynced)\r\n\t\t\t\t\t\t\t\t\t\t\t\t.timestamp <\r\n\t\t\t\t\t\t\t\t\t\t\tindexeddb.ObjectId(message._id)\r\n\t\t\t\t\t\t\t\t\t\t\t\t.timestamp\r\n\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\tconfig.set(socket.url, message._id);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\t// here we can handle crud types inorder to avoid conflicts simply by deleting queued items prior to sending\r\n\t\t\t\t\t\t\t\t\tlet Data = {\r\n\t\t\t\t\t\t\t\t\t\tmethod: \"object.delete\",\r\n\t\t\t\t\t\t\t\t\t\tarray: \"message_log\",\r\n\t\t\t\t\t\t\t\t\t\t$filter: {\r\n\t\t\t\t\t\t\t\t\t\t\tquery: {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\"modified.on\": {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t$gt: message.timestamp\r\n\t\t\t\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\t\t\t\tstatus: \"queued\"\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t};\r\n\r\n\t\t\t\t\t\t\t\t\t// TODO: we need to delete queued items based on some conditions to prevent conflicts\r\n\t\t\t\t\t\t\t\t\t// what are the conditions?\r\n\t\t\t\t\t\t\t\t\tlet type = message.method.split(\".\")[0];\r\n\t\t\t\t\t\t\t\t\tif (Array.isArray(message[type])) {\r\n\t\t\t\t\t\t\t\t\t\tfor (let item of message[type]) {\r\n\t\t\t\t\t\t\t\t\t\t\tif (type == \"object\") {\r\n\t\t\t\t\t\t\t\t\t\t\t\tData.$filter.query[\"data._id\"] =\r\n\t\t\t\t\t\t\t\t\t\t\t\t\titem._id;\r\n\t\t\t\t\t\t\t\t\t\t\t} else if (\r\n\t\t\t\t\t\t\t\t\t\t\t\t[\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"database\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"array\",\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"index\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t].includes(type)\r\n\t\t\t\t\t\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\t\t\t\t\t\tData.$filter.query[\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\"data.name\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t] = item.name;\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t// indexeddb.send(Data)\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t\tmessage.broadcastClient &&\r\n\t\t\t\t\t\t\t\tmessage.broadcastBrowser !== false &&\r\n\t\t\t\t\t\t\t\tisBrowser &&\r\n\t\t\t\t\t\t\t\tmessage.broadcastBrowser &&\r\n\t\t\t\t\t\t\t\t!message.method.endsWith(\".read\")\r\n\t\t\t\t\t\t\t)\r\n\t\t\t\t\t\t\t\tconfig.set(\r\n\t\t\t\t\t\t\t\t\t\"localSocketMessage\",\r\n\t\t\t\t\t\t\t\t\tJSON.stringify(message)\r\n\t\t\t\t\t\t\t\t);\r\n\r\n\t\t\t\t\t\t\tmessage.status = \"received\";\r\n\r\n\t\t\t\t\t\t\tif (message && message.uid) {\r\n\t\t\t\t\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\t\t\t\t\tconst event = new window.CustomEvent(\r\n\t\t\t\t\t\t\t\t\t\tmessage.uid,\r\n\t\t\t\t\t\t\t\t\t\t{\r\n\t\t\t\t\t\t\t\t\t\t\tdetail: message\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t\t\twindow.dispatchEvent(event);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tprocess.emit(message.uid, message);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tself.__fireListeners(message);\r\n\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\tconsole.log(e);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t};\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t__fireListeners(data) {\r\n\t\t\t\tconst listeners = this.listeners.get(data.method) || [];\r\n\t\t\t\tlisteners.forEach((listener) => {\r\n\t\t\t\t\tlistener(data);\r\n\t\t\t\t});\r\n\r\n\t\t\t\tif (data.method.includes(\".\")) {\r\n\t\t\t\t\tconst listeners =\r\n\t\t\t\t\t\tthis.listeners.get(data.method.split(\".\")[0]) || [];\r\n\t\t\t\t\tlisteners.forEach((listener) => {\r\n\t\t\t\t\t\tlistener(data);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\t// TODO: could be rquired in the serverside when handeling server to server mesh socket using crud-server instead\r\n\t\t\tcheckMessageQueue(config) {\r\n\t\t\t\tif (isBrowser && indexeddb) {\r\n\t\t\t\t\tindexeddb\r\n\t\t\t\t\t\t.send({\r\n\t\t\t\t\t\t\tmethod: \"object.delete\",\r\n\t\t\t\t\t\t\tarray: \"message_log\",\r\n\t\t\t\t\t\t\t$filter: {\r\n\t\t\t\t\t\t\t\tquery: { status: \"queued\" }\r\n\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\torganization_id: config.organization_id\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.then((data) => {\r\n\t\t\t\t\t\t\tif (data) {\r\n\t\t\t\t\t\t\t\tfor (let i = 0; i < data.object.length; i++) {\r\n\t\t\t\t\t\t\t\t\tthis.send(data.object[i].data);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t} else {\r\n\t\t\t\t\t// TODO: set and get messageQueue per socket.url\r\n\t\t\t\t\tif (this.messageQueue.size > 0) {\r\n\t\t\t\t\t\tfor (let [uid, data] of this.messageQueue) {\r\n\t\t\t\t\t\t\tthis.send(data);\r\n\t\t\t\t\t\t\tthis.messageQueue.delete(uid);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tsend(data = {}) {\r\n\t\t\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\t\t\tdata.clientId = this.clientId;\r\n\t\t\t\t\tdata.frameId = this.frameId;\r\n\r\n\t\t\t\t\tif (!data.timeStamp)\r\n\t\t\t\t\t\tdata.timeStamp = new Date().toISOString();\r\n\r\n\t\t\t\t\tif (!data.organization_id)\r\n\t\t\t\t\t\tdata.organization_id = await this.organization_id();\r\n\r\n\t\t\t\t\tif (!data.apikey && this.apikey) data.apikey = this.apikey;\r\n\r\n\t\t\t\t\tif (!data.user_id && this.user_id)\r\n\t\t\t\t\t\tdata.user_id = this.user_id;\r\n\r\n\t\t\t\t\tif (data.broadcast === \"false\" || data.broadcast === false)\r\n\t\t\t\t\t\tdata.broadcast = false;\r\n\t\t\t\t\telse data.broadcast = true;\r\n\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdata.broadcastClient === \"false\" ||\r\n\t\t\t\t\t\tdata.broadcastClient === false\r\n\t\t\t\t\t)\r\n\t\t\t\t\t\tdata.broadcastClient = false;\r\n\t\t\t\t\telse data.broadcastClient = true;\r\n\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdata.broadcastSender === \"false\" ||\r\n\t\t\t\t\t\tdata.broadcastSender === false\r\n\t\t\t\t\t)\r\n\t\t\t\t\t\tdata.broadcastSender = false;\r\n\t\t\t\t\telse data.broadcastSender = true;\r\n\r\n\t\t\t\t\tif (!data.uid) data.uid = uuid.generate();\r\n\r\n\t\t\t\t\tif (!data.namespace) delete data.namespace;\r\n\r\n\t\t\t\t\tif (!data.room) delete data.room;\r\n\r\n\t\t\t\t\tlet broadcastBrowser = false;\r\n\t\t\t\t\tif (\r\n\t\t\t\t\t\tdata.broadcastBrowser === \"false\" ||\r\n\t\t\t\t\t\tdata.broadcastBrowser === false\r\n\t\t\t\t\t)\r\n\t\t\t\t\t\tbroadcastBrowser = false;\r\n\t\t\t\t\telse broadcastBrowser = true;\r\n\r\n\t\t\t\t\tdelete data.broadcastBrowser;\r\n\r\n\t\t\t\t\tconst uid = data.uid;\r\n\t\t\t\t\tconst sockets = await this.getSockets(data);\r\n\r\n\t\t\t\t\tlet isAwait;\r\n\t\t\t\t\tfor (let socket of sockets) {\r\n\t\t\t\t\t\tdata.socketId = socket.id;\r\n\t\t\t\t\t\tif (!this.messageEvents[uid])\r\n\t\t\t\t\t\t\tthis.addListener(uid, resolve);\r\n\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\tsocket.connected &&\r\n\t\t\t\t\t\t\tthis.serverOrganization &&\r\n\t\t\t\t\t\t\tthis.serverStorage &&\r\n\t\t\t\t\t\t\tthis.organizationBalance\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tif (data.status === \"resolve\") resolve(data);\r\n\r\n\t\t\t\t\t\t\tif (data.status === \"await\") isAwait = true;\r\n\r\n\t\t\t\t\t\t\tdelete data.status;\r\n\r\n\t\t\t\t\t\t\tsocket.send(JSON.stringify(data));\r\n\t\t\t\t\t\t\tdata.status = \"sent\";\r\n\t\t\t\t\t\t} else if (!data.status) {\r\n\t\t\t\t\t\t\tdata.status = \"queued\";\r\n\t\t\t\t\t\t} else if (\r\n\t\t\t\t\t\t\tdata.status !== \"queued\" &&\r\n\t\t\t\t\t\t\tdata.status !== \"await\"\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tresolve(data);\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\t\t\tif (!isAwait) {\r\n\t\t\t\t\t\t\t\tif (data.broadcastSender)\r\n\t\t\t\t\t\t\t\t\tthis.sendLocalMessage(data);\r\n\r\n\t\t\t\t\t\t\t\t// TODO: set in indexeddb if above a specific size\r\n\t\t\t\t\t\t\t\tif (broadcastBrowser)\r\n\t\t\t\t\t\t\t\t\tconfig.set(\r\n\t\t\t\t\t\t\t\t\t\t\"localSocketMessage\",\r\n\t\t\t\t\t\t\t\t\t\tJSON.stringify(data)\r\n\t\t\t\t\t\t\t\t\t);\r\n\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\tif (data.status !== \"sent\") data.status = \"queued\";\r\n\r\n\t\t\t\t\t\t\tif (indexeddb && data.status === \"queued\") {\r\n\t\t\t\t\t\t\t\tindexeddb.send({\r\n\t\t\t\t\t\t\t\t\tmethod: \"object.update\",\r\n\t\t\t\t\t\t\t\t\tarray: \"message_log\",\r\n\t\t\t\t\t\t\t\t\tupsert: true,\r\n\t\t\t\t\t\t\t\t\tobject: {\r\n\t\t\t\t\t\t\t\t\t\t_id: uid,\r\n\t\t\t\t\t\t\t\t\t\tdata,\r\n\t\t\t\t\t\t\t\t\t\tstatus: \"queued\"\r\n\t\t\t\t\t\t\t\t\t},\r\n\t\t\t\t\t\t\t\t\torganization_id: data.organization_id\r\n\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else if (!indexeddb && data.status === \"queued\")\r\n\t\t\t\t\t\t\tthis.messageQueue.set(uid, data);\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t},\r\n\r\n\t\t\taddListener(uid, resolve) {\r\n\t\t\t\tthis.messageEvents[uid] = resolve;\r\n\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\tconst self = this;\r\n\t\t\t\t\twindow.addEventListener(\r\n\t\t\t\t\t\tuid,\r\n\t\t\t\t\t\tfunction (event) {\r\n\t\t\t\t\t\t\tdelete self.messageEvents[uid];\r\n\t\t\t\t\t\t\t// here we have access to request and new data\r\n\t\t\t\t\t\t\tresolve(event.detail);\r\n\t\t\t\t\t\t},\r\n\t\t\t\t\t\t{ once: true }\r\n\t\t\t\t\t);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tprocess.once(uid, (data) => {\r\n\t\t\t\t\t\tdelete this.messageEvents[uid];\r\n\t\t\t\t\t\tresolve(data);\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tlisten(action, callback) {\r\n\t\t\t\tif (!this.listeners.get(action)) {\r\n\t\t\t\t\tthis.listeners.set(action, [callback]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tthis.listeners.get(action).push(callback);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\treconnect(config, socket) {\r\n\t\t\t\tlet self = this;\r\n\t\t\t\tif (!config.currentReconnectDelay)\r\n\t\t\t\t\tconfig.currentReconnectDelay = delay;\r\n\r\n\t\t\t\tlet url = socket.url;\r\n\t\t\t\tif (isBrowser && !window.navigator.onLine) {\r\n\t\t\t\t\tconst online = () => {\r\n\t\t\t\t\t\twindow.removeEventListener(\"online\", online);\r\n\t\t\t\t\t\tself.delete(url);\r\n\t\t\t\t\t\tself.create(config);\r\n\t\t\t\t\t};\r\n\t\t\t\t\twindow.addEventListener(\"online\", online);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tsetTimeout(() => {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\t!self.maxReconnectDelay ||\r\n\t\t\t\t\t\t\tconfig.currentReconnectDelay <\r\n\t\t\t\t\t\t\t\tself.maxReconnectDelay\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tself.delete(url);\r\n\t\t\t\t\t\t\tconfig.currentReconnectDelay *= 2;\r\n\t\t\t\t\t\t\tself.create(config);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, config.currentReconnectDelay);\r\n\t\t\t\t}\r\n\t\t\t},\r\n\r\n\t\t\tasync getUrls(data = {}) {\r\n\t\t\t\tlet protocol = \"wss\";\r\n\t\t\t\tif (isBrowser) {\r\n\t\t\t\t\tif (location.protocol.startsWith(\"about:\")) {\r\n\t\t\t\t\t\tif (\r\n\t\t\t\t\t\t\twindow.parent &&\r\n\t\t\t\t\t\t\twindow.parent.location.protocol !== \"https:\"\r\n\t\t\t\t\t\t) {\r\n\t\t\t\t\t\t\tprotocol = \"ws\";\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t} else if (location.protocol !== \"https:\") protocol = \"ws\";\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlet url,\r\n\t\t\t\t\turls = [],\r\n\t\t\t\t\thostUrls = [];\r\n\t\t\t\tlet host = data.host || this.host;\r\n\t\t\t\tlet balancer = data.balancer || this.balancer;\r\n\t\t\t\tif (typeof host === \"string\") {\r\n\t\t\t\t\thost = host.split(\",\");\r\n\t\t\t\t\tfor (let i = 0; i < host.length; i++) {\r\n\t\t\t\t\t\thost[i] = host[i].trim();\r\n\t\t\t\t\t\tif (host[i][host[i].length - 1] === \"/\")\r\n\t\t\t\t\t\t\thost[i] = host[i].slice(0, -1);\r\n\r\n\t\t\t\t\t\tif (host[i].includes(\"://\")) url = `${host[i]}`;\r\n\t\t\t\t\t\telse url = `${protocol}://${host[i]}`;\r\n\r\n\t\t\t\t\t\turl += `/${\r\n\t\t\t\t\t\t\tdata.organization_id ||\r\n\t\t\t\t\t\t\t(await this.organization_id()) ||\r\n\t\t\t\t\t\t\t\"\"\r\n\t\t\t\t\t\t}`;\r\n\t\t\t\t\t\tif (balancer == \"mesh\") urls.push(url);\r\n\t\t\t\t\t\telse {\r\n\t\t\t\t\t\t\tlet socket = this.get(url);\r\n\t\t\t\t\t\t\tif (socket !== false) {\r\n\t\t\t\t\t\t\t\turls.push(url);\r\n\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t} else hostUrls.push(url);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif (!urls.length && hostUrls.length) {\r\n\t\t\t\t\t\tfor (let i = 0; i < hostUrls.length; i++) {\r\n\t\t\t\t\t\t\tthis.delete(hostUrls[i]);\r\n\t\t\t\t\t\t\turls.push(hostUrls[i]);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t} else if (isBrowser) {\r\n\t\t\t\t\tlet newhost = window.location.host;\r\n\t\t\t\t\tif (newhost.startsWith(\"127.0.0.1\"))\r\n\t\t\t\t\t\tnewhost = \"cocreate.app\";\r\n\r\n\t\t\t\t\turl = [`${protocol}://${newhost}`];\r\n\t\t\t\t\turl += `/${\r\n\t\t\t\t\t\tdata.organization_id ||\r\n\t\t\t\t\t\t(await this.organization_id()) ||\r\n\t\t\t\t\t\t\"\"\r\n\t\t\t\t\t}`;\r\n\t\t\t\t\turls.push(url);\r\n\t\t\t\t} else {\r\n\t\t\t\t\tconsole.log(\"missing host\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn urls;\r\n\t\t\t},\r\n\r\n\t\t\tasync getSockets(data) {\r\n\t\t\t\tlet sockets = [];\r\n\t\t\t\tlet urls = await this.getUrls(data);\r\n\t\t\t\tfor (let url of urls) {\r\n\t\t\t\t\tlet socket = this.get(url);\r\n\t\t\t\t\tif (!socket) {\r\n\t\t\t\t\t\tawait this.create(data);\r\n\t\t\t\t\t\tsocket = this.get(url);\r\n\t\t\t\t\t\tif (socket) sockets.push(socket);\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tsockets.push(socket);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t\treturn sockets;\r\n\t\t\t},\r\n\r\n\t\t\tsendLocalMessage(data) {\r\n\t\t\t\tthis.__fireListeners(data);\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\tif (isBrowser) {\r\n\t\t\tCoCreateSocketClient.init();\r\n\r\n\t\t\twindow.onstorage = (e) => {\r\n\t\t\t\tif (e.key == \"localSocketMessage\" && indexeddb && e.newValue) {\r\n\t\t\t\t\tlet data = JSON.parse(e.newValue);\r\n\t\t\t\t\tCoCreateSocketClient.sendLocalMessage(data);\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t}\r\n\r\n\t\treturn CoCreateSocketClient;\r\n\t}\r\n);\r\n"]}