@things-factory/shell 9.1.0 → 9.1.13

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.
@@ -81,7 +81,13 @@ function setupProcessExitHandlers() {
81
81
  });
82
82
  process.on('SIGINT', () => cleanup(0, 'SIGINT'));
83
83
  process.on('SIGTERM', () => cleanup(0, 'SIGTERM'));
84
- process.on('unhandledRejection', r => cleanup(1, 'unhandledRejection'));
85
- process.on('uncaughtException', e => cleanup(1, 'uncaughtException'));
84
+ process.on('unhandledRejection', r => {
85
+ console.error('Unhandled rejection:', r);
86
+ cleanup(1, 'unhandledRejection');
87
+ });
88
+ process.on('uncaughtException', e => {
89
+ console.error('Uncaught exception:', e);
90
+ cleanup(1, 'uncaughtException');
91
+ });
86
92
  }
87
93
  //# sourceMappingURL=process-cleaner.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"process-cleaner.js","sourceRoot":"","sources":["../server/process-cleaner.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;AA6CH,4DAUC;AArDD,qEAAwE;AACxE,qCAAiC;AAEjC,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB,KAAK,UAAU,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,IAAc;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QACtE,OAAM;IACR,CAAC;IACD,OAAO,GAAG,IAAI,CAAA;IAEd,IAAI,CAAC;QACH,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAA;QAE1D,oCAAoC;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;YAC/C,MAAM,kCAAmB,CAAC,UAAU,EAAE,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;QACvD,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;YACnD,aAAa;YACb,IAAI,eAAM,IAAI,eAAM,CAAC,KAAK,EAAE,CAAC;gBAC3B,aAAa;gBACb,MAAM,eAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC;AAED,SAAgB,wBAAwB;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QACpC,mCAAmC;IACrC,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IAChD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAC,CAAA;IACvE,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAC,CAAA;AACvE,CAAC","sourcesContent":["/**\n * Process Exit Handlers for Things Factory\n *\n * === SIGNAL HANDLER CONFLICTS ISSUE (2025-09-01) ===\n *\n * PROBLEM:\n * - Multiple libraries (Apollo Server, Puppeteer) automatically register SIGINT/SIGTERM handlers\n * - This caused handler conflicts and prevented proper cleanup of headless Chrome processes\n * - Up to 6+ handlers were registered simultaneously, causing interference\n *\n * ROOT CAUSE:\n * - Apollo Server: Automatic graceful shutdown handlers\n * - Puppeteer: Browser cleanup on process exit handlers\n * - Our code: Custom cleanup handlers\n * - Result: Multiple handlers competing to exit process, causing premature termination before cleanup completed\n *\n * SOLUTION:\n * 1. Apollo Server: Added `stopOnTerminationSignals: false` in server.ts & server-dev.ts\n * 2. Puppeteer: Added `handleSIGINT: false, handleSIGTERM: false, handleSIGHUP: false` in browser-factory.ts\n * 3. Unified cleanup: Single handler in this file manages all cleanup (headless pools, pubsub, etc.)\n * 4. Simplified pool cleanup: Direct `drain() -> clear()` without complex fallbacks\n *\n * LESSON LEARNED:\n * - Always check for signal handler conflicts when multiple libraries are involved\n * - Keep cleanup logic simple - complex fallbacks often cause more problems\n * - Document these kinds of integration issues for future reference\n *\n * FILES MODIFIED:\n * - server.ts: stopOnTerminationSignals: false\n * - server-dev.ts: stopOnTerminationSignals: false\n * - browser-factory.ts: handleSIGINT/SIGTERM: false\n * - pool-manager.ts: simplified cleanup logic\n */\n\nimport { HeadlessPoolManager } from './utils/headless-pool/pool-manager'\nimport { pubsub } from './pubsub'\n\nlet exiting = false\n\nasync function cleanup(code = 0, info?: unknown) {\n if (exiting) {\n console.warn('Shutdown already in progress. Received another signal.')\n return\n }\n exiting = true\n\n try {\n if (info) console.error('Cleaning up resources by:', info)\n\n // 1. **Headless Pool 정리 (우선순위 높음)**\n try {\n console.log('🧹 Cleaning up headless pools...')\n await HeadlessPoolManager.cleanupAll()\n console.log('✅ Headless pools cleaned up')\n } catch (error) {\n console.log('❌ Headless pool cleanup failed:', error)\n }\n\n // 2. **PubSub 정리**\n try {\n console.log('🔌 Cleaning up pubsub connections...')\n // @ts-ignore\n if (pubsub && pubsub.close) {\n // @ts-ignore\n await pubsub.close()\n console.log('✅ PubSub cleaned up')\n }\n } catch (error) {\n console.log('❌ PubSub cleanup failed:', error)\n }\n } catch (err) {\n console.log('Cleanup error:', err)\n }\n\n process.exit(code)\n}\n\nexport function setupProcessExitHandlers() {\n process.on('exit', () => {\n console.log('Process is exiting...')\n // exit 이벤트에서는 비동기 작업 불가능 - 동기적 정리만\n })\n\n process.on('SIGINT', () => cleanup(0, 'SIGINT'))\n process.on('SIGTERM', () => cleanup(0, 'SIGTERM'))\n process.on('unhandledRejection', r => cleanup(1, 'unhandledRejection'))\n process.on('uncaughtException', e => cleanup(1, 'uncaughtException'))\n}\n"]}
1
+ {"version":3,"file":"process-cleaner.js","sourceRoot":"","sources":["../server/process-cleaner.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;;AA6CH,4DAgBC;AA3DD,qEAAwE;AACxE,qCAAiC;AAEjC,IAAI,OAAO,GAAG,KAAK,CAAA;AAEnB,KAAK,UAAU,OAAO,CAAC,IAAI,GAAG,CAAC,EAAE,IAAc;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,CAAC,IAAI,CAAC,wDAAwD,CAAC,CAAA;QACtE,OAAM;IACR,CAAC;IACD,OAAO,GAAG,IAAI,CAAA;IAEd,IAAI,CAAC;QACH,IAAI,IAAI;YAAE,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,IAAI,CAAC,CAAA;QAE1D,oCAAoC;QACpC,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAA;YAC/C,MAAM,kCAAmB,CAAC,UAAU,EAAE,CAAA;YACtC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAA;QAC5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAA;QACvD,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,sCAAsC,CAAC,CAAA;YACnD,aAAa;YACb,IAAI,eAAM,IAAI,eAAM,CAAC,KAAK,EAAE,CAAC;gBAC3B,aAAa;gBACb,MAAM,eAAM,CAAC,KAAK,EAAE,CAAA;gBACpB,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAA;YACpC,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,KAAK,CAAC,CAAA;QAChD,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAA;IACpC,CAAC;IAED,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;AACpB,CAAC;AAED,SAAgB,wBAAwB;IACtC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,EAAE;QACtB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;QACpC,mCAAmC;IACrC,CAAC,CAAC,CAAA;IAEF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAA;IAChD,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,CAAA;IAClD,OAAO,CAAC,EAAE,CAAC,oBAAoB,EAAE,CAAC,CAAC,EAAE;QACnC,OAAO,CAAC,KAAK,CAAC,sBAAsB,EAAE,CAAC,CAAC,CAAA;QACxC,OAAO,CAAC,CAAC,EAAE,oBAAoB,CAAC,CAAA;IAClC,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,EAAE,CAAC,mBAAmB,EAAE,CAAC,CAAC,EAAE;QAClC,OAAO,CAAC,KAAK,CAAC,qBAAqB,EAAE,CAAC,CAAC,CAAA;QACvC,OAAO,CAAC,CAAC,EAAE,mBAAmB,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;AACJ,CAAC","sourcesContent":["/**\n * Process Exit Handlers for Things Factory\n *\n * === SIGNAL HANDLER CONFLICTS ISSUE (2025-09-01) ===\n *\n * PROBLEM:\n * - Multiple libraries (Apollo Server, Puppeteer) automatically register SIGINT/SIGTERM handlers\n * - This caused handler conflicts and prevented proper cleanup of headless Chrome processes\n * - Up to 6+ handlers were registered simultaneously, causing interference\n *\n * ROOT CAUSE:\n * - Apollo Server: Automatic graceful shutdown handlers\n * - Puppeteer: Browser cleanup on process exit handlers\n * - Our code: Custom cleanup handlers\n * - Result: Multiple handlers competing to exit process, causing premature termination before cleanup completed\n *\n * SOLUTION:\n * 1. Apollo Server: Added `stopOnTerminationSignals: false` in server.ts & server-dev.ts\n * 2. Puppeteer: Added `handleSIGINT: false, handleSIGTERM: false, handleSIGHUP: false` in browser-factory.ts\n * 3. Unified cleanup: Single handler in this file manages all cleanup (headless pools, pubsub, etc.)\n * 4. Simplified pool cleanup: Direct `drain() -> clear()` without complex fallbacks\n *\n * LESSON LEARNED:\n * - Always check for signal handler conflicts when multiple libraries are involved\n * - Keep cleanup logic simple - complex fallbacks often cause more problems\n * - Document these kinds of integration issues for future reference\n *\n * FILES MODIFIED:\n * - server.ts: stopOnTerminationSignals: false\n * - server-dev.ts: stopOnTerminationSignals: false\n * - browser-factory.ts: handleSIGINT/SIGTERM: false\n * - pool-manager.ts: simplified cleanup logic\n */\n\nimport { HeadlessPoolManager } from './utils/headless-pool/pool-manager'\nimport { pubsub } from './pubsub'\n\nlet exiting = false\n\nasync function cleanup(code = 0, info?: unknown) {\n if (exiting) {\n console.warn('Shutdown already in progress. Received another signal.')\n return\n }\n exiting = true\n\n try {\n if (info) console.error('Cleaning up resources by:', info)\n\n // 1. **Headless Pool 정리 (우선순위 높음)**\n try {\n console.log('🧹 Cleaning up headless pools...')\n await HeadlessPoolManager.cleanupAll()\n console.log('✅ Headless pools cleaned up')\n } catch (error) {\n console.log('❌ Headless pool cleanup failed:', error)\n }\n\n // 2. **PubSub 정리**\n try {\n console.log('🔌 Cleaning up pubsub connections...')\n // @ts-ignore\n if (pubsub && pubsub.close) {\n // @ts-ignore\n await pubsub.close()\n console.log('✅ PubSub cleaned up')\n }\n } catch (error) {\n console.log('❌ PubSub cleanup failed:', error)\n }\n } catch (err) {\n console.log('Cleanup error:', err)\n }\n\n process.exit(code)\n}\n\nexport function setupProcessExitHandlers() {\n process.on('exit', () => {\n console.log('Process is exiting...')\n // exit 이벤트에서는 비동기 작업 불가능 - 동기적 정리만\n })\n\n process.on('SIGINT', () => cleanup(0, 'SIGINT'))\n process.on('SIGTERM', () => cleanup(0, 'SIGTERM'))\n process.on('unhandledRejection', r => {\n console.error('Unhandled rejection:', r)\n cleanup(1, 'unhandledRejection')\n })\n process.on('uncaughtException', e => {\n console.error('Uncaught exception:', e)\n cleanup(1, 'uncaughtException')\n })\n}\n"]}