grover 1.1.9 → 1.1.11
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.
- checksums.yaml +4 -4
 - data/lib/grover/errors.rb +12 -0
 - data/lib/grover/js/processor.cjs +50 -21
 - data/lib/grover/options_fixer.rb +2 -1
 - data/lib/grover/processor.rb +2 -2
 - data/lib/grover/utils.rb +2 -1
 - data/lib/grover/version.rb +1 -1
 - metadata +2 -2
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 07f9183a814d7d598e29ee39cc4d7af3df619ba262aa1bef5be2de0cd9e7da3c
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 368d618c68428ff2f02832962463532a305ca48a2d6b8956dd978a80dc375052
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 0deb217329f6141c3a7ed3da596945aa79213ca2216dbc914bb6b1e17104283bff1f8f45057f4fa099689fd8295560f9e0e2d023fa0e93551599a447649dace2
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: 6e9b91209b59e8bc91ef38aa42906468c2b79614950f6d9e345d002468248519a633b69cbaeb4e6ad6e520e5f8acafa2356e084c1b167ac7717c344a287bcd72
         
     | 
    
        data/lib/grover/errors.rb
    CHANGED
    
    | 
         @@ -11,6 +11,18 @@ class Grover 
     | 
|
| 
       11 
11 
     | 
    
         
             
              module JavaScript # rubocop:disable Style/Documentation
         
     | 
| 
       12 
12 
     | 
    
         
             
                Error = Class.new(::Grover::Error)
         
     | 
| 
       13 
13 
     | 
    
         
             
                UnknownError = Class.new(Error)
         
     | 
| 
      
 14 
     | 
    
         
            +
             
     | 
| 
      
 15 
     | 
    
         
            +
                ErrorWithDetails = Class.new(Error) do
         
     | 
| 
      
 16 
     | 
    
         
            +
                  def initialize(name, error_details)
         
     | 
| 
      
 17 
     | 
    
         
            +
                    super(name)
         
     | 
| 
      
 18 
     | 
    
         
            +
                    @error_details = Grover::Utils.deep_transform_keys_in_object error_details, &:to_sym
         
     | 
| 
      
 19 
     | 
    
         
            +
                  end
         
     | 
| 
      
 20 
     | 
    
         
            +
             
     | 
| 
      
 21 
     | 
    
         
            +
                  attr_reader :error_details
         
     | 
| 
      
 22 
     | 
    
         
            +
                end
         
     | 
| 
      
 23 
     | 
    
         
            +
                RequestFailedError = Class.new(ErrorWithDetails)
         
     | 
| 
      
 24 
     | 
    
         
            +
                PageRenderError = Class.new(ErrorWithDetails)
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       14 
26 
     | 
    
         
             
                def self.const_missing(name)
         
     | 
| 
       15 
27 
     | 
    
         
             
                  const_set name, Class.new(Error)
         
     | 
| 
       16 
28 
     | 
    
         
             
                end
         
     | 
    
        data/lib/grover/js/processor.cjs
    CHANGED
    
    | 
         @@ -26,8 +26,32 @@ const fs = require('fs'); 
     | 
|
| 
       26 
26 
     | 
    
         
             
            const os = require('os');
         
     | 
| 
       27 
27 
     | 
    
         
             
            const path = require('path');
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
      
 29 
     | 
    
         
            +
            function GroverError(name, errors) {
         
     | 
| 
      
 30 
     | 
    
         
            +
              this.name = name;
         
     | 
| 
      
 31 
     | 
    
         
            +
              this.message = errors.map(e => e.message).join("\n");
         
     | 
| 
      
 32 
     | 
    
         
            +
              this.errors = errors;
         
     | 
| 
      
 33 
     | 
    
         
            +
            }
         
     | 
| 
      
 34 
     | 
    
         
            +
            GroverError.prototype = Error.prototype;
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
       29 
36 
     | 
    
         
             
            const _processPage = (async (convertAction, uriOrHtml, options) => {
         
     | 
| 
       30 
     | 
    
         
            -
              let browser, page,  
     | 
| 
      
 37 
     | 
    
         
            +
              let browser, page, tmpDir, wsConnection = false;
         
     | 
| 
      
 38 
     | 
    
         
            +
              const requestErrors = [], pageErrors = [];
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
              const captureRequestError = (request) => {
         
     | 
| 
      
 41 
     | 
    
         
            +
                const requestError = { url: request.url() };
         
     | 
| 
      
 42 
     | 
    
         
            +
             
     | 
| 
      
 43 
     | 
    
         
            +
                if (request.failure()) {
         
     | 
| 
      
 44 
     | 
    
         
            +
                  requestError.reason = request.failure().errorText;
         
     | 
| 
      
 45 
     | 
    
         
            +
                  requestError.message = requestError.reason + " at " + requestError.url;
         
     | 
| 
      
 46 
     | 
    
         
            +
                } else if (request.response() && request.response().status()) {
         
     | 
| 
      
 47 
     | 
    
         
            +
                  requestError.status = request.response().status();
         
     | 
| 
      
 48 
     | 
    
         
            +
                  requestError.message = requestError.status + " " + requestError.url;
         
     | 
| 
      
 49 
     | 
    
         
            +
                } else {
         
     | 
| 
      
 50 
     | 
    
         
            +
                  requestError.message = "UnknownError " + requestError.url;
         
     | 
| 
      
 51 
     | 
    
         
            +
                }
         
     | 
| 
      
 52 
     | 
    
         
            +
             
     | 
| 
      
 53 
     | 
    
         
            +
                requestErrors.push(requestError);
         
     | 
| 
      
 54 
     | 
    
         
            +
              };
         
     | 
| 
       31 
55 
     | 
    
         | 
| 
       32 
56 
     | 
    
         
             
              try {
         
     | 
| 
       33 
57 
     | 
    
         
             
                // Configure puppeteer debugging options
         
     | 
| 
         @@ -163,12 +187,24 @@ const _processPage = (async (convertAction, uriOrHtml, options) => { 
     | 
|
| 
       163 
187 
     | 
    
         
             
                const raiseOnRequestFailure = options.raiseOnRequestFailure; delete options.raiseOnRequestFailure;
         
     | 
| 
       164 
188 
     | 
    
         
             
                if (raiseOnRequestFailure) {
         
     | 
| 
       165 
189 
     | 
    
         
             
                  page.on('requestfinished', (request) => {
         
     | 
| 
       166 
     | 
    
         
            -
                    if (request.response() && 
     | 
| 
       167 
     | 
    
         
            -
             
     | 
| 
      
 190 
     | 
    
         
            +
                    if (request.response() &&
         
     | 
| 
      
 191 
     | 
    
         
            +
                        !(request.response().ok() || request.response().status() === 304) &&
         
     | 
| 
      
 192 
     | 
    
         
            +
                        !request.redirectChain().length > 0) {
         
     | 
| 
      
 193 
     | 
    
         
            +
                      captureRequestError(request);
         
     | 
| 
       168 
194 
     | 
    
         
             
                    }
         
     | 
| 
       169 
195 
     | 
    
         
             
                  });
         
     | 
| 
       170 
196 
     | 
    
         
             
                  page.on('requestfailed', (request) => {
         
     | 
| 
       171 
     | 
    
         
            -
                     
     | 
| 
      
 197 
     | 
    
         
            +
                    captureRequestError(request);
         
     | 
| 
      
 198 
     | 
    
         
            +
                  });
         
     | 
| 
      
 199 
     | 
    
         
            +
                }
         
     | 
| 
      
 200 
     | 
    
         
            +
             
     | 
| 
      
 201 
     | 
    
         
            +
                const raiseOnJSError = options.raiseOnJSError; delete options.raiseOnJSError;
         
     | 
| 
      
 202 
     | 
    
         
            +
                if (raiseOnJSError) {
         
     | 
| 
      
 203 
     | 
    
         
            +
                  page.on('pageerror', (error) => {
         
     | 
| 
      
 204 
     | 
    
         
            +
                    pageErrors.push({
         
     | 
| 
      
 205 
     | 
    
         
            +
                      message: error.toString().replace(new RegExp('^' + error.name + ': '), ''),
         
     | 
| 
      
 206 
     | 
    
         
            +
                      type: error.name || 'Error'
         
     | 
| 
      
 207 
     | 
    
         
            +
                    });
         
     | 
| 
       172 
208 
     | 
    
         
             
                  });
         
     | 
| 
       173 
209 
     | 
    
         
             
                }
         
     | 
| 
       174 
210 
     | 
    
         | 
| 
         @@ -257,21 +293,12 @@ const _processPage = (async (convertAction, uriOrHtml, options) => { 
     | 
|
| 
       257 
293 
     | 
    
         
             
                  await page.hover(hoverSelector);
         
     | 
| 
       258 
294 
     | 
    
         
             
                }
         
     | 
| 
       259 
295 
     | 
    
         | 
| 
       260 
     | 
    
         
            -
                if ( 
     | 
| 
       261 
     | 
    
         
            -
                   
     | 
| 
       262 
     | 
    
         
            -
             
     | 
| 
       263 
     | 
    
         
            -
             
     | 
| 
       264 
     | 
    
         
            -
             
     | 
| 
       265 
     | 
    
         
            -
             
     | 
| 
       266 
     | 
    
         
            -
                      } else if (e.response() && e.response().status()) {
         
     | 
| 
       267 
     | 
    
         
            -
                        return e.response().status() + " " + e.url();
         
     | 
| 
       268 
     | 
    
         
            -
                      } else {
         
     | 
| 
       269 
     | 
    
         
            -
                        return "UnknownError " + e.url()
         
     | 
| 
       270 
     | 
    
         
            -
                      }
         
     | 
| 
       271 
     | 
    
         
            -
                    }).join("\n");
         
     | 
| 
       272 
     | 
    
         
            -
                  }
         
     | 
| 
       273 
     | 
    
         
            -
                  RequestFailedError.prototype = Error.prototype;
         
     | 
| 
       274 
     | 
    
         
            -
                  throw new RequestFailedError(errors);
         
     | 
| 
      
 296 
     | 
    
         
            +
                if (requestErrors.length > 0) {
         
     | 
| 
      
 297 
     | 
    
         
            +
                  throw new GroverError("RequestFailedError", requestErrors);
         
     | 
| 
      
 298 
     | 
    
         
            +
                }
         
     | 
| 
      
 299 
     | 
    
         
            +
             
     | 
| 
      
 300 
     | 
    
         
            +
                if (pageErrors.length > 0) {
         
     | 
| 
      
 301 
     | 
    
         
            +
                  throw new GroverError("PageRenderError", pageErrors);
         
     | 
| 
       275 
302 
     | 
    
         
             
                }
         
     | 
| 
       276 
303 
     | 
    
         | 
| 
       277 
304 
     | 
    
         
             
                // Setup conversion timeout
         
     | 
| 
         @@ -282,7 +309,7 @@ const _processPage = (async (convertAction, uriOrHtml, options) => { 
     | 
|
| 
       282 
309 
     | 
    
         | 
| 
       283 
310 
     | 
    
         
             
                // If we're running puppeteer in headless mode, return the converted PDF
         
     | 
| 
       284 
311 
     | 
    
         
             
                if (debug === undefined || (typeof debug === 'object' && (debug.headless === undefined || debug.headless))) {
         
     | 
| 
       285 
     | 
    
         
            -
                  return await page[convertAction](options);
         
     | 
| 
      
 312 
     | 
    
         
            +
                  return Buffer.from(await page[convertAction](options));
         
     | 
| 
       286 
313 
     | 
    
         
             
                }
         
     | 
| 
       287 
314 
     | 
    
         
             
              } finally {
         
     | 
| 
       288 
315 
     | 
    
         
             
                if (browser) {
         
     | 
| 
         @@ -301,7 +328,9 @@ const _processPage = (async (convertAction, uriOrHtml, options) => { 
     | 
|
| 
       301 
328 
     | 
    
         
             
            });
         
     | 
| 
       302 
329 
     | 
    
         | 
| 
       303 
330 
     | 
    
         
             
            function _handleError(error) {
         
     | 
| 
       304 
     | 
    
         
            -
              if (error instanceof  
     | 
| 
      
 331 
     | 
    
         
            +
              if (error instanceof GroverError) {
         
     | 
| 
      
 332 
     | 
    
         
            +
                process.stdout.write(JSON.stringify(['err', error.message, error.name, error.errors]));
         
     | 
| 
      
 333 
     | 
    
         
            +
              } else if (error instanceof Error) {
         
     | 
| 
       305 
334 
     | 
    
         
             
                process.stdout.write(
         
     | 
| 
       306 
335 
     | 
    
         
             
                  JSON.stringify(['err', error.toString().replace(new RegExp('^' + error.name + ': '), ''), error.name])
         
     | 
| 
       307 
336 
     | 
    
         
             
                );
         
     | 
    
        data/lib/grover/options_fixer.rb
    CHANGED
    
    | 
         @@ -34,7 +34,8 @@ class Grover 
     | 
|
| 
       34 
34 
     | 
    
         
             
                def fix_boolean_options!
         
     | 
| 
       35 
35 
     | 
    
         
             
                  fix_options!(
         
     | 
| 
       36 
36 
     | 
    
         
             
                    'display_header_footer', 'full_page', 'landscape', 'omit_background', 'prefer_css_page_size',
         
     | 
| 
       37 
     | 
    
         
            -
                    'print_background', 'viewport.has_touch', 'viewport.is_landscape', 'viewport.is_mobile', 'bypass_csp'
         
     | 
| 
      
 37 
     | 
    
         
            +
                    'print_background', 'viewport.has_touch', 'viewport.is_landscape', 'viewport.is_mobile', 'bypass_csp',
         
     | 
| 
      
 38 
     | 
    
         
            +
                    'raise_on_request_failure', 'raise_on_js_error'
         
     | 
| 
       38 
39 
     | 
    
         
             
                  ) { |value| !FALSE_VALUES.include?(value) }
         
     | 
| 
       39 
40 
     | 
    
         
             
                end
         
     | 
| 
       40 
41 
     | 
    
         | 
    
        data/lib/grover/processor.rb
    CHANGED
    
    | 
         @@ -83,14 +83,14 @@ class Grover 
     | 
|
| 
       83 
83 
     | 
    
         
             
                  input = stdout.gets
         
     | 
| 
       84 
84 
     | 
    
         
             
                  raise Errno::EPIPE, "Can't read from worker" if input.nil?
         
     | 
| 
       85 
85 
     | 
    
         | 
| 
       86 
     | 
    
         
            -
                  status, message, error_class = JSON.parse(input)
         
     | 
| 
      
 86 
     | 
    
         
            +
                  status, message, error_class, errors = JSON.parse(input)
         
     | 
| 
       87 
87 
     | 
    
         | 
| 
       88 
88 
     | 
    
         
             
                  if status == 'ok'
         
     | 
| 
       89 
89 
     | 
    
         
             
                    message
         
     | 
| 
       90 
90 
     | 
    
         
             
                  elsif error_class.nil?
         
     | 
| 
       91 
91 
     | 
    
         
             
                    raise Grover::JavaScript::UnknownError, message
         
     | 
| 
       92 
92 
     | 
    
         
             
                  else
         
     | 
| 
       93 
     | 
    
         
            -
                    raise Grover::JavaScript.const_get(error_class, false),  
     | 
| 
      
 93 
     | 
    
         
            +
                    raise Grover::JavaScript.const_get(error_class, false).new(*[message, errors].compact)
         
     | 
| 
       94 
94 
     | 
    
         
             
                  end
         
     | 
| 
       95 
95 
     | 
    
         
             
                rescue JSON::ParserError
         
     | 
| 
       96 
96 
     | 
    
         
             
                  raise Grover::Error, 'Malformed worker response'
         
     | 
    
        data/lib/grover/utils.rb
    CHANGED
    
    
    
        data/lib/grover/version.rb
    CHANGED
    
    
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: grover
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version: 1.1. 
     | 
| 
      
 4 
     | 
    
         
            +
              version: 1.1.11
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Andrew Bromwich
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire:
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2024- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2024-10-11 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: combine_pdf
         
     |