@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/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) => c2.json({ status: "ok", service: "local-router" }));
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
- const stopLogStorageTask = startLogStorageBackgroundTask(config2.log);
58867
- options?.registerCleanup?.(stopLogStorageTask);
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
  }