kingkont 0.20.1 → 0.20.2

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.
Files changed (2) hide show
  1. package/package.json +1 -1
  2. package/server.js +16 -3
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "kingkont",
3
- "version": "0.20.1",
3
+ "version": "0.20.2",
4
4
  "description": "KingKont · Chatium — нод-редактор сцен с AI-генерацией (картинки/видео/голос/SFX/музыка/текст)",
5
5
  "main": "main.js",
6
6
  "bin": {
package/server.js CHANGED
@@ -623,7 +623,13 @@ async function serveStatic(res, url) {
623
623
  // Router
624
624
  // =============================================================================
625
625
 
626
- const server = createServer(async (req, res) => {
626
+ // Главный request-handler. Выделен из createServer чтобы start() мог
627
+ // создавать СВЕЖИЙ server на каждый retry — раньше глобальный server
628
+ // шарился между attempt'ами, и при EADDRINUSE на Windows несколько
629
+ // pending listen() callbacks в итоге фаерились (когда порт освобождался)
630
+ // → wsHub.attach вызывался N раз → multiple WebSocketServer на одном
631
+ // upgrade event → "handleUpgrade called more than once" uncaughtException.
632
+ async function _requestHandler(req, res) {
627
633
  const url = new URL(req.url, `http://${req.headers.host}`);
628
634
  try {
629
635
  if (req.method === 'POST' && url.pathname === '/api/generate') return handleGenerate(req, res);
@@ -686,7 +692,7 @@ const server = createServer(async (req, res) => {
686
692
  console.error('[error]', e);
687
693
  send(res, 500, { error: e.message || 'server error' });
688
694
  }
689
- });
695
+ }
690
696
 
691
697
  process.on('unhandledRejection', (err) => console.error('[unhandledRejection]', err));
692
698
  process.on('uncaughtException', (err) => console.error('[uncaughtException]', err));
@@ -702,9 +708,16 @@ function start(port = PORT, opts = {}) {
702
708
  // jobsHub нужен settingsGetter чтобы поллить провайдеров (Chatium token,
703
709
  // KIE_API_KEY и т.п.).
704
710
  jobsHub.setSettingsGetter(getSettings);
711
+ // ВАЖНО: createServer на каждый retry. Раньше сервер был module-global
712
+ // и шарился, что приводило к multiple wsHub.attach при port-fallback'е
713
+ // (несколько pending listen() callbacks → multiple WebSocketServer на
714
+ // одном upgrade-event → uncaughtException на первом upgrade).
715
+ const server = createServer(_requestHandler);
705
716
  return new Promise((resolveOk, reject) => {
706
- server.once('error', reject);
717
+ const onError = (err) => { server.removeAllListeners('listening'); reject(err); };
718
+ server.once('error', onError);
707
719
  server.listen(port, () => {
720
+ server.removeListener('error', onError);
708
721
  const addr = server.address();
709
722
  // Attach WebSocket hub поверх того же HTTP-сервера (path /ws).
710
723
  try { wsHub.attach(server); } catch (e) { console.warn('WS attach failed:', e.message); }