apps/docs/content/guides/functions/background-tasks.mdx
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.
This allows you to:
You can use EdgeRuntime.waitUntil(promise) to explicitly mark background tasks. The Function instance continues to run until the promise provided to waitUntil completes.
// Mark the asyncLongRunningTask's returned promise as a background task.
// ⚠️ We are NOT using `await` because we don't want it to block!
EdgeRuntime.waitUntil(asyncLongRunningTask())
Deno.serve(async (req) => {
return new Response(...)
})
You can call EdgeRuntime.waitUntil in the request handler too. This will not block the request.
Deno.serve(async (req) => {
// Won't block the request, runs in background.
EdgeRuntime.waitUntil(asyncLongRunningTask())
return new Response(...)
})
You can listen to the beforeunload event handler to be notified when the Function is about to be shut down.
EdgeRuntime.waitUntil(asyncLongRunningTask())
// Use beforeunload event handler to be notified when function is about to shutdown
addEventListener('beforeunload', (ev) => {
console.log('Function will be shutdown due to', ev.detail?.reason)
// Save state or log the current progress
})
Deno.serve(async (req) => {
return new Response(...)
})
We recommend using try/catch blocks within your background task function to handle errors.
You can also add an event listener to unhandledrejection to handle any promises without a rejection handler.
addEventListener('unhandledrejection', (ev) => {
console.log('unhandledrejection', ev.reason)
ev.preventDefault()
})
The maximum duration is capped based on the wall-clock, CPU, and memory limits. The function will shut down when it reaches one of these limits.
</Admonition>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:
[edge_runtime]
policy = "per_worker"