/** * Registry of function names. The [`types generate`](/developers/references/cli/commands/types-generate) command fills this registry, then [`FunctionName`](#functionname) resolves to a union of the keys. */ export interface FunctionNameRegistry { } /** * Union of all function names from the [`FunctionNameRegistry`](#functionnameregistry). Defaults to `string` when no types have been generated. * * @example * ```typescript * // Using generated function name types * // With generated types, you get autocomplete on function names * await base44.functions.invoke('calculateTotal', { items: ['item1', 'item2'] }); * ``` */ export type FunctionName = keyof FunctionNameRegistry extends never ? string : keyof FunctionNameRegistry; /** * Options for {@linkcode FunctionsModule.fetch}. * * Alias of the native [`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit) type. * Any option accepted by the browser `fetch` API is valid (`method`, `headers`, `body`, `signal`, etc.). * Auth headers are merged in automatically; you do not need to set them. */ export type FunctionsFetchInit = RequestInit; /** * Configuration for the functions module. * @internal */ export interface FunctionsModuleConfig { getAuthHeaders?: () => Record; baseURL?: string; } /** * Functions module for invoking custom backend functions. * * This module allows you to invoke the custom backend functions defined in the app. * * ## Authentication Modes * * This module is available to use with a client in all authentication modes: * * - **Anonymous or User authentication** (`base44.functions`): Functions are invoked with the current user's permissions. Anonymous users invoke functions without authentication, while authenticated users invoke functions with their authentication context. * - **Service role authentication** (`base44.asServiceRole.functions`): Functions are invoked with elevated admin-level permissions. The function code receives a request with admin authentication context. * * ## Generated Types * * If you're working in a TypeScript project, you can generate types from your backend functions to get autocomplete on function names when calling `invoke()`. See the [Dynamic Types](/developers/references/sdk/getting-started/dynamic-types) guide to get started. */ export interface FunctionsModule { /** * Invokes a custom backend function by name. * * Sends a POST request to a custom backend function deployed to the app. * The function receives the provided data as named parameters and returns * the result. If any parameter is a `File` object, the request will automatically be * sent as `multipart/form-data`. Otherwise, it will be sent as JSON. * * For streaming responses, non-POST methods, or raw response access, use {@linkcode fetch | fetch()} instead. * * @param functionName - The name of the function to invoke. * @param data - An object containing named parameters for the function. * @returns Promise resolving to the function's response. The `data` property contains the data returned by the function, if there is any. * * @example * ```typescript * // Basic function call * const result = await base44.functions.invoke('calculateTotal', { * items: ['item1', 'item2'], * }); * console.log(result.data.total); * ``` * * @example * ```typescript * // Function with file upload in React * const handleFileUpload = async (event: React.ChangeEvent) => { * const file = event.target.files?.[0]; * if (file) { * const processedImage = await base44.functions.invoke('processImage', { * image: file, * filter: 'grayscale', * quality: 80 * }); * } * }; * ``` */ invoke(functionName: FunctionName, data?: Record): Promise; /** * Performs a direct HTTP request to a backend function path and returns the native `Response`. * * Use `fetch()` when you need low-level control that {@linkcode invoke | invoke()} doesn't provide, such as: * - Streaming responses, like SSE, chunked text, or NDJSON * - Custom HTTP methods, like PUT, PATCH, or DELETE * - Raw response access, including status codes, headers, and binary bodies * * @param path - Function path. Leading slash is optional, so `/chat` and `chat` are equivalent. For example, `'/streaming_demo'` or `'reports/export'`. * @param init - Optional [`RequestInit`](https://developer.mozilla.org/en-US/docs/Web/API/RequestInit) options such as `method`, `headers`, `body`, and `signal`. Auth headers are added automatically. * @returns Promise resolving to a native [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response). * * @example * ```typescript * // Stream an SSE response * const response = await base44.functions.fetch('/chat', { * method: 'POST', * headers: { 'Content-Type': 'application/json' }, * body: JSON.stringify({ prompt: 'Hello!' }), * }); * * const reader = response.body!.getReader(); * const decoder = new TextDecoder(); * * while (true) { * const { done, value } = await reader.read(); * if (done) break; * console.log(decoder.decode(value, { stream: true })); * } * ``` * * @example * ```typescript * // PUT request * const response = await base44.functions.fetch('/users/profile', { * method: 'PUT', * headers: { 'Content-Type': 'application/json' }, * body: JSON.stringify({ name: 'Jane', role: 'admin' }), * }); * * if (!response.ok) { * throw new Error(`Request failed: ${response.status}`); * } * * const updated = await response.json(); * ``` * * @example * ```typescript * // Download a binary file * const response = await base44.functions.fetch('/export/report'); * const blob = await response.blob(); * * const url = URL.createObjectURL(blob); * const a = document.createElement('a'); * a.href = url; * a.download = 'report.pdf'; * a.click(); * ``` */ fetch(path: string, init?: FunctionsFetchInit): Promise; }