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.

A background task can run until the Edge Function instance hits its wall-clock limit.

Here's an example of defining a background task using a custom event.


_22
// Define a custom event type for the background task.
_22
class MyBackgroundTaskEvent extends Event {
_22
readonly taskPromise: Promise<Response>
_22
_22
constructor(taskPromise: Promise<Response>) {
_22
super('myBackgroundTask')
_22
this.taskPromise = taskPromise
_22
}
_22
}
_22
_22
globalThis.addEventListener('myBackgroundTask', async (event) => {
_22
const res = await (event as MyBackgroundTaskEvent).taskPromise
_22
console.log(await res.json())
_22
})
_22
_22
Deno.serve(async (req) => {
_22
const fetchPromise = fetch('https://httpbin.org/json')
_22
const event = new MyBackgroundTaskEvent(fetchPromise)
_22
globalThis.dispatchEvent(event)
_22
_22
return new Response('ok')
_22
})

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.