{"version":3,"file":"bundle.min.js","sources":["js/db.js","js/ui.js","js/app.js"],"sourcesContent":["const dbName = 'WebhookTesterDb';\r\nconst dbVersion = 1;\r\nconst storeName = 'webhooksDb';\r\n\r\nlet db;\r\n\r\nconst openDB = () => {\r\n return new Promise((resolve, reject) => {\r\n const request = indexedDB.open(dbName, dbVersion);\r\n\r\n request.onerror = (event) => reject(\"IndexedDB error: \" + event.target.error);\r\n\r\n request.onsuccess = (event) => {\r\n db = event.target.result;\r\n resolve(db);\r\n };\r\n\r\n request.onupgradeneeded = (event) => {\r\n db = event.target.result;\r\n db.createObjectStore(storeName, { keyPath: 'slug' });\r\n };\r\n });\r\n};\r\n\r\nconst saveWebhooksInDb = (webhooks) => {\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([storeName], 'readwrite');\r\n const store = transaction.objectStore(storeName);\r\n\r\n webhooks.forEach(webhook => {\r\n store.put(webhook);\r\n });\r\n\r\n transaction.oncomplete = () => resolve();\r\n transaction.onerror = (event) => reject(event.target.error);\r\n });\r\n};\r\n\r\nconst getWebhooksFromDb = () => {\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([storeName], 'readonly');\r\n const store = transaction.objectStore(storeName);\r\n const request = store.getAll();\r\n\r\n request.onsuccess = () => resolve(request.result);\r\n request.onerror = (event) => reject(event.target.error);\r\n });\r\n};\r\n\r\nconst removeWebhookFromDb = (slug) => {\r\n return new Promise((resolve, reject) => {\r\n const transaction = db.transaction([storeName], 'readwrite');\r\n const store = transaction.objectStore(storeName);\r\n const request = store.delete(slug);\r\n\r\n request.onsuccess = () => resolve();\r\n request.onerror = (event) => reject(event.target.error);\r\n });\r\n};\r\n\r\nexport { openDB, saveWebhooksInDb, getWebhooksFromDb, removeWebhookFromDb };","import { saveWebhooksInDb, getWebhooksFromDb, removeWebhookFromDb } from './db.js';\r\n\r\nlet webhooks = [];\r\nlet signalRConnection = null;\r\nlet baseUrl = null;\r\n\r\nconst webhookList = document.getElementById('webhook-list');\r\nconst requestList = document.getElementById('request-list');\r\nconst requestHeadersTable = document.getElementById('request-headers');\r\nconst requestBodyPre = document.getElementById('request-body-raw');\r\nconst waitingForEvents = document.getElementById('waiting-for-events');\r\nconst requestsContainer = document.getElementById('requests-container');\r\nconst copyPopup = document.getElementById('copy-popup');\r\nconst curlExample = document.getElementById('curl-example');\r\nconst powershellExample = document.getElementById('powershell-example');\r\nconst copyExampleButton = document.getElementById('copy-example');\r\nconst copyActiveWebhookUrlButton = document.getElementById('copy-active-webhook-url');\r\nconst activeWebhookUrl = document.getElementById('active-webhook-url');\r\nconst copyBodyButton = document.getElementById('copy-body');\r\n\r\nconst setSignalRConnection = (connection) => {\r\n signalRConnection = connection;\r\n};\r\n\r\nconst setBaseUrl = (url) => {\r\n baseUrl = url;\r\n};\r\n\r\nconst initWebhooks = async () => {\r\n webhooks = await getWebhooksFromDb();\r\n if (webhooks.length === 0) {\r\n await createWebhook();\r\n } else {\r\n // send existing webhooks to the server\r\n if (signalRConnection) {\r\n await signalRConnection.invoke('CreateWebhooksAsync', webhooks.map(w => w.slug));\r\n }\r\n }\r\n renderWebhooks(webhooks);\r\n showWebhookDetails(0, webhooks);\r\n};\r\n\r\nconst createWebhook = async () => {\r\n const slug = generateWebhookSlug();\r\n const url = `${baseUrl}/webhooks/${slug}`;\r\n const newWebhook = { url, slug, requests: [] };\r\n\r\n if (signalRConnection) {\r\n try {\r\n await signalRConnection.invoke('CreateWebhooksAsync', [slug]);\r\n webhooks.push(newWebhook);\r\n await saveWebhooksInDb(webhooks);\r\n renderWebhooks(webhooks);\r\n showWebhookDetails(webhooks.length - 1, webhooks);\r\n } catch (error) {\r\n console.error('Failed to create webhook on server:', error);\r\n alert('Failed to create webhook. Please try again.');\r\n }\r\n } else {\r\n console.error('SignalR connection not available');\r\n alert('Cannot create webhook. Connection to server not available.');\r\n }\r\n};\r\n\r\nconst generateWebhookSlug = () => {\r\n const colors = [\r\n 'red', 'blue', 'green', 'yellow', 'purple', 'orange', 'pink', 'grey', 'white',\r\n 'black', 'brown', 'cyan', 'magenta', 'lime', 'teal', 'indigo', 'violet', 'gold',\r\n 'silver', 'bronze', 'maroon', 'navy', 'olive', 'aqua', 'turquoise', 'lavender'\r\n ];\r\n\r\n const animals = [\r\n 'dog', 'hawk', 'tiger', 'wolf', 'panther', 'dragon', 'falcon', 'panda', 'cat',\r\n 'bear', 'fox', 'mouse', 'rat', 'bird', 'pig', 'chicken', 'duck', 'elephant',\r\n 'lion', 'giraffe', 'zebra', 'koala', 'rhino', 'hippo', 'monkey', 'gorilla',\r\n 'penguin', 'dolphin', 'whale', 'shark', 'octopus', 'eagle', 'owl', 'bat',\r\n 'squirrel', 'rabbit', 'deer', 'moose', 'bison', 'coyote', 'leopard', 'jaguar'\r\n ];\r\n\r\n const number = Math.floor(Math.random() * 1000000); // 6-digit number (0 to 999999)\r\n const randomColor = colors[Math.floor(Math.random() * colors.length)];\r\n const randomAnimal = animals[Math.floor(Math.random() * animals.length)];\r\n\r\n return `${randomColor}-${randomAnimal}-${number.toString().padStart(6, '0')}`;\r\n};\r\n\r\nconst addRequestToWebhook = (slug, request) => {\r\n const webhook = webhooks.find(w => w.slug === slug);\r\n if (webhook) {\r\n webhook.requests.push(request);\r\n saveWebhooksInDb(webhooks);\r\n showWebhookDetails(webhooks.indexOf(webhook), webhooks);\r\n }\r\n};\r\n\r\nconst removeWebhook = async (slug) => {\r\n webhooks = webhooks.filter(webhook => webhook.slug !== slug);\r\n await removeWebhookFromDb(slug);\r\n renderWebhooks(webhooks);\r\n if (webhooks.length > 0) {\r\n showWebhookDetails(0, webhooks);\r\n } else {\r\n showWaitingForEvents();\r\n }\r\n};\r\n\r\nconst renderWebhooks = (webhooks) => {\r\n webhookList.innerHTML = '';\r\n webhooks.forEach((webhook, index) => {\r\n const li = document.createElement('li');\r\n li.innerHTML = `\r\n ${webhook.slug}\r\n \r\n `;\r\n li.onclick = () => showWebhookDetails(index, webhooks);\r\n li.querySelector('.remove-btn').onclick = (event) => {\r\n event.stopPropagation();\r\n removeWebhook(webhook.slug);\r\n };\r\n webhookList.appendChild(li);\r\n });\r\n};\r\n\r\nconst showWebhookDetails = (index, webhooks) => {\r\n const selectedWebhook = webhooks[index];\r\n updateExampleCommands(selectedWebhook.url);\r\n activeWebhookUrl.textContent = selectedWebhook.url;\r\n\r\n if (selectedWebhook.requests.length === 0) {\r\n showWaitingForEvents();\r\n } else {\r\n showRequests(selectedWebhook);\r\n showRequestDetails(selectedWebhook.requests[selectedWebhook.requests.length - 1]);\r\n }\r\n};\r\n\r\nconst showWaitingForEvents = () => {\r\n waitingForEvents.style.display = 'flex';\r\n requestsContainer.style.display = 'none';\r\n};\r\n\r\nconst showRequests = (webhook) => {\r\n waitingForEvents.style.display = 'none';\r\n requestsContainer.style.display = 'flex';\r\n\r\n requestList.innerHTML = '';\r\n webhook.requests.forEach((request, index) => {\r\n const li = document.createElement('li');\r\n const date = new Date(request.timestamp);\r\n const formattedDate = date.toLocaleDateString('en-US', {\r\n year: 'numeric',\r\n month: 'short',\r\n day: 'numeric'\r\n });\r\n const formattedTime = date.toLocaleTimeString('en-US', {\r\n hour: '2-digit',\r\n minute: '2-digit',\r\n second: '2-digit'\r\n });\r\n li.innerHTML = `\r\n ${request.method}\r\n \r\n ${formattedDate}\r\n ${formattedTime}\r\n \r\n `;\r\n li.onclick = () => showRequestDetails(request);\r\n requestList.appendChild(li);\r\n });\r\n};\r\n\r\nconst showRequestDetails = (request) => {\r\n renderHeadersTable(request.headers);\r\n const rawBody = request.body;\r\n const getHeader = (headers, name) => {\r\n const lowercaseName = name.toLowerCase();\r\n const header = Object.keys(headers).find(h => h.toLowerCase() === lowercaseName);\r\n return header ? headers[header] : null;\r\n };\r\n const contentType = (getHeader(request.headers, 'content-type') || '').toLowerCase();\r\n const rawTab = document.getElementById('request-body-raw');\r\n const formattedTab = document.getElementById('request-body-formatted');\r\n const rawTabButton = document.querySelector('.body-tabs .tab-btn[data-tab=\"raw\"]');\r\n const formattedTabButton = document.querySelector('.body-tabs .tab-btn[data-tab=\"formatted\"]');\r\n rawTab.textContent = rawBody;\r\n let formattedContent = '';\r\n let displayFormatted = true;\r\n let tabName = 'Formatted';\r\n if (/^application\\/json\\b/.test(contentType)) {\r\n try {\r\n const jsonBody = JSON.parse(rawBody);\r\n formattedContent = formatJSON(jsonBody);\r\n tabName = 'JSON';\r\n } catch (e) {\r\n formattedContent = '

Invalid JSON

';\r\n tabName = 'Invalid JSON';\r\n }\r\n } else if (/^(application|text)\\/xml\\b/.test(contentType)) {\r\n formattedContent = formatXML(rawBody);\r\n tabName = 'XML';\r\n } else if (/^application\\/x-www-form-urlencoded\\b/.test(contentType)) {\r\n formattedContent = formatFormData(rawBody);\r\n tabName = 'Form Data';\r\n } else if (/^text\\/plain\\b/.test(contentType)) {\r\n formattedContent = `
${escapeHTML(rawBody)}
`;\r\n tabName = 'Plain Text';\r\n } else {\r\n displayFormatted = false;\r\n }\r\n formattedTab.innerHTML = formattedContent;\r\n formattedTabButton.textContent = tabName;\r\n formattedTabButton.style.display = displayFormatted ? 'inline-block' : 'none';\r\n\r\n const isFormattedTabActive = formattedTabButton.classList.contains('active');\r\n if (!displayFormatted && isFormattedTabActive) {\r\n rawTabButton.click();\r\n }\r\n\r\n const bodyTabs = document.querySelectorAll('.body-tabs .tab-btn');\r\n const bodyContents = document.querySelectorAll('.body-tab-content .code-example');\r\n bodyTabs.forEach(viewerTab => {\r\n viewerTab.addEventListener('click', () => {\r\n bodyTabs.forEach(t => t.classList.remove('active'));\r\n bodyContents.forEach(c => c.classList.remove('active'));\r\n viewerTab.classList.add('active');\r\n document.querySelector(`.body-tab-content .code-example#request-body-${viewerTab.dataset.tab}`).classList.add('active');\r\n });\r\n });\r\n};\r\n\r\nconst formatXML = (xml) => {\r\n const parser = new DOMParser();\r\n const xmlDoc = parser.parseFromString(xml, \"text/xml\");\r\n const serializer = new XMLSerializer();\r\n let formatted = '';\r\n let indent = 0;\r\n\r\n const format = (node) => {\r\n if (node.nodeType === Node.ELEMENT_NODE) {\r\n const nodeName = node.nodeName;\r\n const attributes = Array.from(node.attributes)\r\n .map(attr => `${attr.name}=\"${attr.value}\"`)\r\n .join(' ');\r\n\r\n formatted += ' '.repeat(indent);\r\n formatted += `<${nodeName}${attributes ? ' ' + attributes : ''}>`;\r\n\r\n if (node.childNodes.length === 1 && node.childNodes[0].nodeType === Node.TEXT_NODE) {\r\n formatted += `${node.textContent}`;\r\n formatted += `</${nodeName}>\\n`;\r\n } else {\r\n formatted += '\\n';\r\n indent++;\r\n Array.from(node.childNodes).forEach(format);\r\n indent--;\r\n formatted += ' '.repeat(indent);\r\n formatted += `</${nodeName}>\\n`;\r\n }\r\n } else if (node.nodeType === Node.TEXT_NODE && node.textContent.trim()) {\r\n formatted += ' '.repeat(indent);\r\n formatted += `${node.textContent.trim()}\\n`;\r\n }\r\n };\r\n\r\n format(xmlDoc.documentElement);\r\n return `
${formatted}
`;\r\n};\r\n\r\nconst formatFormData = (formData) => {\r\n const params = new URLSearchParams(formData);\r\n let formatted = '
';\r\n for (const [key, value] of params) {\r\n formatted += `
`;\r\n formatted += `${escapeHTML(key)}: `;\r\n formatted += `${escapeHTML(value)}`;\r\n formatted += `
`;\r\n }\r\n formatted += '
';\r\n return formatted;\r\n};\r\n\r\nconst escapeHTML = (str) => {\r\n return str.replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/\"/g, '"')\r\n .replace(/'/g, ''');\r\n};\r\n\r\nconst formatJSON = (obj) => {\r\n return '
' + JSON.stringify(obj, null, 2)\r\n .replace(/&/g, '&')\r\n .replace(//g, '>')\r\n .replace(/(\"(\\\\u[a-zA-Z0-9]{4}|\\\\[^u]|[^\\\\\"])*\"(\\s*:)?|\\b(true|false|null)\\b|-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)/g, match => {\r\n let cls = 'number';\r\n if (/^\"/.test(match)) {\r\n if (/:$/.test(match)) {\r\n cls = 'key';\r\n } else {\r\n cls = 'string';\r\n }\r\n } else if (/true|false/.test(match)) {\r\n cls = 'boolean';\r\n } else if (/null/.test(match)) {\r\n cls = 'null';\r\n }\r\n return `${match}`;\r\n }) + '
';\r\n};\r\n\r\nconst renderHeadersTable = (headers) => {\r\n requestHeadersTable.innerHTML = `\r\n \r\n \r\n Header\r\n Value\r\n \r\n \r\n \r\n ${Object.entries(headers)\r\n .map(([key, value]) => `\r\n \r\n ${escapeHtml(key)}\r\n ${escapeHtml(value)}\r\n \r\n `)\r\n .join('')}\r\n \r\n `;\r\n};\r\n\r\nconst escapeHtml = (unsafe) => {\r\n return unsafe\r\n .replace(/&/g, \"&\")\r\n .replace(//g, \">\")\r\n .replace(/\"/g, \""\")\r\n .replace(/'/g, \"'\");\r\n};\r\n\r\nconst copyToClipboard = (text) => {\r\n navigator.clipboard.writeText(text).then(() => {\r\n showCopyPopup();\r\n }).catch(err => {\r\n console.error('Failed to copy: ', err);\r\n });\r\n};\r\n\r\nconst hideLoadingScreen = () => {\r\n const loadingOverlay = document.getElementById('loading-overlay');\r\n if (loadingOverlay) {\r\n loadingOverlay.style.display = 'none';\r\n }\r\n};\r\n\r\nconst showCopyPopup = () => {\r\n copyPopup.classList.add('show');\r\n setTimeout(() => {\r\n copyPopup.classList.remove('show');\r\n }, 2000);\r\n};\r\n\r\nconst updateExampleCommands = (webhookUrl) => {\r\n const exampleData = JSON.stringify({\r\n name: \"Test event\",\r\n data: {\r\n id: 1,\r\n name: \"Tester McTestFace\",\r\n by: \"Webhook Tester\",\r\n at: new Date().toISOString()\r\n },\r\n user: {\r\n email: \"tester@example.com\"\r\n },\r\n ts: Date.now()\r\n });\r\n\r\n curlExample.textContent = `curl ${webhookUrl} -X POST -H \"Content-Type: application/json\" -d '${exampleData}'`;\r\n\r\n powershellExample.textContent = `$body = '${exampleData}'\r\nInvoke-WebRequest -Uri \"${webhookUrl}\" -Method POST -Body $body -ContentType \"application/json\"`;\r\n};\r\n\r\nconst tabButtons = document.querySelectorAll('.tabs .tab-btn');\r\nconst tabContents = document.querySelectorAll('.tab-content .code-example');\r\n\r\ntabButtons.forEach(button => {\r\n button.addEventListener('click', () => {\r\n const tab = button.dataset.tab;\r\n tabButtons.forEach(btn => btn.classList.remove('active'));\r\n tabContents.forEach(content => content.classList.remove('active'));\r\n button.classList.add('active');\r\n document.getElementById(`${tab}-example`).classList.add('active');\r\n });\r\n});\r\n\r\ncopyExampleButton.addEventListener('click', () => {\r\n const activeTab = document.querySelector('.tabs .tab-btn.active').dataset.tab;\r\n const exampleText = document.getElementById(`${activeTab}-example`).textContent;\r\n copyToClipboard(exampleText);\r\n});\r\n\r\ncopyActiveWebhookUrlButton.addEventListener('click', () => {\r\n copyToClipboard(activeWebhookUrl.textContent);\r\n});\r\n\r\ncopyBodyButton.addEventListener('click', () => {\r\n copyToClipboard(requestBodyPre.textContent);\r\n});\r\n\r\nexport {\r\n initWebhooks,\r\n createWebhook,\r\n addRequestToWebhook,\r\n removeWebhook,\r\n setSignalRConnection,\r\n setBaseUrl,\r\n renderWebhooks,\r\n showWebhookDetails,\r\n updateExampleCommands,\r\n showWaitingForEvents,\r\n hideLoadingScreen\r\n};","import { openDB } from './db.js';\r\nimport {\r\n initWebhooks,\r\n createWebhook,\r\n addRequestToWebhook,\r\n setSignalRConnection,\r\n setBaseUrl,\r\n hideLoadingScreen\r\n} from './ui.js';\r\n\r\n\r\nconst generateGuid = () => {\r\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);\r\n return v.toString(16);\r\n });\r\n};\r\n\r\nconst getOrCreateClientId = () => {\r\n let clientId = localStorage.getItem('clientId');\r\n if (!clientId) {\r\n clientId = generateGuid();\r\n localStorage.setItem('clientId', clientId);\r\n }\r\n return clientId;\r\n};\r\n\r\nconst createSignalRConnection = (clientId) => {\r\n return new signalR.HubConnectionBuilder()\r\n .withUrl(`/hub?clientId=${clientId}`)\r\n .withAutomaticReconnect([0, 2000, 5000, 10000, 15000, 30000, null]) // Reconnect intervals\r\n .configureLogging(signalR.LogLevel.Information)\r\n .withHubProtocol(new signalR.protocols.msgpack.MessagePackHubProtocol())\r\n .build();\r\n};\r\n\r\nconst startSignalRConnection = async (connection) => {\r\n try {\r\n await connection.start();\r\n console.log('Connected to SignalR');\r\n } catch (err) {\r\n console.error('SignalR Connection Error: ', err);\r\n setTimeout(() => startSignalRConnection(connection), 5000);\r\n }\r\n};\r\n\r\nconst updateConnectionStatus = (status) => {\r\n const popup = document.getElementById('connection-status-popup');\r\n const statusText = document.getElementById('connection-status-text');\r\n const statusIcon = document.getElementById('connection-status-icon');\r\n\r\n if (popup && statusText && statusIcon) {\r\n statusText.textContent = status;\r\n\r\n popup.classList.remove('connection-status-connected', 'connection-status-reconnecting', 'connection-status-disconnected');\r\n\r\n switch (status) {\r\n case 'Connected':\r\n popup.classList.add('connection-status-connected');\r\n break;\r\n case 'Reconnecting...':\r\n popup.classList.add('connection-status-reconnecting');\r\n break;\r\n case 'Disconnected':\r\n popup.classList.add('connection-status-disconnected');\r\n break;\r\n }\r\n\r\n popup.classList.add('show');\r\n\r\n setTimeout(() => {\r\n popup.classList.remove('show');\r\n }, 5000);\r\n }\r\n};\r\n\r\nconst init = async () => {\r\n await openDB();\r\n const clientId = getOrCreateClientId();\r\n const connection = createSignalRConnection(clientId);\r\n\r\n connection.onreconnecting(() => updateConnectionStatus('Reconnecting...'));\r\n connection.onreconnected(() => updateConnectionStatus('Connected'));\r\n connection.onclose(async (error) => {\r\n updateConnectionStatus('Disconnected')\r\n await startSignalRConnection(connection);\r\n setSignalRConnection(connection);\r\n updateConnectionStatus('Connected');\r\n });\r\n\r\n connection.on('ReceiveBaseUrl', async (baseUrl) => {\r\n console.log('Received base URL:', baseUrl);\r\n setBaseUrl(baseUrl);\r\n await initWebhooks();\r\n hideLoadingScreen();\r\n });\r\n\r\n connection.on('NewRequest', (webhookRequest) => {\r\n console.log('New Webhook Request:', webhookRequest);\r\n\r\n const request = {\r\n id: webhookRequest.Id,\r\n timestamp: new Date(webhookRequest.Timestamp).toISOString(),\r\n method: webhookRequest.HttpMethod,\r\n headers: webhookRequest.HttpHeaders,\r\n body: webhookRequest.HttpBody\r\n };\r\n addRequestToWebhook(webhookRequest.Slug, request);\r\n });\r\n\r\n await startSignalRConnection(connection);\r\n console.log('Connected to SignalR with clientId:', clientId);\r\n setSignalRConnection(connection);\r\n updateConnectionStatus('Connected');\r\n\r\n const addWebhookButton = document.getElementById('add-webhook');\r\n addWebhookButton.addEventListener('click', createWebhook);\r\n};\r\n\r\ninit().catch(err => console.error('Initialization error: ', err));"],"names":["storeName","db","saveWebhooksInDb","webhooks","Promise","resolve","reject","transaction","store","objectStore","forEach","webhook","put","oncomplete","onerror","event","target","error","signalRConnection","baseUrl","webhookList","document","getElementById","requestList","requestHeadersTable","requestBodyPre","waitingForEvents","requestsContainer","copyPopup","curlExample","powershellExample","copyExampleButton","copyActiveWebhookUrlButton","activeWebhookUrl","copyBodyButton","setSignalRConnection","connection","setBaseUrl","url","initWebhooks","async","request","getAll","onsuccess","result","length","createWebhook","invoke","map","w","slug","renderWebhooks","showWebhookDetails","generateWebhookSlug","newWebhook","requests","push","console","alert","colors","animals","number","Math","floor","random","toString","padStart","removeWebhook","filter","delete","removeWebhookFromDb","showWaitingForEvents","innerHTML","index","li","createElement","onclick","querySelector","stopPropagation","appendChild","selectedWebhook","updateExampleCommands","textContent","showRequests","showRequestDetails","style","display","date","Date","timestamp","formattedDate","toLocaleDateString","year","month","day","formattedTime","toLocaleTimeString","hour","minute","second","method","toLowerCase","renderHeadersTable","headers","rawBody","body","contentType","name","lowercaseName","header","Object","keys","find","h","getHeader","rawTab","formattedTab","rawTabButton","formattedTabButton","formattedContent","displayFormatted","tabName","test","jsonBody","JSON","parse","formatJSON","e","formatXML","formatFormData","escapeHTML","isFormattedTabActive","classList","contains","click","bodyTabs","querySelectorAll","bodyContents","viewerTab","addEventListener","t","remove","c","add","dataset","tab","xml","xmlDoc","DOMParser","parseFromString","XMLSerializer","formatted","indent","format","node","nodeType","Node","ELEMENT_NODE","nodeName","attributes","Array","from","attr","value","join","repeat","childNodes","TEXT_NODE","trim","documentElement","formData","params","URLSearchParams","key","str","replace","obj","stringify","match","cls","entries","escapeHtml","unsafe","copyToClipboard","text","navigator","clipboard","writeText","then","showCopyPopup","catch","err","setTimeout","webhookUrl","exampleData","data","id","by","at","toISOString","user","email","ts","now","tabButtons","tabContents","button","btn","content","activeTab","exampleText","getOrCreateClientId","clientId","localStorage","getItem","r","setItem","startSignalRConnection","start","log","updateConnectionStatus","status","popup","statusText","statusIcon","indexedDB","open","onupgradeneeded","createObjectStore","keyPath","signalR","HubConnectionBuilder","withUrl","withAutomaticReconnect","configureLogging","LogLevel","Information","withHubProtocol","protocols","msgpack","MessagePackHubProtocol","build","createSignalRConnection","onreconnecting","onreconnected","onclose","on","loadingOverlay","hideLoadingScreen","webhookRequest","Id","Timestamp","HttpMethod","HttpHeaders","HttpBody","indexOf","addRequestToWebhook","Slug","init"],"mappings":"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"}