@browserless/function 10.12.1 → 10.12.6

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/package.json CHANGED
@@ -2,7 +2,7 @@
2
2
  "name": "@browserless/function",
3
3
  "description": "Execute arbitrary JavaScript code in a secure browser sandbox with access to page DOM and network.",
4
4
  "homepage": "https://browserless.js.org",
5
- "version": "10.12.1",
5
+ "version": "10.12.6",
6
6
  "main": "src/index.js",
7
7
  "author": {
8
8
  "email": "hello@microlink.io",
@@ -31,12 +31,12 @@
31
31
  "vm"
32
32
  ],
33
33
  "dependencies": {
34
- "@browserless/errors": "^10.12.1",
35
- "isolated-function": "~0.1.49",
34
+ "@browserless/errors": "^10.12.6",
35
+ "isolated-function": "~0.1.51",
36
36
  "require-one-of": "~1.0.24"
37
37
  },
38
38
  "devDependencies": {
39
- "@browserless/test": "^10.11.4",
39
+ "@browserless/test": "^10.12.6",
40
40
  "acorn": "~8.16.0",
41
41
  "acorn-walk": "~8.3.5",
42
42
  "ava": "5",
@@ -57,5 +57,5 @@
57
57
  "timeout": "2m",
58
58
  "workerThreads": false
59
59
  },
60
- "gitHead": "04b12b821bc166e1d40ad31013c2ea99e85c3d00"
60
+ "gitHead": "5d4aaa106be3e196f5bfb1b52fc3d712ba9d512c"
61
61
  }
package/src/index.js CHANGED
@@ -6,6 +6,18 @@ const runFunction = require('./function')
6
6
 
7
7
  const stringify = fn => fn.toString().trim().replace(/;$/, '')
8
8
 
9
+ const serializeResponse = response => ({
10
+ status: response.status(),
11
+ statusText: response.statusText(),
12
+ url: response.url(),
13
+ ok: response.ok(),
14
+ headers: response.headers(),
15
+ remoteAddress: response.remoteAddress(),
16
+ timing: response.timing(),
17
+ fromCache: response.fromCache(),
18
+ fromServiceWorker: response.fromServiceWorker()
19
+ })
20
+
9
21
  module.exports = (
10
22
  fn,
11
23
  {
@@ -36,14 +48,15 @@ module.exports = (
36
48
  const browserless = await browser.createContext()
37
49
 
38
50
  return browserless.withPage((page, goto) => async () => {
39
- const { device } = await goto(page, { url, timeout, ...gotoOpts })
51
+ const { device, response } = await goto(page, { url, timeout, ...gotoOpts })
40
52
 
41
53
  const runFunctionOpts = {
42
54
  url,
43
55
  code,
44
56
  device,
45
57
  ...opts,
46
- ...fnOpts
58
+ ...fnOpts,
59
+ ...(response && { _response: serializeResponse(response) })
47
60
  }
48
61
 
49
62
  if (runFunctionOpts.code === code) {
package/src/template.js CHANGED
@@ -29,16 +29,30 @@ const isUsingPage = code => {
29
29
  return result
30
30
  }
31
31
 
32
+ // _response is a plain JSON object serialized via isolated-function;
33
+ // wrap each value as a method to match Puppeteer's HTTPResponse API
34
+ const withResponse = `
35
+ const { _response: _r, ...rest } = opts
36
+ const response = _r
37
+ ? Object.fromEntries(Object.entries(_r).map(([k, v]) => [k, () => v]))
38
+ : undefined`
39
+
32
40
  const template = (code, usesPage = isUsingPage(code)) => {
33
- if (!usesPage) return `async (url, _, opts) => (${code})(opts)`
41
+ if (!usesPage) {
42
+ return `async (url, _, opts) => {
43
+ ${withResponse}
44
+ return (${code})({ response, ...rest })
45
+ }`
46
+ }
34
47
  return `
35
48
  async (url, browserWSEndpoint, opts) => {
49
+ ${withResponse}
36
50
  const puppeteer = require('@cloudflare/puppeteer')
37
51
  const browser = await puppeteer.connect({ browserWSEndpoint })
38
52
  const pages = await browser.pages()
39
53
  const page = pages[pages.length - 1]
40
54
  try {
41
- return await (${code})({ page, ...opts })
55
+ return await (${code})({ page, response, ...rest })
42
56
  } finally {
43
57
  await browser.disconnect()
44
58
  }