smartssr/ts/smartssr.classes.smartssr.ts
2020-08-06 15:17:01 +00:00

93 lines
2.5 KiB
TypeScript

import * as plugins from './smartssr.plugins';
import * as paths from './smartssr.paths';
import { serializeFunction } from './smartssr.function.serialize';
export interface ISmartSSROptions {
debug: boolean;
}
/**
*
*/
export class SmartSSR {
public browser: plugins.smartpuppeteer.puppeteer.Browser;
public options: ISmartSSROptions;
constructor(optionsArg?: ISmartSSROptions) {
this.options = {
...{
debug: false,
},
...optionsArg,
};
}
public async start() {
this.browser = await plugins.smartpuppeteer.getEnvAwareBrowserInstance();
}
public async stop() {
if (this.browser) {
await plugins.smartdelay.delayFor(3000);
await this.browser.close();
this.browser = null;
} else {
console.log('browser was not in started mode');
}
}
public async renderPage(urlArg: string) {
const overallTimeMeasurement = new plugins.smarttime.HrtMeasurement();
overallTimeMeasurement.start();
const resultDeferred = plugins.smartpromise.defer<string>();
const context = await this.browser.createIncognitoBrowserContext();
const page = await context.newPage();
page.on('console', (msg) => {
console.log(`${urlArg}: ${msg.text()}`);
});
page.on('load', async (...args) => {
await plugins.smartdelay.delayFor(5000);
let screenshotBuffer: Buffer;
if (this.options.debug) {
screenshotBuffer = await page.screenshot({
encoding: 'binary',
});
}
await page.$eval('body', serializeFunction);
const pageContent = await page.content();
const renderedPageString = pageContent;
resultDeferred.resolve(renderedPageString);
if (this.options.debug) {
plugins.smartfile.memory.toFsSync(
renderedPageString,
plugins.path.join(paths.noGitDir, 'test.html')
);
const fs = await import('fs');
fs.writeFileSync(plugins.path.join(paths.noGitDir, 'test.png'), screenshotBuffer);
}
});
const renderTimeMeasurement = new plugins.smarttime.HrtMeasurement();
renderTimeMeasurement.start();
await page.goto(urlArg);
const result = await resultDeferred.promise;
renderTimeMeasurement.stop();
// lets clean up async
context.close();
overallTimeMeasurement.stop();
console.log(
`Overall it took ${overallTimeMeasurement.milliSeconds} milliseconds to render ${urlArg}`
);
console.log(
`The rendering alone took ${renderTimeMeasurement.milliSeconds} milliseconds for ${urlArg}`
);
return result;
}
}