Nitro

Mount the Files gateway in a Nitro (or Nuxt server) route. Marshals the h3 event into a Web Request and returns the Response for Nitro to flush.

files-sdk/nitro mounts a createFilesRouter in a Nitro route (and therefore Nuxt server routes). Nitro's h3 event carries the Node request as event.node.req, so the binding marshals it into the Web Request the gateway speaks and returns the Web Response for Nitro to flush — hiding the toWebRequest(event) step. A client disconnect is wired through to abort the upstream read on a proxied download.

routes/api/files.ts
import { createFiles } from "files-sdk";
import { s3 } from "files-sdk/s3";
import { createFilesRouter } from "files-sdk/api";
import { createRouteHandler } from "files-sdk/nitro";

const router = createFilesRouter({
  files: createFiles({ adapter: s3({ bucket: "uploads" }) }),
  allowedOrigins: ["https://app.example.com"],
  authorize: async ({ req }) => {
    /* throw to deny, or return a per-user constraint — see /ui/server/authorization */
  },
});

// In Nuxt, put this at server/routes/api/files.ts.
export default defineEventHandler(createRouteHandler(router));

One handler serves every method — the gateway dispatches internally (GET = download, POST = the JSON verbs, PUT = upload). The binding targets Nitro v2 / h3 v1, where event.node.req is present on every preset (a node-compat shim on edge, which Nitro polyfills via unenv).

See the gateway options for the full configuration and the authorize model for locking it down.