Define Callable functions
The code we run in a Callable function has access to the user authentication status and the request's data.
Callable functions support streaming the response: we describe the pattern in a dedicated section.
Overview and syntax
synopsis
onCall<ReqData, Promise<ResData>>(callback)
onCall<ReqData, Promise<ResData>>(options, callback)
the callback
The callback has access to the request object (CallableRequest), which exposes auth and data.
We define the callback async so it returns a promise. The connection is kept open until the promise settles.
onCall<ReqData, Promise<ResData>>(async (request) => {
request.auth // AuthData | undefined
request.auth?.uid
request.data // ReqData
return { message: ".." } // ResData
})
- auth is undefined when the request is unauthenticated. It has uid otherwise.
- ReqData defines the data sent by clients.
- ResData defines what the callback returns.
add options
onCall accepts an optional options object, of type CallableOptions, a subclass of GlobalOptions, as the first argument.
const options: CallableOptions = {
concurrency: 1,
minInstances: 1,
maxInstances: 1,
region: "europe-west1",
}
concurrency sets how many requests a single instance processes in parallel. By default, an instance processes multiple requests in parallel. We set it to 1 for sequential processing, assuming we also set maxInstances to 1.
minInstances default to 0. To avoid cold starts, we can set minInstances to 1 but it costs more because it is kept warm.
We can limit maxInstances to 1.
Streaming version
Streaming the response means to send small chunks of data with sendChunk().
The third type argument (StreamData) defines what kind of chunk we stream. We usually stream string chunks.
The request exposes acceptsStreaming, which we read to check if the client supports streaming. When it does, the callback has access to an extra response argument, on which we call sendChunk().
onCall<T, U, V>(options, callback) // streaming Callable
onCall<ReqData, Promise<ResData>, StreamData>(async (request, response) => {
if (response.acceptsStreaming) {
response?.sendChunk("abc") // StreamData
response?.sendChunk("def")
} else return { message: ".." } // fallback
})
Patterns
halt and send an error immediately
We throw an HttpsError with a specific error code which conforms to a predefined list. It defaults to internal error if omitted.
throw new HttpsError("unauthenticated", "unauthenticated")
logger
logger.debug("")
logger.info("")
logger.warn("")
logger.error("")
Callable v1 (deprecated)
define the function
functions.https.onCall(async (data, context) => {
const auth = context.auth
const message = data.message
return { message: ".." }
})
the context object
The context object provides the authentication details, if any, such as the email, and the request metadata such as the IP address, or the raw HTTP request. It is of type CallableContext
check authentication
if (!context.auth) {
throw functions.https.HttpsError("unauthenticated", "you must be authenticated")
}