overmind
Version:
Frictionless state management
1 lines • 8.48 kB
Source Map (JSON)
{"version":3,"file":"Devtools.js","sourceRoot":"","sources":["../src/Devtools.ts"],"names":[],"mappings":"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","sourcesContent":["import { LogLevel } from './internalTypes'\nimport { SERIALIZE } from './rehydrate'\n\nexport type Message = {\n type: string\n data?: object\n}\n\nexport type DevtoolsMessage = {\n type: string\n appName: string\n data: any\n}\n\nexport class Devtools {\n private safeClassNames: Set<string> = new Set()\n private unsafeClassNames: Set<string> = new Set()\n private circularReferenceCache: any[] = []\n private buffer: string[] = []\n private serializer = Promise.resolve()\n private ws: WebSocket\n private isConnected: boolean = false\n private doReconnect: boolean = false\n private hasWarnedReconnect: boolean = false\n private reconnectInterval: number = 10000\n private name: string\n constructor(name: string, private logLevel: LogLevel = 'error') {\n this.name =\n typeof location !== 'undefined' &&\n location.search.includes('OVERMIND_DEVTOOL')\n ? name + ' (Overmind Devtool)'\n : name\n }\n\n connect = (host: string, onMessage: (message: Message) => void) => {\n host = host || 'localhost:3031'\n\n this.ws = new WebSocket(`ws://${host}?name=${this.name}`)\n this.ws.onmessage = (event) => {\n const data = JSON.parse(event.data)\n\n if (data.appName !== this.name) {\n return\n }\n onMessage(data)\n }\n this.ws.onopen = () => {\n this.isConnected = true\n this.flushBuffer()\n }\n this.ws.onerror = () => {\n console[this.logLevel](\n `OVERMIND DEVTOOLS: Not able to connect. You are trying to connect to \"${host}\", but there was no devtool there. Try the following:\n \n - Make sure you are running the latest version of the devtools, using \"npx overmind-devtools@latest\" or install latest extension for VSCode\n - Close the current tab and open a new one\n - Make sure the correct port is configured in the devtools\n `\n )\n }\n this.ws.onclose = () => {\n this.isConnected = false\n\n if (this.doReconnect && !this.hasWarnedReconnect) {\n console.warn(\n 'Debugger application is not running on selected port... will reconnect automatically behind the scenes'\n )\n this.hasWarnedReconnect = true\n }\n\n if (this.doReconnect) {\n this.reconnect(host, onMessage)\n }\n }\n }\n\n private reconnect(host, onMessage) {\n setTimeout(\n () =>\n this.connect(\n host,\n onMessage\n ),\n this.reconnectInterval\n )\n }\n\n send(message: Message) {\n const safeClassNames = this.safeClassNames\n const unsafeClassNames = this.unsafeClassNames\n const circularReferenceCache = this.circularReferenceCache\n\n this.sendMessage(\n JSON.stringify(message, function(_, value) {\n if (typeof value === 'function') {\n return '[Function]'\n }\n\n if (this.__CLASS__) {\n return value\n }\n\n if (value && value[SERIALIZE]) {\n return {\n __CLASS__: true,\n name: value.constructor.name,\n value,\n }\n }\n\n if (\n typeof value === 'object' &&\n value !== null &&\n !Array.isArray(value) &&\n value.constructor &&\n value.constructor.name !== 'Object'\n ) {\n if (circularReferenceCache.includes(value)) {\n return `[CIRCULAR REFERENCE: ${value.constructor.name}]`\n }\n\n circularReferenceCache.push(value)\n\n if (\n !safeClassNames.has(value.constructor.name) &&\n !unsafeClassNames.has(value.constructor.name)\n ) {\n try {\n JSON.stringify(value)\n safeClassNames.add(value.constructor.name)\n } catch {\n unsafeClassNames.add(value.constructor.name)\n }\n }\n\n if (safeClassNames.has(value.constructor.name)) {\n return {\n __CLASS__: true,\n name: value.constructor.name,\n value,\n }\n } else {\n return `[${value.constructor.name || 'NOT SERIALIZABLE'}]`\n }\n }\n\n return value\n })\n )\n circularReferenceCache.length = 0\n }\n\n private sendMessage = (payload: string) => {\n if (!this.isConnected) {\n this.buffer.push(payload)\n return\n }\n this.ws.send(`{\"appName\":\"${this.name}\",\"message\":${payload}}`)\n }\n\n private flushBuffer = async () => {\n this.buffer.forEach((payload) => {\n this.sendMessage(payload)\n })\n this.buffer.length = 0\n }\n}\n"]}