@spinajs/templates-pdf 2.0.384 → 2.0.386
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/lib/cjs/index.d.ts +17 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +163 -19
- package/lib/cjs/index.js.map +1 -1
- package/lib/mjs/index.d.ts +17 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +163 -19
- package/lib/mjs/index.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +6 -6
package/lib/cjs/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ interface IPdfRendererOptions {
|
|
|
12
12
|
args: any;
|
|
13
13
|
options: any;
|
|
14
14
|
renderDurationWarning: number;
|
|
15
|
+
renderTimeout?: number;
|
|
15
16
|
}
|
|
16
17
|
export declare class PdfRenderer extends TemplateRenderer implements IInstanceCheck {
|
|
17
18
|
protected pdfOptions: PDFOptions;
|
|
@@ -30,6 +31,22 @@ export declare class PdfRenderer extends TemplateRenderer implements IInstanceCh
|
|
|
30
31
|
render(_templateName: string, _model: unknown, _language?: string): Promise<string>;
|
|
31
32
|
protected compile(_path: string): Promise<void>;
|
|
32
33
|
protected runLocalServer(basePath: string): Promise<http.Server>;
|
|
34
|
+
/**
|
|
35
|
+
* Enhanced browser cleanup with error handling
|
|
36
|
+
*/
|
|
37
|
+
private safeBrowserCleanup;
|
|
38
|
+
/**
|
|
39
|
+
* Force close browser with process termination
|
|
40
|
+
*/
|
|
41
|
+
private forceCloseBrowser;
|
|
42
|
+
/**
|
|
43
|
+
* Enhanced server cleanup with timeout
|
|
44
|
+
*/
|
|
45
|
+
private safeServerCleanup;
|
|
46
|
+
/**
|
|
47
|
+
* Add page event listeners with cleanup function
|
|
48
|
+
*/
|
|
49
|
+
private addPageEventListeners;
|
|
33
50
|
}
|
|
34
51
|
export {};
|
|
35
52
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/cjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAwB,MAAM,WAAW,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAA4C,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,wBAAwB,CAAC;AAIhC,UAAU,mBAAmB;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,qBAAqB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAwB,MAAM,WAAW,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAA4C,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,wBAAwB,CAAC;AAIhC,UAAU,mBAAmB;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAEa,WAAY,SAAQ,gBAAiB,YAAW,cAAc;IAuB7D,SAAS,CAAC,UAAU,EAAE,UAAU;IAtB5C;;OAEG;IAEH,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAGvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,iBAAiB,EAAE,SAAS,CAAC;IAEvC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IAE3C,IAAW,IAAI,WAEd;IAED,IAAW,SAAS,WAEnB;gBAEqB,UAAU,EAAE,UAAU;IAI5C,iBAAiB,CAAC,eAAe,EAAE,GAAG,GAAG,OAAO;IAInC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+F9F,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAKhF,OAAO,CAAC,KAAK,EAAE,MAAM;cAErB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IA2CtE;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;YACW,iBAAiB;IAY/B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA0B9B"}
|
package/lib/cjs/index.js
CHANGED
|
@@ -60,17 +60,47 @@ let PdfRenderer = class PdfRenderer extends templates_1.TemplateRenderer {
|
|
|
60
60
|
}, language);
|
|
61
61
|
browser = await puppeteer_1.default.launch(this.Options.args);
|
|
62
62
|
const page = await browser.newPage();
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
.
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
63
|
+
// Set up render timeout
|
|
64
|
+
let renderTimeout;
|
|
65
|
+
const timeoutMs = this.Options.renderTimeout || 30000;
|
|
66
|
+
renderTimeout = setTimeout(async () => {
|
|
67
|
+
this.Log.warn(`PDF render timeout (${timeoutMs}ms) - forcing cleanup`);
|
|
68
|
+
try {
|
|
69
|
+
if (page)
|
|
70
|
+
await page.close().catch(() => { });
|
|
71
|
+
if (browser)
|
|
72
|
+
await this.forceCloseBrowser(browser);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
this.Log.error('Error during timeout cleanup:', err);
|
|
76
|
+
}
|
|
77
|
+
}, timeoutMs);
|
|
78
|
+
// Add event listeners with explicit cleanup tracking
|
|
79
|
+
const eventCleanup = this.addPageEventListeners(page);
|
|
80
|
+
try {
|
|
81
|
+
await page.setBypassCSP(true);
|
|
82
|
+
await page.setContent(compiledTemplate);
|
|
83
|
+
await page.pdf({
|
|
84
|
+
path: filePath,
|
|
85
|
+
...this.pdfOptions,
|
|
86
|
+
});
|
|
87
|
+
// Clear timeout on successful completion
|
|
88
|
+
if (renderTimeout) {
|
|
89
|
+
clearTimeout(renderTimeout);
|
|
90
|
+
renderTimeout = undefined;
|
|
91
|
+
}
|
|
92
|
+
// Clean up event listeners
|
|
93
|
+
eventCleanup();
|
|
94
|
+
}
|
|
95
|
+
catch (renderError) {
|
|
96
|
+
// Clear timeout on error
|
|
97
|
+
if (renderTimeout) {
|
|
98
|
+
clearTimeout(renderTimeout);
|
|
99
|
+
renderTimeout = undefined;
|
|
100
|
+
}
|
|
101
|
+
this.Log.error(renderError, `Error during PDF rendering for template ${template}`);
|
|
102
|
+
throw renderError;
|
|
103
|
+
}
|
|
74
104
|
}
|
|
75
105
|
catch (err) {
|
|
76
106
|
this.Log.error(err, `Error rendering pdf template ${template} to file ${filePath}`);
|
|
@@ -83,10 +113,10 @@ let PdfRenderer = class PdfRenderer extends templates_1.TemplateRenderer {
|
|
|
83
113
|
this.Log.warn(`Rendering pdf template ${template} to file ${filePath} took too long.`);
|
|
84
114
|
}
|
|
85
115
|
if (browser) {
|
|
86
|
-
await
|
|
116
|
+
await this.safeBrowserCleanup(browser);
|
|
87
117
|
}
|
|
88
118
|
if (server) {
|
|
89
|
-
await
|
|
119
|
+
await this.safeServerCleanup(server);
|
|
90
120
|
}
|
|
91
121
|
}
|
|
92
122
|
}
|
|
@@ -101,20 +131,134 @@ let PdfRenderer = class PdfRenderer extends templates_1.TemplateRenderer {
|
|
|
101
131
|
app.use((0, cors_1.default)());
|
|
102
132
|
app.use(express_1.default.static(basePath));
|
|
103
133
|
return new Promise((resolve, reject) => {
|
|
104
|
-
app
|
|
105
|
-
// if no port is provided express will choose random port to start (
|
|
106
|
-
//
|
|
107
|
-
.listen(this.Options.static.portRange.length === 0
|
|
108
|
-
|
|
134
|
+
const server = app
|
|
135
|
+
// if no port is provided express will choose random port to start (available)
|
|
136
|
+
// if not, we will get random from range in config
|
|
137
|
+
.listen(this.Options.static.portRange.length === 0
|
|
138
|
+
? 0
|
|
139
|
+
: lodash_1.default.random(this.Options.static.portRange[0], this.Options.static.portRange[1]))
|
|
140
|
+
.on('listening', function () {
|
|
141
|
+
self.Log.trace(`PDF image server started on port ${this.address().port}`);
|
|
109
142
|
self.Log.trace(`PDF static file dir at ${basePath}`);
|
|
110
143
|
resolve(this);
|
|
111
144
|
})
|
|
112
145
|
.on('error', (err) => {
|
|
113
146
|
self.Log.error(err, `PDF image server cannot start`);
|
|
114
|
-
|
|
147
|
+
// Clean up the failed server
|
|
148
|
+
if (server) {
|
|
149
|
+
server.close(() => {
|
|
150
|
+
reject(err);
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
else {
|
|
154
|
+
reject(err);
|
|
155
|
+
}
|
|
115
156
|
});
|
|
157
|
+
// Set a timeout for server startup
|
|
158
|
+
setTimeout(() => {
|
|
159
|
+
if (!server.listening) {
|
|
160
|
+
server.close();
|
|
161
|
+
reject(new Error('Server startup timeout'));
|
|
162
|
+
}
|
|
163
|
+
}, 10000);
|
|
116
164
|
});
|
|
117
165
|
}
|
|
166
|
+
/**
|
|
167
|
+
* Enhanced browser cleanup with error handling
|
|
168
|
+
*/
|
|
169
|
+
async safeBrowserCleanup(browser) {
|
|
170
|
+
try {
|
|
171
|
+
// First try to close all pages
|
|
172
|
+
const pages = await browser.pages();
|
|
173
|
+
await Promise.allSettled(pages.map(page => page.close()));
|
|
174
|
+
// Then close the browser normally
|
|
175
|
+
await browser.close();
|
|
176
|
+
}
|
|
177
|
+
catch (err) {
|
|
178
|
+
this.Log.warn(`Error during normal browser cleanup: ${err.message}`);
|
|
179
|
+
// Force kill if normal close fails
|
|
180
|
+
try {
|
|
181
|
+
await this.forceCloseBrowser(browser);
|
|
182
|
+
}
|
|
183
|
+
catch (killErr) {
|
|
184
|
+
this.Log.error(`Failed to force kill browser: ${killErr.message}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Force close browser with process termination
|
|
190
|
+
*/
|
|
191
|
+
async forceCloseBrowser(browser) {
|
|
192
|
+
try {
|
|
193
|
+
const process = browser.process();
|
|
194
|
+
if (process) {
|
|
195
|
+
process.kill('SIGKILL');
|
|
196
|
+
this.Log.warn('Browser process force killed');
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
catch (err) {
|
|
200
|
+
this.Log.error(`Error force killing browser process: ${err.message}`);
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
/**
|
|
204
|
+
* Enhanced server cleanup with timeout
|
|
205
|
+
*/
|
|
206
|
+
async safeServerCleanup(server) {
|
|
207
|
+
try {
|
|
208
|
+
await new Promise((resolve, reject) => {
|
|
209
|
+
const timeout = setTimeout(() => {
|
|
210
|
+
reject(new Error('Server close timeout'));
|
|
211
|
+
}, 5000);
|
|
212
|
+
server.close((err) => {
|
|
213
|
+
clearTimeout(timeout);
|
|
214
|
+
if (err)
|
|
215
|
+
reject(err);
|
|
216
|
+
else
|
|
217
|
+
resolve();
|
|
218
|
+
});
|
|
219
|
+
});
|
|
220
|
+
}
|
|
221
|
+
catch (err) {
|
|
222
|
+
this.Log.warn(`Error closing server: ${err.message}`);
|
|
223
|
+
// Force close connections if available
|
|
224
|
+
try {
|
|
225
|
+
if ('closeAllConnections' in server) {
|
|
226
|
+
server.closeAllConnections();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
catch (forceErr) {
|
|
230
|
+
this.Log.error(`Error force closing server connections: ${forceErr.message}`);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
/**
|
|
235
|
+
* Add page event listeners with cleanup function
|
|
236
|
+
*/
|
|
237
|
+
addPageEventListeners(page) {
|
|
238
|
+
const listeners = {
|
|
239
|
+
console: (message) => this.Log.trace(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`),
|
|
240
|
+
pageerror: ({ message }) => this.Log.error(message),
|
|
241
|
+
response: (response) => this.Log.trace(`${response.status()} ${response.url()}`),
|
|
242
|
+
requestfailed: (request) => this.Log.error(`${request.failure().errorText} ${request.url()}`)
|
|
243
|
+
};
|
|
244
|
+
// Add listeners
|
|
245
|
+
page.on('console', listeners.console);
|
|
246
|
+
page.on('pageerror', listeners.pageerror);
|
|
247
|
+
page.on('response', listeners.response);
|
|
248
|
+
page.on('requestfailed', listeners.requestfailed);
|
|
249
|
+
// Return cleanup function
|
|
250
|
+
return () => {
|
|
251
|
+
try {
|
|
252
|
+
page.removeListener('console', listeners.console);
|
|
253
|
+
page.removeListener('pageerror', listeners.pageerror);
|
|
254
|
+
page.removeListener('response', listeners.response);
|
|
255
|
+
page.removeListener('requestfailed', listeners.requestfailed);
|
|
256
|
+
}
|
|
257
|
+
catch (err) {
|
|
258
|
+
this.Log.warn(`Error removing page listeners: ${err.message}`);
|
|
259
|
+
}
|
|
260
|
+
};
|
|
261
|
+
}
|
|
118
262
|
};
|
|
119
263
|
exports.PdfRenderer = PdfRenderer;
|
|
120
264
|
PdfRenderer.USED_PORTS = [];
|
package/lib/cjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,0DAAsE;AACtE,oDAAmD;AACnD,kDAAiE;AACjE,0DAAgD;AAChD,oCAAuF;AACvF,+BAA+C;AAC/C,sCAA2C;AAC3C,sDAA8B;AAE9B,gDAAwB;AAExB,kCAAgC;AAChC,oDAAuB;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|
package/lib/mjs/index.d.ts
CHANGED
|
@@ -12,6 +12,7 @@ interface IPdfRendererOptions {
|
|
|
12
12
|
args: any;
|
|
13
13
|
options: any;
|
|
14
14
|
renderDurationWarning: number;
|
|
15
|
+
renderTimeout?: number;
|
|
15
16
|
}
|
|
16
17
|
export declare class PdfRenderer extends TemplateRenderer implements IInstanceCheck {
|
|
17
18
|
protected pdfOptions: PDFOptions;
|
|
@@ -30,6 +31,22 @@ export declare class PdfRenderer extends TemplateRenderer implements IInstanceCh
|
|
|
30
31
|
render(_templateName: string, _model: unknown, _language?: string): Promise<string>;
|
|
31
32
|
protected compile(_path: string): Promise<void>;
|
|
32
33
|
protected runLocalServer(basePath: string): Promise<http.Server>;
|
|
34
|
+
/**
|
|
35
|
+
* Enhanced browser cleanup with error handling
|
|
36
|
+
*/
|
|
37
|
+
private safeBrowserCleanup;
|
|
38
|
+
/**
|
|
39
|
+
* Force close browser with process termination
|
|
40
|
+
*/
|
|
41
|
+
private forceCloseBrowser;
|
|
42
|
+
/**
|
|
43
|
+
* Enhanced server cleanup with timeout
|
|
44
|
+
*/
|
|
45
|
+
private safeServerCleanup;
|
|
46
|
+
/**
|
|
47
|
+
* Add page event listeners with cleanup function
|
|
48
|
+
*/
|
|
49
|
+
private addPageEventListeners;
|
|
33
50
|
}
|
|
34
51
|
export {};
|
|
35
52
|
//# sourceMappingURL=index.d.ts.map
|
package/lib/mjs/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAwB,MAAM,WAAW,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAA4C,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,wBAAwB,CAAC;AAIhC,UAAU,mBAAmB;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,qBAAqB,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,OAAO,EAAW,UAAU,EAAwB,MAAM,WAAW,CAAC;AAEtE,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjE,OAAO,EAAE,cAAc,EAA4C,MAAM,aAAa,CAAC;AAEvF,OAAO,EAAE,GAAG,EAAU,MAAM,cAAc,CAAC;AAE3C,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAG7B,OAAO,wBAAwB,CAAC;AAIhC,UAAU,mBAAmB;IAC3B,MAAM,EAAE;QACN,SAAS,EAAE,MAAM,EAAE,CAAC;KACrB,CAAC;IACF,IAAI,EAAE,GAAG,CAAC;IACV,OAAO,EAAE,GAAG,CAAC;IACb,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qBAEa,WAAY,SAAQ,gBAAiB,YAAW,cAAc;IAuB7D,SAAS,CAAC,UAAU,EAAE,UAAU;IAtB5C;;OAEG;IAEH,SAAS,CAAC,OAAO,EAAE,mBAAmB,CAAC;IAGvC,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC;IAGnB,SAAS,CAAC,iBAAiB,EAAE,SAAS,CAAC;IAEvC,SAAS,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,EAAE,CAAM;IAE3C,IAAW,IAAI,WAEd;IAED,IAAW,SAAS,WAEnB;gBAEqB,UAAU,EAAE,UAAU;IAI5C,iBAAiB,CAAC,eAAe,EAAE,GAAG,GAAG,OAAO;IAInC,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IA+F9F,MAAM,CAAC,aAAa,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;cAKhF,OAAO,CAAC,KAAK,EAAE,MAAM;cAErB,cAAc,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC;IA2CtE;;OAEG;YACW,kBAAkB;IAoBhC;;OAEG;YACW,iBAAiB;IAY/B;;OAEG;YACW,iBAAiB;IA2B/B;;OAEG;IACH,OAAO,CAAC,qBAAqB;CA0B9B"}
|
package/lib/mjs/index.js
CHANGED
|
@@ -54,17 +54,47 @@ let PdfRenderer = class PdfRenderer extends TemplateRenderer {
|
|
|
54
54
|
}, language);
|
|
55
55
|
browser = await puppeteer.launch(this.Options.args);
|
|
56
56
|
const page = await browser.newPage();
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
.
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
57
|
+
// Set up render timeout
|
|
58
|
+
let renderTimeout;
|
|
59
|
+
const timeoutMs = this.Options.renderTimeout || 30000;
|
|
60
|
+
renderTimeout = setTimeout(async () => {
|
|
61
|
+
this.Log.warn(`PDF render timeout (${timeoutMs}ms) - forcing cleanup`);
|
|
62
|
+
try {
|
|
63
|
+
if (page)
|
|
64
|
+
await page.close().catch(() => { });
|
|
65
|
+
if (browser)
|
|
66
|
+
await this.forceCloseBrowser(browser);
|
|
67
|
+
}
|
|
68
|
+
catch (err) {
|
|
69
|
+
this.Log.error('Error during timeout cleanup:', err);
|
|
70
|
+
}
|
|
71
|
+
}, timeoutMs);
|
|
72
|
+
// Add event listeners with explicit cleanup tracking
|
|
73
|
+
const eventCleanup = this.addPageEventListeners(page);
|
|
74
|
+
try {
|
|
75
|
+
await page.setBypassCSP(true);
|
|
76
|
+
await page.setContent(compiledTemplate);
|
|
77
|
+
await page.pdf({
|
|
78
|
+
path: filePath,
|
|
79
|
+
...this.pdfOptions,
|
|
80
|
+
});
|
|
81
|
+
// Clear timeout on successful completion
|
|
82
|
+
if (renderTimeout) {
|
|
83
|
+
clearTimeout(renderTimeout);
|
|
84
|
+
renderTimeout = undefined;
|
|
85
|
+
}
|
|
86
|
+
// Clean up event listeners
|
|
87
|
+
eventCleanup();
|
|
88
|
+
}
|
|
89
|
+
catch (renderError) {
|
|
90
|
+
// Clear timeout on error
|
|
91
|
+
if (renderTimeout) {
|
|
92
|
+
clearTimeout(renderTimeout);
|
|
93
|
+
renderTimeout = undefined;
|
|
94
|
+
}
|
|
95
|
+
this.Log.error(renderError, `Error during PDF rendering for template ${template}`);
|
|
96
|
+
throw renderError;
|
|
97
|
+
}
|
|
68
98
|
}
|
|
69
99
|
catch (err) {
|
|
70
100
|
this.Log.error(err, `Error rendering pdf template ${template} to file ${filePath}`);
|
|
@@ -77,10 +107,10 @@ let PdfRenderer = class PdfRenderer extends TemplateRenderer {
|
|
|
77
107
|
this.Log.warn(`Rendering pdf template ${template} to file ${filePath} took too long.`);
|
|
78
108
|
}
|
|
79
109
|
if (browser) {
|
|
80
|
-
await
|
|
110
|
+
await this.safeBrowserCleanup(browser);
|
|
81
111
|
}
|
|
82
112
|
if (server) {
|
|
83
|
-
await
|
|
113
|
+
await this.safeServerCleanup(server);
|
|
84
114
|
}
|
|
85
115
|
}
|
|
86
116
|
}
|
|
@@ -95,20 +125,134 @@ let PdfRenderer = class PdfRenderer extends TemplateRenderer {
|
|
|
95
125
|
app.use(cors());
|
|
96
126
|
app.use(Express.static(basePath));
|
|
97
127
|
return new Promise((resolve, reject) => {
|
|
98
|
-
app
|
|
99
|
-
// if no port is provided express will choose random port to start (
|
|
100
|
-
//
|
|
101
|
-
.listen(this.Options.static.portRange.length === 0
|
|
102
|
-
|
|
128
|
+
const server = app
|
|
129
|
+
// if no port is provided express will choose random port to start (available)
|
|
130
|
+
// if not, we will get random from range in config
|
|
131
|
+
.listen(this.Options.static.portRange.length === 0
|
|
132
|
+
? 0
|
|
133
|
+
: _.random(this.Options.static.portRange[0], this.Options.static.portRange[1]))
|
|
134
|
+
.on('listening', function () {
|
|
135
|
+
self.Log.trace(`PDF image server started on port ${this.address().port}`);
|
|
103
136
|
self.Log.trace(`PDF static file dir at ${basePath}`);
|
|
104
137
|
resolve(this);
|
|
105
138
|
})
|
|
106
139
|
.on('error', (err) => {
|
|
107
140
|
self.Log.error(err, `PDF image server cannot start`);
|
|
108
|
-
|
|
141
|
+
// Clean up the failed server
|
|
142
|
+
if (server) {
|
|
143
|
+
server.close(() => {
|
|
144
|
+
reject(err);
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
reject(err);
|
|
149
|
+
}
|
|
109
150
|
});
|
|
151
|
+
// Set a timeout for server startup
|
|
152
|
+
setTimeout(() => {
|
|
153
|
+
if (!server.listening) {
|
|
154
|
+
server.close();
|
|
155
|
+
reject(new Error('Server startup timeout'));
|
|
156
|
+
}
|
|
157
|
+
}, 10000);
|
|
110
158
|
});
|
|
111
159
|
}
|
|
160
|
+
/**
|
|
161
|
+
* Enhanced browser cleanup with error handling
|
|
162
|
+
*/
|
|
163
|
+
async safeBrowserCleanup(browser) {
|
|
164
|
+
try {
|
|
165
|
+
// First try to close all pages
|
|
166
|
+
const pages = await browser.pages();
|
|
167
|
+
await Promise.allSettled(pages.map(page => page.close()));
|
|
168
|
+
// Then close the browser normally
|
|
169
|
+
await browser.close();
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
this.Log.warn(`Error during normal browser cleanup: ${err.message}`);
|
|
173
|
+
// Force kill if normal close fails
|
|
174
|
+
try {
|
|
175
|
+
await this.forceCloseBrowser(browser);
|
|
176
|
+
}
|
|
177
|
+
catch (killErr) {
|
|
178
|
+
this.Log.error(`Failed to force kill browser: ${killErr.message}`);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Force close browser with process termination
|
|
184
|
+
*/
|
|
185
|
+
async forceCloseBrowser(browser) {
|
|
186
|
+
try {
|
|
187
|
+
const process = browser.process();
|
|
188
|
+
if (process) {
|
|
189
|
+
process.kill('SIGKILL');
|
|
190
|
+
this.Log.warn('Browser process force killed');
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
catch (err) {
|
|
194
|
+
this.Log.error(`Error force killing browser process: ${err.message}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Enhanced server cleanup with timeout
|
|
199
|
+
*/
|
|
200
|
+
async safeServerCleanup(server) {
|
|
201
|
+
try {
|
|
202
|
+
await new Promise((resolve, reject) => {
|
|
203
|
+
const timeout = setTimeout(() => {
|
|
204
|
+
reject(new Error('Server close timeout'));
|
|
205
|
+
}, 5000);
|
|
206
|
+
server.close((err) => {
|
|
207
|
+
clearTimeout(timeout);
|
|
208
|
+
if (err)
|
|
209
|
+
reject(err);
|
|
210
|
+
else
|
|
211
|
+
resolve();
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
catch (err) {
|
|
216
|
+
this.Log.warn(`Error closing server: ${err.message}`);
|
|
217
|
+
// Force close connections if available
|
|
218
|
+
try {
|
|
219
|
+
if ('closeAllConnections' in server) {
|
|
220
|
+
server.closeAllConnections();
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
catch (forceErr) {
|
|
224
|
+
this.Log.error(`Error force closing server connections: ${forceErr.message}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Add page event listeners with cleanup function
|
|
230
|
+
*/
|
|
231
|
+
addPageEventListeners(page) {
|
|
232
|
+
const listeners = {
|
|
233
|
+
console: (message) => this.Log.trace(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`),
|
|
234
|
+
pageerror: ({ message }) => this.Log.error(message),
|
|
235
|
+
response: (response) => this.Log.trace(`${response.status()} ${response.url()}`),
|
|
236
|
+
requestfailed: (request) => this.Log.error(`${request.failure().errorText} ${request.url()}`)
|
|
237
|
+
};
|
|
238
|
+
// Add listeners
|
|
239
|
+
page.on('console', listeners.console);
|
|
240
|
+
page.on('pageerror', listeners.pageerror);
|
|
241
|
+
page.on('response', listeners.response);
|
|
242
|
+
page.on('requestfailed', listeners.requestfailed);
|
|
243
|
+
// Return cleanup function
|
|
244
|
+
return () => {
|
|
245
|
+
try {
|
|
246
|
+
page.removeListener('console', listeners.console);
|
|
247
|
+
page.removeListener('pageerror', listeners.pageerror);
|
|
248
|
+
page.removeListener('response', listeners.response);
|
|
249
|
+
page.removeListener('requestfailed', listeners.requestfailed);
|
|
250
|
+
}
|
|
251
|
+
catch (err) {
|
|
252
|
+
this.Log.warn(`Error removing page listeners: ${err.message}`);
|
|
253
|
+
}
|
|
254
|
+
};
|
|
255
|
+
}
|
|
112
256
|
};
|
|
113
257
|
PdfRenderer.USED_PORTS = [];
|
|
114
258
|
__decorate([
|
package/lib/mjs/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;AAAA,OAAO,EAAuB,OAAO,IAAI,SAAS,EAAE,MAAM,WAAW,CAAC;AACtE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAkB,UAAU,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AACvF,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC/C,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,OAAO,MAAM,SAAS,CAAC;AAE9B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,wBAAwB,CAAC;AAChC,OAAO,CAAC,MAAM,QAAQ,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|