@alxia/react-router 0.21.0 → 0.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -997,8 +997,13 @@ connections mode, so `graphql-sse` works against it. It imports nothing and adds
997
997
 
998
998
  ```ts
999
999
  // app/routes/events.ts
1000
- import { createSubscriptionProxy } from '@alxia/react-router/subscription';
1000
+ import { alxiaOf } from '@alxia/react-router';
1001
+ import {
1002
+ createSubscriptionProxy,
1003
+ type SubscriptionArgs,
1004
+ } from '@alxia/react-router/subscription';
1001
1005
  import { print } from 'graphql';
1006
+ import type { RouterContextProvider } from 'react-router';
1002
1007
  import { RoomEventsDocument } from '../generated/graphql';
1003
1008
  import { cookies } from '../session.server';
1004
1009
 
@@ -1006,8 +1011,12 @@ const events = createSubscriptionProxy({
1006
1011
  endpoint: 'https://api.example.com/graphql',
1007
1012
  allow: { RoomEvents: print(RoomEventsDocument) },
1008
1013
  getToken: (request) => cookies.token(request),
1009
- headers: (request) => ({
1010
- 'x-forwarded-for': request.headers.get('x-forwarded-for'),
1014
+ // the route's context is the second argument: send the trusted client address
1015
+ headers: (
1016
+ request,
1017
+ { context }: SubscriptionArgs<Readonly<RouterContextProvider>>,
1018
+ ) => ({
1019
+ 'x-forwarded-for': context ? alxiaOf(context).ip : null,
1011
1020
  'accept-language': request.headers.get('accept-language'),
1012
1021
  }),
1013
1022
  });
@@ -1223,7 +1232,7 @@ From `@alxia/react-router/session` (`react-router` and `/errors`' files are its
1223
1232
  | `SignInAnswer`, `SignInFormError`, `SignInStayed`, `SignInCodes` | what a step answers (`signedIn`, `secondFactor` or `other`), a form step's answer when it stays on the page, and the `codes` option (`invalidCode`, `challengeOver`) |
1224
1233
  | `stepUpSteps({ signIn, spent, locked?, wording?, codes? })`, `StepUpSteps`, `StepUpStepsOptions`, `StepUpCall` | a step-up for a route's action, reading the flow's `errors`, `json` and `attemptsLeft`, each step taking `{ request, language }` and refusing a post that is not a same-site JSON one: `request(run, { request, language })` answers the challenge and how it is confirmed (a throttled mail or any 429 is `error: 'throttled'` with `retryAfter`), `confirm(run, { request, language, via? })` answers `error: 'invalid'` with the tries left (and `locked: true` for an app or recovery code with none left), `expired` or `failed`; `request` and `confirm` answer `throttled` with `retryAfter` on any 429 (on `confirm` the challenge and its tries stay, `locked: false`); and `isStepUpRequired(error)` |
1225
1234
  | `StepUpCodes`, `StepUpStayed`, `INVALID_CODE`, `CHALLENGE_OVER`, `MAIL_THROTTLED`, `STEP_UP_REQUIRED`, `STEP_UP_OVER` | the `codes` option (`invalidCode`, `challengeOver`, `stepUpRequired`, `mailThrottled`), a step's answer that stays on the page, and janus's default codes, which an app can extend |
1226
- | `authLinks({ signIn, codes?, wording?, start?, resetDone?, invalidState? })`, `AuthLinks`, `AuthLinksOptions`, `AuthLinksCodes` | the pages a mail's link opens, over the flow's cookies, errors and json: `linkArgs`, `spendToken(run, { request, language, path, states, fields? })`, `answerOf`, `landByLink` (`context?`), `afterReset(request, { context? })` (clears the session, the challenge and the flow's cookies), `requestLink(run, { request, language })` (a wait answers `throttled: true` and `retryAfter` when the API gives the seconds; `wording` words every refusal that is not a field's), `statePath` and `ended` |
1235
+ | `authLinks({ signIn, codes?, wording?, start?, resetDone?, invalidState? })`, `AuthLinks`, `AuthLinksOptions`, `AuthLinksCodes` | the pages a mail's link opens, over the flow's cookies, errors and json: `linkArgs`, `spendToken(run, { request, language, path, states, fields? })`, `answerOf`, `landByLink` (`context?`), `afterReset(request, { context? })` (clears the session, the challenge and the flow's cookies), `requestLink(run, { request, language })` (a wait, whose `codes.mailThrottled` is one code or a list of them, answers `throttled: true` and `retryAfter` when the API gives the seconds; `wording` words every refusal that is not a field's), `statePath` and `ended` |
1227
1236
  | `Spent`, `SpendOptions`, `LinkStayed`, `RequestLinkAnswer` | their types |
1228
1237
  | `TOKEN_PAGE_HEADERS` | `Referrer-Policy: no-referrer` and `X-Robots-Tag: noindex, nofollow`, for a page whose URL carries a token |
1229
1238
 
@@ -1288,7 +1297,7 @@ From `@alxia/react-router/subscription` (no import, no peer):
1288
1297
 
1289
1298
  | export | |
1290
1299
  | --- | --- |
1291
- | `createSubscriptionProxy({ endpoint, allow, getToken, headers?, origin?, heartbeatMs?, fetch? })`, `SubscriptionProxy`, `SubscriptionProxyOptions` | a resource route's `loader` (GET) and `action` (POST) relaying GraphQL subscriptions over SSE (graphql-sse's distinct connections mode). `allow` is `{ [operationName]: document }`: the proxy sends its own document, the client's `query` and `extensions` are ignored and an unknown name is a 403. Both methods refuse a cross-site request (403) and a POST that is not JSON (415); 401 without a token; 400 for a malformed or oversize request (body 64 KiB, query string and variables 16 KiB); the bearer and `headers` upstream, a heartbeat comment every `heartbeatMs` (15000), the upstream aborted with the client, a pulled relay with a 1 MiB cap per event, an upstream 429 passed on with `Retry-After` and `retryAfter`, 502 for an upstream failure |
1300
+ | `createSubscriptionProxy({ endpoint, allow, getToken, headers?, origin?, heartbeatMs?, fetch? })`, `SubscriptionProxy`, `SubscriptionProxyOptions`, `SubscriptionArgs` | a resource route's `loader` (GET) and `action` (POST) relaying GraphQL subscriptions over SSE (graphql-sse's distinct connections mode). `allow` is `{ [operationName]: document }`: the proxy sends its own document, the client's `query` and `extensions` are ignored and an unknown name is a 403. Both methods refuse a cross-site request (403) and a POST that is not JSON (415); 401 without a token; 400 for a malformed or oversize request (body 64 KiB, query string and variables 16 KiB); the bearer and `headers` upstream (`headers(request, { request, context, params })`: a function gets the route's context, which never leaves it), a heartbeat comment every `heartbeatMs` (15000), the upstream aborted with the client, a pulled relay with a 1 MiB cap per event, an upstream 429 passed on with `Retry-After` and `retryAfter`, 502 for an upstream failure |
1292
1301
 
1293
1302
  The `alxia-react-router` bin, run with `bunx`:
1294
1303
 
@@ -308,6 +308,10 @@ async function afterReset(options, resetDone, request, { context } = {}) {
308
308
  // src/session/links.ts
309
309
  var RESET_DONE = "/sign-in?password-reset=1";
310
310
  var worded = ({ wording, errors }, error, language) => wording?.(error, language) ?? errors.apiErrorMessage(error, language);
311
+ var throttleCodes = (codes) => {
312
+ const configured = codes?.mailThrottled ?? MAIL_THROTTLED;
313
+ return typeof configured === "string" ? [configured] : configured;
314
+ };
311
315
  async function requestLink(options, run, { request, language }) {
312
316
  const { errors } = options;
313
317
  samesitePost(options.json, request);
@@ -316,7 +320,7 @@ async function requestLink(options, run, { request, language }) {
316
320
  return data3({ sent: true });
317
321
  } catch (error) {
318
322
  const api = isApiErrorLike2(error);
319
- if (api && error.code === (options.codes?.mailThrottled ?? MAIL_THROTTLED)) {
323
+ if (api && throttleCodes(options.codes).includes(error.code ?? "")) {
320
324
  const retryAfter = retryAfterOf2(error);
321
325
  return data3({
322
326
  formError: worded(options, error, language),
@@ -656,5 +660,5 @@ export {
656
660
  stepUpSteps
657
661
  };
658
662
 
659
- //# debugId=0344667D44C9423964756E2164756E21
663
+ //# debugId=5700D84F1A8EF7CF64756E2164756E21
660
664
  //# sourceMappingURL=index.js.map
@@ -7,7 +7,7 @@
7
7
  "import {\n\tisCookieName,\n\tisCookiePath,\n\tmillisOf,\n\treadCookie,\n\tsecondsUntil,\n\tserializeCookie,\n} from './serialize';\n\nexport interface SessionCookiesOptions {\n\t/**\n\t * The base name of the session cookie, e.g. `'my-app_session'`. With\n\t * `secure`, the cookie is named `__Host-my-app_session`.\n\t */\n\treadonly session: string;\n\t/**\n\t * The base name of the second-factor challenge's cookie. With `secure`, it\n\t * is named `__Secure-<name>`.\n\t */\n\treadonly challenge: string;\n\t/**\n\t * The app is served over HTTPS. Required, and never read from the\n\t * environment: pass `!import.meta.env.DEV`. `false` drops `Secure` and the\n\t * prefixes (Safari drops a `Secure` cookie over `http://localhost`).\n\t */\n\treadonly secure: boolean;\n\t/** Where the browser sends the challenge. `'/sign-in'` by default. */\n\treadonly challengePath?: string | undefined;\n\t/** The most the challenge lives. 300, `@nxgt/janus`'s lifetime, by default. */\n\treadonly challengeSeconds?: number | undefined;\n}\n\n/** What the session cookie holds: the token, and the expiry (ms) it was last set to. */\nexport interface CookieSession {\n\treadonly token: string;\n\treadonly expiresAt: number;\n}\n\nexport interface SessionCookies {\n\t/** The names as sent, prefixes included. */\n\treadonly names: { readonly session: string; readonly challenge: string };\n\t/** The session cookie of the request; `null` when absent or not `<ms>.<token>`. */\n\tread(request: Request): CookieSession | null;\n\t/** The session token of the request, or `null`. */\n\ttoken(request: Request): string | null;\n\t/** A `Set-Cookie` value keeping `token` until `expiresAt`. */\n\tcommit(token: string, expiresAt: string | Date, now?: number): string;\n\t/** A `Set-Cookie` value removing the session cookie. */\n\tdestroy(): string;\n\t/** The `Set-Cookie` header that keeps the cookie as long as the session lives; empty when the expiry did not move, or is absent or not a date. */\n\trefreshed(\n\t\tsession: CookieSession,\n\t\texpiresAt: string | Date | null,\n\t): HeadersInit;\n\t/** The challenge cookie of the request, or `null`. */\n\tchallengeOf(request: Request): string | null;\n\t/** A `Set-Cookie` value keeping the challenge for the code page. */\n\tcommitChallenge(\n\t\tchallenge: string,\n\t\texpiresAt?: string | Date | null,\n\t\tnow?: number,\n\t): string;\n\t/** A `Set-Cookie` value removing the challenge. */\n\tdestroyChallenge(): string;\n\t/**\n\t * What a signed-out visit of the sign-in page sets: the challenge cleared\n\t * blind (a client navigation fetches `/sign-in.data`, which the cookie's\n\t * path does not match, so the request never shows it), and a dead\n\t * session's cookie when `deadSession`.\n\t */\n\tsignInPageHeaders(deadSession: boolean): Headers;\n}\n\nconst PREFIX = /^__(?:Host|Secure)-/;\n\nfunction checkName(label: string, name: string): void {\n\tif (!isCookieName(name)) {\n\t\tthrow new TypeError(\n\t\t\t`sessionCookies(): the ${label} name ${JSON.stringify(name)} is not a cookie name (an RFC 6265 token: letters, digits and ! # $ % & ' * + - . ^ _ \\` | ~). Pass a name such as \"my-app_${label}\".`,\n\t\t);\n\t}\n\tif (PREFIX.test(name)) {\n\t\tthrow new TypeError(\n\t\t\t`sessionCookies(): the ${label} name ${JSON.stringify(name)} already carries a prefix. Pass the base name: the package adds __Host- (session) or __Secure- (challenge) when secure is true.`,\n\t\t);\n\t}\n}\n\n/** The cookies of a BFF's session and of its second-factor challenge. */\nexport function sessionCookies(options: SessionCookiesOptions): SessionCookies {\n\tconst {\n\t\tsecure,\n\t\tchallengePath = '/sign-in',\n\t\tchallengeSeconds = 5 * 60,\n\t} = options;\n\tcheckName('session', options.session);\n\tcheckName('challenge', options.challenge);\n\tif (!Number.isInteger(challengeSeconds) || challengeSeconds <= 0) {\n\t\tthrow new TypeError(\n\t\t\t`sessionCookies(): challengeSeconds must be a positive integer; got ${String(challengeSeconds)}.`,\n\t\t);\n\t}\n\tif (!isCookiePath(challengePath)) {\n\t\tthrow new TypeError(\n\t\t\t`sessionCookies(): challengePath must start with \"/\" and hold no \";\" or control character; got ${JSON.stringify(challengePath)}.`,\n\t\t);\n\t}\n\t// `__Host-` holds only with `Path=/` and no `Domain`: the session cookie\n\t// sets neither option.\n\tconst session = secure ? `__Host-${options.session}` : options.session;\n\tconst challenge = secure\n\t\t? `__Secure-${options.challenge}`\n\t\t: options.challenge;\n\tconst clear = (name: string, path?: string) =>\n\t\tserializeCookie(name, '', { maxAge: 0, secure, ...(path && { path }) });\n\n\tconst read = (request: Request): CookieSession | null => {\n\t\tconst value = readCookie(request, session);\n\t\tconst dot = value?.indexOf('.') ?? -1;\n\t\tif (!value || dot < 1) return null;\n\t\tconst digits = value.slice(0, dot);\n\t\tconst expiresAt = Number(digits);\n\t\tconst token = value.slice(dot + 1);\n\t\treturn token && /^\\d+$/.test(digits) && Number.isSafeInteger(expiresAt)\n\t\t\t? { token, expiresAt }\n\t\t\t: null;\n\t};\n\t// The value is `<expiry ms>.<token>`: the expiry only tells a later request\n\t// whether the API moved it, so the cookie is set again then. It is never\n\t// trusted: the API alone decides whether a session is valid.\n\tconst commit = (token: string, expiresAt: string | Date, now?: number) =>\n\t\tserializeCookie(session, `${millisOf(expiresAt)}.${token}`, {\n\t\t\tmaxAge: secondsUntil(expiresAt, now),\n\t\t\tsecure,\n\t\t});\n\n\treturn {\n\t\tnames: { session, challenge },\n\t\tread,\n\t\ttoken: (request) => read(request)?.token ?? null,\n\t\tcommit,\n\t\tdestroy: () => clear(session),\n\t\trefreshed(current, expiresAt) {\n\t\t\t// An expiry that is not a date is garbage, not an end: keep the cookie.\n\t\t\tconst end = expiresAt ? millisOf(expiresAt) : 0;\n\t\t\tif (!expiresAt || end === 0 || end === current.expiresAt) return {};\n\t\t\treturn { 'Set-Cookie': commit(current.token, expiresAt) };\n\t\t},\n\t\tchallengeOf: (request) => readCookie(request, challenge),\n\t\tcommitChallenge: (value, expiresAt, now) =>\n\t\t\tserializeCookie(challenge, value, {\n\t\t\t\tmaxAge: Math.min(\n\t\t\t\t\tchallengeSeconds,\n\t\t\t\t\texpiresAt ? secondsUntil(expiresAt, now) : challengeSeconds,\n\t\t\t\t),\n\t\t\t\tpath: challengePath,\n\t\t\t\tsecure,\n\t\t\t}),\n\t\tdestroyChallenge: () => clear(challenge, challengePath),\n\t\tsignInPageHeaders(deadSession) {\n\t\t\tconst headers = new Headers();\n\t\t\theaders.append('Set-Cookie', clear(challenge, challengePath));\n\t\t\tif (deadSession) headers.append('Set-Cookie', clear(session));\n\t\t\treturn headers;\n\t\t},\n\t};\n}\n",
8
8
  "import { data, replace } from 'react-router';\nimport { isApiErrorLike } from '../errors/api-error';\nimport type { FormErrors } from '../errors/form-errors';\nimport type { InferOutput, StandardSchemaV1 } from '../errors/standard-schema';\nimport { samesitePost } from './guard';\nimport type {\n\tLinkStayed,\n\tLinksContext,\n\tSpendOptions,\n\tSpent,\n} from './link-types';\nimport { sitePath } from './model/site-path';\n\n/**\n * The response headers of a page a mail's link opens, whose URL carries a\n * token: no `Referer` sends it to another site (its fonts included), and\n * no search engine keeps it.\n */\nexport const TOKEN_PAGE_HEADERS = {\n\t'Referrer-Policy': 'no-referrer',\n\t'X-Robots-Tag': 'noindex, nofollow',\n} as const;\n\n/** A token page's path with no query or fragment, or a `TypeError` naming `call`. */\nconst pathOf = (path: string, call: string): string =>\n\tsitePath(path, { label: `${call}: a token page's path` });\n\nexport const statePath = (path: string, state: string): string =>\n\t`${pathOf(path, 'statePath()')}?${new URLSearchParams({ state })}`;\n\n/** `headers`, with the token page's own on top. */\nexport function withTokenHeaders(headers?: HeadersInit): Headers {\n\tconst merged = new Headers(headers);\n\tfor (const [name, value] of Object.entries(TOKEN_PAGE_HEADERS)) {\n\t\tmerged.set(name, value);\n\t}\n\treturn merged;\n}\n\n/** A redirect replacing the current history entry: the token's, so Back never opens it again. */\nexport const stateRedirect = (\n\tpath: string,\n\tstate: string,\n\theaders?: HeadersInit,\n): Response =>\n\treplace(statePath(path, state), { headers: withTokenHeaders(headers) });\n\nconst isTokenIssue = (issue: {\n\treadonly path?:\n\t\t| readonly (PropertyKey | { readonly key: PropertyKey })[]\n\t\t| undefined;\n}) => {\n\tconst first = issue.path?.[0];\n\treturn (typeof first === 'object' ? first.key : first) === 'token';\n};\n\nexport async function linkArgs<S extends StandardSchemaV1>(\n\t{ json }: Pick<LinksContext<string>, 'json'>,\n\tinvalidState: string,\n\tschema: S,\n\trequest: Request,\n\tpath: string,\n): Promise<InferOutput<S>> {\n\tsamesitePost(json, request);\n\tpathOf(path, 'linkArgs()');\n\tconst body = await json.readJson(request);\n\tconst result = await schema['~standard'].validate(body);\n\tif (!result.issues) return result.value as InferOutput<S>;\n\t// A token the API would refuse anyway (a link cut or padded on its way)\n\t// ends as an unknown one does; anything else is a bad request.\n\tif (result.issues.some(isTokenIssue)) {\n\t\tthrow stateRedirect(path, invalidState);\n\t}\n\tthrow data('Bad link request', { status: 400 });\n}\n\nexport async function spendToken<L extends string, C, T>(\n\toptions: LinksContext<L, C>,\n\trun: () => Promise<T>,\n\t{ request, language, path, states, fields: shown = [] }: SpendOptions<L>,\n): Promise<Spent<T>> {\n\tconst { errors } = options;\n\tsamesitePost(options.json, request);\n\tpathOf(path, 'spendToken()');\n\ttry {\n\t\treturn { ok: true, value: await run() };\n\t} catch (error) {\n\t\tconst refusal = errors.apiRefusal(error, language);\n\t\tif (!refusal) throw error;\n\t\tconst { message, status } = refusal;\n\t\tif (isApiErrorLike(error)) {\n\t\t\tconst state = error.code ? states[error.code] : undefined;\n\t\t\tif (state) return { ok: false, response: stateRedirect(path, state) };\n\t\t\tconst fields = errors.fieldErrors(error, language);\n\t\t\tconst named = Object.keys(fields);\n\t\t\t// A refusal under a field the page does not show would say nothing.\n\t\t\tif (named.length && named.every((field) => shown.includes(field))) {\n\t\t\t\treturn { ok: false, refusal: { fieldErrors: fields }, status };\n\t\t\t}\n\t\t}\n\t\treturn { ok: false, refusal: { formError: message }, status };\n\t}\n}\n\nexport const answerOf = (\n\tspent: Exclude<Spent<unknown>, { ok: true }>,\n): Response | LinkStayed =>\n\t'response' in spent\n\t\t? spent.response\n\t\t: data<FormErrors>(spent.refusal, { status: spent.status });\n",
9
9
  "import type { JsonActions } from '../errors/json-actions';\nimport { refuseCrossSite } from '../errors/same-site';\n\n/**\n * What every step that signs in, out, spends or mails runs first: a native\n * form post (before hydration) goes back to its page, which then posts JSON\n * (`json.requireJsonPost`), and a request from another site is a 403 even\n * when it is JSON (the `Origin` and `Sec-Fetch-Site` rule of `readJson`). It\n * reads headers only, never the body.\n */\nexport function samesitePost(json: JsonActions, request: Request): void {\n\tjson.requireJsonPost(request);\n\trefuseCrossSite(json, request);\n}\n",
10
- "import { data } from 'react-router';\nimport {\n\ttype ApiErrorLike,\n\tisApiErrorLike,\n\tretryAfterOf,\n} from '../errors/api-error';\nimport { MAIL_THROTTLED } from './codes';\nimport { samesitePost } from './guard';\nimport { afterReset, landByLink } from './link-land';\nimport {\n\tanswerOf,\n\tlinkArgs,\n\tspendToken,\n\tstatePath,\n\tstateRedirect,\n} from './link-token';\nimport type {\n\tAuthLinks,\n\tAuthLinksOptions,\n\tLinksContext,\n\tRequestLinkAnswer,\n} from './link-types';\nimport { sitePath } from './model/site-path';\n\nconst RESET_DONE = '/sign-in?password-reset=1';\n\n/**\n * Requests a mail's link with `run`. The API answers true whether or not\n * the e-mail holds an account, and so does the page: the same \"sent\" for\n * everyone. A wait or an unreachable API is the form's message; a malformed\n * address is the `email` field's.\n */\n/** The refusal's message: the app's own wording, else `errors`'. */\nconst worded = <L extends string, C>(\n\t{ wording, errors }: LinksContext<L, C>,\n\terror: ApiErrorLike,\n\tlanguage: L,\n): string =>\n\twording?.(error, language) ?? errors.apiErrorMessage(error, language);\n\nasync function requestLink<L extends string, C>(\n\toptions: LinksContext<L, C>,\n\trun: () => Promise<unknown>,\n\t{ request, language }: Parameters<AuthLinks<L, C>['requestLink']>[1],\n) {\n\tconst { errors } = options;\n\tsamesitePost(options.json, request);\n\ttry {\n\t\tawait run();\n\t\treturn data<RequestLinkAnswer>({ sent: true });\n\t} catch (error) {\n\t\tconst api = isApiErrorLike(error);\n\t\tif (\n\t\t\tapi &&\n\t\t\terror.code === (options.codes?.mailThrottled ?? MAIL_THROTTLED)\n\t\t) {\n\t\t\tconst retryAfter = retryAfterOf(error);\n\t\t\treturn data<RequestLinkAnswer>(\n\t\t\t\t{\n\t\t\t\t\tformError: worded(options, error, language),\n\t\t\t\t\tthrottled: true,\n\t\t\t\t\t...(retryAfter === undefined ? {} : { retryAfter }),\n\t\t\t\t},\n\t\t\t\t{ status: 429 },\n\t\t\t);\n\t\t}\n\t\tif (api) {\n\t\t\tconst email = errors.fieldErrors(error, language)['email'];\n\t\t\tif (email) {\n\t\t\t\treturn data<RequestLinkAnswer>(\n\t\t\t\t\t{ fieldErrors: { email } },\n\t\t\t\t\t{ status: error.status },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst refusal = errors.apiRefusal(error, language);\n\t\tif (!refusal) throw error;\n\t\treturn data<RequestLinkAnswer>(\n\t\t\t{ formError: api ? worded(options, error, language) : refusal.message },\n\t\t\t{ status: refusal.status },\n\t\t);\n\t}\n}\n\n/**\n * The pages a mail's link opens (a magic link, a password reset, an\n * invitation): the token page's end states, the arguments it posts, the\n * token spent against the API, the sign-in it leads to (replacing the\n * token's history entry), and the request for a link. Built once, beside the\n * app's `signInFlow`.\n *\n * @example\n * export const links = authLinks({ signIn });\n * // loader: return data({ ... }, { headers: TOKEN_PAGE_HEADERS });\n */\nexport function authLinks<L extends string, C = undefined>(\n\tlinks: AuthLinksOptions<L, C>,\n): AuthLinks<L, C> {\n\tconst { signIn } = links;\n\tconst options: LinksContext<L, C> = {\n\t\t...links,\n\t\tcookies: signIn.cookies,\n\t\terrors: signIn.errors,\n\t\tjson: signIn.json,\n\t};\n\tconst resetDone = options.resetDone ?? RESET_DONE;\n\tsitePath(resetDone, { label: 'authLinks(): resetDone', query: true });\n\tconst invalid = options.invalidState ?? 'invalid';\n\treturn {\n\t\tstatePath,\n\t\tended: stateRedirect,\n\t\tlinkArgs: (schema, request, path) =>\n\t\t\tlinkArgs(options, invalid, schema, request, path),\n\t\tspendToken: (run, o) => spendToken(options, run, o),\n\t\tanswerOf,\n\t\tlandByLink: (answer, o) => landByLink(options, answer, o),\n\t\tafterReset: (request, o) => afterReset(options, resetDone, request, o),\n\t\trequestLink: (run, o) => requestLink(options, run, o),\n\t};\n}\n",
10
+ "import { data } from 'react-router';\nimport {\n\ttype ApiErrorLike,\n\tisApiErrorLike,\n\tretryAfterOf,\n} from '../errors/api-error';\nimport { MAIL_THROTTLED } from './codes';\nimport { samesitePost } from './guard';\nimport { afterReset, landByLink } from './link-land';\nimport {\n\tanswerOf,\n\tlinkArgs,\n\tspendToken,\n\tstatePath,\n\tstateRedirect,\n} from './link-token';\nimport type {\n\tAuthLinks,\n\tAuthLinksCodes,\n\tAuthLinksOptions,\n\tLinksContext,\n\tRequestLinkAnswer,\n} from './link-types';\nimport { sitePath } from './model/site-path';\n\nconst RESET_DONE = '/sign-in?password-reset=1';\n\n/**\n * Requests a mail's link with `run`. The API answers true whether or not\n * the e-mail holds an account, and so does the page: the same \"sent\" for\n * everyone. A wait or an unreachable API is the form's message; a malformed\n * address is the `email` field's.\n */\n/** The refusal's message: the app's own wording, else `errors`'. */\nconst worded = <L extends string, C>(\n\t{ wording, errors }: LinksContext<L, C>,\n\terror: ApiErrorLike,\n\tlanguage: L,\n): string =>\n\twording?.(error, language) ?? errors.apiErrorMessage(error, language);\n\n/** The codes that are a wait: the configured one or list, else janus's. */\nconst throttleCodes = (\n\tcodes: AuthLinksCodes | undefined,\n): readonly string[] => {\n\tconst configured = codes?.mailThrottled ?? MAIL_THROTTLED;\n\treturn typeof configured === 'string' ? [configured] : configured;\n};\n\nasync function requestLink<L extends string, C>(\n\toptions: LinksContext<L, C>,\n\trun: () => Promise<unknown>,\n\t{ request, language }: Parameters<AuthLinks<L, C>['requestLink']>[1],\n) {\n\tconst { errors } = options;\n\tsamesitePost(options.json, request);\n\ttry {\n\t\tawait run();\n\t\treturn data<RequestLinkAnswer>({ sent: true });\n\t} catch (error) {\n\t\tconst api = isApiErrorLike(error);\n\t\tif (api && throttleCodes(options.codes).includes(error.code ?? '')) {\n\t\t\tconst retryAfter = retryAfterOf(error);\n\t\t\treturn data<RequestLinkAnswer>(\n\t\t\t\t{\n\t\t\t\t\tformError: worded(options, error, language),\n\t\t\t\t\tthrottled: true,\n\t\t\t\t\t...(retryAfter === undefined ? {} : { retryAfter }),\n\t\t\t\t},\n\t\t\t\t{ status: 429 },\n\t\t\t);\n\t\t}\n\t\tif (api) {\n\t\t\tconst email = errors.fieldErrors(error, language)['email'];\n\t\t\tif (email) {\n\t\t\t\treturn data<RequestLinkAnswer>(\n\t\t\t\t\t{ fieldErrors: { email } },\n\t\t\t\t\t{ status: error.status },\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\t\tconst refusal = errors.apiRefusal(error, language);\n\t\tif (!refusal) throw error;\n\t\treturn data<RequestLinkAnswer>(\n\t\t\t{ formError: api ? worded(options, error, language) : refusal.message },\n\t\t\t{ status: refusal.status },\n\t\t);\n\t}\n}\n\n/**\n * The pages a mail's link opens (a magic link, a password reset, an\n * invitation): the token page's end states, the arguments it posts, the\n * token spent against the API, the sign-in it leads to (replacing the\n * token's history entry), and the request for a link. Built once, beside the\n * app's `signInFlow`.\n *\n * @example\n * export const links = authLinks({ signIn });\n * // loader: return data({ ... }, { headers: TOKEN_PAGE_HEADERS });\n */\nexport function authLinks<L extends string, C = undefined>(\n\tlinks: AuthLinksOptions<L, C>,\n): AuthLinks<L, C> {\n\tconst { signIn } = links;\n\tconst options: LinksContext<L, C> = {\n\t\t...links,\n\t\tcookies: signIn.cookies,\n\t\terrors: signIn.errors,\n\t\tjson: signIn.json,\n\t};\n\tconst resetDone = options.resetDone ?? RESET_DONE;\n\tsitePath(resetDone, { label: 'authLinks(): resetDone', query: true });\n\tconst invalid = options.invalidState ?? 'invalid';\n\treturn {\n\t\tstatePath,\n\t\tended: stateRedirect,\n\t\tlinkArgs: (schema, request, path) =>\n\t\t\tlinkArgs(options, invalid, schema, request, path),\n\t\tspendToken: (run, o) => spendToken(options, run, o),\n\t\tanswerOf,\n\t\tlandByLink: (answer, o) => landByLink(options, answer, o),\n\t\tafterReset: (request, o) => afterReset(options, resetDone, request, o),\n\t\trequestLink: (run, o) => requestLink(options, run, o),\n\t};\n}\n",
11
11
  "import { data, replace } from 'react-router';\nimport type { FormErrors } from '../errors/form-errors';\nimport type { SignInAnswer } from './flow-types';\nimport { samesitePost } from './guard';\nimport { isLive } from './land';\nimport { stateRedirect, withTokenHeaders } from './link-token';\nimport type { AuthLinks, LinkStayed, LinksContext } from './link-types';\nimport { HOME, safeNext } from './model';\n\n/** Where a new session starts: the app's start page, else `/`; never an unsafe path. */\nasync function startOf<L extends string, C>(\n\t{ start }: LinksContext<L, C>,\n\trequest: Request,\n\ttoken: string,\n): Promise<string> {\n\tif (!start) return HOME;\n\ttry {\n\t\treturn safeNext(await start(token, request));\n\t} catch {\n\t\t// The token is spent: a failed lookup must not fail the sign-in.\n\t\treturn HOME;\n\t}\n}\n\n/**\n * Where a link's sign-in leads, replacing the token's history entry. Signed\n * in: the start page, with the new session's cookie; a second factor: its\n * page. Either way the session the browser held, whoever's, is revoked\n * first: one browser holds one session. Only a JSON post goes on, before\n * anything is revoked or landed.\n */\nexport async function landByLink<L extends string, C>(\n\toptions: LinksContext<L, C>,\n\tanswer: SignInAnswer,\n\t{\n\t\trequest,\n\t\tlanguage,\n\t\tother,\n\t\tcontext,\n\t}: Parameters<AuthLinks<L, C>['landByLink']>[1],\n): Promise<Response | LinkStayed> {\n\tsamesitePost(options.json, request);\n\tif (answer.status === 'other' && other) {\n\t\treturn stateRedirect(other.path, other.state);\n\t}\n\t// A dead session would be looked up with a token the API refuses.\n\tconst next = isLive(answer)\n\t\t? await startOf(options, request, answer.token)\n\t\t: HOME;\n\tconst landed = await options.signIn.landReplacing(answer, next, {\n\t\trequest,\n\t\trevokeOn: ['signedIn', 'secondFactor'],\n\t\tcontext,\n\t});\n\tif (!landed) {\n\t\treturn data<FormErrors>(\n\t\t\t{ formError: options.signIn.unavailable(language) },\n\t\t\t{ status: 503 },\n\t\t);\n\t}\n\tconst location = landed.headers.get('Location') ?? HOME;\n\treturn replace(location, { headers: withTokenHeaders(landed.headers) });\n}\n\n/**\n * After a password reset, which signs the account out everywhere: the\n * browser's session is revoked (it may be another account's) and its cookies\n * cleared (the session's, the challenge's, the flow's `clear()`), then the sign-in page says the password changed. Only a JSON post\n * goes on.\n */\nexport async function afterReset<L extends string, C>(\n\toptions: LinksContext<L, C>,\n\tresetDone: string,\n\trequest: Request,\n\t{ context }: { readonly context?: C | undefined } = {},\n): Promise<Response> {\n\tsamesitePost(options.json, request);\n\tawait options.signIn.revokeSession(request, { context });\n\tconst headers = withTokenHeaders();\n\theaders.append('Set-Cookie', options.cookies.destroy());\n\theaders.append('Set-Cookie', options.cookies.destroyChallenge());\n\tfor (const cookie of options.signIn.clear()) {\n\t\theaders.append('Set-Cookie', cookie);\n\t}\n\treturn replace(resetDone, { headers });\n}\n",
12
12
  "import { redirect } from 'react-router';\nimport type { FlowContext, SignInAnswer, SignInFlow } from './flow-types';\nimport { samesitePost } from './guard';\nimport { safeNext, secondFactorPath } from './model';\nimport { millisOf } from './serialize';\n\n/**\n * Ends the request's session at the API, when it carries one; a failure is\n * ignored, the caller clears the cookie anyway. True when there was one.\n */\nexport async function revokeSession<L extends string, C>(\n\t{ options }: FlowContext<L, C>,\n\trequest: Request,\n\t{ context }: { readonly context?: C | undefined } = {},\n): Promise<boolean> {\n\tsamesitePost(options.json, request);\n\tconst token = options.cookies.token(request);\n\tif (!token) return false;\n\ttry {\n\t\tawait options.revoke(token, request, context);\n\t} catch {\n\t\t// The old session ends when it expires.\n\t}\n\treturn true;\n}\n\n/** The condition a session opens on: a signed-in answer with a token and an end still to come. */\nexport const isLive = (\n\tanswer: SignInAnswer,\n): answer is Extract<SignInAnswer, { status: 'signedIn' }> =>\n\tanswer.status === 'signedIn' &&\n\tBoolean(answer.token) &&\n\tBoolean(answer.expiresAt) &&\n\tmillisOf(answer.expiresAt) > Date.now();\n\n/**\n * Where a sign-in's answer leads: signed in, to `next` with the session\n * cookie (and the challenge cleared); a second factor, to its page with the\n * challenge in its own cookie, never in the URL. Any other answer, or a\n * signed-in one with no token or an end that is missing, unreadable or past,\n * opens no session: `null`, the caller shows its own state.\n */\nexport function landing<L extends string, C>(\n\t{ options, paths }: FlowContext<L, C>,\n\tanswer: SignInAnswer,\n\tnext: string,\n): Response | null {\n\tconst { cookies } = options;\n\t// A session with no readable or past end would be set and dead at once.\n\tif (isLive(answer)) {\n\t\tconst headers = new Headers();\n\t\theaders.append(\n\t\t\t'Set-Cookie',\n\t\t\tcookies.commit(answer.token, answer.expiresAt),\n\t\t);\n\t\theaders.append('Set-Cookie', cookies.destroyChallenge());\n\t\tfor (const cookie of options.clear?.() ?? []) {\n\t\t\theaders.append('Set-Cookie', cookie);\n\t\t}\n\t\treturn redirect(safeNext(next), { headers });\n\t}\n\tif (answer.status === 'secondFactor' && answer.challenge) {\n\t\treturn redirect(secondFactorPath(next, paths.secondFactor), {\n\t\t\theaders: {\n\t\t\t\t'Set-Cookie': cookies.commitChallenge(\n\t\t\t\t\tanswer.challenge,\n\t\t\t\t\tanswer.expiresAt,\n\t\t\t\t),\n\t\t\t},\n\t\t});\n\t}\n\treturn null;\n}\n\n/**\n * `landing`, ending the session the browser held first: one browser holds\n * one session, so the one its cookie names, whoever's, is revoked when an\n * answer in `revokeOn` lands. A signed-in answer's own cookie replaces the\n * old one; any other answer clears it. A failed revoke is ignored.\n */\nexport async function landReplacing<L extends string, C>(\n\tflow: FlowContext<L, C>,\n\tanswer: SignInAnswer,\n\tnext: string,\n\t{\n\t\trequest,\n\t\trevokeOn = ['signedIn'],\n\t\tcontext,\n\t}: Parameters<SignInFlow<L, C>['landReplacing']>[2],\n): Promise<Response | null> {\n\tsamesitePost(flow.options.json, request);\n\tconst landed = landing(flow, answer, next);\n\tif (!landed || answer.status === 'other') return landed;\n\tif (!revokeOn.includes(answer.status)) return landed;\n\tconst hadSession = await revokeSession(flow, request, { context });\n\tif (hadSession && answer.status !== 'signedIn') {\n\t\tlanded.headers.append('Set-Cookie', flow.options.cookies.destroy());\n\t}\n\treturn landed;\n}\n",
13
13
  "import { data } from 'react-router';\nimport type { FlowContext, SignInAnswer, SignInFlow } from './flow-types';\nimport { samesitePost } from './guard';\nimport type { SecondFactorKind } from './model';\n\nconst MAX_CODE = 40;\n\nfunction isMethod(value: unknown): value is SecondFactorKind {\n\treturn value === 'code' || value === 'recovery';\n}\n\n/**\n * The code a second-factor page posted, with how it is given\n * (`{ kind: 'code' | 'recovery', code }`, the code at most 40 characters). A\n * native form post goes back to its page, which then posts JSON; a\n * cross-site post is a 403; a body of another shape is a 400.\n */\nexport async function readCodeInput<L extends string, C>(\n\t{ options }: FlowContext<L, C>,\n\trequest: Request,\n): Promise<{ kind: SecondFactorKind; code: string }> {\n\tsamesitePost(options.json, request);\n\tconst body = (await options.json.readJson(request)) as {\n\t\tkind?: unknown;\n\t\tcode?: unknown;\n\t} | null;\n\tconst { kind, code } = body ?? {};\n\tif (!isMethod(kind) || typeof code !== 'string' || code.length > MAX_CODE) {\n\t\tthrow data('Bad code request', { status: 400 });\n\t}\n\treturn { kind, code };\n}\n\n/**\n * The code against the sign-in's challenge: an issued code (an app's, or\n * the one mailed) is confirmed, a recovery code is recovered. Either\n * answers like a sign-in.\n */\nexport function codeStep(\n\tinput: { readonly kind: SecondFactorKind; readonly code: string },\n\tchallenge: string,\n\tsteps: Parameters<SignInFlow<string>['codeStep']>[2],\n): Promise<SignInAnswer> {\n\treturn input.kind === 'code'\n\t\t? steps.confirm(challenge, input.code)\n\t\t: steps.recover(challenge, input.code);\n}\n",
@@ -17,7 +17,7 @@
17
17
  "import { data } from 'react-router';\nimport {\n\ttype ApiErrorLike,\n\tattemptsLeftOf,\n\tisApiErrorLike,\n\tretryAfterOf,\n} from '../errors/api-error';\nimport { INVALID_CODE, MAIL_THROTTLED } from './codes';\nimport type { CodeWording } from './flow-types';\nimport { samesitePost } from './guard';\nimport type {\n\tStepUpConfirmAnswer,\n\tStepUpError,\n\tStepUpRequestAnswer,\n\tStepUpVia,\n} from './model';\nimport { codeRefusal } from './step';\nimport { STEP_UP_OVER, STEP_UP_REQUIRED } from './step-up-codes';\nimport type {\n\tStepUpStayed,\n\tStepUpSteps,\n\tStepUpStepsOptions,\n} from './step-up-types';\n\ntype Refused = Extract<StepUpConfirmAnswer, { ok: false }>;\n\ninterface StepUpContext<L extends string, C> extends CodeWording<L> {\n\treadonly steps: StepUpStepsOptions<L, C>;\n\treadonly stepUpRequired: string;\n\treadonly mailThrottled: string;\n}\n\nfunction resolve<L extends string, C>(\n\tsteps: StepUpStepsOptions<L, C>,\n): StepUpContext<L, C> {\n\tconst invalidCode = steps.codes?.invalidCode ?? INVALID_CODE;\n\tconst challengeOver = steps.codes?.challengeOver ?? STEP_UP_OVER;\n\tif (challengeOver.includes(invalidCode)) {\n\t\tthrow new TypeError(\n\t\t\t`stepUpSteps(): the code ${JSON.stringify(invalidCode)} is both the wrong-code code (codes.invalidCode) and in codes.challengeOver. A wrong code that leaves tries cannot end the challenge.`,\n\t\t);\n\t}\n\treturn {\n\t\toptions: steps.signIn,\n\t\tsteps,\n\t\tinvalidCode,\n\t\tchallengeOver,\n\t\tstepUpRequired: steps.codes?.stepUpRequired ?? STEP_UP_REQUIRED,\n\t\tmailThrottled: steps.codes?.mailThrottled ?? MAIL_THROTTLED,\n\t};\n}\n\n/** The refusal's message: the app's own wording, else `errors`'. */\nfunction worded<L extends string, C>(\n\t{ steps }: StepUpContext<L, C>,\n\terror: ApiErrorLike,\n\tlanguage: L,\n): string {\n\treturn (\n\t\tsteps.wording?.(error, language) ??\n\t\tsteps.signIn.errors.apiErrorMessage(error, language)\n\t);\n}\n\n/** A code the API refused. With none left, a mailed one is over and an app's is locked. */\nfunction refusedCode<L extends string, C>(\n\tcontext: StepUpContext<L, C>,\n\terror: ApiErrorLike,\n\tvia: StepUpVia | undefined,\n\tlanguage: L,\n): Omit<Refused, 'ok' | 'intent'> {\n\tconst { steps } = context;\n\tconst attemptsLeft = attemptsLeftOf(error);\n\tif (attemptsLeft === 0 && via !== 'secondFactor') {\n\t\treturn {\n\t\t\terror: 'expired',\n\t\t\tattemptsLeft,\n\t\t\tlocked: false,\n\t\t\tmessage: steps.spent(language),\n\t\t};\n\t}\n\tconst locked = attemptsLeft === 0;\n\tconst message =\n\t\tcodeRefusal(\n\t\t\tcontext,\n\t\t\terror,\n\t\t\tlanguage,\n\t\t\tlocked ? steps.locked?.(language) : undefined,\n\t\t) ?? steps.signIn.errors.apiErrorMessage(error, language);\n\treturn {\n\t\terror: 'invalid',\n\t\t...(attemptsLeft === undefined ? {} : { attemptsLeft }),\n\t\tlocked,\n\t\tmessage,\n\t};\n}\n\n/** The mail throttle's code, or any 429: a rate limit asks to wait, whatever its code. */\nfunction isThrottle<L extends string, C>(\n\tcontext: StepUpContext<L, C>,\n\terror: ApiErrorLike,\n): boolean {\n\treturn error.status === 429 || error.code === context.mailThrottled;\n}\n\nasync function requestStep<L extends string, C>(\n\tcontext: StepUpContext<L, C>,\n\trun: Parameters<StepUpSteps<L>['request']>[0],\n\t{ request, language }: Parameters<StepUpSteps<L>['request']>[1],\n): Promise<StepUpRequestAnswer | StepUpStayed<StepUpRequestAnswer>> {\n\tsamesitePost(context.steps.signIn.json, request);\n\tconst intent = 'request-step-up';\n\ttry {\n\t\tconst { challenge, via } = await run();\n\t\treturn { ok: true, intent, challenge, via };\n\t} catch (error) {\n\t\tconst refusal = context.steps.signIn.errors.apiRefusal(error, language);\n\t\tif (!refusal) throw error;\n\t\tconst api = isApiErrorLike(error);\n\t\tconst message = api ? worded(context, error, language) : refusal.message;\n\t\tconst throttled = api && isThrottle(context, error);\n\t\tconst retryAfter = throttled ? retryAfterOf(error) : undefined;\n\t\treturn data<StepUpRequestAnswer>(\n\t\t\t{\n\t\t\t\tok: false,\n\t\t\t\tintent,\n\t\t\t\terror: throttled ? 'throttled' : 'failed',\n\t\t\t\tmessage,\n\t\t\t\t...(retryAfter === undefined ? {} : { retryAfter }),\n\t\t\t},\n\t\t\t{ status: refusal.status },\n\t\t);\n\t}\n}\n\nasync function confirmStep<L extends string, C>(\n\tcontext: StepUpContext<L, C>,\n\trun: () => Promise<unknown>,\n\t{ request, language, via }: Parameters<StepUpSteps<L>['confirm']>[1],\n): Promise<StepUpConfirmAnswer | StepUpStayed<StepUpConfirmAnswer>> {\n\tsamesitePost(context.steps.signIn.json, request);\n\tconst intent = 'confirm-step-up';\n\ttry {\n\t\tawait run();\n\t\treturn { ok: true, intent };\n\t} catch (error) {\n\t\tconst refusal = context.steps.signIn.errors.apiRefusal(error, language);\n\t\tif (!refusal) throw error;\n\t\tconst stay = (\n\t\t\tfailure: Omit<Refused, 'ok' | 'intent'>,\n\t\t): StepUpStayed<StepUpConfirmAnswer> =>\n\t\t\tdata<StepUpConfirmAnswer>(\n\t\t\t\t{ ok: false, intent, ...failure },\n\t\t\t\t{ status: refusal.status },\n\t\t\t);\n\t\tconst failed = (message: string) =>\n\t\t\tstay({ error: 'failed' satisfies StepUpError, locked: false, message });\n\t\tif (!isApiErrorLike(error)) return failed(refusal.message);\n\t\tif (error.status === 429) {\n\t\t\tconst retryAfter = retryAfterOf(error);\n\t\t\treturn stay({\n\t\t\t\terror: 'throttled',\n\t\t\t\tlocked: false,\n\t\t\t\tmessage: worded(context, error, language),\n\t\t\t\t...(retryAfter === undefined ? {} : { retryAfter }),\n\t\t\t});\n\t\t}\n\t\tif (error.code === context.invalidCode) {\n\t\t\treturn stay(refusedCode(context, error, via, language));\n\t\t}\n\t\tif (error.code && context.challengeOver.includes(error.code)) {\n\t\t\treturn stay({\n\t\t\t\terror: 'expired',\n\t\t\t\tlocked: false,\n\t\t\t\tmessage: context.steps.spent(language),\n\t\t\t});\n\t\t}\n\t\treturn failed(worded(context, error, language));\n\t}\n}\n\n/**\n * The server side of a BFF's step-up: `request` and `confirm` answer the\n * page's fetcher with `StepUpRequestAnswer` and `StepUpConfirmAnswer`, which\n * `stepUpReducer` takes as they are. It speaks `@nxgt/janus`'s words\n * (`CODE_INVALID`, `TOKEN_*`, `STEP_UP_REQUIRED`); the app maps the rest.\n *\n * @example\n * const stepUp = stepUpSteps({\n * \terrors,\n * \tattemptsLeft: (count, language) => t('code.attempts-left', { count }, language),\n * \tspent: (language) => t('step-up.spent', {}, language),\n * \tlocked: (language) => t('step-up.locked', {}, language),\n * });\n */\nexport function stepUpSteps<L extends string, C = undefined>(\n\toptions: StepUpStepsOptions<L, C>,\n): StepUpSteps<L> {\n\tconst context = resolve(options);\n\treturn {\n\t\trequest: (run, o) => requestStep(context, run, o),\n\t\tconfirm: (run, o) => confirmStep(context, run, o),\n\t\tisStepUpRequired: (error) =>\n\t\t\tisApiErrorLike(error) && error.code === context.stepUpRequired,\n\t};\n}\n",
18
18
  "import { CHALLENGE_OVER } from './codes';\n\n/** `@nxgt/janus`'s code for a mutation that needs a recent step-up. */\nexport const STEP_UP_REQUIRED = 'STEP_UP_REQUIRED';\n\n/**\n * The codes that end a step-up's challenge: unknown, spent, expired or stale,\n * and a second factor that changed since the request (`SECOND_FACTOR_ACTIVE`,\n * `SECOND_FACTOR_NOT_ENROLLED`). The user asks again.\n */\nexport const STEP_UP_OVER = [\n\t...CHALLENGE_OVER,\n\t'TOKEN_STALE',\n\t'SECOND_FACTOR_ACTIVE',\n\t'SECOND_FACTOR_NOT_ENROLLED',\n] as const;\n"
19
19
  ],
20
- "mappings": "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",
21
- "debugId": "0344667D44C9423964756E2164756E21",
20
+ "mappings": "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",
21
+ "debugId": "5700D84F1A8EF7CF64756E2164756E21",
22
22
  "names": []
23
23
  }
@@ -5,8 +5,12 @@ import type { InferOutput, StandardSchemaV1 } from '../errors/standard-schema';
5
5
  import type { SignInAnswer, SignInFlow } from './flow-types';
6
6
  /** The codes the links tell apart; `@nxgt/janus`'s by default. */
7
7
  export interface AuthLinksCodes {
8
- /** The API's wait on mailed links; `MAIL_THROTTLED` by default. */
9
- readonly mailThrottled?: string | undefined;
8
+ /**
9
+ * The API's wait on mailed links; `MAIL_THROTTLED` by default. A list when
10
+ * the API refuses with several codes (per address, per e-mail): each
11
+ * carries `retryAfter` to the page.
12
+ */
13
+ readonly mailThrottled?: string | readonly string[] | undefined;
10
14
  }
11
15
  export interface AuthLinksOptions<L extends string, C = undefined> {
12
16
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"link-types.d.ts","sourceRoot":"","sources":["../../src/session/link-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC/E,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE7D,kEAAkE;AAClE,MAAM,WAAW,cAAc;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC5C;AAED,MAAM,WAAW,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS;IAChE;;;OAGG;IACH,QAAQ,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAClC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,CAAC,EAAE,cAAc,GAAG,SAAS,CAAC;IAC5C;;;;OAIG;IACH,QAAQ,CAAC,OAAO,CAAC,EACd,CAAC,CAAC,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,CAAC,KAAK,MAAM,GAAG,SAAS,CAAC,GAC1D,SAAS,CAAC;IACb;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,CAAC,EACZ,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GACtD,SAAS,CAAC;IACb,4EAA4E;IAC5E,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACxC,yEAAyE;IACzE,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAC3C;AAED,4EAA4E;AAC5E,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,IAAI,gBAAgB,CAC3E,CAAC,EACD,CAAC,CACD,GACA,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,GAAG,QAAQ,GAAG,MAAM,CAAC,CAAC;AAEvD,2DAA2D;AAC3D,MAAM,MAAM,UAAU,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC;AAE7D,qEAAqE;AACrE,MAAM,MAAM,iBAAiB,GAAG;IAC/B,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,+FAA+F;IAC/F,SAAS,CAAC,EAAE,IAAI,CAAC;IACjB,2FAA2F;IAC3F,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,yDAAyD;IACzD,WAAW,CAAC,EAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACjC,CAAC;AAEF,MAAM,MAAM,KAAK,CAAC,CAAC,IAChB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAA;CAAE;AAC1C,2DAA2D;GACzD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAA;CAAE;AACrD,+CAA+C;GAC7C;IACA,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IACnB,QAAQ,CAAC,OAAO,EAAE,UAAU,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACvB,CAAC;AAEL,MAAM,WAAW,YAAY,CAAC,CAAC,SAAS,MAAM;IAC7C,6EAA6E;IAC7E,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACrB,0CAA0C;IAC1C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,qEAAqE;IACrE,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;IAC3D,kFAAkF;IAClF,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAC;CAChD;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS;IACzD,yEAAyE;IACzE,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC;IAC/C,mFAAmF;IACnF,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,QAAQ,CAAC;IACpE;;;;;;OAMG;IACH,QAAQ,CAAC,CAAC,SAAS,gBAAgB,EAClC,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,MAAM,GACV,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3B,wIAAwI;IACxI,UAAU,CAAC,CAAC,EACX,GAAG,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACrB,OAAO,EAAE,YAAY,CAAC,CAAC,CAAC,GACtB,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IACrB,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,IAAI,CAAA;KAAE,CAAC,GAAG,QAAQ,GAAG,UAAU,CAAC;IAC9E;;;;;;;OAOG;IACH,UAAU,CACT,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE;QACR,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAC1B,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;QACrB,mFAAmF;QACnF,QAAQ,CAAC,KAAK,CAAC,EACZ;YAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;YAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;SAAE,GACjD,SAAS,CAAC;QACb,wDAAwD;QACxD,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC;KACjC,GACC,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,CAAC;IAClC,gGAAgG;IAChG,UAAU,CACT,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,SAAS,CAAA;KAAE,GAC5C,OAAO,CAAC,QAAQ,CAAC,CAAC;IACrB,6EAA6E;IAC7E,WAAW,CACV,GAAG,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,EAC3B,OAAO,EAAE;QAAE,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAA;KAAE,GAC1D,OAAO,CAAC,UAAU,CAAC,OAAO,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC;CACvD"}
1
+ {"version":3,"file":"link-types.d.ts","sourceRoot":"","sources":["../../src/session/link-types.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/session/links.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACX,SAAS,EACT,gBAAgB,EAGhB,MAAM,cAAc,CAAC;AA+DtB;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,EACxD,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC3B,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAsBjB"}
1
+ {"version":3,"file":"links.d.ts","sourceRoot":"","sources":["../../src/session/links.ts"],"names":[],"mappings":"AAgBA,OAAO,KAAK,EACX,SAAS,EAET,gBAAgB,EAGhB,MAAM,cAAc,CAAC;AAoEtB;;;;;;;;;;GAUG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,GAAG,SAAS,EACxD,KAAK,EAAE,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAC3B,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAsBjB"}
@@ -3,5 +3,5 @@
3
3
  * BFF, as a resource route. It imports nothing (web APIs only), so it adds
4
4
  * no peer.
5
5
  */
6
- export { createSubscriptionProxy, type SubscriptionProxy, type SubscriptionProxyOptions, } from './proxy';
6
+ export { createSubscriptionProxy, type SubscriptionArgs, type SubscriptionProxy, type SubscriptionProxyOptions, } from './proxy';
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subscription/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACN,uBAAuB,EACvB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC7B,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/subscription/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EACN,uBAAuB,EACvB,KAAK,gBAAgB,EACrB,KAAK,iBAAiB,EACtB,KAAK,wBAAwB,GAC7B,MAAM,SAAS,CAAC"}
@@ -266,9 +266,9 @@ function relay(upstream, abort, heartbeatMs) {
266
266
 
267
267
  // src/subscription/proxy.ts
268
268
  var UNSAFE = /[\r\n\0]/;
269
- async function upstreamHeaders(config, request, token) {
269
+ async function upstreamHeaders(config, args, token) {
270
270
  const { headers } = config.options;
271
- const extra = typeof headers === "function" ? await headers(request) : headers;
271
+ const extra = typeof headers === "function" ? await headers(args.request, args) : headers;
272
272
  const out = new Headers;
273
273
  for (const [name, value] of extra instanceof Headers ? extra.entries() : Object.entries(extra ?? {}))
274
274
  if (value !== null && value !== undefined)
@@ -278,7 +278,8 @@ async function upstreamHeaders(config, request, token) {
278
278
  out.set("authorization", `Bearer ${token}`);
279
279
  return out;
280
280
  }
281
- async function handle(config, request) {
281
+ async function handle(config, args) {
282
+ const { request } = args;
282
283
  if (isCrossSite(request, config.origin()))
283
284
  return problem(403, "Cross-site request refused.", "FORBIDDEN");
284
285
  const token = await config.options.getToken(request);
@@ -297,9 +298,9 @@ async function handle(config, request) {
297
298
  return problem(403, "This operation is not allowed.", "FORBIDDEN");
298
299
  let headers;
299
300
  try {
300
- headers = await upstreamHeaders(config, request, token);
301
+ headers = await upstreamHeaders(config, args, token);
301
302
  } catch {
302
- return problem(500, "The proxy's upstream headers are not valid (a name or a value no header can hold).", "PROXY_MISCONFIGURED");
303
+ return problem(500, "The proxy's upstream headers are not valid (a name or a value no header can hold, or the headers function threw).", "PROXY_MISCONFIGURED");
303
304
  }
304
305
  const abort = new AbortController;
305
306
  if (request.signal.aborted)
@@ -335,7 +336,7 @@ async function handle(config, request) {
335
336
  return refused;
336
337
  }
337
338
  function only(method, run) {
338
- return async ({ request }) => request.method === method ? run(request) : problem(405, `Use ${method}.`, "METHOD_NOT_ALLOWED", {}, { allow: method });
339
+ return async (args) => args.request.method === method ? run(args) : problem(405, `Use ${method}.`, "METHOD_NOT_ALLOWED", {}, { allow: method });
339
340
  }
340
341
  function createSubscriptionProxy(options) {
341
342
  checkDocuments(options.allow);
@@ -348,13 +349,13 @@ function createSubscriptionProxy(options) {
348
349
  upstreamFetch: options.fetch ?? ((request) => fetch(request))
349
350
  };
350
351
  return {
351
- loader: only("GET", (request) => handle(config, request)),
352
- action: only("POST", (request) => handle(config, request))
352
+ loader: only("GET", (args) => handle(config, args)),
353
+ action: only("POST", (args) => handle(config, args))
353
354
  };
354
355
  }
355
356
  export {
356
357
  createSubscriptionProxy
357
358
  };
358
359
 
359
- //# debugId=943D148BD34D8EDC64756E2164756E21
360
+ //# debugId=4D71F489F243030064756E2164756E21
360
361
  //# sourceMappingURL=index.js.map
@@ -6,9 +6,9 @@
6
6
  "/** An answer the proxy gives itself, as GraphQL-shaped JSON a client can read. */\nexport class Refusal extends Error {\n\tconstructor(\n\t\treadonly status: number,\n\t\tmessage: string,\n\t\treadonly code: string,\n\t) {\n\t\tsuper(message);\n\t\tthis.name = 'Refusal';\n\t}\n}\n\nexport function problem(\n\tstatus: number,\n\tmessage: string,\n\tcode: string,\n\textra: Record<string, unknown> = {},\n\theaders: HeadersInit = {},\n): Response {\n\treturn new Response(\n\t\tJSON.stringify({\n\t\t\terrors: [{ message, extensions: { code, ...extra } }],\n\t\t\t...extra,\n\t\t}),\n\t\t{\n\t\t\tstatus,\n\t\t\theaders: {\n\t\t\t\t'content-type': 'application/json',\n\t\t\t\t'cache-control': 'no-store',\n\t\t\t\t...headers,\n\t\t\t},\n\t\t},\n\t);\n}\n\nexport const refusalResponse = (refusal: Refusal): Response =>\n\tproblem(refusal.status, refusal.message, refusal.code);\n\nfunction retryAfterOf(upstream: Response, body: unknown): number | undefined {\n\tconst header = Number(upstream.headers.get('retry-after'));\n\tif (Number.isFinite(header) && header > 0) return Math.ceil(header);\n\tconst seconds = (value: unknown): number | undefined =>\n\t\ttypeof value === 'number' && Number.isFinite(value) && value > 0\n\t\t\t? Math.ceil(value)\n\t\t\t: undefined;\n\tif (typeof body !== 'object' || body === null) return undefined;\n\tconst top = body as { retryAfter?: unknown; errors?: unknown };\n\tconst first = Array.isArray(top.errors)\n\t\t? (top.errors[0] as { extensions?: { retryAfter?: unknown } } | undefined)\n\t\t: undefined;\n\treturn seconds(top.retryAfter) ?? seconds(first?.extensions?.retryAfter);\n}\n\n/** What a non-2xx upstream answer becomes: a 429 with `retryAfter`, a 502 for a 5xx, any other 4xx as it came. */\nexport async function refusedUpstream(upstream: Response): Promise<Response> {\n\tconst text = await upstream.text().catch(() => '');\n\tif (upstream.status === 429) {\n\t\tlet body: unknown;\n\t\ttry {\n\t\t\tbody = JSON.parse(text);\n\t\t} catch {}\n\t\tconst retryAfter = retryAfterOf(upstream, body);\n\t\treturn problem(\n\t\t\t429,\n\t\t\t'Too many requests.',\n\t\t\t'RATE_LIMITED',\n\t\t\tretryAfter === undefined ? {} : { retryAfter },\n\t\t\tretryAfter === undefined ? {} : { 'retry-after': String(retryAfter) },\n\t\t);\n\t}\n\tif (upstream.status >= 500)\n\t\treturn problem(502, 'The API is unavailable.', 'UPSTREAM_ERROR');\n\treturn new Response(text, {\n\t\tstatus: upstream.status,\n\t\theaders: {\n\t\t\t'content-type':\n\t\t\t\tupstream.headers.get('content-type') ?? 'application/json',\n\t\t\t'cache-control': 'no-store',\n\t\t},\n\t});\n}\n",
7
7
  "import { Refusal } from './refusal';\n\n/** The most a body, a query string or the variables may weigh, in bytes. */\nexport const LIMITS = {\n\tbody: 64 * 1024,\n\tqueryString: 16 * 1024,\n\tvariables: 16 * 1024,\n} as const;\n\nexport interface Asked {\n\treadonly operationName: string;\n\treadonly variables?: Record<string, unknown>;\n}\n\nconst TOO_LARGE = () =>\n\tnew Refusal(400, 'The request is too large.', 'BAD_REQUEST');\nconst NOT_JSON = () =>\n\tnew Refusal(400, 'The request is not valid JSON.', 'BAD_REQUEST');\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n\treturn typeof value === 'object' && value !== null && !Array.isArray(value)\n\t\t? (value as Record<string, unknown>)\n\t\t: undefined;\n}\n\n/** The body as text, refused past `limit` bytes: `content-length` first, then a cap on what is read. */\nasync function textOf(request: Request, limit: number): Promise<string> {\n\tconst declared = Number(request.headers.get('content-length'));\n\tif (Number.isFinite(declared) && declared > limit) throw TOO_LARGE();\n\tif (request.body === null) return '';\n\tconst reader = request.body.getReader();\n\tconst chunks: Uint8Array[] = [];\n\tlet size = 0;\n\tfor (;;) {\n\t\tconst { done, value } = await reader.read();\n\t\tif (done) break;\n\t\tsize += value.byteLength;\n\t\tif (size > limit) {\n\t\t\tvoid reader.cancel().catch(() => {});\n\t\t\tthrow TOO_LARGE();\n\t\t}\n\t\tchunks.push(value);\n\t}\n\treturn new TextDecoder().decode(Buffer.concat(chunks));\n}\n\nfunction parse(text: string): unknown {\n\ttry {\n\t\treturn JSON.parse(text);\n\t} catch {\n\t\tthrow NOT_JSON();\n\t}\n}\n\n/**\n * What a client asks for: an `operationName` and its `variables`, from a\n * GET's search params or a POST's JSON body. Any `query` or `extensions` it\n * sends (graphql-sse always sends a `query`) is ignored.\n */\nexport async function readAsked(request: Request): Promise<Asked> {\n\tlet raw: Record<string, unknown> | undefined;\n\tif (request.method === 'GET') {\n\t\tconst url = new URL(request.url);\n\t\tif (url.search.length > LIMITS.queryString) throw TOO_LARGE();\n\t\tconst variables = url.searchParams.get('variables');\n\t\traw = {\n\t\t\toperationName: url.searchParams.get('operationName') ?? undefined,\n\t\t\tvariables: variables ? parse(variables) : undefined,\n\t\t};\n\t} else {\n\t\tconst type = (request.headers.get('content-type') ?? '')\n\t\t\t.split(';')[0]\n\t\t\t?.trim()\n\t\t\t.toLowerCase();\n\t\tif (type !== 'application/json')\n\t\t\tthrow new Refusal(\n\t\t\t\t415,\n\t\t\t\t'Send the request as application/json.',\n\t\t\t\t'UNSUPPORTED_MEDIA_TYPE',\n\t\t\t);\n\t\traw = record(parse(await textOf(request, LIMITS.body)));\n\t\tif (raw === undefined)\n\t\t\tthrow new Refusal(\n\t\t\t\t400,\n\t\t\t\t'The request must be a JSON object.',\n\t\t\t\t'BAD_REQUEST',\n\t\t\t);\n\t}\n\tconst { operationName, variables } = raw;\n\tif (operationName === undefined)\n\t\tthrow new Refusal(400, 'Send an \"operationName\".', 'BAD_REQUEST');\n\tif (typeof operationName !== 'string')\n\t\tthrow new Refusal(400, '\"operationName\" must be a string.', 'BAD_REQUEST');\n\tif (variables !== undefined) {\n\t\tif (record(variables) === undefined)\n\t\t\tthrow new Refusal(400, '\"variables\" must be an object.', 'BAD_REQUEST');\n\t\tif (JSON.stringify(variables).length > LIMITS.variables) throw TOO_LARGE();\n\t}\n\treturn {\n\t\toperationName,\n\t\t...(variables === undefined\n\t\t\t? {}\n\t\t\t: { variables: variables as Record<string, unknown> }),\n\t};\n}\n",
8
8
  "/** The most one event may weigh before the stream is cut, in characters. */\nexport const MAX_EVENT = 1024 * 1024;\n\nconst encoder = new TextEncoder();\nconst decoder = new TextDecoder();\n\nexport const SSE_HEADERS = {\n\t'content-type': 'text/event-stream; charset=utf-8',\n\t'cache-control': 'no-store, no-transform',\n\t'x-accel-buffering': 'no',\n};\n\nconst FAILED =\n\t'event: next\\ndata: {\"errors\":[{\"message\":\"The API stream failed.\",\"extensions\":{\"code\":\"UPSTREAM_ERROR\"}}]}\\n\\nevent: complete\\ndata:\\n\\n';\n\n/**\n * Relays whole events (a heartbeat never lands inside one) until the upstream\n * ends or the client leaves. The stream is pulled: upstream is read only when\n * the client has taken what was queued, so a slow client holds the upstream\n * back instead of growing a buffer, and a heartbeat is skipped while one is\n * waiting.\n */\nexport function relay(\n\tupstream: Response,\n\tabort: AbortController,\n\theartbeatMs: number,\n): Response {\n\tconst reader = (upstream.body as ReadableStream<Uint8Array>).getReader();\n\tlet timer: ReturnType<typeof setInterval> | undefined;\n\tlet buffer = '';\n\tconst stop = (): void => {\n\t\tif (timer !== undefined) clearInterval(timer);\n\t\ttimer = undefined;\n\t};\n\tconst stream = new ReadableStream<Uint8Array>(\n\t\t{\n\t\t\tstart(controller) {\n\t\t\t\tif (heartbeatMs > 0)\n\t\t\t\t\ttimer = setInterval(() => {\n\t\t\t\t\t\tif ((controller.desiredSize ?? 0) > 0)\n\t\t\t\t\t\t\tcontroller.enqueue(encoder.encode(':\\n\\n'));\n\t\t\t\t\t}, heartbeatMs);\n\t\t\t},\n\t\t\tasync pull(controller) {\n\t\t\t\ttry {\n\t\t\t\t\tfor (;;) {\n\t\t\t\t\t\tconst { done, value } = await reader.read();\n\t\t\t\t\t\tif (done) {\n\t\t\t\t\t\t\tstop();\n\t\t\t\t\t\t\tif (buffer.trim() !== '')\n\t\t\t\t\t\t\t\tcontroller.enqueue(encoder.encode(`${buffer}\\n\\n`));\n\t\t\t\t\t\t\tcontroller.close();\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbuffer += decoder\n\t\t\t\t\t\t\t.decode(value, { stream: true })\n\t\t\t\t\t\t\t.replace(/\\r\\n?/g, '\\n');\n\t\t\t\t\t\tconst cut = buffer.lastIndexOf('\\n\\n');\n\t\t\t\t\t\tif (cut !== -1) {\n\t\t\t\t\t\t\tcontroller.enqueue(encoder.encode(buffer.slice(0, cut + 2)));\n\t\t\t\t\t\t\tbuffer = buffer.slice(cut + 2);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (buffer.length > MAX_EVENT) throw new Error('event too large');\n\t\t\t\t\t}\n\t\t\t\t} catch {\n\t\t\t\t\tstop();\n\t\t\t\t\tif (abort.signal.aborted) return;\n\t\t\t\t\tabort.abort();\n\t\t\t\t\tcontroller.enqueue(encoder.encode(FAILED));\n\t\t\t\t\tcontroller.close();\n\t\t\t\t}\n\t\t\t},\n\t\t\tcancel() {\n\t\t\t\tstop();\n\t\t\t\tabort.abort();\n\t\t\t\tvoid reader.cancel().catch(() => {});\n\t\t\t},\n\t\t},\n\t\t{ highWaterMark: 1 },\n\t);\n\treturn new Response(stream, { status: 200, headers: SSE_HEADERS });\n}\n",
9
- "import { isCrossSite } from '../errors/cross-site';\nimport { checkDocuments } from './documents';\nimport { readAsked } from './read';\nimport { problem, Refusal, refusalResponse, refusedUpstream } from './refusal';\nimport { relay } from './relay';\n\ntype HeaderValues = Record<string, string | null | undefined> | Headers;\n\nexport interface SubscriptionProxyOptions {\n\t/** The API's GraphQL endpoint, which serves subscriptions over SSE. */\n\treadonly endpoint: string | URL;\n\t/**\n\t * The operations the browser may start: each name with the document the\n\t * proxy sends upstream for it. The client names an operation and sends\n\t * variables; its own `query` and `extensions` are ignored, so nothing it\n\t * writes reaches the API. A name that is not a key is a 403.\n\t */\n\treadonly allow: Readonly<Record<string, string>>;\n\t/** The session's token, from the request: `(request) => cookies.token(request)`. Empty is a 401. */\n\treadonly getToken: (\n\t\trequest: Request,\n\t) => string | null | undefined | Promise<string | null | undefined>;\n\t/** Extra upstream headers (client name, proxy secret, `X-Forwarded-For`, `Accept-Language`), fixed or built per request. A `null` or `undefined` value is left out. */\n\treadonly headers?:\n\t\t| HeaderValues\n\t\t| ((request: Request) => HeaderValues | Promise<HeaderValues>);\n\t/** The app's own origin for the cross-site check, as `jsonActions` takes it; the request's own by default. */\n\treadonly origin?: string | (() => string | undefined);\n\t/** A comment line sent this often so a proxy or Bun's `idleTimeout` keeps the stream open. 15000 by default; `0` turns it off. */\n\treadonly heartbeatMs?: number;\n\t/** The `fetch` used upstream. The global one by default. */\n\treadonly fetch?: (request: Request) => Promise<Response>;\n}\n\nexport interface SubscriptionProxy {\n\t/** A GET: graphql-sse's distinct connections mode, the operation in the search params. */\n\tloader(args: { request: Request }): Promise<Response>;\n\t/** A POST: the operation in a JSON body. */\n\taction(args: { request: Request }): Promise<Response>;\n}\n\ninterface Config {\n\treadonly endpoint: URL;\n\treadonly documents: ReadonlyMap<string, string>;\n\treadonly options: SubscriptionProxyOptions;\n\treadonly origin: () => string | undefined;\n\treadonly heartbeatMs: number;\n\treadonly upstreamFetch: (request: Request) => Promise<Response>;\n}\n\nconst UNSAFE = /[\\r\\n\\0]/;\n\nasync function upstreamHeaders(\n\tconfig: Config,\n\trequest: Request,\n\ttoken: string,\n): Promise<Headers> {\n\tconst { headers } = config.options;\n\tconst extra =\n\t\ttypeof headers === 'function' ? await headers(request) : headers;\n\tconst out = new Headers();\n\tfor (const [name, value] of extra instanceof Headers\n\t\t? extra.entries()\n\t\t: Object.entries(extra ?? {}))\n\t\tif (value !== null && value !== undefined) out.set(name, value);\n\tout.set('content-type', 'application/json');\n\tout.set('accept', 'text/event-stream');\n\tout.set('authorization', `Bearer ${token}`);\n\treturn out;\n}\n\nasync function handle(config: Config, request: Request): Promise<Response> {\n\tif (isCrossSite(request, config.origin()))\n\t\treturn problem(403, 'Cross-site request refused.', 'FORBIDDEN');\n\tconst token = await config.options.getToken(request);\n\tif (!token || UNSAFE.test(token))\n\t\treturn problem(401, 'Sign in to continue.', 'UNAUTHENTICATED');\n\n\tlet asked: Awaited<ReturnType<typeof readAsked>>;\n\ttry {\n\t\tasked = await readAsked(request);\n\t} catch (error) {\n\t\tif (error instanceof Refusal) return refusalResponse(error);\n\t\treturn problem(400, 'The request body could not be read.', 'BAD_REQUEST');\n\t}\n\tconst query = config.documents.get(asked.operationName);\n\tif (query === undefined)\n\t\treturn problem(403, 'This operation is not allowed.', 'FORBIDDEN');\n\n\tlet headers: Headers;\n\ttry {\n\t\theaders = await upstreamHeaders(config, request, token);\n\t} catch {\n\t\treturn problem(\n\t\t\t500,\n\t\t\t\"The proxy's upstream headers are not valid (a name or a value no header can hold).\",\n\t\t\t'PROXY_MISCONFIGURED',\n\t\t);\n\t}\n\n\tconst abort = new AbortController();\n\tif (request.signal.aborted) abort.abort();\n\telse\n\t\trequest.signal.addEventListener('abort', () => abort.abort(), {\n\t\t\tonce: true,\n\t\t});\n\tlet upstream: Response;\n\ttry {\n\t\tupstream = await config.upstreamFetch(\n\t\t\tnew Request(config.endpoint, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders,\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery,\n\t\t\t\t\toperationName: asked.operationName,\n\t\t\t\t\t...(asked.variables === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { variables: asked.variables }),\n\t\t\t\t}),\n\t\t\t\tsignal: abort.signal,\n\t\t\t}),\n\t\t);\n\t} catch {\n\t\treturn problem(502, 'The API is unreachable.', 'UPSTREAM_ERROR');\n\t}\n\tconst streaming =\n\t\tupstream.ok &&\n\t\tupstream.body !== null &&\n\t\t(upstream.headers.get('content-type') ?? '').startsWith(\n\t\t\t'text/event-stream',\n\t\t);\n\tif (streaming) return relay(upstream, abort, config.heartbeatMs);\n\tif (upstream.ok) {\n\t\tabort.abort();\n\t\treturn problem(\n\t\t\t502,\n\t\t\t'The API did not answer with an event stream.',\n\t\t\t'UPSTREAM_ERROR',\n\t\t);\n\t}\n\tconst refused = await refusedUpstream(upstream);\n\tabort.abort();\n\treturn refused;\n}\n\nfunction only(\n\tmethod: string,\n\trun: (request: Request) => Promise<Response>,\n): (args: { request: Request }) => Promise<Response> {\n\treturn async ({ request }) =>\n\t\trequest.method === method\n\t\t\t? run(request)\n\t\t\t: problem(\n\t\t\t\t\t405,\n\t\t\t\t\t`Use ${method}.`,\n\t\t\t\t\t'METHOD_NOT_ALLOWED',\n\t\t\t\t\t{},\n\t\t\t\t\t{ allow: method },\n\t\t\t\t);\n}\n\n/**\n * A resource route that exposes GraphQL subscriptions to the browser without\n * giving it the API's token or a way to write its own document. See the\n * subscription guide.\n */\nexport function createSubscriptionProxy(\n\toptions: SubscriptionProxyOptions,\n): SubscriptionProxy {\n\tcheckDocuments(options.allow);\n\tconst config: Config = {\n\t\tendpoint: new URL(options.endpoint),\n\t\tdocuments: new Map(Object.entries(options.allow)),\n\t\toptions,\n\t\torigin: () =>\n\t\t\ttypeof options.origin === 'function' ? options.origin() : options.origin,\n\t\theartbeatMs: options.heartbeatMs ?? 15000,\n\t\tupstreamFetch: options.fetch ?? ((request) => fetch(request)),\n\t};\n\treturn {\n\t\tloader: only('GET', (request) => handle(config, request)),\n\t\taction: only('POST', (request) => handle(config, request)),\n\t};\n}\n"
9
+ "import { isCrossSite } from '../errors/cross-site';\nimport { checkDocuments } from './documents';\nimport { readAsked } from './read';\nimport { problem, Refusal, refusalResponse, refusedUpstream } from './refusal';\nimport { relay } from './relay';\n\ntype HeaderValues = Record<string, string | null | undefined> | Headers;\n\n/**\n * What React Router gives the resource route's `loader` and `action`, and what\n * `headers` receives beside the request: the route's `context` (the app's\n * `getLoadContext` value, `RouterContextProvider`) and `params`. Both are\n * optional so a call with the request alone, as in a spec, still type-checks.\n */\nexport interface SubscriptionArgs<Context = unknown> {\n\treadonly request: Request;\n\treadonly context?: Context;\n\treadonly params?: Readonly<Record<string, string | undefined>>;\n}\n\nexport interface SubscriptionProxyOptions<Context = unknown> {\n\t/** The API's GraphQL endpoint, which serves subscriptions over SSE. */\n\treadonly endpoint: string | URL;\n\t/**\n\t * The operations the browser may start: each name with the document the\n\t * proxy sends upstream for it. The client names an operation and sends\n\t * variables; its own `query` and `extensions` are ignored, so nothing it\n\t * writes reaches the API. A name that is not a key is a 403.\n\t */\n\treadonly allow: Readonly<Record<string, string>>;\n\t/** The session's token, from the request: `(request) => cookies.token(request)`. Empty is a 401. */\n\treadonly getToken: (\n\t\trequest: Request,\n\t) => string | null | undefined | Promise<string | null | undefined>;\n\t/**\n\t * Extra upstream headers (client name, proxy secret, `X-Forwarded-For`,\n\t * `Accept-Language`), fixed or built per request. A `null` or `undefined`\n\t * value is left out. A function gets the request and, as its second\n\t * argument, the route's loader or action arguments (`context`, `params`), so\n\t * it can send the trusted client address from the app's context instead of\n\t * copying a header the browser could forge. They reach this function only,\n\t * never the browser.\n\t */\n\treadonly headers?:\n\t\t| HeaderValues\n\t\t| ((\n\t\t\t\trequest: Request,\n\t\t\t\targs: SubscriptionArgs<Context>,\n\t\t ) => HeaderValues | Promise<HeaderValues>);\n\t/** The app's own origin for the cross-site check, as `jsonActions` takes it; the request's own by default. */\n\treadonly origin?: string | (() => string | undefined);\n\t/** A comment line sent this often so a proxy or Bun's `idleTimeout` keeps the stream open. 15000 by default; `0` turns it off. */\n\treadonly heartbeatMs?: number;\n\t/** The `fetch` used upstream. The global one by default. */\n\treadonly fetch?: (request: Request) => Promise<Response>;\n}\n\nexport interface SubscriptionProxy<Context = unknown> {\n\t/** A GET: graphql-sse's distinct connections mode, the operation in the search params. */\n\tloader(args: SubscriptionArgs<Context>): Promise<Response>;\n\t/** A POST: the operation in a JSON body. */\n\taction(args: SubscriptionArgs<Context>): Promise<Response>;\n}\n\ninterface Config {\n\treadonly endpoint: URL;\n\treadonly documents: ReadonlyMap<string, string>;\n\t// `Context` is the caller's own claim about what its route passes and is never checked; `never` lets any typed `headers` function be stored.\n\treadonly options: SubscriptionProxyOptions<never>;\n\treadonly origin: () => string | undefined;\n\treadonly heartbeatMs: number;\n\treadonly upstreamFetch: (request: Request) => Promise<Response>;\n}\n\nconst UNSAFE = /[\\r\\n\\0]/;\n\nasync function upstreamHeaders(\n\tconfig: Config,\n\targs: SubscriptionArgs,\n\ttoken: string,\n): Promise<Headers> {\n\tconst { headers } = config.options;\n\tconst extra =\n\t\ttypeof headers === 'function'\n\t\t\t? await headers(args.request, args as SubscriptionArgs<never>)\n\t\t\t: headers;\n\tconst out = new Headers();\n\tfor (const [name, value] of extra instanceof Headers\n\t\t? extra.entries()\n\t\t: Object.entries(extra ?? {}))\n\t\tif (value !== null && value !== undefined) out.set(name, value);\n\tout.set('content-type', 'application/json');\n\tout.set('accept', 'text/event-stream');\n\tout.set('authorization', `Bearer ${token}`);\n\treturn out;\n}\n\nasync function handle(\n\tconfig: Config,\n\targs: SubscriptionArgs,\n): Promise<Response> {\n\tconst { request } = args;\n\tif (isCrossSite(request, config.origin()))\n\t\treturn problem(403, 'Cross-site request refused.', 'FORBIDDEN');\n\tconst token = await config.options.getToken(request);\n\tif (!token || UNSAFE.test(token))\n\t\treturn problem(401, 'Sign in to continue.', 'UNAUTHENTICATED');\n\n\tlet asked: Awaited<ReturnType<typeof readAsked>>;\n\ttry {\n\t\tasked = await readAsked(request);\n\t} catch (error) {\n\t\tif (error instanceof Refusal) return refusalResponse(error);\n\t\treturn problem(400, 'The request body could not be read.', 'BAD_REQUEST');\n\t}\n\tconst query = config.documents.get(asked.operationName);\n\tif (query === undefined)\n\t\treturn problem(403, 'This operation is not allowed.', 'FORBIDDEN');\n\n\tlet headers: Headers;\n\ttry {\n\t\theaders = await upstreamHeaders(config, args, token);\n\t} catch {\n\t\treturn problem(\n\t\t\t500,\n\t\t\t\"The proxy's upstream headers are not valid (a name or a value no header can hold, or the headers function threw).\",\n\t\t\t'PROXY_MISCONFIGURED',\n\t\t);\n\t}\n\n\tconst abort = new AbortController();\n\tif (request.signal.aborted) abort.abort();\n\telse\n\t\trequest.signal.addEventListener('abort', () => abort.abort(), {\n\t\t\tonce: true,\n\t\t});\n\tlet upstream: Response;\n\ttry {\n\t\tupstream = await config.upstreamFetch(\n\t\t\tnew Request(config.endpoint, {\n\t\t\t\tmethod: 'POST',\n\t\t\t\theaders,\n\t\t\t\tbody: JSON.stringify({\n\t\t\t\t\tquery,\n\t\t\t\t\toperationName: asked.operationName,\n\t\t\t\t\t...(asked.variables === undefined\n\t\t\t\t\t\t? {}\n\t\t\t\t\t\t: { variables: asked.variables }),\n\t\t\t\t}),\n\t\t\t\tsignal: abort.signal,\n\t\t\t}),\n\t\t);\n\t} catch {\n\t\treturn problem(502, 'The API is unreachable.', 'UPSTREAM_ERROR');\n\t}\n\tconst streaming =\n\t\tupstream.ok &&\n\t\tupstream.body !== null &&\n\t\t(upstream.headers.get('content-type') ?? '').startsWith(\n\t\t\t'text/event-stream',\n\t\t);\n\tif (streaming) return relay(upstream, abort, config.heartbeatMs);\n\tif (upstream.ok) {\n\t\tabort.abort();\n\t\treturn problem(\n\t\t\t502,\n\t\t\t'The API did not answer with an event stream.',\n\t\t\t'UPSTREAM_ERROR',\n\t\t);\n\t}\n\tconst refused = await refusedUpstream(upstream);\n\tabort.abort();\n\treturn refused;\n}\n\nfunction only(\n\tmethod: string,\n\trun: (args: SubscriptionArgs) => Promise<Response>,\n): (args: SubscriptionArgs) => Promise<Response> {\n\treturn async (args) =>\n\t\targs.request.method === method\n\t\t\t? run(args)\n\t\t\t: problem(\n\t\t\t\t\t405,\n\t\t\t\t\t`Use ${method}.`,\n\t\t\t\t\t'METHOD_NOT_ALLOWED',\n\t\t\t\t\t{},\n\t\t\t\t\t{ allow: method },\n\t\t\t\t);\n}\n\n/**\n * A resource route that exposes GraphQL subscriptions to the browser without\n * giving it the API's token or a way to write its own document. See the\n * subscription guide.\n */\nexport function createSubscriptionProxy<Context = unknown>(\n\toptions: SubscriptionProxyOptions<Context>,\n): SubscriptionProxy<Context> {\n\tcheckDocuments(options.allow);\n\tconst config: Config = {\n\t\tendpoint: new URL(options.endpoint),\n\t\tdocuments: new Map(Object.entries(options.allow)),\n\t\toptions: options as SubscriptionProxyOptions<never>,\n\t\torigin: () =>\n\t\t\ttypeof options.origin === 'function' ? options.origin() : options.origin,\n\t\theartbeatMs: options.heartbeatMs ?? 15000,\n\t\tupstreamFetch: options.fetch ?? ((request) => fetch(request)),\n\t};\n\treturn {\n\t\tloader: only('GET', (args) => handle(config, args)),\n\t\taction: only('POST', (args) => handle(config, args)),\n\t};\n}\n"
10
10
  ],
11
- "mappings": "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",
12
- "debugId": "943D148BD34D8EDC64756E2164756E21",
11
+ "mappings": "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",
12
+ "debugId": "4D71F489F243030064756E2164756E21",
13
13
  "names": []
14
14
  }
@@ -1,5 +1,16 @@
1
1
  type HeaderValues = Record<string, string | null | undefined> | Headers;
2
- export interface SubscriptionProxyOptions {
2
+ /**
3
+ * What React Router gives the resource route's `loader` and `action`, and what
4
+ * `headers` receives beside the request: the route's `context` (the app's
5
+ * `getLoadContext` value, `RouterContextProvider`) and `params`. Both are
6
+ * optional so a call with the request alone, as in a spec, still type-checks.
7
+ */
8
+ export interface SubscriptionArgs<Context = unknown> {
9
+ readonly request: Request;
10
+ readonly context?: Context;
11
+ readonly params?: Readonly<Record<string, string | undefined>>;
12
+ }
13
+ export interface SubscriptionProxyOptions<Context = unknown> {
3
14
  /** The API's GraphQL endpoint, which serves subscriptions over SSE. */
4
15
  readonly endpoint: string | URL;
5
16
  /**
@@ -11,8 +22,16 @@ export interface SubscriptionProxyOptions {
11
22
  readonly allow: Readonly<Record<string, string>>;
12
23
  /** The session's token, from the request: `(request) => cookies.token(request)`. Empty is a 401. */
13
24
  readonly getToken: (request: Request) => string | null | undefined | Promise<string | null | undefined>;
14
- /** Extra upstream headers (client name, proxy secret, `X-Forwarded-For`, `Accept-Language`), fixed or built per request. A `null` or `undefined` value is left out. */
15
- readonly headers?: HeaderValues | ((request: Request) => HeaderValues | Promise<HeaderValues>);
25
+ /**
26
+ * Extra upstream headers (client name, proxy secret, `X-Forwarded-For`,
27
+ * `Accept-Language`), fixed or built per request. A `null` or `undefined`
28
+ * value is left out. A function gets the request and, as its second
29
+ * argument, the route's loader or action arguments (`context`, `params`), so
30
+ * it can send the trusted client address from the app's context instead of
31
+ * copying a header the browser could forge. They reach this function only,
32
+ * never the browser.
33
+ */
34
+ readonly headers?: HeaderValues | ((request: Request, args: SubscriptionArgs<Context>) => HeaderValues | Promise<HeaderValues>);
16
35
  /** The app's own origin for the cross-site check, as `jsonActions` takes it; the request's own by default. */
17
36
  readonly origin?: string | (() => string | undefined);
18
37
  /** A comment line sent this often so a proxy or Bun's `idleTimeout` keeps the stream open. 15000 by default; `0` turns it off. */
@@ -20,21 +39,17 @@ export interface SubscriptionProxyOptions {
20
39
  /** The `fetch` used upstream. The global one by default. */
21
40
  readonly fetch?: (request: Request) => Promise<Response>;
22
41
  }
23
- export interface SubscriptionProxy {
42
+ export interface SubscriptionProxy<Context = unknown> {
24
43
  /** A GET: graphql-sse's distinct connections mode, the operation in the search params. */
25
- loader(args: {
26
- request: Request;
27
- }): Promise<Response>;
44
+ loader(args: SubscriptionArgs<Context>): Promise<Response>;
28
45
  /** A POST: the operation in a JSON body. */
29
- action(args: {
30
- request: Request;
31
- }): Promise<Response>;
46
+ action(args: SubscriptionArgs<Context>): Promise<Response>;
32
47
  }
33
48
  /**
34
49
  * A resource route that exposes GraphQL subscriptions to the browser without
35
50
  * giving it the API's token or a way to write its own document. See the
36
51
  * subscription guide.
37
52
  */
38
- export declare function createSubscriptionProxy(options: SubscriptionProxyOptions): SubscriptionProxy;
53
+ export declare function createSubscriptionProxy<Context = unknown>(options: SubscriptionProxyOptions<Context>): SubscriptionProxy<Context>;
39
54
  export {};
40
55
  //# sourceMappingURL=proxy.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/subscription/proxy.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC;AAExE,MAAM,WAAW,wBAAwB;IACxC,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,CAClB,OAAO,EAAE,OAAO,KACZ,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpE,uKAAuK;IACvK,QAAQ,CAAC,OAAO,CAAC,EACd,YAAY,GACZ,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAChE,8GAA8G;IAC9G,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD,kIAAkI;IAClI,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,iBAAiB;IACjC,0FAA0F;IAC1F,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IACtD,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,OAAO,CAAA;KAAE,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACtD;AA0HD;;;;GAIG;AACH,wBAAgB,uBAAuB,CACtC,OAAO,EAAE,wBAAwB,GAC/B,iBAAiB,CAenB"}
1
+ {"version":3,"file":"proxy.d.ts","sourceRoot":"","sources":["../../src/subscription/proxy.ts"],"names":[],"mappings":"AAMA,KAAK,YAAY,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,GAAG,OAAO,CAAC;AAExE;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB,CAAC,OAAO,GAAG,OAAO;IAClD,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CAC/D;AAED,MAAM,WAAW,wBAAwB,CAAC,OAAO,GAAG,OAAO;IAC1D,uEAAuE;IACvE,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC;;;;;OAKG;IACH,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACjD,oGAAoG;IACpG,QAAQ,CAAC,QAAQ,EAAE,CAClB,OAAO,EAAE,OAAO,KACZ,MAAM,GAAG,IAAI,GAAG,SAAS,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC,CAAC;IACpE;;;;;;;;OAQG;IACH,QAAQ,CAAC,OAAO,CAAC,EACd,YAAY,GACZ,CAAC,CACD,OAAO,EAAE,OAAO,EAChB,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAC1B,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC;IAC9C,8GAA8G;IAC9G,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC,CAAC;IACtD,kIAAkI;IAClI,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,QAAQ,CAAC,CAAC;CACzD;AAED,MAAM,WAAW,iBAAiB,CAAC,OAAO,GAAG,OAAO;IACnD,0FAA0F;IAC1F,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC3D,4CAA4C;IAC5C,MAAM,CAAC,IAAI,EAAE,gBAAgB,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC3D;AAiID;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,GAAG,OAAO,EACxD,OAAO,EAAE,wBAAwB,CAAC,OAAO,CAAC,GACxC,iBAAiB,CAAC,OAAO,CAAC,CAe5B"}
@@ -938,6 +938,17 @@ authLinks({
938
938
  });
939
939
  ```
940
940
 
941
+ An API that refuses with several 429 codes (per address, per e-mail) gets a
942
+ countdown on each: `mailThrottled` takes a list, and every listed code
943
+ exposes its `retryAfter` to the page. The single string keeps working:
944
+
945
+ ```ts
946
+ authLinks({
947
+ signIn,
948
+ codes: { mailThrottled: ['auth.errors.address-throttled', 'auth.errors.mail-throttled'] },
949
+ });
950
+ ```
951
+
941
952
  A token is never logged, worded in an error or put in a redirect built by the
942
953
  helpers: the end states and the sign-in's redirects carry a state or a path
943
954
  alone, and a `TypeError` about a path prints it only up to its `?` or `#`.
@@ -17,8 +17,13 @@ client was generated from:
17
17
 
18
18
  ```ts
19
19
  // app/routes/events.ts: a resource route, served at /events
20
- import { createSubscriptionProxy } from '@alxia/react-router/subscription';
20
+ import { alxiaOf } from '@alxia/react-router';
21
+ import {
22
+ createSubscriptionProxy,
23
+ type SubscriptionArgs,
24
+ } from '@alxia/react-router/subscription';
21
25
  import { print } from 'graphql';
26
+ import type { RouterContextProvider } from 'react-router';
22
27
  import { ChatMessagesDocument, RoomEventsDocument } from '../generated/graphql';
23
28
  import { cookies } from '../session.server';
24
29
 
@@ -30,13 +35,16 @@ const events = createSubscriptionProxy({
30
35
  // or the document string codegen exports, or a literal
31
36
  },
32
37
  getToken: (request) => cookies.token(request),
33
- headers: (request) => ({
38
+ headers: (
39
+ request,
40
+ { context }: SubscriptionArgs<Readonly<RouterContextProvider>>,
41
+ ) => ({
34
42
  'x-client-name': 'my-bff',
35
43
  'x-proxy-secret': process.env.PROXY_SECRET,
36
- 'x-forwarded-for': request.headers.get('x-forwarded-for'),
44
+ // the trusted client address (behind `proxy: trustProxy(...)`), not the browser's own header; null leaves it out
45
+ 'x-forwarded-for': context ? alxiaOf(context).ip : null,
37
46
  'accept-language': request.headers.get('accept-language'),
38
- }),
39
- });
47
+ }),});
40
48
 
41
49
  export const loader = events.loader; // GET: operationName and variables in the query string
42
50
  export const action = events.action; // POST: the same in a JSON body
@@ -98,7 +106,7 @@ adapter or reverse proxy needs to buffer it.
98
106
  | `endpoint` | the API's GraphQL URL (required) |
99
107
  | `allow` | operation name to the document sent upstream (required); each document must define `subscription <name>`, that operation alone, checked when the proxy is created |
100
108
  | `getToken(request)` | the session's token, sync or async (required) |
101
- | `headers` | a record, `Headers`, or `(request) => record`; a `null` or `undefined` value is left out |
109
+ | `headers` | a record, `Headers`, or `(request, args) => record`, sync or async; `args` is what React Router gave the route (`request`, `context`, `params`), so a header can come from the app's context; a `null` or `undefined` value is left out. A `(request) => record` function keeps working |
102
110
  | `origin` | the app's origin for the same-site check, a string or a getter; the request's own by default |
103
111
  | `heartbeatMs` | 15000 |
104
112
  | `fetch` | the `fetch` used upstream (the global one); useful in specs |
@@ -2808,9 +2808,14 @@ string, or `variables` is not an object.
2808
2808
  ### A subscription answers 500 `The proxy's upstream headers are not valid …`
2809
2809
 
2810
2810
  **Why:** a value of `headers` (a forwarded `Accept-Language`, a secret from the
2811
- environment) holds a line break, or a name is not a header name.
2812
-
2813
- **Fix:** trim or validate the value before it goes in `headers`.
2811
+ environment) holds a line break, or a name is not a header name, or the
2812
+ `headers` function threw (for example `alxiaOf(context)` on a request served
2813
+ without alxia's context). The answer's text is fixed: nothing from the error
2814
+ reaches the browser.
2815
+
2816
+ **Fix:** trim or validate the value before it goes in `headers`, and guard the
2817
+ context (`context ? alxiaOf(context).ip : null`); read the error in your own
2818
+ log by catching inside the function.
2814
2819
 
2815
2820
  ### A subscription answers 429 with `retryAfter`
2816
2821
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alxia/react-router",
3
- "version": "0.21.0",
3
+ "version": "0.23.0",
4
4
  "description": "alxia as the server of a React Router framework app: server rendering behind the app's hooks, loaders reading its typed context, the client's assets served; the code with no UI an installable app shares (`/pwa`), its hooks (`/pwa/react`), `noCache` for the worker's script (`/pwa/server`), the service worker on Workbox (`/pwa/worker`) and its build (`/pwa/build`), an API's refusals worded for the page (`/errors`), the BFF session: cookies, sign-in, step-up and mail links (`/session`), its page hooks (`/session/react`) and what it shares with the page (`/session/model`), a GraphQL subscription relayed to the browser over SSE (`/subscription`), the page's CSP nonce and inline boot scripts (`/document`) and a streaming `entry.server` (`/entry`)",
5
5
  "license": "MIT",
6
6
  "type": "module",