@forestadmin/agent-bff 1.28.0 → 1.29.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
@@ -95,7 +95,7 @@ yarn start:dev # node --env-file=.env dist/cli.js
95
95
  | `FOREST_SERVER_URL` | yes | Forest SaaS API base URL. |
96
96
  | `FOREST_APP_URL` | yes | Forest front base URL, used to build the OAuth front-channel redirect (`src/oauth/oauth-routes.ts`). |
97
97
  | `AGENT_URL` | yes | The customer agent base URL the BFF calls via agent-client. |
98
- | `BFF_TOKEN_ENCRYPTION_KEY` | for OAuth | Base64-encoded 32-byte AES-256 key encrypting stored refresh tokens. Until it is set, the `/oauth/*` token-issuance routes are disabled and `/health` reports `degraded`; already-issued `bff_access` tokens still authenticate on `/agent/*` whenever `FOREST_AUTH_SECRET` is present. |
98
+ | `BFF_TOKEN_ENCRYPTION_KEY` | for OAuth | Base64-encoded 32-byte AES-256 key encrypting stored refresh tokens. Until it is set, the `/oauth/*` token-issuance routes are disabled and `/health` reports `configured.oauth: false` — but it stays `ok`, since the key gates OAuth and not boot; already-issued `bff_access` tokens still authenticate on `/agent/*` whenever `FOREST_AUTH_SECRET` is present. |
99
99
  | `HTTP_PORT` | no | Server port, integer 0–65535. Defaults to `3450`. `0` binds an OS-assigned ephemeral port. |
100
100
  | `BFF_ALLOWED_ORIGINS` | no | Comma-separated CORS allow-list of exact origins (scheme + host + port). No wildcard. Empty ⇒ no cross-origin browser access. |
101
101
  | `BFF_DEFAULT_TIMEZONE` | no | Fallback IANA timezone used when a request carries neither an `X-Forest-Timezone` header nor a body `timezone`. |
@@ -1,4 +1,6 @@
1
1
  import type { AgentTransport } from './agent-transport';
2
+ /** A sentinel that never reaches the network: `query` answers before any socket is opened. */
3
+ export declare const IN_PROCESS_AGENT_URL = "http://in-process.agent";
2
4
  export interface AgentDispatchRequest {
3
5
  method: 'get' | 'post' | 'put' | 'delete';
4
6
  path: string;
@@ -1,17 +1,18 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IN_PROCESS_AGENT_URL = void 0;
3
4
  exports.default = createInProcessTransport;
4
5
  const agent_client_1 = require("@forestadmin/agent-client");
5
6
  const bff_local_errors_1 = require("../http/bff-local-errors");
6
7
  /** A sentinel that never reaches the network: `query` answers before any socket is opened. */
7
- const IN_PROCESS_URL = 'http://in-process.agent';
8
+ exports.IN_PROCESS_AGENT_URL = 'http://in-process.agent';
8
9
  /**
9
10
  * Reaches the agent through the dispatcher instead of the network, reusing `HttpRequester`'s parse
10
11
  * helpers so results and error shape stay identical to the HTTP path.
11
12
  */
12
13
  class InProcessRequester extends agent_client_1.HttpRequester {
13
14
  constructor(bearerToken, dispatcher, defaultTimeoutMs) {
14
- super(bearerToken, { url: IN_PROCESS_URL });
15
+ super(bearerToken, { url: exports.IN_PROCESS_AGENT_URL });
15
16
  this.bearerToken = bearerToken;
16
17
  this.dispatcher = dispatcher;
17
18
  this.defaultTimeoutMs = defaultTimeoutMs;
@@ -60,18 +61,18 @@ class InProcessRequester extends agent_client_1.HttpRequester {
60
61
  * enough: `escapeUrlSlug` prefixes `+?*` with a backslash, which the WHATWG parser `buildUrl`
61
62
  * feeds reads as a path separator, and that parse also resolves `..` and splits a trailing query
62
63
  * off. Running it here is what keeps a given id addressing the same record over both transports —
63
- * both remain wrong for those three characters, which is PRD-1124's to fix on both at once.
64
+ * both remain wrong for those three characters — TODO(PRD-1124), to fix on both at once.
64
65
  */
65
66
  static toDispatchTarget(path) {
66
67
  const normalized = path.startsWith('/') ? path : `/${path}`;
67
- const url = new URL(`${IN_PROCESS_URL}${agent_client_1.HttpRequester.escapeUrlSlug(normalized)}`);
68
+ const url = new URL(`${exports.IN_PROCESS_AGENT_URL}${agent_client_1.HttpRequester.escapeUrlSlug(normalized)}`);
68
69
  return { path: url.pathname, query: Object.fromEntries(url.searchParams) };
69
70
  }
70
71
  }
71
72
  function createInProcessTransport({ dispatcher, timeoutMs, }) {
72
73
  return {
73
- url: IN_PROCESS_URL,
74
+ url: exports.IN_PROCESS_AGENT_URL,
74
75
  createRequester: token => new InProcessRequester(token, dispatcher, timeoutMs),
75
76
  };
76
77
  }
77
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy10cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvaW4tcHJvY2Vzcy10cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUEwSUEsMkNBUUM7QUFoSkQsNERBQTBEO0FBRTFELCtEQUFnRTtBQUVoRSw4RkFBOEY7QUFDOUYsTUFBTSxjQUFjLEdBQUcseUJBQXlCLENBQUM7QUErQmpEOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsNEJBQWE7SUFDNUMsWUFDbUIsV0FBbUIsRUFDbkIsVUFBMkIsRUFDM0IsZ0JBQXlCO1FBRTFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsY0FBYyxFQUFFLENBQUMsQ0FBQztRQUozQixnQkFBVyxHQUFYLFdBQVcsQ0FBUTtRQUNuQixlQUFVLEdBQVYsVUFBVSxDQUFpQjtRQUMzQixxQkFBZ0IsR0FBaEIsZ0JBQWdCLENBQVM7SUFHNUMsQ0FBQztJQUVELGdHQUFnRztJQUNoRyxnR0FBZ0c7SUFDaEcsd0RBQXdEO0lBQy9DLEtBQUssQ0FBQyxNQUFNO1FBQ25CLE1BQU0sSUFBQSx1Q0FBb0IsRUFBQywwREFBMEQsQ0FBQyxDQUFDO0lBQ3pGLENBQUM7SUFFUSxLQUFLLENBQUMsS0FBSyxDQUFpQixFQUNuQyxNQUFNLEVBQ04sSUFBSSxFQUNKLElBQUksRUFDSixLQUFLLEVBQ0wsY0FBYyxFQUNkLFdBQVcsRUFDWCxtQkFBbUIsR0FTcEI7UUFDQyxNQUFNLE1BQU0sR0FBRyxrQkFBa0IsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUV6RCxNQUFNLEVBQ0osTUFBTSxFQUNOLElBQUksRUFBRSxZQUFZLEVBQ2xCLElBQUksR0FDTCxHQUFHLE1BQU0sSUFBSSxDQUFDLFFBQVEsQ0FBQztZQUN0QixNQUFNO1lBQ04sSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO1lBQ2pCLE9BQU8sRUFBRTtnQkFDUCxhQUFhLEVBQUUsVUFBVSxJQUFJLENBQUMsV0FBVyxFQUFFO2dCQUMzQyxjQUFjLEVBQUUsV0FBVyxJQUFJLGtCQUFrQjtnQkFDakQsTUFBTSxFQUFFLFdBQVcsSUFBSSxrQkFBa0I7YUFDMUM7WUFDRCxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsY0FBYyxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssRUFBRSxHQUFHLEtBQUssRUFBRTtZQUM5RCxPQUFPLEVBQUUsSUFBSTtZQUNiLFNBQVMsRUFBRSxjQUFjLElBQUksSUFBSSxDQUFDLGdCQUFnQjtTQUNuRCxDQUFDLENBQUM7UUFFSCxJQUFJLE1BQU0sSUFBSSxHQUFHO1lBQUUsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxZQUFZLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFFckUsT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFPLFlBQVksRUFBRSxJQUFJLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQ7Ozs7T0FJRztJQUNLLEtBQUssQ0FBQyxRQUFRLENBQUMsT0FBNkI7UUFDbEQsSUFBSSxDQUFDO1lBQ0gsT0FBTyxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2hELENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsTUFBTSxNQUFNLEdBQUcsS0FBSyxZQUFZLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7WUFFckYsTUFBTSxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxFQUFFLE1BQU0sRUFBRSxDQUFDLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUM7UUFDdkQsQ0FBQztJQUNILENBQUM7SUFFRDs7Ozs7OztPQU9HO0lBQ0ssTUFBTSxDQUFDLGdCQUFnQixDQUFDLElBQVk7UUFJMUMsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBQzVELE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLEdBQUcsY0FBYyxHQUFHLDRCQUFhLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUVuRixPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxRQUFRLEVBQUUsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7SUFDN0UsQ0FBQztDQUNGO0FBT0QsU0FBd0Isd0JBQXdCLENBQUMsRUFDL0MsVUFBVSxFQUNWLFNBQVMsR0FDaUI7SUFDMUIsT0FBTztRQUNMLEdBQUcsRUFBRSxjQUFjO1FBQ25CLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUMifQ==
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW4tcHJvY2Vzcy10cmFuc3BvcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvYWdlbnQvaW4tcHJvY2Vzcy10cmFuc3BvcnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMElBLDJDQVFDO0FBaEpELDREQUEwRDtBQUUxRCwrREFBZ0U7QUFFaEUsOEZBQThGO0FBQ2pGLFFBQUEsb0JBQW9CLEdBQUcseUJBQXlCLENBQUM7QUErQjlEOzs7R0FHRztBQUNILE1BQU0sa0JBQW1CLFNBQVEsNEJBQWE7SUFDNUMsWUFDbUIsV0FBbUIsRUFDbkIsVUFBMkIsRUFDM0IsZ0JBQXlCO1FBRTFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsRUFBRSxHQUFHLEVBQUUsNEJBQW9CLEVBQUUsQ0FBQyxDQUFDO1FBSmpDLGdCQUFXLEdBQVgsV0FBVyxDQUFRO1FBQ25CLGVBQVUsR0FBVixVQUFVLENBQWlCO1FBQzNCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBUztJQUc1QyxDQUFDO0lBRUQsZ0dBQWdHO0lBQ2hHLGdHQUFnRztJQUNoRyx3REFBd0Q7SUFDL0MsS0FBSyxDQUFDLE1BQU07UUFDbkIsTUFBTSxJQUFBLHVDQUFvQixFQUFDLDBEQUEwRCxDQUFDLENBQUM7SUFDekYsQ0FBQztJQUVRLEtBQUssQ0FBQyxLQUFLLENBQWlCLEVBQ25DLE1BQU0sRUFDTixJQUFJLEVBQ0osSUFBSSxFQUNKLEtBQUssRUFDTCxjQUFjLEVBQ2QsV0FBVyxFQUNYLG1CQUFtQixHQVNwQjtRQUNDLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxDQUFDO1FBRXpELE1BQU0sRUFDSixNQUFNLEVBQ04sSUFBSSxFQUFFLFlBQVksRUFDbEIsSUFBSSxHQUNMLEdBQUcsTUFBTSxJQUFJLENBQUMsUUFBUSxDQUFDO1lBQ3RCLE1BQU07WUFDTixJQUFJLEVBQUUsTUFBTSxDQUFDLElBQUk7WUFDakIsT0FBTyxFQUFFO2dCQUNQLGFBQWEsRUFBRSxVQUFVLElBQUksQ0FBQyxXQUFXLEVBQUU7Z0JBQzNDLGNBQWMsRUFBRSxXQUFXLElBQUksa0JBQWtCO2dCQUNqRCxNQUFNLEVBQUUsV0FBVyxJQUFJLGtCQUFrQjthQUMxQztZQUNELEtBQUssRUFBRSxFQUFFLFFBQVEsRUFBRSxjQUFjLEVBQUUsR0FBRyxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsS0FBSyxFQUFFO1lBQzlELE9BQU8sRUFBRSxJQUFJO1lBQ2IsU0FBUyxFQUFFLGNBQWMsSUFBSSxJQUFJLENBQUMsZ0JBQWdCO1NBQ25ELENBQUMsQ0FBQztRQUVILElBQUksTUFBTSxJQUFJLEdBQUc7WUFBRSxNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFLFlBQVksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUVyRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQU8sWUFBWSxFQUFFLElBQUksRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0lBQ3pFLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssS0FBSyxDQUFDLFFBQVEsQ0FBQyxPQUE2QjtRQUNsRCxJQUFJLENBQUM7WUFDSCxPQUFPLE1BQU0sSUFBSSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDaEQsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixNQUFNLE1BQU0sR0FBRyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztZQUVyRixNQUFNLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLEVBQUUsTUFBTSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2RCxDQUFDO0lBQ0gsQ0FBQztJQUVEOzs7Ozs7O09BT0c7SUFDSyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsSUFBWTtRQUkxQyxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFDNUQsTUFBTSxHQUFHLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyw0QkFBb0IsR0FBRyw0QkFBYSxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUFDLENBQUM7UUFFekYsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLENBQUMsUUFBUSxFQUFFLEtBQUssRUFBRSxNQUFNLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxZQUFZLENBQUMsRUFBRSxDQUFDO0lBQzdFLENBQUM7Q0FDRjtBQU9ELFNBQXdCLHdCQUF3QixDQUFDLEVBQy9DLFVBQVUsRUFDVixTQUFTLEdBQ2lCO0lBQzFCLE9BQU87UUFDTCxHQUFHLEVBQUUsNEJBQW9CO1FBQ3pCLGVBQWUsRUFBRSxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUksa0JBQWtCLENBQUMsS0FBSyxFQUFFLFVBQVUsRUFBRSxTQUFTLENBQUM7S0FDL0UsQ0FBQztBQUNKLENBQUMifQ==
@@ -1,6 +1,8 @@
1
+ import type { AgentDispatcher } from './agent/in-process-transport';
1
2
  import type { BFFConfig } from './config/env-config';
2
3
  import type { UnfoldSource } from './openapi/unfolded-document';
3
4
  import type { Logger } from './ports/logger-port';
5
+ import type { Metrics } from './ports/metrics-port';
4
6
  import type { IncomingMessage, ServerResponse } from 'http';
5
7
  /** What a host must hand to `http.createServer`, or mount, to serve the BFF. */
6
8
  export type BffCallback = (req: IncomingMessage, res: ServerResponse) => void | Promise<void>;
@@ -16,6 +18,16 @@ export interface BuildBffOptions {
16
18
  * origin root. Normalized by `normalizeBasePath`, which throws on anything else.
17
19
  */
18
20
  basePath?: string;
21
+ /**
22
+ * Reaches an agent living in the same process, without a socket. When set, it replaces the HTTP
23
+ * transport entirely: `AGENT_URL` then only names where the agent answers, never how it is called.
24
+ */
25
+ dispatcher?: AgentDispatcher;
26
+ /**
27
+ * Where the read-model reports its gauges. Defaults to the console sink, which is what the
28
+ * standalone deployment wants; an embedding host passes its own, or a no-op.
29
+ */
30
+ metrics?: Metrics;
19
31
  }
20
32
  export interface Bff {
21
33
  callback: BffCallback;
@@ -41,6 +53,6 @@ export declare function resolveUnfoldSource(config: BFFConfig, logger: Logger):
41
53
  * answers 404 itself instead of yielding to a host `next()` — and every path it serves is absolute,
42
54
  * so a prefix mount would move `/health` and `/agent/...` off the paths the frontend calls.
43
55
  */
44
- export default function buildBff({ config, logger, basePath, }: BuildBffOptions): Promise<Bff>;
56
+ export default function buildBff({ config, logger, basePath, dispatcher, metrics, }: BuildBffOptions): Promise<Bff>;
45
57
  export {};
46
58
  //# sourceMappingURL=build-bff.d.ts.map
package/dist/build-bff.js CHANGED
@@ -45,6 +45,7 @@ const action_routes_middleware_1 = __importDefault(require("./action/action-rout
45
45
  const console_logger_1 = __importDefault(require("./adapters/console-logger"));
46
46
  const agent_stub_1 = __importDefault(require("./agent/agent-stub"));
47
47
  const agent_transport_1 = require("./agent/agent-transport");
48
+ const in_process_transport_1 = __importDefault(require("./agent/in-process-transport"));
48
49
  const ai_proxy_client_1 = __importDefault(require("./ai/ai-proxy-client"));
49
50
  const ai_routes_middleware_1 = __importStar(require("./ai/ai-routes-middleware"));
50
51
  const api_key_authenticator_1 = __importDefault(require("./api-key/api-key-authenticator"));
@@ -209,23 +210,29 @@ function resolveReadModelBundle(config, logger, metrics) {
209
210
  });
210
211
  return { store, apiKeyConfig };
211
212
  }
213
+ /**
214
+ * How this deployment reaches the agent: in-process when a dispatcher was handed over, over HTTP
215
+ * when an AGENT_URL was configured, and not at all otherwise — which is what makes the data and
216
+ * action routes fall back to their stub.
217
+ */
218
+ function resolveTransport(config, dispatcher) {
219
+ const timeoutMs = config.agentTimeoutMs;
220
+ if (dispatcher)
221
+ return (0, in_process_transport_1.default)({ dispatcher, timeoutMs });
222
+ if (config.agentUrl)
223
+ return (0, agent_transport_1.createHttpTransport)({ agentUrl: config.agentUrl, timeoutMs });
224
+ return undefined;
225
+ }
212
226
  /**
213
227
  * When unfolding is possible, in ONE place: the document needs the AGENT_URL the store does not,
214
228
  * because a collection's field set comes from the agent capabilities. The server passes the bundle it
215
229
  * already built for the data routes; the CLI goes through `resolveUnfoldSource`. Silent on purpose —
216
230
  * the two report a missing configuration differently.
217
231
  */
218
- function toUnfoldSource(bundle, config, logger) {
219
- if (!bundle || !config.agentUrl)
232
+ function toUnfoldSource(bundle, transport, logger) {
233
+ if (!bundle || !transport)
220
234
  return undefined;
221
- return {
222
- store: bundle.store,
223
- transport: (0, agent_transport_1.createHttpTransport)({
224
- agentUrl: config.agentUrl,
225
- timeoutMs: config.agentTimeoutMs,
226
- }),
227
- logger,
228
- };
235
+ return { store: bundle.store, transport, logger };
229
236
  }
230
237
  /**
231
238
  * Metrics are dropped rather than logged: without an explicit sink `createReadModel` builds a console
@@ -235,16 +242,15 @@ function toUnfoldSource(bundle, config, logger) {
235
242
  */
236
243
  const UNMEASURED = { increment: () => undefined, gauge: () => undefined };
237
244
  function resolveUnfoldSource(config, logger) {
238
- return toUnfoldSource(resolveReadModelBundle(config, logger, UNMEASURED), config, logger);
245
+ return toUnfoldSource(resolveReadModelBundle(config, logger, UNMEASURED), resolveTransport(config, undefined), logger);
239
246
  }
240
247
  // The data middleware falls through to the action middleware on a non-data path.
241
- function buildAgentRouteMiddlewares(bundle, config, logger, permissionsCache) {
248
+ function buildAgentRouteMiddlewares(bundle, transport, logger, permissionsCache) {
242
249
  if (!bundle) {
243
250
  logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
244
251
  return [(0, agent_stub_1.default)()];
245
252
  }
246
253
  const { store, apiKeyConfig } = bundle;
247
- const { agentUrl, agentTimeoutMs: timeoutMs } = config;
248
254
  const permissionsMiddleware = (0, permissions_routes_middleware_1.default)({
249
255
  store,
250
256
  client: new permissions_client_1.default({
@@ -254,11 +260,10 @@ function buildAgentRouteMiddlewares(bundle, config, logger, permissionsCache) {
254
260
  cache: permissionsCache,
255
261
  logger,
256
262
  });
257
- if (!agentUrl) {
263
+ if (!transport) {
258
264
  logger('Warn', 'Data and action endpoints disabled: AGENT_URL is missing');
259
265
  return [permissionsMiddleware, (0, agent_stub_1.default)()];
260
266
  }
261
- const transport = (0, agent_transport_1.createHttpTransport)({ agentUrl, timeoutMs });
262
267
  return [
263
268
  permissionsMiddleware,
264
269
  (0, data_routes_middleware_1.default)({ store, transport, logger }),
@@ -285,7 +290,7 @@ function buildAiMiddlewares(config, oauth, logger) {
285
290
  }),
286
291
  ];
287
292
  }
288
- function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
293
+ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath, transport, metrics) {
289
294
  const { forestAuthSecret, defaultTimezone } = config;
290
295
  if (!forestAuthSecret) {
291
296
  logger('Warn', 'Agent edge disabled: FOREST_AUTH_SECRET is missing');
@@ -294,8 +299,8 @@ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
294
299
  const apiKeyStep = buildApiKeyMiddleware(config, logger) ?? createApiKeyUnavailableGuard(logger);
295
300
  // One store for the whole edge. The document only unfolds when the agent is reachable too: with no
296
301
  // AGENT_URL every data path answers 501, so concrete paths would advertise a dead surface.
297
- const bundle = resolveReadModelBundle(config, logger);
298
- const source = toUnfoldSource(bundle, config, logger);
302
+ const bundle = resolveReadModelBundle(config, logger, metrics);
303
+ const source = toUnfoldSource(bundle, transport, logger);
299
304
  const permissionsCache = new permissions_cache_1.default();
300
305
  const chain = [
301
306
  (0, auth_mode_middleware_1.default)({ authSecret: forestAuthSecret }),
@@ -325,7 +330,7 @@ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
325
330
  : []),
326
331
  ...aiMiddlewares,
327
332
  (0, timezone_middleware_1.default)({ defaultTimezone }),
328
- ...buildAgentRouteMiddlewares(bundle, config, logger, permissionsCache),
333
+ ...buildAgentRouteMiddlewares(bundle, transport, logger, permissionsCache),
329
334
  ];
330
335
  return {
331
336
  middlewares: chain.map(agentScoped),
@@ -345,7 +350,7 @@ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
345
350
  * answers 404 itself instead of yielding to a host `next()` — and every path it serves is absolute,
346
351
  * so a prefix mount would move `/health` and `/agent/...` off the paths the frontend calls.
347
352
  */
348
- async function buildBff({ config, logger = (0, console_logger_1.default)(), basePath, }) {
353
+ async function buildBff({ config, logger = (0, console_logger_1.default)(), basePath, dispatcher, metrics, }) {
349
354
  // Before anything is assembled: a mount the host does not serve must fail at boot, not surface as
350
355
  // a docs page that cannot load itself.
351
356
  const mountPath = (0, base_path_1.default)(basePath);
@@ -355,16 +360,33 @@ async function buildBff({ config, logger = (0, console_logger_1.default)(), base
355
360
  });
356
361
  }
357
362
  (0, missing_config_warning_1.default)(config, logger);
363
+ if (config.allowedOrigins.length === 0) {
364
+ logger('Warn', 'No allowed origin: no browser can call this BFF. Set BFF_ALLOWED_ORIGINS, or `allowedOrigins`.');
365
+ }
366
+ const transport = resolveTransport(config, dispatcher);
358
367
  const oauth = buildOAuthMiddlewares(config, logger);
359
368
  const aiMiddlewares = buildAiMiddlewares(config, oauth, logger);
360
- const agentEdge = buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, mountPath);
369
+ const agentEdge = buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, mountPath, transport, metrics);
361
370
  const agentMiddlewares = agentEdge.middlewares;
362
371
  const hasAgentEdge = agentMiddlewares.length > 0;
363
372
  const agentErrorMiddleware = hasAgentEdge ? [agentScoped((0, error_middleware_1.default)({ logger }))] : [];
364
373
  const agentJsonOnlyGuard = hasAgentEdge ? [agentScoped(createJsonOnlyGuard())] : [];
365
374
  const middlewares = [
366
375
  (0, version_header_middleware_1.default)(version_1.default),
367
- (0, health_route_1.default)({ config, version: version_1.default }),
376
+ (0, health_route_1.default)({
377
+ version: version_1.default,
378
+ // Embedded, the rest is inherited from the agent, so there is no gap to report: a 503 here
379
+ // would let a load balancer restart a process that serves api-key traffic fine. The auth
380
+ // secret is still required — without it the agent edge is a stub and nothing authenticated
381
+ // can be served, which is exactly what a probe must see.
382
+ healthy: (dispatcher !== undefined && Boolean(config.forestAuthSecret)) || config.hasAllRequired,
383
+ configured: {
384
+ oauth: oauth.middlewares.length > 0,
385
+ ai: aiMiddlewares.length > 0,
386
+ cors: config.allowedOrigins.length > 0,
387
+ openapi: config.openapiEnabled && agentMiddlewares.length > 0,
388
+ },
389
+ }),
368
390
  (0, cors_middleware_1.default)({ allowedOrigins: config.allowedOrigins, logger }),
369
391
  ...agentErrorMiddleware,
370
392
  ...agentJsonOnlyGuard,
@@ -386,4 +408,4 @@ async function buildBff({ config, logger = (0, console_logger_1.default)(), base
386
408
  app.use(middleware);
387
409
  return { callback: app.callback(), invalidate: agentEdge.invalidate };
388
410
  }
389
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1aWxkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVKQSxnREFlQztBQXNKRCxrREFFQztBQW9KRCwyQkFpREM7QUF6ZkQsZ0RBQTZDO0FBQzdDLDhDQUFzQjtBQUV0QixpR0FBNkU7QUFDN0UsK0VBQTREO0FBQzVELG9FQUEyRDtBQUMzRCw2REFBOEQ7QUFDOUQsMkVBQWlEO0FBQ2pELGtGQUFxRjtBQUNyRiw0RkFBd0U7QUFDeEUsOEVBQW9EO0FBQ3BELHNGQUFrRTtBQUNsRSw0RUFBeUQ7QUFDekQsdUZBQW1FO0FBQ25FLDREQUE0QztBQUM1Qyw2RkFBZ0U7QUFDaEUsb0dBQWdGO0FBQ2hGLDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFFQUFrRDtBQUNsRCwwREFBMkU7QUFDM0UsZ0VBQThEO0FBQzlELCtFQUE0RDtBQUM1RCx1RUFBb0Q7QUFDcEQsaUdBQTZFO0FBQzdFLHlFQUFtRztBQUNuRyx3RkFBOEQ7QUFDOUQsd0VBQXFEO0FBQ3JELDBFQUErRDtBQUMvRCx3RUFBcUQ7QUFDckQsMkVBQTZFO0FBQzdFLHdGQUErRDtBQUMvRCwwRkFBaUU7QUFDakUsZ0hBQTRGO0FBQzVGLHlFQUFrRDtBQUNsRCwrRkFBMkU7QUFDM0UsdUZBQTZEO0FBQzdELHlGQUFzRTtBQUN0RSx3REFBZ0M7QUE0QmhDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRW5FLFNBQVMsT0FBTyxDQUFD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
411
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1aWxkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQW9LQSxnREFlQztBQWdLRCxrREFNQztBQW1KRCwyQkFpRkM7QUFqakJELGdEQUE2QztBQUM3Qyw4Q0FBc0I7QUFFdEIsaUdBQTZFO0FBQzdFLCtFQUE0RDtBQUM1RCxvRUFBMkQ7QUFDM0QsNkRBQThEO0FBQzlELHdGQUFvRTtBQUNwRSwyRUFBaUQ7QUFDakQsa0ZBQXFGO0FBQ3JGLDRGQUF3RTtBQUN4RSw4RUFBb0Q7QUFDcEQsc0ZBQWtFO0FBQ2xFLDRFQUF5RDtBQUN6RCx1RkFBbUU7QUFDbkUsNERBQTRDO0FBQzVDLDZGQUFnRTtBQUNoRSxvR0FBZ0Y7QUFDaEYsNkVBQTBEO0FBQzFELDJFQUFpRTtBQUNqRSwyRkFBdUU7QUFDdkUscUVBQWtEO0FBQ2xELDBEQUEyRTtBQUMzRSxnRUFBOEQ7QUFDOUQsK0VBQTREO0FBQzVELHVFQUFvRDtBQUNwRCxpR0FBNkU7QUFDN0UseUVBQW1HO0FBQ25HLHdGQUE4RDtBQUM5RCx3RUFBcUQ7QUFDckQsMEVBQStEO0FBQy9ELHdFQUFxRDtBQUNyRCwyRUFBNkU7QUFDN0Usd0ZBQStEO0FBQy9ELDBGQUFpRTtBQUNqRSxnSEFBNEY7QUFDNUYseUVBQWtEO0FBQ2xELCtGQUEyRTtBQUMzRSx1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQXNDaEMsTUFBTSxtQkFBbUIsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsQ0FBQztBQUV6QyxNQUFNLFlBQVksR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztBQUV2RCxNQUFNLGVBQWUsR0FBRyxDQUFDLGtCQUFrQixFQUFFLG9CQUFvQixDQUFDLENBQUM7QUFFbkUs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
@@ -136,7 +136,11 @@ function parseConfig(env) {
136
136
  }),
137
137
  httpPort: parsePort(env.HTTP_PORT),
138
138
  presence,
139
- hasAllRequired: exports.REQUIRED_KEYS.every(key => presence[key]) && tokenEncryptionKey !== undefined,
139
+ // The encryption key is deliberately not part of this: it gates OAuth, not boot, so a
140
+ // key-only deployment is fully operational and must not report degraded — `/health` would
141
+ // otherwise have a load balancer restart a process that serves its api-key and bearer traffic
142
+ // fine. Which optional surfaces are on is what `configured` reports.
143
+ hasAllRequired: exports.REQUIRED_KEYS.every(key => presence[key]),
140
144
  };
141
145
  }
142
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvZW52LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUEwRkEsd0NBMEJDO0FBNENELGtDQStEQztBQS9ORCw2QkFBd0I7QUFFeEIsMkNBQXFEO0FBQ3JELDJEQUEyQztBQUMzQyxzQ0FBK0M7QUFDL0MsbURBQXVEO0FBRTFDLFFBQUEsYUFBYSxHQUFHO0lBQzNCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQixXQUFXO0NBQ0gsQ0FBQztBQUlYLE1BQU0sUUFBUSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFVLENBQUM7QUF5Qi9FLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUNuQixRQUFBLHdCQUF3QixHQUFHLEtBQU0sQ0FBQztBQUNsQyxRQUFBLHFCQUFxQixHQUFHLE1BQU8sQ0FBQztBQUNoQyxRQUFBLGNBQWMsR0FBRyxVQUFhLENBQUM7QUFDL0IsUUFBQSwrQkFBK0IsR0FBRyxHQUFHLENBQUM7QUFDdEMsUUFBQSw0QkFBNEIsR0FBRyxLQUFNLENBQUM7QUFDdEMsUUFBQSx1QkFBdUIsR0FBRyxLQUFNLENBQUM7QUFDakMsUUFBQSx3QkFBd0IsR0FBRyxJQUFLLENBQUM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDO0FBQ2hELE1BQU0sZUFBZSxHQUFHLE9BQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUV4RCxTQUFTLFNBQVMsQ0FBQyxLQUF5QjtJQUMxQyxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FB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
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW52LWNvbmZpZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvZW52LWNvbmZpZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUEwRkEsd0NBMEJDO0FBNENELGtDQW1FQztBQW5PRCw2QkFBd0I7QUFFeEIsMkNBQXFEO0FBQ3JELDJEQUEyQztBQUMzQyxzQ0FBK0M7QUFDL0MsbURBQXVEO0FBRTFDLFFBQUEsYUFBYSxHQUFHO0lBQzNCLG9CQUFvQjtJQUNwQixtQkFBbUI7SUFDbkIsbUJBQW1CO0lBQ25CLGdCQUFnQjtJQUNoQixXQUFXO0NBQ0gsQ0FBQztBQUlYLE1BQU0sUUFBUSxHQUFHLENBQUMsbUJBQW1CLEVBQUUsZ0JBQWdCLEVBQUUsV0FBVyxDQUFVLENBQUM7QUF5Qi9FLE1BQU0sZUFBZSxHQUFHLE9BQU8sQ0FBQztBQUNuQixRQUFBLHdCQUF3QixHQUFHLEtBQU0sQ0FBQztBQUNsQyxRQUFBLHFCQUFxQixHQUFHLE1BQU8sQ0FBQztBQUNoQyxRQUFBLGNBQWMsR0FBRyxVQUFhLENBQUM7QUFDL0IsUUFBQSwrQkFBK0IsR0FBRyxHQUFHLENBQUM7QUFDdEMsUUFBQSw0QkFBNEIsR0FBRyxLQUFNLENBQUM7QUFDdEMsUUFBQSx1QkFBdUIsR0FBRyxLQUFNLENBQUM7QUFDakMsUUFBQSx3QkFBd0IsR0FBRyxJQUFLLENBQUM7QUFDOUMsTUFBTSxRQUFRLEdBQUcsS0FBSyxDQUFDO0FBQ3ZCLE1BQU0sb0JBQW9CLEdBQUcsRUFBRSxDQUFDO0FBQ2hDLE1BQU0sY0FBYyxHQUFHLHdCQUF3QixDQUFDO0FBQ2hELE1BQU0sZUFBZSxHQUFHLE9BQUMsQ0FBQyxHQUFHLENBQUMsRUFBRSxRQUFRLEVBQUUsVUFBVSxFQUFFLENBQUMsQ0FBQztBQUV4RCxTQUFTLFNBQVMsQ0FBQyxLQUF5QjtJQUMxQyxPQUFPLEtBQUssS0FBSyxTQUFTLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxLQUFLLEVBQUUsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7QUFDeEUsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQzFCLEdBQXVCLEVBQ3ZCLE9BQWUsRUFDZixFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsUUFBUSxFQUFrRDtJQUV0RSxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDN0IsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sUUFBUSxDQUFDO0lBRXpDLE1BQU0sTUFBTSxHQUFHLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBRS9FLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsSUFBSSxNQUFNLEdBQUcsR0FBRyxJQUFJLE1BQU0sR0FBRyxHQUFHLEVBQUUsQ0FBQztRQUN6RCxNQUFNLElBQUksMkJBQWtCLENBQzFCLDBCQUEwQixPQUFPLCtCQUErQixHQUFHLFFBQVEsR0FBRyxHQUFHLENBQ2xGLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxNQUFNLENBQUM7QUFDaEIsQ0FBQztBQUVELFNBQVMsU0FBUyxDQUFDLEdBQVk7SUFDN0IsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsV0FBVyxFQUFFO1FBQzNDLEdBQUcsRUFBRSxDQUFDO1FBQ04sR0FBRyxFQUFFLFFBQVE7UUFDYixRQUFRLEVBQUUsa0JBQWdCO0tBQzNCLENBQUMsQ0FBQztBQUNMLENBQUM7QUFFRCxTQUFTLFNBQVMsQ0FBQyxLQUFhO0lBQzlCLE9BQU8sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLGVBQWUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO0FBQ3ZFLENBQUM7QUFFRCxTQUFnQixjQUFjLENBQUMsR0FBWTtJQUN6QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUztRQUFFLE9BQU8sU0FBUyxDQUFDO0lBRTFDLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN0QixNQUFNLElBQUksMkJBQWtCLENBQzFCLG9FQUFvRSxDQUNyRSxDQUFDO0lBQ0osQ0FBQztJQUVELElBQUksS0FBSyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxLQUFLLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLDJCQUFrQixDQUMxQixrRkFBa0YsQ0FDbkYsQ0FBQztJQUNKLENBQUM7SUFFRCxNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUUzQixJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssRUFBRSxJQUFJLEdBQUcsQ0FBQyxRQUFRLEtBQUssRUFBRSxFQUFFLENBQUM7UUFDL0MsTUFBTSxJQUFJLDJCQUFrQixDQUMxQixtRUFBbUUsQ0FDcEUsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLEdBQUcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN0QyxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFhO0lBQ3pDLE9BQU8sY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQyxNQUFNLEtBQUssb0JBQW9CLENBQUM7QUFDcEcsQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsR0FBWTtJQUN0QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFN0IsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsb0JBQW9CLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUN4RCxNQUFNLElBQUksMkJBQWtCLENBQzFCLHNGQUFzRixvQkFBb0IsbUJBQW1CLENBQzlILENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUM7QUFDZixDQUFDO0FBRUQsU0FBUyxjQUFjLENBQUMsR0FBdUIsRUFBRSxPQUFlLEVBQUUsU0FBaUI7SUFDakYsT0FBTyxtQkFBbUIsQ0FBQyxHQUFHLEVBQUUsT0FBTyxFQUFFLEVBQUUsR0FBRyxFQUFFLENBQUMsRUFBRSxHQUFHLEVBQUUsc0JBQWMsRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLENBQUMsQ0FBQztBQUNqRyxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxHQUFZO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUU3QixJQUFJLEtBQUssS0FBSyxTQUFTLElBQUksQ0FBQyxJQUFBLDBCQUFlLEVBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUNuRCxNQUFNLElBQUksMkJBQWtCLENBQzFCLDRFQUE0RSxDQUM3RSxDQUFDO0lBQ0osQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDO0FBQ2YsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsR0FBWTtJQUN2QyxNQUFNLEtBQUssR0FBRyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDbkQsSUFBSSxLQUFLLEtBQUssU0FBUyxJQUFJLEtBQUssS0FBSyxNQUFNO1FBQUUsT0FBTyxJQUFJLENBQUM7SUFDekQsSUFBSSxLQUFLLEtBQUssT0FBTztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRXBDLE1BQU0sSUFBSSwyQkFBa0IsQ0FDMUIsNEVBQTRFLENBQzdFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0IsV0FBVyxDQUFDLEdBQXNCO0lBQ2hELE1BQU0sVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ25DLHFCQUFhLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDVixDQUFDO0lBRTdDLEtBQUssTUFBTSxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDM0IsTUFBTSxLQUFLLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRTlCLElBQUksS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDO1lBQzdDLE1BQU0sSUFBSSwyQkFBa0IsQ0FBQywwQkFBMEIsR0FBRywrQkFBK0IsQ0FBQyxDQUFDO1FBQzdGLENBQUM7SUFDSCxDQUFDO0lBRUQsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFdBQVcsQ0FDakMscUJBQWEsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FDaEQsQ0FBQztJQUVqQixNQUFNLGtCQUFrQixHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyx3QkFBd0IsQ0FBQyxDQUFDO0lBQzVFLE1BQU0sRUFBRSxPQUFPLEVBQUUsY0FBYyxFQUFFLE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxHQUFHLElBQUEsNEJBQW1CLEVBQ3JGLEdBQUcsQ0FBQyxtQkFBbUIsQ0FDeEIsQ0FBQztJQUNGLE1BQU0sZUFBZSxHQUFHLG9CQUFvQixDQUFDLEdBQUcsQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRXZFLE9BQU87UUFDTCxnQkFBZ0IsRUFBRSxVQUFVLENBQUMsa0JBQWtCO1FBQy9DLGVBQWUsRUFBRSxVQUFVLENBQUMsaUJBQWlCO1FBQzdDLGVBQWUsRUFBRSxVQUFVLENBQUMsaUJBQWlCO1FBQzdDLFlBQVksRUFBRSxVQUFVLENBQUMsY0FBYztRQUN2QyxRQUFRLEVBQUUsVUFBVSxDQUFDLFNBQVM7UUFDOUIsU0FBUyxFQUFFLGNBQWMsQ0FBQyxHQUFHLENBQUMsY0FBYyxDQUFDO1FBQzdDLGtCQUFrQjtRQUNsQixjQUFjO1FBQ2QscUJBQXFCO1FBQ3JCLGVBQWU7UUFDZixjQUFjLEVBQUUsY0FBYyxDQUM1QixHQUFHLENBQUMsb0JBQW9CLEVBQ3hCLHNCQUFzQixFQUN0QixnQ0FBd0IsQ0FDekI7UUFDRCxXQUFXLEVBQUUsY0FBYyxDQUFDLEdBQUcsQ0FBQyxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSw2QkFBcUIsQ0FBQztRQUM5RixjQUFjLEVBQUUsbUJBQW1CLENBQUMsR0FBRyxDQUFDLG1CQUFtQixDQUFDO1FBQzVELG9CQUFvQixFQUFFLG1CQUFtQixDQUN2QyxHQUFHLENBQUMsMkJBQTJCLEVBQy9CLDZCQUE2QixFQUM3QjtZQUNFLEdBQUcsRUFBRSxDQUFDO1lBQ04sR0FBRyxFQUFFLCtCQUF1QjtZQUM1QixRQUFRLEVBQUUsdUNBQStCO1NBQzFDLENBQ0Y7UUFDRCxpQkFBaUIsRUFBRSxtQkFBbUIsQ0FDcEMsR0FBRyxDQUFDLHdCQUF3QixFQUM1QiwwQkFBMEIsRUFDMUI7WUFDRSxHQUFHLEVBQUUsZ0NBQXdCO1lBQzdCLEdBQUcsRUFBRSxzQkFBYztZQUNuQixRQUFRLEVBQUUsb0NBQTRCO1NBQ3ZDLENBQ0Y7UUFDRCxRQUFRLEVBQUUsU0FBUyxDQUFDLEdBQUcsQ0FBQyxTQUFTLENBQUM7UUFDbEMsUUFBUTtRQUNSLHNGQUFzRjtRQUN0RiwwRkFBMEY7UUFDMUYsOEZBQThGO1FBQzlGLHFFQUFxRTtRQUNyRSxjQUFjLEVBQUUscUJBQWEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDMUQsQ0FBQztBQUNKLENBQUMifQ==
@@ -21,6 +21,7 @@ export interface ContextValidation {
21
21
  }
22
22
  export interface ContextField {
23
23
  field: string;
24
+ recordKey?: string;
24
25
  type: FieldType;
25
26
  relationship?: RelationshipType;
26
27
  reference?: string;
@@ -1,9 +1,71 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
2
35
  Object.defineProperty(exports, "__esModule", { value: true });
3
36
  exports.default = buildContext;
37
+ const record_key_1 = __importStar(require("../data/record-key"));
4
38
  function toArray(value) {
5
39
  return Array.isArray(value) ? value : [];
6
40
  }
41
+ /**
42
+ * The deserializer writes the JSON:API resource identifier under this key, always, over whatever
43
+ * attribute landed there. The resource id is a string whatever the column type says, and a
44
+ * composite key reaches it packed, so it is never the value of the field that camelizes to `id` —
45
+ * a primary key named `Id` included.
46
+ */
47
+ const RESOURCE_ID_KEY = 'id';
48
+ /**
49
+ * The record keys this collection cannot promise, because more than one thing lands on them.
50
+ *
51
+ * Two fields whose technical names differ only by casing collapse onto one key (`first_name` and
52
+ * `firstName` both reach the response as `firstName`), and `id` always belongs to the resource
53
+ * identifier. Publishing a `recordKey` in either case would point a consumer at a value that is not
54
+ * the field's, which is worse than publishing nothing: `recordKey` is absent, the caller falls back
55
+ * to `field`, and the ambiguity stays visible instead of being papered over.
56
+ *
57
+ * Not covered: the deserializer also writes `meta` from the resource meta, so a field named `Meta`
58
+ * on an agent that emits one is shadowed the same way. agent-nodejs emits no per-resource meta, and
59
+ * reserving the key would drop a working `recordKey` on every agent that emits none.
60
+ */
61
+ function ambiguousRecordKeys(fields) {
62
+ const ambiguous = new Set([RESOURCE_ID_KEY]);
63
+ for (const [key, group] of (0, record_key_1.groupByRecordKey)(fields, field => field.field)) {
64
+ if (group.length > 1)
65
+ ambiguous.add(key);
66
+ }
67
+ return ambiguous;
68
+ }
7
69
  function toContextValidations(validations) {
8
70
  return toArray(validations)
9
71
  .filter((entry) => typeof entry === 'object' &&
@@ -11,8 +73,11 @@ function toContextValidations(validations) {
11
73
  typeof entry.type === 'string')
12
74
  .map(entry => 'value' in entry ? { type: entry.type, value: entry.value } : { type: entry.type });
13
75
  }
14
- function toContextField(field) {
76
+ function toContextField(field, ambiguousKeys) {
15
77
  const serialized = { field: field.field, type: field.type };
78
+ const key = (0, record_key_1.default)(field.field);
79
+ if (key !== field.field && !ambiguousKeys.has(key))
80
+ serialized.recordKey = key;
16
81
  if (field.relationship)
17
82
  serialized.relationship = field.relationship;
18
83
  if (field.reference)
@@ -57,11 +122,11 @@ function toContextAction(action) {
57
122
  }
58
123
  function toContextCollection(collection, readModel) {
59
124
  const allowedActions = readModel.getActionEndpoints()[collection.name] ?? {};
125
+ const fields = toArray(collection.fields).filter(field => typeof field === 'object' && field !== null);
126
+ const ambiguousKeys = ambiguousRecordKeys(fields);
60
127
  return {
61
128
  name: collection.name,
62
- fields: toArray(collection.fields)
63
- .filter(field => typeof field === 'object' && field !== null)
64
- .map(toContextField),
129
+ fields: fields.map(field => toContextField(field, ambiguousKeys)),
65
130
  actions: toArray(collection.actions)
66
131
  .filter(action => {
67
132
  const allowed = allowedActions[action?.name];
@@ -82,4 +147,4 @@ function buildContext(collections, readModel, meta) {
82
147
  meta: toContextMeta(meta),
83
148
  };
84
149
  }
85
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2J1aWxkLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFzSkEsK0JBU0M7QUFwR0QsU0FBUyxPQUFPLENBQUksS0FBNkI7SUFDL0MsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUMzQyxDQUFDO0FBSUQsU0FBUyxvQkFBb0IsQ0FBQyxXQUF5QztJQUNyRSxPQUFPLE9BQU8sQ0FBQyxXQUFXLENBQUM7U0FDeEIsTUFBTSxDQUNMLENBQUMsS0FBSyxFQUE4QyxFQUFFLENBQ3BELE9BQU8sS0FBSyxLQUFLLFFBQVE7UUFDekIsS0FBSyxLQUFLLElBQUk7UUFDZCxPQUFRLEtBQTRCLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FDekQ7U0FDQSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FDWCxPQUFPLElBQUksS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FDbkYsQ0FBQztBQUNOLENBQUM7QUFFRCxTQUFTLGNBQWMsQ0FBQyxLQUF5QjtJQUMvQyxNQUFNLFVBQVUsR0FBaUIsRUFBRSxLQUFLLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxJQUFJLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO0lBRTFFLElBQUksS0FBSyxDQUFDLFlBQVk7UUFBRSxVQUFVLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUM7SUFDckUsSUFBSSxLQUFLLENBQUMsU0FBUztRQUFFLFVBQVUsQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFD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
150
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtY29udGV4dC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2J1aWxkLWNvbnRleHQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnTUEsK0JBU0M7QUFoTUQsaUVBQWlFO0FBcURqRSxTQUFTLE9BQU8sQ0FBSSxLQUE2QjtJQUMvQyxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzNDLENBQUM7QUFJRDs7Ozs7R0FLRztBQUNILE1BQU0sZUFBZSxHQUFHLElBQUksQ0FBQztBQUU3Qjs7Ozs7Ozs7Ozs7O0dBWUc7QUFDSCxTQUFTLG1CQUFtQixDQUFDLE1BQTRCO0lBQ3ZELE1BQU0sU0FBUyxHQUFHLElBQUksR0FBRyxDQUFTLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUVyRCxLQUFLLE1BQU0sQ0FBQyxHQUFHLEVBQUUsS0FBSyxDQUFDLElBQUksSUFBQSw2QkFBZ0IsRUFBQyxNQUFNLEVBQUUsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUMxRSxJQUFJLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQztZQUFFLFNBQVMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDM0MsQ0FBQztJQUVELE9BQU8sU0FBUyxDQUFDO0FBQ25CLENBQUM7QUFFRCxTQUFTLG9CQUFvQixDQUFDLFdBQXlDO0lBQ3JFLE9BQU8sT0FBTyxDQUFDLFdBQVcsQ0FBQztTQUN4QixNQUFNLENBQ0wsQ0FBQyxLQUFLLEVBQThDLEVBQUUsQ0FDcEQsT0FBTyxLQUFLLEtBQUssUUFBUTtRQUN6QixLQUFLLEtBQUssSUFBSTtRQUNkLE9BQVEsS0FBNEIsQ0FBQyxJQUFJLEtBQUssUUFBUSxDQUN6RDtTQUNBLEdB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
@@ -3,6 +3,16 @@ import type { Middleware } from 'koa';
3
3
  export declare const ALLOWED_METHODS = "GET, POST, PUT, PATCH, DELETE, OPTIONS";
4
4
  export declare const ALLOWED_HEADERS = "Authorization, Content-Type, X-Forest-Timezone, X-Forest-Bff-Key, X-Request-Id, Forest-Projection";
5
5
  export declare const PREFLIGHT_MAX_AGE_SECONDS = 600;
6
+ /**
7
+ * Shaped like every other BFF error so a consumer branches on `error.type`. Built here rather than
8
+ * thrown: this middleware runs before the agent-scoped error middleware, so a throw would surface
9
+ * as a bare 500 instead of the contract.
10
+ */
11
+ export declare const ORIGIN_NOT_ALLOWED: {
12
+ readonly type: "origin_not_allowed";
13
+ readonly status: 403;
14
+ readonly message: "This origin is not allowed to call this BFF";
15
+ };
6
16
  export interface CorsMiddlewareOptions {
7
17
  allowedOrigins: string[];
8
18
  logger: Logger;
@@ -1,11 +1,55 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.PREFLIGHT_MAX_AGE_SECONDS = exports.ALLOWED_HEADERS = exports.ALLOWED_METHODS = void 0;
3
+ exports.ORIGIN_NOT_ALLOWED = exports.PREFLIGHT_MAX_AGE_SECONDS = exports.ALLOWED_HEADERS = exports.ALLOWED_METHODS = void 0;
4
4
  exports.default = createCorsMiddleware;
5
5
  const origin_1 = require("./origin");
6
+ /**
7
+ * Whether the caller is the very application serving this BFF. A same-origin request carries
8
+ * `Origin` too — the Fetch spec sends it on everything but GET and HEAD, and every BFF data route
9
+ * is a POST — so without this exemption a host serving its own UI next to a `/bff` mount would be
10
+ * refused on every request under the default empty allow-list, for an origin it has no reason to
11
+ * think it must name.
12
+ *
13
+ * Compared on host rather than on the full origin: a TLS-terminating proxy leaves `ctx.protocol` at
14
+ * `http` while the browser reports `https`, so matching the scheme would work in development and
15
+ * silently fail in production. The scheme is also the part a same-host attacker already controls.
16
+ *
17
+ * Forging the header buys nothing: a caller that can set `Origin` can simply omit it, which the
18
+ * allow-list lets through by design. What this cannot be reached by is the cross-site request the
19
+ * allow-list exists for — there the browser sets `Origin` to the attacking page, never to this host.
20
+ */
21
+ function isSameOrigin(origin, host) {
22
+ if (host === '')
23
+ return false;
24
+ let url;
25
+ try {
26
+ url = new URL(origin);
27
+ }
28
+ catch {
29
+ return false;
30
+ }
31
+ // `url.host` is already normalized by `new URL()` — lowercased, and stripped of a port that is
32
+ // the default for the scheme — while `ctx.host` is the raw `Host` header, which a client or proxy
33
+ // spells however it likes. Both differences have to be absorbed here, or the exemption refuses
34
+ // the very requests it exists for: `Host: APP.EXAMPLE.COM` or `Host: app.example.com:443` against
35
+ // `Origin: https://app.example.com`. A non-default port still has to match exactly.
36
+ const normalizedHost = host.toLowerCase();
37
+ const defaultPort = url.protocol === 'https:' ? '443' : '80';
38
+ return normalizedHost === url.host || normalizedHost === `${url.host}:${defaultPort}`;
39
+ }
6
40
  exports.ALLOWED_METHODS = 'GET, POST, PUT, PATCH, DELETE, OPTIONS';
7
41
  exports.ALLOWED_HEADERS = 'Authorization, Content-Type, X-Forest-Timezone, X-Forest-Bff-Key, X-Request-Id, Forest-Projection';
8
42
  exports.PREFLIGHT_MAX_AGE_SECONDS = 600;
43
+ /**
44
+ * Shaped like every other BFF error so a consumer branches on `error.type`. Built here rather than
45
+ * thrown: this middleware runs before the agent-scoped error middleware, so a throw would surface
46
+ * as a bare 500 instead of the contract.
47
+ */
48
+ exports.ORIGIN_NOT_ALLOWED = {
49
+ type: 'origin_not_allowed',
50
+ status: 403,
51
+ message: 'This origin is not allowed to call this BFF',
52
+ };
9
53
  function createCorsMiddleware({ allowedOrigins, logger, }) {
10
54
  return async function corsMiddleware(ctx, next) {
11
55
  const origin = ctx.get('Origin');
@@ -29,7 +73,19 @@ function createCorsMiddleware({ allowedOrigins, logger, }) {
29
73
  ctx.status = 204;
30
74
  return;
31
75
  }
76
+ // Refuse rather than run and let the browser discard the answer. Omitting the header only stops
77
+ // the caller from READING the response: the request still executed, so a list was read and an
78
+ // action was executed for an origin the allow-list names as unwelcome. It also stops being
79
+ // theoretical once a host sits in front of this app — a permissive `cors()` of its own answers
80
+ // the preflight with `*`, and the real request arrives here regardless.
81
+ // A caller with no `Origin` at all is untouched: that is every server-to-server api-key call.
82
+ // Nor is the host's own application, which the allow-list has nothing to say about.
83
+ if (origin && !allowed && !isSameOrigin(origin, ctx.host)) {
84
+ ctx.status = exports.ORIGIN_NOT_ALLOWED.status;
85
+ ctx.body = { error: exports.ORIGIN_NOT_ALLOWED };
86
+ return;
87
+ }
32
88
  await next();
33
89
  };
34
90
  }
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ycy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcnMvY29ycy1taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWVBLHVDQWdDQztBQTVDRCxxQ0FBeUQ7QUFFNUMsUUFBQSxlQUFlLEdBQUcsd0NBQXdDLENBQUM7QUFDM0QsUUFBQSxlQUFlLEdBQzFCLG1HQUFtRyxDQUFDO0FBQ3pGLFFBQUEseUJBQXlCLEdBQUcsR0FBRyxDQUFDO0FBTzdDLFNBQXdCLG9CQUFvQixDQUFDLEVBQzNDLGNBQWMsRUFDZCxNQUFNLEdBQ2dCO0lBQ3RCLE9BQU8sS0FBSyxVQUFVLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksTUFBTTtZQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFhLEVBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFdkUsSUFBSSxPQUFPO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU1RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixHQUFHLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLHVCQUFlLENBQUMsQ0FBQztnQkFDekQsR0FBRyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSx1QkFBZSxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLGlDQUF5QixDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDO2lCQUFNLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLENBQUMsTUFBTSxFQUFFLCtCQUErQixFQUFFO29CQUM5QyxNQUFNLEVBQUUsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQztvQkFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2lCQUNmLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUVqQixPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sSUFBSSxFQUFFLENBQUM7SUFDZixDQUFDLENBQUM7QUFDSixDQUFDIn0=
91
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29ycy1taWRkbGV3YXJlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvcnMvY29ycy1taWRkbGV3YXJlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQStEQSx1Q0E4Q0M7QUExR0QscUNBQXlEO0FBRXpEOzs7Ozs7Ozs7Ozs7OztHQWNHO0FBQ0gsU0FBUyxZQUFZLENBQUMsTUFBYyxFQUFFLElBQVk7SUFDaEQsSUFBSSxJQUFJLEtBQUssRUFBRTtRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRTlCLElBQUksR0FBUSxDQUFDO0lBRWIsSUFBSSxDQUFDO1FBQ0gsR0FBRyxHQUFHLElBQUksR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3hCLENBQUM7SUFBQyxNQUFNLENBQUM7UUFDUCxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFFRCwrRkFBK0Y7SUFDL0Ysa0dBQWtHO0lBQ2xHLCtGQUErRjtJQUMvRixrR0FBa0c7SUFDbEcsb0ZBQW9GO0lBQ3BGLE1BQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztJQUMxQyxNQUFNLFdBQVcsR0FBRyxHQUFHLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUM7SUFFN0QsT0FBTyxjQUFjLEtBQUssR0FBRyxDQUFDLElBQUksSUFBSSxjQUFjLEtBQUssR0FBRyxHQUFHLENBQUMsSUFBSSxJQUFJLFdBQVcsRUFBRSxDQUFDO0FBQ3hGLENBQUM7QUFFWSxRQUFBLGVBQWUsR0FBRyx3Q0FBd0MsQ0FBQztBQUMzRCxRQUFBLGVBQWUsR0FDMUIsbUdBQW1HLENBQUM7QUFDekYsUUFBQSx5QkFBeUIsR0FBRyxHQUFHLENBQUM7QUFFN0M7Ozs7R0FJRztBQUNVLFFBQUEsa0JBQWtCLEdBQUc7SUFDaEMsSUFBSSxFQUFFLG9CQUFvQjtJQUMxQixNQUFNLEVBQUUsR0FBRztJQUNYLE9BQU8sRUFBRSw2Q0FBNkM7Q0FDOUMsQ0FBQztBQU9YLFNBQXdCLG9CQUFvQixDQUFDLEVBQzNDLGNBQWMsRUFDZCxNQUFNLEdBQ2dCO0lBQ3RCLE9BQU8sS0FBSyxVQUFVLGNBQWMsQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUM1QyxNQUFNLE1BQU0sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO1FBRWpDLElBQUksTUFBTTtZQUFFLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFL0IsTUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxJQUFBLHNCQUFhLEVBQUMsTUFBTSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7UUFFdkUsSUFBSSxPQUFPO1lBQUUsR0FBRyxDQUFDLEdBQUcsQ0FBQyw2QkFBNkIsRUFBRSxNQUFNLENBQUMsQ0FBQztRQUU1RCxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFLENBQUM7WUFDN0IsSUFBSSxPQUFPLEVBQUUsQ0FBQztnQkFDWixHQUFHLENBQUMsR0FBRyxDQUFDLDhCQUE4QixFQUFFLHVCQUFlLENBQUMsQ0FBQztnQkFDekQsR0FBRyxDQUFDLEdBQUcsQ0FBQyw4QkFBOEIsRUFBRSx1QkFBZSxDQUFDLENBQUM7Z0JBQ3pELEdBQUcsQ0FBQyxHQUFHLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLGlDQUF5QixDQUFDLENBQUMsQ0FBQztZQUN2RSxDQUFDO2lCQUFNLElBQUksTUFBTSxJQUFJLEdBQUcsQ0FBQyxHQUFHLENBQUMsK0JBQStCLENBQUMsRUFBRSxDQUFDO2dCQUM5RCxNQUFNLENBQUMsTUFBTSxFQUFFLCtCQUErQixFQUFFO29CQUM5QyxNQUFNLEVBQUUsSUFBQSx1QkFBYyxFQUFDLE1BQU0sQ0FBQztvQkFDOUIsSUFBSSxFQUFFLEdBQUcsQ0FBQyxJQUFJO2lCQUNmLENBQUMsQ0FBQztZQUNMLENBQUM7WUFFRCxHQUFHLENBQUMsTUFBTSxHQUFHLEdBQUcsQ0FBQztZQUVqQixPQUFPO1FBQ1QsQ0FBQztRQUVELGdHQUFnRztRQUNoRyw4RkFBOEY7UUFDOUYsMkZBQTJGO1FBQzNGLCtGQUErRjtRQUMvRix3RUFBd0U7UUFDeEUsOEZBQThGO1FBQzlGLG9GQUFvRjtRQUNwRixJQUFJLE1BQU0sSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsR0FBRyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUM7WUFDMUQsR0FBRyxDQUFDLE1BQU0sR0FBRywwQkFBa0IsQ0FBQyxNQUFNLENBQUM7WUFDdkMsR0FBRyxDQUFDLElBQUksR0FBRyxFQUFFLEtBQUssRUFBRSwwQkFBa0IsRUFBRSxDQUFDO1lBRXpDLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxJQUFJLEVBQUUsQ0FBQztJQUNmLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The key a field really carries in a response record. `agent-client` deserializes the agent's
3
+ * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
4
+ * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
5
+ * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
6
+ * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
7
+ * anything failing.
8
+ */
9
+ export default function recordKey(field: string): string;
10
+ /**
11
+ * The same names grouped by the key they reach the response under. A group of more than one is the
12
+ * transform being lossy: those names collapse onto one key and which of them it holds is not
13
+ * knowable from here.
14
+ */
15
+ export declare function groupByRecordKey<T>(items: readonly T[], name: (item: T) => string): Map<string, T[]>;
16
+ //# sourceMappingURL=record-key.d.ts.map
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.default = recordKey;
7
+ exports.groupByRecordKey = groupByRecordKey;
8
+ const inflected_1 = __importDefault(require("inflected"));
9
+ /**
10
+ * The key a field really carries in a response record. `agent-client` deserializes the agent's
11
+ * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
12
+ * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
13
+ * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
14
+ * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
15
+ * anything failing.
16
+ */
17
+ function recordKey(field) {
18
+ return inflected_1.default.camelize(inflected_1.default.underscore(field), false);
19
+ }
20
+ /**
21
+ * The same names grouped by the key they reach the response under. A group of more than one is the
22
+ * transform being lossy: those names collapse onto one key and which of them it holds is not
23
+ * knowable from here.
24
+ */
25
+ function groupByRecordKey(items, name) {
26
+ const byKey = new Map();
27
+ for (const item of items) {
28
+ const key = recordKey(name(item));
29
+ const group = byKey.get(key);
30
+ if (group)
31
+ group.push(item);
32
+ else
33
+ byKey.set(key, [item]);
34
+ }
35
+ return byKey;
36
+ }
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLWtleS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhL3JlY29yZC1rZXkudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFVQSw0QkFFQztBQU9ELDRDQWVDO0FBbENELDBEQUFrQztBQUVsQzs7Ozs7OztHQU9HO0FBQ0gsU0FBd0IsU0FBUyxDQUFDLEtBQWE7SUFDN0MsT0FBTyxtQkFBUyxDQUFDLFFBQVEsQ0FBQyxtQkFBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGdCQUFnQixDQUM5QixLQUFtQixFQUNuQixJQUF5QjtJQUV6QixNQUFNLEtBQUssR0FBRyxJQUFJLEdBQUcsRUFBZSxDQUFDO0lBRXJDLEtBQUssTUFBTSxJQUFJLElBQUksS0FBSyxFQUFFLENBQUM7UUFDekIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1FBQ2xDLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7UUFFN0IsSUFBSSxLQUFLO1lBQUUsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQzs7WUFDdkIsS0FBSyxDQUFDLEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNmLENBQUMifQ==
@@ -28,7 +28,16 @@ class BFFHttpServer {
28
28
  const { config, version } = options;
29
29
  const app = new koa_1.default();
30
30
  app.use((0, version_header_middleware_1.default)(version));
31
- app.use((0, health_route_1.default)({ config, version }));
31
+ app.use((0, health_route_1.default)({
32
+ version,
33
+ healthy: config.hasAllRequired,
34
+ configured: {
35
+ oauth: Boolean(config.tokenEncryptionKey),
36
+ ai: Boolean(config.tokenEncryptionKey),
37
+ cors: config.allowedOrigins.length > 0,
38
+ openapi: config.openapiEnabled,
39
+ },
40
+ }));
32
41
  for (const middleware of options.middlewares ?? []) {
33
42
  app.use(middleware);
34
43
  }
@@ -80,4 +89,4 @@ class BFFHttpServer {
80
89
  }
81
90
  }
82
91
  exports.default = BFFHttpServer;
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLWh0dHAtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvYmZmLWh0dHAtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsZ0RBQXdCO0FBQ3hCLDhDQUFzQjtBQUV0QixrRUFBK0M7QUFDL0MsNEZBQXdFO0FBQ3hFLGdGQUE2RDtBQUM3RCw4RkFBaUU7QUE0QmpFLFNBQVMsVUFBVSxDQUFDLE9BQTZCO0lBQy9DLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQXFCLGFBQWE7SUFNaEMsWUFBWSxPQUE2QjtRQUZqQyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUduQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBQSx3QkFBbUIsR0FBRSxDQUFDO1FBRXRELElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBRWhDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUEsZ0NBQWlCLEVBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBeUI7UUFDbkQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUV0QixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsbUNBQTZCLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRCxHQUFHLENB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
92
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLWh0dHAtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvYmZmLWh0dHAtc2VydmVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBTUEsZ0RBQXdCO0FBQ3hCLDhDQUFzQjtBQUV0QixrRUFBK0M7QUFDL0MsNEZBQXdFO0FBQ3hFLGdGQUE2RDtBQUM3RCw4RkFBaUU7QUE0QmpFLFNBQVMsVUFBVSxDQUFDLE9BQTZCO0lBQy9DLE9BQU8sT0FBTyxDQUFDLFFBQVEsS0FBSyxTQUFTLENBQUM7QUFDeEMsQ0FBQztBQUVELE1BQXFCLGFBQWE7SUFNaEMsWUFBWSxPQUE2QjtRQUZqQyxXQUFNLEdBQWtCLElBQUksQ0FBQztRQUduQyxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztRQUN2QixJQUFJLENBQUMsTUFBTSxHQUFHLE9BQU8sQ0FBQyxNQUFNLElBQUksSUFBQSx3QkFBbUIsR0FBRSxDQUFDO1FBRXRELElBQUksVUFBVSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUMsUUFBUSxDQUFDO1lBRWhDLE9BQU87UUFDVCxDQUFDO1FBRUQsSUFBSSxDQUFDLE9BQU8sR0FBRyxhQUFhLENBQUMsWUFBWSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ25ELElBQUEsZ0NBQWlCLEVBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7SUFDakQsQ0FBQztJQUVPLE1BQU0sQ0FBQyxZQUFZLENBQUMsT0FBeUI7UUFDbkQsTUFBTSxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFDcEMsTUFBTSxHQUFHLEdBQUcsSUFBSSxhQUFHLEVBQUUsQ0FBQztRQUV0QixHQUFHLENBQUMsR0FBRyxDQUFDLElBQUEsbUNBQTZCLEVBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztRQUNoRCxHQUFHLENB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
@@ -1,9 +1,22 @@
1
- import type { BFFConfig } from '../config/env-config';
2
1
  import type { Middleware } from 'koa';
3
2
  export declare const HEALTH_PATH = "/health";
3
+ /**
4
+ * Which optional surfaces this deployment was CONFIGURED to serve. Deliberately not a statement
5
+ * that they work: OAuth is `true` as soon as an encryption key is set, whether or not the Forest
6
+ * server ever answers. Naming it `configured` is the whole point — a reader who takes `oauth: true`
7
+ * for "OAuth is functional" will believe a misconfigured deployment is healthy.
8
+ */
9
+ export interface HealthConfigured {
10
+ oauth: boolean;
11
+ ai: boolean;
12
+ cors: boolean;
13
+ openapi: boolean;
14
+ }
4
15
  export interface HealthRouteOptions {
5
- config: BFFConfig;
6
16
  version: string;
17
+ /** Whether everything this deployment needs is configured. Embedded, it always is. */
18
+ healthy: boolean;
19
+ configured: HealthConfigured;
7
20
  }
8
- export default function createHealthRoute({ config, version }: HealthRouteOptions): Middleware;
21
+ export default function createHealthRoute({ version, healthy, configured, }: HealthRouteOptions): Middleware;
9
22
  //# sourceMappingURL=health-route.d.ts.map
@@ -3,15 +3,15 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.HEALTH_PATH = void 0;
4
4
  exports.default = createHealthRoute;
5
5
  exports.HEALTH_PATH = '/health';
6
- function createHealthRoute({ config, version }) {
6
+ function createHealthRoute({ version, healthy, configured, }) {
7
7
  return async function health(ctx, next) {
8
8
  const isHealthRequest = (ctx.method === 'GET' || ctx.method === 'HEAD') && ctx.path === exports.HEALTH_PATH;
9
9
  if (!isHealthRequest) {
10
10
  await next();
11
11
  return;
12
12
  }
13
- ctx.status = config.hasAllRequired ? 200 : 503;
14
- ctx.body = { status: config.hasAllRequired ? 'ok' : 'degraded', version };
13
+ ctx.status = healthy ? 200 : 503;
14
+ ctx.body = { status: healthy ? 'ok' : 'degraded', version, configured };
15
15
  };
16
16
  }
17
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvaGVhbHRoLXJvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQVVBLG9DQWNDO0FBckJZLFFBQUEsV0FBVyxHQUFHLFNBQVMsQ0FBQztBQU9yQyxTQUF3QixpQkFBaUIsQ0FBQyxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQXNCO0lBQy9FLE9BQU8sS0FBSyxVQUFVLE1BQU0sQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNwQyxNQUFNLGVBQWUsR0FDbkIsQ0FBQyxHQUFHLENBQUMsTUFBTSxLQUFLLEtBQUssSUFBSSxHQUFHLENBQUMsTUFBTSxLQUFLLE1BQU0sQ0FBQyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssbUJBQVcsQ0FBQztRQUU5RSxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUM7WUFDckIsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUViLE9BQU87UUFDVCxDQUFDO1FBRUQsR0FBRyxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsY0FBYyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUMvQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxDQUFDO0lBQzVFLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGVhbHRoLXJvdXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2h0dHAvaGVhbHRoLXJvdXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQXdCQSxvQ0FrQkM7QUF4Q1ksUUFBQSxXQUFXLEdBQUcsU0FBUyxDQUFDO0FBc0JyQyxTQUF3QixpQkFBaUIsQ0FBQyxFQUN4QyxPQUFPLEVBQ1AsT0FBTyxFQUNQLFVBQVUsR0FDUztJQUNuQixPQUFPLEtBQUssVUFBVSxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUk7UUFDcEMsTUFBTSxlQUFlLEdBQ25CLENBQUMsR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxNQUFNLENBQUMsSUFBSSxHQUFHLENBQUMsSUFBSSxLQUFLLG1CQUFXLENBQUM7UUFFOUUsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3JCLE1BQU0sSUFBSSxFQUFFLENBQUM7WUFFYixPQUFPO1FBQ1QsQ0FBQztRQUVELEdBQUcsQ0FBQyxNQUFNLEdBQUcsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQztRQUNqQyxHQUFHLENBQUMsSUFBSSxHQUFHLEVBQUUsTUFBTSxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFVBQVUsRUFBRSxDQUFDO0lBQzFFLENBQUMsQ0FBQztBQUNKLENBQUMifQ==
package/dist/index.d.ts CHANGED
@@ -3,6 +3,8 @@ export { parseConfig, REQUIRED_KEYS } from './config/env-config';
3
3
  export type { BFFConfig, PresenceMap, RequiredKey } from './config/env-config';
4
4
  export { default as runCli } from './cli-core';
5
5
  export { default as buildBff } from './build-bff';
6
+ export { default as createInProcessTransport, IN_PROCESS_AGENT_URL, } from './agent/in-process-transport';
7
+ export type { AgentDispatcher, AgentDispatchRequest, AgentDispatchResponse, } from './agent/in-process-transport';
6
8
  export type { Bff, BuildBffOptions, BffCallback } from './build-bff';
7
9
  export { ConfigurationError } from './errors';
8
10
  export { default as DEFAULT_BFF_PORT } from './defaults';
package/dist/index.js CHANGED
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.toApiKeyErrorBody = exports.keyResolutionUnavailable = exports.invalidRequest = exports.forestIdentityNotAllowed = exports.invalidApiKey = exports.ApiKeyError = exports.BFF_KEY_HEADER = exports.createApiKeyMiddleware = exports.createApiKeyAuthenticator = exports.createResolveCache = exports.ApiKeyResolveError = exports.ApiKeyClient = exports.AGENT_TOKEN_EXPIRES_IN = exports.issueAgentToken = exports.fingerprintApiKey = exports.hashApiKey = exports.parseApiKey = exports.OAuthRequestError = exports.createPkcePair = exports.BFF_ACCESS_TOKEN_TYPE = exports.issueBffAccessToken = exports.ensureFreshServerAccess = exports.createTokenCipher = exports.createInMemorySessionStore = exports.createOAuthRoutes = exports.OAuthExchangeError = exports.ForestServerClient = exports.version = exports.createConsoleLogger = exports.DEFAULT_BFF_PORT = exports.ConfigurationError = exports.buildBff = exports.runCli = exports.REQUIRED_KEYS = exports.parseConfig = exports.BFFHttpServer = void 0;
6
+ exports.toApiKeyErrorBody = exports.keyResolutionUnavailable = exports.invalidRequest = exports.forestIdentityNotAllowed = exports.invalidApiKey = exports.ApiKeyError = exports.BFF_KEY_HEADER = exports.createApiKeyMiddleware = exports.createApiKeyAuthenticator = exports.createResolveCache = exports.ApiKeyResolveError = exports.ApiKeyClient = exports.AGENT_TOKEN_EXPIRES_IN = exports.issueAgentToken = exports.fingerprintApiKey = exports.hashApiKey = exports.parseApiKey = exports.OAuthRequestError = exports.createPkcePair = exports.BFF_ACCESS_TOKEN_TYPE = exports.issueBffAccessToken = exports.ensureFreshServerAccess = exports.createTokenCipher = exports.createInMemorySessionStore = exports.createOAuthRoutes = exports.OAuthExchangeError = exports.ForestServerClient = exports.version = exports.createConsoleLogger = exports.DEFAULT_BFF_PORT = exports.ConfigurationError = exports.IN_PROCESS_AGENT_URL = exports.createInProcessTransport = exports.buildBff = exports.runCli = exports.REQUIRED_KEYS = exports.parseConfig = exports.BFFHttpServer = void 0;
7
7
  var bff_http_server_1 = require("./http/bff-http-server");
8
8
  Object.defineProperty(exports, "BFFHttpServer", { enumerable: true, get: function () { return __importDefault(bff_http_server_1).default; } });
9
9
  var env_config_1 = require("./config/env-config");
@@ -13,6 +13,9 @@ var cli_core_1 = require("./cli-core");
13
13
  Object.defineProperty(exports, "runCli", { enumerable: true, get: function () { return __importDefault(cli_core_1).default; } });
14
14
  var build_bff_1 = require("./build-bff");
15
15
  Object.defineProperty(exports, "buildBff", { enumerable: true, get: function () { return __importDefault(build_bff_1).default; } });
16
+ var in_process_transport_1 = require("./agent/in-process-transport");
17
+ Object.defineProperty(exports, "createInProcessTransport", { enumerable: true, get: function () { return __importDefault(in_process_transport_1).default; } });
18
+ Object.defineProperty(exports, "IN_PROCESS_AGENT_URL", { enumerable: true, get: function () { return in_process_transport_1.IN_PROCESS_AGENT_URL; } });
16
19
  var errors_1 = require("./errors");
17
20
  Object.defineProperty(exports, "ConfigurationError", { enumerable: true, get: function () { return errors_1.ConfigurationError; } });
18
21
  var defaults_1 = require("./defaults");
@@ -63,4 +66,4 @@ Object.defineProperty(exports, "forestIdentityNotAllowed", { enumerable: true, g
63
66
  Object.defineProperty(exports, "invalidRequest", { enumerable: true, get: function () { return api_key_error_1.invalidRequest; } });
64
67
  Object.defineProperty(exports, "keyResolutionUnavailable", { enumerable: true, get: function () { return api_key_error_1.keyResolutionUnavailable; } });
65
68
  Object.defineProperty(exports, "toApiKeyErrorBody", { enumerable: true, get: function () { return api_key_error_1.toErrorBody; } });
66
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQWtFO0FBQXpELGlJQUFBLE9BQU8sT0FBaUI7QUFDakMsa0RBQWlFO0FBQXhELHlHQUFBLFdBQVcsT0FBQTtBQUFFLDJHQUFBLGFBQWEsT0FBQTtBQUVuQyx1Q0FBK0M7QUFBdEMsbUhBQUEsT0FBTyxPQUFVO0FBQzFCLHlDQUFrRDtBQUF6QyxzSEFBQSxPQUFPLE9BQVk7QUFFNUIsbUNBQThDO0FBQXJDLDRHQUFBLGtCQUFrQixPQUFBO0FBQzNCLHVDQUF5RDtBQUFoRCw2SEFBQSxPQUFPLE9BQW9CO0FBQ3BDLDREQUEyRTtBQUFsRSxzSUFBQSxPQUFPLE9BQXVCO0FBRXZDLHFDQUErQztBQUF0QyxtSEFBQSxPQUFPLE9BQVc7QUFDM0IscUVBQWlHO0FBQXhGLDJJQUFBLE9BQU8sT0FBc0I7QUFBRSwwSEFBQSxrQkFBa0IsT0FBQTtBQU0xRCxxREFBb0U7QUFBM0Qsa0lBQUEsT0FBTyxPQUFxQjtBQUNyQyx1REFBOEU7QUFBckUsNElBQUEsT0FBTyxPQUE4QjtBQUU5QyxxREFBb0U7QUFBM0Qsa0lBQUEsT0FBTyxPQUFxQjtBQUNyQywrREFBK0U7QUFBdEUsNklBQUEsT0FBTyxPQUEyQjtBQUMzQywrQ0FBK0U7QUFBdEUsZ0hBQUEsbUJBQW1CLE9BQUE7QUFBRSxrSEFBQSxxQkFBcUIsT0FBQTtBQUVuRCxxQ0FBOEM7QUFBckMsc0dBQUEsY0FBYyxPQUFBO0FBQ3ZCLG1EQUF3RDtBQUEvQyxnSEFBQSxpQkFBaUIsT0FBQTtBQUMxQiw2Q0FBK0U7QUFBdEUsc0dBQUEsV0FBVyxPQUFBO0FBQUUscUdBQUEsVUFBVSxPQUFBO0FBQUUsNEdBQUEsaUJBQWlCLE9BQUE7QUFFbkQscURBQWdGO0FBQXZFLDhHQUFBLGVBQWUsT0FBQTtBQUFFLHFIQUFBLHNCQUFzQixPQUFBO0FBQ2hELDJEQUF1RjtBQUE5RSwrSEFBQSxPQUFPLE9BQWdCO0FBQUUsb0hBQUEsa0JBQWtCLE9BQUE7QUFNcEQseURBQXdFO0FBQS9ELG9JQUFBLE9BQU8sT0FBc0I7QUFFdEMseUVBQXVGO0FBQTlFLG1KQUFBLE9BQU8sT0FBNkI7QUFNN0MsbUVBQWlHO0FBQXhGLDZJQUFBLE9BQU8sT0FBMEI7QUFBRSxvSEFBQSxjQUFjLE9BQUE7QUFDMUQseURBT2lDO0FBTi9CLDRHQUFBLFdBQVcsT0FBQTtBQUNYLDhHQUFBLGFBQWEsT0FBQTtBQUNiLHlIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLCtHQUFBLGNBQWMsT0FBQTtBQUNkLHlIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLGtIQUFBLFdBQVcsT0FBcUIifQ==
69
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsMERBQWtFO0FBQXpELGlJQUFBLE9BQU8sT0FBaUI7QUFDakMsa0RBQWlFO0FBQXhELHlHQUFBLFdBQVcsT0FBQTtBQUFFLDJHQUFBLGFBQWEsT0FBQTtBQUVuQyx1Q0FBK0M7QUFBdEMsbUhBQUEsT0FBTyxPQUFVO0FBQzFCLHlDQUFrRDtBQUF6QyxzSEFBQSxPQUFPLE9BQVk7QUFDNUIscUVBR3NDO0FBRnBDLGlKQUFBLE9BQU8sT0FBNEI7QUFDbkMsNEhBQUEsb0JBQW9CLE9BQUE7QUFRdEIsbUNBQThDO0FBQXJDLDRHQUFBLGtCQUFrQixPQUFBO0FBQzNCLHVDQUF5RDtBQUFoRCw2SEFBQSxPQUFPLE9BQW9CO0FBQ3BDLDREQUEyRTtBQUFsRSxzSUFBQSxPQUFPLE9BQXVCO0FBRXZDLHFDQUErQztBQUF0QyxtSEFBQSxPQUFPLE9BQVc7QUFDM0IscUVBQWlHO0FBQXhGLDJJQUFBLE9BQU8sT0FBc0I7QUFBRSwwSEFBQSxrQkFBa0IsT0FBQTtBQU0xRCxxREFBb0U7QUFBM0Qsa0lBQUEsT0FBTyxPQUFxQjtBQUNyQyx1REFBOEU7QUFBckUsNElBQUEsT0FBTyxPQUE4QjtBQUU5QyxxREFBb0U7QUFBM0Qsa0lBQUEsT0FBTyxPQUFxQjtBQUNyQywrREFBK0U7QUFBdEUsNklBQUEsT0FBTyxPQUEyQjtBQUMzQywrQ0FBK0U7QUFBdEUsZ0hBQUEsbUJBQW1CLE9BQUE7QUFBRSxrSEFBQSxxQkFBcUIsT0FBQTtBQUVuRCxxQ0FBOEM7QUFBckMsc0dBQUEsY0FBYyxPQUFBO0FBQ3ZCLG1EQUF3RDtBQUEvQyxnSEFBQSxpQkFBaUIsT0FBQTtBQUMxQiw2Q0FBK0U7QUFBdEUsc0dBQUEsV0FBVyxPQUFBO0FBQUUscUdBQUEsVUFBVSxPQUFBO0FBQUUsNEdBQUEsaUJBQWlCLE9BQUE7QUFFbkQscURBQWdGO0FBQXZFLDhHQUFBLGVBQWUsT0FBQTtBQUFFLHFIQUFBLHNCQUFzQixPQUFBO0FBQ2hELDJEQUF1RjtBQUE5RSwrSEFBQSxPQUFPLE9BQWdCO0FBQUUsb0hBQUEsa0JBQWtCLE9BQUE7QUFNcEQseURBQXdFO0FBQS9ELG9JQUFBLE9BQU8sT0FBc0I7QUFFdEMseUVBQXVGO0FBQTlFLG1KQUFBLE9BQU8sT0FBNkI7QUFNN0MsbUVBQWlHO0FBQXhGLDZJQUFBLE9BQU8sT0FBMEI7QUFBRSxvSEFBQSxjQUFjLE9BQUE7QUFDMUQseURBT2lDO0FBTi9CLDRHQUFBLFdBQVcsT0FBQTtBQUNYLDhHQUFBLGFBQWEsT0FBQTtBQUNiLHlIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLCtHQUFBLGNBQWMsT0FBQTtBQUNkLHlIQUFBLHdCQUF3QixPQUFBO0FBQ3hCLGtIQUFBLFdBQVcsT0FBcUIifQ==
@@ -1,14 +1,5 @@
1
1
  import type { UnfoldedCollection } from './unfolding';
2
2
  import type { ReferenceObject, SchemaObject } from 'openapi3-ts/oas31';
3
- /**
4
- * The key a field really carries in a response record. `agent-client` deserializes the agent's
5
- * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
6
- * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
7
- * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
8
- * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
9
- * anything failing.
10
- */
11
- export declare function recordKey(field: string): string;
12
3
  /**
13
4
  * The record shape of one collection. The properties are what the capabilities report, and nothing
14
5
  * more is forbidden: the capabilities route leaves out a OneToOne relation that the default
@@ -3,24 +3,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.recordKey = recordKey;
7
6
  exports.default = recordSchema;
8
7
  exports.listResponseSchema = listResponseSchema;
9
- const inflected_1 = __importDefault(require("inflected"));
10
8
  const field_schemas_1 = __importDefault(require("./field-schemas"));
11
9
  const names_1 = require("./names");
12
10
  const pack_id_1 = require("../data/pack-id");
13
- /**
14
- * The key a field really carries in a response record. `agent-client` deserializes the agent's
15
- * JSON:API with `keyForAttribute: 'camelCase'` (`http-requester.ts`), which is exactly this pair of
16
- * `inflected` calls (`jsonapi-serializer/lib/inflector.js`), so a `first_name` column is PROJECTED
17
- * under that name and RETURNED as `firstName`. The same library rather than a transcription: the
18
- * transform handles acronyms and non-ASCII, and a mirror would drift from the deserializer without
19
- * anything failing.
20
- */
21
- function recordKey(field) {
22
- return inflected_1.default.camelize(inflected_1.default.underscore(field), false);
23
- }
11
+ const record_key_1 = require("../data/record-key");
24
12
  // The flat id is the JSON:API resource id, which is a string by specification whatever the key
25
13
  // column holds. `__forest.primaryKey` is the same id unpacked and typed, so the two forms of one
26
14
  // record disagree by construction — the trap this schema exists to name.
@@ -57,15 +45,7 @@ function publishedSchema(schema) {
57
45
  }
58
46
  const { properties } = schema;
59
47
  if (properties !== undefined) {
60
- const byKey = new Map();
61
- Object.keys(properties).forEach(name => {
62
- const key = recordKey(name);
63
- const collapsed = byKey.get(key);
64
- if (collapsed)
65
- collapsed.push(name);
66
- else
67
- byKey.set(key, [name]);
68
- });
48
+ const byKey = (0, record_key_1.groupByRecordKey)(Object.keys(properties), name => name);
69
49
  published.properties = Object.fromEntries([...byKey].map(([key, names]) => {
70
50
  if (names.length > 1)
71
51
  return [key, collapsedSchema(names.map(names_1.quoted), '')];
@@ -96,15 +76,7 @@ function propertySchema(key, fields) {
96
76
  return { ...schema, description };
97
77
  }
98
78
  function fieldProperties(projectable) {
99
- const byKey = new Map();
100
- projectable.forEach(field => {
101
- const key = recordKey(field.name);
102
- const collapsed = byKey.get(key);
103
- if (collapsed)
104
- collapsed.push(field);
105
- else
106
- byKey.set(key, [field]);
107
- });
79
+ const byKey = (0, record_key_1.groupByRecordKey)(projectable, field => field.name);
108
80
  return Object.fromEntries([...byKey].map(([key, fields]) => [key, propertySchema(key, fields)]));
109
81
  }
110
82
  /**
@@ -146,4 +118,4 @@ function listResponseSchema(collection, record) {
146
118
  required: ['data', 'meta'],
147
119
  };
148
120
  }
149
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWNvcmQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlCQSw4QkFFQztBQXFIRCwrQkFtQkM7QUFFRCxnREFtQkM7QUE3S0QsMERBQWtDO0FBRWxDLG9FQUE0QztBQUM1QyxtQ0FBaUM7QUFDakMsNkNBQXNEO0FBRXREOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLG1CQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsaUdBQWlHO0FBQ2pHLHlFQUF5RTtBQUN6RSxNQUFNLFNBQVMsR0FBaUI7SUFDOUIsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQ1QsNkZBQTZGO1FBQzdGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsR0FBRyxJQUFBLGNBQU0sRUFBQyw2QkFBbUIsQ0FBQyxHQUFHO0NBQ3BDLENBQUM7QUFFRixTQUFTLFdBQVcsQ0FBQyxNQUFzQztJQUN6RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWUsRUFBRSxJQUFZO0lBQ3BELE9BQU87UUFDTCxXQUFXLEVBQ1QsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1RUFBdUU7WUFDMUYsMEJBQTBCLElBQUksRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQW9CO0lBQzNDLE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENB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
121
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWNvcmQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQTJHQSwrQkFtQkM7QUFFRCxnREFtQkM7QUFoSkQsb0VBQTRDO0FBQzVDLG1DQUFpQztBQUNqQyw2Q0FBc0Q7QUFDdEQsbURBQXNEO0FBRXRELCtGQUErRjtBQUMvRixpR0FBaUc7QUFDakcseUVBQXlFO0FBQ3pFLE1BQU0sU0FBUyxHQUFpQjtJQUM5QixJQUFJLEVBQUUsUUFBUTtJQUNkLFdBQVcsRUFDVCw2RkFBNkY7UUFDN0YsdUZBQXVGO1FBQ3ZGLG9GQUFvRjtRQUNwRixHQUFHLElBQUEsY0FBTSxFQUFDLDZCQUFtQixDQUFDLEdBQUc7Q0FDcEMsQ0FBQztBQUVGLFNBQVMsV0FBVyxDQUFDLE1BQXNDO0lBQ3pELE9BQU8sTUFBTSxJQUFJLE1BQU0sQ0FBQztBQUMxQixDQUFDO0FBRUQsU0FBUyxlQUFlLENBQUMsS0FBZSxFQUFFLElBQVk7SUFDcEQsT0FBTztRQUNMLFdBQVcsRUFDVCxHQUFHLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLHVFQUF1RTtZQUMxRiwwQkFBMEIsSUFBSSxFQUFFO0tBQ25DLENBQUM7QUFDSixDQUFDO0FBRUQ7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBUyxlQUFlLENBQUMsTUFBb0I7SUFDM0MsTUFBTSxTQUFTLEdBQ2IsT0FBTyxNQUFNLENBQUMsSUFBSSxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLE1BQU0sRUFBRSxJQUFJLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztJQUUvRixJQUFJLE1BQU0sQ0FBQyxLQUFLLEtBQUssU0FBUyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxLQUFL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
@@ -127,6 +127,7 @@ export declare const ContextResponseSchema: z.ZodObject<{
127
127
  name: z.ZodString;
128
128
  fields: z.ZodArray<z.ZodObject<{
129
129
  field: z.ZodString;
130
+ recordKey: z.ZodOptional<z.ZodString>;
130
131
  type: z.ZodType<unknown, unknown, z.core.$ZodTypeInternals<unknown, unknown>>;
131
132
  relationship: z.ZodOptional<z.ZodEnum<{
132
133
  HasMany: "HasMany";
@@ -283,6 +283,7 @@ const ContextValidationSchema = zod_openapi_1.z
283
283
  });
284
284
  const ContextFieldSchema = zod_openapi_1.z.object({
285
285
  field: zod_openapi_1.z.string(),
286
+ recordKey: zod_openapi_1.z.string().optional(),
286
287
  type: ContextFieldTypeSchema,
287
288
  relationship: zod_openapi_1.z.enum(read_model_1.RELATIONSHIP_TYPES).optional(),
288
289
  reference: zod_openapi_1.z.string().optional(),
@@ -329,6 +330,16 @@ exports.ContextResponseSchema = zod_openapi_1.z
329
330
  'collection this document does not expose. Cross a target against `collections[]` before ' +
330
331
  'following it — unlike the per-collection route documents, nothing here is dropped for ' +
331
332
  'pointing outside the served set. ' +
333
+ '`field` is the technical name the agent declares, and the one to send back in a filter, ' +
334
+ 'a sort or a projection. It is NOT always the key the record carries: a snake_case agent ' +
335
+ '(Rails) declares `created_at` and the response returns `createdAt`. When the two ' +
336
+ 'differ, `recordKey` names the response key — read a record value under `recordKey ?? ' +
337
+ 'field`, and keep using `field` on the request side. It is omitted when the key would be ' +
338
+ 'ambiguous, so its presence is a promise: two fields differing only by casing collapse onto ' +
339
+ 'one key, and a field named `Id` collapses onto the resource identifier, whose value ' +
340
+ 'overwrites the attribute — in both cases no `recordKey` is published and that field is ' +
341
+ 'simply not readable by name. Sub-fields of a composite `type` are ' +
342
+ 'not covered either: they carry no `recordKey` and the same transform applies to them. ' +
332
343
  'The document carries no rendering, project or team identity, and the only environment ' +
333
344
  'datum is `meta.environmentId` below. It is served to both auth modes — an OAuth session ' +
334
345
  'and a BFF API key get the same document. It is NOT filtered by the caller permissions: ' +
@@ -441,4 +452,4 @@ exports.OpenapiDisabledErrorResponseSchema = zod_openapi_1.z
441
452
  'the shared envelope: the thrower passes none, so declaring the field would send a client ' +
442
453
  'looking for something the runtime never emits.',
443
454
  });
444
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyw2Q0FBc0Q7QUFDdEQsNkRBWWlDO0FBQ2pDLGtGQUE4RTtBQUM5RSx5REFBOEQ7QUFDOUQsaUZBQXdFO0FBRXhFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxpQ0FBWSxDQUEwQixDQUFDO0FBMmdCZiw4QkFBUztBQXpnQnZELE1BQU0sdUJBQXVCLEdBQUcsZUFBQztLQUM5QixZQUFZLENBQUM7SUFDWixLQUFLLEVBQUUsZUFBQyxDQUFDLE1BQU0sRUFBRTtJQUNqQixRQUFRLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0IsS0FBSyxFQUFFLGVBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDOUIsQ0FBQztLQUNELE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixXQUFXLEVBQ1QsMEZBQTBGO1FBQzFGLHFGQUFxRjtDQUN4RixDQUFDLENBQUM7QUFFTCxNQUFNLG1CQUFtQixHQUFjLGVBQUM7S0FDckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNULGVBQUMsQ0FBQyxLQUFLLENBQUM7SUFDTix1QkFBdUI7SUFDdkIsZUFBQyxDQUFDLFlBQVksQ0FBQztRQUNiLFVBQVUsRUFBRSxlQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLFVBQVUsRUFBRSxlQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO0tBQ3pDLENBQUM7SUFDRixlQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztDQUNuQixDQUFDLENBQ0g7S0FDQSxPQUFPLENBQUMsZUFBZSxFQUFFO0lBQ3hCLFdBQVcsRUFDVCwyRkFBMkY7UUFDM0YsMkRBQTJEO1FBQzNELHVGQUF1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
455
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9vcGVuYXBpL3NjaGVtYXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsd0VBQStEO0FBRS9ELCtDQUFrQztBQUNsQyw2Q0FBc0Q7QUFDdEQsNkRBWWlDO0FBQ2pDLGtGQUE4RTtBQUM5RSx5REFBOEQ7QUFDOUQsaUZBQXdFO0FBRXhFLE1BQU0sU0FBUyxHQUFHLENBQUMsR0FBRyxpQ0FBWSxDQUEwQixDQUFDO0FBc2hCZiw4QkFBUztBQXBoQnZELE1BQU0sdUJBQXVCLEdBQUcsZUFBQztLQUM5QixZQUFZLENBQUM7SUFDWixLQUFLLEVBQUUsZUFBQyxDQUFDLE1BQU0sRUFBRTtJQUNqQixRQUFRLEVBQUUsZUFBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7SUFDM0IsS0FBSyxFQUFFLGVBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxRQUFRLEVBQUU7Q0FDOUIsQ0FBQztLQUNELE9BQU8sQ0FBQyxtQkFBbUIsRUFBRTtJQUM1QixXQUFXLEVBQ1QsMEZBQTBGO1FBQzFGLHFGQUFxRjtDQUN4RixDQUFDLENBQUM7QUFFTCxNQUFNLG1CQUFtQixHQUFjLGVBQUM7S0FDckMsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUNULGVBQUMsQ0FBQyxLQUFLLENBQUM7SUFDTix1QkFBdUI7SUFDdkIsZUFBQyxDQUFDLFlBQVksQ0FBQztRQUNiLFVBQVUsRUFBRSxlQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsS0FBSyxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ2pDLFVBQVUsRUFBRSxlQUFDLENBQUMsS0FBSyxDQUFDLG1CQUFtQixDQUFDO0tBQ3pDLENBQUM7SUFDRixlQUFDLENBQUMsWUFBWSxDQUFDLEVBQUUsQ0FBQztDQUNuQixDQUFDLENBQ0g7S0FDQSxPQUFPLENBQUMsZUFBZSxFQUFFO0lBQ3hCLFdBQVcsRUFDVCwyRkFBMkY7UUFDM0YsMkRBQTJEO1FBQzNELHVGQUF1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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/agent-bff",
3
- "version": "1.28.0",
3
+ "version": "1.29.0",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "forest-bff": "dist/cli.js"
@@ -44,8 +44,6 @@
44
44
  "zod": "4.3.6"
45
45
  },
46
46
  "devDependencies": {
47
- "@forestadmin/agent": "1.99.2",
48
- "@forestadmin/agent-testing": "1.2.16",
49
47
  "@hey-api/openapi-ts": "0.99.0",
50
48
  "@redocly/cli": "2.35.1",
51
49
  "@types/inflected": "^1.1.29",