From 036cc743b588d05f82529fa49461c7a28f545643 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Thu, 20 Jul 2023 00:28:24 +0200 Subject: [PATCH] refactor: better cancel chaining --- package.json | 6 ++++-- src/index.js | 49 +++++++++++++++++++++++++++++-------------------- test/index.js | 13 ++++++++----- 3 files changed, 41 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 484ec30..17bf212 100644 --- a/package.json +++ b/package.json @@ -98,7 +98,8 @@ "test/**/*.js", "!test/util.js" ], - "timeout": "2m" + "timeout": "2m", + "workerThreads": false }, "commitlint": { "extends": [ @@ -107,7 +108,8 @@ }, "nano-staged": { "*.js": [ - "prettier-standard" + "prettier-standard", + "standard --fix" ], "*.md": [ "standard-markdown" diff --git a/src/index.js b/src/index.js index 8983b93..a956b89 100644 --- a/src/index.js +++ b/src/index.js @@ -152,24 +152,32 @@ const determinateMode = (url, { prerender }) => { return isFetchMode(url) ? 'fetch' : 'prerender' } -const getContent = async ( - url, - mode, - { getBrowserless, gotOpts, headers, puppeteerOpts, rewriteUrls, toEncode } -) => { - const isFetchMode = mode === 'fetch' - const fetchOpts = isFetchMode - ? { headers, toEncode, ...gotOpts } - : { headers, toEncode, getBrowserless, gotOpts, ...puppeteerOpts } - const content = await modes[mode](url, fetchOpts) - - const html = addHtml({ - ...content, - ...(isFetchMode ? puppeteerOpts : undefined), - rewriteUrls - }) - return { ...content, html } -} +const getContent = PCancelable.fn( + ( + url, + mode, + { getBrowserless, gotOpts, headers, puppeteerOpts, rewriteUrls, toEncode }, + onCancel + ) => { + const isFetchMode = mode === 'fetch' + const fetchOpts = isFetchMode + ? { headers, toEncode, ...gotOpts } + : { headers, toEncode, getBrowserless, gotOpts, ...puppeteerOpts } + + const promise = modes[mode](url, fetchOpts) + onCancel(() => promise.cancel()) + + return promise.then(content => { + const html = addHtml({ + ...content, + ...(isFetchMode ? puppeteerOpts : undefined), + rewriteUrls + }) + + return { ...content, html } + }) + } +) module.exports = PCancelable.fn( async ( @@ -206,14 +214,15 @@ module.exports = PCancelable.fn( toEncode }) - onCancel(() => promise.onCancel()) + onCancel(() => promise.cancel()) const { mode, ...payload } = await promise - return { ...payload, stats: { mode, timing: time.rounded() } } + return Object.assign(payload, { stats: { mode, timing: time.rounded() } }) } ) module.exports.REQ_TIMEOUT = REQ_TIMEOUT module.exports.ABORT_TYPES = ABORT_TYPES module.exports.isFetchMode = isFetchMode +module.exports.getContent = getContent diff --git a/test/index.js b/test/index.js index 03d76dc..d6fb04e 100644 --- a/test/index.js +++ b/test/index.js @@ -1,5 +1,6 @@ 'use strict' +const PCancelable = require('p-cancelable') const cheerio = require('cheerio') const test = require('ava') @@ -12,11 +13,13 @@ const wait = async (promise, prop) => { } test('promise is cancelable', async t => { - const targetUrl = 'https://example.com' - const promise = getHTML(targetUrl, { getBrowserless }) - promise.catch(() => {}) - t.is(!!promise.cancel, true) - promise.cancel() + const url = 'https://example.com' + t.true(getHTML(url, { getBrowserless: () => {} }) instanceof PCancelable) + t.true( + getHTML.getContent(url, 'fetch', { + getBrowserless: () => {} + }) instanceof PCancelable + ) }) test('reachable URL', async t => {