@things-factory/integration-base 8.0.0-beta.2 → 8.0.0-beta.5
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.
@@ -39,22 +39,6 @@ function createHeadlessPool(options) {
|
|
39
39
|
}
|
40
40
|
}, options);
|
41
41
|
}
|
42
|
-
async function destroyHeadlessPool() {
|
43
|
-
if (headlessPool) {
|
44
|
-
console.log('headless-pool-integration about to destroy');
|
45
|
-
try {
|
46
|
-
await Promise.race([
|
47
|
-
headlessPool.drain().then(() => headlessPool.clear()), // 정리 작업
|
48
|
-
new Promise((_, reject) => setTimeout(() => reject(new Error('Destroy timeout')), 5000) // 5초 타임아웃 설정
|
49
|
-
)
|
50
|
-
]);
|
51
|
-
console.log('Headless pool destroyed');
|
52
|
-
}
|
53
|
-
catch (err) {
|
54
|
-
env_1.logger.error('Failed to destroy headless pool:', err);
|
55
|
-
}
|
56
|
-
}
|
57
|
-
}
|
58
42
|
const CHROMIUM_PATH = env_1.config.get('CHROMIUM_PATH');
|
59
43
|
async function initializeChromium() {
|
60
44
|
try {
|
@@ -75,47 +59,4 @@ async function initializeChromium() {
|
|
75
59
|
env_1.logger.error(err);
|
76
60
|
}
|
77
61
|
}
|
78
|
-
// Graceful shutdown logic
|
79
|
-
function setupProcessExitHandlers() {
|
80
|
-
let isCleaningUp = false; // 중복 정리를 방지
|
81
|
-
const cleanup = async () => {
|
82
|
-
if (isCleaningUp)
|
83
|
-
return; // 이미 정리 중이면 무시
|
84
|
-
isCleaningUp = true;
|
85
|
-
console.log('Application is shutting down. Cleaning up resources...');
|
86
|
-
try {
|
87
|
-
// Pool 정리 작업 실행
|
88
|
-
await destroyHeadlessPool();
|
89
|
-
}
|
90
|
-
catch (err) {
|
91
|
-
env_1.logger.error('Error during cleanup:', err);
|
92
|
-
}
|
93
|
-
finally {
|
94
|
-
console.log('Cleanup completed.');
|
95
|
-
}
|
96
|
-
};
|
97
|
-
const onExit = async (signal) => {
|
98
|
-
console.log(`Received signal: ${signal || 'unknown'}`);
|
99
|
-
await cleanup();
|
100
|
-
// 다른 핸들러가 실행될 수 있도록 exit 호출을 지연
|
101
|
-
process.nextTick(() => process.exit(0)); // Tick 뒤에 종료
|
102
|
-
};
|
103
|
-
// Handle termination signals
|
104
|
-
process.once('SIGINT', () => onExit('SIGINT')); // Ctrl+C
|
105
|
-
process.once('SIGTERM', () => onExit('SIGTERM')); // Termination signal
|
106
|
-
// Handle uncaught exceptions
|
107
|
-
process.once('uncaughtException', async (err) => {
|
108
|
-
env_1.logger.error('Uncaught Exception:', err);
|
109
|
-
await cleanup();
|
110
|
-
process.nextTick(() => process.exit(1)); // Tick 뒤에 종료
|
111
|
-
});
|
112
|
-
// Handle unhandled promise rejections
|
113
|
-
process.once('unhandledRejection', async (reason) => {
|
114
|
-
env_1.logger.error('Unhandled Rejection:', reason);
|
115
|
-
await cleanup();
|
116
|
-
process.nextTick(() => process.exit(1)); // Tick 뒤에 종료
|
117
|
-
});
|
118
|
-
}
|
119
|
-
// Initialize process exit handlers
|
120
|
-
setupProcessExitHandlers();
|
121
62
|
//# sourceMappingURL=headless-pool.js.map
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"headless-pool.js","sourceRoot":"","sources":["../../../server/engine/resource-pool/headless-pool.ts"],"names":[],"mappings":";;AAWA,0CAMC;;AAjBD,kEAA2C;AAC3C,6CAAoD;AAEpD,IAAI,CAAC;IACH,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IACzG,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA4B;IACtD,OAAO,WAAW,CAAC,UAAU,CAC3B;QACE,MAAM;YACJ,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;YAC7E,OAAO,kBAAkB,EAAE,CAAA;QAC7B,CAAC;QACD,QAAQ,CAAC,OAAO;YACd,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO;oBACL,YAAY;qBACX,OAAO,EAAE;qBACT,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;qBAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;aACtB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,CAAC,OAAO;YACb,YAAY;YACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;KAC0B,EAC7B,OAAO,CACR,CAAA;AACH,CAAC;AAED,
|
1
|
+
{"version":3,"file":"headless-pool.js","sourceRoot":"","sources":["../../../server/engine/resource-pool/headless-pool.ts"],"names":[],"mappings":";;AAWA,0CAMC;;AAjBD,kEAA2C;AAC3C,6CAAoD;AAEpD,IAAI,CAAC;IACH,IAAI,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;AACtC,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;AACnB,CAAC;AAED,IAAI,YAAY,CAAA;AAEhB,SAAgB,eAAe;IAC7B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,kBAAkB,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,oBAAoB,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAA;IACzG,CAAC;IAED,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,SAAS,kBAAkB,CAAC,OAA4B;IACtD,OAAO,WAAW,CAAC,UAAU,CAC3B;QACE,MAAM;YACJ,OAAO,CAAC,GAAG,CAAC,gEAAgE,CAAC,CAAA;YAC7E,OAAO,kBAAkB,EAAE,CAAA;QAC7B,CAAC;QACD,QAAQ,CAAC,OAAO;YACd,OAAO,OAAO,CAAC,IAAI,CAAC;gBAClB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC;gBACtD,OAAO;oBACL,YAAY;qBACX,OAAO,EAAE;qBACT,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC;qBAChB,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC;aACtB,CAAC,CAAA;QACJ,CAAC;QACD,OAAO,CAAC,OAAO;YACb,YAAY;YACZ,OAAO,OAAO,CAAC,KAAK,EAAE,CAAA;QACxB,CAAC;KAC0B,EAC7B,OAAO,CACR,CAAA;AACH,CAAC;AAED,MAAM,aAAa,GAAG,YAAM,CAAC,GAAG,CAAC,eAAe,CAAC,CAAA;AAEjD,KAAK,UAAU,kBAAkB;IAC/B,IAAI,CAAC;QACH,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,OAAM;QACR,CAAC;QAED,MAAM,aAAa,GAAG;YACpB,IAAI,EAAE,CAAC,mBAAmB,EAAE,cAAc,EAAE,cAAc,EAAE,cAAc,CAAC;YAC3E,QAAQ,EAAE,OAAO;SAClB,CAAA;QAED,IAAI,aAAa,EAAE,CAAC;YAClB,aAAa,CAAC,gBAAgB,CAAC,GAAG,aAAa,CAAA;QACjD,CAAC;QAED,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAA;QAErD,OAAO,OAAO,CAAA;IAChB,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,YAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IACnB,CAAC;AACH,CAAC","sourcesContent":["import * as genericPool from 'generic-pool'\nimport { config, logger } from '@things-factory/env'\n\ntry {\n var puppeteer = require('puppeteer')\n} catch (err) {\n logger.error(err)\n}\n\nlet headlessPool\n\nexport function getHeadlessPool() {\n if (!headlessPool) {\n headlessPool = createHeadlessPool({ min: 2, max: 20, acquireTimeoutMillis: 15000, testOnBorrow: true })\n }\n\n return headlessPool\n}\n\nfunction createHeadlessPool(options: genericPool.Options) {\n return genericPool.createPool(\n {\n create() {\n console.log('headless instance in headless-pool-integration about to create')\n return initializeChromium()\n },\n validate(browser) {\n return Promise.race([\n new Promise(res => setTimeout(() => res(false), 1500)),\n browser\n //@ts-ignore\n .version()\n .then(() => true)\n .catch(() => false)\n ])\n },\n destroy(browser) {\n //@ts-ignore\n return browser.close()\n }\n } as genericPool.Factory<any>,\n options\n )\n}\n\nconst CHROMIUM_PATH = config.get('CHROMIUM_PATH')\n\nasync function initializeChromium() {\n try {\n if (!puppeteer) {\n return\n }\n\n const launchSetting = {\n args: ['--hide-scrollbars', '--mute-audio', '--no-sandbox', '--use-gl=egl'],\n headless: 'shell'\n }\n\n if (CHROMIUM_PATH) {\n launchSetting['executablePath'] = CHROMIUM_PATH\n }\n\n const browser = await puppeteer.launch(launchSetting)\n\n return browser\n } catch (err) {\n logger.error(err)\n }\n}\n"]}
|