UNPKG

one

Version:

One is a new React Framework that makes Vite serve both native and web.

353 lines 10 kB
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 ipc_exports = {}; __export(ipc_exports, { cleanupSocket: () => cleanupSocket, clearDaemonRoute: () => clearDaemonRoute, createIPCServer: () => createIPCServer, ensureSocketDir: () => ensureSocketDir, getDaemonStatus: () => getDaemonStatus, getLastActiveDaemonServer: () => getLastActiveDaemonServer, getServersFilePath: () => getServersFilePath, getSocketPath: () => getSocketPath, isDaemonRunning: () => isDaemonRunning, readServerFiles: () => readServerFiles, registerWithDaemon: () => registerWithDaemon, removeServerFile: () => removeServerFile, sendIPCMessage: () => sendIPCMessage, setDaemonRoute: () => setDaemonRoute, touchDaemonServer: () => touchDaemonServer, unregisterFromDaemon: () => unregisterFromDaemon, writeServerFile: () => writeServerFile }); module.exports = __toCommonJS(ipc_exports); var net = __toESM(require("node:net"), 1); var fs = __toESM(require("node:fs"), 1); var path = __toESM(require("node:path"), 1); var os = __toESM(require("node:os"), 1); var import_registry = require("./registry.cjs"); const SOCKET_DIR = path.join(os.homedir(), ".one"); const SOCKET_PATH = path.join(SOCKET_DIR, "daemon.sock"); const SERVERS_FILE = path.join(SOCKET_DIR, "servers.json"); function getSocketPath() { return SOCKET_PATH; } function getServersFilePath() { return SERVERS_FILE; } function ensureSocketDir() { if (!fs.existsSync(SOCKET_DIR)) { fs.mkdirSync(SOCKET_DIR, { recursive: true }); } } function writeServerFile(server) { ensureSocketDir(); const servers = readServerFiles(); const filtered = servers.filter(s => s.root !== server.root); filtered.push(server); fs.writeFileSync(SERVERS_FILE, JSON.stringify(filtered, null, 2)); } function removeServerFile(root) { const servers = readServerFiles(); const filtered = servers.filter(s => s.root !== root); fs.writeFileSync(SERVERS_FILE, JSON.stringify(filtered, null, 2)); } function readServerFiles() { try { if (fs.existsSync(SERVERS_FILE)) { return JSON.parse(fs.readFileSync(SERVERS_FILE, "utf-8")); } } catch {} return []; } function cleanupSocket() { try { if (fs.existsSync(SOCKET_PATH)) { fs.unlinkSync(SOCKET_PATH); } } catch {} } function createIPCServer(state, onServerRegistered, onServerUnregistered) { ensureSocketDir(); cleanupSocket(); const server = net.createServer(socket => { let buffer = ""; socket.on("data", data => { buffer += data.toString(); const lines = buffer.split("\n"); buffer = lines.pop() || ""; for (const line of lines) { if (!line.trim()) continue; try { const message = JSON.parse(line); const response = handleMessage(state, message, onServerRegistered, onServerUnregistered); socket.write(JSON.stringify(response) + "\n"); } catch (err) { const errResponse = { type: "error", message: err instanceof Error ? err.message : "Unknown error" }; socket.write(JSON.stringify(errResponse) + "\n"); } } }); socket.on("error", err => { console.error("[daemon] IPC socket error:", err.message); }); }); server.listen(SOCKET_PATH, () => { fs.chmodSync(SOCKET_PATH, 384); }); return server; } function handleMessage(state, message, onServerRegistered, onServerUnregistered) { switch (message.type) { case "register": { const registration = (0, import_registry.registerServer)(state, { port: message.port, bundleId: message.bundleId, root: message.root }); onServerRegistered?.(registration.id); return { type: "registered", id: registration.id }; } case "unregister": { (0, import_registry.unregisterServer)(state, message.id); onServerUnregistered?.(message.id); return { type: "unregistered" }; } case "route": { const server = (0, import_registry.findServerById)(state, message.serverId); if (!server) { return { type: "error", message: `Server not found: ${message.serverId}` }; } (0, import_registry.setRoute)(state, message.bundleId, message.serverId); return { type: "routed" }; } case "route-clear": { (0, import_registry.clearRoute)(state, message.bundleId); return { type: "routed" }; } case "status": { return { type: "status", servers: (0, import_registry.getAllServers)(state), routes: (0, import_registry.getAllRoutes)(state) }; } case "ping": { return { type: "pong" }; } case "touch": { const touched = (0, import_registry.touchServer)(state, message.id); if (!touched) { return { type: "error", message: `Server not found: ${message.id}` }; } return { type: "touched" }; } case "get-last-active": { const server = (0, import_registry.getLastActiveServer)(state); return { type: "last-active", server }; } default: { return { type: "error", message: `Unknown message type` }; } } } async function isDaemonRunning() { return new Promise(resolve => { if (!fs.existsSync(SOCKET_PATH)) { resolve(false); return; } const client = net.connect(SOCKET_PATH); const timeout = setTimeout(() => { client.destroy(); resolve(false); }, 1e3); client.on("connect", () => { clearTimeout(timeout); client.write(JSON.stringify({ type: "ping" }) + "\n"); }); client.on("data", data => { clearTimeout(timeout); try { const response = JSON.parse(data.toString().trim()); resolve(response.type === "pong"); } catch { resolve(false); } client.destroy(); }); client.on("error", () => { clearTimeout(timeout); resolve(false); }); }); } async function sendIPCMessage(message) { return new Promise((resolve, reject) => { const client = net.connect(SOCKET_PATH); let buffer = ""; const timeout = setTimeout(() => { client.destroy(); reject(new Error("IPC timeout")); }, 5e3); client.on("connect", () => { client.write(JSON.stringify(message) + "\n"); }); client.on("data", data => { buffer += data.toString(); const lines = buffer.split("\n"); buffer = lines.pop() || ""; for (const line of lines) { if (!line.trim()) continue; try { clearTimeout(timeout); const response = JSON.parse(line); client.destroy(); resolve(response); return; } catch {} } }); client.on("error", err => { clearTimeout(timeout); reject(err); }); }); } async function registerWithDaemon(opts) { const response = await sendIPCMessage({ type: "register", ...opts }); if (response.type === "registered") { return response.id; } if (response.type === "error") { throw new Error(response.message); } throw new Error("Unexpected response from daemon"); } async function unregisterFromDaemon(id) { await sendIPCMessage({ type: "unregister", id }); } async function getDaemonStatus() { const response = await sendIPCMessage({ type: "status" }); if (response.type === "status") { return { servers: response.servers, routes: response.routes }; } throw new Error("Failed to get daemon status"); } async function setDaemonRoute(bundleId, serverId) { const response = await sendIPCMessage({ type: "route", bundleId, serverId }); if (response.type === "error") { throw new Error(response.message); } } async function clearDaemonRoute(bundleId) { await sendIPCMessage({ type: "route-clear", bundleId }); } async function touchDaemonServer(id) { const response = await sendIPCMessage({ type: "touch", id }); if (response.type === "error") { throw new Error(response.message); } } async function getLastActiveDaemonServer() { const response = await sendIPCMessage({ type: "get-last-active" }); if (response.type === "last-active") { return response.server; } throw new Error("Failed to get last active server"); }