HTTP
Expose functions as HTTP endpoints.
The HTTP Module exposes registered functions as HTTP endpoints.
modules::api::RestApiModuleSample Configuration
- class: modules::api::RestApiModule
config:
port: 3111
host: 0.0.0.0
cors:
allowed_origins:
- http://localhost:3000
- http://localhost:5173
allowed_methods:
- GET
- POST
- PUT
- DELETE
- OPTIONSConfiguration
The maximum number of concurrent requests the server will handle. Defaults to 1024.
When true, the engine trusts proxy headers such as X-Forwarded-For for client IP resolution. Defaults to false.
Header name used to propagate or generate a request ID. Defaults to x-request-id.
When true, routes with and without a trailing slash are treated as equivalent. Defaults to false.
Function ID to invoke when no route matches a request. When unset, the engine returns a default 404 response.
Trigger Type
This module adds a new Trigger Type: http.
Sample code
const fn = iii.registerFunction({ id: 'api.getUsers' }, handler)
iii.registerTrigger({
type: 'http',
function_id: fn.id,
config: {
api_path: '/api/v1/users',
http_method: 'GET',
},
})Request & Response Objects
ApiRequest
When an API trigger fires, the function receives an ApiRequest object:
ApiResponse
Functions must return an ApiResponse object:
HTTP response headers as "Header-Name: value" strings (e.g., ["Content-Type: application/json"]). Optional.
Middleware
The HTTP module supports a middleware system that runs functions at defined phases of the request lifecycle. Middleware functions are registered using the http_middleware trigger type.
Phases
| Phase | Description |
|---|---|
onRequest | Runs before route matching. |
preHandler | Runs after route match, before the handler. |
postHandler | Runs after the handler returns a response. |
onResponse | Runs after the response is sent (fire-and-forget). |
onError | Runs when the handler returns an error. |
onTimeout | Runs when the handler exceeds the configured timeout. |
Phases execute in priority order (lower number = higher priority).
Middleware Trigger Config
Middleware Function Contract
Middleware functions receive a MiddlewareRequest object:
Middleware must return one of:
{ action: "continue", request?: object, context?: object }— pass control to the next middleware. Optionalrequestandcontextpatches are deep-merged into the current values.{ action: "respond", response: { status_code, body, headers } }— short-circuit and return a response immediately. Subsequent middleware in the same phase is skipped.
Request Lifecycle
Example Handler
import { registerWorker } from 'iii-sdk'
import type { ApiRequest, ApiResponse } from 'iii-sdk'
const iii = registerWorker('ws://localhost:49134')
async function getUser(req: ApiRequest): Promise<ApiResponse> {
const userId = req.path_params?.id
const user = await database.findUser(userId)
return {
status_code: 200,
body: { user },
headers: { 'Content-Type': 'application/json' },
}
}
const fn = iii.registerFunction({ id: 'api.getUser' }, getUser)
iii.registerTrigger({
type: 'http',
function_id: fn.id,
config: {
api_path: '/users/:id',
http_method: 'GET',
},
})