IRequest.formData(): Promise<FormBody>
Reads the body as a form, for both application/x-www-form-urlencoded
and multipart/form-data requests.
The parse is the shared parseFormBody, memoized exactly as json() is —
the in-flight promise is cached (a rejection with it), so two middleware
reading the same body trigger one parse, not two.
Optional on the signal? / fs? / raw? precedent: a custom IRequest
implementor may omit it. Such a caller falls back to
parseFormBody(await request.bytes(), request.headers.get('content-type')),
the same common function the producers call — what the accessor adds
over the fallback is the memoization.
Promise<FormBody>
The parsed form. A multipart body the parser cannot make sense of yields an EMPTY form rather than a rejection: the promoted parser's released behaviour, kept so the accessor changes where parsing happens, never what a parse yields.