mirror of
https://github.com/ksyasuda/SubMiner.git
synced 2026-02-27 18:22:41 -08:00
Standardize core service module and export names to reduce naming ambiguity and make imports predictable across runtime, tests, scripts, and docs.
86 lines
2.1 KiB
TypeScript
86 lines
2.1 KiB
TypeScript
import * as fs from "fs";
|
|
import * as http from "http";
|
|
import * as path from "path";
|
|
import { createLogger } from "../../logger";
|
|
|
|
const logger = createLogger("main:texthooker");
|
|
|
|
export class Texthooker {
|
|
private server: http.Server | null = null;
|
|
|
|
public isRunning(): boolean {
|
|
return this.server !== null;
|
|
}
|
|
|
|
public start(port: number): http.Server | null {
|
|
const texthookerPath = this.getTexthookerPath();
|
|
if (!texthookerPath) {
|
|
logger.error("texthooker-ui not found");
|
|
return null;
|
|
}
|
|
|
|
this.server = http.createServer((req, res) => {
|
|
const urlPath = (req.url || "/").split("?")[0];
|
|
const filePath = path.join(
|
|
texthookerPath,
|
|
urlPath === "/" ? "index.html" : urlPath,
|
|
);
|
|
|
|
const ext = path.extname(filePath);
|
|
const mimeTypes: Record<string, string> = {
|
|
".html": "text/html",
|
|
".js": "application/javascript",
|
|
".css": "text/css",
|
|
".json": "application/json",
|
|
".png": "image/png",
|
|
".svg": "image/svg+xml",
|
|
".ttf": "font/ttf",
|
|
".woff": "font/woff",
|
|
".woff2": "font/woff2",
|
|
};
|
|
|
|
fs.readFile(filePath, (err, data) => {
|
|
if (err) {
|
|
res.writeHead(404);
|
|
res.end("Not found");
|
|
return;
|
|
}
|
|
res.writeHead(200, { "Content-Type": mimeTypes[ext] || "text/plain" });
|
|
res.end(data);
|
|
});
|
|
});
|
|
|
|
this.server.listen(port, "127.0.0.1", () => {
|
|
logger.info(`Texthooker server running at http://127.0.0.1:${port}`);
|
|
});
|
|
|
|
return this.server;
|
|
}
|
|
|
|
public stop(): void {
|
|
if (this.server) {
|
|
this.server.close();
|
|
this.server = null;
|
|
}
|
|
}
|
|
|
|
private getTexthookerPath(): string | null {
|
|
const searchPaths = [
|
|
path.join(__dirname, "..", "..", "..", "vendor", "texthooker-ui", "docs"),
|
|
path.join(
|
|
process.resourcesPath,
|
|
"app",
|
|
"vendor",
|
|
"texthooker-ui",
|
|
"docs",
|
|
),
|
|
];
|
|
for (const candidate of searchPaths) {
|
|
if (fs.existsSync(path.join(candidate, "index.html"))) {
|
|
return candidate;
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|