Spaces:
Paused
Paused
| ; | |
| var __create = Object.create; | |
| var __defProp = Object.defineProperty; | |
| var __getOwnPropDesc = Object.getOwnPropertyDescriptor; | |
| var __getOwnPropNames = Object.getOwnPropertyNames; | |
| var __getProtoOf = Object.getPrototypeOf; | |
| var __hasOwnProp = Object.prototype.hasOwnProperty; | |
| var __export = (target, all) => { | |
| for (var name in all) | |
| __defProp(target, name, { get: all[name], enumerable: true }); | |
| }; | |
| var __copyProps = (to, from, except, desc) => { | |
| if (from && typeof from === "object" || typeof from === "function") { | |
| for (let key of __getOwnPropNames(from)) | |
| if (!__hasOwnProp.call(to, key) && key !== except) | |
| __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable }); | |
| } | |
| return to; | |
| }; | |
| var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps( | |
| // If the importer is in node compatibility mode or this is not an ESM | |
| // file that has been converted to a CommonJS file using a Babel- | |
| // compatible transform (i.e. "__esModule" has not been set), then set | |
| // "default" to the CommonJS "module.exports" for node compatibility. | |
| isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target, | |
| mod | |
| )); | |
| var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod); | |
| var local_exports = {}; | |
| __export(local_exports, { | |
| LocalClassifier: () => LocalClassifier, | |
| PM: () => PM | |
| }); | |
| module.exports = __toCommonJS(local_exports); | |
| var child_process = __toESM(require("child_process")); | |
| var import_lib = require("../../lib"); | |
| var import_config_loader = require("../config-loader"); | |
| var import_dex_data = require("../../sim/dex-data"); | |
| class ArtemisStream extends import_lib.Streams.ObjectReadWriteStream { | |
| constructor() { | |
| super(); | |
| this.tasks = /* @__PURE__ */ new Set(); | |
| this.process = child_process.spawn("python3", [ | |
| "-u", | |
| (0, import_lib.FS)("server/artemis/model.py").path, | |
| import_config_loader.Config.debugartemisprocesses ? "debug" : "" | |
| ].filter(Boolean)); | |
| this.listen(); | |
| } | |
| listen() { | |
| this.process.stdout.setEncoding("utf8"); | |
| this.process.stderr.setEncoding("utf8"); | |
| this.process.stdout.on("data", (data) => { | |
| data = data.trim(); | |
| const [taskId, dataStr] = data.split("|"); | |
| if (this.tasks.has(taskId)) { | |
| this.tasks.delete(taskId); | |
| return this.push(`${taskId} | |
| ${dataStr}`); | |
| } | |
| if (taskId === "error") { | |
| const info = JSON.parse(dataStr); | |
| Monitor.crashlog(new Error(info.error), "An Artemis script", info); | |
| try { | |
| this.pushEnd(); | |
| this.process.disconnect(); | |
| } catch { | |
| } | |
| } | |
| }); | |
| this.process.stderr.on("data", (data) => { | |
| if (/Downloading: ([0-9]+)%/i.test(data)) { | |
| return; | |
| } | |
| Monitor.crashlog(new Error(data), "An Artemis process"); | |
| }); | |
| this.process.on("error", (err) => { | |
| Monitor.crashlog(err, "An Artemis process"); | |
| this.pushEnd(); | |
| }); | |
| this.process.on("close", () => { | |
| this.pushEnd(); | |
| }); | |
| } | |
| _write(chunk) { | |
| const [taskId, message] = import_lib.Utils.splitFirst(chunk, "\n"); | |
| this.tasks.add(taskId); | |
| this.process.stdin.write(`${taskId}|${message} | |
| `); | |
| } | |
| destroy() { | |
| try { | |
| this.process.kill(); | |
| } catch { | |
| } | |
| this.pushEnd(); | |
| } | |
| } | |
| const PM = new import_lib.ProcessManager.StreamProcessManager(module, () => new ArtemisStream(), (message) => { | |
| if (message.startsWith("SLOW\n")) { | |
| Monitor.slow(message.slice(5)); | |
| } | |
| }); | |
| const _LocalClassifier = class { | |
| constructor() { | |
| this.enabled = false; | |
| this.requests = /* @__PURE__ */ new Map(); | |
| this.lastTask = 0; | |
| this.readyPromise = null; | |
| _LocalClassifier.classifiers.push(this); | |
| void this.setupProcesses(); | |
| } | |
| static destroy() { | |
| for (const classifier of this.classifiers) | |
| void classifier.destroy(); | |
| return this.PM.destroy(); | |
| } | |
| async setupProcesses() { | |
| this.readyPromise = new Promise((resolve) => { | |
| child_process.exec('python3 -c "import detoxify"', (err, out, stderr) => { | |
| if (err || stderr) { | |
| resolve(false); | |
| } else { | |
| resolve(true); | |
| } | |
| }); | |
| }); | |
| const res = await this.readyPromise; | |
| this.enabled = res; | |
| this.readyPromise = null; | |
| if (res) { | |
| this.stream = PM.createStream(); | |
| void this.listen(); | |
| } | |
| } | |
| async listen() { | |
| if (!this.stream) | |
| return null; | |
| for await (const chunk of this.stream) { | |
| const [rawTaskId, data] = import_lib.Utils.splitFirst(chunk, "\n"); | |
| const task = parseInt(rawTaskId); | |
| const resolver = this.requests.get(task); | |
| if (resolver) { | |
| resolver(JSON.parse(data)); | |
| this.requests.delete(task); | |
| } | |
| } | |
| } | |
| destroy() { | |
| _LocalClassifier.classifiers.splice(_LocalClassifier.classifiers.indexOf(this), 1); | |
| return this.stream?.destroy(); | |
| } | |
| async classify(text) { | |
| if (this.readyPromise) | |
| await this.readyPromise; | |
| if (!this.stream) | |
| return null; | |
| const taskId = this.lastTask++; | |
| const data = await new Promise((resolve) => { | |
| this.requests.set(taskId, resolve); | |
| void this.stream?.write(`${taskId} | |
| ${text}`); | |
| }); | |
| for (const k in data) { | |
| data[k] = parseFloat(data[k]); | |
| } | |
| return data; | |
| } | |
| }; | |
| let LocalClassifier = _LocalClassifier; | |
| LocalClassifier.PM = PM; | |
| LocalClassifier.ATTRIBUTES = { | |
| sexual_explicit: {}, | |
| severe_toxicity: {}, | |
| toxicity: {}, | |
| obscene: {}, | |
| identity_attack: {}, | |
| insult: {}, | |
| threat: {} | |
| }; | |
| LocalClassifier.classifiers = []; | |
| if (require.main === module) { | |
| global.Config = import_config_loader.Config; | |
| global.Monitor = { | |
| crashlog(error, source = "A local Artemis child process", details = null) { | |
| const repr = JSON.stringify([error.name, error.message, source, details]); | |
| process.send(`THROW | |
| @!!@${repr} | |
| ${error.stack}`); | |
| }, | |
| slow(text) { | |
| process.send(`CALLBACK | |
| SLOW | |
| ${text}`); | |
| } | |
| }; | |
| global.toID = import_dex_data.toID; | |
| process.on("uncaughtException", (err) => { | |
| if (import_config_loader.Config.crashguard) { | |
| Monitor.crashlog(err, "A local Artemis child process"); | |
| } | |
| }); | |
| import_lib.Repl.start(`abusemonitor-local-${process.pid}`, (cmd) => eval(cmd)); | |
| } else if (!process.send) { | |
| PM.spawn(import_config_loader.Config.localartemisprocesses || 1); | |
| } | |
| //# sourceMappingURL=local.js.map | |