@forestadmin/agent 1.108.2 → 1.110.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/dist/agent.d.ts +14 -9
- package/dist/agent.js +129 -6
- package/dist/audit-trail/sql-store.js +39 -27
- package/dist/audit-trail/types.d.ts +12 -2
- package/dist/bff-routes.d.ts +6 -0
- package/dist/bff-routes.js +51 -2
- package/dist/embedded-bff.d.ts +23 -6
- package/dist/embedded-bff.js +70 -32
- package/dist/framework-mounter.d.ts +2 -1
- package/dist/framework-mounter.js +4 -1
- package/dist/gateway.d.ts +19 -0
- package/dist/gateway.js +96 -0
- package/dist/index.d.ts +1 -1
- package/dist/index.js +1 -1
- package/dist/routes/access/audit-trail-timeline.js +27 -15
- package/dist/routes/capabilities.js +4 -1
- package/dist/types.d.ts +14 -0
- package/dist/types.js +1 -1
- package/dist/utils/express-to-koa.js +3 -1
- package/package.json +7 -7
|
@@ -69,7 +69,7 @@ export type AuditHistoryQuery = {
|
|
|
69
69
|
after?: Pick<AuditRecord, 'timestamp' | 'id'>;
|
|
70
70
|
};
|
|
71
71
|
/**
|
|
72
|
-
* Cross-collection timeline, newest first. Paged by cursor rather than by offset: a project-wide
|
|
72
|
+
* Cross-collection timeline, newest first unless `order` says otherwise. Paged by cursor rather than by offset: a project-wide
|
|
73
73
|
* feed keeps growing at the head, so an offset silently shifts rows across pages.
|
|
74
74
|
*/
|
|
75
75
|
export type AuditTimelineQuery = {
|
|
@@ -81,7 +81,11 @@ export type AuditTimelineQuery = {
|
|
|
81
81
|
* sharing the boundary timestamp aren't skipped; `excludeIds` drops the ones already returned.
|
|
82
82
|
*/
|
|
83
83
|
before?: string;
|
|
84
|
+
/** Mirror of `before` for an `asc` walk: an inclusive lower bound from the previous page. */
|
|
85
|
+
after?: string;
|
|
84
86
|
excludeIds?: number[];
|
|
87
|
+
/** Defaults to `'desc'`; ties follow `id` in the same direction. */
|
|
88
|
+
order?: 'asc' | 'desc';
|
|
85
89
|
userIds?: number[];
|
|
86
90
|
operations?: AuditOperation[];
|
|
87
91
|
/** Inclusive lower bound on `timestamp` as a UTC ISO instant. */
|
|
@@ -122,10 +126,16 @@ export interface AuditStore {
|
|
|
122
126
|
/** Flat list of entries recorded under any of `correlationKeys` for a record, oldest first. */
|
|
123
127
|
listByCorrelations(query: AuditCorrelationsQuery): AuditRecord[] | Promise<AuditRecord[]>;
|
|
124
128
|
/**
|
|
125
|
-
* Cross-collection timeline
|
|
129
|
+
* Cross-collection timeline in `order`, ties broken by `id` the same way. Optional: a store
|
|
126
130
|
* written before this existed simply doesn't serve the project-level route.
|
|
127
131
|
*/
|
|
128
132
|
listTimeline?(query: AuditTimelineQuery): AuditRecord[] | Promise<AuditRecord[]>;
|
|
133
|
+
/**
|
|
134
|
+
* Distinct authors matching the timeline's filters, independent of its cursor. Optional like
|
|
135
|
+
* `listTimeline`: without it the route serves the rows but no author list. An empty
|
|
136
|
+
* `collections` must match nothing.
|
|
137
|
+
*/
|
|
138
|
+
listTimelineUsers?(query: Omit<AuditTimelineQuery, 'limit' | 'before' | 'after' | 'excludeIds' | 'order'>): AuditUserSummary[] | Promise<AuditUserSummary[]>;
|
|
129
139
|
/** Distinct authors matching the query filters, independent of pagination. */
|
|
130
140
|
listDistinctUsers(query: Omit<AuditHistoryQuery, 'skip' | 'limit' | 'order'>): AuditUserSummary[] | Promise<AuditUserSummary[]>;
|
|
131
141
|
/** One-shot bootstrap awaited by `agent.start()`. Must be idempotent. */
|
package/dist/bff-routes.d.ts
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import type { HttpCallback } from './types';
|
|
2
|
+
import type { Logger } from '@forestadmin/datasource-toolkit';
|
|
1
3
|
/**
|
|
2
4
|
* Where an embedded BFF answers, at the root of the host application. Fixed: the BFF serves its own
|
|
3
5
|
* `/oauth/*` and `/docs`, which would otherwise collide with the MCP server's root paths and with
|
|
@@ -14,6 +16,10 @@ export declare function isBffRoute(url: string): boolean;
|
|
|
14
16
|
* as a malformed request rather than as the root.
|
|
15
17
|
*/
|
|
16
18
|
export declare function stripBffPrefix(url: string): string;
|
|
19
|
+
export declare const BFF_DEPRECATION_TIMESTAMP: number;
|
|
20
|
+
export declare const BFF_DEPRECATION_LINK = "https://docs.forestadmin.com/product/embed/bff";
|
|
21
|
+
export declare const BFF_DEPRECATION_LOG_INTERVAL_MS: number;
|
|
22
|
+
export declare function createBffAliasCallback(handle: HttpCallback, logger: Logger): HttpCallback;
|
|
17
23
|
/**
|
|
18
24
|
* Whether an MCP mount path would land inside `/bff`. The MCP server normalizes its `basePath`
|
|
19
25
|
* (trim, leading slash, collapsed and stripped trailing slashes) before deriving
|
package/dist/bff-routes.js
CHANGED
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BFF_PREFIX = void 0;
|
|
3
|
+
exports.BFF_DEPRECATION_LOG_INTERVAL_MS = exports.BFF_DEPRECATION_LINK = exports.BFF_DEPRECATION_TIMESTAMP = exports.BFF_PREFIX = void 0;
|
|
4
4
|
exports.isBffRoute = isBffRoute;
|
|
5
5
|
exports.stripBffPrefix = stripBffPrefix;
|
|
6
|
+
exports.createBffAliasCallback = createBffAliasCallback;
|
|
6
7
|
exports.collidesWithBff = collidesWithBff;
|
|
7
8
|
/**
|
|
8
9
|
* Where an embedded BFF answers, at the root of the host application. Fixed: the BFF serves its own
|
|
@@ -23,11 +24,59 @@ function isBffRoute(url) {
|
|
|
23
24
|
* as a malformed request rather than as the root.
|
|
24
25
|
*/
|
|
25
26
|
function stripBffPrefix(url) {
|
|
27
|
+
if (!isBffRoute(url))
|
|
28
|
+
return url;
|
|
26
29
|
const remainder = url.slice(exports.BFF_PREFIX.length);
|
|
27
30
|
if (remainder === '')
|
|
28
31
|
return '/';
|
|
29
32
|
return remainder.startsWith('/') ? remainder : `/${remainder}`;
|
|
30
33
|
}
|
|
34
|
+
exports.BFF_DEPRECATION_TIMESTAMP = Date.UTC(2026, 9, 5) / 1000;
|
|
35
|
+
exports.BFF_DEPRECATION_LINK = 'https://docs.forestadmin.com/product/embed/bff';
|
|
36
|
+
exports.BFF_DEPRECATION_LOG_INTERVAL_MS = 60 * 60 * 1000;
|
|
37
|
+
const EXPOSE_HEADERS = 'Access-Control-Expose-Headers';
|
|
38
|
+
const DEPRECATION_HEADERS = ['Deprecation', 'Link'];
|
|
39
|
+
const DEPRECATION_LINK = `<${exports.BFF_DEPRECATION_LINK}>; rel="deprecation"`;
|
|
40
|
+
function headerValues(res, name) {
|
|
41
|
+
const value = res.getHeader(name);
|
|
42
|
+
return value === undefined ? [] : [value].flat().map(String);
|
|
43
|
+
}
|
|
44
|
+
function markDeprecated(res) {
|
|
45
|
+
const exposed = headerValues(res, EXPOSE_HEADERS)
|
|
46
|
+
.flatMap(value => value.split(','))
|
|
47
|
+
.map(name => name.trim())
|
|
48
|
+
.filter(Boolean);
|
|
49
|
+
const links = headerValues(res, 'Link');
|
|
50
|
+
res.setHeader('Deprecation', `@${exports.BFF_DEPRECATION_TIMESTAMP}`);
|
|
51
|
+
if (!links.includes(DEPRECATION_LINK)) {
|
|
52
|
+
res.setHeader('Link', [...links, DEPRECATION_LINK].join(', '));
|
|
53
|
+
}
|
|
54
|
+
res.setHeader(EXPOSE_HEADERS, [...new Set([...exposed, ...DEPRECATION_HEADERS])].join(', '));
|
|
55
|
+
}
|
|
56
|
+
function markDeprecatedOnWriteHead(res) {
|
|
57
|
+
const { writeHead } = res;
|
|
58
|
+
res.writeHead = ((...args) => {
|
|
59
|
+
markDeprecated(res);
|
|
60
|
+
return writeHead.apply(res, args);
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
function createBffAliasCallback(handle, logger) {
|
|
64
|
+
let lastWarnedAt = null;
|
|
65
|
+
return (req, res, next) => {
|
|
66
|
+
const now = Date.now();
|
|
67
|
+
if (lastWarnedAt === null || now - lastWarnedAt >= exports.BFF_DEPRECATION_LOG_INTERVAL_MS) {
|
|
68
|
+
lastWarnedAt = now;
|
|
69
|
+
logger('Warn', `[BFF] ${exports.BFF_PREFIX}/* is deprecated and was called: use addGateway({ api }), ` +
|
|
70
|
+
`which serves the same routes under <basePath>/api (/api by default). ` +
|
|
71
|
+
`See ${exports.BFF_DEPRECATION_LINK}`);
|
|
72
|
+
}
|
|
73
|
+
const aliasReq = req;
|
|
74
|
+
aliasReq.originalUrl ?? (aliasReq.originalUrl = req.url);
|
|
75
|
+
req.url = stripBffPrefix(req.url ?? exports.BFF_PREFIX);
|
|
76
|
+
markDeprecatedOnWriteHead(res);
|
|
77
|
+
handle(req, res, next);
|
|
78
|
+
};
|
|
79
|
+
}
|
|
31
80
|
/**
|
|
32
81
|
* Whether an MCP mount path would land inside `/bff`. The MCP server normalizes its `basePath`
|
|
33
82
|
* (trim, leading slash, collapsed and stripped trailing slashes) before deriving
|
|
@@ -46,4 +95,4 @@ function collidesWithBff(mcpBasePath) {
|
|
|
46
95
|
.replace(/\/+$/, '');
|
|
47
96
|
return isBffRoute(`${normalized}/mcp`);
|
|
48
97
|
}
|
|
49
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
98
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmZmLXJvdXRlcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9iZmYtcm91dGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQWNBLGdDQUlDO0FBT0Qsd0NBUUM7QUEwQ0Qsd0RBc0JDO0FBU0QsMENBWUM7QUFsSEQ7Ozs7R0FJRztBQUNVLFFBQUEsVUFBVSxHQUFHLE1BQU0sQ0FBQztBQUVqQzs7R0FFRztBQUNILFNBQWdCLFVBQVUsQ0FBQyxHQUFXO0lBQ3BDLE1BQU0sQ0FBQyxRQUFRLENBQUMsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQztJQUV4QyxPQUFPLFFBQVEsS0FBSyxrQkFBVSxJQUFJLFFBQVEsQ0FBQyxVQUFVLENBQUMsR0FBRyxrQkFBVSxHQUFHLENBQUMsQ0FBQztBQUMxRSxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILFNBQWdCLGNBQWMsQ0FBQyxHQUFXO0lBQ3hDLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDO1FBQUUsT0FBTyxHQUFHLENBQUM7SUFFakMsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxrQkFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBRS9DLElBQUksU0FBUyxLQUFLLEVBQUU7UUFBRSxPQUFPLEdBQUcsQ0FBQztJQUVqQyxPQUFPLFNBQVMsQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxTQUFTLEVBQUUsQ0FBQztBQUNqRSxDQUFDO0FBRVksUUFBQSx5QkFBeUIsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQ3hELFFBQUEsb0JBQW9CLEdBQUcsZ0RBQWdELENBQUM7QUFDeEUsUUFBQSwrQkFBK0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQUU5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
|
package/dist/embedded-bff.d.ts
CHANGED
|
@@ -1,19 +1,32 @@
|
|
|
1
1
|
import type { AgentOptionsWithDefaults, BffEmbedOptions, HttpCallback } from './types';
|
|
2
|
-
import type { AgentDispatcher } from '@forestadmin/agent-bff';
|
|
2
|
+
import type { AgentDispatcher, ConfigLabels } from '@forestadmin/agent-bff';
|
|
3
|
+
export declare const GATEWAY_API_CONFIG_LABELS: ConfigLabels;
|
|
4
|
+
export type EmbeddedBffMount = {
|
|
5
|
+
prefix: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
requiredVersion?: string;
|
|
8
|
+
skipIpWhitelistWarning?: boolean;
|
|
9
|
+
allowedOAuthClients?: string[];
|
|
10
|
+
gateway?: boolean;
|
|
11
|
+
};
|
|
3
12
|
/** How long `stop()` waits for the activity-log writes no connection holds. */
|
|
4
13
|
export declare const SHUTDOWN_TIMEOUT_MS = 10000;
|
|
5
14
|
/**
|
|
6
15
|
* Owns the lifecycle of a BFF embedded in the agent process: configuration, dynamic loading of the
|
|
7
|
-
* optional package, build, and the request handler the agent mounts
|
|
8
|
-
* the callback and delegates start/stop.
|
|
16
|
+
* optional package, build, and the request handler the agent mounts under its prefix. The agent
|
|
17
|
+
* only wires the callback and delegates start/stop.
|
|
9
18
|
*/
|
|
10
19
|
export default class EmbeddedBff {
|
|
11
20
|
private readonly options;
|
|
12
21
|
private readonly embedOptions;
|
|
22
|
+
private readonly mount;
|
|
13
23
|
private config;
|
|
14
24
|
private bff;
|
|
15
25
|
private stopped;
|
|
16
|
-
|
|
26
|
+
private claimsBffPath;
|
|
27
|
+
constructor(options: AgentOptionsWithDefaults, embedOptions: BffEmbedOptions, mount: EmbeddedBffMount);
|
|
28
|
+
private get name();
|
|
29
|
+
private log;
|
|
17
30
|
/**
|
|
18
31
|
* Load the package and validate the options the caller handed to `addBff()`. Called before the
|
|
19
32
|
* agent mounts anything: everything checked here is caller input, and `parseConfig` throws on a
|
|
@@ -21,6 +34,8 @@ export default class EmbeddedBff {
|
|
|
21
34
|
* where failing after mount() would leave the host with a live `/forest` and a bricked `/bff`.
|
|
22
35
|
*/
|
|
23
36
|
prepare(): Promise<void>;
|
|
37
|
+
private assertRequiredVersion;
|
|
38
|
+
claims(pathname: string): boolean;
|
|
24
39
|
/**
|
|
25
40
|
* Build the BFF. Called from agent.start() after mount(), because the dispatcher only reaches the
|
|
26
41
|
* agent's own stack once that stack is mounted.
|
|
@@ -56,8 +71,10 @@ export default class EmbeddedBff {
|
|
|
56
71
|
*/
|
|
57
72
|
stop(): Promise<void>;
|
|
58
73
|
/**
|
|
59
|
-
* The callback the agent registers
|
|
60
|
-
*
|
|
74
|
+
* The callback the agent registers under the mount prefix, handed requests already stripped of
|
|
75
|
+
* it: terminal, it never strips nor calls `next`. Answers 503 rather than falling through while
|
|
76
|
+
* the BFF is not serving: a 404 from the host would read as "wrong url" instead of "not
|
|
77
|
+
* available".
|
|
61
78
|
* Boot and shutdown are told apart, because a probe should wait on the first and drain on the
|
|
62
79
|
* second.
|
|
63
80
|
*/
|
package/dist/embedded-bff.js
CHANGED
|
@@ -33,8 +33,21 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
33
33
|
};
|
|
34
34
|
})();
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
-
exports.SHUTDOWN_TIMEOUT_MS = void 0;
|
|
37
|
-
const
|
|
36
|
+
exports.SHUTDOWN_TIMEOUT_MS = exports.GATEWAY_API_CONFIG_LABELS = void 0;
|
|
37
|
+
const gateway_1 = require("./gateway");
|
|
38
|
+
const BFF_PACKAGE = '@forestadmin/agent-bff';
|
|
39
|
+
exports.GATEWAY_API_CONFIG_LABELS = {
|
|
40
|
+
FOREST_AUTH_SECRET: 'authSecret',
|
|
41
|
+
FOREST_ENV_SECRET: 'envSecret',
|
|
42
|
+
FOREST_SERVER_URL: 'forestServerUrl',
|
|
43
|
+
FOREST_APP_URL: 'forestAppUrl',
|
|
44
|
+
BFF_TOKEN_ENCRYPTION_KEY: 'api.tokenEncryptionKey',
|
|
45
|
+
BFF_ALLOWED_ORIGINS: 'api.allowedOrigins',
|
|
46
|
+
BFF_DEFAULT_TIMEZONE: 'api.defaultTimezone',
|
|
47
|
+
BFF_AGENT_TIMEOUT_MS: 'api.agentTimeoutMs',
|
|
48
|
+
BFF_AI_TIMEOUT_MS: 'api.aiTimeoutMs',
|
|
49
|
+
BFF_OPENAPI_ENABLED: 'api.openapiEnabled',
|
|
50
|
+
};
|
|
38
51
|
/** How long `stop()` waits for the activity-log writes no connection holds. */
|
|
39
52
|
exports.SHUTDOWN_TIMEOUT_MS = 10000;
|
|
40
53
|
/**
|
|
@@ -43,34 +56,38 @@ exports.SHUTDOWN_TIMEOUT_MS = 10000;
|
|
|
43
56
|
* hand — their `message` and `stack` are not enumerable, so `JSON.stringify` alone turns the one
|
|
44
57
|
* value worth logging into `{}`. Never throws — logging must not break a request.
|
|
45
58
|
*/
|
|
46
|
-
function formatLog(message, context) {
|
|
59
|
+
function formatLog(tag, message, context) {
|
|
47
60
|
if (!context || Object.keys(context).length === 0)
|
|
48
|
-
return
|
|
61
|
+
return `${tag} ${message}`;
|
|
49
62
|
try {
|
|
50
63
|
const serialized = JSON.stringify(context, (_key, value) => value instanceof Error
|
|
51
64
|
? { name: value.name, message: value.message, stack: value.stack }
|
|
52
65
|
: value);
|
|
53
|
-
return
|
|
66
|
+
return `${tag} ${message} ${serialized}`;
|
|
54
67
|
}
|
|
55
68
|
catch {
|
|
56
|
-
return
|
|
69
|
+
return `${tag} ${message} [unserializable context]`;
|
|
57
70
|
}
|
|
58
71
|
}
|
|
59
72
|
/**
|
|
60
73
|
* Owns the lifecycle of a BFF embedded in the agent process: configuration, dynamic loading of the
|
|
61
|
-
* optional package, build, and the request handler the agent mounts
|
|
62
|
-
* the callback and delegates start/stop.
|
|
74
|
+
* optional package, build, and the request handler the agent mounts under its prefix. The agent
|
|
75
|
+
* only wires the callback and delegates start/stop.
|
|
63
76
|
*/
|
|
64
77
|
class EmbeddedBff {
|
|
65
|
-
constructor(options, embedOptions) {
|
|
78
|
+
constructor(options, embedOptions, mount) {
|
|
66
79
|
this.options = options;
|
|
67
80
|
this.embedOptions = embedOptions;
|
|
81
|
+
this.mount = mount;
|
|
68
82
|
this.config = null;
|
|
69
83
|
this.bff = null;
|
|
70
84
|
this.stopped = false;
|
|
85
|
+
this.claimsBffPath = null;
|
|
71
86
|
/**
|
|
72
|
-
* The callback the agent registers
|
|
73
|
-
*
|
|
87
|
+
* The callback the agent registers under the mount prefix, handed requests already stripped of
|
|
88
|
+
* it: terminal, it never strips nor calls `next`. Answers 503 rather than falling through while
|
|
89
|
+
* the BFF is not serving: a 404 from the host would read as "wrong url" instead of "not
|
|
90
|
+
* available".
|
|
74
91
|
* Boot and shutdown are told apart, because a probe should wait on the first and drain on the
|
|
75
92
|
* second.
|
|
76
93
|
*/
|
|
@@ -78,21 +95,22 @@ class EmbeddedBff {
|
|
|
78
95
|
if (!this.bff) {
|
|
79
96
|
const type = this.stopped ? 'bff_stopped' : 'bff_not_started';
|
|
80
97
|
const message = this.stopped
|
|
81
|
-
?
|
|
82
|
-
:
|
|
98
|
+
? `${this.name} was stopped with the agent.`
|
|
99
|
+
: `${this.name} is not started yet.`;
|
|
83
100
|
res.statusCode = 503;
|
|
84
101
|
res.setHeader('Content-Type', 'application/json');
|
|
85
102
|
res.end(JSON.stringify({ error: { type, status: 503, message } }));
|
|
86
103
|
return;
|
|
87
104
|
}
|
|
88
|
-
// The BFF knows nothing of the prefix it is served under. `originalUrl` is claimed before the
|
|
89
|
-
// rewrite so a host logger reading it still reports the url the client asked for.
|
|
90
|
-
const bffReq = req;
|
|
91
|
-
bffReq.originalUrl ?? (bffReq.originalUrl = bffReq.url);
|
|
92
|
-
req.url = (0, bff_routes_1.stripBffPrefix)(req.url ?? bff_routes_1.BFF_PREFIX);
|
|
93
105
|
this.bff.callback(req, res);
|
|
94
106
|
};
|
|
95
107
|
}
|
|
108
|
+
get name() {
|
|
109
|
+
return this.mount.name ?? 'The embedded BFF';
|
|
110
|
+
}
|
|
111
|
+
log(message, context) {
|
|
112
|
+
return formatLog(this.mount.gateway ? '[Gateway API]' : '[BFF]', message, context);
|
|
113
|
+
}
|
|
96
114
|
/**
|
|
97
115
|
* Load the package and validate the options the caller handed to `addBff()`. Called before the
|
|
98
116
|
* agent mounts anything: everything checked here is caller input, and `parseConfig` throws on a
|
|
@@ -100,9 +118,12 @@ class EmbeddedBff {
|
|
|
100
118
|
* where failing after mount() would leave the host with a live `/forest` and a bricked `/bff`.
|
|
101
119
|
*/
|
|
102
120
|
async prepare() {
|
|
103
|
-
const
|
|
121
|
+
const bffPackage = await this.importPackage();
|
|
122
|
+
const { parseConfig, IN_PROCESS_AGENT_URL } = bffPackage;
|
|
104
123
|
const { embedOptions } = this;
|
|
105
|
-
this.
|
|
124
|
+
this.assertRequiredVersion(bffPackage.version);
|
|
125
|
+
this.claimsBffPath = bffPackage.claimsBffPath;
|
|
126
|
+
const env = {
|
|
106
127
|
FOREST_AUTH_SECRET: this.options.authSecret,
|
|
107
128
|
FOREST_ENV_SECRET: this.options.envSecret,
|
|
108
129
|
FOREST_SERVER_URL: this.options.forestServerUrl,
|
|
@@ -117,7 +138,20 @@ class EmbeddedBff {
|
|
|
117
138
|
// Off unless asked for: the document is not filtered per caller, so mounting a BFF must not
|
|
118
139
|
// publish the name of every exposed collection and field on an already-open port.
|
|
119
140
|
BFF_OPENAPI_ENABLED: String(embedOptions.openapiEnabled ?? false),
|
|
120
|
-
}
|
|
141
|
+
};
|
|
142
|
+
this.config = parseConfig(env, this.mount.gateway ? exports.GATEWAY_API_CONFIG_LABELS : undefined);
|
|
143
|
+
}
|
|
144
|
+
assertRequiredVersion(installed) {
|
|
145
|
+
const { requiredVersion } = this.mount;
|
|
146
|
+
if (!requiredVersion || installed === requiredVersion)
|
|
147
|
+
return;
|
|
148
|
+
throw new Error(`addGateway({ api }) requires ${BFF_PACKAGE} ${requiredVersion}, found ${installed}. ` +
|
|
149
|
+
`Install it with \`npm install ${BFF_PACKAGE}@${requiredVersion}\`.`);
|
|
150
|
+
}
|
|
151
|
+
claims(pathname) {
|
|
152
|
+
if (!this.claimsBffPath)
|
|
153
|
+
return false;
|
|
154
|
+
return this.claimsBffPath(pathname, { docs: this.embedOptions.openapiEnabled ?? false });
|
|
121
155
|
}
|
|
122
156
|
/**
|
|
123
157
|
* Build the BFF. Called from agent.start() after mount(), because the dispatcher only reaches the
|
|
@@ -133,7 +167,10 @@ class EmbeddedBff {
|
|
|
133
167
|
const bff = await buildBff({
|
|
134
168
|
config: this.config,
|
|
135
169
|
dispatcher,
|
|
136
|
-
basePath:
|
|
170
|
+
basePath: this.mount.prefix,
|
|
171
|
+
allowedOAuthClients: this.mount.allowedOAuthClients,
|
|
172
|
+
gatewayVersion: gateway_1.AGENT_VERSION,
|
|
173
|
+
...(this.mount.gateway ? { labels: exports.GATEWAY_API_CONFIG_LABELS, name: 'Gateway API' } : {}),
|
|
137
174
|
// Counters are the schema cache's and the action-endpoint resolver's only channel — they take
|
|
138
175
|
// no logger — and every one of them reports a failure, so they go to the host's logs. Gauges
|
|
139
176
|
// do not: they are periodic cache sizes, and the default console sink reports them at Info,
|
|
@@ -142,18 +179,19 @@ class EmbeddedBff {
|
|
|
142
179
|
// Tags carried through: `action_endpoint_error` and `action_endpoint_miss` name the
|
|
143
180
|
// rendering, collection and action that failed, which is the whole of what makes the line
|
|
144
181
|
// actionable — the metric name alone says only that something, somewhere, did not resolve.
|
|
145
|
-
increment: (name, tags) => this.options.logger('Warn',
|
|
182
|
+
increment: (name, tags) => this.options.logger('Warn', this.log(`metric ${name}`, tags)),
|
|
146
183
|
gauge: () => undefined,
|
|
147
184
|
},
|
|
148
|
-
logger: (level, message, context) => this.options.logger(level,
|
|
185
|
+
logger: (level, message, context) => this.options.logger(level, this.log(message, context)),
|
|
149
186
|
});
|
|
150
187
|
// stop() may have landed while buildBff() was in flight. Assigning anyway would resurrect a
|
|
151
188
|
// stopped agent's /bff — dispatching into the stack it just tore down instead of answering 503.
|
|
152
189
|
if (this.stopped)
|
|
153
190
|
return;
|
|
154
191
|
this.bff = bff;
|
|
155
|
-
this.options.logger('Info',
|
|
156
|
-
|
|
192
|
+
this.options.logger('Info', this.log(`${this.mount.name ?? 'Embedded BFF'} mounted on ${this.mount.prefix}`));
|
|
193
|
+
if (!this.mount.skipIpWhitelistWarning)
|
|
194
|
+
await this.warnIfExemptFromIpWhitelist();
|
|
157
195
|
}
|
|
158
196
|
/**
|
|
159
197
|
* The whitelist exempts a caller arriving over a loopback socket with no proxy hop, which is
|
|
@@ -173,13 +211,13 @@ class EmbeddedBff {
|
|
|
173
211
|
const { isFeatureEnabled } = await this.options.forestAdminClient.getIpWhitelistConfiguration();
|
|
174
212
|
if (!isFeatureEnabled)
|
|
175
213
|
return;
|
|
176
|
-
this.options.logger('Warn',
|
|
177
|
-
`${
|
|
214
|
+
this.options.logger('Warn', this.log(`The IP whitelist is enabled for this environment, but requests served under ` +
|
|
215
|
+
`${this.mount.prefix} are not subject to it: they reach the agent in-process, which the ` +
|
|
178
216
|
`whitelist exempts as a trusted loopback caller. A resolved API key or a valid OAuth ` +
|
|
179
217
|
`session is still required.`));
|
|
180
218
|
}
|
|
181
219
|
catch (error) {
|
|
182
|
-
this.options.logger('Debug',
|
|
220
|
+
this.options.logger('Debug', this.log('Could not read the IP whitelist configuration', {
|
|
183
221
|
cause: error instanceof Error ? error.message : String(error),
|
|
184
222
|
}));
|
|
185
223
|
}
|
|
@@ -210,7 +248,7 @@ class EmbeddedBff {
|
|
|
210
248
|
const unfinished = await bff.drainActivityLogs(timeoutMs);
|
|
211
249
|
if (unfinished.length === 0)
|
|
212
250
|
return;
|
|
213
|
-
this.options.logger('Warn',
|
|
251
|
+
this.options.logger('Warn', this.log(`Stopped ${this.mount.gateway ? 'the Gateway API' : 'the embedded BFF'} with activity logs still in flight`, {
|
|
214
252
|
timeoutMs,
|
|
215
253
|
unfinished,
|
|
216
254
|
}));
|
|
@@ -228,7 +266,7 @@ class EmbeddedBff {
|
|
|
228
266
|
// also fires on a broken transitive dependency, a SyntaxError from a partial install, or a
|
|
229
267
|
// throw during the package's own evaluation — none of which "install it" would fix.
|
|
230
268
|
const { message } = error;
|
|
231
|
-
const wrapped = new Error(
|
|
269
|
+
const wrapped = new Error(`${this.name} requires the \`@forestadmin/agent-bff\` package, which failed to ` +
|
|
232
270
|
`load: ${message}. Install it with \`npm install @forestadmin/agent-bff\`.`);
|
|
233
271
|
// Assigned rather than passed to the constructor: the repo targets ES2020, whose lib types no
|
|
234
272
|
// options bag on Error. A plain assignment carries the cause on every runtime, and the reason
|
|
@@ -239,4 +277,4 @@ class EmbeddedBff {
|
|
|
239
277
|
}
|
|
240
278
|
}
|
|
241
279
|
exports.default = EmbeddedBff;
|
|
242
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
280
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZW1iZWRkZWQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2VtYmVkZGVkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFTQSx1Q0FBMEM7QUFFMUMsTUFBTSxXQUFXLEdBQUcsd0JBQXdCLENBQUM7QUFFaEMsUUFBQSx5QkFBeUIsR0FBaUI7SUFDckQsa0JBQWtCLEVBQUUsWUFBWTtJQUNoQyxpQkFBaUIsRUFBRSxXQUFXO0lBQzlCLGlCQUFpQixFQUFFLGlCQUFpQjtJQUNwQyxjQUFjLEVBQUUsY0FBYztJQUM5Qix3QkFBd0IsRUFBRSx3QkFBd0I7SUFDbEQsbUJBQW1CLEVBQUUsb0JBQW9CO0lBQ3pDLG9CQUFvQixFQUFFLHFCQUFxQjtJQUMzQyxvQkFBb0IsRUFBRSxvQkFBb0I7SUFDMUMsaUJBQWlCLEVBQUUsaUJBQWlCO0lBQ3BDLG1CQUFtQixFQUFFLG9CQUFvQjtDQUMxQyxDQUFDO0FBV0YsK0VBQStFO0FBQ2xFLFFBQUEsbUJBQW1CLEdBQUcsS0FBTSxDQUFDO0FBRTFDOzs7OztHQUtHO0FBQ0gsU0FBUyxTQUFTLENBQUMsR0FBVyxFQUFFLE9BQWUsRUFBRSxPQUFpQztJQUNoRixJQUFJLENBQUMsT0FBTyxJQUFJLE1BQU0sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUM7UUFBRSxPQUFPLEdBQUcsR0FBRyxJQUFJLE9BQU8sRUFBRSxDQUFDO0lBRTlFLElBQUksQ0FBQztRQUNILE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQ3pELEtBQUssWUFBWSxLQUFLO1lBQ3BCLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLE9BQU8sRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLEtBQUssRUFB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
|
|
@@ -15,7 +15,7 @@ export default class FrameworkMounter {
|
|
|
15
15
|
private readonly inProcessDispatcher;
|
|
16
16
|
private inProcessHookRegistered;
|
|
17
17
|
/** Compute the prefix that the main router should be mounted at in the client's application */
|
|
18
|
-
|
|
18
|
+
protected get completeMountPrefix(): string;
|
|
19
19
|
constructor(prefix: string, logger: Logger);
|
|
20
20
|
/**
|
|
21
21
|
* Register the MCP server at the root of the host application, or `null` to unregister it. The
|
|
@@ -24,6 +24,7 @@ export default class FrameworkMounter {
|
|
|
24
24
|
*/
|
|
25
25
|
protected setMcpCallback(handler: RootHandler | null): void;
|
|
26
26
|
/** Serve an embedded BFF at `/bff`. Pass null to stop answering there. */
|
|
27
|
+
protected setGatewayCallback(handler: RootHandler): void;
|
|
27
28
|
protected setBffCallback(callback: HttpCallback | null): void;
|
|
28
29
|
/**
|
|
29
30
|
* Dispatcher that runs agent-client requests against the agent's own `/forest` stack in-memory.
|
|
@@ -36,6 +36,9 @@ class FrameworkMounter {
|
|
|
36
36
|
this.rootMiddleware.set('mcp', handler);
|
|
37
37
|
}
|
|
38
38
|
/** Serve an embedded BFF at `/bff`. Pass null to stop answering there. */
|
|
39
|
+
setGatewayCallback(handler) {
|
|
40
|
+
this.rootMiddleware.set('gateway', handler);
|
|
41
|
+
}
|
|
39
42
|
setBffCallback(callback) {
|
|
40
43
|
this.rootMiddleware.set('bff', callback && { callback, matches: bff_routes_1.isBffRoute });
|
|
41
44
|
}
|
|
@@ -208,4 +211,4 @@ class FrameworkMounter {
|
|
|
208
211
|
}
|
|
209
212
|
}
|
|
210
213
|
exports.default = FrameworkMounter;
|
|
211
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
214
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWV3b3JrLW1vdW50ZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvZnJhbWV3b3JrLW1vdW50ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSx5REFBaUM7QUFDakMsK0JBQW9DO0FBQ3BDLDhDQUFzQjtBQUN0QixnREFBd0I7QUFFeEIsNkNBQTBDO0FBQzFDLHdFQUErQztBQUMvQyw0RkFBOEQ7QUFDOUQsd0VBQStDO0FBRS9DLE1BQXFCLGdCQUFnQjtJQWdCbkMsK0ZBQStGO0lBQy9GLElBQWMsbUJBQW1CO1FBQy9CLE9BQU8sY0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxNQUFNLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDckQsQ0FBQztJQUVELFlBQVksTUFBYyxFQUFFLE1BQWM7UUFqQnpCLGlCQUFZLEdBQTRCLEVBQUUsQ0FBQztRQUMzQyxnQkFBVyxHQUEwQyxFQUFFLENBQUM7UUFFeEQsV0FBTSxHQUE0QixFQUFFLENBQUM7UUFPOUMsNEJBQXVCLEdBQUcsS0FBSyxDQUFDO1FBUXRDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSx5QkFBYyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pELElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLG1DQUFtQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzdELENBQUM7SUFFRDs7OztPQUlHO0lBQ08sY0FBYyxDQUFDLE9BQTJCO1FBQ2xELElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEtBQUssRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBRUQsMEVBQTBFO0lBQ2hFLGtC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
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { BffEmbedOptions, GatewayOptions, McpEmbedOptions, RootHandler } from './types';
|
|
2
|
+
export declare const AGENT_BFF_PEER_VERSION: string;
|
|
3
|
+
export declare const AGENT_VERSION: string;
|
|
4
|
+
declare const MCP_UNAVAILABLE: {
|
|
5
|
+
starting: string;
|
|
6
|
+
stopped: string;
|
|
7
|
+
};
|
|
8
|
+
export declare function mcpUnavailable(isMcpRoute: (url: string) => boolean, state: keyof typeof MCP_UNAVAILABLE): RootHandler;
|
|
9
|
+
export type GatewayMcpOptions = Omit<McpEmbedOptions, 'basePath' | 'allowedOAuthClients'>;
|
|
10
|
+
export type GatewayServices = {
|
|
11
|
+
mcp: GatewayMcpOptions | null;
|
|
12
|
+
api: BffEmbedOptions | null;
|
|
13
|
+
};
|
|
14
|
+
export declare function resolveGatewayServices({ mcp, api }: GatewayOptions): GatewayServices;
|
|
15
|
+
export declare function assertNoGatewayOverlap(basePath: string, forestPath: string, { mcp, api }: GatewayServices): void;
|
|
16
|
+
export declare function servesOAuth({ mcp, api }: GatewayServices): boolean;
|
|
17
|
+
export declare function describeGatewayRoutes(basePath: string, { mcp, api }: GatewayServices): string[];
|
|
18
|
+
export {};
|
|
19
|
+
//# sourceMappingURL=gateway.d.ts.map
|