@forestadmin/agent-bff 1.27.0 → 1.28.1

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.
@@ -19,6 +19,11 @@ export interface BuildBffOptions {
19
19
  }
20
20
  export interface Bff {
21
21
  callback: BffCallback;
22
+ /**
23
+ * Forget what was read from the SaaS. A host that knows the schema just moved — an agent
24
+ * restarting on a customization refresh — calls this instead of waiting out the 24h TTL.
25
+ */
26
+ invalidate(): void;
22
27
  }
23
28
  interface ResolvedOAuthConfig {
24
29
  forestServerUrl: string;
package/dist/build-bff.js CHANGED
@@ -238,7 +238,7 @@ function resolveUnfoldSource(config, logger) {
238
238
  return toUnfoldSource(resolveReadModelBundle(config, logger, UNMEASURED), config, logger);
239
239
  }
240
240
  // The data middleware falls through to the action middleware on a non-data path.
241
- function buildAgentRouteMiddlewares(bundle, config, logger) {
241
+ function buildAgentRouteMiddlewares(bundle, config, logger, permissionsCache) {
242
242
  if (!bundle) {
243
243
  logger('Warn', 'Data, action and permissions endpoints disabled: FOREST_SERVER_URL, FOREST_ENV_SECRET or FOREST_AUTH_SECRET is missing');
244
244
  return [(0, agent_stub_1.default)()];
@@ -251,7 +251,7 @@ function buildAgentRouteMiddlewares(bundle, config, logger) {
251
251
  forestServerUrl: apiKeyConfig.forestServerUrl,
252
252
  envSecret: apiKeyConfig.forestEnvSecret,
253
253
  }),
254
- cache: new permissions_cache_1.default(),
254
+ cache: permissionsCache,
255
255
  logger,
256
256
  });
257
257
  if (!agentUrl) {
@@ -289,13 +289,14 @@ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
289
289
  const { forestAuthSecret, defaultTimezone } = config;
290
290
  if (!forestAuthSecret) {
291
291
  logger('Warn', 'Agent edge disabled: FOREST_AUTH_SECRET is missing');
292
- return [];
292
+ return { middlewares: [], invalidate: () => undefined };
293
293
  }
294
294
  const apiKeyStep = buildApiKeyMiddleware(config, logger) ?? createApiKeyUnavailableGuard(logger);
295
295
  // One store for the whole edge. The document only unfolds when the agent is reachable too: with no
296
296
  // AGENT_URL every data path answers 501, so concrete paths would advertise a dead surface.
297
297
  const bundle = resolveReadModelBundle(config, logger);
298
298
  const source = toUnfoldSource(bundle, config, logger);
299
+ const permissionsCache = new permissions_cache_1.default();
299
300
  const chain = [
300
301
  (0, auth_mode_middleware_1.default)({ authSecret: forestAuthSecret }),
301
302
  apiKeyStep,
@@ -324,9 +325,18 @@ function buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, basePath) {
324
325
  : []),
325
326
  ...aiMiddlewares,
326
327
  (0, timezone_middleware_1.default)({ defaultTimezone }),
327
- ...buildAgentRouteMiddlewares(bundle, config, logger),
328
+ ...buildAgentRouteMiddlewares(bundle, config, logger, permissionsCache),
328
329
  ];
329
- return chain.map(agentScoped);
330
+ return {
331
+ middlewares: chain.map(agentScoped),
332
+ invalidate: () => {
333
+ // The one trace an invalidation leaves: the operator asked "the schema is wrong" needs to
334
+ // establish that one happened and when, and the age gauge cannot say it.
335
+ logger('Info', 'Dropping the SaaS read caches on host request');
336
+ bundle?.store.invalidate();
337
+ permissionsCache.clear();
338
+ },
339
+ };
330
340
  }
331
341
  /**
332
342
  * Assemble the whole BFF — `/health`, the version header, and every middleware in the one order both
@@ -347,7 +357,8 @@ async function buildBff({ config, logger = (0, console_logger_1.default)(), base
347
357
  (0, missing_config_warning_1.default)(config, logger);
348
358
  const oauth = buildOAuthMiddlewares(config, logger);
349
359
  const aiMiddlewares = buildAiMiddlewares(config, oauth, logger);
350
- const agentMiddlewares = buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, mountPath);
360
+ const agentEdge = buildAgentMiddlewares(config, logger, oauth, aiMiddlewares, mountPath);
361
+ const agentMiddlewares = agentEdge.middlewares;
351
362
  const hasAgentEdge = agentMiddlewares.length > 0;
352
363
  const agentErrorMiddleware = hasAgentEdge ? [agentScoped((0, error_middleware_1.default)({ logger }))] : [];
353
364
  const agentJsonOnlyGuard = hasAgentEdge ? [agentScoped(createJsonOnlyGuard())] : [];
@@ -373,6 +384,6 @@ async function buildBff({ config, logger = (0, console_logger_1.default)(), base
373
384
  const app = new koa_1.default();
374
385
  for (const middleware of middlewares)
375
386
  app.use(middleware);
376
- return { callback: app.callback() };
387
+ return { callback: app.callback(), invalidate: agentEdge.invalidate };
377
388
  }
378
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1aWxkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQWtKQSxnREFlQztBQXNKRCxrREFFQztBQW9JRCwyQkFnREM7QUFuZUQsZ0RBQTZDO0FBQzdDLDhDQUFzQjtBQUV0QixpR0FBNkU7QUFDN0UsK0VBQTREO0FBQzVELG9FQUEyRDtBQUMzRCw2REFBOEQ7QUFDOUQsMkVBQWlEO0FBQ2pELGtGQUFxRjtBQUNyRiw0RkFBd0U7QUFDeEUsOEVBQW9EO0FBQ3BELHNGQUFrRTtBQUNsRSw0RUFBeUQ7QUFDekQsdUZBQW1FO0FBQ25FLDREQUE0QztBQUM1Qyw2RkFBZ0U7QUFDaEUsb0dBQWdGO0FBQ2hGLDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFFQUFrRDtBQUNsRCwwREFBMkU7QUFDM0UsZ0VBQThEO0FBQzlELCtFQUE0RDtBQUM1RCx1RUFBb0Q7QUFDcEQsaUdBQTZFO0FBQzdFLHlFQUFtRztBQUNuRyx3RkFBOEQ7QUFDOUQsd0VBQXFEO0FBQ3JELDBFQUErRDtBQUMvRCx3RUFBcUQ7QUFDckQsMkVBQTZFO0FBQzdFLHdGQUErRDtBQUMvRCwwRkFBaUU7QUFDakUsZ0hBQTRGO0FBQzVGLHlFQUFrRDtBQUNsRCwrRkFBMkU7QUFDM0UsdUZBQTZEO0FBQzdELHlGQUFzRTtBQUN0RSx3REFBZ0M7QUF1QmhDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRW5FLFNBQVMsT0FBTyxDQUFD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
389
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtYmZmLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2J1aWxkLWJmZi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQXVKQSxnREFlQztBQXNKRCxrREFFQztBQW9KRCwyQkFpREM7QUF6ZkQsZ0RBQTZDO0FBQzdDLDhDQUFzQjtBQUV0QixpR0FBNkU7QUFDN0UsK0VBQTREO0FBQzVELG9FQUEyRDtBQUMzRCw2REFBOEQ7QUFDOUQsMkVBQWlEO0FBQ2pELGtGQUFxRjtBQUNyRiw0RkFBd0U7QUFDeEUsOEVBQW9EO0FBQ3BELHNGQUFrRTtBQUNsRSw0RUFBeUQ7QUFDekQsdUZBQW1FO0FBQ25FLDREQUE0QztBQUM1Qyw2RkFBZ0U7QUFDaEUsb0dBQWdGO0FBQ2hGLDZFQUEwRDtBQUMxRCwyRUFBaUU7QUFDakUsMkZBQXVFO0FBQ3ZFLHFFQUFrRDtBQUNsRCwwREFBMkU7QUFDM0UsZ0VBQThEO0FBQzlELCtFQUE0RDtBQUM1RCx1RUFBb0Q7QUFDcEQsaUdBQTZFO0FBQzdFLHlFQUFtRztBQUNuRyx3RkFBOEQ7QUFDOUQsd0VBQXFEO0FBQ3JELDBFQUErRDtBQUMvRCx3RUFBcUQ7QUFDckQsMkVBQTZFO0FBQzdFLHdGQUErRDtBQUMvRCwwRkFBaUU7QUFDakUsZ0hBQTRGO0FBQzVGLHlFQUFrRDtBQUNsRCwrRkFBMkU7QUFDM0UsdUZBQTZEO0FBQzdELHlGQUFzRTtBQUN0RSx3REFBZ0M7QUE0QmhDLE1BQU0sbUJBQW1CLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFLENBQUM7QUFFekMsTUFBTSxZQUFZLEdBQUcsSUFBSSxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFFdkQsTUFBTSxlQUFlLEdBQUcsQ0FBQyxrQkFBa0IsRUFBRSxvQkFBb0IsQ0FBQyxDQUFDO0FBRW5FLFNBQVMsT0FBTyxDQUFD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
@@ -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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
@@ -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==
@@ -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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVjb3JkLXNjaGVtYXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvb3BlbmFwaS9yZWNvcmQtc2NoZW1hcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQWlCQSw4QkFFQztBQXFIRCwrQkFtQkM7QUFFRCxnREFtQkM7QUE3S0QsMERBQWtDO0FBRWxDLG9FQUE0QztBQUM1QyxtQ0FBaUM7QUFDakMsNkNBQXNEO0FBRXREOzs7Ozs7O0dBT0c7QUFDSCxTQUFnQixTQUFTLENBQUMsS0FBYTtJQUNyQyxPQUFPLG1CQUFTLENBQUMsUUFBUSxDQUFDLG1CQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCwrRkFBK0Y7QUFDL0YsaUdBQWlHO0FBQ2pHLHlFQUF5RTtBQUN6RSxNQUFNLFNBQVMsR0FBaUI7SUFDOUIsSUFBSSxFQUFFLFFBQVE7SUFDZCxXQUFXLEVBQ1QsNkZBQTZGO1FBQzdGLHVGQUF1RjtRQUN2RixvRkFBb0Y7UUFDcEYsR0FBRyxJQUFBLGNBQU0sRUFBQyw2QkFBbUIsQ0FBQyxHQUFHO0NBQ3BDLENBQUM7QUFFRixTQUFTLFdBQVcsQ0FBQyxNQUFzQztJQUN6RCxPQUFPLE1BQU0sSUFBSSxNQUFNLENBQUM7QUFDMUIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLEtBQWUsRUFBRSxJQUFZO0lBQ3BELE9BQU87UUFDTCxXQUFXLEVBQ1QsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyx1RUFBdUU7WUFDMUYsMEJBQTBCLElBQUksRUFBRTtLQUNuQyxDQUFDO0FBQ0osQ0FBQztBQUVEOzs7Ozs7Ozs7R0FTRztBQUNILFNBQVMsZUFBZSxDQUFDLE1BQW9CO0lBQzNDLE1BQU0sU0FBUyxHQUNiLE9BQU8sTUFBTSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxNQUFNLEVBQUUsSUFBSSxFQUFFLENBQUMsTUFBTSxDQUFDLElBQUksRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsTUFBTSxFQUFFLENBQUM7SUFFL0YsSUFBSSxNQUFNLENBQUMsS0FBSyxLQUFLLFNBQVMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQztRQUM3RCxTQUFTLENBQUMsS0FBSyxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVELE1BQU0sRUFBRSxVQUFVLEVBQUUsR0FBRyxNQUFNLENBQUM7SUFFOUIsSUFBSSxVQUFVLEtBQUssU0FBUyxFQUFFLENBQUM7UUFDN0IsTUFBTSxLQUFLLEdBQUcsSUFBSSxHQUFHLEVBQW9CLENBQUM7UUFFMUMsTUFBTSxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUU7WUFDckMsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO1lBQzVCLE1BQU0sU0FBUyxHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUM7WUFFakMsSUFBSSxTQUFTO2dCQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7O2dCQUMvQixLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7UUFFSCxTQUFTLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQ3ZDLENBQUMsR0FBRyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFO1lBQzlCLElBQUksS0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDO2dCQUFFLE9BQU8sQ0FBQyxHQUFHLEVBQUUsZUFBZSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsY0FBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQztZQUUzRSxNQUFNLE1BQU0sR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFFcEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsZUFBZSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7UUFDdkUsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRCxPQUFPLFNBQVMsQ0FBQztBQUNuQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxTQUFTLGNBQWMsQ0FBQyxHQUFXLEVBQUUsTUFBMEI7SUFDN0QsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLElBQUEsY0FBTSxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRXRELElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN0QixPQUFPLGVBQWUsQ0FBQyxLQUFLLEVBQUUseUNBQXlDLENBQUMsQ0FBQztJQUMzRSxDQUFDO0lBRUQsTUFBTSxDQUFDLEtBQUssQ0FBQyxHQUFHLE1BQU0sQ0FBQztJQUN2QixNQUFNLE1BQU0sR0FBRyxlQUFlLENBQUMsSUFBQSx1QkFBYSxFQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBRTFELElBQUksS0FBSyxDQUFDLElBQUksS0FBSyxHQUFHO1FBQUUsT0FBTyxNQUFNLENBQUM7SUFFdEMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxNQUFNLENBQUMsV0FBVyxFQUFFLE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDO1NBQ3ZFLE1BQU0sQ0FBQyxPQUFPLENBQUM7U0FDZixJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7SUFFYixPQUFPLEVBQUUsR0FBRyxNQUFNLEVBQUUsV0FBVyxFQUFFLENBQUM7QUFDcEMsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLFdBQStCO0lBQ3RELE1BQU0sS0FBSyxHQUFHLElBQUksR0FBRyxFQUE4QixDQUFDO0lBRXBELFdBQVcsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLEVBQUU7UUFDMUIsTUFBTSxHQUFHLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQyxNQUFNLFNBQVMsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBRWpDLElBQUksU0FBUztZQUFFLFNBQVMsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7O1lBQ2hDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUMvQixDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDLFdBQVcsQ0FBQyxDQUFDLEdBQUcsS0FBSyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxFQUFFLGNBQWMsQ0FBQyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbkcsQ0FBQztBQUVEOzs7Ozs7R0FNRztBQUNILFNBQXdCLFlBQVksQ0FDbEMsVUFBOEIsRUFDOUIsVUFBMkI7SUFFM0IsT0FBTztRQUNMLElBQUksRUFBRSxRQUFRO1FBQ2QsV0FBVyxFQUNULGVBQWUsSUFBQSxjQUFNLEVBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxrREFBa0Q7WUFDeEYsMEZBQTBGO1lBQzFGLHdGQUF3RjtZQUN4Riw0RkFBNEY7WUFDNUYsc0RBQXNEO1FBQ3hELFVBQVUsRUFBRTtZQUNWLEdBQUcsZUFBZSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDO1lBQ2pELEVBQUUsRUFBRSxTQUFTO1lBQ2IsUUFBUSxFQUFFLFVBQVU7U0FDckI7UUFDRCxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsVUFBVSxDQUFDO0tBQzdCLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBZ0Isa0JBQWtCLENBQ2hDLFVBQThCLEVBQzlCLE1BQXVCO0lBRXZCLE9BQU87UUFDTCxJQUFJLEVBQUUsUUFBUTtRQUNkLFdBQVcsRUFDVCxhQUFhLElBQUEsY0FBTSxFQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMscURBQXFEO1lBQ3pGLGdGQUFnRjtRQUNsRixVQUFVLEVBQUU7WUFDVixJQUFJLEVBQUUsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUU7WUFDdEMsSUFBSSxFQUFFO2dCQUNKLElBQUksRUFBRSxRQUFRO2dCQUNkLFVBQVUsRUFBRSxFQUFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsS0FBSyxFQUFFLGVBQWUsRUFBRSxFQUFFO2dCQUN2RSxRQUFRLEVBQUUsQ0FBQyxhQUFhLENBQUM7YUFDMUI7U0FDRjtRQUNELFFBQVEsRUFBRSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUM7S0FDM0IsQ0FBQztBQUNKLENBQUMifQ==
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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
@@ -12,11 +12,22 @@ export default class PermissionsCache {
12
12
  private readonly now;
13
13
  private readonly ttlMs;
14
14
  private entry;
15
+ private generationValue;
15
16
  constructor({ now, ttlMs }?: PermissionsCacheOptions);
16
17
  wasRejectedByLatestFetch(userId: number): boolean;
17
18
  rememberRejected(userId: number): void;
18
19
  getFresh(): EvaluatedPermissions | undefined;
19
- set(permissions: EvaluatedPermissions): void;
20
+ /**
21
+ * The generation a fetch must be started against. Read it before the fetch and hand it back to
22
+ * `set`, so a response that crossed a `clear()` cannot become the shared entry.
23
+ */
24
+ get generation(): number;
25
+ /**
26
+ * Store a fetched payload, unless a `clear()` landed while the fetch was in flight: it read the
27
+ * permissions the invalidation declared stale, and with a single shared entry one late write would
28
+ * hand a revoked access to every caller for a full TTL.
29
+ */
30
+ set(permissions: EvaluatedPermissions, generation: number): void;
20
31
  get size(): number;
21
32
  clear(): void;
22
33
  private getFreshEntry;
@@ -10,6 +10,7 @@ function sameUsers(previous, next) {
10
10
  }
11
11
  class PermissionsCache {
12
12
  constructor({ now = Date.now, ttlMs = exports.PERMISSIONS_CACHE_TTL_MS } = {}) {
13
+ this.generationValue = 0;
13
14
  this.now = now;
14
15
  this.ttlMs = ttlMs;
15
16
  }
@@ -22,7 +23,21 @@ class PermissionsCache {
22
23
  getFresh() {
23
24
  return this.getFreshEntry()?.permissions;
24
25
  }
25
- set(permissions) {
26
+ /**
27
+ * The generation a fetch must be started against. Read it before the fetch and hand it back to
28
+ * `set`, so a response that crossed a `clear()` cannot become the shared entry.
29
+ */
30
+ get generation() {
31
+ return this.generationValue;
32
+ }
33
+ /**
34
+ * Store a fetched payload, unless a `clear()` landed while the fetch was in flight: it read the
35
+ * permissions the invalidation declared stale, and with a single shared entry one late write would
36
+ * hand a revoked access to every caller for a full TTL.
37
+ */
38
+ set(permissions, generation) {
39
+ if (generation !== this.generationValue)
40
+ return;
26
41
  const previous = this.getFreshEntry();
27
42
  const carriesTheSameUsers = previous !== undefined && sameUsers(previous.permissions.users, permissions.users);
28
43
  this.entry = {
@@ -36,6 +51,7 @@ class PermissionsCache {
36
51
  }
37
52
  clear() {
38
53
  this.entry = undefined;
54
+ this.generationValue += 1;
39
55
  }
40
56
  getFreshEntry() {
41
57
  if (!this.entry)
@@ -48,4 +64,4 @@ class PermissionsCache {
48
64
  }
49
65
  }
50
66
  exports.default = PermissionsCache;
51
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWtCdkQsU0FBUyxTQUFTLENBQUMsUUFBNEIsRUFBRSxJQUF3QjtJQUN2RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUvRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBcUIsZ0JBQWdCO0lBTW5DLFlBQVksRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsZ0NBQXdCLEtBQThCLEVBQUU7UUFDNUYsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNwRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLFdBQVcsQ0FBQztJQUMzQyxDQUFDO0lBRUQsR0FBRyxDQUFDLFdBQWlDO1FBQ25DLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUN2QixRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckYsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLFdBQVc7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixlQUFlLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFVO1NBQ3BGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO0lBQ3pCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUV2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXRERCxtQ0FzREMifQ==
67
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtY2FjaGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtY2FjaGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBRWEsUUFBQSx3QkFBd0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQztBQWtCdkQsU0FBUyxTQUFTLENBQUMsUUFBNEIsRUFBRSxJQUF3QjtJQUN2RSxJQUFJLFFBQVEsQ0FBQyxNQUFNLEtBQUssSUFBSSxDQUFDLE1BQU07UUFBRSxPQUFPLEtBQUssQ0FBQztJQUVsRCxNQUFNLGdCQUFnQixHQUFHLElBQUksR0FBRyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUUvRSxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxLQUFLLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUMzRSxDQUFDO0FBRUQsTUFBcUIsZ0JBQWdCO0lBT25DLFlBQVksRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsZ0NBQXdCLEtBQThCLEVBQUU7UUFGdEYsb0JBQWUsR0FBRyxDQUFDLENBQUM7UUFHMUIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsd0JBQXdCLENBQUMsTUFBYztRQUNyQyxPQUFPLElBQUksQ0FBQyxhQUFhLEVBQUUsRUFBRSxlQUFlLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEtBQUssQ0FBQztJQUNwRSxDQUFDO0lBRUQsZ0JBQWdCLENBQUMsTUFBYztRQUM3QixJQUFJLENBQUMsYUFBYSxFQUFFLEVBQUUsZUFBZSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwRCxDQUFDO0lBRUQsUUFBUTtRQUNOLE9BQU8sSUFBSSxDQUFDLGFBQWEsRUFBRSxFQUFFLFdBQVcsQ0FBQztJQUMzQyxDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDO0lBQzlCLENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsR0FBRyxDQUFDLFdBQWlDLEVBQUUsVUFBa0I7UUFDdkQsSUFBSSxVQUFVLEtBQUssSUFBSSxDQUFDLGVBQWU7WUFBRSxPQUFPO1FBRWhELE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN0QyxNQUFNLG1CQUFtQixHQUN2QixRQUFRLEtBQUssU0FBUyxJQUFJLFNBQVMsQ0FBQyxRQUFRLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsS0FBSyxDQUFDLENBQUM7UUFFckYsSUFBSSxDQUFDLEtBQUssR0FBRztZQUNYLFdBQVc7WUFDWCxRQUFRLEVBQUUsSUFBSSxDQUFDLEdBQUcsRUFBRTtZQUNwQixlQUFlLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDLElBQUksR0FBRyxFQUFVO1NBQ3BGLENBQUM7SUFDSixDQUFDO0lBRUQsSUFBSSxJQUFJO1FBQ04sT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM1QixDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxLQUFLLEdBQUcsU0FBUyxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxlQUFlLElBQUksQ0FBQyxDQUFDO0lBQzVCLENBQUM7SUFFTyxhQUFhO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWxDLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNuRCxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztZQUV2QixPQUFPLFNBQVMsQ0FBQztRQUNuQixDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsS0FBSyxDQUFDO0lBQ3BCLENBQUM7Q0FDRjtBQXZFRCxtQ0F1RUMifQ==
@@ -36,6 +36,7 @@ function findCallerRoleId(users, userId) {
36
36
  }
37
37
  async function resolvePermissions({ cache, client, logger, }) {
38
38
  let resolved;
39
+ const { generation } = cache;
39
40
  try {
40
41
  resolved = await client.fetchPermissions();
41
42
  }
@@ -52,7 +53,7 @@ async function resolvePermissions({ cache, client, logger, }) {
52
53
  actionPermissions: (0, forestadmin_client_1.generateActionsFromPermissions)(resolved.environmentPermissions),
53
54
  users: resolved.users,
54
55
  };
55
- cache.set(permissions);
56
+ cache.set(permissions, generation);
56
57
  return { permissions, fromFreshFetch: true };
57
58
  }
58
59
  async function resolveCallerPermissions({ caller, cache, client, logger, }) {
@@ -96,4 +97,4 @@ function createPermissionsRoutesMiddleware({ store, client, cache, logger, }) {
96
97
  });
97
98
  };
98
99
  }
99
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFpSUEsb0RBZ0NDO0FBdEpELHdFQUFpRjtBQUVqRixzRkFBNEQ7QUFDNUQscUVBQStEO0FBQy9ELDJEQUFzRDtBQUN0RCwrREFBNEY7QUFFNUYsTUFBTSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztBQUNsRCxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQWExQyxTQUFTLGFBQWEsQ0FBQyxHQUFZO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBOEMsQ0FBQztJQUUzRSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUUvQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQW9ELENBQUM7SUFFaEYsSUFBSSxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRWxELE1BQU0sSUFBQSw2QkFBWSxFQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsR0FBWSxFQUFFLFNBQW9CO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRWxDLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRWhFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxD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
100
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcGVybWlzc2lvbnMvcGVybWlzc2lvbnMtcm91dGVzLW1pZGRsZXdhcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFrSUEsb0RBZ0NDO0FBdkpELHdFQUFpRjtBQUVqRixzRkFBNEQ7QUFDNUQscUVBQStEO0FBQy9ELDJEQUFzRDtBQUN0RCwrREFBNEY7QUFFNUYsTUFBTSxpQkFBaUIsR0FBRyx1QkFBdUIsQ0FBQztBQUNsRCxNQUFNLCtCQUErQixHQUFHLENBQUMsQ0FBQztBQWExQyxTQUFTLGFBQWEsQ0FBQyxHQUFZO0lBQ2pDLE1BQU0sU0FBUyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsU0FBOEMsQ0FBQztJQUUzRSxJQUFJLFNBQVM7UUFBRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztJQUUvQyxNQUFNLFFBQVEsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDLGNBQW9ELENBQUM7SUFFaEYsSUFBSSxRQUFRO1FBQUUsT0FBTyxFQUFFLE1BQU0sRUFBRSxRQUFRLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDO0lBRWxELE1BQU0sSUFBQSw2QkFBWSxFQUFDLHFDQUFxQyxDQUFDLENBQUM7QUFDNUQsQ0FBQztBQUVELFNBQVMsMkJBQTJCLENBQUMsR0FBWSxFQUFFLFNBQW9CO0lBQ3JFLE1BQU0sR0FBRyxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO0lBRWxDLElBQUksR0FBRyxLQUFLLFNBQVM7UUFBRSxPQUFPLFNBQVMsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO0lBRWhFLE1BQU0sS0FBSyxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxD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
@@ -15,10 +15,10 @@ function createReadModel({ forestServerUrl, envSecret, metrics, logger, now, })
15
15
  // Wrap once so a throwing metrics backend can never break business logic anywhere in the bundle.
16
16
  const resolvedMetrics = (0, safe_metrics_1.default)(metrics ?? (0, console_metrics_1.default)(logger));
17
17
  const fetcher = new forest_schema_client_1.default({ forestServerUrl, envSecret });
18
- const schemaCache = new schema_cache_1.default({ fetcher, metrics: resolvedMetrics, now });
18
+ const schemaCache = new schema_cache_1.default({ fetcher, metrics: resolvedMetrics, logger, now });
19
19
  const capabilitiesCache = new capabilities_cache_1.default({ now });
20
20
  const store = new read_model_store_1.default(schemaCache, capabilitiesCache);
21
21
  const actionEndpointResolver = new action_endpoint_resolver_1.default(() => store.getReadModel(), resolvedMetrics);
22
22
  return { store, actionEndpointResolver };
23
23
  }
24
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlYWQtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVhZC1tb2RlbC9jcmVhdGUtcmVhZC1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdCQSxrQ0FtQkM7QUF4Q0QsMEZBQWdFO0FBQ2hFLDhFQUFxRDtBQUNyRCxrRkFBd0Q7QUFDeEQsMEVBQWdEO0FBQ2hELGtFQUF5QztBQUN6QyxrRkFBK0Q7QUFDL0QsNEVBQW1EO0FBZW5ELFNBQXdCLGVBQWUsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sR0FBRyxHQUNvQjtJQUN2QixpR0FBaUc7SUFDakcsTUFBTSxlQUFlLEdBQUcsSUFBQSxzQkFBVyxFQUFDLE9BQU8sSUFBSSxJQUFBLHlCQUFvQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBSSw4QkFBa0IsQ0FBQyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLElBQUksc0JBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDaEYsTUFBTSxpQkFBaUIsR0FBRyxJQUFJLDRCQUFpQixDQUFDLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUN6RCxNQUFNLEtBQUssR0FBRyxJQUFJLDBCQUFjLENBQUMsV0FBVyxFQUFFLGlCQUFpQixDQUFDLENBQUM7SUFDakUsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLGtDQUFzQixDQUN2RCxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLEVBQzFCLGVBQWUsQ0FDaEIsQ0FBQztJQUVGLE9BQU8sRUFBRSxLQUFLLEVBQUUsc0JBQXNCLEVBQUUsQ0FBQztBQUMzQyxDQUFDIn0=
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlLXJlYWQtbW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcmVhZC1tb2RlbC9jcmVhdGUtcmVhZC1tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQXdCQSxrQ0FtQkM7QUF4Q0QsMEZBQWdFO0FBQ2hFLDhFQUFxRDtBQUNyRCxrRkFBd0Q7QUFDeEQsMEVBQWdEO0FBQ2hELGtFQUF5QztBQUN6QyxrRkFBK0Q7QUFDL0QsNEVBQW1EO0FBZW5ELFNBQXdCLGVBQWUsQ0FBQyxFQUN0QyxlQUFlLEVBQ2YsU0FBUyxFQUNULE9BQU8sRUFDUCxNQUFNLEVBQ04sR0FBRyxHQUNvQjtJQUN2QixpR0FBaUc7SUFDakcsTUFBTSxlQUFlLEdBQUcsSUFBQSxzQkFBVyxFQUFDLE9BQU8sSUFBSSxJQUFBLHlCQUFvQixFQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDN0UsTUFBTSxPQUFPLEdBQUcsSUFBSSw4QkFBa0IsQ0FBQyxFQUFFLGVBQWUsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZFLE1BQU0sV0FBVyxHQUFHLElBQUksc0JBQVcsQ0FBQyxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBQ3hGLE1BQU0saUJBQWlCLEdBQUcsSUFBSSw0QkFBaUIsQ0FBQyxFQUFFLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDekQsTUFBTSxLQUFLLEdBQUcsSUFBSSwwQkFBYyxDQUFDLFdBQVcsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0lBQ2pFLE1BQU0sc0JBQXNCLEdBQUcsSUFBSSxrQ0FBc0IsQ0FDdkQsR0FBRyxFQUFFLENBQUMsS0FBSyxDQUFDLFlBQVksRUFBRSxFQUMxQixlQUFlLENBQ2hCLENBQUM7SUFFRixPQUFPLEVBQUUsS0FBSyxFQUFFLHNCQUFzQixFQUFFLENBQUM7QUFDM0MsQ0FBQyJ9
@@ -20,6 +20,13 @@ export default class ReadModelStore {
20
20
  private readModel;
21
21
  constructor(schemaCache: SchemaCache, capabilitiesCache: CapabilitiesCache);
22
22
  getReadModel(): Promise<ReadModel>;
23
+ /**
24
+ * Forget the cached schema and the capabilities that belong to it, then force the read-model to be
25
+ * rebuilt. The capabilities are dropped here rather than left to the next revision change: a
26
+ * `clear()` also drops a schema write that was in flight, and a dropped write moves nothing the
27
+ * snapshot can notice, so inferring the invalidation from the revision would miss it.
28
+ */
29
+ invalidate(): void;
23
30
  getSchemaSnapshot(): Promise<SchemaSnapshot>;
24
31
  /**
25
32
  * Returns the capabilities together with the read-model they belong to, so a caller cannot mix a
@@ -20,6 +20,17 @@ class ReadModelStore {
20
20
  async getReadModel() {
21
21
  return (await this.getSchemaSnapshot()).readModel;
22
22
  }
23
+ /**
24
+ * Forget the cached schema and the capabilities that belong to it, then force the read-model to be
25
+ * rebuilt. The capabilities are dropped here rather than left to the next revision change: a
26
+ * `clear()` also drops a schema write that was in flight, and a dropped write moves nothing the
27
+ * snapshot can notice, so inferring the invalidation from the revision would miss it.
28
+ */
29
+ invalidate() {
30
+ this.schemaCache.clear();
31
+ this.capabilitiesCache.clear();
32
+ this.builtRevision = -1;
33
+ }
23
34
  async getSchemaSnapshot() {
24
35
  const collections = await this.schemaCache.get();
25
36
  const { revision } = this.schemaCache;
@@ -59,4 +70,4 @@ class ReadModelStore {
59
70
  }
60
71
  }
61
72
  exports.default = ReadModelStore;
62
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1tb2RlbC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWFkLW1vZGVsL3JlYWQtbW9kZWwtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSw4REFBcUM7QUFFckMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFRakM7Ozs7R0FJRztBQUNILE1BQXFCLGNBQWM7SUFPakMsWUFBWSxXQUF3QixFQUFFLGlCQUFvQztRQUhsRSxrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLGNBQVMsR0FBcUIsSUFBSSxDQUFDO1FBR3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEQsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXRDLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLG9CQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsVUFBa0IsRUFDbEIsT0FBNEIsRUFDNUIsWUFBWSxHQUFHLHNCQUFzQjtRQUVyQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLG1FQUFtRSxVQUFVLEdBQUcsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFFRCxvRkFBb0Y7UUFDcEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRSw2RkFBNkY7UUFDN0YsaUdBQWlHO1FBQ2pHLCtGQUErRjtRQUMvRiw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUFsRUQsaUNBa0VDIn0=
73
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVhZC1tb2RlbC1zdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9yZWFkLW1vZGVsL3JlYWQtbW9kZWwtc3RvcmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFLQSw4REFBcUM7QUFFckMsTUFBTSxzQkFBc0IsR0FBRyxDQUFDLENBQUM7QUFRakM7Ozs7R0FJRztBQUNILE1BQXFCLGNBQWM7SUFPakMsWUFBWSxXQUF3QixFQUFFLGlCQUFvQztRQUhsRSxrQkFBYSxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQ25CLGNBQVMsR0FBcUIsSUFBSSxDQUFDO1FBR3pDLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO1FBQy9CLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxpQkFBaUIsQ0FBQztJQUM3QyxDQUFDO0lBRUQsS0FBSyxDQUFDLFlBQVk7UUFDaEIsT0FBTyxDQUFDLE1BQU0sSUFBSSxDQUFDLGlCQUFpQixFQUFFLENBQUMsQ0FBQyxTQUFTLENBQUM7SUFDcEQsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0gsVUFBVTtRQUNSLElBQUksQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLENBQUM7UUFDekIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQy9CLElBQUksQ0FBQyxhQUFhLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDMUIsQ0FBQztJQUVELEtBQUssQ0FBQyxpQkFBaUI7UUFDckIsTUFBTSxXQUFXLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsRUFBRSxDQUFDO1FBQ2pELE1BQU0sRUFBRSxRQUFRLEVBQUUsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXRDLElBQUksUUFBUSxLQUFLLElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUM7WUFDdkQsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLG9CQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7WUFDNUMsSUFBSSxDQUFDLGFBQWEsR0FBRyxRQUFRLENBQUM7WUFDOUIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2pDLENBQUM7UUFFRCxPQUFPLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUyxFQUFFLFFBQVEsRUFBRSxDQUFDO0lBQzlELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLGVBQWUsQ0FDbkIsVUFBa0IsRUFDbEIsT0FBNEIsRUFDNUIsWUFBWSxHQUFHLHNCQUFzQjtRQUVyQyxJQUFJLFlBQVksSUFBSSxDQUFDLEVBQUUsQ0FBQztZQUN0QixNQUFNLElBQUksS0FBSyxDQUNiLG1FQUFtRSxVQUFVLEdBQUcsQ0FDakYsQ0FBQztRQUNKLENBQUM7UUFFRCxvRkFBb0Y7UUFDcEYsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDNUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDdEMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUUzRSw2RkFBNkY7UUFDN0YsaUdBQWlHO1FBQ2pHLCtGQUErRjtRQUMvRiw4RkFBOEY7UUFDOUYsNkZBQTZGO1FBQzdGLHVEQUF1RDtRQUN2RCxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1lBQzNDLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxVQUFVLEVBQUUsT0FBTyxFQUFFLFlBQVksR0FBRyxDQUFDLENBQUMsQ0FBQztRQUNyRSxDQUFDO1FBRUQsT0FBTyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsQ0FBQztJQUNyQyxDQUFDO0lBRUQsVUFBVTtRQUNSLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztJQUN2QyxDQUFDO0NBQ0Y7QUE5RUQsaUNBOEVDIn0=
@@ -1,12 +1,23 @@
1
1
  import type { SchemaFetcher } from './forest-schema-client';
2
+ import type { Logger } from '../ports/logger-port';
2
3
  import type { Metrics } from '../ports/metrics-port';
3
4
  import type { ForestSchemaCollection } from '@forestadmin/forestadmin-client';
4
5
  export declare const ONE_DAY_MS: number;
6
+ /**
7
+ * How long after a `clear()` the cache keeps re-reading the schema, and how often. An invalidation
8
+ * says "the agent just changed its schema", but the SaaS the BFF reads from may not have finished
9
+ * recording it: caching whatever comes back on the very next read would pin the old schema for a
10
+ * full day. Within this window a read costs one request every few seconds, which is nothing next to
11
+ * serving a collection the agent exposes and the BFF 404s.
12
+ */
13
+ export declare const REVALIDATION_WINDOW_MS: number;
14
+ export declare const REVALIDATION_TTL_MS: number;
5
15
  export declare const SCHEMA_CACHE_REFRESH_ERROR = "schema_cache_refresh_error";
6
16
  export declare const SCHEMA_CACHE_AGE_SECONDS = "schema_cache_age_seconds";
7
17
  export interface SchemaCacheOptions {
8
18
  fetcher: SchemaFetcher;
9
19
  metrics: Metrics;
20
+ logger?: Logger;
10
21
  now?: () => number;
11
22
  ttlMs?: number;
12
23
  }
@@ -19,17 +30,31 @@ export interface SchemaCacheOptions {
19
30
  export default class SchemaCache {
20
31
  private readonly fetcher;
21
32
  private readonly metrics;
33
+ private readonly logger;
22
34
  private readonly now;
23
35
  private readonly ttlMs;
24
36
  private entry;
25
37
  private inFlight;
26
38
  private revisionValue;
27
- constructor({ fetcher, metrics, now, ttlMs }: SchemaCacheOptions);
39
+ private generation;
40
+ private revalidatingUntil;
41
+ constructor({ fetcher, metrics, logger, now, ttlMs, }: SchemaCacheOptions);
28
42
  get(): Promise<ForestSchemaCollection[]>;
43
+ /**
44
+ * Expire what is cached and re-read it eagerly for a while. Called when something outside knows
45
+ * the schema moved — an agent restarting on a customization refresh, say.
46
+ *
47
+ * The entry is expired, not dropped: every read now goes through a refresh, so nothing the host
48
+ * declared stale is served while the SaaS answers, but the class keeps its safety net — a refresh
49
+ * that fails still has a last good schema to fall back on. Dropping it would turn a restart
50
+ * during a SaaS blip into a `503 schema_unavailable` on every data route.
51
+ */
52
+ clear(): void;
29
53
  ageSeconds(): number | undefined;
30
54
  get revision(): number;
31
55
  private refresh;
32
56
  private doRefresh;
57
+ private ttlFor;
33
58
  private emitAge;
34
59
  }
35
60
  //# sourceMappingURL=schema-cache.d.ts.map
@@ -3,9 +3,18 @@ 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.SCHEMA_CACHE_AGE_SECONDS = exports.SCHEMA_CACHE_REFRESH_ERROR = exports.ONE_DAY_MS = void 0;
6
+ exports.SCHEMA_CACHE_AGE_SECONDS = exports.SCHEMA_CACHE_REFRESH_ERROR = exports.REVALIDATION_TTL_MS = exports.REVALIDATION_WINDOW_MS = exports.ONE_DAY_MS = void 0;
7
7
  const errors_1 = __importDefault(require("./errors"));
8
8
  exports.ONE_DAY_MS = 24 * 60 * 60 * 1000;
9
+ /**
10
+ * How long after a `clear()` the cache keeps re-reading the schema, and how often. An invalidation
11
+ * says "the agent just changed its schema", but the SaaS the BFF reads from may not have finished
12
+ * recording it: caching whatever comes back on the very next read would pin the old schema for a
13
+ * full day. Within this window a read costs one request every few seconds, which is nothing next to
14
+ * serving a collection the agent exposes and the BFF 404s.
15
+ */
16
+ exports.REVALIDATION_WINDOW_MS = 60 * 1000;
17
+ exports.REVALIDATION_TTL_MS = 5 * 1000;
9
18
  exports.SCHEMA_CACHE_REFRESH_ERROR = 'schema_cache_refresh_error';
10
19
  exports.SCHEMA_CACHE_AGE_SECONDS = 'schema_cache_age_seconds';
11
20
  /**
@@ -15,22 +24,41 @@ exports.SCHEMA_CACHE_AGE_SECONDS = 'schema_cache_age_seconds';
15
24
  * a consumer can detect a new schema generation explicitly.
16
25
  */
17
26
  class SchemaCache {
18
- constructor({ fetcher, metrics, now = Date.now, ttlMs = exports.ONE_DAY_MS }) {
27
+ constructor({ fetcher, metrics, logger = () => undefined, now = Date.now, ttlMs = exports.ONE_DAY_MS, }) {
19
28
  this.entry = null;
20
29
  this.inFlight = null;
21
30
  this.revisionValue = 0;
31
+ this.generation = 0;
32
+ this.revalidatingUntil = 0;
22
33
  this.fetcher = fetcher;
23
34
  this.metrics = metrics;
35
+ this.logger = logger;
24
36
  this.now = now;
25
37
  this.ttlMs = ttlMs;
26
38
  }
27
39
  async get() {
28
- if (this.entry && this.now() - this.entry.fetchedAt < this.ttlMs) {
40
+ if (this.entry && this.now() < this.entry.expiresAt) {
29
41
  this.emitAge();
30
42
  return this.entry.collections;
31
43
  }
32
44
  return this.refresh();
33
45
  }
46
+ /**
47
+ * Expire what is cached and re-read it eagerly for a while. Called when something outside knows
48
+ * the schema moved — an agent restarting on a customization refresh, say.
49
+ *
50
+ * The entry is expired, not dropped: every read now goes through a refresh, so nothing the host
51
+ * declared stale is served while the SaaS answers, but the class keeps its safety net — a refresh
52
+ * that fails still has a last good schema to fall back on. Dropping it would turn a restart
53
+ * during a SaaS blip into a `503 schema_unavailable` on every data route.
54
+ */
55
+ clear() {
56
+ this.generation += 1;
57
+ this.inFlight = null;
58
+ this.revalidatingUntil = this.now() + exports.REVALIDATION_WINDOW_MS;
59
+ if (this.entry)
60
+ this.entry = { ...this.entry, expiresAt: this.now() };
61
+ }
34
62
  ageSeconds() {
35
63
  if (!this.entry)
36
64
  return undefined;
@@ -41,13 +69,18 @@ class SchemaCache {
41
69
  }
42
70
  async refresh() {
43
71
  if (!this.inFlight) {
44
- this.inFlight = this.doRefresh().finally(() => {
45
- this.inFlight = null;
72
+ // Identity-guarded, because `clear()` detaches the in-flight fetch: a read that lands after an
73
+ // invalidation must start its own, not join the one that read the invalidated schema.
74
+ const pending = this.doRefresh().finally(() => {
75
+ if (this.inFlight === pending)
76
+ this.inFlight = null;
46
77
  });
78
+ this.inFlight = pending;
47
79
  }
48
80
  return this.inFlight;
49
81
  }
50
82
  async doRefresh() {
83
+ const { generation } = this;
51
84
  try {
52
85
  const collections = await this.fetcher.fetchSchema();
53
86
  // An agent always exposes collections, so an empty result is far likelier a broken response
@@ -55,15 +88,27 @@ class SchemaCache {
55
88
  // failed fetch and fall through to the failure path below.
56
89
  if (collections.length === 0)
57
90
  throw new Error('Forest returned an empty schema');
58
- this.entry = { collections, fetchedAt: this.now() };
59
- this.revisionValue += 1;
60
- this.emitAge();
91
+ // Skip the write if a clear() happened while this fetch was in flight: it read the schema the
92
+ // invalidation declared stale, and caching it now would undo the invalidation.
93
+ if (this.generation === generation) {
94
+ const fetchedAt = this.now();
95
+ this.entry = { collections, fetchedAt, expiresAt: fetchedAt + this.ttlFor(fetchedAt) };
96
+ this.revisionValue += 1;
97
+ this.emitAge();
98
+ }
61
99
  return collections;
62
100
  }
63
101
  catch (error) {
64
102
  this.metrics.increment(exports.SCHEMA_CACHE_REFRESH_ERROR);
103
+ // The counter alone cannot tell "the SaaS returned an empty array" from "the SaaS is down"
104
+ // from "the env secret is wrong", and the cause is otherwise swallowed: it becomes the `cause`
105
+ // of a `SchemaUnavailableError` the error middleware serialises without logging.
106
+ this.logger('Warn', 'Schema refresh failed', {
107
+ cause: error instanceof Error ? `${error.name}: ${error.message}` : String(error),
108
+ servedStale: this.entry !== null,
109
+ });
65
110
  // Warm cache: keep serving the last good schema (stale), do not poison — the next read
66
- // re-attempts because `fetchedAt` is unchanged and the entry stays expired.
111
+ // re-attempts because `expiresAt` is unchanged and the entry stays expired.
67
112
  if (this.entry) {
68
113
  this.emitAge();
69
114
  return this.entry.collections;
@@ -72,6 +117,9 @@ class SchemaCache {
72
117
  throw new errors_1.default(error);
73
118
  }
74
119
  }
120
+ ttlFor(fetchedAt) {
121
+ return fetchedAt < this.revalidatingUntil ? exports.REVALIDATION_TTL_MS : this.ttlMs;
122
+ }
75
123
  emitAge() {
76
124
  const age = this.ageSeconds();
77
125
  if (age !== undefined)
@@ -79,4 +127,4 @@ class SchemaCache {
79
127
  }
80
128
  }
81
129
  exports.default = SchemaCache;
82
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWQtbW9kZWwvc2NoZW1hLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUlBLHNEQUE4QztBQUVqQyxRQUFBLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFakMsUUFBQSwwQkFBMEIsR0FBRyw0QkFBNEIsQ0FBQztBQUMxRCxRQUFBLHdCQUF3QixHQUFHLDBCQUEwQixDQUFDO0FBY25FOzs7OztHQUtHO0FBQ0gsTUFBcUIsV0FBVztJQVU5QixZQUFZLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxLQUFLLEdBQUcsa0JBQVUsRUFBc0I7UUFKaEYsVUFBSyxHQUFzQixJQUFJLENBQUM7UUFDaEMsYUFBUSxHQUE2QyxJQUFJLENBQUM7UUFDMUQsa0JBQWEsR0FBRyxDQUFDLENBQUM7UUFHeEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUc7UUFDUCxJQUFJLElBQUksQ0FBQyxLQUFLLElBQUksSUFBSSxDQUFDLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNqRSxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFFZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1FBQ2hDLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRUQsVUFBVTtRQUNSLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSztZQUFFLE9BQU8sU0FBUyxDQUFDO1FBRWxDLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQyxDQUFDO0lBQ2hFLENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxhQUFhLENBQUM7SUFDNUIsQ0FBQztJQUVPLEtBQUssQ0FBQyxPQUFPO1FBQ25CLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDNUMsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7UUFDTCxDQUFDO1FBRUQsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDO0lBQ3ZCLENBQUM7SUFFTyxLQUFLLENBQUMsU0FBUztRQUNyQixJQUFJLENBQUM7WUFDSCxNQUFNLFdBQVcsR0FBRyxNQUFNLElBQUksQ0FBQyxPQUFPLENBQUMsV0FBVyxFQUFFLENBQUM7WUFFckQsNEZBQTRGO1lBQzVGLHdGQUF3RjtZQUN4RiwyREFBMkQ7WUFDM0QsSUFBSSxXQUFXLENBQUMsTUFBTSxLQUFLLENBQUM7Z0JBQUUsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1lBRWpGLElBQUksQ0FBQyxLQUFLLEdBQUcsRUFBRSxXQUFXLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDO1lBQ3BELElBQUksQ0FBQyxhQUFhLElBQUksQ0FBQyxDQUFDO1lBQ3hCLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUVmLE9BQU8sV0FBVyxDQUFDO1FBQ3JCLENBQUM7UUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1lBQ2YsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsa0NBQTBCLENBQUMsQ0FBQztZQUVuRCx1RkFBdUY7WUFDdkYsNEVBQTRFO1lBQzVFLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO2dCQUNmLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFFZixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsV0FBVyxDQUFDO1lBQ2hDLENBQUM7WUFFRCxnQ0FBZ0M7WUFDaEMsTUFBTSxJQUFJLGdCQUFzQixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQzFDLENBQUM7SUFDSCxDQUFDO0lBRU8sT0FBTztRQUNiLE1BQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM5QixJQUFJLEdBQUcsS0FBSyxTQUFTO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsZ0NBQXdCLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDM0UsQ0FBQztDQUNGO0FBakZELDhCQWlGQyJ9
130
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hLWNhY2hlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3JlYWQtbW9kZWwvc2NoZW1hLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUtBLHNEQUE4QztBQUVqQyxRQUFBLFVBQVUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxJQUFJLENBQUM7QUFFOUM7Ozs7OztHQU1HO0FBQ1UsUUFBQSxzQkFBc0IsR0FBRyxFQUFFLEdBQUcsSUFBSSxDQUFDO0FBQ25DLFFBQUEsbUJBQW1CLEdBQUcsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUUvQixRQUFBLDBCQUEwQixHQUFHLDRCQUE0QixDQUFDO0FBQzFELFFBQUEsd0JBQXdCLEdBQUcsMEJBQTBCLENBQUM7QUFxQm5FOzs7OztHQUtHO0FBQ0gsTUFBcUIsV0FBVztJQWE5QixZQUFZLEVBQ1YsT0FBTyxFQUNQLE9BQU8sRUFDUCxNQUFNLEdBQUcsR0FBRyxFQUFFLENBQUMsU0FBUyxFQUN4QixHQUFHLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFDZCxLQUFLLEdBQUcsa0JBQVUsR0FDQztRQVpiLFVBQUssR0FBc0IsSUFBSSxDQUFDO1FBQ2hDLGFBQVEsR0FBNkMsSUFBSSxDQUFDO1FBQzFELGtCQUFhLEdBQUcsQ0FBQyxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxDQUFDLENBQUM7UUFDZixzQkFBaUIsR0FBRyxDQUFDLENBQUM7UUFTNUIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7UUFDdkIsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7UUFDckIsSUFBSSxDQUFDLEdBQUcsR0FBRyxHQUFHLENBQUM7UUFDZixJQUFJLENBQUMsS0FBSyxHQUFHLEtBQUssQ0FBQztJQUNyQixDQUFDO0lBRUQsS0FBSyxDQUFDLEdBQUc7UUFDUCxJQUFJLElBQUksQ0FBQyxLQUFL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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@forestadmin/agent-bff",
3
- "version": "1.27.0",
3
+ "version": "1.28.1",
4
4
  "main": "dist/index.js",
5
5
  "bin": {
6
6
  "forest-bff": "dist/cli.js"