Edge Functions

Background Tasks

How to run background tasks in an Edge Function outside of the request handler


Edge Function instances can process background tasks outside of the request handler. Background tasks are useful for asynchronous operations like uploading a file to Storage, updating a database, or sending events to a logging service. You can respond to the request immediately and leave the task running in the background.

How it works

You can use EdgeRuntime.waitUntil(promise) to explicitly mark background tasks. The Function instance continues to run until the promise provided to waitUntil completes.

The maximum duration is capped based on the wall-clock, CPU, and memory limits. The Function will shutdown when it reaches one of these limits.

You can listen to the beforeunload event handler to be notified when Function invocation is about to be shut down.

Example

Here's an example of using EdgeRuntime.waitUntil to run a background task and using beforeunload event to be notified when the instance is about to be shut down.


_20
async function longRunningTask() {
_20
// do work here
_20
}
_20
_20
// Mark the longRunningTask's returned promise as a background task.
_20
// note: we are not using await because we don't want it to block.
_20
EdgeRuntime.waitUntil(longRunningTask())
_20
_20
// Use beforeunload event handler to be notified when function is about to shutdown
_20
addEventListener('beforeunload', (ev) => {
_20
console.log('Function will be shutdown due to', ev.detail?.reason)
_20
_20
// save state or log the current progress
_20
})
_20
_20
// Invoke the function using a HTTP request.
_20
// This will start the background task
_20
Deno.serve(async (req) => {
_20
return new Response('ok')
_20
})

Starting a background task in the request handler

You can call EdgeRuntime.waitUntil in the request handler too. This will not block the request.


_12
async function fetchAndLog(url: string) {
_12
const response = await fetch(url)
_12
console.log(response)
_12
}
_12
_12
Deno.serve(async (req) => {
_12
// this will not block the request,
_12
// instead it will run in the background
_12
EdgeRuntime.waitUntil(fetchAndLog('https://httpbin.org/json'))
_12
_12
return new Response('ok')
_12
})

Testing background tasks locally

When testing Edge Functions locally with Supabase CLI, the instances are terminated automatically after a request is completed. This will prevent background tasks from running to completion.

To prevent that, you can update the supabase/config.toml with the following settings:


_10
[edge_runtime]
_10
policy = "per_worker"

When running with per_worker policy, Function won't auto-reload on edits. You will need to manually restart it by running supabase functions serve.