@resolveio/server-lib 20.12.47 → 20.12.49

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/methods/pdf.js CHANGED
@@ -1,4 +1,19 @@
1
1
  "use strict";
2
+ var __extends = (this && this.__extends) || (function () {
3
+ var extendStatics = function (d, b) {
4
+ extendStatics = Object.setPrototypeOf ||
5
+ ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
+ function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
+ return extendStatics(d, b);
8
+ };
9
+ return function (d, b) {
10
+ if (typeof b !== "function" && b !== null)
11
+ throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
+ extendStatics(d, b);
13
+ function __() { this.constructor = d; }
14
+ d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
+ };
16
+ })();
2
17
  var __assign = (this && this.__assign) || function () {
3
18
  __assign = Object.assign || function(t) {
4
19
  for (var s, i = 1, n = arguments.length; i < n; i++) {
@@ -101,6 +116,53 @@ var LOW_RESOURCE_PUPPETEER_ARGS = [
101
116
  ];
102
117
  var cachedExecutablePath = null;
103
118
  var cachedTmpExecutablePath = null;
119
+ function envMs(name, fallback) {
120
+ var raw = process.env[name];
121
+ if (!raw) {
122
+ return fallback;
123
+ }
124
+ var parsed = parseInt(raw, 10);
125
+ if (!Number.isFinite(parsed) || parsed <= 0) {
126
+ return fallback;
127
+ }
128
+ return parsed;
129
+ }
130
+ var PDF_LAUNCH_TIMEOUT_MS = envMs('PDF_LAUNCH_TIMEOUT_MS', 60000);
131
+ var PDF_CONTENT_TIMEOUT_MS = envMs('PDF_CONTENT_TIMEOUT_MS', 60000);
132
+ var PDF_FONTS_TIMEOUT_MS = envMs('PDF_FONTS_TIMEOUT_MS', 30000);
133
+ var PDF_IMAGES_TIMEOUT_MS = envMs('PDF_IMAGES_TIMEOUT_MS', 15000);
134
+ var PDF_RENDER_TIMEOUT_MS = envMs('PDF_RENDER_TIMEOUT_MS', 120000);
135
+ var PDF_PROTOCOL_TIMEOUT_MS = envMs('PDF_PROTOCOL_TIMEOUT_MS', 120000);
136
+ var PDF_OVERALL_TIMEOUT_MS = envMs('PDF_OVERALL_TIMEOUT_MS', 240000);
137
+ var PdfTimeoutError = /** @class */ (function (_super) {
138
+ __extends(PdfTimeoutError, _super);
139
+ function PdfTimeoutError(step, timeoutMs) {
140
+ var _this = _super.call(this, "PDF step timed out after ".concat(timeoutMs, "ms: ").concat(step)) || this;
141
+ _this.name = 'PdfTimeoutError';
142
+ _this.step = step;
143
+ _this.timeoutMs = timeoutMs;
144
+ return _this;
145
+ }
146
+ return PdfTimeoutError;
147
+ }(Error));
148
+ function withTimeout(promise, timeoutMs, step) {
149
+ if (!timeoutMs || timeoutMs <= 0) {
150
+ return promise;
151
+ }
152
+ var timeoutHandle = null;
153
+ // eslint-disable-next-line no-restricted-syntax
154
+ return new Promise(function (resolve, reject) {
155
+ timeoutHandle = setTimeout(function () {
156
+ reject(new PdfTimeoutError(step, timeoutMs));
157
+ }, timeoutMs);
158
+ // eslint-disable-next-line no-restricted-syntax, promise/prefer-await-to-then
159
+ promise.then(resolve, reject).finally(function () {
160
+ if (timeoutHandle) {
161
+ clearTimeout(timeoutHandle);
162
+ }
163
+ });
164
+ });
165
+ }
104
166
  function getEnvExecutablePath() {
105
167
  var envExecutablePath = process.env.PUPPETEER_EXECUTABLE_PATH || process.env.CHROME_EXECUTABLE_PATH || process.env.CHROME_PATH;
106
168
  if (envExecutablePath && fs.existsSync(envExecutablePath)) {
@@ -161,7 +223,7 @@ function applyLowResourceLaunchTweaks(options) {
161
223
  }
162
224
  function safeCloseBrowser(browser) {
163
225
  return __awaiter(this, void 0, void 0, function () {
164
- var proc, closeTimedOut, closeTimeout, errClose_1;
226
+ var proc, errClose_1, needsKill;
165
227
  return __generator(this, function (_a) {
166
228
  switch (_a.label) {
167
229
  case 0:
@@ -175,14 +237,10 @@ function safeCloseBrowser(browser) {
175
237
  catch (_b) {
176
238
  proc = null;
177
239
  }
178
- closeTimedOut = false;
179
- closeTimeout = setTimeout(function () {
180
- closeTimedOut = true;
181
- }, 5000);
182
240
  _a.label = 1;
183
241
  case 1:
184
242
  _a.trys.push([1, 3, 4, 5]);
185
- return [4 /*yield*/, browser.close()];
243
+ return [4 /*yield*/, withTimeout(browser.close(), 5000, 'browser.close')];
186
244
  case 2:
187
245
  _a.sent();
188
246
  return [3 /*break*/, 5];
@@ -191,13 +249,15 @@ function safeCloseBrowser(browser) {
191
249
  console.error(new Date(), 'Puppeteer close failed, forcing kill', errClose_1 && errClose_1.message ? errClose_1.message : errClose_1);
192
250
  return [3 /*break*/, 5];
193
251
  case 4:
194
- clearTimeout(closeTimeout);
195
- if ((closeTimedOut || (proc && !proc.killed)) && proc) {
252
+ needsKill = proc && proc.exitCode === null && proc.signalCode === null;
253
+ if (needsKill) {
196
254
  try {
197
255
  proc.kill('SIGKILL');
198
256
  }
199
257
  catch (errKill) {
200
- console.error(new Date(), 'Failed to kill Puppeteer process', errKill);
258
+ if (!errKill || errKill.code !== 'ESRCH') {
259
+ console.error(new Date(), 'Failed to kill Puppeteer process', errKill);
260
+ }
201
261
  }
202
262
  }
203
263
  return [7 /*endfinally*/];
@@ -221,7 +281,9 @@ function launchPDFBrowser(headless, devtools) {
221
281
  devtools: devtools,
222
282
  args: __spreadArray([], __read(PUPPETEER_ARGS), false),
223
283
  ignoreDefaultArgs: ['--disable-extensions'],
224
- env: sanitizeLaunchEnv()
284
+ env: sanitizeLaunchEnv(),
285
+ timeout: PDF_LAUNCH_TIMEOUT_MS,
286
+ protocolTimeout: PDF_PROTOCOL_TIMEOUT_MS
225
287
  };
226
288
  if (cachedExecutablePath) {
227
289
  launchOptions.executablePath = cachedExecutablePath;
@@ -283,7 +345,7 @@ function loadPDFMethods(methodManager) {
283
345
  }),
284
346
  function: function (html_1, fileName_1) {
285
347
  return __awaiter(this, arguments, void 0, function (html, fileName, orientation, fontSize, upload, uploadFileOrder, uploadFileType) {
286
- var enableDebugFlag, enableDebug, maxAttempts, lastError, attempt, browser, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_1;
348
+ var enableDebugFlag, enableDebug, maxAttempts, lastError, _loop_1, this_1, attempt, state_1;
287
349
  if (orientation === void 0) { orientation = 'portrait'; }
288
350
  if (fontSize === void 0) { fontSize = '12px'; }
289
351
  if (upload === void 0) { upload = false; }
@@ -297,121 +359,181 @@ function loadPDFMethods(methodManager) {
297
359
  enableDebug = !!(enableDebugFlag && enableDebugFlag.value);
298
360
  maxAttempts = 2;
299
361
  lastError = null;
362
+ _loop_1 = function (attempt) {
363
+ var browser, page, overallTimedOut, overallTimeoutHandle, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, errImages_1, tmpFileName, data, fileData, err_1;
364
+ return __generator(this, function (_b) {
365
+ switch (_b.label) {
366
+ case 0:
367
+ browser = null;
368
+ page = null;
369
+ overallTimedOut = false;
370
+ overallTimeoutHandle = null;
371
+ _b.label = 1;
372
+ case 1:
373
+ _b.trys.push([1, 15, 18, 22]);
374
+ return [4 /*yield*/, withTimeout(launchPDFBrowser(!enableDebug, enableDebug), PDF_LAUNCH_TIMEOUT_MS, 'launchPDFBrowser')];
375
+ case 2:
376
+ browser = _b.sent();
377
+ overallTimeoutHandle = setTimeout(function () {
378
+ overallTimedOut = true;
379
+ console.error(new Date(), 'generatePDF overall timeout hit', { fileName: fileName, attempt: attempt });
380
+ // eslint-disable-next-line no-restricted-syntax, promise/prefer-await-to-then
381
+ safeCloseBrowser(browser).catch(function () { });
382
+ }, PDF_OVERALL_TIMEOUT_MS);
383
+ return [4 /*yield*/, browser.newPage()];
384
+ case 3:
385
+ page = _b.sent(); // create new tab
386
+ page.setDefaultTimeout(PDF_CONTENT_TIMEOUT_MS);
387
+ pathToFont = '';
388
+ if (fs.existsSync(path.join(__dirname, ('../private/fonts/dejavuserif.woff')))) {
389
+ pathToFont = path.join(__dirname, ('../private/fonts/'));
390
+ }
391
+ else {
392
+ if (fs.existsSync(path.join(this_1.clientDir, ('./private/fonts/dejavuserif.woff')))) {
393
+ pathToFont = path.join(this_1.clientDir, ('./private/fonts/'));
394
+ }
395
+ else {
396
+ pathToFont = '/usr/share/fonts/dejavu/';
397
+ }
398
+ }
399
+ dejavuserif_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif.woff').buffer).toString('base64');
400
+ dejavuserifBold_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bold.woff').buffer).toString('base64');
401
+ dejavuserifItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-italic.woff').buffer).toString('base64');
402
+ dejavuserifBoldItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bolditalic.woff').buffer).toString('base64');
403
+ content = "\n\t\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserif_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBold_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBoldItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tbody {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif', serif;\n\t\t\t\t\t\t\t\t\t\tfont-size: " + (fontSize ? fontSize : '12px') + ";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.row {\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\tpage-break-inside: avoid !important;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.page-break {\n\t\t\t\t\t\t\t\t\t\tpage-break-before: always !important;\n\t\t\t\t\t\t\t\t\t\tpadding-top: 1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\tpadding : 2px;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell-no-padding {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: center;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-left {\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-start;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-right {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-end;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t.box {\n\t\t\t\t\t\t\t\t\t\tborder: 1px solid black;\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.boxNoBorder {\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tpre {\n\t\t\t\t\t\t\t\t\t\twhite-space: pre-wrap; /* css-3 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -pre-wrap; /* Opera 4-6 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -o-pre-wrap; /* Opera 7 */\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word; /* Internet Explorer 5.5+ */\n\t\t\t\t\t\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif'; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t</head>\n\t\t\t\t\t\t\t\t<body>\n\t\t\t\t\t\t\t" + html.replace(new RegExp('flex-basis:', 'g'), '-webkit-flex-basis:').replace(new RegExp('flex:', 'g'), '-webkit-flex:') + '</body>';
404
+ return [4 /*yield*/, withTimeout(page.setContent(content, { waitUntil: ['domcontentloaded'], timeout: PDF_CONTENT_TIMEOUT_MS }), PDF_CONTENT_TIMEOUT_MS, 'page.setContent')];
405
+ case 4:
406
+ _b.sent();
407
+ return [4 /*yield*/, withTimeout(page.evaluateHandle('document.fonts.ready'), PDF_FONTS_TIMEOUT_MS, 'document.fonts.ready')];
408
+ case 5:
409
+ _b.sent();
410
+ if (!(PDF_IMAGES_TIMEOUT_MS > 0)) return [3 /*break*/, 9];
411
+ _b.label = 6;
412
+ case 6:
413
+ _b.trys.push([6, 8, , 9]);
414
+ return [4 /*yield*/, withTimeout(page.waitForFunction(function () { return Array.from(document.images).every(function (img) { return img.complete; }); }, { timeout: 0 }), PDF_IMAGES_TIMEOUT_MS, 'waitForImages')];
415
+ case 7:
416
+ _b.sent();
417
+ return [3 /*break*/, 9];
418
+ case 8:
419
+ errImages_1 = _b.sent();
420
+ if (errImages_1 instanceof PdfTimeoutError) {
421
+ console.warn(new Date(), 'generatePDF timed out waiting for images', { fileName: fileName, attempt: attempt });
422
+ }
423
+ else {
424
+ throw errImages_1;
425
+ }
426
+ return [3 /*break*/, 9];
427
+ case 9:
428
+ tmpFileName = (0, common_1.objectIdHexString)() + '.pdf';
429
+ return [4 /*yield*/, withTimeout(page.pdf({
430
+ scale: 1,
431
+ landscape: orientation === 'portrait' ? false : true,
432
+ format: 'letter',
433
+ margin: {
434
+ top: '1cm',
435
+ bottom: '1cm',
436
+ left: '1cm',
437
+ right: '1cm'
438
+ },
439
+ printBackground: true,
440
+ displayHeaderFooter: true,
441
+ headerTemplate: "\n\t\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t\t#header { \n\t\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important; \n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t\t\t",
442
+ footerTemplate: "\n\t\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t\t#footer { \n\t\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important;\n\t\t\t\t\t\t\t\t\t\t\tfont-size: 10px;\n\t\t\t\t\t\t\t\t\t\t\tfont-family: san-serif;\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t\t<div style=\"padding-bottom: 2px; padding-right: 15px; text-align: right; width: 100%;\">\n\t\t\t\t\t\t\t\t\t\tPage&nbsp;<span class=\"pageNumber\"></span>&nbsp;of&nbsp;<span class=\"totalPages\"></span>\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t",
443
+ path: path.join(__dirname, (tmpFileName)),
444
+ timeout: PDF_RENDER_TIMEOUT_MS
445
+ }), PDF_RENDER_TIMEOUT_MS, 'page.pdf')];
446
+ case 10:
447
+ _b.sent();
448
+ if (!(enableDebugFlag && enableDebugFlag.value)) return [3 /*break*/, 14];
449
+ if (!(orientation === 'landscape')) return [3 /*break*/, 12];
450
+ return [4 /*yield*/, page.setViewport({ width: 1100, height: 850 })];
451
+ case 11:
452
+ _b.sent();
453
+ return [3 /*break*/, 14];
454
+ case 12: return [4 /*yield*/, page.setViewport({ width: 850, height: 1100 })];
455
+ case 13:
456
+ _b.sent();
457
+ _b.label = 14;
458
+ case 14:
459
+ if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
460
+ try {
461
+ data = fs.readFileSync(path.join(__dirname, (tmpFileName)));
462
+ fs.unlinkSync(path.join(__dirname, (tmpFileName)));
463
+ if (!upload) {
464
+ return [2 /*return*/, { value: 'data:application/pdf;base64,' + data.toString('base64') }];
465
+ }
466
+ else {
467
+ fileData = 'data:application/pdf;base64,' + data.toString('base64');
468
+ return [2 /*return*/, { value: this_1.callMethod('uploadFileAndSave', fileName, fileData, (4 * Math.ceil(fileData.length / 3)), uploadFileOrder !== null ? uploadFileOrder : -1, uploadFileType, false) }];
469
+ }
470
+ }
471
+ catch (errRead) {
472
+ errRead.message = 'Error in Generate PDF: No file - ' + errRead.message;
473
+ throw errRead;
474
+ }
475
+ }
476
+ else {
477
+ console.log('No tmp file ', tmpFileName);
478
+ throw new Error('Error in Generate PDF: No tmp file');
479
+ }
480
+ return [3 /*break*/, 22];
481
+ case 15:
482
+ err_1 = _b.sent();
483
+ lastError = err_1;
484
+ if (!browser) return [3 /*break*/, 17];
485
+ // eslint-disable-next-line no-restricted-syntax
486
+ return [4 /*yield*/, browser.close().catch(function () { })];
487
+ case 16:
488
+ // eslint-disable-next-line no-restricted-syntax
489
+ _b.sent();
490
+ _b.label = 17;
491
+ case 17:
492
+ if (err_1 && err_1.message && err_1.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
493
+ console.warn(new Date(), 'Retry generatePDF after detached frame', { attempt: attempt });
494
+ return [2 /*return*/, "continue"];
495
+ }
496
+ console.error(new Date(), 'generatePDF failed', { fileName: fileName, attempt: attempt, message: err_1 && err_1.message ? err_1.message : err_1 });
497
+ throw err_1;
498
+ case 18:
499
+ if (overallTimeoutHandle) {
500
+ clearTimeout(overallTimeoutHandle);
501
+ }
502
+ if (!page) return [3 /*break*/, 20];
503
+ // eslint-disable-next-line no-restricted-syntax
504
+ return [4 /*yield*/, page.close().catch(function () { })];
505
+ case 19:
506
+ // eslint-disable-next-line no-restricted-syntax
507
+ _b.sent();
508
+ page = null;
509
+ _b.label = 20;
510
+ case 20: return [4 /*yield*/, safeCloseBrowser(browser)];
511
+ case 21:
512
+ _b.sent();
513
+ browser = null;
514
+ if (overallTimedOut) {
515
+ throw new PdfTimeoutError('generatePDF overall', PDF_OVERALL_TIMEOUT_MS);
516
+ }
517
+ return [7 /*endfinally*/];
518
+ case 22: return [2 /*return*/];
519
+ }
520
+ });
521
+ };
522
+ this_1 = this;
300
523
  attempt = 1;
301
524
  _a.label = 2;
302
525
  case 2:
303
- if (!(attempt <= maxAttempts)) return [3 /*break*/, 19];
304
- browser = null;
305
- _a.label = 3;
526
+ if (!(attempt <= maxAttempts)) return [3 /*break*/, 5];
527
+ return [5 /*yield**/, _loop_1(attempt)];
306
528
  case 3:
307
- _a.trys.push([3, 13, 16, 18]);
308
- return [4 /*yield*/, launchPDFBrowser(!enableDebug, enableDebug)];
529
+ state_1 = _a.sent();
530
+ if (typeof state_1 === "object")
531
+ return [2 /*return*/, state_1.value];
532
+ _a.label = 4;
309
533
  case 4:
310
- browser = _a.sent();
311
- return [4 /*yield*/, browser.newPage()];
312
- case 5:
313
- page = _a.sent();
314
- pathToFont = '';
315
- if (fs.existsSync(path.join(__dirname, ('../private/fonts/dejavuserif.woff')))) {
316
- pathToFont = path.join(__dirname, ('../private/fonts/'));
317
- }
318
- else {
319
- if (fs.existsSync(path.join(this.clientDir, ('./private/fonts/dejavuserif.woff')))) {
320
- pathToFont = path.join(this.clientDir, ('./private/fonts/'));
321
- }
322
- else {
323
- pathToFont = '/usr/share/fonts/dejavu/';
324
- }
325
- }
326
- dejavuserif_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif.woff').buffer).toString('base64');
327
- dejavuserifBold_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bold.woff').buffer).toString('base64');
328
- dejavuserifItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-italic.woff').buffer).toString('base64');
329
- dejavuserifBoldItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bolditalic.woff').buffer).toString('base64');
330
- content = "\n\t\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserif_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBold_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBoldItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tbody {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif', serif;\n\t\t\t\t\t\t\t\t\t\tfont-size: " + (fontSize ? fontSize : '12px') + ";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.row {\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\tpage-break-inside: avoid !important;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.page-break {\n\t\t\t\t\t\t\t\t\t\tpage-break-before: always !important;\n\t\t\t\t\t\t\t\t\t\tpadding-top: 1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\tpadding : 2px;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell-no-padding {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: center;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-left {\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-start;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-right {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-end;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t.box {\n\t\t\t\t\t\t\t\t\t\tborder: 1px solid black;\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.boxNoBorder {\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tpre {\n\t\t\t\t\t\t\t\t\t\twhite-space: pre-wrap; /* css-3 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -pre-wrap; /* Opera 4-6 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -o-pre-wrap; /* Opera 7 */\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word; /* Internet Explorer 5.5+ */\n\t\t\t\t\t\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif'; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t</head>\n\t\t\t\t\t\t\t<body>\n\t\t\t\t\t\t" + html.replace(new RegExp('flex-basis:', 'g'), '-webkit-flex-basis:').replace(new RegExp('flex:', 'g'), '-webkit-flex:') + '</body>';
331
- return [4 /*yield*/, page.setContent(content, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 0 })];
332
- case 6:
333
- _a.sent();
334
- return [4 /*yield*/, page.evaluateHandle('document.fonts.ready')];
335
- case 7:
336
- _a.sent();
337
- tmpFileName = (0, common_1.objectIdHexString)() + '.pdf';
338
- return [4 /*yield*/, page.pdf({
339
- scale: 1,
340
- landscape: orientation === 'portrait' ? false : true,
341
- format: 'letter',
342
- margin: {
343
- top: '1cm',
344
- bottom: '1cm',
345
- left: '1cm',
346
- right: '1cm'
347
- },
348
- printBackground: true,
349
- displayHeaderFooter: true,
350
- headerTemplate: "\n\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t#header { \n\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t\t",
351
- footerTemplate: "\n\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t#footer { \n\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important;\n\t\t\t\t\t\t\t\t\t\tfont-size: 10px;\n\t\t\t\t\t\t\t\t\t\tfont-family: san-serif;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t<div style=\"padding-bottom: 2px; padding-right: 15px; text-align: right; width: 100%;\">\n\t\t\t\t\t\t\t\t\tPage&nbsp;<span class=\"pageNumber\"></span>&nbsp;of&nbsp;<span class=\"totalPages\"></span>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t",
352
- path: path.join(__dirname, (tmpFileName)),
353
- timeout: 0
354
- })];
355
- case 8:
356
- _a.sent();
357
- if (!(enableDebugFlag && enableDebugFlag.value)) return [3 /*break*/, 12];
358
- if (!(orientation === 'landscape')) return [3 /*break*/, 10];
359
- return [4 /*yield*/, page.setViewport({ width: 1100, height: 850 })];
360
- case 9:
361
- _a.sent();
362
- return [3 /*break*/, 12];
363
- case 10: return [4 /*yield*/, page.setViewport({ width: 850, height: 1100 })];
364
- case 11:
365
- _a.sent();
366
- _a.label = 12;
367
- case 12:
368
- if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
369
- try {
370
- data = fs.readFileSync(path.join(__dirname, (tmpFileName)));
371
- fs.unlinkSync(path.join(__dirname, (tmpFileName)));
372
- if (!upload) {
373
- return [2 /*return*/, 'data:application/pdf;base64,' + data.toString('base64')];
374
- }
375
- else {
376
- fileData = 'data:application/pdf;base64,' + data.toString('base64');
377
- return [2 /*return*/, this.callMethod('uploadFileAndSave', fileName, fileData, (4 * Math.ceil(fileData.length / 3)), uploadFileOrder !== null ? uploadFileOrder : -1, uploadFileType, false)];
378
- }
379
- }
380
- catch (errRead) {
381
- errRead.message = 'Error in Generate PDF: No file - ' + errRead.message;
382
- throw errRead;
383
- }
384
- }
385
- else {
386
- console.log('No tmp file ', tmpFileName);
387
- throw new Error('Error in Generate PDF: No tmp file');
388
- }
389
- return [3 /*break*/, 18];
390
- case 13:
391
- err_1 = _a.sent();
392
- lastError = err_1;
393
- if (!browser) return [3 /*break*/, 15];
394
- // eslint-disable-next-line no-restricted-syntax
395
- return [4 /*yield*/, browser.close().catch(function () { })];
396
- case 14:
397
- // eslint-disable-next-line no-restricted-syntax
398
- _a.sent();
399
- _a.label = 15;
400
- case 15:
401
- if (err_1 && err_1.message && err_1.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
402
- console.warn(new Date(), 'Retry generatePDF after detached frame', { attempt: attempt });
403
- return [3 /*break*/, 18];
404
- }
405
- throw err_1;
406
- case 16: return [4 /*yield*/, safeCloseBrowser(browser)];
407
- case 17:
408
- _a.sent();
409
- browser = null;
410
- return [7 /*endfinally*/];
411
- case 18:
412
534
  attempt++;
413
535
  return [3 /*break*/, 2];
414
- case 19: throw lastError;
536
+ case 5: throw lastError;
415
537
  }
416
538
  });
417
539
  });
@@ -452,7 +574,7 @@ function loadPDFMethods(methodManager) {
452
574
  }),
453
575
  function: function (html_1, fileName_1) {
454
576
  return __awaiter(this, arguments, void 0, function (html, fileName, orientation, fontSize, upload, uploadFileOrder, uploadFileType) {
455
- var maxAttempts, lastError, attempt, browser, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_2;
577
+ var maxAttempts, lastError, _loop_2, this_2, attempt, state_2;
456
578
  if (orientation === void 0) { orientation = 'portrait'; }
457
579
  if (fontSize === void 0) { fontSize = '12px'; }
458
580
  if (upload === void 0) { upload = false; }
@@ -463,110 +585,170 @@ function loadPDFMethods(methodManager) {
463
585
  case 0:
464
586
  maxAttempts = 2;
465
587
  lastError = null;
588
+ _loop_2 = function (attempt) {
589
+ var browser, page, overallTimedOut, overallTimeoutHandle, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, errImages_2, tmpFileName, data, fileData, err_2;
590
+ return __generator(this, function (_b) {
591
+ switch (_b.label) {
592
+ case 0:
593
+ browser = null;
594
+ page = null;
595
+ overallTimedOut = false;
596
+ overallTimeoutHandle = null;
597
+ _b.label = 1;
598
+ case 1:
599
+ _b.trys.push([1, 11, 14, 18]);
600
+ return [4 /*yield*/, withTimeout(launchPDFBrowser(true, false), PDF_LAUNCH_TIMEOUT_MS, 'launchPDFBrowser')];
601
+ case 2:
602
+ browser = _b.sent();
603
+ overallTimeoutHandle = setTimeout(function () {
604
+ overallTimedOut = true;
605
+ console.error(new Date(), 'generatePDFNoPageNumber overall timeout hit', { fileName: fileName, attempt: attempt });
606
+ // eslint-disable-next-line no-restricted-syntax, promise/prefer-await-to-then
607
+ safeCloseBrowser(browser).catch(function () { });
608
+ }, PDF_OVERALL_TIMEOUT_MS);
609
+ return [4 /*yield*/, browser.newPage()];
610
+ case 3:
611
+ page = _b.sent(); // create new tab
612
+ page.setDefaultTimeout(PDF_CONTENT_TIMEOUT_MS);
613
+ pathToFont = '';
614
+ if (fs.existsSync(path.join(__dirname, ('../private/fonts/dejavuserif.woff')))) {
615
+ pathToFont = path.join(__dirname, ('../private/fonts/'));
616
+ }
617
+ else {
618
+ if (fs.existsSync(path.join(this_2.clientDir, ('./private/fonts/dejavuserif.woff')))) {
619
+ pathToFont = path.join(this_2.clientDir, ('./private/fonts/'));
620
+ }
621
+ else {
622
+ pathToFont = '/usr/share/fonts/dejavu/';
623
+ }
624
+ }
625
+ dejavuserif_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif.woff').buffer).toString('base64');
626
+ dejavuserifBold_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bold.woff').buffer).toString('base64');
627
+ dejavuserifItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-italic.woff').buffer).toString('base64');
628
+ dejavuserifBoldItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bolditalic.woff').buffer).toString('base64');
629
+ content = "\n\t\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserif_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBold_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBoldItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tbody {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif', serif;\n\t\t\t\t\t\t\t\t\t\tfont-size: " + (fontSize ? fontSize : '12px') + ";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.row {\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\tpage-break-inside: avoid !important;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.page-break {\n\t\t\t\t\t\t\t\t\t\tpage-break-before: always !important;\n\t\t\t\t\t\t\t\t\t\tpadding-top: 1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\tpadding : 2px;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell-no-padding {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: center;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-left {\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-start;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-right {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-end;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t.box {\n\t\t\t\t\t\t\t\t\t\tborder: 1px solid black;\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.boxNoBorder {\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tpre {\n\t\t\t\t\t\t\t\t\t\twhite-space: pre-wrap; /* css-3 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -pre-wrap; /* Opera 4-6 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -o-pre-wrap; /* Opera 7 */\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word; /* Internet Explorer 5.5+ */\n\t\t\t\t\t\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif'; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t<meta charset=\"UTF-8\">\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t\t<body>\n\t\t\t\t\t\t" + html.replace(new RegExp('flex-basis:', 'g'), '-webkit-flex-basis:').replace(new RegExp('flex:', 'g'), '-webkit-flex:') + "</body>";
630
+ return [4 /*yield*/, withTimeout(page.setContent(content, { waitUntil: ['domcontentloaded'], timeout: PDF_CONTENT_TIMEOUT_MS }), PDF_CONTENT_TIMEOUT_MS, 'page.setContent')];
631
+ case 4:
632
+ _b.sent();
633
+ return [4 /*yield*/, withTimeout(page.evaluateHandle('document.fonts.ready'), PDF_FONTS_TIMEOUT_MS, 'document.fonts.ready')];
634
+ case 5:
635
+ _b.sent();
636
+ if (!(PDF_IMAGES_TIMEOUT_MS > 0)) return [3 /*break*/, 9];
637
+ _b.label = 6;
638
+ case 6:
639
+ _b.trys.push([6, 8, , 9]);
640
+ return [4 /*yield*/, withTimeout(page.waitForFunction(function () { return Array.from(document.images).every(function (img) { return img.complete; }); }, { timeout: 0 }), PDF_IMAGES_TIMEOUT_MS, 'waitForImages')];
641
+ case 7:
642
+ _b.sent();
643
+ return [3 /*break*/, 9];
644
+ case 8:
645
+ errImages_2 = _b.sent();
646
+ if (errImages_2 instanceof PdfTimeoutError) {
647
+ console.warn(new Date(), 'generatePDFNoPageNumber timed out waiting for images', { fileName: fileName, attempt: attempt });
648
+ }
649
+ else {
650
+ throw errImages_2;
651
+ }
652
+ return [3 /*break*/, 9];
653
+ case 9:
654
+ tmpFileName = (0, common_1.objectIdHexString)() + '.pdf';
655
+ return [4 /*yield*/, withTimeout(page.pdf({
656
+ scale: 1,
657
+ landscape: orientation === 'portrait' ? false : true,
658
+ format: 'letter',
659
+ margin: {
660
+ top: '1cm',
661
+ bottom: '1cm',
662
+ left: '1cm',
663
+ right: '1cm'
664
+ },
665
+ printBackground: true,
666
+ displayHeaderFooter: true,
667
+ headerTemplate: "\n\t\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t\t#header { \n\t\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important; \n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t\t\t",
668
+ footerTemplate: "\n\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t#footer { \n\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important;\n\t\t\t\t\t\t\t\t\t\tfont-size: 10px;\n\t\t\t\t\t\t\t\t\t\tfont-family: san-serif;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t<div style=\"padding-bottom: 2px; padding-right: 15px; text-align: right; width: 100%;\">\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t",
669
+ path: path.join(__dirname, (tmpFileName)),
670
+ timeout: PDF_RENDER_TIMEOUT_MS
671
+ }), PDF_RENDER_TIMEOUT_MS, 'page.pdf')];
672
+ case 10:
673
+ _b.sent();
674
+ if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
675
+ try {
676
+ data = fs.readFileSync(path.join(__dirname, (tmpFileName)));
677
+ fs.unlinkSync(path.join(__dirname, (tmpFileName)));
678
+ if (!upload) {
679
+ return [2 /*return*/, { value: 'data:application/pdf;base64,' + data.toString('base64') }];
680
+ }
681
+ else {
682
+ fileData = 'data:application/pdf;base64,' + data.toString('base64');
683
+ return [2 /*return*/, { value: this_2.callMethod('uploadFileAndSave', fileName, fileData, (4 * Math.ceil(fileData.length / 3)), uploadFileOrder !== null ? uploadFileOrder : -1, uploadFileType, false) }];
684
+ }
685
+ }
686
+ catch (errRead) {
687
+ errRead.message = 'Error in Generate PDF No Page Number: No file - ' + errRead.message;
688
+ throw errRead;
689
+ }
690
+ }
691
+ else {
692
+ console.log('No tmp file ', tmpFileName);
693
+ throw new Error('Error in Generate PDF No Page Number: No tmp file');
694
+ }
695
+ return [3 /*break*/, 18];
696
+ case 11:
697
+ err_2 = _b.sent();
698
+ lastError = err_2;
699
+ if (!browser) return [3 /*break*/, 13];
700
+ // eslint-disable-next-line no-restricted-syntax
701
+ return [4 /*yield*/, browser.close().catch(function () { })];
702
+ case 12:
703
+ // eslint-disable-next-line no-restricted-syntax
704
+ _b.sent();
705
+ _b.label = 13;
706
+ case 13:
707
+ if (err_2 && err_2.message && err_2.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
708
+ console.warn(new Date(), 'Retry generatePDFNoPageNumber after detached frame', { attempt: attempt });
709
+ return [2 /*return*/, "continue"];
710
+ }
711
+ console.error(new Date(), 'generatePDFNoPageNumber failed', { fileName: fileName, attempt: attempt, message: err_2 && err_2.message ? err_2.message : err_2 });
712
+ throw err_2;
713
+ case 14:
714
+ if (overallTimeoutHandle) {
715
+ clearTimeout(overallTimeoutHandle);
716
+ }
717
+ if (!page) return [3 /*break*/, 16];
718
+ // eslint-disable-next-line no-restricted-syntax
719
+ return [4 /*yield*/, page.close().catch(function () { })];
720
+ case 15:
721
+ // eslint-disable-next-line no-restricted-syntax
722
+ _b.sent();
723
+ page = null;
724
+ _b.label = 16;
725
+ case 16: return [4 /*yield*/, safeCloseBrowser(browser)];
726
+ case 17:
727
+ _b.sent();
728
+ browser = null;
729
+ if (overallTimedOut) {
730
+ throw new PdfTimeoutError('generatePDFNoPageNumber overall', PDF_OVERALL_TIMEOUT_MS);
731
+ }
732
+ return [7 /*endfinally*/];
733
+ case 18: return [2 /*return*/];
734
+ }
735
+ });
736
+ };
737
+ this_2 = this;
466
738
  attempt = 1;
467
739
  _a.label = 1;
468
740
  case 1:
469
- if (!(attempt <= maxAttempts)) return [3 /*break*/, 14];
470
- browser = null;
471
- _a.label = 2;
741
+ if (!(attempt <= maxAttempts)) return [3 /*break*/, 4];
742
+ return [5 /*yield**/, _loop_2(attempt)];
472
743
  case 2:
473
- _a.trys.push([2, 8, 11, 13]);
474
- return [4 /*yield*/, launchPDFBrowser(true, false)];
744
+ state_2 = _a.sent();
745
+ if (typeof state_2 === "object")
746
+ return [2 /*return*/, state_2.value];
747
+ _a.label = 3;
475
748
  case 3:
476
- browser = _a.sent();
477
- return [4 /*yield*/, browser.newPage()];
478
- case 4:
479
- page = _a.sent();
480
- pathToFont = '';
481
- if (fs.existsSync(path.join(__dirname, ('../private/fonts/dejavuserif.woff')))) {
482
- pathToFont = path.join(__dirname, ('../private/fonts/'));
483
- }
484
- else {
485
- if (fs.existsSync(path.join(this.clientDir, ('./private/fonts/dejavuserif.woff')))) {
486
- pathToFont = path.join(this.clientDir, ('./private/fonts/'));
487
- }
488
- else {
489
- pathToFont = '/usr/share/fonts/dejavu/';
490
- }
491
- }
492
- dejavuserif_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif.woff').buffer).toString('base64');
493
- dejavuserifBold_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bold.woff').buffer).toString('base64');
494
- dejavuserifItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-italic.woff').buffer).toString('base64');
495
- dejavuserifBoldItalic_woff = 'data:application/font-woff;base64,' + Buffer.from(fs.readFileSync(pathToFont + 'dejavuserif-bolditalic.woff').buffer).toString('base64');
496
- content = "\n\t\t\t\t\t\t\t<head>\n\t\t\t\t\t\t\t\t<style type=\"text/css\">\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserif_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: normal;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBold_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: normal;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t@font-face {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif';\n\t\t\t\t\t\t\t\t\t\tfont-style: italic;\n\t\t\t\t\t\t\t\t\t\tfont-weight: bold;\n\t\t\t\t\t\t\t\t\t\tsrc: url(\"" + dejavuserifBoldItalic_woff + "\") format('woff');\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\tbody {\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif', serif;\n\t\t\t\t\t\t\t\t\t\tfont-size: " + (fontSize ? fontSize : '12px') + ";\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.row {\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\tdisplay: flex;\n\t\t\t\t\t\t\t\t\t\tflex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex-wrap: wrap;\n\t\t\t\t\t\t\t\t\t\tpage-break-inside: avoid !important;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.page-break {\n\t\t\t\t\t\t\t\t\t\tpage-break-before: always !important;\n\t\t\t\t\t\t\t\t\t\tpadding-top: 1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\tpadding : 2px;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.cell-no-padding {\n\t\t\t\t\t\t\t\t\t\tbox-sizing: border-box;\n\t\t\t\t\t\t\t\t\t\t-webkit-flex: 1;\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: center;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\ttext-align: center;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-left {\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-start;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.centered-right {\n\t\t\t\t\t\t\t\t\t\t-webkit-justify-content: flex-end;\n\t\t\t\t\t\t\t\t\t\t-webkit-align-items: center;\n\t\t\t\t\t\t\t\t\t\tdisplay: -webkit-flex;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\t\t.box {\n\t\t\t\t\t\t\t\t\t\tborder: 1px solid black;\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\t.boxNoBorder {\n\t\t\t\t\t\t\t\t\t\tmargin: -1px 0px 0px -1px;\n\t\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t\tpre {\n\t\t\t\t\t\t\t\t\t\twhite-space: pre-wrap; /* css-3 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -moz-pre-wrap; /* Mozilla, since 1999 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -pre-wrap; /* Opera 4-6 */\n\t\t\t\t\t\t\t\t\t\twhite-space: -o-pre-wrap; /* Opera 7 */\n\t\t\t\t\t\t\t\t\t\tword-wrap: break-word; /* Internet Explorer 5.5+ */\n\t\t\t\t\t\t\t\t\t\tfont-size: 12px;\n\t\t\t\t\t\t\t\t\t\tfont-family: 'Dejavu Serif'; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t<meta charset=\"UTF-8\">\n\t\t\t\t\t\t</head>\n\t\t\t\t\t\t<body>\n\t\t\t\t\t" + html.replace(new RegExp('flex-basis:', 'g'), '-webkit-flex-basis:').replace(new RegExp('flex:', 'g'), '-webkit-flex:') + "</body>";
497
- return [4 /*yield*/, page.setContent(content, { waitUntil: ['domcontentloaded', 'load', 'networkidle0'], timeout: 0 })];
498
- case 5:
499
- _a.sent();
500
- return [4 /*yield*/, page.evaluateHandle('document.fonts.ready')];
501
- case 6:
502
- _a.sent();
503
- tmpFileName = (0, common_1.objectIdHexString)() + '.pdf';
504
- return [4 /*yield*/, page.pdf({
505
- scale: 1,
506
- landscape: orientation === 'portrait' ? false : true,
507
- format: 'letter',
508
- margin: {
509
- top: '1cm',
510
- bottom: '1cm',
511
- left: '1cm',
512
- right: '1cm'
513
- },
514
- printBackground: true,
515
- displayHeaderFooter: true,
516
- headerTemplate: "\n\t\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t\t#header { \n\t\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important; \n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t\t<span></span>\n\t\t\t\t\t\t\t",
517
- footerTemplate: "\n\t\t\t\t\t\t\t<style>\n\t\t\t\t\t\t\t\t#footer { \n\t\t\t\t\t\t\t\t\tpadding: 0 0 10px 10px !important;\n\t\t\t\t\t\t\t\t\tfont-size: 10px;\n\t\t\t\t\t\t\t\t\tfont-family: san-serif;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t</style>\n\t\t\t\t\t\t\t<div style=\"padding-bottom: 2px; padding-right: 15px; text-align: right; width: 100%;\">\n\t\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t",
518
- path: path.join(__dirname, (tmpFileName)),
519
- timeout: 0
520
- })];
521
- case 7:
522
- _a.sent();
523
- if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
524
- try {
525
- data = fs.readFileSync(path.join(__dirname, (tmpFileName)));
526
- fs.unlinkSync(path.join(__dirname, (tmpFileName)));
527
- if (!upload) {
528
- return [2 /*return*/, 'data:application/pdf;base64,' + data.toString('base64')];
529
- }
530
- else {
531
- fileData = 'data:application/pdf;base64,' + data.toString('base64');
532
- return [2 /*return*/, this.callMethod('uploadFileAndSave', fileName, fileData, (4 * Math.ceil(fileData.length / 3)), uploadFileOrder !== null ? uploadFileOrder : -1, uploadFileType, false)];
533
- }
534
- }
535
- catch (errRead) {
536
- errRead.message = 'Error in Generate PDF No Page Number: No file - ' + errRead.message;
537
- throw errRead;
538
- }
539
- }
540
- else {
541
- console.log('No tmp file ', tmpFileName);
542
- throw new Error('Error in Generate PDF No Page Number: No tmp file');
543
- }
544
- return [3 /*break*/, 13];
545
- case 8:
546
- err_2 = _a.sent();
547
- lastError = err_2;
548
- if (!browser) return [3 /*break*/, 10];
549
- // eslint-disable-next-line no-restricted-syntax
550
- return [4 /*yield*/, browser.close().catch(function () { })];
551
- case 9:
552
- // eslint-disable-next-line no-restricted-syntax
553
- _a.sent();
554
- _a.label = 10;
555
- case 10:
556
- if (err_2 && err_2.message && err_2.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
557
- console.warn(new Date(), 'Retry generatePDFNoPageNumber after detached frame', { attempt: attempt });
558
- return [3 /*break*/, 13];
559
- }
560
- throw err_2;
561
- case 11: return [4 /*yield*/, safeCloseBrowser(browser)];
562
- case 12:
563
- _a.sent();
564
- browser = null;
565
- return [7 /*endfinally*/];
566
- case 13:
567
749
  attempt++;
568
750
  return [3 /*break*/, 1];
569
- case 14: throw lastError;
751
+ case 4: throw lastError;
570
752
  }
571
753
  });
572
754
  });