### Run Clinic.js Doctor with Autocannon Example Source: https://clinicjs.org/documentation/index Clones an example application repository, installs its dependencies, and then runs Clinic.js Doctor with autocannon to profile an app with a known I/O issue. This process automatically launches the Doctor tool in the browser upon completion. ```bash git clone https://github.com/clinicjs/node-clinic-doctor-examples.git ``` ```bash cd node-clinic-doctor-examples ``` ```bash npm install ``` ```bash clinic doctor --autocannon [ / ] -- node ./slow-io ``` -------------------------------- ### Install Clinic.js Source: https://clinicjs.org/documentation/doctor/01-setup Installs the Clinic.js command-line tool globally using npm. ```bash npm install -g clinic ``` -------------------------------- ### Check Bubbleprof installation and help Source: https://clinicjs.org/documentation/bubbleprof/01-setup Verifies the installation of Bubbleprof and displays its help information. ```bash clinic bubbleprof --help ``` -------------------------------- ### Verify Heap Profiler Installation Source: https://clinicjs.org/documentation/heapprofiler/01-setup Checks if the Heap Profiler has been installed correctly by running its help command. This verifies the installation and shows available options. ```bash clinic heapprofiler --help ``` -------------------------------- ### Check Clinic Doctor Installation Source: https://clinicjs.org/documentation/doctor/01-setup Verifies that Clinic Doctor has been installed correctly by displaying its help information. ```bash clinic doctor --help ``` -------------------------------- ### Get Help for Clinic.js Sub-commands Source: https://clinicjs.org/documentation/index Provides detailed help information for specific Clinic.js sub-commands, such as 'doctor', 'bubbleprof', 'clean', 'flame', and 'heapprofiler'. This is useful for understanding the options and usage of each tool. ```bash clinic doctor --help ``` ```bash clinic bubbleprof --help ``` ```bash clinic clean --help ``` ```bash clinic flame --help ``` ```bash clinic heapprofiler --help ``` -------------------------------- ### Verify Flame Installation Source: https://clinicjs.org/documentation/flame/01-setup Checks if the Clinic.js Flame tool is installed correctly by running its help command. This command should display version information and usage instructions. ```bash clinic flame --help ``` -------------------------------- ### Clone Bubbleprof Demo Repository Source: https://clinicjs.org/documentation/bubbleprof/02-getting-ready Clones the official Bubbleprof example repository from GitHub. This repository contains a server designed for profiling async operations and includes instructions for setting up MongoDB with npm data. ```bash git clone https://github.com/clinicjs/node-clinic-bubbleprof-demo.git ``` -------------------------------- ### Install autocannon with npm Source: https://clinicjs.org/documentation/bubbleprof/03-first-analysis Installs the autocannon tool globally using npm. Autocannon is used to send a large number of HTTP requests to the server for performance testing. ```bash npm install -g autocannon ``` -------------------------------- ### Run Bubbleprof on a Node.js script Source: https://clinicjs.org/documentation/bubbleprof/01-setup Starts profiling a Node.js application using Bubbleprof. ```bash clinic bubbleprof -- node server.js ``` -------------------------------- ### Run Clinic.js Flame Profiling Source: https://clinicjs.org/documentation/flame/01-setup Starts profiling a Node.js application using Clinic.js Flame. It analyzes the `server.js` file to identify synchronous bottlenecks and generates a flamegraph visualization. ```bash clinic flame -- node server.js ``` -------------------------------- ### Get Clinic.js help information Source: https://clinicjs.org/documentation/cli/04-reference Displays help text, including example commands and supported flags for Clinic.js or specific tools, using the '--help' or '-h' flag. ```bash clinic --help ``` ```bash clinic -h ``` ```bash clinic doctor --help ``` ```bash clinic doctor -h ``` -------------------------------- ### Visualize Profiling Data Source: https://clinicjs.org/documentation/doctor/01-setup Builds or rebuilds the visualization from collected profiling data. Requires the path to the sample data file. ```bash clinic doctor --visualize-only PID.clinic-doctor-sample ``` -------------------------------- ### Run Clinic.js Flame Analysis Source: https://clinicjs.org/documentation/flame/03-first-analysis Executes a Node.js application with Clinic.js Flame, profiling it under simulated HTTP load generated by autocannon. The --on-port flag ensures autocannon starts after the server is ready, using the dynamically assigned port. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node 1-server-with-slow-function.js ``` -------------------------------- ### Visualize profiling data Source: https://clinicjs.org/documentation/bubbleprof/01-setup Builds or rebuilds the visualization from collected profiling data. Requires the path to the data file. ```bash clinic bubbleprof --visualize-only PID.clinic-bubbleprof-sample ``` -------------------------------- ### Run Heap Profiler on a Node.js Application Source: https://clinicjs.org/documentation/heapprofiler/01-setup Starts the Heap Profiler to analyze a Node.js application. It generates a flamegraph to identify memory leaks. The report automatically opens in a browser upon process exit. ```bash clinic heapprofiler -- node server.js ``` -------------------------------- ### Simulate Load with Autocannon Source: https://clinicjs.org/documentation/heapprofiler/01-setup Profiles a Node.js application while simulating load using the autocannon benchmarking tool. It accepts autocannon configuration via 'subarg' syntax. ```bash clinic heapprofiler --autocannon [ -m POST /api/example ] -- node server.js ``` -------------------------------- ### Run Clinic.js Bubbleprof with autocannon Source: https://clinicjs.org/documentation/bubbleprof/03-first-analysis Executes a Node.js server with Clinic.js Bubbleprof profiling. It simultaneously uses autocannon to send 500 requests (5 connections) to the server as soon as it starts listening on a port. The results are analyzed and opened in an HTML page. ```bash clinic bubbleprof --on-port 'autocannon -c 5 -a 500 localhost:$PORT' -- node 1-server-with-no-index.js ``` -------------------------------- ### Get Clinic.js version Source: https://clinicjs.org/documentation/cli/04-reference Checks the current installed version of Clinic.js or a specific Clinic.js tool using the '--version' or '-v' flag. ```bash clinic --version ``` ```bash clinic -v ``` ```bash clinic doctor --version ``` ```bash clinic doctor -v ``` -------------------------------- ### Visualize Heap Profile Data Source: https://clinicjs.org/documentation/heapprofiler/01-setup Builds or rebuilds the visualization from previously collected profiling data. This command is used when `--collect-only` was previously used, or to regenerate the report. ```bash clinic heapprofiler --visualize-only PID.clinic.heapprofile ``` -------------------------------- ### Clinic.js Flame Visualization from Data Source: https://clinicjs.org/documentation/flame/01-setup Builds or rebuilds the flamegraph visualization from previously collected data. This command takes a data file path as an argument. ```bash clinic flame --visualize-only PID.clinic.flame ``` -------------------------------- ### View Clinic.js Global Version Source: https://clinicjs.org/documentation/cli This command displays the installed version of the Clinic.js package. ```bash clinic --version ``` -------------------------------- ### Example MongoDB Query Source: https://clinicjs.org/documentation/bubbleprof/04-bubbles Demonstrates a typical asynchronous MongoDB query operation within a JavaScript callback, as used in Clinic.js profiling. ```javascript col.find().sort({modified: -1}).limit(5, function (err, newest) { ``` -------------------------------- ### Simulate Load with Autocannon and Dynamic Port Source: https://clinicjs.org/documentation/heapprofiler/01-setup Profiles a Node.js application, simulating load with autocannon, and dynamically sets the target URL using the $PORT environment variable. Dollar signs in URLs must be escaped. ```bash clinic heapprofiler --autocannon [ -m POST 'http://localhost:$PORT/?$page=1' ] -- node server.js ``` -------------------------------- ### Profile Parallel Queries with Clinic.js and Autocannon Source: https://clinicjs.org/documentation/bubbleprof/08-parallel-queries This command profiles a Node.js server that performs parallel queries using Clinic.js and autocannon for load testing. It helps visualize performance bottlenecks and improvements. ```shell clinic bubbleprof --on-port 'autocannon -c 5 -a 500 localhost:$PORT' -- node 3-server-with-index-in-parallel.js ``` -------------------------------- ### Run Caching Example with Clinic Bubbleprof Source: https://clinicjs.org/documentation/bubbleprof/09-caching-the-results Executes the Node.js script '4-server-with-caching.js' using clinic bubbleprof and autocannon to simulate load and measure performance. This command helps visualize the impact of caching on database queries. ```bash clinic bubbleprof --on-port 'autocannon -c 5 -a 500 localhost:$PORT' -- node 4-server-with-caching.js ``` -------------------------------- ### Collect profiling data without immediate processing Source: https://clinicjs.org/documentation/bubbleprof/01-setup Configures Bubbleprof to only collect profiling data, useful for remote servers. ```bash clinic bubbleprof --collect-only -- node server.js ``` -------------------------------- ### Clinic.js Doctor with --on-port flag Source: https://clinicjs.org/documentation/cli/04-reference Uses the '--on-port' flag with 'clinic doctor' to execute a command when the profiled application starts listening to a port. The example shows executing 'my-script localhost:$PORT'. ```bash clinic doctor --on-port 'my-script localhost:$PORT' -- node server.js ``` -------------------------------- ### Simulate Load with Custom Command (--on-port) Source: https://clinicjs.org/documentation/cli/01-simulating-load Utilize the --on-port flag to integrate any custom command for load simulation, such as globally installed tools like autocannon or wrk, or npm scripts. ```bash clinic doctor --on-port 'autocannon localhost:$PORT' -- node server.js ``` ```bash clinic doctor --on-port 'wrk http://localhost:$PORT' -- node server.js ``` ```bash clinic doctor --on-port 'npm run load-test' -- node server.js ``` -------------------------------- ### Run Clinic.js Heapprofiler with Autocannon Source: https://clinicjs.org/documentation/heapprofiler/03-first-analysis Executes a Node.js server with Clinic.js heapprofiler and simultaneously uses autocannon to generate load. The analysis runs for 120 seconds, producing an HTML report. It targets a Fastify server started with 'node 1-server-with-many-allocations.js'. ```bash clinic heapprofiler --autocannon [ / --method GET -d 120 ] -- node 1-server-with-many-allocations.js ``` -------------------------------- ### Collect Heap Profile Data Only Source: https://clinicjs.org/documentation/heapprofiler/01-setup Runs the Heap Profiler to collect profiling data without processing or visualizing it immediately. This is useful for transferring data from a remote server to a local machine for analysis. ```bash clinic heapprofiler --collect-only -- node server.js ``` -------------------------------- ### Run Heap Profiler Without Auto-Opening Report Source: https://clinicjs.org/documentation/heapprofiler/01-setup Profiles a Node.js application but prevents the report from automatically opening in a web browser after the process finishes. Useful for server environments or manual report viewing. ```bash clinic heapprofiler --open=false -- node server.js ``` -------------------------------- ### Clinic.js Flame Data Collection Only Source: https://clinicjs.org/documentation/flame/01-setup Runs Clinic.js Flame in data collection mode without processing the data immediately. This is useful for profiling on remote servers, allowing data transfer before visualization. ```bash clinic flame --collect-only -- node server.js ``` -------------------------------- ### Profile Node.js App with Autocannon Load Test Source: https://clinicjs.org/documentation/doctor/03-first-analysis Runs Clinic.js Doctor to profile a Node.js application ('node slow-event-loop') and simultaneously uses Autocannon to load test the application. The '--on-port' flag executes a script when the server starts listening on a port, using the dynamically assigned '$PORT' variable. This command profiles the server under concurrent requests and generates an HTML report. ```bash clinic doctor --on-port 'autocannon localhost:$PORT' -- node slow-event-loop ``` -------------------------------- ### Clinic.js Doctor with --autocannon flag Source: https://clinicjs.org/documentation/cli/04-reference Utilizes the '--autocannon' flag with 'clinic doctor' to pass subarguments to autocannon. The example demonstrates passing 'localhost:$PORT' to autocannon. ```bash clinic doctor --autocannon [ 'localhost:$PORT' ] -- node server.js ``` -------------------------------- ### Clinic.js Doctor with --sample-interval flag Source: https://clinicjs.org/documentation/cli/04-reference Adjusts the sampling rate of the 'clinic doctor' command using the '--sample-interval' flag, specifying the interval in milliseconds. The example sets the interval to 100ms. ```bash clinic doctor --sample-interval 100 -- node server.js ``` -------------------------------- ### Example Synchronous Sleep Function Source: https://clinicjs.org/documentation/doctor/05-fixing-event-loop-problem This JavaScript function demonstrates a synchronous sleep implementation that blocks the Node.js event loop. It uses a `while` loop to pause execution for a specified number of milliseconds. ```javascript function sleep(ms) { const future = Date.now() + ms while (Date.now() < future); } ``` -------------------------------- ### View Clinic.js Global Help Information Source: https://clinicjs.org/documentation/cli This command provides general help information for the Clinic.js CLI, including its overall functionality and usage. ```bash clinic --help ``` -------------------------------- ### View Clinic.js Flame Tool Version Source: https://clinicjs.org/documentation/cli A simple command to quickly retrieve and display the version of the Clinic.js Flame tool. ```bash clinic flame --version ``` -------------------------------- ### Clean Clinic.js Samples Source: https://clinicjs.org/documentation/cli/03-managing-samples Removes all Clinic.js generated sample files and directories. Can optionally specify a path to the samples directory. ```bash clinic clean ``` ```bash clinic clean --path ../some-other-dir ``` -------------------------------- ### Autocannon: Set Concurrent Connections Source: https://clinicjs.org/documentation/cli/01-simulating-load Configure the number of concurrent connections for autocannon using the -c or --connections flag as a subargument. ```bash clinic doctor --autocannon [ -c 100 / ] -- node server.js ``` -------------------------------- ### Set Presentation Mode Environment Variable Source: https://clinicjs.org/documentation/heapprofiler/05-controls Sets the PRESENTATION_MODE environment variable to TRUE, enabling presentation mode by default for Clinic.js Heap. ```shell export PRESENTATION_MODE=TRUE ``` -------------------------------- ### Set Environment Variables for Clinic.js Doctor Source: https://clinicjs.org/documentation/cli Demonstrates how to set environment variables, such as NODE_ENV, before running the Clinic.js Doctor command to analyze a Node.js application. ```bash NODE_ENV=production clinic doctor -- node server.js ``` -------------------------------- ### Running Clinic.js Flame with no-turbo-inlining Source: https://clinicjs.org/documentation/flame/08-advanced-analysis This command runs Clinic.js Flame to capture performance data from a Node.js application. The `--no-turbo-inlining` flag disables V8's turbo-inlining optimization, revealing potentially hidden bottlenecks within the flamegraph. The `--on-port` option runs autocannon to generate load on the specified port. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node --no-turbo-inlining 3-server-with-reduced-call-graph.js ``` -------------------------------- ### Autocannon: Use Local File for Request Body Source: https://clinicjs.org/documentation/cli/01-simulating-load Simplify load testing with complex data by using the -i flag to specify a local file containing the request body. ```bash clinic doctor --autocannon [ -m POST /api/item -i my-data.json ] -- node server.js ``` -------------------------------- ### Profile Node.js App with Clinic Bubbleprof Source: https://clinicjs.org/documentation/doctor/06-fixing-io-problem Command to generate a Clinic.js Bubbleprof profile for a Node.js application, similar to the Doctor profile command but using `bubbleprof` instead. ```bash clinic bubbleprof --on-port 'autocannon localhost:$PORT' -- node slow-io ``` -------------------------------- ### Profile Node.js App with Clinic Doctor Source: https://clinicjs.org/documentation/doctor/06-fixing-io-problem Command to create a Clinic.js Doctor profile for a Node.js application, targeting a specific port and running a benchmark with autocannon. ```bash clinic doctor --on-port 'autocannon localhost:$PORT' -- node slow-io ``` -------------------------------- ### Autocannon: Specify HTTP Method and Body Source: https://clinicjs.org/documentation/cli/01-simulating-load Test specific HTTP methods like POST and include data in the request body using the -m and -b flags respectively. ```bash clinic doctor --autocannon [ -m POST /api/item ] -- node server.js ``` ```bash clinic doctor --autocannon [ -m POST /api/item -b '{"my": "data"}' ] -- node server.js ``` -------------------------------- ### Simulate Load with Autocannon (Basic) Source: https://clinicjs.org/documentation/cli/01-simulating-load Use the --autocannon flag to simulate load on your server with autocannon. Clinic.js automatically resolves the $PORT variable within the autocannon arguments to the server's actual port. ```bash clinic doctor --autocannon [ 'localhost:$PORT' ] -- node server.js ``` ```bash clinic doctor --autocannon [ / ] -- node server.js ``` -------------------------------- ### Run Benchmark with Clinic.js and Autocannon Source: https://clinicjs.org/documentation/bubbleprof/07-improving-our-latency This command uses Clinic.js's bubbleprof tool to profile a Node.js server ('2-server-with-index.js') while running a benchmark with Autocannon. It helps visualize performance bottlenecks in different parts of the application, such as database interactions and server framework. ```bash clinic bubbleprof --on-port 'autocannon -c 5 -a 500 localhost:$PORT' -- node 2-server-with-index.js ``` -------------------------------- ### Ignore Clinic.js Samples in Git Source: https://clinicjs.org/documentation/cli/03-managing-samples Configures Git to ignore the '.clinic' directory, preventing sample files from being committed. This can be done per-project or globally. ```bash .clinic ``` ```bash git config --global core.excludesfile ~/.gitignore_global echo '.clinic' >> ~/.gitignore_global ``` -------------------------------- ### Original app.get route handler Source: https://clinicjs.org/documentation/flame/06-optimizing-a-hot-function This snippet shows the original route handler for the '/' path. It calls the 'payload' function, which is identified as a performance bottleneck. ```javascript app.get('/', (req, res) => { res.send(payload()) }) ``` -------------------------------- ### Running Clinic.js Flame with Manual Serialization Source: https://clinicjs.org/documentation/flame/08-advanced-analysis This command executes Clinic.js Flame to analyze the performance of a Node.js application after implementing manual JSON serialization. It uses autocannon to generate load and captures flamegraph data to visualize the performance impact of the optimization. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node 4-server-with-manual-serialization.js ``` -------------------------------- ### Generate Flamegraph with Clinic.js Source: https://clinicjs.org/documentation/flame/07-reducing-the-graph-size Generates a flamegraph for a Node.js application using `clinic flame`. It monitors the application on a specified port and uses `autocannon` for load testing. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node 3-server-with-reduced-call-graph.js ``` -------------------------------- ### Visualize existing Clinic.js data Source: https://clinicjs.org/documentation/cli/02-controlling-the-output This command uses the `--visualize-only` flag to generate or regenerate an HTML profile from existing Clinic.js data located in a specified directory. ```bash clinic doctor --visualize-only .clinic/1234.clinic-doctor ``` -------------------------------- ### Run Clinic.js Doctor and generate HTML Source: https://clinicjs.org/documentation/cli/02-controlling-the-output This command runs the Clinic.js Doctor tool to profile a Node.js server script and generates a compiled HTML file along with associated data files. ```bash clinic doctor -- node server.js ``` -------------------------------- ### Node.js Function with Reduced Timeouts (Optimized) Source: https://clinicjs.org/documentation/doctor/06-fixing-io-problem This JavaScript code snippet shows the `awaitData` function after optimization. The duration of all `setTimeout` calls has been drastically reduced from 1000ms to 1ms, simulating a significant improvement in external I/O performance. ```javascript function awaitData(callback) { async.series( [ done1 => setTimeout(done1, 1), done1 => async.parallel( [ done2 => setTimeout(done2, 1), done2 => setTimeout(done2, 1), done2 => setTimeout(done2, 1), done2 => setTimeout(done2, 1), done2 => setTimeout(done2, 1) ], done1 ) ], callback ) } ``` -------------------------------- ### Generate Flame Profile with Clinic.js Source: https://clinicjs.org/documentation/doctor/05-fixing-event-loop-problem This command generates a Flame profile for a Node.js application. It uses `clinic flame` to profile the application and `autocannon` to generate load on the specified port. The output is used to identify performance bottlenecks. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node slow-event-loop ``` -------------------------------- ### Manual JSON Stringification for Performance Source: https://clinicjs.org/documentation/flame/08-advanced-analysis This code snippet demonstrates manual JSON stringification as an alternative to `JSON.stringify`. By directly constructing the JSON string, it bypasses the overhead of the built-in function, potentially improving performance. Note that this method requires careful handling of escaping for security. ```javascript return `{"date": ${date}, "id": "${id}"}` ``` -------------------------------- ### Profiling command with Clinic.js Source: https://clinicjs.org/documentation/flame/06-optimizing-a-hot-function This command uses Clinic.js to profile the Node.js server after the payload function has been optimized. It uses 'autocannon' to generate load and analyzes the performance with the Flame UI. ```bash clinic flame --on-port 'autocannon localhost:$PORT' -- node 2-server-with-optimized-function.js ``` -------------------------------- ### Use clinic flame for synchronous operations Source: https://clinicjs.org/documentation/doctor/04-reading-a-profile When synchronous operations are suspected of blocking the event loop, `clinic flame` is recommended to pinpoint the exact cause. This tool generates flame graphs to visualize the call stack and identify long-running functions. ```shell clinic flame -- node app.js ``` -------------------------------- ### Change Clinic.js output destination Source: https://clinicjs.org/documentation/cli/02-controlling-the-output This command uses the `--dest` flag to specify an alternative directory for Clinic.js to generate its output files, preventing them from cluttering the project directory. ```bash clinic doctor --dest ../some-other-dir -- node server.js ``` -------------------------------- ### Node.js Function with Chained Timeouts (Original) Source: https://clinicjs.org/documentation/doctor/06-fixing-io-problem This JavaScript code snippet demonstrates an asynchronous function `awaitData` that uses `async.series` to execute two operations sequentially. The first operation is a `setTimeout`, and the second is an `async.parallel` block containing multiple `setTimeout` calls, simulating slow I/O operations. ```javascript function awaitData(callback) { async.series( [ done1 => setTimeout(done1, Math.random() * 1000), done1 => async.parallel( [ done2 => setTimeout(done2, Math.random() * 1000), done2 => setTimeout(done2, Math.random() * 1000), done2 => setTimeout(done2, Math.random() * 1000), done2 => setTimeout(done2, Math.random() * 1000), done2 => setTimeout(done2, Math.random() * 1000) ], done1 ) ], callback ) } ``` -------------------------------- ### Original payload function generation Source: https://clinicjs.org/documentation/flame/06-optimizing-a-hot-function This is the original implementation of the 'payload' function, which is responsible for generating an ID and timestamp. Its inefficient algorithm leads to performance issues. ```javascript function initPayload(idSize = 20) { return function payload() { let chars = '' let n = idSize const date = Date.now() const radix = 36 n *= n * idSize while (n--) { const num = date + n chars += num.toString(radix).toUpperCase() } const id = chars.slice(-idSize) return { date, id } } } ``` -------------------------------- ### Collect Clinic.js data only Source: https://clinicjs.org/documentation/cli/02-controlling-the-output This command uses the `--collect-only` flag to prevent Clinic.js from generating an HTML file, instead producing a directory containing raw profiling data. ```bash clinic doctor --collect-only -- node server.js ``` -------------------------------- ### Optimized payload function generation Source: https://clinicjs.org/documentation/flame/06-optimizing-a-hot-function This is the refactored 'payload' function. It uses a more efficient algorithm for generating IDs, improving overall server performance. It includes validation for idSize and optimizes number handling. ```javascript function initPayload(idSize = 20) { if (idSize < 6) throw Error('idSize must be greater than 5') const max = 2147483647 var count = 0 return function payload() { count = (count + 1) % max const date = Date.now() const chars = count.toString(36).toUpperCase() const id = '0'.repeat(idSize - chars.length) + chars return { date, id } } } ``` -------------------------------- ### Modified Express Route with Reduced Sleep Source: https://clinicjs.org/documentation/doctor/05-fixing-event-loop-problem This modified Express.js route handler demonstrates reducing the duration of the synchronous `sleep` call to 1 millisecond. This change aims to alleviate event loop blocking. ```javascript server.get('/', function (req, res, next) { sleep(1) ``` -------------------------------- ### Express Route with Synchronous Sleep Source: https://clinicjs.org/documentation/doctor/05-fixing-event-loop-problem This Express.js route handler includes a call to the synchronous `sleep` function, which can block the event loop. It's a common pattern to analyze when diagnosing performance issues. ```javascript server.get('/', function(req, res, next) { sleep(30) res.send({}) next() }) ``` === COMPLETE CONTENT === This response contains all available snippets from this library. No additional content exists. Do not make further requests.