@jantstack/adonis-authz 2.4.0-alpha.1 → 2.4.0-alpha.10

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.
Files changed (158) hide show
  1. package/README.md +496 -29
  2. package/build/commands/authz_catalog_diff.d.ts.map +1 -1
  3. package/build/commands/authz_catalog_diff.js +0 -1
  4. package/build/commands/authz_catalog_diff.js.map +1 -1
  5. package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -1
  6. package/build/commands/authz_catalog_prune_orphans.js +0 -1
  7. package/build/commands/authz_catalog_prune_orphans.js.map +1 -1
  8. package/build/commands/authz_freeze.d.ts.map +1 -1
  9. package/build/commands/authz_freeze.js +1 -2
  10. package/build/commands/authz_freeze.js.map +1 -1
  11. package/build/commands/authz_reconcile.d.ts +15 -6
  12. package/build/commands/authz_reconcile.d.ts.map +1 -1
  13. package/build/commands/authz_reconcile.js +143 -20
  14. package/build/commands/authz_reconcile.js.map +1 -1
  15. package/build/commands/authz_relations_reconcile.d.ts +72 -1
  16. package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
  17. package/build/commands/authz_relations_reconcile.js +234 -21
  18. package/build/commands/authz_relations_reconcile.js.map +1 -1
  19. package/build/commands/authz_scopes_relay.d.ts +50 -0
  20. package/build/commands/authz_scopes_relay.d.ts.map +1 -1
  21. package/build/commands/authz_scopes_relay.js +213 -10
  22. package/build/commands/authz_scopes_relay.js.map +1 -1
  23. package/build/commands/authz_scopes_requeue.d.ts +80 -0
  24. package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
  25. package/build/commands/authz_scopes_requeue.js +230 -0
  26. package/build/commands/authz_scopes_requeue.js.map +1 -0
  27. package/build/commands/authz_unfreeze.d.ts +12 -4
  28. package/build/commands/authz_unfreeze.d.ts.map +1 -1
  29. package/build/commands/authz_unfreeze.js +74 -9
  30. package/build/commands/authz_unfreeze.js.map +1 -1
  31. package/build/commands/main.d.ts +16 -13
  32. package/build/commands/main.d.ts.map +1 -1
  33. package/build/commands/main.js +59 -11
  34. package/build/commands/main.js.map +1 -1
  35. package/build/commands/openfga_provision.d.ts +49 -3
  36. package/build/commands/openfga_provision.d.ts.map +1 -1
  37. package/build/commands/openfga_provision.js +72 -7
  38. package/build/commands/openfga_provision.js.map +1 -1
  39. package/build/index.d.ts +15 -5
  40. package/build/index.d.ts.map +1 -1
  41. package/build/index.js +16 -3
  42. package/build/index.js.map +1 -1
  43. package/build/providers/authz_provider.d.ts +7 -2
  44. package/build/providers/authz_provider.d.ts.map +1 -1
  45. package/build/providers/authz_provider.js +20 -3
  46. package/build/providers/authz_provider.js.map +1 -1
  47. package/build/src/define_config.d.ts +106 -1
  48. package/build/src/define_config.d.ts.map +1 -1
  49. package/build/src/define_config.js +11 -0
  50. package/build/src/define_config.js.map +1 -1
  51. package/build/src/drivers/database_driver.d.ts +53 -14
  52. package/build/src/drivers/database_driver.d.ts.map +1 -1
  53. package/build/src/drivers/database_driver.js +104 -32
  54. package/build/src/drivers/database_driver.js.map +1 -1
  55. package/build/src/drivers/database_relations_driver.d.ts +74 -9
  56. package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
  57. package/build/src/drivers/database_relations_driver.js +391 -93
  58. package/build/src/drivers/database_relations_driver.js.map +1 -1
  59. package/build/src/drivers/openfga_driver.d.ts +71 -10
  60. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  61. package/build/src/drivers/openfga_driver.js +195 -16
  62. package/build/src/drivers/openfga_driver.js.map +1 -1
  63. package/build/src/drivers/openfga_facts.d.ts +15 -0
  64. package/build/src/drivers/openfga_facts.d.ts.map +1 -1
  65. package/build/src/drivers/openfga_facts.js +25 -2
  66. package/build/src/drivers/openfga_facts.js.map +1 -1
  67. package/build/src/drivers/openfga_relations_driver.d.ts +72 -6
  68. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
  69. package/build/src/drivers/openfga_relations_driver.js +308 -50
  70. package/build/src/drivers/openfga_relations_driver.js.map +1 -1
  71. package/build/src/errors.d.ts +175 -4
  72. package/build/src/errors.d.ts.map +1 -1
  73. package/build/src/errors.js +219 -3
  74. package/build/src/errors.js.map +1 -1
  75. package/build/src/freeze.d.ts +100 -20
  76. package/build/src/freeze.d.ts.map +1 -1
  77. package/build/src/freeze.js +159 -25
  78. package/build/src/freeze.js.map +1 -1
  79. package/build/src/manager.d.ts +239 -7
  80. package/build/src/manager.d.ts.map +1 -1
  81. package/build/src/manager.js +1192 -148
  82. package/build/src/manager.js.map +1 -1
  83. package/build/src/models/authz_assignment.d.ts +2 -2
  84. package/build/src/models/authz_assignment.d.ts.map +1 -1
  85. package/build/src/models/authz_deny.d.ts +2 -2
  86. package/build/src/models/authz_deny.d.ts.map +1 -1
  87. package/build/src/models/authz_permission.d.ts +2 -2
  88. package/build/src/models/authz_permission.d.ts.map +1 -1
  89. package/build/src/models/authz_role.d.ts +2 -2
  90. package/build/src/models/authz_role.d.ts.map +1 -1
  91. package/build/src/models/authz_role_permission.d.ts +2 -2
  92. package/build/src/models/authz_role_permission.d.ts.map +1 -1
  93. package/build/src/relation_partition_trigger.d.ts.map +1 -1
  94. package/build/src/relation_partition_trigger.js +11 -3
  95. package/build/src/relation_partition_trigger.js.map +1 -1
  96. package/build/src/relations/define_relations_config.d.ts +51 -0
  97. package/build/src/relations/define_relations_config.d.ts.map +1 -1
  98. package/build/src/relations/define_relations_config.js +68 -1
  99. package/build/src/relations/define_relations_config.js.map +1 -1
  100. package/build/src/relations/manager.d.ts +106 -6
  101. package/build/src/relations/manager.d.ts.map +1 -1
  102. package/build/src/relations/manager.js +368 -30
  103. package/build/src/relations/manager.js.map +1 -1
  104. package/build/src/relations/reconcile.d.ts +81 -6
  105. package/build/src/relations/reconcile.d.ts.map +1 -1
  106. package/build/src/relations/reconcile.js +233 -77
  107. package/build/src/relations/reconcile.js.map +1 -1
  108. package/build/src/scope_outbox.d.ts +54 -0
  109. package/build/src/scope_outbox.d.ts.map +1 -1
  110. package/build/src/scope_outbox.js +274 -33
  111. package/build/src/scope_outbox.js.map +1 -1
  112. package/build/src/shared/backend_guard.d.ts +28 -0
  113. package/build/src/shared/backend_guard.d.ts.map +1 -1
  114. package/build/src/shared/backend_guard.js +52 -0
  115. package/build/src/shared/backend_guard.js.map +1 -1
  116. package/build/src/shared/sql_expiry.d.ts +2 -0
  117. package/build/src/shared/sql_expiry.d.ts.map +1 -1
  118. package/build/src/shared/sql_expiry.js +4 -0
  119. package/build/src/shared/sql_expiry.js.map +1 -1
  120. package/build/src/shared/transaction_guard.d.ts +53 -0
  121. package/build/src/shared/transaction_guard.d.ts.map +1 -0
  122. package/build/src/shared/transaction_guard.js +74 -0
  123. package/build/src/shared/transaction_guard.js.map +1 -0
  124. package/build/src/sql_descendants.d.ts +8 -0
  125. package/build/src/sql_descendants.d.ts.map +1 -1
  126. package/build/src/sql_descendants.js.map +1 -1
  127. package/build/src/testing/contract.d.ts +55 -4
  128. package/build/src/testing/contract.d.ts.map +1 -1
  129. package/build/src/testing/contract.js +244 -9
  130. package/build/src/testing/contract.js.map +1 -1
  131. package/build/src/testing/main.d.ts +6 -4
  132. package/build/src/testing/main.d.ts.map +1 -1
  133. package/build/src/testing/main.js +3 -2
  134. package/build/src/testing/main.js.map +1 -1
  135. package/build/src/testing/migration_contract.d.ts +9 -0
  136. package/build/src/testing/migration_contract.d.ts.map +1 -1
  137. package/build/src/testing/migration_contract.js +5 -2
  138. package/build/src/testing/migration_contract.js.map +1 -1
  139. package/build/src/testing/relations_contract.d.ts +23 -1
  140. package/build/src/testing/relations_contract.d.ts.map +1 -1
  141. package/build/src/testing/relations_contract.js +603 -19
  142. package/build/src/testing/relations_contract.js.map +1 -1
  143. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
  144. package/build/src/testing/relations_reconcile_contract.js +49 -1
  145. package/build/src/testing/relations_reconcile_contract.js.map +1 -1
  146. package/build/src/testing/scope_outbox_contract.d.ts +98 -0
  147. package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
  148. package/build/src/testing/scope_outbox_contract.js +677 -0
  149. package/build/src/testing/scope_outbox_contract.js.map +1 -0
  150. package/build/src/traits/has_uuid.d.ts +2 -2
  151. package/build/src/traits/has_uuid.d.ts.map +1 -1
  152. package/build/src/types.d.ts +708 -38
  153. package/build/src/types.d.ts.map +1 -1
  154. package/build/src/types.js +55 -0
  155. package/build/src/types.js.map +1 -1
  156. package/build/stubs/config/authorization.stub +45 -1
  157. package/build/stubs/migration.stub +20 -10
  158. package/package.json +1 -1
@@ -32,10 +32,14 @@
32
32
  * del SDK escapa (todo va por `#guard`, que clasifica a 503/timeout).
33
33
  */
34
34
  import { OpenFgaClient, ConsistencyPreference, ClientWriteRequestOnMissingDeletes, ClientWriteRequestOnDuplicateWrites, } from '@openfga/sdk';
35
- import { AuthorizationBackendError, AuthorizationBackendTimeoutError, InvalidIdentityError, PurgeIncompleteError, UnsupportedOperationError, } from '../errors.js';
36
- import { assertScope, assertSubject, assertRelationId, scopeKey, scopeSpellings } from '../identity.js';
35
+ import { AuthorizationBackendError, AuthorizationBackendTimeoutError, AuthorizationConfigError, InvalidIdentityError, PurgeIncompleteError, UnsupportedOperationError, markPartialWrite, } from '../errors.js';
36
+ import { assertScope, assertSubject, assertRelationId, assertExpiresAt, scopeKey, scopeSpellings } from '../identity.js';
37
+ import { isClock, systemClock } from '../clock.js';
38
+ import { resolveGrantExpiry, sameInstant, toExpiryDate } from '../expiry.js';
37
39
  import { isRelUserset } from '../types.js';
38
- import { assertFgaObjectId, FACTS_GROUP_TYPE } from './openfga_facts.js';
40
+ import { assertFgaObjectId, FACTS_EXPIRY_CONDITION, FACTS_GROUP_TYPE, } from './openfga_facts.js';
41
+ import { assertRelationDeclared, assertObjectTypeDeclared } from '../relations/define_relations_config.js';
42
+ import { isTimeoutLike, withDeadline } from '../shared/backend_guard.js';
39
43
  export const DEFAULT_TIMEOUT_MS = 5_000;
40
44
  /** Tope de operaciones por `Write` en FGA (`exceeded_entity_limit` a partir de 100). */
41
45
  const WRITE_BATCH_SIZE = 100;
@@ -58,7 +62,12 @@ const MAX_READ_PAGES = 10_000;
58
62
  * truncado FALSO (el servidor devolvió todo); por encima, se perdería el corte.
59
63
  */
60
64
  const DEFAULT_LIST_OBJECTS_MAX = 1_000;
61
- /** Ignora duplicados: las tuplas de relación no llevan condición (idénticas por construcción). */
65
+ /**
66
+ * Ignora duplicados en el `Write` de una tupla que NO estaba (idempotencia de
67
+ * dos `relate` concurrentes idénticos). Cambiar la caducidad de una que SÍ
68
+ * está es delete+write (R-15): FGA no admite reescribir la condición de una
69
+ * tupla existente y un `Ignore` la dejaría con la caducidad vieja en silencio.
70
+ */
62
71
  const IGNORE_DUPLICATE_WRITES = {
63
72
  conflict: { onDuplicateWrites: ClientWriteRequestOnDuplicateWrites.Ignore },
64
73
  };
@@ -87,6 +96,8 @@ export class OpenFgaRelationsDriver {
87
96
  * `group`), descartando las de `facts` (scope/role/role_binding).
88
97
  * - `listObjectsTruncation: true`: `ListObjects` trunca al tope del servidor
89
98
  * y este driver lo SEÑALA (medido contra el `:8103` de tope 3).
99
+ * - `injectableClock: true` (R-15): `withClock(now)` fija el reloj que viaja
100
+ * como `current_time` y filtra `listSubjects`, como el driver de roles.
90
101
  */
91
102
  capabilities = Object.freeze({
92
103
  singleCheckRelations: true,
@@ -95,9 +106,27 @@ export class OpenFgaRelationsDriver {
95
106
  membersOfNative: false,
96
107
  enumerateRelations: true,
97
108
  listObjectsTruncation: true,
109
+ injectableClock: true,
110
+ // L-2/L-5 (panel `{trx}`, (C)): `false` EXPLÍCITO, y no puede ser otra
111
+ // cosa — una tupla no entra en una transacción SQL: el store es otro
112
+ // servicio y no hay 2PC, así que «los dos o ninguno» con la transacción
113
+ // del consumidor es una promesa que este driver no puede hacer, y no la
114
+ // hace. `{ transaction }` es 500 `E_AUTHZ_UNSUPPORTED` por llamada, en el
115
+ // `RelationsManager` (puerta 1) Y en el driver (`#rejectTransaction`,
116
+ // para quien entre por `manager.driver()` o por `reconcileRelations`),
117
+ // con CERO llamadas al store (L-5 lo fija contra el `:8101` con espía
118
+ // sobre el cliente). La alternativa que SÍ existe es para el ÁRBOL de
119
+ // scopes: `scopes.outbox` encola en tu transacción y `authz:scopes:relay`
120
+ // aplica. Para las RELACIONES no hay outbox (el panel la descartó:
121
+ // fail-open medido durante el lag); el consumidor lee esta capacidad y
122
+ // ajusta (usa `database` para lo que tenga que ir en su transacción, o
123
+ // `requireTransactionalWrites` para fallar al arrancar).
124
+ transactionalWrites: false,
98
125
  });
99
126
  client;
100
127
  #config;
128
+ #options;
129
+ #now;
101
130
  #holderTypes;
102
131
  #fgaToMorph;
103
132
  #timeoutMs;
@@ -107,6 +136,8 @@ export class OpenFgaRelationsDriver {
107
136
  diagnostics = { unparseableTuples: 0 };
108
137
  constructor(config, options) {
109
138
  this.#config = config;
139
+ this.#options = options;
140
+ this.#now = options.now ?? systemClock;
110
141
  this.#holderTypes = options.holderTypes;
111
142
  this.#fgaToMorph = Object.fromEntries(Object.entries(options.holderTypes).map(([morph, fga]) => [fga, morph]));
112
143
  this.#timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
@@ -124,20 +155,59 @@ export class OpenFgaRelationsDriver {
124
155
  retryParams: { maxRetry: 0 },
125
156
  });
126
157
  }
158
+ /**
159
+ * Vista de este driver con OTRO reloj de pared (R-15, paridad con
160
+ * `AuthorizationDriver.withClock`): MISMO cliente (store, modelo, deadline),
161
+ * solo cambia el `now` que decide la caducidad. Se construye una instancia
162
+ * nueva y se le presta el cliente (el espía de «1 Check» envuelve
163
+ * `client.check` de la instancia base y tiene que seguir viéndolo).
164
+ */
165
+ withClock(now) {
166
+ if (!isClock(now)) {
167
+ throw new AuthorizationConfigError(`withClock: now debe ser una función () => Date (llegó ${typeof now})`);
168
+ }
169
+ const view = new OpenFgaRelationsDriver(this.#config, { ...this.#options, now });
170
+ view.client = this.client;
171
+ return view;
172
+ }
173
+ /** El `context` de todo `Check`/`ListObjects`: la condición `not_expired` se evalúa contra este instante (un `now` por operación). */
174
+ #checkContext(at) {
175
+ return { current_time: at.toISOString() };
176
+ }
127
177
  /* ── Clasificación de fallos (la abstracción no filtra) ─────────────────── */
178
+ /**
179
+ * **El MISMO criterio que el driver de roles** (`guardBackendErrors`,
180
+ * `openfga_driver.ts`; cierre-2 de alpha.3, ⚪ 5 del re-ataque): un
181
+ * deadline TOTAL PROPIO por llamada (`withDeadline`, `timeoutMs`) que es lo
182
+ * que dice «venció el deadline» —503 `E_AUTHZ_BACKEND_TIMEOUT`, indeterminado—,
183
+ * y para lo que el cliente lanza por su cuenta el `isTimeoutLike` ESTRICTO
184
+ * de `backend_guard.ts` (`ECONNABORTED`/`ETIMEDOUT`/`.timeout` numérico/
185
+ * `KnexTimeoutError`, por la cadena de `cause`). Hasta el cierre-2 este
186
+ * driver duplicaba la función con una rama por SUBSTRING del mensaje
187
+ * (`/timeout/i`): un error que decía «no es timeout» salía como timeout con
188
+ * `indeterminate: true` sin haber borrado nada, y el docblock afirmaba en
189
+ * falso «mismo criterio que roles».
190
+ */
128
191
  async #guard(operation, fn) {
129
- try {
130
- return await fn();
131
- }
132
- catch (error) {
192
+ const fail = (error) => {
133
193
  // Un error del paquete (422/500 ya clasificado) se propaga tal cual.
134
194
  if (error instanceof InvalidIdentityError || error instanceof PurgeIncompleteError)
135
- throw error;
195
+ return error;
136
196
  if (isTimeoutLike(error)) {
137
- throw new AuthorizationBackendTimeoutError('openfga-relations', operation, this.#timeoutMs, error);
197
+ return new AuthorizationBackendTimeoutError('openfga-relations', operation, this.#timeoutMs, error);
138
198
  }
139
- throw new AuthorizationBackendError('openfga-relations', operation, error);
199
+ return new AuthorizationBackendError('openfga-relations', operation, error);
200
+ };
201
+ let pending;
202
+ try {
203
+ pending = fn();
204
+ }
205
+ catch (error) {
206
+ throw fail(error);
140
207
  }
208
+ return withDeadline(pending.catch((error) => {
209
+ throw fail(error);
210
+ }), this.#timeoutMs, () => new AuthorizationBackendTimeoutError('openfga-relations', operation, this.#timeoutMs));
141
211
  }
142
212
  /* ── Composición y parseo de ids (⚪5: partición por string en el id) ────── */
143
213
  /** `<type>:<scopeKey(partition)>|<objectUuid>`. */
@@ -159,6 +229,10 @@ export class OpenFgaRelationsDriver {
159
229
  */
160
230
  #subjectUser(subject, partitionKey) {
161
231
  if (isRelUserset(subject)) {
232
+ // alpha.3 · F-05 también en el USERSET del sujeto (la misma función que
233
+ // el manager): `role_binding:<key>|<R>#role` como `user` de un `Read`/
234
+ // `Check`/`Write` no se compone nunca.
235
+ assertRelationDeclared(this.#config, subject.object, subject.relation);
162
236
  const object = this.#objectId(subject.object.type, partitionKey, subject.object.id);
163
237
  return `${object}#${subject.relation}`;
164
238
  }
@@ -213,17 +287,72 @@ export class OpenFgaRelationsDriver {
213
287
  return { type: morph, uuid };
214
288
  }
215
289
  /* ── Escrituras ─────────────────────────────────────────────────────────── */
216
- async relate(subject, relation, object, partition, _options) {
290
+ /**
291
+ * `relate` con los tres estados de `expiresAt` (R-15, invariante 10). Se LEE
292
+ * primero la tupla exacta (un `Read` por clave, como `grant` de roles):
293
+ * - ausente ⇒ un `Write` (con la condición `not_expired` si caduca);
294
+ * - presente con la caducidad que toca ⇒ no-op (idempotente, invariante 6);
295
+ * - presente con OTRA ⇒ delete + write en DOS llamadas (FGA no admite
296
+ * delete+write de la misma clave en un `Write`, ni reescribir su
297
+ * condición): entre ambas hay un instante en el que `check` responde
298
+ * `false` —fail-closed, la misma ventana que el `grant` de roles—.
299
+ */
300
+ /**
301
+ * **`{ transaction }` se rechaza también AQUÍ** (L-5, defensa en
302
+ * profundidad como F-05 en L-0): la puerta 1 vive en el `RelationsManager`,
303
+ * pero `manager.driver()` y `reconcileRelations` entran por el driver; sin
304
+ * esta guarda un `{ transaction }` por ahí escribiría la tupla en el store
305
+ * IGNORANDO la transacción — una escritura que finge ir en tu transacción y
306
+ * que tu rollback no deshace, que es exactamente el fail-open que
307
+ * `transactionalWrites: false` declara no poder evitar. Primera línea de
308
+ * las cuatro escrituras, antes de F-05, del `Read` y del `Write`: CERO
309
+ * llamadas al cliente.
310
+ */
311
+ #rejectTransaction(operation, options) {
312
+ if (options?.transaction === undefined || options.transaction === null)
313
+ return;
314
+ throw UnsupportedOperationError.transactionalDriver(`relations.${operation}`, 'openfga', 'relations');
315
+ }
316
+ async relate(subject, relation, object, partition, options) {
317
+ this.#rejectTransaction('relate', options);
318
+ // L-0 · F-05 en el DRIVER (defensa en profundidad, la MISMA función que el
319
+ // manager): `manager.driver()` y `reconcileRelations` entran por aquí, y en
320
+ // el store COMPARTIDO un tipo no declarado (`role_binding`) compondría el
321
+ // id exacto de un binding de roles. Corta ANTES del `Read` y del `Write`.
322
+ assertRelationDeclared(this.#config, object, relation);
217
323
  assertScope(partition);
324
+ assertExpiresAt(options?.expiresAt);
218
325
  const partitionKey = scopeKey(partition);
219
326
  const objectId = this.#objectId(object.type, partitionKey, object.id);
220
327
  const user = this.#subjectUser(subject, partitionKey);
221
- await this.#guard('relate', () =>
222
- // Idempotente (invariante 6): un `Write` de una tupla que ya está es un
223
- // duplicado idéntico (sin condición), así que se ignora.
224
- this.client.write({ writes: [{ user, relation, object: objectId }] }, IGNORE_DUPLICATE_WRITES));
328
+ const key = { user, relation, object: objectId };
329
+ const now = this.#now();
330
+ const current = await this.#readTuple('relate', key);
331
+ const previous = current ? current.validUntil : null;
332
+ const expiresAt = resolveGrantExpiry(previous, options?.expiresAt, now);
333
+ if (current && sameInstant(previous, expiresAt))
334
+ return;
335
+ const tuple = expiresAt
336
+ ? { ...key, condition: { name: FACTS_EXPIRY_CONDITION, context: { valid_until: expiresAt.toISOString() } } }
337
+ : key;
338
+ if (current) {
339
+ await this.#guard('relate', () => this.client.write({ deletes: [key] }, IGNORE_MISSING_DELETES));
340
+ }
341
+ await this.#guard('relate', () => this.client.write({ writes: [tuple] }, IGNORE_DUPLICATE_WRITES));
342
+ }
343
+ /** La tupla EXACTA de una clave (un `Read` por clave completa), con su caducidad si la lleva. */
344
+ async #readTuple(operation, key) {
345
+ const response = await this.#guard(operation, () => this.client.read(key, { consistency: this.#consistency }));
346
+ const found = (response.tuples ?? []).map((t) => t.key).find((k) => k?.user === key.user && k?.relation === key.relation && k?.object === key.object);
347
+ if (!found)
348
+ return null;
349
+ return { ...key, validUntil: toExpiryDate(found.condition?.context?.valid_until) };
225
350
  }
226
- async unrelate(subject, relation, object, partition, _options) {
351
+ async unrelate(subject, relation, object, partition, options) {
352
+ this.#rejectTransaction('unrelate', options);
353
+ // L-0 · F-05 también al RETIRAR: un `unrelate(alice, assignee, role_binding)`
354
+ // sería un revoke de roles por la puerta de relaciones.
355
+ assertRelationDeclared(this.#config, object, relation);
227
356
  assertScope(partition);
228
357
  const partitionKey = scopeKey(partition);
229
358
  const objectId = this.#objectId(object.type, partitionKey, object.id);
@@ -233,13 +362,28 @@ export class OpenFgaRelationsDriver {
233
362
  this.client.write({ deletes: [{ user, relation, object: objectId }] }, IGNORE_MISSING_DELETES));
234
363
  }
235
364
  /* ── Lecturas ───────────────────────────────────────────────────────────── */
365
+ /**
366
+ * **F-05 en las LECTURAS y las PURGAS del driver** (2.4.0-alpha.3, cierre
367
+ * del 🔴 1 / 🟠 2 del auditor; la MISMA función y la misma posición que
368
+ * L-0 en `relate`/`unrelate` y que L-5 con `{ transaction }`): PRIMERA
369
+ * línea (tras `#rejectTransaction` en las purgas), CERO llamadas al
370
+ * cliente. Reproducido contra el `:8101` en el store compartido:
371
+ * `purgeObject({ type: 'role_binding', id: R }, S)` componía
372
+ * `role_binding:<scopeKey>|<R>` —byte a byte el binding real— y
373
+ * `#purgeByFilter` lo borraba con demostración de cero (`authorize` de
374
+ * `true` a `false`); `listSubjects('assignee', role_binding)` enumeraba sus
375
+ * asignados. `check`/`listSubjects` validan el par; `listObjects`/
376
+ * `purgeObject` el tipo; `purgeSubject` el userset.
377
+ */
236
378
  /** `check` = UN solo `Check` (el modelo resuelve includes + usersets). */
237
379
  async check(subject, relation, object, partition) {
380
+ assertRelationDeclared(this.#config, object, relation);
238
381
  assertScope(partition);
239
382
  const partitionKey = scopeKey(partition);
240
383
  const objectId = this.#objectId(object.type, partitionKey, object.id);
241
384
  const user = this.#subjectUser(subject, partitionKey);
242
- const response = await this.#guard('check', () => this.client.check({ user, relation, object: objectId }, { consistency: this.#consistency }));
385
+ const context = this.#checkContext(this.#now());
386
+ const response = await this.#guard('check', () => this.client.check({ user, relation, object: objectId, context }, { consistency: this.#consistency }));
243
387
  return response.allowed === true;
244
388
  }
245
389
  /**
@@ -254,10 +398,12 @@ export class OpenFgaRelationsDriver {
254
398
  * truncado y no callar (documentado en el README).
255
399
  */
256
400
  async listObjects(subject, relation, objectType, partition, _page) {
401
+ assertRelationDeclared(this.#config, { type: objectType }, relation);
257
402
  assertScope(partition);
258
403
  const partitionKey = scopeKey(partition);
259
404
  const user = this.#subjectUser(subject, partitionKey);
260
- const response = await this.#guard('listObjects', () => this.client.listObjects({ user, relation, type: objectType }, { consistency: this.#consistency }));
405
+ const context = this.#checkContext(this.#now());
406
+ const response = await this.#guard('listObjects', () => this.client.listObjects({ user, relation, type: objectType, context }, { consistency: this.#consistency }));
261
407
  const raw = response.objects ?? [];
262
408
  const truncated = raw.length >= this.#listObjectsMax;
263
409
  const objects = [];
@@ -281,12 +427,19 @@ export class OpenFgaRelationsDriver {
281
427
  * (`group#member`) salen junto con los holders.
282
428
  */
283
429
  async listSubjects(relation, object, partition, _page) {
430
+ assertRelationDeclared(this.#config, object, relation);
284
431
  assertScope(partition);
285
432
  const partitionKey = scopeKey(partition);
286
433
  const objectId = this.#objectId(object.type, partitionKey, object.id);
434
+ // `Read` devuelve tuplas ESCRITAS, no evaluadas: la caducidad se filtra en
435
+ // cliente con el MISMO reloj del driver (R-15, estricta: la que vence en
436
+ // `now` ya no cuenta), como las enumeraciones del driver de roles.
437
+ const now = this.#now();
287
438
  const tuples = await this.#readAll('listSubjects', { object: objectId, relation });
288
439
  const subjects = [];
289
440
  for (const t of tuples) {
441
+ if (t.validUntil && t.validUntil.getTime() <= now.getTime())
442
+ continue;
290
443
  const subject = this.#userToSubject(t.user);
291
444
  if (subject)
292
445
  subjects.push(subject);
@@ -320,13 +473,66 @@ export class OpenFgaRelationsDriver {
320
473
  * `truncated`/paginación: `enumerateRelations` agota el `Read` (exhaustivo,
321
474
  * como `listSubjects`/`purge*`), así que devuelve TODO en una página sin
322
475
  * cursor —el reconcile itera hasta que no hay cursor—. Es el ORIGEN de una
323
- * migración: una tupla que no llegara aquí desaparecería sin rastro.
476
+ * migración: una tupla que no llegara aquí desaparecería sin rastro — por eso
477
+ * la CADUCADA también llega, con su `expiresAt` (R-15), para que el destino
478
+ * la cuente en `skipped`.
479
+ *
480
+ * **Coste: O(tuplas del store) por PASADA** (2.4.0-alpha.6): es un barrido
481
+ * entero por llamada, sea cual sea el tamaño de la partición (medido: 5 000
482
+ * tuplas ⇒ 50 páginas ≈ 170 ms; 15 000 ⇒ 151 páginas ≈ 0,5 s). Para K
483
+ * particiones usa `enumerateRelationsMany`: UN barrido en vez de K.
324
484
  */
325
485
  async enumerateRelations(partition, _page) {
326
486
  assertScope(partition);
327
- const partitionKey = scopeKey(partition);
487
+ return this.#sweep([partition], 'enumerateRelations');
488
+ }
489
+ /**
490
+ * **`enumerateRelationsMany` — K particiones en UN barrido** (2.4.0-alpha.6;
491
+ * panel relay, analista §3: con 3 particiones 1,4 s → 0,46 s). MISMA
492
+ * semántica que `enumerateRelations` por cada partición pedida —exhaustiva,
493
+ * sin filtrar la caducada, todo en una página sin cursor— y cada tupla
494
+ * viene con SU `partition` (la referencia que pasó el llamante, casada por
495
+ * `scopeKey` ENTERA), de modo que el llamante reparte por `partition`.
496
+ * Reparte un solo `Read({})` paginado del store entero.
497
+ *
498
+ * **Lo que este método NO hace, a propósito: un `Read` por PREFIJO de id.**
499
+ * OpenFGA no tiene prefix-match: `Read({ object: 'document:unit|<uuid>|' })`
500
+ * responde **200 con cero tuplas** (medido por el panel, auditor 🔴 3) — en
501
+ * el ORIGEN de una migración eso es «esta partición está vacía» en silencio,
502
+ * y en una purga, «demostrado cero» sin haber borrado nada. El único filtro
503
+ * legal es `{}`; la partición se decide comparando la CLAVE entera del id
504
+ * parseado desde la derecha (`#parseObjectId`), así que `app` no arrastra a
505
+ * `appliance|…`, `org|U` no arrastra a `organization|U` y cada ortografía del
506
+ * uuid es su propia partición. La suite espía el FILTRO de cada `read`.
507
+ *
508
+ * **Exhaustivo o ruidoso**: una página con cero tuplas y token de
509
+ * continuación NO es el fin; un token que se repite, más de
510
+ * `MAX_READ_PAGES` páginas o una respuesta sin `tuples` son 503
511
+ * `E_AUTHZ_BACKEND_UNAVAILABLE` (`#readAll`); una tupla que no se entiende
512
+ * se cuenta en `diagnostics.unparseableTuples` y se avisa. Sin particiones
513
+ * es 500 `E_AUTHZ_CONFIG` con cero lecturas: no hay «éxito vacío».
514
+ */
515
+ async enumerateRelationsMany(partitions, _page) {
516
+ if (!Array.isArray(partitions) || partitions.length === 0) {
517
+ throw new AuthorizationConfigError('enumerateRelationsMany: sin particiones no hay nada que enumerar (y un barrido del store para nadie no es un éxito vacío). ' +
518
+ 'Pasa al menos una partición.');
519
+ }
520
+ for (const partition of partitions)
521
+ assertScope(partition);
522
+ return this.#sweep(partitions, 'enumerateRelationsMany');
523
+ }
524
+ /** El barrido: UN `Read({})` paginado del store entero, repartido por la clave ENTERA de partición. */
525
+ async #sweep(partitions, operation) {
526
+ // La primera referencia de cada clave es la que viaja en `tuple.partition`
527
+ // (dos ortografías del mismo uuid son dos claves, como en `enumerateRelations`).
528
+ const wanted = new Map();
529
+ for (const partition of partitions) {
530
+ const key = scopeKey(partition);
531
+ if (!wanted.has(key))
532
+ wanted.set(key, partition);
533
+ }
328
534
  const relationTypes = new Set([FACTS_GROUP_TYPE, ...this.#config.objectTypes.map((t) => t.type)]);
329
- const all = await this.#readAll('enumerateRelations', {});
535
+ const all = await this.#readAll(operation, {});
330
536
  const tuples = [];
331
537
  for (const key of all) {
332
538
  const parsed = this.#parseObjectId(key.object);
@@ -334,11 +540,12 @@ export class OpenFgaRelationsDriver {
334
540
  // no declarado): no la migra este puerto.
335
541
  if (!parsed || !relationTypes.has(parsed.type))
336
542
  continue;
337
- if (parsed.partitionKey !== partitionKey)
338
- continue; // otra partición: no cruza
543
+ const partition = wanted.get(parsed.partitionKey);
544
+ if (partition === undefined)
545
+ continue; // otra partición: no cruza (clave ENTERA, nunca prefijo)
339
546
  const subject = this.#userToSubject(key.user);
340
547
  if (!subject) {
341
- this.#warnUnparseable('enumerateRelations', key.user);
548
+ this.#warnUnparseable(operation, key.user);
342
549
  continue;
343
550
  }
344
551
  tuples.push({
@@ -346,6 +553,7 @@ export class OpenFgaRelationsDriver {
346
553
  relation: key.relation,
347
554
  object: { type: parsed.type, id: parsed.objectUuid },
348
555
  partition,
556
+ expiresAt: key.validUntil,
349
557
  });
350
558
  }
351
559
  return { tuples };
@@ -358,11 +566,21 @@ export class OpenFgaRelationsDriver {
358
566
  * alias concediendo tras una purga «exitosa». Si tras borrar quedan tuplas
359
567
  * ⇒ 500 `E_AUTHZ_PURGE_INCOMPLETE`.
360
568
  */
361
- async purgeObject(object, partition) {
569
+ async purgeObject(object, partition, options) {
570
+ this.#rejectTransaction('purgeObject', options);
571
+ // alpha.3 · F-05 (solo el TIPO: una purga no nombra relación), antes de componer el id.
572
+ // Cierre-2: la función de TIPO, no la estricta con relación opcional.
573
+ assertObjectTypeDeclared(this.#config, object);
362
574
  assertScope(partition);
363
575
  const objectIds = this.#partitionSpellings(partition).map((key) => this.#objectId(object.type, key, object.id));
364
- for (const objectId of objectIds) {
365
- await this.#purgeByFilter('purgeObject', { object: objectId }, `objeto ${objectId}`);
576
+ const progress = { deleted: 0 };
577
+ try {
578
+ for (const objectId of objectIds) {
579
+ await this.#purgeByFilter('purgeObject', { object: objectId }, `objeto ${objectId}`, progress);
580
+ }
581
+ }
582
+ catch (error) {
583
+ throw this.#partialIfDeleted(error, progress);
366
584
  }
367
585
  }
368
586
  /**
@@ -372,24 +590,55 @@ export class OpenFgaRelationsDriver {
372
590
  * que se recorre cada tipo declarado (`group` + los del consumidor) con
373
591
  * `Read({ user, object: '<type>:' })`.
374
592
  */
375
- async purgeSubject(subject, partition) {
593
+ async purgeSubject(subject, partition, options) {
594
+ this.#rejectTransaction('purgeSubject', options);
595
+ // alpha.3 · F-05 del USERSET (una purga por sujeto no nombra objeto), antes de nada.
596
+ if (isRelUserset(subject))
597
+ assertRelationDeclared(this.#config, subject.object, subject.relation);
376
598
  assertScope(partition);
377
599
  if (!isRelUserset(subject))
378
600
  assertSubject(subject);
379
601
  const partitionKeys = this.#partitionSpellings(partition);
380
602
  const types = [FACTS_GROUP_TYPE, ...this.#config.objectTypes.map((t) => t.type)];
381
- for (const partitionKey of partitionKeys) {
382
- const user = this.#subjectUser(subject, partitionKey);
383
- for (const type of types) {
384
- await this.#purgeByFilter('purgeSubject', { user, object: `${type}:` }, `sujeto ${user} en '${type}'`);
603
+ const progress = { deleted: 0 };
604
+ try {
605
+ for (const partitionKey of partitionKeys) {
606
+ const user = this.#subjectUser(subject, partitionKey);
607
+ for (const type of types) {
608
+ await this.#purgeByFilter('purgeSubject', { user, object: `${type}:` }, `sujeto ${user} en '${type}'`, progress);
609
+ }
385
610
  }
386
611
  }
612
+ catch (error) {
613
+ throw this.#partialIfDeleted(error, progress);
614
+ }
387
615
  }
388
- /** Lee por filtro, borra en lotes, y RE-LEE para demostrar cero (o lanza). */
389
- async #purgeByFilter(operation, filter, what) {
616
+ /**
617
+ * **Una purga que muere a MEDIAS es indeterminada** (invariante 13,
618
+ * 2.4.0-alpha.3, cierre del 🟡 6 del auditor). La purga NO es un `Write`:
619
+ * son N `Read`+`deleteTuples` (ortografías × tipos, y lotes de
620
+ * `WRITE_BATCH_SIZE`), y un 503 que no es timeout —o el 500
621
+ * `E_AUTHZ_PURGE_INCOMPLETE` de la demostración de cero— puede llegar
622
+ * después de haber borrado parte. Si YA se borró al menos una tupla, el
623
+ * error se marca (`markPartialWrite`, `src/errors.ts`: una propiedad, la
624
+ * clase y el `code` no cambian) y el `RelationsManager` notifica
625
+ * `onRelationWrite` con `indeterminate: true` ANTES de propagarlo — «puede
626
+ * haber ocurrido», como con el deadline. Si no se borró nada, el error va
627
+ * tal cual: «esa escritura no ocurrió» sigue siendo verdad. En `database`
628
+ * la purga es UN `DELETE` y no necesita la marca.
629
+ */
630
+ #partialIfDeleted(error, progress) {
631
+ if (progress.deleted > 0 && error !== null && typeof error === 'object')
632
+ return markPartialWrite(error);
633
+ return error;
634
+ }
635
+ /** Lee por filtro, borra en lotes, y RE-LEE para demostrar cero (o lanza). `progress.deleted` cuenta lo que YA se borró (un lote que falla no borró nada: el `Write` de FGA es transaccional). */
636
+ async #purgeByFilter(operation, filter, what, progress) {
390
637
  const keys = await this.#readAll(operation, filter);
391
638
  for (let i = 0; i < keys.length; i += WRITE_BATCH_SIZE) {
392
- await this.#guard(operation, () => this.client.deleteTuples(keys.slice(i, i + WRITE_BATCH_SIZE).map((k) => ({ user: k.user, relation: k.relation, object: k.object })), IGNORE_MISSING_DELETES));
639
+ const batch = keys.slice(i, i + WRITE_BATCH_SIZE);
640
+ await this.#guard(operation, () => this.client.deleteTuples(batch.map((k) => ({ user: k.user, relation: k.relation, object: k.object })), IGNORE_MISSING_DELETES));
641
+ progress.deleted += batch.length;
393
642
  }
394
643
  if (keys.length === 0)
395
644
  return;
@@ -424,13 +673,26 @@ export class OpenFgaRelationsDriver {
424
673
  consistency: this.#consistency,
425
674
  }));
426
675
  pages += 1;
427
- for (const tuple of response.tuples ?? []) {
676
+ // «Exhaustivo o ruidoso» (alpha.6): una respuesta que no trae `tuples`
677
+ // no se entiende — no es una página vacía. Un 200 sin forma en el ORIGEN
678
+ // de una migración sería «no hay nada» en silencio.
679
+ if (!Array.isArray(response?.tuples)) {
680
+ throw new AuthorizationBackendError('openfga-relations', operation, new Error(`la respuesta del Read (página ${pages}) no trae 'tuples'; no se toma por vacía`));
681
+ }
682
+ for (const tuple of response.tuples) {
428
683
  const key = tuple?.key;
429
684
  if (!key?.user || !key?.relation || !key?.object) {
430
685
  this.#warnUnparseable(operation, JSON.stringify(key ?? null));
431
686
  continue;
432
687
  }
433
- keys.push({ user: key.user, relation: key.relation, object: key.object });
688
+ // Con su caducidad (R-15): quien la lee decide si filtra (`listSubjects`),
689
+ // la emite (`enumerateRelations`) o la ignora (`purge*` borra TODO).
690
+ keys.push({
691
+ user: key.user,
692
+ relation: key.relation,
693
+ object: key.object,
694
+ validUntil: toExpiryDate(key.condition?.context?.valid_until),
695
+ });
434
696
  }
435
697
  continuationToken = response.continuation_token || undefined;
436
698
  if (continuationToken) {
@@ -451,16 +713,12 @@ export class OpenFgaRelationsDriver {
451
713
  `se ignora en la enumeración (total: ${this.diagnostics.unparseableTuples})`);
452
714
  }
453
715
  }
454
- /** ¿El error huele a timeout de red/axios? (mismo criterio que el driver de roles). */
455
- function isTimeoutLike(error) {
456
- let current = error;
457
- for (let depth = 0; current && depth < 6; depth++) {
458
- const code = String(current.code ?? '');
459
- if (code === 'ECONNABORTED' || code === 'ETIMEDOUT' || /timeout/i.test(String(current.message ?? ''))) {
460
- return true;
461
- }
462
- current = current.cause;
463
- }
464
- return false;
465
- }
716
+ // Cierre-2 de alpha.3 (⚪ 5 del re-ataque): la clasificación de timeout es la
717
+ // de `src/shared/backend_guard.ts` —`isTimeoutLike`: `KnexTimeoutError`,
718
+ // `.timeout` numérico, `ECONNABORTED`/`ETIMEDOUT`, por la cadena de `cause`—,
719
+ // la MISMA que importa el driver de roles. Hasta el cierre-2 este fichero
720
+ // duplicaba la función con una rama por SUBSTRING del mensaje (`/timeout/i`),
721
+ // de modo que un 400 de validación de FGA o el cuerpo de un 502 que mencionara
722
+ // la palabra salía como 503 `E_AUTHZ_BACKEND_TIMEOUT` con `indeterminate: true`
723
+ // sin haber borrado nada (medido por el auditor: `alpha3-cierre-parcial.ts` B).
466
724
  //# sourceMappingURL=openfga_relations_driver.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"openfga_relations_driver.js","sourceRoot":"","sources":["../../../src/drivers/openfga_relations_driver.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"openfga_relations_driver.js","sourceRoot":"","sources":["../../../src/drivers/openfga_relations_driver.ts"],"names":[],"mappings":"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"}