Skip to content

Commit

Permalink
Cleanup puppeteer dev profiles on exit. Resolves #396
Browse files Browse the repository at this point in the history
  • Loading branch information
claabs committed Sep 9, 2024
1 parent 780c6fd commit aaabff8
Show file tree
Hide file tree
Showing 2 changed files with 20 additions and 4 deletions.
18 changes: 16 additions & 2 deletions src/common/puppeteer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import StealthPlugin from 'puppeteer-extra-plugin-stealth';
import { Logger } from 'pino';
import pTimeout, { TimeoutError } from 'p-timeout';
import psList from 'ps-list';
import os from 'node:os';
import fs from 'node:fs/promises';
import fsx from 'fs-extra/esm';
import path from 'node:path';

import { ETCCookie, ToughCookieFileStore } from './cookie.js';
import { config } from './config/index.js';
Expand All @@ -19,8 +23,8 @@ export default puppeteer;
export function toughCookieFileStoreToPuppeteerCookie(tcfs: ToughCookieFileStore): CookieParam[] {
const puppetCookies: CookieParam[] = [];
Object.values(tcfs).forEach((domain) => {
Object.values(domain).forEach((path) => {
Object.values(path).forEach((tcfsCookie) => {
Object.values(domain).forEach((urlPath) => {
Object.values(urlPath).forEach((tcfsCookie) => {
puppetCookies.push({
name: tcfsCookie.key,
value: tcfsCookie.value,
Expand Down Expand Up @@ -129,6 +133,16 @@ export const killBrowserProcesses = async (L: Logger) => {
browserProcesses.forEach((p) => process.kill(p.pid));
};

export const cleanupDevProfiles = async (L: Logger) => {
if (!getCommitSha()) return; // Don't clear if not in docker
const tempDir = os.tmpdir();
const profileMatcher = /^puppeteer_dev_profile-\w+$/;
const tempFiles = await fs.readdir(tempDir);
const devProfiles = tempFiles.filter((file) => profileMatcher.test(file));
L.debug({ devProfiles }, 'Deleting temp puppeteer dev profile folders');
await Promise.all([devProfiles.map((file) => fsx.remove(path.join(tempDir, file)))]);
};

/**
* Create a new page within a wrapper that will retry if it hangs for 30 seconds
*/
Expand Down
6 changes: 4 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import logger from './common/logger.js';
import { sendNotification, testNotifiers } from './notify.js';
import { checkForUpdate, logVersionOnError } from './version.js';
import PuppetLogin from './puppet/login.js';
import { killBrowserProcesses, safeLaunchBrowser } from './common/puppeteer.js';
import { cleanupDevProfiles, killBrowserProcesses, safeLaunchBrowser } from './common/puppeteer.js';
import PuppetFreeGames from './puppet/free-games.js';
import { createServer } from './common/server.js';
import { convertImportCookies } from './common/cookie.js';
Expand Down Expand Up @@ -85,14 +85,16 @@ export async function main(): Promise<void> {
await Promise.all(accountPromises);
server.close();
await killBrowserProcesses(logger);
await cleanupDevProfiles(logger);
logger.info('Exiting successfully');
exit(0); // For some reason, puppeteer will keep a zombie promise alive and stop Node from exiting
}
}

main().catch(async (err) => {
logger.error(err);
await killBrowserProcesses(logger);
logVersionOnError();
await killBrowserProcesses(logger);
await cleanupDevProfiles(logger);
exit(1);
});

0 comments on commit aaabff8

Please sign in to comment.