@forestadmin/agent-bff 1.25.4 → 1.25.5

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/dist/cli-core.js CHANGED
@@ -1,354 +1,19 @@
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
- })();
35
2
  var __importDefault = (this && this.__importDefault) || function (mod) {
36
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
37
4
  };
38
5
  Object.defineProperty(exports, "__esModule", { value: true });
39
- exports.resolveOAuthConfig = resolveOAuthConfig;
40
- exports.resolveUnfoldSource = resolveUnfoldSource;
41
6
  exports.default = runCli;
42
7
  exports.reportFatalError = reportFatalError;
43
- const bodyparser_1 = require("@koa/bodyparser");
44
- const action_routes_middleware_1 = __importDefault(require("./action/action-routes-middleware"));
45
8
  const console_logger_1 = __importDefault(require("./adapters/console-logger"));
46
- const agent_stub_1 = __importDefault(require("./agent/agent-stub"));
47
- const ai_proxy_client_1 = __importDefault(require("./ai/ai-proxy-client"));
48
- const ai_routes_middleware_1 = __importStar(require("./ai/ai-routes-middleware"));
49
- const api_key_authenticator_1 = __importDefault(require("./api-key/api-key-authenticator"));
50
- const api_key_client_1 = __importDefault(require("./api-key/api-key-client"));
51
- const api_key_middleware_1 = __importDefault(require("./api-key/api-key-middleware"));
52
- const resolve_cache_1 = __importDefault(require("./api-key/resolve-cache"));
53
- const auth_mode_middleware_1 = __importDefault(require("./auth/auth-mode-middleware"));
9
+ const build_bff_1 = __importDefault(require("./build-bff"));
54
10
  const env_config_1 = require("./config/env-config");
55
- const context_routes_middleware_1 = __importDefault(require("./context/context-routes-middleware"));
56
- const cors_middleware_1 = __importDefault(require("./cors/cors-middleware"));
57
- const per_key_origin_1 = __importDefault(require("./cors/per-key-origin"));
58
- const data_routes_middleware_1 = __importDefault(require("./data/data-routes-middleware"));
59
- const docs_routes_1 = __importDefault(require("./docs/docs-routes"));
60
11
  const errors_1 = require("./errors");
61
- const bff_http_error_1 = require("./http/bff-http-error");
62
12
  const bff_http_server_1 = __importDefault(require("./http/bff-http-server"));
63
- const body_limit_1 = __importStar(require("./http/body-limit"));
64
- const error_middleware_1 = __importDefault(require("./http/error-middleware"));
65
- const forest_server_client_1 = __importDefault(require("./oauth/forest-server-client"));
66
- const oauth_routes_1 = __importDefault(require("./oauth/oauth-routes"));
67
- const session_store_1 = __importDefault(require("./oauth/session-store"));
68
- const token_cipher_1 = __importDefault(require("./oauth/token-cipher"));
69
- const openapi_routes_1 = __importStar(require("./openapi/openapi-routes"));
70
- const permissions_cache_1 = __importDefault(require("./permissions/permissions-cache"));
71
- const permissions_client_1 = __importDefault(require("./permissions/permissions-client"));
72
- const permissions_routes_middleware_1 = __importDefault(require("./permissions/permissions-routes-middleware"));
73
- const agent_path_1 = __importDefault(require("./rate-limit/agent-path"));
74
- const rate_limit_middleware_1 = __importDefault(require("./rate-limit/rate-limit-middleware"));
75
- const create_read_model_1 = __importDefault(require("./read-model/create-read-model"));
76
- const timezone_middleware_1 = __importDefault(require("./timezone/timezone-middleware"));
77
- const version_1 = __importDefault(require("./version"));
78
- const SESSION_TTL_SECONDS = 24 * 60 * 60;
79
- const BODY_METHODS = new Set(['POST', 'PUT', 'PATCH']);
80
- const JSON_BODY_TYPES = ['application/json', 'application/*+json'];
81
- function hasBody(ctx) {
82
- return (ctx.request.length ?? 0) > 0 || ctx.get('transfer-encoding') !== '';
83
- }
84
- function createJsonOnlyGuard() {
85
- return async function jsonOnlyGuard(ctx, next) {
86
- if (BODY_METHODS.has(ctx.method) && hasBody(ctx) && !ctx.is(JSON_BODY_TYPES)) {
87
- throw (0, bff_http_error_1.unsupportedMediaType)();
88
- }
89
- await next();
90
- };
91
- }
92
- function agentScoped(middleware) {
93
- return async function scoped(ctx, next) {
94
- if (!(0, agent_path_1.default)(ctx.path)) {
95
- await next();
96
- return;
97
- }
98
- await middleware(ctx, next);
99
- };
100
- }
101
- function createBodyParser(hasAiQueryRoute) {
102
- const extendTypes = { json: JSON_BODY_TYPES };
103
- const parseBody = (0, bodyparser_1.bodyParser)({ jsonLimit: body_limit_1.default, extendTypes });
104
- if (!hasAiQueryRoute)
105
- return parseBody;
106
- const parseAiBody = (0, bodyparser_1.bodyParser)({
107
- jsonLimit: body_limit_1.AI_BODY_LIMIT,
108
- enableTypes: ['json'],
109
- extendTypes,
110
- });
111
- return async function selectedBodyParser(ctx, next) {
112
- if (ctx.path === ai_routes_middleware_1.AI_QUERY_ROUTE) {
113
- await parseAiBody(ctx, next);
114
- return;
115
- }
116
- await parseBody(ctx, next);
117
- };
118
- }
119
- function createApiKeyUnavailableGuard(logger) {
120
- return async function apiKeyUnavailableGuard(ctx, next) {
121
- if (ctx.state.authMode === 'api-key') {
122
- logger('Error', 'API key auth requested but the resolver is not configured');
123
- throw (0, bff_http_error_1.unauthorized)('Credentials could not be validated');
124
- }
125
- await next();
126
- };
127
- }
128
- function resolveOAuthConfig(config) {
129
- const { forestServerUrl, forestEnvSecret, forestAppUrl, forestAuthSecret, tokenEncryptionKey } = config;
130
- if (forestServerUrl &&
131
- forestEnvSecret &&
132
- forestAppUrl &&
133
- forestAuthSecret &&
134
- tokenEncryptionKey) {
135
- return { forestServerUrl, forestEnvSecret, forestAppUrl, forestAuthSecret, tokenEncryptionKey };
136
- }
137
- return undefined;
138
- }
139
- async function buildOAuthMiddlewares(config, logger) {
140
- const oauthConfig = resolveOAuthConfig(config);
141
- if (!oauthConfig) {
142
- logger('Warn', 'OAuth routes disabled: required configuration is missing');
143
- return { middlewares: [] };
144
- }
145
- const { forestServerUrl, forestEnvSecret, forestAppUrl, forestAuthSecret, tokenEncryptionKey } = oauthConfig;
146
- const serverClient = new forest_server_client_1.default({ forestServerUrl, envSecret: forestEnvSecret });
147
- const environmentId = await serverClient.fetchEnvironmentId();
148
- const sessionStore = (0, session_store_1.default)({
149
- cipher: (0, token_cipher_1.default)(tokenEncryptionKey),
150
- now: () => Date.now(),
151
- sessionTtlSeconds: SESSION_TTL_SECONDS,
152
- });
153
- const oauthRoutes = (0, oauth_routes_1.default)({
154
- serverClient,
155
- sessionStore,
156
- forestAppUrl,
157
- authSecret: forestAuthSecret,
158
- environmentId,
159
- logger,
160
- });
161
- return {
162
- middlewares: [oauthRoutes],
163
- environmentId,
164
- session: { store: sessionStore, serverClient, forestServerUrl },
165
- };
166
- }
167
- function resolveApiKeyConfig(config) {
168
- const { forestServerUrl, forestEnvSecret, forestAuthSecret } = config;
169
- if (forestServerUrl && forestEnvSecret && forestAuthSecret) {
170
- return { forestServerUrl, forestEnvSecret, forestAuthSecret };
171
- }
172
- return undefined;
173
- }
174
- function buildApiKeyMiddleware(config, logger) {
175
- const apiKeyConfig = resolveApiKeyConfig(config);
176
- if (!apiKeyConfig) {
177
- logger('Warn', 'API key auth disabled: required configuration is missing');
178
- return undefined;
179
- }
180
- const client = new api_key_client_1.default({
181
- forestServerUrl: apiKeyConfig.forestServerUrl,
182
- envSecret: apiKeyConfig.forestEnvSecret,
183
- });
184
- const cache = (0, resolve_cache_1.default)({ now: () => Date.now() });
185
- const authenticator = (0, api_key_authenticator_1.default)({
186
- client,
187
- cache,
188
- authSecret: apiKeyConfig.forestAuthSecret,
189
- });
190
- return (0, api_key_middleware_1.default)({ authenticator, logger });
191
- }
192
- /**
193
- * The read-model store the data routes, the action routes, the permissions endpoint and the OpenAPI
194
- * unfolding all share — one cache, one schema fetch. Needs no agent: the permissions endpoint and the
195
- * schema itself come from the SaaS.
196
- */
197
- function resolveReadModelBundle(config, logger, metrics) {
198
- const apiKeyConfig = resolveApiKeyConfig(config);
199
- if (!apiKeyConfig)
200
- return undefined;
201
- const { store } = (0, create_read_model_1.default)({
202
- forestServerUrl: apiKeyConfig.forestServerUrl,
203
- envSecret: apiKeyConfig.forestEnvSecret,
204
- logger,
205
- metrics,
206
- });
207
- return { store, apiKeyConfig };
208
- }
209
- /**
210
- * When unfolding is possible, in ONE place: the document needs the AGENT_URL the store does not,
211
- * because a collection's field set comes from the agent capabilities. The server passes the bundle it
212
- * already built for the data routes; the CLI goes through `resolveUnfoldSource`. Silent on purpose —
213
- * the two report a missing configuration differently.
214
- */
215
- function toUnfoldSource(bundle, config, logger) {
216
- if (!bundle || !config.agentUrl)
217
- return undefined;
218
- return {
219
- store: bundle.store,
220
- agentUrl: config.agentUrl,
221
- timeoutMs: config.agentTimeoutMs,
222
- logger,
223
- };
224
- }
225
- /**
226
- * Metrics are dropped rather than logged: without an explicit sink `createReadModel` builds a console
227
- * one, which reports gauges at `Info`, and `createConsoleLogger` sends `Info` to `console.info` — the
228
- * stdout the document is written to. The server keeps its metrics; the export has no sink for them
229
- * anyway.
230
- */
231
- const UNMEASURED = { increment: () => undefined, gauge: () => undefined };
232
- function resolveUnfoldSource(config, logger) {
233
- return toUnfoldSource(resolveReadModelBundle(config, logger, UNMEASURED), config, logger);
234
- }
235
- // The data middleware falls through to the action middleware on a non-data path.
236
- function buildAgentRouteMiddlewares(bundle, config, logger) {
237
- if (!bundle) {
238
- logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
239
- return [(0, agent_stub_1.default)()];
240
- }
241
- const { store, apiKeyConfig } = bundle;
242
- const { agentUrl, agentTimeoutMs: timeoutMs } = config;
243
- const permissionsMiddleware = (0, permissions_routes_middleware_1.default)({
244
- store,
245
- client: new permissions_client_1.default({
246
- forestServerUrl: apiKeyConfig.forestServerUrl,
247
- envSecret: apiKeyConfig.forestEnvSecret,
248
- }),
249
- cache: new permissions_cache_1.default(),
250
- logger,
251
- });
252
- if (!agentUrl) {
253
- logger('Warn', 'Data and action endpoints disabled: AGENT_URL is missing');
254
- return [permissionsMiddleware, (0, agent_stub_1.default)()];
255
- }
256
- return [
257
- permissionsMiddleware,
258
- (0, data_routes_middleware_1.default)({ store, agentUrl, timeoutMs, logger }),
259
- (0, action_routes_middleware_1.default)({ store, agentUrl, timeoutMs, logger }),
260
- ];
261
- }
262
- function buildAiMiddlewares(config, oauth, logger) {
263
- const { session, environmentId } = oauth;
264
- if (!session) {
265
- logger('Warn', 'AI query route disabled: the deployment carries no OAuth session');
266
- return [];
267
- }
268
- const client = new ai_proxy_client_1.default({
269
- forestServerUrl: session.forestServerUrl,
270
- timeoutMs: config.aiTimeoutMs,
271
- });
272
- return [
273
- (0, ai_routes_middleware_1.default)({
274
- client,
275
- sessionStore: session.store,
276
- serverClient: session.serverClient,
277
- environmentId,
278
- logger,
279
- }),
280
- ];
281
- }
282
- function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares) {
283
- const { forestAuthSecret, defaultTimezone } = config;
284
- const { environmentId } = oauth;
285
- if (!forestAuthSecret) {
286
- logger('Warn', 'Agent edge disabled: FOREST_AUTH_SECRET is missing');
287
- return [];
288
- }
289
- const apiKeyStep = buildApiKeyMiddleware(config, logger) ?? createApiKeyUnavailableGuard(logger);
290
- // One store for the whole edge. The document only unfolds when the agent is reachable too: with no
291
- // AGENT_URL every data path answers 501, so concrete paths would advertise a dead surface.
292
- const bundle = resolveReadModelBundle(config, logger);
293
- const source = toUnfoldSource(bundle, config, logger);
294
- const chain = [
295
- (0, auth_mode_middleware_1.default)({ authSecret: forestAuthSecret }),
296
- apiKeyStep,
297
- (0, rate_limit_middleware_1.default)({
298
- maxRequests: config.rateLimitMaxRequests,
299
- windowMs: config.rateLimitWindowMs,
300
- }),
301
- (0, per_key_origin_1.default)({ logger, serverAllowedOrigins: config.allowedOrigins }),
302
- (0, openapi_routes_1.default)({
303
- version: version_1.default,
304
- enabled: config.openapiEnabled,
305
- source,
306
- hasAiQueryRoute: aiMiddlewares.length > 0,
307
- publicUrl: config.publicUrl,
308
- }),
309
- ...(bundle ? [(0, context_routes_middleware_1.default)({ store: bundle.store, environmentId })] : []),
310
- ...aiMiddlewares,
311
- (0, timezone_middleware_1.default)({ defaultTimezone }),
312
- ...buildAgentRouteMiddlewares(bundle, config, logger),
313
- ];
314
- return chain.map(agentScoped);
315
- }
316
13
  async function runCli(env, logger = (0, console_logger_1.default)()) {
317
14
  const config = (0, env_config_1.parseConfig)(env);
318
- if (config.invalidAllowedOrigins.length > 0) {
319
- logger('Warn', 'Ignoring malformed BFF_ALLOWED_ORIGINS entries', {
320
- entries: config.invalidAllowedOrigins,
321
- });
322
- }
323
- const oauth = await buildOAuthMiddlewares(config, logger);
324
- const aiMiddlewares = buildAiMiddlewares(config, oauth, logger);
325
- const agentMiddlewares = buildAgentMiddlewares(config, logger, oauth, aiMiddlewares);
326
- const hasAgentEdge = agentMiddlewares.length > 0;
327
- const agentErrorMiddleware = hasAgentEdge ? [agentScoped((0, error_middleware_1.default)({ logger }))] : [];
328
- const agentJsonOnlyGuard = hasAgentEdge ? [agentScoped(createJsonOnlyGuard())] : [];
329
- const middlewares = [
330
- (0, cors_middleware_1.default)({ allowedOrigins: config.allowedOrigins, logger }),
331
- ...agentErrorMiddleware,
332
- ...agentJsonOnlyGuard,
333
- createBodyParser(aiMiddlewares.length > 0),
334
- ...oauth.middlewares,
335
- // Outside the agent-scoped chain on purpose: the viewer is a public page, the document it fetches
336
- // is not. Gated on the edge being mounted too, like the error middleware above: with no agent
337
- // chain there is no document to fetch, and the page would only ever reach a bare Koa 404.
338
- (0, docs_routes_1.default)({
339
- enabled: config.openapiEnabled && agentMiddlewares.length > 0,
340
- documentPath: openapi_routes_1.OPENAPI_PATH,
341
- logger,
342
- }),
343
- ...agentMiddlewares,
344
- ];
345
- const server = new bff_http_server_1.default({
346
- port: config.httpPort,
347
- version: version_1.default,
348
- config,
349
- logger,
350
- middlewares,
351
- });
15
+ const { callback } = await (0, build_bff_1.default)({ config, logger });
16
+ const server = new bff_http_server_1.default({ port: config.httpPort, config, logger, callback });
352
17
  await server.start();
353
18
  return server;
354
19
  }
@@ -356,4 +21,4 @@ function reportFatalError(err) {
356
21
  process.stderr.write(`Error: ${(0, errors_1.extractErrorMessage)(err)}\n`);
357
22
  process.exitCode = 1;
358
23
  }
359
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUF1SEEsZ0RBZUM7QUFvSkQsa0RBRUM7QUFpSEQseUJBNkNDO0FBRUQsNENBR0M7QUF2YkQsZ0RBQTZDO0FBRTdDLGlHQUE2RTtBQUM3RSwrRUFBNEQ7QUFDNUQsb0VBQTJEO0FBQzNELDJFQUFpRDtBQUNqRCxrRkFBcUY7QUFDckYsNEZBQXdFO0FBQ3hFLDhFQUFvRDtBQUNwRCxzRkFBa0U7QUFDbEUsNEVBQXlEO0FBQ3pELHVGQUFtRTtBQUNuRSxvREFBa0Q7QUFDbEQsb0dBQWdGO0FBQ2hGLDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFFQUFrRDtBQUNsRCxxQ0FBK0M7QUFDL0MsMERBQTJFO0FBQzNFLDZFQUFtRDtBQUNuRCxnRUFBOEQ7QUFDOUQsK0VBQTREO0FBQzVELHdGQUE4RDtBQUM5RCx3RUFBcUQ7QUFDckQsMEVBQStEO0FBQy9ELHdFQUFxRDtBQUNyRCwyRUFBNkU7QUFDN0Usd0ZBQStEO0FBQy9ELDBGQUFpRTtBQUNqRSxnSEFBNEY7QUFDNUYseUVBQWtEO0FBQ2xELCtGQUEyRTtBQUMzRSx1RkFBNkQ7QUFDN0QseUZBQXNFO0FBQ3RFLHdEQUFnQztBQUVoQyxNQUFNLG1CQUFtQixHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO0FBRXpDLE1BQU0sWUFBWSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0FBRXZELE1BQU0sZUFBZSxHQUFHLENBQUMsa0JBQWtCLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUVuRSxTQUFTLE9BQU8sQ0FBQyxHQUE4QjtJQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxN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
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWNvcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvY2xpLWNvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFRQSx5QkFZQztBQUVELDRDQUdDO0FBdkJELCtFQUE0RDtBQUM1RCw0REFBbUM7QUFDbkMsb0RBQWtEO0FBQ2xELHFDQUErQztBQUMvQyw2RUFBbUQ7QUFFcEMsS0FBSyxVQUFVLE1BQU0sQ0FDbEMsR0FBc0IsRUFDdEIsU0FBaUIsSUFBQSx3QkFBbUIsR0FBRTtJQUV0QyxNQUFNLE1BQU0sR0FBRyxJQUFBLHdCQUFXLEVBQUMsR0FBRyxDQUFDLENBQUM7SUFDaEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBQSxtQkFBUSxFQUFDLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFFeEQsTUFBTSxNQUFNLEdBQUcsSUFBSSx5QkFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxRQUFRLEVBQUUsTUFBTSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsQ0FBQyxDQUFDO0lBRXRGLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO0lBRXJCLE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FBQyxHQUFZO0lBQzNDLE9BQU8sQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLFVBQVUsSUFBQSw0QkFBbUIsRUFBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0QsT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUM7QUFDdkIsQ0FBQyJ9
@@ -43,7 +43,8 @@ const fs_1 = require("fs");
43
43
  const path_1 = __importDefault(require("path"));
44
44
  const console_logger_1 = __importDefault(require("./adapters/console-logger"));
45
45
  const ai_routes_middleware_1 = require("./ai/ai-routes-middleware");
46
- const cli_core_1 = __importStar(require("./cli-core"));
46
+ const build_bff_1 = require("./build-bff");
47
+ const cli_core_1 = __importDefault(require("./cli-core"));
47
48
  const env_config_1 = require("./config/env-config");
48
49
  const errors_1 = require("./errors");
49
50
  const openapi_document_1 = require("./openapi/openapi-document");
@@ -82,7 +83,7 @@ function wantsUnfolding(env) {
82
83
  }
83
84
  function publishesAiQuery(env, logger) {
84
85
  try {
85
- return (0, cli_core_1.resolveOAuthConfig)((0, env_config_1.parseConfig)(env)) !== undefined;
86
+ return (0, build_bff_1.resolveOAuthConfig)((0, env_config_1.parseConfig)(env)) !== undefined;
86
87
  }
87
88
  catch (error) {
88
89
  const reason = (0, errors_1.extractErrorMessage)(error);
@@ -103,7 +104,7 @@ async function renderOpenApi(env, logger) {
103
104
  // unfolded document must not see its export die on one of those, so the config is parsed only once
104
105
  // the four variables unfolding needs are all present — and from there a bad value is a real failure.
105
106
  const unfoldable = authSecret && wantsUnfolding(env)
106
- ? { source: (0, cli_core_1.resolveUnfoldSource)((0, env_config_1.parseConfig)(env), logger), authSecret }
107
+ ? { source: (0, build_bff_1.resolveUnfoldSource)((0, env_config_1.parseConfig)(env), logger), authSecret }
107
108
  : undefined;
108
109
  const publicUrl = (0, env_config_1.parsePublicUrl)(env.BFF_PUBLIC_URL);
109
110
  const hasAiQueryRoute = publishesAiQuery(env, logger);
@@ -182,4 +183,4 @@ async function dispatchCli(argv, env, logger) {
182
183
  process.stdout.write(document);
183
184
  return { exitCode: 0 };
184
185
  }
185
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS1kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFnRkEsc0NBNENDO0FBZ0RELDhCQWdEQztBQXpORCwyQkFBOEM7QUFDOUMsZ0RBQXdCO0FBRXhCLCtFQUE0RDtBQUM1RCxvRUFBMkQ7QUFDM0QsdURBQTZFO0FBQzdFLG9EQUFrRTtBQUNsRSxxQ0FBK0M7QUFDL0MsaUVBQXVGO0FBQ3ZGLGlGQUE0RjtBQUM1RixtREFBc0Q7QUFDdEQsd0RBQWdDO0FBRW5CLFFBQUEsbUJBQW1CLEdBQUcsY0FBYyxDQUFDO0FBRWxELE1BQU0sV0FBVyxHQUFHLFVBQVUsQ0FBQztBQUVsQixRQUFBLEtBQUssR0FBRzs7Ozs7Ozs7OztvQ0FVZSwyQkFBbUI7Ozs7b0RBSUgsQ0FBQztBQUV4QyxRQUFBLElBQUksR0FBRyxvQ0FBb0MsQ0FBQztBQUV6RCxNQUFNLFVBQVUsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQyxDQUFDO0FBQzdDLE1BQU0sYUFBYSxHQUFHLElBQUksR0FBRyxDQUFDLENBQUMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxDQUFDLENBQUM7QUFPbkQsTUFBTSxXQUFXLEdBQUc7SUFDbEIsbUJBQW1CO0lBQ25CLG1CQUFtQjtJQUNuQixvQkFBb0I7SUFDcEIsV0FBVztDQUNILENBQUM7QUFFWCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsV0FBVyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsK0JBQStCLENBQUM7QUFFbkYsU0FBUyxjQUFjLENBQUMsR0FBc0I7SUFDNUMsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxFQUFF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
186
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLWRpc3BhdGNoLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaS1kaXNwYXRjaC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFpRkEsc0NBNENDO0FBZ0RELDhCQWdEQztBQTFORCwyQkFBOEM7QUFDOUMsZ0RBQXdCO0FBRXhCLCtFQUE0RDtBQUM1RCxvRUFBMkQ7QUFDM0QsMkNBQXNFO0FBQ3RFLDBEQUFnQztBQUNoQyxvREFBa0U7QUFDbEUscUNBQStDO0FBQy9DLGlFQUF1RjtBQUN2RixpRkFBNEY7QUFDNUYsbURBQXNEO0FBQ3RELHdEQUFnQztBQUVuQixRQUFBLG1CQUFtQixHQUFHLGNBQWMsQ0FBQztBQUVsRCxNQUFNLFdBQVcsR0FBRyxVQUFVLENBQUM7QUFFbEIsUUFBQSxLQUFLLEdBQUc7Ozs7Ozs7Ozs7b0NBVWUsMkJBQW1COzs7O29EQUlILENBQUM7QUFFeEMsUUFBQSxJQUFJLEdBQUcsb0NBQW9DLENBQUM7QUFFekQsTUFBTSxVQUFVLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUMsQ0FBQztBQUM3QyxNQUFNLGFBQWEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxXQUFXLENBQUMsQ0FBQyxDQUFDO0FBT25ELE1BQU0sV0FBVyxHQUFHO0lBQ2xCLG1CQUFtQjtJQUNuQixtQkFBbUI7SUFDbkIsb0JBQW9CO0lBQ3BCLFdBQVc7Q0FDSCxDQUFDO0FBRVgsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLFdBQVcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDO0FBRW5GLFNBQVMsY0FBYyxDQUFDLEdBQXNCO0lBQzVDLE9BQU8sV0FBVyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQyxD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
@@ -0,0 +1,9 @@
1
+ import type { BFFConfig } from './env-config';
2
+ import type { Logger } from '../ports/logger-port';
3
+ /**
4
+ * The only place that names *which* required keys are absent. Both deployment modes call it at
5
+ * assembly time, so a misconfiguration reads the same whether the BFF listens on its own port or is
6
+ * mounted by a host that never starts a listener.
7
+ */
8
+ export default function warnMissingConfig(config: BFFConfig, logger: Logger): void;
9
+ //# sourceMappingURL=missing-config-warning.d.ts.map
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.default = warnMissingConfig;
4
+ /**
5
+ * The only place that names *which* required keys are absent. Both deployment modes call it at
6
+ * assembly time, so a misconfiguration reads the same whether the BFF listens on its own port or is
7
+ * mounted by a host that never starts a listener.
8
+ */
9
+ function warnMissingConfig(config, logger) {
10
+ const missing = Object.entries(config.presence)
11
+ .filter(([, present]) => !present)
12
+ .map(([key]) => key);
13
+ if (missing.length === 0)
14
+ return;
15
+ logger('Warn', 'Missing required configuration; /health will report degraded', { missing });
16
+ }
17
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlzc2luZy1jb25maWctd2FybmluZy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb25maWcvbWlzc2luZy1jb25maWctd2FybmluZy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQVFBLG9DQVFDO0FBYkQ7Ozs7R0FJRztBQUNILFNBQXdCLGlCQUFpQixDQUFDLE1BQWlCLEVBQUUsTUFBYztJQUN6RSxNQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUM7U0FDNUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLE9BQU8sQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQztTQUNqQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QixJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUFFLE9BQU87SUFFakMsTUFBTSxDQUFDLE1BQU0sRUFBRSw4REFBOEQsRUFBRSxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7QUFDOUYsQ0FBQyJ9
@@ -2,7 +2,11 @@ import type ReadModelStore from '../read-model/read-model-store';
2
2
  import type { Middleware } from 'koa';
3
3
  export interface ContextRoutesMiddlewareOptions {
4
4
  store: ReadModelStore;
5
- environmentId?: number;
5
+ /**
6
+ * Resolves to `undefined` rather than rejecting: the id decorates the payload, so a Forest server
7
+ * that cannot answer must not take the whole bootstrap route down with it.
8
+ */
9
+ resolveEnvironmentId?: () => Promise<number | undefined>;
6
10
  }
7
- export default function createContextRoutesMiddleware({ store, environmentId, }: ContextRoutesMiddlewareOptions): Middleware;
11
+ export default function createContextRoutesMiddleware({ store, resolveEnvironmentId, }: ContextRoutesMiddlewareOptions): Middleware;
8
12
  //# sourceMappingURL=context-routes-middleware.d.ts.map
@@ -7,15 +7,16 @@ exports.default = createContextRoutesMiddleware;
7
7
  const build_context_1 = __importDefault(require("./build-context"));
8
8
  const agent_route_helpers_1 = require("../http/agent-route-helpers");
9
9
  const CONTEXT_ROUTE = '/agent/v1/context';
10
- function createContextRoutesMiddleware({ store, environmentId, }) {
10
+ function createContextRoutesMiddleware({ store, resolveEnvironmentId, }) {
11
11
  return async function contextRoutesMiddleware(ctx, next) {
12
12
  if (ctx.path !== CONTEXT_ROUTE || ctx.method !== 'GET') {
13
13
  await next();
14
14
  return;
15
15
  }
16
16
  const { collections, readModel, revision } = await (0, agent_route_helpers_1.resolveSchemaSnapshot)(store);
17
+ const environmentId = await resolveEnvironmentId?.();
17
18
  ctx.status = 200;
18
19
  ctx.body = (0, build_context_1.default)(collections, readModel, { schemaRevision: revision, environmentId });
19
20
  };
20
21
  }
21
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NvbnRleHQtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFhQSxnREFnQkM7QUExQkQsb0VBQTJDO0FBQzNDLHFFQUFvRTtBQUVwRSxNQUFNLGFBQWEsR0FBRyxtQkFBbUIsQ0FBQztBQU8xQyxTQUF3Qiw2QkFBNkIsQ0FBQyxFQUNwRCxLQUFLLEVBQ0wsYUFBYSxHQUNrQjtJQUMvQixPQUFPLEtBQUssVUFBVSx1QkFBdUIsQ0FBQyxHQUFHLEVBQUUsSUFBSTtRQUNyRCxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssYUFBYSxJQUFJLEdBQUcsQ0FBQyxNQUFNLEtBQUssS0FBSyxFQUFFLENBQUM7WUFDdkQsTUFBTSxJQUFJLEVBQUUsQ0FBQztZQUViLE9BQU87UUFDVCxDQUFDO1FBRUQsTUFBTSxFQUFFLFdBQVcsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFBLDJDQUFxQixFQUFDLEtBQUssQ0FBQyxDQUFDO1FBRWhGLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDO1FBQ2pCLEdBQUcsQ0FBQyxJQUFJLEdBQUcsSUFBQSx1QkFBWSxFQUFDLFdBQVcsRUFBRSxTQUFTLEVBQUUsRUFBRSxjQUFjLEVBQUUsUUFBUSxFQUFFLGFBQWEsRUFBRSxDQUFDLENBQUM7SUFDL0YsQ0FBQyxDQUFDO0FBQ0osQ0FBQyJ9
22
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGV4dC1yb3V0ZXMtbWlkZGxld2FyZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9jb250ZXh0L2NvbnRleHQtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFpQkEsZ0RBaUJDO0FBL0JELG9FQUEyQztBQUMzQyxxRUFBb0U7QUFFcEUsTUFBTSxhQUFhLEdBQUcsbUJBQW1CLENBQUM7QUFXMUMsU0FBd0IsNkJBQTZCLENBQUMsRUFDcEQsS0FBSyxFQUNMLG9CQUFvQixHQUNXO0lBQy9CLE9BQU8sS0FBSyxVQUFVLHVCQUF1QixDQUFDLEdBQUcsRUFBRSxJQUFJO1FBQ3JELElBQUksR0FBRyxDQUFDLElBQUksS0FBSyxhQUFhLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztZQUN2RCxNQUFNLElBQUksRUFBRSxDQUFDO1lBRWIsT0FBTztRQUNULENBQUM7UUFFRCxNQUFNLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsR0FBRyxNQUFNLElBQUEsMkNBQXFCLEVBQUMsS0FBSyxDQUFDLENBQUM7UUFDaEYsTUFBTSxhQUFhLEdBQUcsTUFBTSxvQkFBb0IsRUFBRSxFQUFFLENBQUM7UUFFckQsR0FBRyxDQUFDLE1BQU0sR0FBRyxHQUFHLENBQUM7UUFDakIsR0FBRyxDQUFDLElBQUksR0FBRyxJQUFBLHVCQUFZLEVBQUMsV0FBVyxFQUFFLFNBQVMsRUFBRSxFQUFFLGNBQWMsRUFBRSxRQUFRLEVBQUUsYUFBYSxFQUFFLENBQUMsQ0FBQztJQUMvRixDQUFDLENBQUM7QUFDSixDQUFDIn0=
@@ -1,22 +1,39 @@
1
+ import type { BffCallback } from '../build-bff';
1
2
  import type { BFFConfig } from '../config/env-config';
2
3
  import type { Logger } from '../ports/logger-port';
3
4
  import type { Middleware } from 'koa';
4
- import http from 'http';
5
- export interface BFFHttpServerOptions {
5
+ interface BFFHttpServerBaseOptions {
6
6
  port: number;
7
- version: string;
8
7
  config: BFFConfig;
9
8
  logger?: Logger;
9
+ }
10
+ /** The server assembles its own Koa app around `/health` and the version header. */
11
+ interface AssembledOptions extends BFFHttpServerBaseOptions {
12
+ version: string;
10
13
  middlewares?: Middleware[];
14
+ callback?: never;
15
+ }
16
+ /**
17
+ * The server only listens: `buildBff` already assembled the handler, `/health` and the version
18
+ * header included. `version` and `middlewares` are forbidden here rather than ignored — a host
19
+ * passing them would otherwise boot fine and 404 every one of its own routes.
20
+ */
21
+ interface PrebuiltOptions extends BFFHttpServerBaseOptions {
22
+ callback: BffCallback;
23
+ version?: never;
24
+ middlewares?: never;
11
25
  }
26
+ export type BFFHttpServerOptions = AssembledOptions | PrebuiltOptions;
12
27
  export default class BFFHttpServer {
13
- private readonly app;
28
+ private readonly handler;
14
29
  private readonly options;
15
30
  private readonly logger;
16
31
  private server;
17
32
  constructor(options: BFFHttpServerOptions);
33
+ private static buildHandler;
18
34
  start(): Promise<void>;
19
35
  stop(): Promise<void>;
20
- get callback(): (req: http.IncomingMessage | import("http2").Http2ServerRequest, res: http.ServerResponse | import("http2").Http2ServerResponse) => Promise<void>;
36
+ get callback(): BffCallback;
21
37
  }
38
+ export {};
22
39
  //# sourceMappingURL=bff-http-server.d.ts.map