overmind
Version:
Frictionless state management
99 lines (96 loc) • 3.64 kB
JavaScript
const require_rehydrate = require('./rehydrate.js');
//#region src/Devtools.ts
var Devtools = class {
constructor(name, logLevel = "error") {
this.logLevel = logLevel;
this.safeClassNames = /* @__PURE__ */ new Set();
this.unsafeClassNames = /* @__PURE__ */ new Set();
this.circularReferenceCache = [];
this.buffer = [];
this.serializer = Promise.resolve();
this.isConnected = false;
this.doReconnect = false;
this.hasWarnedReconnect = false;
this.reconnectInterval = 1e4;
this.connect = (host, onMessage) => {
host = host || "localhost:3031";
this.ws = new WebSocket(`ws://${host}?name=${this.name}`);
this.ws.onmessage = (event) => {
const data = JSON.parse(event.data);
if (data.appName !== this.name) return;
onMessage(data);
};
this.ws.onopen = () => {
this.isConnected = true;
this.flushBuffer();
};
this.ws.onerror = () => {
console[this.logLevel](`OVERMIND DEVTOOLS: Not able to connect. You are trying to connect to "${host}", but there was no devtool there. Try the following:
- Make sure you are running the latest version of the devtools, using "npx overmind-devtools@latest" or install latest extension for VSCode
- Close the current tab and open a new one
- Make sure the correct port is configured in the devtools
`);
};
this.ws.onclose = () => {
this.isConnected = false;
if (this.doReconnect && !this.hasWarnedReconnect) {
console.warn("Debugger application is not running on selected port... will reconnect automatically behind the scenes");
this.hasWarnedReconnect = true;
}
if (this.doReconnect) this.reconnect(host, onMessage);
};
};
this.sendMessage = (payload) => {
if (!this.isConnected) {
this.buffer.push(payload);
return;
}
this.ws.send(`{"appName":"${this.name}","message":${payload}}`);
};
this.flushBuffer = async () => {
this.buffer.forEach((payload) => {
this.sendMessage(payload);
});
this.buffer.length = 0;
};
this.name = typeof location !== "undefined" && location.search.includes("OVERMIND_DEVTOOL") ? name + " (Overmind Devtool)" : name;
}
reconnect(host, onMessage) {
setTimeout(() => this.connect(host, onMessage), this.reconnectInterval);
}
send(message) {
const safeClassNames = this.safeClassNames;
const unsafeClassNames = this.unsafeClassNames;
const circularReferenceCache = this.circularReferenceCache;
this.sendMessage(JSON.stringify(message, function(_, value) {
if (typeof value === "function") return "[Function]";
if (this.__CLASS__) return value;
if (value && value[require_rehydrate.SERIALIZE]) return {
__CLASS__: true,
name: value.constructor.name,
value
};
if (typeof value === "object" && value !== null && !Array.isArray(value) && value.constructor && value.constructor.name !== "Object") {
if (circularReferenceCache.includes(value)) return `[CIRCULAR REFERENCE: ${value.constructor.name}]`;
circularReferenceCache.push(value);
if (!safeClassNames.has(value.constructor.name) && !unsafeClassNames.has(value.constructor.name)) try {
JSON.stringify(value);
safeClassNames.add(value.constructor.name);
} catch {
unsafeClassNames.add(value.constructor.name);
}
if (safeClassNames.has(value.constructor.name)) return {
__CLASS__: true,
name: value.constructor.name,
value
};
else return `[${value.constructor.name || "NOT SERIALIZABLE"}]`;
}
return value;
}));
circularReferenceCache.length = 0;
}
};
//#endregion
exports.Devtools = Devtools;
//# sourceMappingURL=Devtools.js.map