{"version":3,"sources":["node_modules/phoenix/priv/static/phoenix.mjs","projects/web-portal/src/app/layout/common/notifications/notifications.service.ts","projects/web-portal/src/app/socket.service.ts"],"sourcesContent":["// js/phoenix/utils.js\nvar closure = value => {\n if (typeof value === \"function\") {\n return value;\n } else {\n let closure2 = function () {\n return value;\n };\n return closure2;\n }\n};\n\n// js/phoenix/constants.js\nvar globalSelf = typeof self !== \"undefined\" ? self : null;\nvar phxWindow = typeof window !== \"undefined\" ? window : null;\nvar global = globalSelf || phxWindow || global;\nvar DEFAULT_VSN = \"2.0.0\";\nvar SOCKET_STATES = {\n connecting: 0,\n open: 1,\n closing: 2,\n closed: 3\n};\nvar DEFAULT_TIMEOUT = 1e4;\nvar WS_CLOSE_NORMAL = 1e3;\nvar CHANNEL_STATES = {\n closed: \"closed\",\n errored: \"errored\",\n joined: \"joined\",\n joining: \"joining\",\n leaving: \"leaving\"\n};\nvar CHANNEL_EVENTS = {\n close: \"phx_close\",\n error: \"phx_error\",\n join: \"phx_join\",\n reply: \"phx_reply\",\n leave: \"phx_leave\"\n};\nvar TRANSPORTS = {\n longpoll: \"longpoll\",\n websocket: \"websocket\"\n};\nvar XHR_STATES = {\n complete: 4\n};\n\n// js/phoenix/push.js\nvar Push = class {\n constructor(channel, event, payload, timeout) {\n this.channel = channel;\n this.event = event;\n this.payload = payload || function () {\n return {};\n };\n this.receivedResp = null;\n this.timeout = timeout;\n this.timeoutTimer = null;\n this.recHooks = [];\n this.sent = false;\n }\n /**\n *\n * @param {number} timeout\n */\n resend(timeout) {\n this.timeout = timeout;\n this.reset();\n this.send();\n }\n /**\n *\n */\n send() {\n if (this.hasReceived(\"timeout\")) {\n return;\n }\n this.startTimeout();\n this.sent = true;\n this.channel.socket.push({\n topic: this.channel.topic,\n event: this.event,\n payload: this.payload(),\n ref: this.ref,\n join_ref: this.channel.joinRef()\n });\n }\n /**\n *\n * @param {*} status\n * @param {*} callback\n */\n receive(status, callback) {\n if (this.hasReceived(status)) {\n callback(this.receivedResp.response);\n }\n this.recHooks.push({\n status,\n callback\n });\n return this;\n }\n /**\n * @private\n */\n reset() {\n this.cancelRefEvent();\n this.ref = null;\n this.refEvent = null;\n this.receivedResp = null;\n this.sent = false;\n }\n /**\n * @private\n */\n matchReceive({\n status,\n response,\n _ref\n }) {\n this.recHooks.filter(h => h.status === status).forEach(h => h.callback(response));\n }\n /**\n * @private\n */\n cancelRefEvent() {\n if (!this.refEvent) {\n return;\n }\n this.channel.off(this.refEvent);\n }\n /**\n * @private\n */\n cancelTimeout() {\n clearTimeout(this.timeoutTimer);\n this.timeoutTimer = null;\n }\n /**\n * @private\n */\n startTimeout() {\n if (this.timeoutTimer) {\n this.cancelTimeout();\n }\n this.ref = this.channel.socket.makeRef();\n this.refEvent = this.channel.replyEventName(this.ref);\n this.channel.on(this.refEvent, payload => {\n this.cancelRefEvent();\n this.cancelTimeout();\n this.receivedResp = payload;\n this.matchReceive(payload);\n });\n this.timeoutTimer = setTimeout(() => {\n this.trigger(\"timeout\", {});\n }, this.timeout);\n }\n /**\n * @private\n */\n hasReceived(status) {\n return this.receivedResp && this.receivedResp.status === status;\n }\n /**\n * @private\n */\n trigger(status, response) {\n this.channel.trigger(this.refEvent, {\n status,\n response\n });\n }\n};\n\n// js/phoenix/timer.js\nvar Timer = class {\n constructor(callback, timerCalc) {\n this.callback = callback;\n this.timerCalc = timerCalc;\n this.timer = null;\n this.tries = 0;\n }\n reset() {\n this.tries = 0;\n clearTimeout(this.timer);\n }\n /**\n * Cancels any previous scheduleTimeout and schedules callback\n */\n scheduleTimeout() {\n clearTimeout(this.timer);\n this.timer = setTimeout(() => {\n this.tries = this.tries + 1;\n this.callback();\n }, this.timerCalc(this.tries + 1));\n }\n};\n\n// js/phoenix/channel.js\nvar Channel = class {\n constructor(topic, params, socket) {\n this.state = CHANNEL_STATES.closed;\n this.topic = topic;\n this.params = closure(params || {});\n this.socket = socket;\n this.bindings = [];\n this.bindingRef = 0;\n this.timeout = this.socket.timeout;\n this.joinedOnce = false;\n this.joinPush = new Push(this, CHANNEL_EVENTS.join, this.params, this.timeout);\n this.pushBuffer = [];\n this.stateChangeRefs = [];\n this.rejoinTimer = new Timer(() => {\n if (this.socket.isConnected()) {\n this.rejoin();\n }\n }, this.socket.rejoinAfterMs);\n this.stateChangeRefs.push(this.socket.onError(() => this.rejoinTimer.reset()));\n this.stateChangeRefs.push(this.socket.onOpen(() => {\n this.rejoinTimer.reset();\n if (this.isErrored()) {\n this.rejoin();\n }\n }));\n this.joinPush.receive(\"ok\", () => {\n this.state = CHANNEL_STATES.joined;\n this.rejoinTimer.reset();\n this.pushBuffer.forEach(pushEvent => pushEvent.send());\n this.pushBuffer = [];\n });\n this.joinPush.receive(\"error\", () => {\n this.state = CHANNEL_STATES.errored;\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.onClose(() => {\n this.rejoinTimer.reset();\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `close ${this.topic} ${this.joinRef()}`);\n this.state = CHANNEL_STATES.closed;\n this.socket.remove(this);\n });\n this.onError(reason => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `error ${this.topic}`, reason);\n if (this.isJoining()) {\n this.joinPush.reset();\n }\n this.state = CHANNEL_STATES.errored;\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.joinPush.receive(\"timeout\", () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `timeout ${this.topic} (${this.joinRef()})`, this.joinPush.timeout);\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), this.timeout);\n leavePush.send();\n this.state = CHANNEL_STATES.errored;\n this.joinPush.reset();\n if (this.socket.isConnected()) {\n this.rejoinTimer.scheduleTimeout();\n }\n });\n this.on(CHANNEL_EVENTS.reply, (payload, ref) => {\n this.trigger(this.replyEventName(ref), payload);\n });\n }\n /**\n * Join the channel\n * @param {integer} timeout\n * @returns {Push}\n */\n join(timeout = this.timeout) {\n if (this.joinedOnce) {\n throw new Error(\"tried to join multiple times. 'join' can only be called a single time per channel instance\");\n } else {\n this.timeout = timeout;\n this.joinedOnce = true;\n this.rejoin();\n return this.joinPush;\n }\n }\n /**\n * Hook into channel close\n * @param {Function} callback\n */\n onClose(callback) {\n this.on(CHANNEL_EVENTS.close, callback);\n }\n /**\n * Hook into channel errors\n * @param {Function} callback\n */\n onError(callback) {\n return this.on(CHANNEL_EVENTS.error, reason => callback(reason));\n }\n /**\n * Subscribes on channel events\n *\n * Subscription returns a ref counter, which can be used later to\n * unsubscribe the exact event listener\n *\n * @example\n * const ref1 = channel.on(\"event\", do_stuff)\n * const ref2 = channel.on(\"event\", do_other_stuff)\n * channel.off(\"event\", ref1)\n * // Since unsubscription, do_stuff won't fire,\n * // while do_other_stuff will keep firing on the \"event\"\n *\n * @param {string} event\n * @param {Function} callback\n * @returns {integer} ref\n */\n on(event, callback) {\n let ref = this.bindingRef++;\n this.bindings.push({\n event,\n ref,\n callback\n });\n return ref;\n }\n /**\n * Unsubscribes off of channel events\n *\n * Use the ref returned from a channel.on() to unsubscribe one\n * handler, or pass nothing for the ref to unsubscribe all\n * handlers for the given event.\n *\n * @example\n * // Unsubscribe the do_stuff handler\n * const ref1 = channel.on(\"event\", do_stuff)\n * channel.off(\"event\", ref1)\n *\n * // Unsubscribe all handlers from event\n * channel.off(\"event\")\n *\n * @param {string} event\n * @param {integer} ref\n */\n off(event, ref) {\n this.bindings = this.bindings.filter(bind => {\n return !(bind.event === event && (typeof ref === \"undefined\" || ref === bind.ref));\n });\n }\n /**\n * @private\n */\n canPush() {\n return this.socket.isConnected() && this.isJoined();\n }\n /**\n * Sends a message `event` to phoenix with the payload `payload`.\n * Phoenix receives this in the `handle_in(event, payload, socket)`\n * function. if phoenix replies or it times out (default 10000ms),\n * then optionally the reply can be received.\n *\n * @example\n * channel.push(\"event\")\n * .receive(\"ok\", payload => console.log(\"phoenix replied:\", payload))\n * .receive(\"error\", err => console.log(\"phoenix errored\", err))\n * .receive(\"timeout\", () => console.log(\"timed out pushing\"))\n * @param {string} event\n * @param {Object} payload\n * @param {number} [timeout]\n * @returns {Push}\n */\n push(event, payload, timeout = this.timeout) {\n payload = payload || {};\n if (!this.joinedOnce) {\n throw new Error(`tried to push '${event}' to '${this.topic}' before joining. Use channel.join() before pushing events`);\n }\n let pushEvent = new Push(this, event, function () {\n return payload;\n }, timeout);\n if (this.canPush()) {\n pushEvent.send();\n } else {\n pushEvent.startTimeout();\n this.pushBuffer.push(pushEvent);\n }\n return pushEvent;\n }\n /** Leaves the channel\n *\n * Unsubscribes from server events, and\n * instructs channel to terminate on server\n *\n * Triggers onClose() hooks\n *\n * To receive leave acknowledgements, use the `receive`\n * hook to bind to the server ack, ie:\n *\n * @example\n * channel.leave().receive(\"ok\", () => alert(\"left!\") )\n *\n * @param {integer} timeout\n * @returns {Push}\n */\n leave(timeout = this.timeout) {\n this.rejoinTimer.reset();\n this.joinPush.cancelTimeout();\n this.state = CHANNEL_STATES.leaving;\n let onClose = () => {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", `leave ${this.topic}`);\n this.trigger(CHANNEL_EVENTS.close, \"leave\");\n };\n let leavePush = new Push(this, CHANNEL_EVENTS.leave, closure({}), timeout);\n leavePush.receive(\"ok\", () => onClose()).receive(\"timeout\", () => onClose());\n leavePush.send();\n if (!this.canPush()) {\n leavePush.trigger(\"ok\", {});\n }\n return leavePush;\n }\n /**\n * Overridable message hook\n *\n * Receives all events for specialized message handling\n * before dispatching to the channel callbacks.\n *\n * Must return the payload, modified or unmodified\n * @param {string} event\n * @param {Object} payload\n * @param {integer} ref\n * @returns {Object}\n */\n onMessage(_event, payload, _ref) {\n return payload;\n }\n /**\n * @private\n */\n isMember(topic, event, payload, joinRef) {\n if (this.topic !== topic) {\n return false;\n }\n if (joinRef && joinRef !== this.joinRef()) {\n if (this.socket.hasLogger()) this.socket.log(\"channel\", \"dropping outdated message\", {\n topic,\n event,\n payload,\n joinRef\n });\n return false;\n } else {\n return true;\n }\n }\n /**\n * @private\n */\n joinRef() {\n return this.joinPush.ref;\n }\n /**\n * @private\n */\n rejoin(timeout = this.timeout) {\n if (this.isLeaving()) {\n return;\n }\n this.socket.leaveOpenTopic(this.topic);\n this.state = CHANNEL_STATES.joining;\n this.joinPush.resend(timeout);\n }\n /**\n * @private\n */\n trigger(event, payload, ref, joinRef) {\n let handledPayload = this.onMessage(event, payload, ref, joinRef);\n if (payload && !handledPayload) {\n throw new Error(\"channel onMessage callbacks must return the payload, modified or unmodified\");\n }\n let eventBindings = this.bindings.filter(bind => bind.event === event);\n for (let i = 0; i < eventBindings.length; i++) {\n let bind = eventBindings[i];\n bind.callback(handledPayload, ref, joinRef || this.joinRef());\n }\n }\n /**\n * @private\n */\n replyEventName(ref) {\n return `chan_reply_${ref}`;\n }\n /**\n * @private\n */\n isClosed() {\n return this.state === CHANNEL_STATES.closed;\n }\n /**\n * @private\n */\n isErrored() {\n return this.state === CHANNEL_STATES.errored;\n }\n /**\n * @private\n */\n isJoined() {\n return this.state === CHANNEL_STATES.joined;\n }\n /**\n * @private\n */\n isJoining() {\n return this.state === CHANNEL_STATES.joining;\n }\n /**\n * @private\n */\n isLeaving() {\n return this.state === CHANNEL_STATES.leaving;\n }\n};\n\n// js/phoenix/ajax.js\nvar Ajax = class {\n static request(method, endPoint, accept, body, timeout, ontimeout, callback) {\n if (global.XDomainRequest) {\n let req = new global.XDomainRequest();\n return this.xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback);\n } else {\n let req = new global.XMLHttpRequest();\n return this.xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback);\n }\n }\n static xdomainRequest(req, method, endPoint, body, timeout, ontimeout, callback) {\n req.timeout = timeout;\n req.open(method, endPoint);\n req.onload = () => {\n let response = this.parseJSON(req.responseText);\n callback && callback(response);\n };\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n req.onprogress = () => {};\n req.send(body);\n return req;\n }\n static xhrRequest(req, method, endPoint, accept, body, timeout, ontimeout, callback) {\n req.open(method, endPoint, true);\n req.timeout = timeout;\n req.setRequestHeader(\"Content-Type\", accept);\n req.onerror = () => callback && callback(null);\n req.onreadystatechange = () => {\n if (req.readyState === XHR_STATES.complete && callback) {\n let response = this.parseJSON(req.responseText);\n callback(response);\n }\n };\n if (ontimeout) {\n req.ontimeout = ontimeout;\n }\n req.send(body);\n return req;\n }\n static parseJSON(resp) {\n if (!resp || resp === \"\") {\n return null;\n }\n try {\n return JSON.parse(resp);\n } catch (e) {\n console && console.log(\"failed to parse JSON response\", resp);\n return null;\n }\n }\n static serialize(obj, parentKey) {\n let queryStr = [];\n for (var key in obj) {\n if (!Object.prototype.hasOwnProperty.call(obj, key)) {\n continue;\n }\n let paramKey = parentKey ? `${parentKey}[${key}]` : key;\n let paramVal = obj[key];\n if (typeof paramVal === \"object\") {\n queryStr.push(this.serialize(paramVal, paramKey));\n } else {\n queryStr.push(encodeURIComponent(paramKey) + \"=\" + encodeURIComponent(paramVal));\n }\n }\n return queryStr.join(\"&\");\n }\n static appendParams(url, params) {\n if (Object.keys(params).length === 0) {\n return url;\n }\n let prefix = url.match(/\\?/) ? \"&\" : \"?\";\n return `${url}${prefix}${this.serialize(params)}`;\n }\n};\n\n// js/phoenix/longpoll.js\nvar arrayBufferToBase64 = buffer => {\n let binary = \"\";\n let bytes = new Uint8Array(buffer);\n let len = bytes.byteLength;\n for (let i = 0; i < len; i++) {\n binary += String.fromCharCode(bytes[i]);\n }\n return btoa(binary);\n};\nvar LongPoll = class {\n constructor(endPoint) {\n this.endPoint = null;\n this.token = null;\n this.skipHeartbeat = true;\n this.reqs = /* @__PURE__ */new Set();\n this.awaitingBatchAck = false;\n this.currentBatch = null;\n this.currentBatchTimer = null;\n this.batchBuffer = [];\n this.onopen = function () {};\n this.onerror = function () {};\n this.onmessage = function () {};\n this.onclose = function () {};\n this.pollEndpoint = this.normalizeEndpoint(endPoint);\n this.readyState = SOCKET_STATES.connecting;\n setTimeout(() => this.poll(), 0);\n }\n normalizeEndpoint(endPoint) {\n return endPoint.replace(\"ws://\", \"http://\").replace(\"wss://\", \"https://\").replace(new RegExp(\"(.*)/\" + TRANSPORTS.websocket), \"$1/\" + TRANSPORTS.longpoll);\n }\n endpointURL() {\n return Ajax.appendParams(this.pollEndpoint, {\n token: this.token\n });\n }\n closeAndRetry(code, reason, wasClean) {\n this.close(code, reason, wasClean);\n this.readyState = SOCKET_STATES.connecting;\n }\n ontimeout() {\n this.onerror(\"timeout\");\n this.closeAndRetry(1005, \"timeout\", false);\n }\n isActive() {\n return this.readyState === SOCKET_STATES.open || this.readyState === SOCKET_STATES.connecting;\n }\n poll() {\n this.ajax(\"GET\", \"application/json\", null, () => this.ontimeout(), resp => {\n if (resp) {\n var {\n status,\n token,\n messages\n } = resp;\n this.token = token;\n } else {\n status = 0;\n }\n switch (status) {\n case 200:\n messages.forEach(msg => {\n setTimeout(() => this.onmessage({\n data: msg\n }), 0);\n });\n this.poll();\n break;\n case 204:\n this.poll();\n break;\n case 410:\n this.readyState = SOCKET_STATES.open;\n this.onopen({});\n this.poll();\n break;\n case 403:\n this.onerror(403);\n this.close(1008, \"forbidden\", false);\n break;\n case 0:\n case 500:\n this.onerror(500);\n this.closeAndRetry(1011, \"internal server error\", 500);\n break;\n default:\n throw new Error(`unhandled poll status ${status}`);\n }\n });\n }\n // we collect all pushes within the current event loop by\n // setTimeout 0, which optimizes back-to-back procedural\n // pushes against an empty buffer\n send(body) {\n if (typeof body !== \"string\") {\n body = arrayBufferToBase64(body);\n }\n if (this.currentBatch) {\n this.currentBatch.push(body);\n } else if (this.awaitingBatchAck) {\n this.batchBuffer.push(body);\n } else {\n this.currentBatch = [body];\n this.currentBatchTimer = setTimeout(() => {\n this.batchSend(this.currentBatch);\n this.currentBatch = null;\n }, 0);\n }\n }\n batchSend(messages) {\n this.awaitingBatchAck = true;\n this.ajax(\"POST\", \"application/x-ndjson\", messages.join(\"\\n\"), () => this.onerror(\"timeout\"), resp => {\n this.awaitingBatchAck = false;\n if (!resp || resp.status !== 200) {\n this.onerror(resp && resp.status);\n this.closeAndRetry(1011, \"internal server error\", false);\n } else if (this.batchBuffer.length > 0) {\n this.batchSend(this.batchBuffer);\n this.batchBuffer = [];\n }\n });\n }\n close(code, reason, wasClean) {\n for (let req of this.reqs) {\n req.abort();\n }\n this.readyState = SOCKET_STATES.closed;\n let opts = Object.assign({\n code: 1e3,\n reason: void 0,\n wasClean: true\n }, {\n code,\n reason,\n wasClean\n });\n this.batchBuffer = [];\n clearTimeout(this.currentBatchTimer);\n this.currentBatchTimer = null;\n if (typeof CloseEvent !== \"undefined\") {\n this.onclose(new CloseEvent(\"close\", opts));\n } else {\n this.onclose(opts);\n }\n }\n ajax(method, contentType, body, onCallerTimeout, callback) {\n let req;\n let ontimeout = () => {\n this.reqs.delete(req);\n onCallerTimeout();\n };\n req = Ajax.request(method, this.endpointURL(), contentType, body, this.timeout, ontimeout, resp => {\n this.reqs.delete(req);\n if (this.isActive()) {\n callback(resp);\n }\n });\n this.reqs.add(req);\n }\n};\n\n// js/phoenix/presence.js\nvar Presence = class {\n constructor(channel, opts = {}) {\n let events = opts.events || {\n state: \"presence_state\",\n diff: \"presence_diff\"\n };\n this.state = {};\n this.pendingDiffs = [];\n this.channel = channel;\n this.joinRef = null;\n this.caller = {\n onJoin: function () {},\n onLeave: function () {},\n onSync: function () {}\n };\n this.channel.on(events.state, newState => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n this.joinRef = this.channel.joinRef();\n this.state = Presence.syncState(this.state, newState, onJoin, onLeave);\n this.pendingDiffs.forEach(diff => {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n });\n this.pendingDiffs = [];\n onSync();\n });\n this.channel.on(events.diff, diff => {\n let {\n onJoin,\n onLeave,\n onSync\n } = this.caller;\n if (this.inPendingSyncState()) {\n this.pendingDiffs.push(diff);\n } else {\n this.state = Presence.syncDiff(this.state, diff, onJoin, onLeave);\n onSync();\n }\n });\n }\n onJoin(callback) {\n this.caller.onJoin = callback;\n }\n onLeave(callback) {\n this.caller.onLeave = callback;\n }\n onSync(callback) {\n this.caller.onSync = callback;\n }\n list(by) {\n return Presence.list(this.state, by);\n }\n inPendingSyncState() {\n return !this.joinRef || this.joinRef !== this.channel.joinRef();\n }\n // lower-level public static API\n /**\n * Used to sync the list of presences on the server\n * with the client's state. An optional `onJoin` and `onLeave` callback can\n * be provided to react to changes in the client's local presences across\n * disconnects and reconnects with the server.\n *\n * @returns {Presence}\n */\n static syncState(currentState, newState, onJoin, onLeave) {\n let state = this.clone(currentState);\n let joins = {};\n let leaves = {};\n this.map(state, (key, presence) => {\n if (!newState[key]) {\n leaves[key] = presence;\n }\n });\n this.map(newState, (key, newPresence) => {\n let currentPresence = state[key];\n if (currentPresence) {\n let newRefs = newPresence.metas.map(m => m.phx_ref);\n let curRefs = currentPresence.metas.map(m => m.phx_ref);\n let joinedMetas = newPresence.metas.filter(m => curRefs.indexOf(m.phx_ref) < 0);\n let leftMetas = currentPresence.metas.filter(m => newRefs.indexOf(m.phx_ref) < 0);\n if (joinedMetas.length > 0) {\n joins[key] = newPresence;\n joins[key].metas = joinedMetas;\n }\n if (leftMetas.length > 0) {\n leaves[key] = this.clone(currentPresence);\n leaves[key].metas = leftMetas;\n }\n } else {\n joins[key] = newPresence;\n }\n });\n return this.syncDiff(state, {\n joins,\n leaves\n }, onJoin, onLeave);\n }\n /**\n *\n * Used to sync a diff of presence join and leave\n * events from the server, as they happen. Like `syncState`, `syncDiff`\n * accepts optional `onJoin` and `onLeave` callbacks to react to a user\n * joining or leaving from a device.\n *\n * @returns {Presence}\n */\n static syncDiff(state, diff, onJoin, onLeave) {\n let {\n joins,\n leaves\n } = this.clone(diff);\n if (!onJoin) {\n onJoin = function () {};\n }\n if (!onLeave) {\n onLeave = function () {};\n }\n this.map(joins, (key, newPresence) => {\n let currentPresence = state[key];\n state[key] = this.clone(newPresence);\n if (currentPresence) {\n let joinedRefs = state[key].metas.map(m => m.phx_ref);\n let curMetas = currentPresence.metas.filter(m => joinedRefs.indexOf(m.phx_ref) < 0);\n state[key].metas.unshift(...curMetas);\n }\n onJoin(key, currentPresence, newPresence);\n });\n this.map(leaves, (key, leftPresence) => {\n let currentPresence = state[key];\n if (!currentPresence) {\n return;\n }\n let refsToRemove = leftPresence.metas.map(m => m.phx_ref);\n currentPresence.metas = currentPresence.metas.filter(p => {\n return refsToRemove.indexOf(p.phx_ref) < 0;\n });\n onLeave(key, currentPresence, leftPresence);\n if (currentPresence.metas.length === 0) {\n delete state[key];\n }\n });\n return state;\n }\n /**\n * Returns the array of presences, with selected metadata.\n *\n * @param {Object} presences\n * @param {Function} chooser\n *\n * @returns {Presence}\n */\n static list(presences, chooser) {\n if (!chooser) {\n chooser = function (key, pres) {\n return pres;\n };\n }\n return this.map(presences, (key, presence) => {\n return chooser(key, presence);\n });\n }\n // private\n static map(obj, func) {\n return Object.getOwnPropertyNames(obj).map(key => func(key, obj[key]));\n }\n static clone(obj) {\n return JSON.parse(JSON.stringify(obj));\n }\n};\n\n// js/phoenix/serializer.js\nvar serializer_default = {\n HEADER_LENGTH: 1,\n META_LENGTH: 4,\n KINDS: {\n push: 0,\n reply: 1,\n broadcast: 2\n },\n encode(msg, callback) {\n if (msg.payload.constructor === ArrayBuffer) {\n return callback(this.binaryEncode(msg));\n } else {\n let payload = [msg.join_ref, msg.ref, msg.topic, msg.event, msg.payload];\n return callback(JSON.stringify(payload));\n }\n },\n decode(rawPayload, callback) {\n if (rawPayload.constructor === ArrayBuffer) {\n return callback(this.binaryDecode(rawPayload));\n } else {\n let [join_ref, ref, topic, event, payload] = JSON.parse(rawPayload);\n return callback({\n join_ref,\n ref,\n topic,\n event,\n payload\n });\n }\n },\n // private\n binaryEncode(message) {\n let {\n join_ref,\n ref,\n event,\n topic,\n payload\n } = message;\n let metaLength = this.META_LENGTH + join_ref.length + ref.length + topic.length + event.length;\n let header = new ArrayBuffer(this.HEADER_LENGTH + metaLength);\n let view = new DataView(header);\n let offset = 0;\n view.setUint8(offset++, this.KINDS.push);\n view.setUint8(offset++, join_ref.length);\n view.setUint8(offset++, ref.length);\n view.setUint8(offset++, topic.length);\n view.setUint8(offset++, event.length);\n Array.from(join_ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(ref, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(topic, char => view.setUint8(offset++, char.charCodeAt(0)));\n Array.from(event, char => view.setUint8(offset++, char.charCodeAt(0)));\n var combined = new Uint8Array(header.byteLength + payload.byteLength);\n combined.set(new Uint8Array(header), 0);\n combined.set(new Uint8Array(payload), header.byteLength);\n return combined.buffer;\n },\n binaryDecode(buffer) {\n let view = new DataView(buffer);\n let kind = view.getUint8(0);\n let decoder = new TextDecoder();\n switch (kind) {\n case this.KINDS.push:\n return this.decodePush(buffer, view, decoder);\n case this.KINDS.reply:\n return this.decodeReply(buffer, view, decoder);\n case this.KINDS.broadcast:\n return this.decodeBroadcast(buffer, view, decoder);\n }\n },\n decodePush(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let topicSize = view.getUint8(2);\n let eventSize = view.getUint8(3);\n let offset = this.HEADER_LENGTH + this.META_LENGTH - 1;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: joinRef,\n ref: null,\n topic,\n event,\n payload: data\n };\n },\n decodeReply(buffer, view, decoder) {\n let joinRefSize = view.getUint8(1);\n let refSize = view.getUint8(2);\n let topicSize = view.getUint8(3);\n let eventSize = view.getUint8(4);\n let offset = this.HEADER_LENGTH + this.META_LENGTH;\n let joinRef = decoder.decode(buffer.slice(offset, offset + joinRefSize));\n offset = offset + joinRefSize;\n let ref = decoder.decode(buffer.slice(offset, offset + refSize));\n offset = offset + refSize;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n let payload = {\n status: event,\n response: data\n };\n return {\n join_ref: joinRef,\n ref,\n topic,\n event: CHANNEL_EVENTS.reply,\n payload\n };\n },\n decodeBroadcast(buffer, view, decoder) {\n let topicSize = view.getUint8(1);\n let eventSize = view.getUint8(2);\n let offset = this.HEADER_LENGTH + 2;\n let topic = decoder.decode(buffer.slice(offset, offset + topicSize));\n offset = offset + topicSize;\n let event = decoder.decode(buffer.slice(offset, offset + eventSize));\n offset = offset + eventSize;\n let data = buffer.slice(offset, buffer.byteLength);\n return {\n join_ref: null,\n ref: null,\n topic,\n event,\n payload: data\n };\n }\n};\n\n// js/phoenix/socket.js\nvar Socket = class {\n constructor(endPoint, opts = {}) {\n this.stateChangeCallbacks = {\n open: [],\n close: [],\n error: [],\n message: []\n };\n this.channels = [];\n this.sendBuffer = [];\n this.ref = 0;\n this.timeout = opts.timeout || DEFAULT_TIMEOUT;\n this.transport = opts.transport || global.WebSocket || LongPoll;\n this.primaryPassedHealthCheck = false;\n this.longPollFallbackMs = opts.longPollFallbackMs;\n this.fallbackTimer = null;\n this.sessionStore = opts.sessionStorage || global && global.sessionStorage;\n this.establishedConnections = 0;\n this.defaultEncoder = serializer_default.encode.bind(serializer_default);\n this.defaultDecoder = serializer_default.decode.bind(serializer_default);\n this.closeWasClean = false;\n this.binaryType = opts.binaryType || \"arraybuffer\";\n this.connectClock = 1;\n if (this.transport !== LongPoll) {\n this.encode = opts.encode || this.defaultEncoder;\n this.decode = opts.decode || this.defaultDecoder;\n } else {\n this.encode = this.defaultEncoder;\n this.decode = this.defaultDecoder;\n }\n let awaitingConnectionOnPageShow = null;\n if (phxWindow && phxWindow.addEventListener) {\n phxWindow.addEventListener(\"pagehide\", _e => {\n if (this.conn) {\n this.disconnect();\n awaitingConnectionOnPageShow = this.connectClock;\n }\n });\n phxWindow.addEventListener(\"pageshow\", _e => {\n if (awaitingConnectionOnPageShow === this.connectClock) {\n awaitingConnectionOnPageShow = null;\n this.connect();\n }\n });\n }\n this.heartbeatIntervalMs = opts.heartbeatIntervalMs || 3e4;\n this.rejoinAfterMs = tries => {\n if (opts.rejoinAfterMs) {\n return opts.rejoinAfterMs(tries);\n } else {\n return [1e3, 2e3, 5e3][tries - 1] || 1e4;\n }\n };\n this.reconnectAfterMs = tries => {\n if (opts.reconnectAfterMs) {\n return opts.reconnectAfterMs(tries);\n } else {\n return [10, 50, 100, 150, 200, 250, 500, 1e3, 2e3][tries - 1] || 5e3;\n }\n };\n this.logger = opts.logger || null;\n if (!this.logger && opts.debug) {\n this.logger = (kind, msg, data) => {\n console.log(`${kind}: ${msg}`, data);\n };\n }\n this.longpollerTimeout = opts.longpollerTimeout || 2e4;\n this.params = closure(opts.params || {});\n this.endPoint = `${endPoint}/${TRANSPORTS.websocket}`;\n this.vsn = opts.vsn || DEFAULT_VSN;\n this.heartbeatTimeoutTimer = null;\n this.heartbeatTimer = null;\n this.pendingHeartbeatRef = null;\n this.reconnectTimer = new Timer(() => {\n this.teardown(() => this.connect());\n }, this.reconnectAfterMs);\n }\n /**\n * Returns the LongPoll transport reference\n */\n getLongPollTransport() {\n return LongPoll;\n }\n /**\n * Disconnects and replaces the active transport\n *\n * @param {Function} newTransport - The new transport class to instantiate\n *\n */\n replaceTransport(newTransport) {\n this.connectClock++;\n this.closeWasClean = true;\n clearTimeout(this.fallbackTimer);\n this.reconnectTimer.reset();\n if (this.conn) {\n this.conn.close();\n this.conn = null;\n }\n this.transport = newTransport;\n }\n /**\n * Returns the socket protocol\n *\n * @returns {string}\n */\n protocol() {\n return location.protocol.match(/^https/) ? \"wss\" : \"ws\";\n }\n /**\n * The fully qualified socket url\n *\n * @returns {string}\n */\n endPointURL() {\n let uri = Ajax.appendParams(Ajax.appendParams(this.endPoint, this.params()), {\n vsn: this.vsn\n });\n if (uri.charAt(0) !== \"/\") {\n return uri;\n }\n if (uri.charAt(1) === \"/\") {\n return `${this.protocol()}:${uri}`;\n }\n return `${this.protocol()}://${location.host}${uri}`;\n }\n /**\n * Disconnects the socket\n *\n * See https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent#Status_codes for valid status codes.\n *\n * @param {Function} callback - Optional callback which is called after socket is disconnected.\n * @param {integer} code - A status code for disconnection (Optional).\n * @param {string} reason - A textual description of the reason to disconnect. (Optional)\n */\n disconnect(callback, code, reason) {\n this.connectClock++;\n this.closeWasClean = true;\n clearTimeout(this.fallbackTimer);\n this.reconnectTimer.reset();\n this.teardown(callback, code, reason);\n }\n /**\n *\n * @param {Object} params - The params to send when connecting, for example `{user_id: userToken}`\n *\n * Passing params to connect is deprecated; pass them in the Socket constructor instead:\n * `new Socket(\"/socket\", {params: {user_id: userToken}})`.\n */\n connect(params) {\n if (params) {\n console && console.log(\"passing params to connect is deprecated. Instead pass :params to the Socket constructor\");\n this.params = closure(params);\n }\n if (this.conn) {\n return;\n }\n if (this.longPollFallbackMs && this.transport !== LongPoll) {\n this.connectWithFallback(LongPoll, this.longPollFallbackMs);\n } else {\n this.transportConnect();\n }\n }\n /**\n * Logs the message. Override `this.logger` for specialized logging. noops by default\n * @param {string} kind\n * @param {string} msg\n * @param {Object} data\n */\n log(kind, msg, data) {\n this.logger && this.logger(kind, msg, data);\n }\n /**\n * Returns true if a logger has been set on this socket.\n */\n hasLogger() {\n return this.logger !== null;\n }\n /**\n * Registers callbacks for connection open events\n *\n * @example socket.onOpen(function(){ console.info(\"the socket was opened\") })\n *\n * @param {Function} callback\n */\n onOpen(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.open.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection close events\n * @param {Function} callback\n */\n onClose(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.close.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection error events\n *\n * @example socket.onError(function(error){ alert(\"An error occurred\") })\n *\n * @param {Function} callback\n */\n onError(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.error.push([ref, callback]);\n return ref;\n }\n /**\n * Registers callbacks for connection message events\n * @param {Function} callback\n */\n onMessage(callback) {\n let ref = this.makeRef();\n this.stateChangeCallbacks.message.push([ref, callback]);\n return ref;\n }\n /**\n * Pings the server and invokes the callback with the RTT in milliseconds\n * @param {Function} callback\n *\n * Returns true if the ping was pushed or false if unable to be pushed.\n */\n ping(callback) {\n if (!this.isConnected()) {\n return false;\n }\n let ref = this.makeRef();\n let startTime = Date.now();\n this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref\n });\n let onMsgRef = this.onMessage(msg => {\n if (msg.ref === ref) {\n this.off([onMsgRef]);\n callback(Date.now() - startTime);\n }\n });\n return true;\n }\n /**\n * @private\n */\n transportConnect() {\n this.connectClock++;\n this.closeWasClean = false;\n this.conn = new this.transport(this.endPointURL());\n this.conn.binaryType = this.binaryType;\n this.conn.timeout = this.longpollerTimeout;\n this.conn.onopen = () => this.onConnOpen();\n this.conn.onerror = error => this.onConnError(error);\n this.conn.onmessage = event => this.onConnMessage(event);\n this.conn.onclose = event => this.onConnClose(event);\n }\n getSession(key) {\n return this.sessionStore && this.sessionStore.getItem(key);\n }\n storeSession(key, val) {\n this.sessionStore && this.sessionStore.setItem(key, val);\n }\n connectWithFallback(fallbackTransport, fallbackThreshold = 2500) {\n clearTimeout(this.fallbackTimer);\n let established = false;\n let primaryTransport = true;\n let openRef, errorRef;\n let fallback = reason => {\n this.log(\"transport\", `falling back to ${fallbackTransport.name}...`, reason);\n this.off([openRef, errorRef]);\n primaryTransport = false;\n this.replaceTransport(fallbackTransport);\n this.transportConnect();\n };\n if (this.getSession(`phx:fallback:${fallbackTransport.name}`)) {\n return fallback(\"memorized\");\n }\n this.fallbackTimer = setTimeout(fallback, fallbackThreshold);\n errorRef = this.onError(reason => {\n this.log(\"transport\", \"error\", reason);\n if (primaryTransport && !established) {\n clearTimeout(this.fallbackTimer);\n fallback(reason);\n }\n });\n this.onOpen(() => {\n established = true;\n if (!primaryTransport) {\n if (!this.primaryPassedHealthCheck) {\n this.storeSession(`phx:fallback:${fallbackTransport.name}`, \"true\");\n }\n return this.log(\"transport\", `established ${fallbackTransport.name} fallback`);\n }\n clearTimeout(this.fallbackTimer);\n this.fallbackTimer = setTimeout(fallback, fallbackThreshold);\n this.ping(rtt => {\n this.log(\"transport\", \"connected to primary after\", rtt);\n this.primaryPassedHealthCheck = true;\n clearTimeout(this.fallbackTimer);\n });\n });\n this.transportConnect();\n }\n clearHeartbeats() {\n clearTimeout(this.heartbeatTimer);\n clearTimeout(this.heartbeatTimeoutTimer);\n }\n onConnOpen() {\n if (this.hasLogger()) this.log(\"transport\", `${this.transport.name} connected to ${this.endPointURL()}`);\n this.closeWasClean = false;\n this.establishedConnections++;\n this.flushSendBuffer();\n this.reconnectTimer.reset();\n this.resetHeartbeat();\n this.stateChangeCallbacks.open.forEach(([, callback]) => callback());\n }\n /**\n * @private\n */\n heartbeatTimeout() {\n if (this.pendingHeartbeatRef) {\n this.pendingHeartbeatRef = null;\n if (this.hasLogger()) {\n this.log(\"transport\", \"heartbeat timeout. Attempting to re-establish connection\");\n }\n this.triggerChanError();\n this.closeWasClean = false;\n this.teardown(() => this.reconnectTimer.scheduleTimeout(), WS_CLOSE_NORMAL, \"heartbeat timeout\");\n }\n }\n resetHeartbeat() {\n if (this.conn && this.conn.skipHeartbeat) {\n return;\n }\n this.pendingHeartbeatRef = null;\n this.clearHeartbeats();\n this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n teardown(callback, code, reason) {\n if (!this.conn) {\n return callback && callback();\n }\n this.waitForBufferDone(() => {\n if (this.conn) {\n if (code) {\n this.conn.close(code, reason || \"\");\n } else {\n this.conn.close();\n }\n }\n this.waitForSocketClosed(() => {\n if (this.conn) {\n this.conn.onopen = function () {};\n this.conn.onerror = function () {};\n this.conn.onmessage = function () {};\n this.conn.onclose = function () {};\n this.conn = null;\n }\n callback && callback();\n });\n });\n }\n waitForBufferDone(callback, tries = 1) {\n if (tries === 5 || !this.conn || !this.conn.bufferedAmount) {\n callback();\n return;\n }\n setTimeout(() => {\n this.waitForBufferDone(callback, tries + 1);\n }, 150 * tries);\n }\n waitForSocketClosed(callback, tries = 1) {\n if (tries === 5 || !this.conn || this.conn.readyState === SOCKET_STATES.closed) {\n callback();\n return;\n }\n setTimeout(() => {\n this.waitForSocketClosed(callback, tries + 1);\n }, 150 * tries);\n }\n onConnClose(event) {\n let closeCode = event && event.code;\n if (this.hasLogger()) this.log(\"transport\", \"close\", event);\n this.triggerChanError();\n this.clearHeartbeats();\n if (!this.closeWasClean && closeCode !== 1e3) {\n this.reconnectTimer.scheduleTimeout();\n }\n this.stateChangeCallbacks.close.forEach(([, callback]) => callback(event));\n }\n /**\n * @private\n */\n onConnError(error) {\n if (this.hasLogger()) this.log(\"transport\", error);\n let transportBefore = this.transport;\n let establishedBefore = this.establishedConnections;\n this.stateChangeCallbacks.error.forEach(([, callback]) => {\n callback(error, transportBefore, establishedBefore);\n });\n if (transportBefore === this.transport || establishedBefore > 0) {\n this.triggerChanError();\n }\n }\n /**\n * @private\n */\n triggerChanError() {\n this.channels.forEach(channel => {\n if (!(channel.isErrored() || channel.isLeaving() || channel.isClosed())) {\n channel.trigger(CHANNEL_EVENTS.error);\n }\n });\n }\n /**\n * @returns {string}\n */\n connectionState() {\n switch (this.conn && this.conn.readyState) {\n case SOCKET_STATES.connecting:\n return \"connecting\";\n case SOCKET_STATES.open:\n return \"open\";\n case SOCKET_STATES.closing:\n return \"closing\";\n default:\n return \"closed\";\n }\n }\n /**\n * @returns {boolean}\n */\n isConnected() {\n return this.connectionState() === \"open\";\n }\n /**\n * @private\n *\n * @param {Channel}\n */\n remove(channel) {\n this.off(channel.stateChangeRefs);\n this.channels = this.channels.filter(c => c !== channel);\n }\n /**\n * Removes `onOpen`, `onClose`, `onError,` and `onMessage` registrations.\n *\n * @param {refs} - list of refs returned by calls to\n * `onOpen`, `onClose`, `onError,` and `onMessage`\n */\n off(refs) {\n for (let key in this.stateChangeCallbacks) {\n this.stateChangeCallbacks[key] = this.stateChangeCallbacks[key].filter(([ref]) => {\n return refs.indexOf(ref) === -1;\n });\n }\n }\n /**\n * Initiates a new channel for the given topic\n *\n * @param {string} topic\n * @param {Object} chanParams - Parameters for the channel\n * @returns {Channel}\n */\n channel(topic, chanParams = {}) {\n let chan = new Channel(topic, chanParams, this);\n this.channels.push(chan);\n return chan;\n }\n /**\n * @param {Object} data\n */\n push(data) {\n if (this.hasLogger()) {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = data;\n this.log(\"push\", `${topic} ${event} (${join_ref}, ${ref})`, payload);\n }\n if (this.isConnected()) {\n this.encode(data, result => this.conn.send(result));\n } else {\n this.sendBuffer.push(() => this.encode(data, result => this.conn.send(result)));\n }\n }\n /**\n * Return the next message ref, accounting for overflows\n * @returns {string}\n */\n makeRef() {\n let newRef = this.ref + 1;\n if (newRef === this.ref) {\n this.ref = 0;\n } else {\n this.ref = newRef;\n }\n return this.ref.toString();\n }\n sendHeartbeat() {\n if (this.pendingHeartbeatRef && !this.isConnected()) {\n return;\n }\n this.pendingHeartbeatRef = this.makeRef();\n this.push({\n topic: \"phoenix\",\n event: \"heartbeat\",\n payload: {},\n ref: this.pendingHeartbeatRef\n });\n this.heartbeatTimeoutTimer = setTimeout(() => this.heartbeatTimeout(), this.heartbeatIntervalMs);\n }\n flushSendBuffer() {\n if (this.isConnected() && this.sendBuffer.length > 0) {\n this.sendBuffer.forEach(callback => callback());\n this.sendBuffer = [];\n }\n }\n onConnMessage(rawMessage) {\n this.decode(rawMessage.data, msg => {\n let {\n topic,\n event,\n payload,\n ref,\n join_ref\n } = msg;\n if (ref && ref === this.pendingHeartbeatRef) {\n this.clearHeartbeats();\n this.pendingHeartbeatRef = null;\n this.heartbeatTimer = setTimeout(() => this.sendHeartbeat(), this.heartbeatIntervalMs);\n }\n if (this.hasLogger()) this.log(\"receive\", `${payload.status || \"\"} ${topic} ${event} ${ref && \"(\" + ref + \")\" || \"\"}`, payload);\n for (let i = 0; i < this.channels.length; i++) {\n const channel = this.channels[i];\n if (!channel.isMember(topic, event, payload, join_ref)) {\n continue;\n }\n channel.trigger(event, payload, ref, join_ref);\n }\n for (let i = 0; i < this.stateChangeCallbacks.message.length; i++) {\n let [, callback] = this.stateChangeCallbacks.message[i];\n callback(msg);\n }\n });\n }\n leaveOpenTopic(topic) {\n let dupChannel = this.channels.find(c => c.topic === topic && (c.isJoined() || c.isJoining()));\n if (dupChannel) {\n if (this.hasLogger()) this.log(\"transport\", `leaving duplicate topic \"${topic}\"`);\n dupChannel.leave();\n }\n }\n};\nexport { Channel, LongPoll, Presence, serializer_default as Serializer, Socket };\n","import { Injectable, inject } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { BehaviorSubject, map, Observable, switchMap, take, tap } from 'rxjs';\nimport { ClientNotification, NotificationsResponse } from 'app/layout/common/notifications/notifications.types';\nimport { environment } from 'environments/environment';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NotificationsService\n{\n private _httpClient = inject(HttpClient);\n\n private _notifications: BehaviorSubject = new BehaviorSubject([]);\n private _newNotification: BehaviorSubject = new BehaviorSubject(false);\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n /**\n * Constructor\n */\n constructor()\n {\n }\n\n // -----------------------------------------------------------------------------------------------------\n // @ Accessors\n // -----------------------------------------------------------------------------------------------------\n /**\n * Getter for notifications\n */\n get notifications$(): Observable\n {\n return this._notifications.asObservable();\n }\n\n /**\n * Getter for new notification arrivals\n */\n get newNotification$(): Observable\n {\n return this._newNotification.asObservable();\n }\n\n set newNotification(value: boolean)\n {\n this._newNotification.next(value);\n }\n\n // -----------------------------------------------------------------------------------------------------\n // @ Static Functions\n // -----------------------------------------------------------------------------------------------------\n\t\tstatic parseNotifications(notifications: ClientNotification[]): ClientNotification[]\n {\n\t\t\tconst updatedNotifications = notifications.map((notification: ClientNotification) => {\n\t\t\t\tswitch(notification.resource_type) {\n\t\t\t\t\tcase 'report_export': {\n\t\t\t\t\t\tNotificationsService.updateExportNotification(notification);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 'Transcription': {\n\t\t\t\t\t\tNotificationsService.updateTranscriptionNotification(notification);\n\t\t\t\t\t\tbreak;\n }\n case 'report_clone': {\n NotificationsService.updateCloneNotification(notification);\n break;\n }\n\t\t\t\t\tdefault: {\n\t\t\t\t\t\tnotification.title = '';\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\treturn notification;\n\t\t\t});\n\n\t\t\treturn updatedNotifications;\n }\n\n /**\n * Update the notification for report export\n *\n * @param notification\n */\n static updateExportNotification(notification: ClientNotification): void {\n notification.icon = 'fa-solid fa-file';\n if (notification.download_url) {\n notification.title = 'Download ready';\n if (notification.report_list) {\n notification.description = 'Your download for ' + notification.report_list[0]['report_name'] + ' has been prepared.';\n }\n } else {\n notification.title = 'Download failed';\n notification.icon = 'fa-solid fa-file-exclamation';\n if (notification.report_list) {\n notification.description = 'Your download for ' + notification.report_list[0]['report_name'] + ' failed, please retry.';\n }\n }\n }\n\n /**\n * Update the notification for transcription\n *\n * @param notification\n */\n static updateTranscriptionNotification(notification: ClientNotification): void {\n if (notification.resource_status === 'Failed') {\n notification.icon = 'fa-kit fa-solid-microphone-circle-exclamation';\n notification.title = 'Transcription Failed';\n notification.description = 'Your dictation for ' + notification.report_name +\n ' has failed, please retry.';\n } else {\n notification.icon = 'fa-solid fa-microphone';\n notification.title = 'Transcription Complete';\n notification.description = 'Your dictation for ' + notification.report_name +\n ' has been automatically transcribed and is ready for review.';\n }\n }\n\n /**\n * Update the notification for report clone\n *\n * @param notification\n */\n static updateCloneNotification(notification: ClientNotification): void {\n if (notification.resource_status === 'Failed') {\n notification.icon = 'fa-kit fa-solid-clone-circle-exclamation';\n notification.title = 'Report Clone Failed';\n notification.description = 'Your report clone for ' + notification.report_name +\n ' failed, please retry.';\n } else {\n notification.icon = 'fa-solid fa-clone';\n notification.title = 'Report Clone Complete';\n notification.description = 'Your cloned report ' + notification.report_name +\n ' has been created.';\n }\n }\n\n // -----------------------------------------------------------------------------------------------------\n // @ Public methods\n // -----------------------------------------------------------------------------------------------------\n\n /**\n * Get all notifications\n */\n getAll(): Observable\n {\n\t\t\treturn this._httpClient.get(environment.apiHost + '/notification/unread')\n\t\t\t.pipe(\n\t\t\t\tmap(response => response.notifications),\n\t\t\t\tmap(notifications => NotificationsService.parseNotifications(notifications)),\n\t\t\t\ttap(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: (notifications: ClientNotification[]) => {\n\t\t\t\t\t\t\tthis._notifications.next(notifications);\n\t\t\t\t\t\t},\n\t\t\t\t\t\terror: (error) => { console.error(error); }\n\t\t\t\t\t}\n\t\t\t\t),\n\t\t\t\ttap(\n\t\t\t\t\t{\n\t\t\t\t\t\tnext: (notifications: ClientNotification[]) => {\n\t\t\t\t\t\t\tconst hasUnread = notifications.some(notification => !notification.read);\n\t\t\t\t\t\t\tthis._newNotification.next(hasUnread);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t);\n }\n\n\n /**\n * Update the notification\n *\n * @param id\n * @param notification\n */\n markAsRead(id: number, notification: ClientNotification): Observable\n {\n return this.notifications$.pipe(\n take(1),\n switchMap(notifications => this._httpClient.put(environment.apiHost + '/notification/' + id, { id })\n\t\t\t\t\t\t\t.pipe(\n map(() => {\n\n // Find the index of the updated notification\n const index = notifications.findIndex(item => item.notification_id === id);\n\n // Update the notification\n notifications[index] = notification;\n\n // Update the notifications\n this._notifications.next(notifications);\n\n // Return the updated notification\n return notification;\n })\n ))\n );\n }\n\n /**\n * Delete the notification\n *\n * @param id\n */\n delete(id: number): Observable\n {\n return this.notifications$.pipe(\n take(1),\n switchMap(notifications => this._httpClient.delete('api/common/notifications', {params: {id}}).pipe(\n map((isDeleted: boolean) => {\n\n // Find the index of the deleted notification\n const index = notifications.findIndex(item => item.notification_id === id);\n\n // Delete the notification\n notifications.splice(index, 1);\n\n // Update the notifications\n this._notifications.next(notifications);\n\n // Return the deleted status\n return isDeleted;\n })\n ))\n );\n }\n\n /**\n * Mark all notifications as read\n */\n markAllAsRead(): Observable\n {\n return this.notifications$.pipe(\n take(1),\n switchMap(notifications => this._httpClient.put(environment.apiHost + '/notification/all', '').pipe(\n map((isUpdated: boolean) => {\n\n // Go through all notifications and set them as read\n notifications.forEach((notification, index) => {\n notifications[index].read = true;\n });\n\n // Update the notifications\n this._notifications.next(notifications);\n\n // Return the updated status\n return isUpdated;\n })\n ))\n );\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { Socket, Channel } from 'phoenix';\nimport { AuthService } from 'app/core/auth/auth.service';\nimport { Observable } from 'rxjs';\nimport * as Sentry from '@sentry/angular-ivy';\nimport { NotificationsService } from './layout/common/notifications/notifications.service';\nimport { ReportItemService } from 'app/modules/report/services/report-item.service';\nimport { ReportService } from './modules/report/services/report.service';\nimport { ActivitySocketResponse } from './modules/activity/types/activity.types';\nimport { ActivityService } from './modules/activity/services/activity.service';\nimport { AlertService } from './alert.service';\n\n\nconst MAX_RETRIES = 5;\nconst INITIAL_RETRY_DELAY_MS = 500; // 1 seconds\nconst MAX_RETRY_DELAY_MS = 16000; // 16 seconds\nconst BACK_OFF_FACTOR = 2;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SocketService {\n private _authService = inject(AuthService);\n private _notificationsService = inject(NotificationsService);\n private _reportItemService = inject(ReportItemService);\n private _activityService = inject(ActivityService);\n private _alertService = inject(AlertService);\n private _reportService = inject(ReportService);\n\n private socket: Socket;\n private notificationChannel: Channel;\n private activityChannel: Channel;\n private activityDetailChannel: Channel;\n private reportItemChannel: Channel;\n private reportListChannel: Channel;\n\n /** Inserted by Angular inject() migration for backwards compatibility */\n constructor(...args: unknown[]);\n\n constructor() { }\n\n // -----------------------------------------------------------------------------------------------------\n // @Socket Service Methods\n // -----------------------------------------------------------------------------------------------------\n /* eslint-disable */\n connectToSocket(url: string, access_token: string, tenant_id: number, user: any): Observable {\n this.socket = new Socket(url, {\n params: {\n access_token,\n tenant_id,\n user\n },\n // Only retry 5 times then throw a Sentry error\n reconnectAfterMs: (tries): number => {\n if (tries < MAX_RETRIES) {\n const delay = Math.min(INITIAL_RETRY_DELAY_MS * Math.pow(BACK_OFF_FACTOR, tries - 1), MAX_RETRY_DELAY_MS);\n return delay;\n } else {\n console.error(`Stopping reconnection attempts after ${tries} tries`);\n const error = new Error('Max reconnect attempts reached for user: ' + user.email + ' in tenant: ' + tenant_id);\n Sentry.captureException(error);\n\n throw error;\n }\n\n }\n });\n /* eslint-enable */\n\n return new Observable((observer) => {\n this.socket.connect();\n\n this.socket.onOpen(() => {\n observer.next(this.socket);\n observer.complete();\n });\n\n this.socket.onError((err) => {\n observer.error(err);\n });\n\n this.socket.onClose(() => {\n observer.complete();\n });\n });\n }\n\n joinActivityChannel(subTopic: string): Channel {\n const topic = 'web_portal:activity:';\n\n setTimeout(() => {\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.activityChannel = this.socket.channel(`${topic}${subTopic}`, { access_token: this._authService.accessToken });\n\n this.activityChannel.onError((error) => {\n console.error('Something has went wrong with Activity Channel:', error);\n });\n\n this.activityChannel.join()\n .receive('ok', (resp) => {\n console.info('Joined channel ' + topic + subTopic + ' successfully', resp);\n })\n .receive('error', (error) => {\n console.error('Channel ' + topic + subTopic + ' join failed:', error);\n });\n\n // Listen for activity updates\n this.activityChannel.on('activity_update', (activity: ActivitySocketResponse) => {\n this._activityService.getActivityList().subscribe();\n this._activityService.getRecentActivity().subscribe();\n\n if (activity?.activity?.data?.status === 'completed' &&\n activity?.activity?.data?.progress?.total_count > 0 &&\n activity?.activity?.data?.progress?.failure === activity?.activity?.data?.progress?.total_count) {\n this._alertService.showActivityFailedAlert(activity?.activity);\n } else if (activity?.activity?.data?.status === 'completed' && activity?.activity?.data?.progress?.success > 0) {\n this._alertService.showActivityCompletedAlert(activity?.activity);\n }\n\n if (activity?.activity?.data?.status === 'requested') {\n this._alertService.showActivityRequestedAlert(activity?.activity);\n }\n if (activity?.activity?.data?.status === 'failed') {\n this._alertService.showActivityFailedAlert(activity?.activity);\n }\n });\n }, 2000);\n\n return this.activityChannel;\n }\n\n joinActivityDetailChannel(subTopic: string): Channel {\n const topic = 'web_portal:activity:';\n // eslint-disable-next-line @typescript-eslint/naming-convention\n this.activityDetailChannel = this.socket.channel(`${topic}${subTopic}`, { access_token: this._authService.accessToken });\n\n this.activityDetailChannel.onError((error) => {\n console.error('Something has went wrong with Activity Detail Channel:', error);\n });\n\n if (this.socket.isConnected()) {\n this.activityDetailChannel.join()\n .receive('ok', (resp) => {\n console.info('Joined channel ' + topic + subTopic + ' successfully', resp);\n })\n .receive('error', (error) => {\n console.error('Channel ' + topic + subTopic + ' join failed:', error);\n });\n } else {\n console.warn(`Socket is not connected for ${topic}${subTopic}`);\n }\n\n // Listen for activity updates\n this.activityDetailChannel.on('activity_detail_update', (activity: ActivitySocketResponse) => {\n this._activityService.getActivityDetail(activity.activity.activity_log_id).subscribe();\n });\n\n return this.activityDetailChannel;\n }\n\n leaveActivityDetailChannel(): void {\n this.activityDetailChannel?.leave()\n .receive('ok', (response) => {\n console.info('activityDetailChannel left:', response);\n })\n .receive('error', (error) => {\n console.error('activityDetailChannel leave failed:', error);\n });\n }\n\n joinReportItemChannel(subTopic: string): Channel {\n const topic = 'web_portal:report_item:';\n setTimeout(() => {\n this.reportItemChannel = this.socket.channel(`${topic}${subTopic}`, { access_token: this._authService.accessToken });\n\n this.reportItemChannel.onError((error) => {\n console.error('Something has went wrong:', error);\n });\n\n this.reportItemChannel.join()\n .receive('ok', (resp) => {\n console.info('Joined channel ' + topic + subTopic + ' successfully', resp);\n })\n .receive('error', (error) => {\n console.error('Channel ' + topic + subTopic + ' join failed:', error);\n });\n\n this.reportItemChannel.on('reorder_requested', (message) => {\n this._reportItemService.tableReorderUpdates = {status: 'in_progress', message: message};\n });\n\n // Listen for reorder completed\n this.reportItemChannel.on('reorder_completed', (message) => {\n this._reportItemService.tableReorderUpdates = {status: 'complete', message: message};\n });\n }, 2000);\n\n\n return this.reportItemChannel;\n }\n\n leaveReportItemChannel(): void {\n this.reportItemChannel?.leave()\n .receive('ok', (response) => {\n console.info('ReportItemChannel left:', response);\n })\n .receive('error', (error) => {\n console.error('ReportItemChannel leave failed:', error);\n });\n }\n\n joinReportListChannel(subTopic: string): Channel {\n const topic = 'web_portal:report_list:';\n\n setTimeout(() => {\n this.reportListChannel = this.socket.channel(`${topic}${subTopic}`, { access_token: this._authService.accessToken });\n\n this.reportListChannel.onError((error) => {\n console.error('Something has went wrong with reportListChannel:', error);\n });\n\n this.reportListChannel.join()\n .receive('ok', (resp) => {\n console.info('Joined channel ' + topic + subTopic + ' successfully', resp);\n })\n .receive('error', (error) => {\n console.error('Channel ' + topic + subTopic + ' join failed:', error);\n });\n\n // Listen for reorder completed\n this.reportListChannel.on('refresh_report_list', (message) => {\n this._reportService.refreshReportList = true;\n });\n }, 2000);\n\n return this.reportListChannel;\n }\n\n leaveReportListChannel(): void {\n this.reportListChannel?.leave()\n .receive('ok', (response) => {\n console.info('reportListChannel left:', response);\n })\n .receive('error', (error) => {\n console.error('reportListChannel leave failed:', error);\n });\n }\n\n}\n"],"names":["closure","value","globalSelf","phxWindow","global","DEFAULT_VSN","SOCKET_STATES","DEFAULT_TIMEOUT","WS_CLOSE_NORMAL","CHANNEL_STATES","CHANNEL_EVENTS","TRANSPORTS","XHR_STATES","Push","channel","event","payload","timeout","status","callback","response","_ref","h","Timer","timerCalc","Channel","topic","params","socket","pushEvent","reason","ref","bind","onClose","leavePush","_event","joinRef","handledPayload","eventBindings","i","Ajax","method","endPoint","accept","body","ontimeout","req","resp","obj","parentKey","queryStr","key","paramKey","paramVal","url","prefix","arrayBufferToBase64","buffer","binary","bytes","len","LongPoll","code","wasClean","token","messages","msg","opts","contentType","onCallerTimeout","serializer_default","msg","callback","payload","rawPayload","join_ref","ref","topic","event","message","metaLength","header","view","offset","char","combined","buffer","kind","decoder","joinRefSize","topicSize","eventSize","joinRef","data","refSize","CHANNEL_EVENTS","Socket","endPoint","opts","DEFAULT_TIMEOUT","global","LongPoll","awaitingConnectionOnPageShow","phxWindow","_e","tries","closure","TRANSPORTS","DEFAULT_VSN","Timer","newTransport","uri","Ajax","code","reason","params","startTime","onMsgRef","error","key","val","fallbackTransport","fallbackThreshold","established","primaryTransport","openRef","errorRef","fallback","rtt","WS_CLOSE_NORMAL","SOCKET_STATES","closeCode","transportBefore","establishedBefore","channel","c","refs","chanParams","chan","Channel","result","newRef","rawMessage","i","dupChannel","NotificationsService","constructor","_httpClient","inject","HttpClient","_notifications","BehaviorSubject","_newNotification","notifications$","asObservable","newNotification$","newNotification","value","next","parseNotifications","notifications","map","notification","resource_type","updateExportNotification","updateTranscriptionNotification","updateCloneNotification","title","icon","download_url","report_list","description","resource_status","report_name","getAll","get","environment","apiHost","pipe","response","tap","error","console","hasUnread","some","read","markAsRead","id","take","switchMap","put","index","findIndex","item","notification_id","delete","params","isDeleted","splice","markAllAsRead","isUpdated","forEach","factory","ɵfac","providedIn","MAX_RETRIES","INITIAL_RETRY_DELAY_MS","MAX_RETRY_DELAY_MS","BACK_OFF_FACTOR","SocketService","constructor","_authService","inject","AuthService","_notificationsService","NotificationsService","_reportItemService","ReportItemService","_activityService","ActivityService","_alertService","AlertService","_reportService","ReportService","connectToSocket","url","access_token","tenant_id","user","socket","Socket","params","reconnectAfterMs","tries","Math","min","pow","console","error","Error","email","Sentry","captureException","Observable","observer","connect","onOpen","next","complete","onError","err","onClose","joinActivityChannel","subTopic","topic","setTimeout","activityChannel","channel","accessToken","join","receive","resp","info","on","activity","getActivityList","subscribe","getRecentActivity","data","status","progress","total_count","failure","showActivityFailedAlert","success","showActivityCompletedAlert","showActivityRequestedAlert","joinActivityDetailChannel","activityDetailChannel","isConnected","warn","getActivityDetail","activity_log_id","leaveActivityDetailChannel","leave","response","joinReportItemChannel","reportItemChannel","message","tableReorderUpdates","leaveReportItemChannel","joinReportListChannel","reportListChannel","refreshReportList","leaveReportListChannel","factory","ɵfac","providedIn"],"mappings":"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","debug_id":"c41b4a4d-31b2-5856-8165-6b751ce6da90"}