@lakphy/local-router 0.5.7 → 0.5.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli.js +570 -143
- package/dist/entry.js +76 -6
- package/dist/web/assets/index-B-4HJAZa.js +192 -0
- package/dist/web/index.html +1 -1
- package/package.json +1 -1
- package/dist/web/assets/index-D1WTE7QU.js +0 -192
package/dist/entry.js
CHANGED
|
@@ -50129,6 +50129,32 @@ var upgradeWebSocket = defineWebSocketHelper((c, events) => {
|
|
|
50129
50129
|
return;
|
|
50130
50130
|
});
|
|
50131
50131
|
|
|
50132
|
+
// src/cli/asset-paths.ts
|
|
50133
|
+
async function findExisting(...candidates) {
|
|
50134
|
+
for (const url2 of candidates) {
|
|
50135
|
+
try {
|
|
50136
|
+
const exists = await Bun.file(url2).exists();
|
|
50137
|
+
if (exists)
|
|
50138
|
+
return url2;
|
|
50139
|
+
} catch {}
|
|
50140
|
+
}
|
|
50141
|
+
return null;
|
|
50142
|
+
}
|
|
50143
|
+
async function readPackageJson() {
|
|
50144
|
+
const url2 = await findExisting(new URL("../../package.json", import.meta.url), new URL("../package.json", import.meta.url), new URL("../../../package.json", import.meta.url));
|
|
50145
|
+
if (!url2)
|
|
50146
|
+
return null;
|
|
50147
|
+
try {
|
|
50148
|
+
return await Bun.file(url2).json();
|
|
50149
|
+
} catch {
|
|
50150
|
+
return null;
|
|
50151
|
+
}
|
|
50152
|
+
}
|
|
50153
|
+
async function readVersionString() {
|
|
50154
|
+
const pkg = await readPackageJson();
|
|
50155
|
+
return typeof pkg?.version === "string" ? pkg.version : "unknown";
|
|
50156
|
+
}
|
|
50157
|
+
|
|
50132
50158
|
// src/cli/autostart.ts
|
|
50133
50159
|
import { execSync } from "child_process";
|
|
50134
50160
|
import { existsSync, mkdirSync, readFileSync, rmSync, writeFileSync } from "fs";
|
|
@@ -58061,6 +58087,13 @@ function createServerAddressInfo(listenHost, port) {
|
|
|
58061
58087
|
}
|
|
58062
58088
|
|
|
58063
58089
|
// src/index.ts
|
|
58090
|
+
function readRestartCriticalServerFields(config2) {
|
|
58091
|
+
return {
|
|
58092
|
+
host: config2.server?.host ?? "0.0.0.0",
|
|
58093
|
+
port: config2.server?.port ?? 4099,
|
|
58094
|
+
idleTimeout: config2.server?.idleTimeout ?? 0
|
|
58095
|
+
};
|
|
58096
|
+
}
|
|
58064
58097
|
var ROUTE_REGISTRY = {
|
|
58065
58098
|
"openai-completions": {
|
|
58066
58099
|
mountPrefix: "/openai-completions",
|
|
@@ -58178,7 +58211,7 @@ function createChatProxyModel(providerName, providerConfig, model) {
|
|
|
58178
58211
|
throw new Error(`\u6682\u4E0D\u652F\u6301\u7684 provider \u7C7B\u578B: ${providerConfig.type}`);
|
|
58179
58212
|
}
|
|
58180
58213
|
}
|
|
58181
|
-
function createAdminApiRoutes(store, pluginManager, registerCleanup) {
|
|
58214
|
+
function createAdminApiRoutes(store, pluginManager, registerCleanup, serverControl, restartLogStorageTask, serviceVersion) {
|
|
58182
58215
|
const api2 = new Hono2;
|
|
58183
58216
|
const cryptoSessions = new Map;
|
|
58184
58217
|
const CRYPTO_SESSION_TTL_MS = 2 * 60 * 1000;
|
|
@@ -58218,7 +58251,16 @@ function createAdminApiRoutes(store, pluginManager, registerCleanup) {
|
|
|
58218
58251
|
}
|
|
58219
58252
|
cryptoSessions.clear();
|
|
58220
58253
|
});
|
|
58221
|
-
api2.get("/health", (c2) =>
|
|
58254
|
+
api2.get("/health", (c2) => {
|
|
58255
|
+
const addr = serverControl?.current ?? readRestartCriticalServerFields(store.get());
|
|
58256
|
+
return c2.json({
|
|
58257
|
+
status: "ok",
|
|
58258
|
+
service: "local-router",
|
|
58259
|
+
version: serviceVersion ?? "unknown",
|
|
58260
|
+
host: addr.host,
|
|
58261
|
+
port: addr.port
|
|
58262
|
+
});
|
|
58263
|
+
});
|
|
58222
58264
|
api2.post("/crypto/handshake", async (c2) => {
|
|
58223
58265
|
pruneExpiredCryptoSessions();
|
|
58224
58266
|
if (cryptoSessions.size >= CRYPTO_SESSION_MAX) {
|
|
@@ -58291,18 +58333,30 @@ function createAdminApiRoutes(store, pluginManager, registerCleanup) {
|
|
|
58291
58333
|
});
|
|
58292
58334
|
api2.post("/config/apply", async (_c) => {
|
|
58293
58335
|
try {
|
|
58336
|
+
const fallbackBefore = readRestartCriticalServerFields(store.get());
|
|
58337
|
+
const before = serverControl?.current ?? fallbackBefore;
|
|
58294
58338
|
const config2 = store.reload();
|
|
58339
|
+
const after = readRestartCriticalServerFields(config2);
|
|
58295
58340
|
if (config2.log) {
|
|
58296
58341
|
const logBaseDir = resolveLogBaseDir(config2.log);
|
|
58297
58342
|
initLogger(logBaseDir, config2.log);
|
|
58343
|
+
} else {
|
|
58344
|
+
resetLogger();
|
|
58298
58345
|
}
|
|
58346
|
+
restartLogStorageTask?.(config2.log);
|
|
58299
58347
|
const pluginResult = await pluginManager.reloadAll(config2.providers);
|
|
58348
|
+
const restartRequired = before.host !== after.host || before.port !== after.port || before.idleTimeout !== after.idleTimeout;
|
|
58300
58349
|
return _c.json({
|
|
58301
58350
|
ok: true,
|
|
58302
58351
|
summary: {
|
|
58303
58352
|
providers: Object.keys(config2.providers).length,
|
|
58304
58353
|
routes: Object.keys(config2.routes).length
|
|
58305
58354
|
},
|
|
58355
|
+
restartRequired,
|
|
58356
|
+
...restartRequired && {
|
|
58357
|
+
listen: { host: after.host, port: after.port },
|
|
58358
|
+
canRestart: Boolean(serverControl)
|
|
58359
|
+
},
|
|
58306
58360
|
...pluginResult.failures.length > 0 && {
|
|
58307
58361
|
pluginWarnings: pluginResult.failures
|
|
58308
58362
|
}
|
|
@@ -58311,6 +58365,14 @@ function createAdminApiRoutes(store, pluginManager, registerCleanup) {
|
|
|
58311
58365
|
return _c.json({ error: `\u5E94\u7528\u914D\u7F6E\u5931\u8D25: ${err instanceof Error ? err.message : err}` }, 500);
|
|
58312
58366
|
}
|
|
58313
58367
|
});
|
|
58368
|
+
api2.post("/restart", (c2) => {
|
|
58369
|
+
if (!serverControl) {
|
|
58370
|
+
return c2.json({ error: "\u5F53\u524D\u8FD0\u884C\u65B9\u5F0F\u4E0D\u652F\u6301\u81EA\u52A8\u91CD\u542F\uFF0C\u8BF7\u624B\u52A8\u6267\u884C local-router restart" }, 501);
|
|
58371
|
+
}
|
|
58372
|
+
const { host, port } = readRestartCriticalServerFields(store.get());
|
|
58373
|
+
serverControl.requestRestart();
|
|
58374
|
+
return c2.json({ ok: true, listen: { host, port } });
|
|
58375
|
+
});
|
|
58314
58376
|
api2.get("/config/meta", (c2) => {
|
|
58315
58377
|
return c2.json({
|
|
58316
58378
|
configPath: store.getPath(),
|
|
@@ -58856,6 +58918,7 @@ async function proxyAdminToDevServer(c2, origin) {
|
|
|
58856
58918
|
}
|
|
58857
58919
|
async function createApp(store, options) {
|
|
58858
58920
|
const config2 = store.get();
|
|
58921
|
+
const serviceVersion = await readVersionString();
|
|
58859
58922
|
console.log(`\u5DF2\u52A0\u8F7D\u914D\u7F6E: ${store.getPath()}`);
|
|
58860
58923
|
if (config2.log) {
|
|
58861
58924
|
const logBaseDir = resolveLogBaseDir(config2.log);
|
|
@@ -58863,8 +58926,14 @@ async function createApp(store, options) {
|
|
|
58863
58926
|
} else {
|
|
58864
58927
|
resetLogger();
|
|
58865
58928
|
}
|
|
58866
|
-
|
|
58867
|
-
|
|
58929
|
+
let stopLogStorageTask = startLogStorageBackgroundTask(config2.log);
|
|
58930
|
+
const restartLogStorageTask = (logConfig) => {
|
|
58931
|
+
try {
|
|
58932
|
+
stopLogStorageTask();
|
|
58933
|
+
} catch {}
|
|
58934
|
+
stopLogStorageTask = startLogStorageBackgroundTask(logConfig);
|
|
58935
|
+
};
|
|
58936
|
+
options?.registerCleanup?.(() => stopLogStorageTask());
|
|
58868
58937
|
const configDir = dirname3(resolve8(store.getPath()));
|
|
58869
58938
|
const pluginManager = new PluginManager(configDir);
|
|
58870
58939
|
const reloadResult = await pluginManager.reloadAll(config2.providers);
|
|
@@ -58883,7 +58952,7 @@ async function createApp(store, options) {
|
|
|
58883
58952
|
app.route(entry.mountPrefix, subApp);
|
|
58884
58953
|
console.log(`\u5DF2\u6CE8\u518C\u8DEF\u7531: ${routeType} -> ${entry.mountPrefix}`);
|
|
58885
58954
|
}
|
|
58886
|
-
app.route("/api", createAdminApiRoutes(store, pluginManager, options?.registerCleanup));
|
|
58955
|
+
app.route("/api", createAdminApiRoutes(store, pluginManager, options?.registerCleanup, options?.serverControl, restartLogStorageTask, serviceVersion));
|
|
58887
58956
|
console.log("\u5DF2\u6CE8\u518C\u7BA1\u7406 API: /api");
|
|
58888
58957
|
app.get("/api/docs", middleware({ url: "/api/openapi.json" }));
|
|
58889
58958
|
app.get("/api/openapi.json", (c2) => c2.json(openAPISpec));
|
|
@@ -58912,11 +58981,12 @@ async function createApp(store, options) {
|
|
|
58912
58981
|
}
|
|
58913
58982
|
return app;
|
|
58914
58983
|
}
|
|
58915
|
-
async function createAppRuntimeFromConfigPath(configPath, listen) {
|
|
58984
|
+
async function createAppRuntimeFromConfigPath(configPath, listen, serverControl) {
|
|
58916
58985
|
const store = new ConfigStore(configPath);
|
|
58917
58986
|
const cleanups = [];
|
|
58918
58987
|
const app = await createApp(store, {
|
|
58919
58988
|
listen,
|
|
58989
|
+
serverControl,
|
|
58920
58990
|
registerCleanup: (cleanup) => {
|
|
58921
58991
|
cleanups.push(cleanup);
|
|
58922
58992
|
}
|