@resolveio/server-lib 20.12.42 → 20.12.44

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/fixtures/init.js CHANGED
@@ -52,6 +52,7 @@ var email_history_collection_1 = require("../collections/email-history.collectio
52
52
  var flag_collection_1 = require("../collections/flag.collection");
53
53
  var report_builder_report_collection_1 = require("../collections/report-builder-report.collection");
54
54
  var resolveio_server_app_1 = require("../resolveio-server-app");
55
+ var chrome_cleaner_1 = require("../util/chrome-cleaner");
55
56
  function loadServerInit() {
56
57
  return __awaiter(this, void 0, void 0, function () {
57
58
  var enableDebugFlag, enableDebugFlagPDF;
@@ -82,8 +83,14 @@ function loadServerInit() {
82
83
  case 8:
83
84
  _a.sent();
84
85
  _a.label = 9;
85
- case 9: return [4 /*yield*/, backfillReportBuilderLayouts()];
86
+ case 9:
87
+ if (!(resolveio_server_app_1.ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200')) return [3 /*break*/, 11];
88
+ return [4 /*yield*/, (0, chrome_cleaner_1.cleanupExistingChromeProcesses)('server-init')];
86
89
  case 10:
90
+ _a.sent();
91
+ _a.label = 11;
92
+ case 11: return [4 /*yield*/, backfillReportBuilderLayouts()];
93
+ case 12:
87
94
  _a.sent();
88
95
  return [2 /*return*/];
89
96
  }
@@ -111,21 +118,40 @@ function backfillReportBuilderLayouts() {
111
118
  ops = [];
112
119
  _loop_1 = function (report) {
113
120
  var fieldsSelected = report.fields_selected || [];
114
- var layout = fieldsSelected.map(function (field, index) { return ({
115
- id: field.id ? "layout_".concat(field.id) : "layout_".concat(index),
116
- header: field.columnName || field.fieldName || "Column ".concat(index + 1),
117
- mappings: [
118
- {
119
- collection: field.collection_name || report.collection_root,
120
- mode: 'variable',
121
- fieldPath: field.fieldPath || '',
122
- fieldId: field.id || "f_layout_".concat(index),
123
- text: '',
124
- leafValueType: field.leafValueType || 'Value',
125
- leafFormatType: field.leafFormatType || ''
121
+ var collectionKeys = buildCollectionKeys(report);
122
+ var layout = fieldsSelected.map(function (field, index) {
123
+ var header = field.columnName || field.fieldName || "Column ".concat(index + 1);
124
+ var mappings = collectionKeys.map(function (key) {
125
+ var matchesKey = key === report.collection_root
126
+ ? (field.collection_name === report.collection_root)
127
+ : (key === (field.lookup_as || '').trim()) || key === field.collection_name;
128
+ if (matchesKey) {
129
+ return {
130
+ collection: key,
131
+ mode: 'variable',
132
+ fieldPath: field.fieldPath || '',
133
+ fieldId: field.id || "f_layout_".concat(index),
134
+ text: '',
135
+ leafValueType: field.leafValueType || 'Value',
136
+ leafFormatType: field.leafFormatType || ''
137
+ };
126
138
  }
127
- ]
128
- }); });
139
+ return {
140
+ collection: key,
141
+ mode: 'text',
142
+ fieldPath: '',
143
+ fieldId: '',
144
+ text: '',
145
+ leafValueType: 'Value',
146
+ leafFormatType: ''
147
+ };
148
+ });
149
+ return {
150
+ id: field.id ? "layout_".concat(field.id) : "layout_".concat(index),
151
+ header: header,
152
+ mappings: mappings
153
+ };
154
+ });
129
155
  ops.push({
130
156
  updateOne: {
131
157
  filter: { _id: report._id },
@@ -151,6 +177,7 @@ function backfillReportBuilderLayouts() {
151
177
  }
152
178
  finally { if (e_1) throw e_1.error; }
153
179
  }
180
+ console.log("Backfilled ".concat(ops.length, " report layouts"));
154
181
  if (!ops.length) return [3 /*break*/, 3];
155
182
  return [4 /*yield*/, report_builder_report_collection_1.ReportBuilderReports.bulkWrite(ops, { ordered: false }, false, true, true, true)];
156
183
  case 2:
@@ -161,5 +188,24 @@ function backfillReportBuilderLayouts() {
161
188
  });
162
189
  });
163
190
  }
191
+ function buildCollectionKeys(report) {
192
+ var keys = [];
193
+ if (report.collection_root) {
194
+ keys.push(report.collection_root);
195
+ }
196
+ (report.collection_joins || []).forEach(function (join) {
197
+ if (!join) {
198
+ return;
199
+ }
200
+ var alias = (join.alias || '').trim();
201
+ if (alias && !keys.includes(alias)) {
202
+ keys.push(alias);
203
+ }
204
+ else if (join.collection && !keys.includes(join.collection)) {
205
+ keys.push(join.collection);
206
+ }
207
+ });
208
+ return keys.length ? keys : ['root'];
209
+ }
164
210
 
165
211
  //# sourceMappingURL=init.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/fixtures/init.ts"],"names":[],"mappings":"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","file":"init.js","sourcesContent":["import { EmailHistories } from '../collections/email-history.collection';\nimport { Flags } from '../collections/flag.collection';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\n\nexport async function loadServerInit() {\n\tawait EmailHistories.updateMany({status: 'processing'}, {$set: {status: 'pending'}});\n\n\tlet enableDebugFlag = await Flags.findOne({type: 'Enable Debug'});\n\n\tif (!enableDebugFlag) {\n\t\tawait Flags.insertOne({type: 'Enable Debug', value: false});\n\t}\n\n\tlet enableDebugFlagPDF = await Flags.findOne({type: 'Enable Debug PDF'});\n\n\tif (!enableDebugFlagPDF) {\n\t\tawait Flags.insertOne({type: 'Enable Debug PDF', value: false});\n\t}\n\telse if (enableDebugFlagPDF.value && ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200') {\n\t\tawait Flags.updateOne({_id: enableDebugFlagPDF._id}, {$set: {value: false}});\n\t}\n\n\tawait backfillReportBuilderLayouts();\n}\n\nasync function backfillReportBuilderLayouts() {\n\tif (!ReportBuilderReports) {\n\t\treturn;\n\t}\n\n\tconst reports = await ReportBuilderReports.find({\n\t\t$or: [\n\t\t\t{fields_layout: {$exists: false}},\n\t\t\t{fields_layout: {$size: 0}}\n\t\t]\n\t});\n\n\tconst ops = [];\n\n\tfor (const report of reports) {\n\t\tconst fieldsSelected = report.fields_selected || [];\n\t\tconst layout = fieldsSelected.map((field, index) => ({\n\t\t\tid: field.id ? `layout_${field.id}` : `layout_${index}`,\n\t\t\theader: field.columnName || field.fieldName || `Column ${index + 1}`,\n\t\t\tmappings: [\n\t\t\t\t{\n\t\t\t\t\tcollection: field.collection_name || report.collection_root,\n\t\t\t\t\tmode: 'variable',\n\t\t\t\t\tfieldPath: field.fieldPath || '',\n\t\t\t\t\tfieldId: field.id || `f_layout_${index}`,\n\t\t\t\t\ttext: '',\n\t\t\t\t\tleafValueType: field.leafValueType || 'Value',\n\t\t\t\t\tleafFormatType: field.leafFormatType || ''\n\t\t\t\t}\n\t\t\t]\n\t\t}));\n\n\t\tops.push({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: {_id: report._id},\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: {\n\t\t\t\t\t\tcollection_joins: report.collection_joins || [],\n\t\t\t\t\t\tfields_layout: layout\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tif (ops.length) {\n\t\tawait ReportBuilderReports.bulkWrite(ops, {ordered: false}, false, true, true, true);\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/fixtures/init.ts"],"names":[],"mappings":"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","file":"init.js","sourcesContent":["import { EmailHistories } from '../collections/email-history.collection';\nimport { Flags } from '../collections/flag.collection';\nimport { ReportBuilderReports } from '../collections/report-builder-report.collection';\nimport { ResolveIOServer } from '../resolveio-server-app';\nimport { cleanupExistingChromeProcesses } from '../util/chrome-cleaner';\n\nexport async function loadServerInit() {\n\tawait EmailHistories.updateMany({status: 'processing'}, {$set: {status: 'pending'}});\n\n\tlet enableDebugFlag = await Flags.findOne({type: 'Enable Debug'});\n\n\tif (!enableDebugFlag) {\n\t\tawait Flags.insertOne({type: 'Enable Debug', value: false});\n\t}\n\n\tlet enableDebugFlagPDF = await Flags.findOne({type: 'Enable Debug PDF'});\n\n\tif (!enableDebugFlagPDF) {\n\t\tawait Flags.insertOne({type: 'Enable Debug PDF', value: false});\n\t}\n\telse if (enableDebugFlagPDF.value && ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200') {\n\t\tawait Flags.updateOne({_id: enableDebugFlagPDF._id}, {$set: {value: false}});\n\t}\n\n\t// Clean up any orphaned headless Chrome processes left from prior runs (production only).\n\tif (ResolveIOServer.getServerConfig()['ROOT_URL'] !== 'http://localhost:4200') {\n\t\tawait cleanupExistingChromeProcesses('server-init');\n\t}\n\n\tawait backfillReportBuilderLayouts();\n}\n\nasync function backfillReportBuilderLayouts() {\n\tif (!ReportBuilderReports) {\n\t\treturn;\n\t}\n\n\tconst reports = await ReportBuilderReports.find({\n\t\t$or: [\n\t\t\t{fields_layout: {$exists: false}},\n\t\t\t{fields_layout: {$size: 0}}\n\t\t]\n\t});\n\n\tconst ops = [];\n\n\tfor (const report of reports) {\n\t\tconst fieldsSelected = report.fields_selected || [];\n\t\tconst collectionKeys = buildCollectionKeys(report);\n\n\t\tconst layout = fieldsSelected.map((field, index) => {\n\t\t\tconst header = field.columnName || field.fieldName || `Column ${index + 1}`;\n\n\t\t\tconst mappings = collectionKeys.map(key => {\n\t\t\t\tconst matchesKey = key === report.collection_root\n\t\t\t\t\t? (field.collection_name === report.collection_root)\n\t\t\t\t\t: (key === (field.lookup_as || '').trim()) || key === field.collection_name;\n\n\t\t\t\tif (matchesKey) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\tcollection: key,\n\t\t\t\t\t\tmode: 'variable',\n\t\t\t\t\t\tfieldPath: field.fieldPath || '',\n\t\t\t\t\t\tfieldId: field.id || `f_layout_${index}`,\n\t\t\t\t\t\ttext: '',\n\t\t\t\t\t\tleafValueType: field.leafValueType || 'Value',\n\t\t\t\t\t\tleafFormatType: field.leafFormatType || ''\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\treturn {\n\t\t\t\t\tcollection: key,\n\t\t\t\t\tmode: 'text',\n\t\t\t\t\tfieldPath: '',\n\t\t\t\t\tfieldId: '',\n\t\t\t\t\ttext: '',\n\t\t\t\t\tleafValueType: 'Value',\n\t\t\t\t\tleafFormatType: ''\n\t\t\t\t};\n\t\t\t});\n\n\t\t\treturn {\n\t\t\t\tid: field.id ? `layout_${field.id}` : `layout_${index}`,\n\t\t\t\theader,\n\t\t\t\tmappings\n\t\t\t};\n\t\t});\n\n\t\tops.push({\n\t\t\tupdateOne: {\n\t\t\t\tfilter: {_id: report._id},\n\t\t\t\tupdate: {\n\t\t\t\t\t$set: {\n\t\t\t\t\t\tcollection_joins: report.collection_joins || [],\n\t\t\t\t\t\tfields_layout: layout\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\tconsole.log(`Backfilled ${ops.length} report layouts`);\n\n\tif (ops.length) {\n\t\tawait ReportBuilderReports.bulkWrite(ops, {ordered: false}, false, true, true, true);\n\t}\n}\n\nfunction buildCollectionKeys(report: any): string[] {\n\tconst keys: string[] = [];\n\n\tif (report.collection_root) {\n\t\tkeys.push(report.collection_root);\n\t}\n\n\t(report.collection_joins || []).forEach(join => {\n\t\tif (!join) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst alias = (join.alias || '').trim();\n\t\tif (alias && !keys.includes(alias)) {\n\t\t\tkeys.push(alias);\n\t\t}\n\t\telse if (join.collection && !keys.includes(join.collection)) {\n\t\t\tkeys.push(join.collection);\n\t\t}\n\t});\n\n\treturn keys.length ? keys : ['root'];\n}\n"]}
package/methods/pdf.js CHANGED
@@ -81,6 +81,7 @@ var puppeteer = require("puppeteer");
81
81
  var simpl_schema_1 = require("simpl-schema");
82
82
  var flag_collection_1 = require("../collections/flag.collection");
83
83
  var common_1 = require("../util/common");
84
+ var chrome_cleaner_1 = require("../util/chrome-cleaner");
84
85
  var PUPPETEER_ARGS = [
85
86
  '--disable-dev-shm-usage',
86
87
  '--no-sandbox',
@@ -159,42 +160,61 @@ function applyLowResourceLaunchTweaks(options) {
159
160
  });
160
161
  return __assign(__assign({}, options), { args: mergedArgs, ignoreDefaultArgs: undefined, env: sanitizeLaunchEnv(options.env) });
161
162
  }
162
- function safeCloseBrowser(browser) {
163
+ function safeCloseBrowser(browser, browserPid, meta) {
163
164
  return __awaiter(this, void 0, void 0, function () {
164
- var _a, proc;
165
- return __generator(this, function (_b) {
166
- switch (_b.label) {
165
+ var proc, closeTimedOut, closeTimeout, errClose_1;
166
+ return __generator(this, function (_a) {
167
+ switch (_a.label) {
167
168
  case 0:
168
169
  if (!browser) {
169
170
  return [2 /*return*/];
170
171
  }
171
- _b.label = 1;
172
+ proc = null;
173
+ try {
174
+ proc = typeof browser.process === 'function' ? browser.process() : null;
175
+ }
176
+ catch (_b) {
177
+ proc = null;
178
+ }
179
+ if (!browserPid && proc && proc.pid) {
180
+ browserPid = proc.pid;
181
+ }
182
+ closeTimedOut = false;
183
+ closeTimeout = setTimeout(function () {
184
+ closeTimedOut = true;
185
+ }, 5000);
186
+ _a.label = 1;
172
187
  case 1:
173
- _b.trys.push([1, 3, , 4]);
188
+ _a.trys.push([1, 3, 4, 5]);
174
189
  return [4 /*yield*/, browser.close()];
175
190
  case 2:
176
- _b.sent();
177
- return [3 /*break*/, 4];
191
+ _a.sent();
192
+ return [3 /*break*/, 5];
178
193
  case 3:
179
- _a = _b.sent();
180
- try {
181
- proc = typeof browser.process === 'function' ? browser.process() : null;
182
- if (proc && !proc.killed) {
183
- proc.kill('SIGKILL');
184
- }
194
+ errClose_1 = _a.sent();
195
+ console.error(new Date(), 'Puppeteer close failed, forcing kill', { jobId: meta && meta.jobId, attempt: meta && meta.attempt, pid: browserPid }, errClose_1 && errClose_1.message ? errClose_1.message : errClose_1);
196
+ return [3 /*break*/, 5];
197
+ case 4:
198
+ clearTimeout(closeTimeout);
199
+ if (browserPid) {
200
+ (0, chrome_cleaner_1.killChromePid)(browserPid, closeTimedOut ? 'browser-close-timeout' : 'browser-close');
201
+ console.log(new Date(), 'Puppeteer browser closed', {
202
+ jobId: meta && meta.jobId,
203
+ attempt: meta && meta.attempt,
204
+ pid: browserPid,
205
+ closeTimedOut: closeTimedOut,
206
+ durationMs: meta && meta.startedAt ? Date.now() - meta.startedAt : undefined
207
+ });
185
208
  }
186
- catch (errKill) {
187
- console.error(new Date(), 'Failed to kill Puppeteer process', errKill);
188
- }
189
- return [3 /*break*/, 4];
190
- case 4: return [2 /*return*/];
209
+ return [7 /*endfinally*/];
210
+ case 5: return [2 /*return*/];
191
211
  }
192
212
  });
193
213
  });
194
214
  }
195
215
  function launchPDFBrowser(headless, devtools) {
196
216
  return __awaiter(this, void 0, void 0, function () {
197
- var envExecutablePath, launchOptions, errLaunch_1, fallbackExecutablePath, retryOptions;
217
+ var envExecutablePath, launchOptions, browser, proc, pid, errLaunch_1, fallbackExecutablePath, retryOptions, browser, proc, pid;
198
218
  return __generator(this, function (_a) {
199
219
  switch (_a.label) {
200
220
  case 0:
@@ -216,7 +236,12 @@ function launchPDFBrowser(headless, devtools) {
216
236
  case 1:
217
237
  _a.trys.push([1, 3, , 5]);
218
238
  return [4 /*yield*/, puppeteer.launch(launchOptions)];
219
- case 2: return [2 /*return*/, _a.sent()];
239
+ case 2:
240
+ browser = _a.sent();
241
+ proc = typeof browser.process === 'function' ? browser.process() : null;
242
+ pid = proc && proc.pid ? proc.pid : undefined;
243
+ (0, chrome_cleaner_1.trackChromePid)(pid);
244
+ return [2 /*return*/, { browser: browser, pid: pid }];
220
245
  case 3:
221
246
  errLaunch_1 = _a.sent();
222
247
  if (!shouldRetryBrowserLaunch(errLaunch_1)) {
@@ -229,7 +254,12 @@ function launchPDFBrowser(headless, devtools) {
229
254
  }
230
255
  console.warn(new Date(), 'Retrying Puppeteer launch with low-resource args');
231
256
  return [4 /*yield*/, puppeteer.launch(retryOptions)];
232
- case 4: return [2 /*return*/, _a.sent()];
257
+ case 4:
258
+ browser = _a.sent();
259
+ proc = typeof browser.process === 'function' ? browser.process() : null;
260
+ pid = proc && proc.pid ? proc.pid : undefined;
261
+ (0, chrome_cleaner_1.trackChromePid)(pid);
262
+ return [2 /*return*/, { browser: browser, pid: pid }];
233
263
  case 5: return [2 /*return*/];
234
264
  }
235
265
  });
@@ -269,7 +299,7 @@ function loadPDFMethods(methodManager) {
269
299
  }),
270
300
  function: function (html_1, fileName_1) {
271
301
  return __awaiter(this, arguments, void 0, function (html, fileName, orientation, fontSize, upload, uploadFileOrder, uploadFileType) {
272
- var enableDebugFlag, enableDebug, maxAttempts, lastError, attempt, browser, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_1;
302
+ var enableDebugFlag, enableDebug, maxAttempts, lastError, jobId, attempt, browser, browserPid, attemptStarted, launchResult, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_1;
273
303
  if (orientation === void 0) { orientation = 'portrait'; }
274
304
  if (fontSize === void 0) { fontSize = '12px'; }
275
305
  if (upload === void 0) { upload = false; }
@@ -283,17 +313,24 @@ function loadPDFMethods(methodManager) {
283
313
  enableDebug = !!(enableDebugFlag && enableDebugFlag.value);
284
314
  maxAttempts = 2;
285
315
  lastError = null;
316
+ jobId = (0, common_1.objectIdHexString)();
286
317
  attempt = 1;
287
318
  _a.label = 2;
288
319
  case 2:
289
- if (!(attempt <= maxAttempts)) return [3 /*break*/, 19];
320
+ if (!(attempt <= maxAttempts)) return [3 /*break*/, 20];
290
321
  browser = null;
322
+ browserPid = null;
323
+ attemptStarted = Date.now();
291
324
  _a.label = 3;
292
325
  case 3:
293
- _a.trys.push([3, 13, 16, 18]);
326
+ _a.trys.push([3, 14, 17, 19]);
327
+ console.log(new Date(), 'PDF launch start', { jobId: jobId, attempt: attempt, headless: !enableDebug });
294
328
  return [4 /*yield*/, launchPDFBrowser(!enableDebug, enableDebug)];
295
329
  case 4:
296
- browser = _a.sent();
330
+ launchResult = _a.sent();
331
+ browser = launchResult.browser;
332
+ browserPid = launchResult.pid;
333
+ console.log(new Date(), 'PDF launch success', { jobId: jobId, attempt: attempt, pid: browserPid });
297
334
  return [4 /*yield*/, browser.newPage()];
298
335
  case 5:
299
336
  page = _a.sent();
@@ -340,17 +377,20 @@ function loadPDFMethods(methodManager) {
340
377
  })];
341
378
  case 8:
342
379
  _a.sent();
343
- if (!(enableDebugFlag && enableDebugFlag.value)) return [3 /*break*/, 12];
344
- if (!(orientation === 'landscape')) return [3 /*break*/, 10];
345
- return [4 /*yield*/, page.setViewport({ width: 1100, height: 850 })];
380
+ return [4 /*yield*/, page.close()];
346
381
  case 9:
347
382
  _a.sent();
348
- return [3 /*break*/, 12];
349
- case 10: return [4 /*yield*/, page.setViewport({ width: 850, height: 1100 })];
350
- case 11:
383
+ if (!(enableDebugFlag && enableDebugFlag.value)) return [3 /*break*/, 13];
384
+ if (!(orientation === 'landscape')) return [3 /*break*/, 11];
385
+ return [4 /*yield*/, page.setViewport({ width: 1100, height: 850 })];
386
+ case 10:
351
387
  _a.sent();
352
- _a.label = 12;
388
+ return [3 /*break*/, 13];
389
+ case 11: return [4 /*yield*/, page.setViewport({ width: 850, height: 1100 })];
353
390
  case 12:
391
+ _a.sent();
392
+ _a.label = 13;
393
+ case 13:
354
394
  if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
355
395
  try {
356
396
  data = fs.readFileSync(path.join(__dirname, (tmpFileName)));
@@ -372,32 +412,34 @@ function loadPDFMethods(methodManager) {
372
412
  console.log('No tmp file ', tmpFileName);
373
413
  throw new Error('Error in Generate PDF: No tmp file');
374
414
  }
375
- return [3 /*break*/, 18];
376
- case 13:
415
+ return [3 /*break*/, 19];
416
+ case 14:
377
417
  err_1 = _a.sent();
378
418
  lastError = err_1;
379
- if (!browser) return [3 /*break*/, 15];
419
+ console.error(new Date(), 'generatePDF attempt error', { jobId: jobId, attempt: attempt, pid: browserPid }, err_1 && err_1.message ? err_1.message : err_1);
420
+ if (!browser) return [3 /*break*/, 16];
380
421
  // eslint-disable-next-line no-restricted-syntax
381
422
  return [4 /*yield*/, browser.close().catch(function () { })];
382
- case 14:
423
+ case 15:
383
424
  // eslint-disable-next-line no-restricted-syntax
384
425
  _a.sent();
385
- _a.label = 15;
386
- case 15:
426
+ _a.label = 16;
427
+ case 16:
387
428
  if (err_1 && err_1.message && err_1.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
388
429
  console.warn(new Date(), 'Retry generatePDF after detached frame', { attempt: attempt });
389
- return [3 /*break*/, 18];
430
+ return [3 /*break*/, 19];
390
431
  }
391
432
  throw err_1;
392
- case 16: return [4 /*yield*/, safeCloseBrowser(browser)];
393
- case 17:
433
+ case 17: return [4 /*yield*/, safeCloseBrowser(browser, browserPid, { jobId: jobId, attempt: attempt, startedAt: attemptStarted })];
434
+ case 18:
394
435
  _a.sent();
395
436
  browser = null;
437
+ browserPid = null;
396
438
  return [7 /*endfinally*/];
397
- case 18:
439
+ case 19:
398
440
  attempt++;
399
441
  return [3 /*break*/, 2];
400
- case 19: throw lastError;
442
+ case 20: throw lastError;
401
443
  }
402
444
  });
403
445
  });
@@ -437,7 +479,7 @@ function loadPDFMethods(methodManager) {
437
479
  }),
438
480
  function: function (html_1, fileName_1) {
439
481
  return __awaiter(this, arguments, void 0, function (html, fileName, orientation, fontSize, upload, uploadFileOrder, uploadFileType) {
440
- var maxAttempts, lastError, attempt, browser, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_2;
482
+ var maxAttempts, lastError, jobId, attempt, browser, browserPid, attemptStarted, launchResult, page, pathToFont, dejavuserif_woff, dejavuserifBold_woff, dejavuserifItalic_woff, dejavuserifBoldItalic_woff, content, tmpFileName, data, fileData, err_2;
441
483
  if (orientation === void 0) { orientation = 'portrait'; }
442
484
  if (fontSize === void 0) { fontSize = '12px'; }
443
485
  if (upload === void 0) { upload = false; }
@@ -448,17 +490,24 @@ function loadPDFMethods(methodManager) {
448
490
  case 0:
449
491
  maxAttempts = 2;
450
492
  lastError = null;
493
+ jobId = (0, common_1.objectIdHexString)();
451
494
  attempt = 1;
452
495
  _a.label = 1;
453
496
  case 1:
454
- if (!(attempt <= maxAttempts)) return [3 /*break*/, 14];
497
+ if (!(attempt <= maxAttempts)) return [3 /*break*/, 15];
455
498
  browser = null;
499
+ browserPid = null;
500
+ attemptStarted = Date.now();
456
501
  _a.label = 2;
457
502
  case 2:
458
- _a.trys.push([2, 8, 11, 13]);
503
+ _a.trys.push([2, 9, 12, 14]);
504
+ console.log(new Date(), 'PDF launch start', { jobId: jobId, attempt: attempt, headless: true });
459
505
  return [4 /*yield*/, launchPDFBrowser(true, false)];
460
506
  case 3:
461
- browser = _a.sent();
507
+ launchResult = _a.sent();
508
+ browser = launchResult.browser;
509
+ browserPid = launchResult.pid;
510
+ console.log(new Date(), 'PDF launch success', { jobId: jobId, attempt: attempt, pid: browserPid });
462
511
  return [4 /*yield*/, browser.newPage()];
463
512
  case 4:
464
513
  page = _a.sent();
@@ -504,6 +553,9 @@ function loadPDFMethods(methodManager) {
504
553
  timeout: 0
505
554
  })];
506
555
  case 7:
556
+ _a.sent();
557
+ return [4 /*yield*/, page.close()];
558
+ case 8:
507
559
  _a.sent();
508
560
  if (fs.existsSync(path.join(__dirname, (tmpFileName)))) {
509
561
  try {
@@ -526,32 +578,34 @@ function loadPDFMethods(methodManager) {
526
578
  console.log('No tmp file ', tmpFileName);
527
579
  throw new Error('Error in Generate PDF No Page Number: No tmp file');
528
580
  }
529
- return [3 /*break*/, 13];
530
- case 8:
581
+ return [3 /*break*/, 14];
582
+ case 9:
531
583
  err_2 = _a.sent();
532
584
  lastError = err_2;
533
- if (!browser) return [3 /*break*/, 10];
585
+ console.error(new Date(), 'generatePDFNoPageNumber attempt error', { jobId: jobId, attempt: attempt, pid: browserPid }, err_2 && err_2.message ? err_2.message : err_2);
586
+ if (!browser) return [3 /*break*/, 11];
534
587
  // eslint-disable-next-line no-restricted-syntax
535
588
  return [4 /*yield*/, browser.close().catch(function () { })];
536
- case 9:
589
+ case 10:
537
590
  // eslint-disable-next-line no-restricted-syntax
538
591
  _a.sent();
539
- _a.label = 10;
540
- case 10:
592
+ _a.label = 11;
593
+ case 11:
541
594
  if (err_2 && err_2.message && err_2.message.includes('Navigating frame was detached') && attempt < maxAttempts) {
542
595
  console.warn(new Date(), 'Retry generatePDFNoPageNumber after detached frame', { attempt: attempt });
543
- return [3 /*break*/, 13];
596
+ return [3 /*break*/, 14];
544
597
  }
545
598
  throw err_2;
546
- case 11: return [4 /*yield*/, safeCloseBrowser(browser)];
547
- case 12:
599
+ case 12: return [4 /*yield*/, safeCloseBrowser(browser, browserPid, { jobId: jobId, attempt: attempt, startedAt: attemptStarted })];
600
+ case 13:
548
601
  _a.sent();
549
602
  browser = null;
603
+ browserPid = null;
550
604
  return [7 /*endfinally*/];
551
- case 13:
605
+ case 14:
552
606
  attempt++;
553
607
  return [3 /*break*/, 1];
554
- case 14: throw lastError;
608
+ case 15: throw lastError;
555
609
  }
556
610
  });
557
611
  });