@jantstack/adonis-authz 2.5.0-alpha.2 → 2.5.0-alpha.3

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 (80) hide show
  1. package/README.md +343 -7
  2. package/build/commands/authz_relations_reconcile.d.ts +6 -0
  3. package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
  4. package/build/commands/authz_relations_reconcile.js +113 -3
  5. package/build/commands/authz_relations_reconcile.js.map +1 -1
  6. package/build/commands/openfga_provision.d.ts +62 -0
  7. package/build/commands/openfga_provision.d.ts.map +1 -1
  8. package/build/commands/openfga_provision.js +193 -1
  9. package/build/commands/openfga_provision.js.map +1 -1
  10. package/build/index.d.ts +6 -6
  11. package/build/index.d.ts.map +1 -1
  12. package/build/index.js +3 -3
  13. package/build/index.js.map +1 -1
  14. package/build/src/drivers/database_relations_driver.d.ts +36 -1
  15. package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
  16. package/build/src/drivers/database_relations_driver.js +211 -45
  17. package/build/src/drivers/database_relations_driver.js.map +1 -1
  18. package/build/src/drivers/openfga_driver.d.ts.map +1 -1
  19. package/build/src/drivers/openfga_driver.js +102 -36
  20. package/build/src/drivers/openfga_driver.js.map +1 -1
  21. package/build/src/drivers/openfga_facts.d.ts +21 -0
  22. package/build/src/drivers/openfga_facts.d.ts.map +1 -1
  23. package/build/src/drivers/openfga_facts.js +74 -8
  24. package/build/src/drivers/openfga_facts.js.map +1 -1
  25. package/build/src/drivers/openfga_relations_driver.d.ts +74 -1
  26. package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
  27. package/build/src/drivers/openfga_relations_driver.js +599 -29
  28. package/build/src/drivers/openfga_relations_driver.js.map +1 -1
  29. package/build/src/errors.d.ts +112 -0
  30. package/build/src/errors.d.ts.map +1 -1
  31. package/build/src/errors.js +130 -0
  32. package/build/src/errors.js.map +1 -1
  33. package/build/src/manager.d.ts.map +1 -1
  34. package/build/src/manager.js +9 -4
  35. package/build/src/manager.js.map +1 -1
  36. package/build/src/openfga.d.ts +1 -1
  37. package/build/src/openfga.d.ts.map +1 -1
  38. package/build/src/openfga.js +1 -1
  39. package/build/src/openfga.js.map +1 -1
  40. package/build/src/relations/check_many.d.ts +1 -1
  41. package/build/src/relations/check_many.d.ts.map +1 -1
  42. package/build/src/relations/check_many.js +6 -4
  43. package/build/src/relations/check_many.js.map +1 -1
  44. package/build/src/relations/define_relations_config.d.ts +115 -2
  45. package/build/src/relations/define_relations_config.d.ts.map +1 -1
  46. package/build/src/relations/define_relations_config.js +197 -3
  47. package/build/src/relations/define_relations_config.js.map +1 -1
  48. package/build/src/relations/manager.d.ts +33 -2
  49. package/build/src/relations/manager.d.ts.map +1 -1
  50. package/build/src/relations/manager.js +120 -3
  51. package/build/src/relations/manager.js.map +1 -1
  52. package/build/src/relations/reconcile.d.ts +219 -1
  53. package/build/src/relations/reconcile.d.ts.map +1 -1
  54. package/build/src/relations/reconcile.js +745 -155
  55. package/build/src/relations/reconcile.js.map +1 -1
  56. package/build/src/relations/tuple_order.d.ts +126 -0
  57. package/build/src/relations/tuple_order.d.ts.map +1 -0
  58. package/build/src/relations/tuple_order.js +598 -0
  59. package/build/src/relations/tuple_order.js.map +1 -0
  60. package/build/src/shared/backend_guard.d.ts +8 -0
  61. package/build/src/shared/backend_guard.d.ts.map +1 -1
  62. package/build/src/shared/backend_guard.js +15 -0
  63. package/build/src/shared/backend_guard.js.map +1 -1
  64. package/build/src/testing/main.d.ts +1 -1
  65. package/build/src/testing/main.d.ts.map +1 -1
  66. package/build/src/testing/main.js +1 -1
  67. package/build/src/testing/main.js.map +1 -1
  68. package/build/src/testing/relations_contract.d.ts +18 -0
  69. package/build/src/testing/relations_contract.d.ts.map +1 -1
  70. package/build/src/testing/relations_contract.js +824 -44
  71. package/build/src/testing/relations_contract.js.map +1 -1
  72. package/build/src/testing/relations_reconcile_contract.d.ts +9 -0
  73. package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
  74. package/build/src/testing/relations_reconcile_contract.js +207 -0
  75. package/build/src/testing/relations_reconcile_contract.js.map +1 -1
  76. package/build/src/types.d.ts +83 -3
  77. package/build/src/types.d.ts.map +1 -1
  78. package/build/src/types.js +2 -0
  79. package/build/src/types.js.map +1 -1
  80. package/package.json +1 -1
@@ -0,0 +1,598 @@
1
+ /**
2
+ * **El ORDEN de las escrituras y de los borrados de relaciones — punto de paso ÚNICO** (plan 2.5 · lote D; linaje L10
3
+ * «el estado intermedio de una operación multi-request concede», PROMOVIDO: 3b-2f R3, 3b-6 P1, D1 🟠 1 —la purga de
4
+ * `openfga`—, D2 🟠 1 —el reconcile— y, en el cierre 2 de D2, 🟡 N3 —escrituras y poda COMPUESTAS—). Lo usan los DOS
5
+ * caminos que escriben o borran relaciones en varias requests: `applyPartition` del reconcile
6
+ * (`src/relations/reconcile.ts`) y `purgeWrites` de las purgas de `openfga` (`src/drivers/openfga_relations_driver.ts`).
7
+ *
8
+ * **Cierre 2 de D2 · 🟡 N3 (estructural).** Hasta aquí había DOS órdenes (uno de escritura y otro de borrado) y el reconcile
9
+ * los encadenaba: TODAS las escrituras y luego TODA la poda. Un ex-miembro componía con un allow nuevo (U ∈ g sobra,
10
+ * `g#member viewer X` es nuevo: cortada tras la 1.ª escritura, U concedía sobre X y ni el inicial ni el final lo hacían).
11
+ * Ahora hay UNA función, `relationTransitionOrder`, que ordena la TRANSICIÓN entera (escrituras, borrados y renovaciones)
12
+ * y una propiedad que se DEMUESTRA por fuerza bruta (`tests/helpers/order_bruteforce.ts`, propiedad
13
+ * `relations.order.exhaustive` de la guardia y `tests/relations_order_exhaustive.spec.ts`).
14
+ *
15
+ * **Cinco fases** (las cuatro de los extremos solo restringen o solo amplían; lo difícil es la de en medio):
16
+ *
17
+ * 1. escribir los DENIES nuevos (y rehacer los que cambian) — solo restringe;
18
+ * 2. borrar los ALLOWS sobrantes sobre objetos que no son `group` — solo restringe;
19
+ * 3. las MEMBRESÍAS `group:*#member` que entran y que salen, en el orden de un GRAFO DE PRECEDENCIAS (abajo); con los
20
+ * allows reducidos a los que están en los dos estados y TODOS los denies de los dos estados presentes, que es el
21
+ * contexto más restrictivo posible para el paso difícil;
22
+ * 4. escribir los ALLOWS nuevos (y las renovaciones que no son denies) — con las membresías y los denies finales
23
+ * presentes, solo puede conceder lo que concede el final;
24
+ * 5. borrar los DENIES sobrantes, los ÚLTIMOS — idem.
25
+ *
26
+ * **El grafo de la fase 3.** Para cada membresía que cambia (arista `sujeto → grupo`) se calcula, en el grafo UNIÓN de
27
+ * los dos estados, qué objetos DENIEGA lo que alcanza su grupo (`D`) y qué objetos le CONCEDE de forma efectiva (`A`: los
28
+ * allows que están en los dos estados, menos los que cortan los denies que su grupo alcanza por aristas que no cambian —
29
+ * el «auto-corte», que solo se aplica con el predicado `cuts` de la config: sin él, ningún allow se da por cortado, lo
30
+ * conservador). Las precedencias, entre aristas que comparten algún sujeto:
31
+ *
32
+ * - **C1** (dos que entran): la que trae un deny sobre X antes que la que trae un allow sobre X;
33
+ * - **C2** (dos que salen): la que lleva un allow sobre X antes que la que lleva un deny sobre X (salvo que el sujeto
34
+ * solo alcance la primera a través de la segunda);
35
+ * - **C3** (una que sale y otra que entra en el MISMO camino anidado, `U ∈ h` sobra y `h ⊂ g` es nueva): la que sale
36
+ * antes, si el camino compuesto llevaría un allow efectivo — es el 🟡 N3 con anidamiento;
37
+ * - **C4** (una que entra y otra que sale y las dos traen un deny sobre X que protege un allow del sujeto): la que entra
38
+ * antes — el sujeto cambia de grupo denegado sin un instante sin deny.
39
+ *
40
+ * Se ordena por componentes fuertemente conexas (Tarjan) en orden topológico; entre las disponibles, escrituras antes que
41
+ * borrados, las escrituras de más lejos del sujeto primero y los borrados de más cerca primero, y (objeto, sujeto): el
42
+ * reparto NO depende del orden de enumeración del origen ni del `Read`.
43
+ *
44
+ * **Lo que garantiza, exactamente** (demostrado por fuerza bruta; README «Denies migrate as denies»): **si el grafo de
45
+ * precedencias no tiene un CICLO, ningún estado intermedio concede algo que no concedían el estado inicial o el final, y
46
+ * ningún sujeto denegado en los dos concede en ninguno.** El RESIDUO es exactamente el ciclo (`residue`): dos membresías
47
+ * que cambian en la misma pasada cuyas exigencias se contradicen —la forma típica: el mismo sujeto entra (o sale) a la
48
+ * vez en dos grupos y cada uno trae un deny que corta un allow que trae el otro—. Ahí NO existe en general ningún orden
49
+ * seguro (la fuerza bruta lo mide: de los casos del ciclo que conceden, una parte no admite NINGUNA permutación del diff
50
+ * segura), así que el orden aplica las aristas del ciclo en el orden de prioridad y lo DEVUELVE para que la pasada lo diga.
51
+ *
52
+ * Pura (regla 2 de pureza): no importa nada del paquete. Coste: lineal en las tuplas más los pares de membresías que
53
+ * cambian de un MISMO sujeto, y los de cada arista anidada (`group:x#member`) con las de los sujetos que tiene debajo.
54
+ */
55
+ /** El tipo built-in que transporta usersets (`group:g#member`). */
56
+ const GROUP_PREFIX = 'group:';
57
+ const MEMBER_SUFFIX = '#member';
58
+ export function relationOrderClass(view) {
59
+ if (view.deny)
60
+ return 'deny';
61
+ return view.object.startsWith(GROUP_PREFIX) ? 'membership' : 'allow';
62
+ }
63
+ /** `group:<id>#member` ⇒ `group:<id>`; cualquier otro sujeto ⇒ `null`. */
64
+ function usersetGroup(user) {
65
+ return user.startsWith(GROUP_PREFIX) && user.endsWith(MEMBER_SUFFIX) ? user.slice(0, -MEMBER_SUFFIX.length) : null;
66
+ }
67
+ function viewKey(v) {
68
+ return `${v.deny ? 'd' : 'a'}\u0000${v.object}\u0000${v.user}\u0000${v.relation ?? ''}`;
69
+ }
70
+ function objectTypeOf(object) {
71
+ const colon = object.indexOf(':');
72
+ return colon < 0 ? object : object.slice(0, colon);
73
+ }
74
+ /**
75
+ * Los grupos PORTADORES de deny: el `#member` de cada uno es sujeto de algún deny de `views`, más el cierre por la
76
+ * anidación (`group:G#member@group:H#member` con G portador ⇒ H portador). Devuelve los OBJETOS (`group:<id>`). Lo usa
77
+ * el reconcile para clasificar la renovación de una membresía PORTADORA (cierre 2 de D2 · 🟠 N1, `renewal-unsafe`).
78
+ */
79
+ export function denyCarrierGroups(views) {
80
+ const all = [...views];
81
+ const carriers = new Set();
82
+ for (const v of all) {
83
+ const group = v.deny ? usersetGroup(v.user) : null;
84
+ if (group !== null)
85
+ carriers.add(group);
86
+ }
87
+ const nested = all.filter((v) => relationOrderClass(v) === 'membership' && usersetGroup(v.user) !== null);
88
+ for (let grew = true; grew;) {
89
+ grew = false;
90
+ for (const v of nested) {
91
+ const inner = usersetGroup(v.user);
92
+ if (carriers.has(v.object) && !carriers.has(inner)) {
93
+ carriers.add(inner);
94
+ grew = true;
95
+ }
96
+ }
97
+ }
98
+ return carriers;
99
+ }
100
+ /**
101
+ * **Los denies que TRANSPORTA un grupo** (cierre 6 de D2 · ⚪ D5-3, para la letra): los `deny` cuyo sujeto es el `#member`
102
+ * del grupo o de un grupo que lo contiene, transitivamente (`group:G#member@group:H#member`: los miembros de H heredan los
103
+ * denies de G). Devuelve las VISTAS de esos denies, en el orden de entrada. Misma regla que `denyCarrierGroups`, al revés.
104
+ */
105
+ export function carriedDenies(views, group) {
106
+ const all = [...views];
107
+ const reach = new Set([group]);
108
+ const nested = all.filter((v) => relationOrderClass(v) === 'membership' && usersetGroup(v.user) !== null);
109
+ for (let grew = true; grew;) {
110
+ grew = false;
111
+ for (const v of nested) {
112
+ if (reach.has(usersetGroup(v.user)) && !reach.has(v.object)) {
113
+ reach.add(v.object);
114
+ grew = true;
115
+ }
116
+ }
117
+ }
118
+ return all.filter((v) => v.deny && reach.has(usersetGroup(v.user) ?? ''));
119
+ }
120
+ /** Un grafo de membresías (aristas `sujeto → grupo`): hacia arriba (`up`), hacia abajo (`below`) y altura. */
121
+ class MembershipGraph {
122
+ #parents = new Map();
123
+ #into = new Map();
124
+ #childGroups = new Map();
125
+ #up = new Map();
126
+ #below = new Map();
127
+ #height = new Map();
128
+ constructor(edges) {
129
+ for (const e of edges) {
130
+ let list = this.#into.get(e.object);
131
+ if (!list)
132
+ this.#into.set(e.object, (list = []));
133
+ list.push(e);
134
+ const child = usersetGroup(e.user);
135
+ if (child === null)
136
+ continue;
137
+ let parents = this.#parents.get(child);
138
+ if (!parents)
139
+ this.#parents.set(child, (parents = new Set()));
140
+ parents.add(e.object);
141
+ let children = this.#childGroups.get(e.object);
142
+ if (!children)
143
+ this.#childGroups.set(e.object, (children = new Set()));
144
+ children.add(child);
145
+ }
146
+ }
147
+ /** Los grupos que alcanza `group` (él incluido). */
148
+ up(group) {
149
+ let seen = this.#up.get(group);
150
+ if (seen)
151
+ return seen;
152
+ seen = new Set([group]);
153
+ const stack = [group];
154
+ while (stack.length > 0) {
155
+ for (const parent of this.#parents.get(stack.pop()) ?? []) {
156
+ if (!seen.has(parent)) {
157
+ seen.add(parent);
158
+ stack.push(parent);
159
+ }
160
+ }
161
+ }
162
+ this.#up.set(group, seen);
163
+ return seen;
164
+ }
165
+ /** Los sujetos (holders y usersets) que alcanzan al sujeto `user` (él incluido), opcionalmente SIN la arista `without`. */
166
+ below(user, without) {
167
+ if (usersetGroup(user) === null)
168
+ return new Set([user]);
169
+ if (without === undefined) {
170
+ const memo = this.#below.get(user);
171
+ if (memo)
172
+ return memo;
173
+ }
174
+ const out = new Set([user]);
175
+ const stack = [user];
176
+ while (stack.length > 0) {
177
+ const group = usersetGroup(stack.pop());
178
+ if (group === null)
179
+ continue;
180
+ for (const e of this.#into.get(group) ?? []) {
181
+ if (without !== undefined && viewKey(e) === without)
182
+ continue;
183
+ if (!out.has(e.user)) {
184
+ out.add(e.user);
185
+ stack.push(e.user);
186
+ }
187
+ }
188
+ }
189
+ if (without === undefined)
190
+ this.#below.set(user, out);
191
+ return out;
192
+ }
193
+ /** Distancia de un sujeto a los holders: 0 un holder; un userset, 1 + la de su grupo hijo más profundo. */
194
+ depth(user) {
195
+ const group = usersetGroup(user);
196
+ return group === null ? 0 : this.#groupHeight(group, new Set());
197
+ }
198
+ #groupHeight(group, path) {
199
+ const memo = this.#height.get(group);
200
+ if (memo !== undefined)
201
+ return memo;
202
+ if (path.has(group))
203
+ return 1;
204
+ path.add(group);
205
+ let height = 1;
206
+ for (const child of this.#childGroups.get(group) ?? [])
207
+ height = Math.max(height, 1 + this.#groupHeight(child, path));
208
+ path.delete(group);
209
+ this.#height.set(group, height);
210
+ return height;
211
+ }
212
+ }
213
+ /** Índice de tuplas (allows o denies) por sujeto: `sujeto → objeto → relaciones`. */
214
+ function bySubject(views) {
215
+ const out = new Map();
216
+ for (const v of views) {
217
+ let objects = out.get(v.user);
218
+ if (!objects)
219
+ out.set(v.user, (objects = new Map()));
220
+ let relations = objects.get(v.object);
221
+ if (!relations)
222
+ objects.set(v.object, (relations = new Set()));
223
+ relations.add(v.relation ?? '');
224
+ }
225
+ return out;
226
+ }
227
+ /** Lo que alcanza un grupo por un grafo: `objeto → relaciones` (los `#member` de los grupos de `up`). */
228
+ function reach(graph, index, group) {
229
+ const out = new Map();
230
+ for (const g of graph.up(group)) {
231
+ for (const [object, relations] of index.get(g + MEMBER_SUFFIX) ?? []) {
232
+ let set = out.get(object);
233
+ if (!set)
234
+ out.set(object, (set = new Set()));
235
+ for (const r of relations)
236
+ set.add(r);
237
+ }
238
+ }
239
+ return out;
240
+ }
241
+ /**
242
+ * **El orden de una TRANSICIÓN** (cierre 2 de D2 · 🟡 N3): ver el docblock del módulo. `residue` = las membresías de los
243
+ * ciclos del grafo de precedencias (sin garantía); vacío ⇒ ningún estado intermedio concede fuera de inicial ∪ final.
244
+ */
245
+ export function relationTransitionOrder(transition, view, options = {}) {
246
+ const writes = (transition.writes ?? []).map((item) => ({ item, view: view(item) }));
247
+ const deletes = (transition.deletes ?? []).map((item) => ({ item, view: view(item) }));
248
+ const renewals = (transition.renewals ?? []).map((item) => ({ item, view: view(item) }));
249
+ const shortening = new Set(transition.shortening ?? []);
250
+ const renewedMemberships = renewals.filter((r) => relationOrderClass(r.view) === 'membership');
251
+ const changing = new Set([...writes, ...deletes, ...renewedMemberships].map((w) => viewKey(w.view)));
252
+ const everything = new Map();
253
+ for (const v of [...(transition.context ?? []), ...writes.map((w) => w.view), ...deletes.map((d) => d.view), ...renewals.map((r) => r.view)]) {
254
+ everything.set(viewKey(v), v);
255
+ }
256
+ const edges = [];
257
+ const keptAllows = [];
258
+ const denies = [];
259
+ for (const [key, v] of everything) {
260
+ const cls = relationOrderClass(v);
261
+ if (cls === 'deny')
262
+ denies.push(v);
263
+ else if (cls === 'membership')
264
+ edges.push(v);
265
+ else if (!changing.has(key))
266
+ keptAllows.push(v);
267
+ }
268
+ const renewedAs = (r) => (shortening.has(r.item) ? 'delete' : 'write');
269
+ const membership = planMemberships([
270
+ ...writes.filter((w) => relationOrderClass(w.view) === 'membership').map((w) => ({ ...w, emit: 'write' })),
271
+ ...renewedMemberships.filter((r) => renewedAs(r) === 'write').map((r) => ({ ...r, emit: 'renew' })),
272
+ ], [
273
+ ...deletes.filter((d) => relationOrderClass(d.view) === 'membership').map((d) => ({ ...d, emit: 'delete' })),
274
+ ...renewedMemberships.filter((r) => renewedAs(r) === 'delete').map((r) => ({ ...r, emit: 'renew' })),
275
+ ], { edges, keptAllows, denies, changing, cuts: options.cuts });
276
+ const steps = [];
277
+ // 1. denies nuevos (y los que se rehacen: un deny no caduca, D3) — solo restringen.
278
+ for (const w of writes)
279
+ if (w.view.deny)
280
+ steps.push({ item: w.item, op: 'write' });
281
+ for (const r of renewals)
282
+ if (r.view.deny)
283
+ steps.push({ item: r.item, op: 'renew' });
284
+ // 2. allows sobrantes sobre objetos que no son `group` — solo restringen; y (cierre 4) las renovaciones de allows que
285
+ // ACORTAN: en su caducidad nueva salen.
286
+ for (const d of deletes)
287
+ if (relationOrderClass(d.view) === 'allow')
288
+ steps.push({ item: d.item, op: 'delete' });
289
+ for (const r of renewals)
290
+ if (relationOrderClass(r.view) === 'allow' && renewedAs(r) === 'delete')
291
+ steps.push({ item: r.item, op: 'renew' });
292
+ // 3. membresías (y, cierre 4, sus renovaciones como la entrada o la salida que son en el horizonte), por el grafo.
293
+ steps.push(...membership.steps);
294
+ // 4. allows nuevos y las renovaciones de allows que ALARGAN (en `now` no cambian lo que se concede).
295
+ for (const w of writes)
296
+ if (relationOrderClass(w.view) === 'allow')
297
+ steps.push({ item: w.item, op: 'write' });
298
+ for (const r of renewals)
299
+ if (relationOrderClass(r.view) === 'allow' && renewedAs(r) === 'write')
300
+ steps.push({ item: r.item, op: 'renew' });
301
+ // 5. denies sobrantes, los ÚLTIMOS.
302
+ for (const d of deletes)
303
+ if (d.view.deny)
304
+ steps.push({ item: d.item, op: 'delete' });
305
+ return { steps, residue: membership.residue };
306
+ }
307
+ function planMemberships(writes, deletes, context) {
308
+ if (writes.length + deletes.length === 0)
309
+ return { steps: [], residue: [] };
310
+ const union = new MembershipGraph(context.edges);
311
+ const kept = new MembershipGraph(context.edges.filter((e) => !context.changing.has(viewKey(e))));
312
+ const allowIndex = bySubject(context.keptAllows);
313
+ const denyIndex = bySubject(context.denies);
314
+ const cuts = context.cuts;
315
+ const deniedBy = new Map();
316
+ /** Objetos denegados por lo que alcanza `group` en el grafo unión. */
317
+ const deniedObjects = (group) => {
318
+ let out = deniedBy.get(group);
319
+ if (!out)
320
+ deniedBy.set(group, (out = new Set(reach(union, denyIndex, group).keys())));
321
+ return out;
322
+ };
323
+ /**
324
+ * Objetos que concede de forma EFECTIVA lo que alcanza `group` (grafo unión, allows de los dos estados), menos los que
325
+ * corta TODO lo que deniegan, por aristas que NO cambian, los grupos `cutters` (el auto-corte). Sin `cuts`, nada se corta.
326
+ */
327
+ const effective = (group, cutters) => {
328
+ const allowed = reach(union, allowIndex, group);
329
+ if (!cuts)
330
+ return new Set(allowed.keys());
331
+ const keptDenies = new Map();
332
+ for (const cutter of cutters) {
333
+ for (const [object, relations] of reach(kept, denyIndex, cutter)) {
334
+ let set = keptDenies.get(object);
335
+ if (!set)
336
+ keptDenies.set(object, (set = new Set()));
337
+ for (const r of relations)
338
+ set.add(r);
339
+ }
340
+ }
341
+ const out = new Set();
342
+ for (const [object, relations] of allowed) {
343
+ const denied = keptDenies.get(object);
344
+ const type = objectTypeOf(object);
345
+ const cut = denied !== undefined && [...relations].every((a) => [...denied].some((d) => cuts(type, d, a)));
346
+ if (!cut)
347
+ out.add(object);
348
+ }
349
+ return out;
350
+ };
351
+ const effectiveMemo = new Map();
352
+ const ops = [];
353
+ for (const [list, op] of [
354
+ [writes, 'write'],
355
+ [deletes, 'delete'],
356
+ ]) {
357
+ for (const { item, view, emit } of list) {
358
+ let allows = effectiveMemo.get(view.object);
359
+ if (!allows)
360
+ effectiveMemo.set(view.object, (allows = effective(view.object, [view.object])));
361
+ ops.push({
362
+ item,
363
+ view,
364
+ op,
365
+ emit,
366
+ key: viewKey(view),
367
+ head: view.object,
368
+ tail: usersetGroup(view.user),
369
+ denies: deniedObjects(view.object),
370
+ allows,
371
+ depth: union.depth(view.user),
372
+ });
373
+ }
374
+ }
375
+ const subjectAllows = new Map();
376
+ /** Los objetos con algún allow (de los dos estados) que alcanza el sujeto, directo o por cualquier grupo (grafo unión). */
377
+ const allowsOfSubject = (subject) => {
378
+ let out = subjectAllows.get(subject);
379
+ if (out)
380
+ return out;
381
+ out = new Set([...(allowIndex.get(subject)?.keys() ?? [])]);
382
+ for (const e of context.edges) {
383
+ if (e.user !== subject)
384
+ continue;
385
+ for (const object of reach(union, allowIndex, e.object).keys())
386
+ out.add(object);
387
+ }
388
+ subjectAllows.set(subject, out);
389
+ return out;
390
+ };
391
+ const intersects = (a, b) => {
392
+ const [small, large] = a.size <= b.size ? [a, b] : [b, a];
393
+ for (const x of small)
394
+ if (large.has(x))
395
+ return true;
396
+ return false;
397
+ };
398
+ /**
399
+ * C3: ¿`d` (sale) y `w` (entra) componen un camino NUEVO? Cierre 5 de D2 (D4-2; el oráculo cuenta los objetos `group:`):
400
+ * el camino compuesto concede SIEMPRE algo —la propia membresía del sujeto en el grupo de arriba (`check(member)`,
401
+ * `membersOf`)—, así que ya no se exige un allow efectivo al final del camino (hasta el cierre 4 sí, y un corte entre
402
+ * `+U∈h` y `-h⊂g` hacía a U miembro de g, cosa que ni el inicial ni el final hacían).
403
+ */
404
+ const composes = (d, w) => {
405
+ if (w.tail !== null && union.up(d.head).has(w.tail))
406
+ return true;
407
+ if (d.tail !== null && union.up(w.head).has(d.tail))
408
+ return true;
409
+ return false;
410
+ };
411
+ /** ¿`a` va ANTES que `b`? (C1–C4). */
412
+ const before = (a, b) => {
413
+ if (a.op === 'write' && b.op === 'write') {
414
+ return [...a.denies].some((x) => b.allows.has(x)) && intersects(union.below(a.view.user), union.below(b.view.user));
415
+ }
416
+ if (a.op === 'delete' && b.op === 'delete') {
417
+ return [...a.allows].some((x) => b.denies.has(x)) && intersects(union.below(a.view.user, b.key), union.below(b.view.user));
418
+ }
419
+ if (a.op === 'delete')
420
+ return composes(a, b);
421
+ // C4, con la exclusión de C2 (cierre 5 de D2): un sujeto que solo alcanza la que sale A TRAVÉS de la que entra (o la
422
+ // que entra a través de la que sale) no tenía ese deny en el inicial (o no lo tiene en el final): no hay «instante sin
423
+ // deny» que evitar. Sin la exclusión, C4 chocaba con C3 —que ahora cuenta la membresía como concesión— en ciclos
424
+ // espurios (`+U∈h`, `-h⊂g` con el deny en g: U nunca estuvo en g).
425
+ const belowB = union.below(b.view.user, a.key);
426
+ const common = [...union.below(a.view.user, b.key)].filter((s) => belowB.has(s));
427
+ if (common.length === 0)
428
+ return false;
429
+ return [...a.denies].some((x) => b.denies.has(x) && common.some((s) => allowsOfSubject(s).has(x)));
430
+ };
431
+ // Los pares que pueden tener precedencia: los de un MISMO sujeto holder, y los de cada arista anidada con todas las
432
+ // que tienen un sujeto por debajo de ella o un grupo en su camino.
433
+ const succ = ops.map(() => []);
434
+ const link = (i, j) => {
435
+ if (before(ops[i], ops[j]))
436
+ succ[i].push(j);
437
+ };
438
+ const byHolder = new Map();
439
+ const nested = [];
440
+ ops.forEach((o, i) => {
441
+ if (o.tail !== null)
442
+ nested.push(i);
443
+ else {
444
+ let list = byHolder.get(o.view.user);
445
+ if (!list)
446
+ byHolder.set(o.view.user, (list = []));
447
+ list.push(i);
448
+ }
449
+ });
450
+ for (const list of byHolder.values())
451
+ for (const i of list)
452
+ for (const j of list)
453
+ if (i !== j)
454
+ link(i, j);
455
+ for (const i of nested) {
456
+ for (let j = 0; j < ops.length; j++) {
457
+ if (i === j || (ops[j].tail !== null && j < i))
458
+ continue;
459
+ link(i, j);
460
+ link(j, i);
461
+ }
462
+ }
463
+ const order = orderByPrecedence(ops, succ);
464
+ return {
465
+ steps: order.order.map((i) => ({ item: ops[i].item, op: ops[i].emit })),
466
+ residue: order.cyclic.map((i) => ops[i].item),
467
+ };
468
+ }
469
+ /** Prioridad entre disponibles: escrituras antes que borrados; escrituras de lejos primero, borrados de cerca; (objeto, sujeto). */
470
+ function priority(a, b) {
471
+ if (a.op !== b.op)
472
+ return a.op === 'write' ? -1 : 1;
473
+ if (a.depth !== b.depth)
474
+ return a.op === 'write' ? b.depth - a.depth : a.depth - b.depth;
475
+ if (a.view.object !== b.view.object)
476
+ return a.view.object < b.view.object ? -1 : 1;
477
+ if (a.view.user !== b.view.user)
478
+ return a.view.user < b.view.user ? -1 : 1;
479
+ return 0;
480
+ }
481
+ /**
482
+ * Orden topológico por componentes fuertemente conexas (Tarjan, iterativo): una componente sale cuando no le queda
483
+ * ninguna predecesora; entre las disponibles, la de mayor prioridad. Dentro de una componente con CICLO, Kahn sobre sus
484
+ * aristas internas y, cuando se atasca, la de mayor prioridad (`cyclic` las devuelve todas: el residuo).
485
+ */
486
+ function orderByPrecedence(ops, succ) {
487
+ const n = ops.length;
488
+ const index = new Array(n).fill(-1);
489
+ const low = new Array(n).fill(0);
490
+ const onStack = new Array(n).fill(false);
491
+ const component = new Array(n).fill(-1);
492
+ const stack = [];
493
+ const members = [];
494
+ let counter = 0;
495
+ for (let root = 0; root < n; root++) {
496
+ if (index[root] !== -1)
497
+ continue;
498
+ const work = [{ v: root, next: 0 }];
499
+ index[root] = low[root] = counter++;
500
+ stack.push(root);
501
+ onStack[root] = true;
502
+ while (work.length > 0) {
503
+ const frame = work[work.length - 1];
504
+ const edges = succ[frame.v];
505
+ if (frame.next < edges.length) {
506
+ const w = edges[frame.next++];
507
+ if (index[w] === -1) {
508
+ index[w] = low[w] = counter++;
509
+ stack.push(w);
510
+ onStack[w] = true;
511
+ work.push({ v: w, next: 0 });
512
+ }
513
+ else if (onStack[w])
514
+ low[frame.v] = Math.min(low[frame.v], index[w]);
515
+ continue;
516
+ }
517
+ work.pop();
518
+ if (work.length > 0)
519
+ low[work[work.length - 1].v] = Math.min(low[work[work.length - 1].v], low[frame.v]);
520
+ if (low[frame.v] === index[frame.v]) {
521
+ const list = [];
522
+ let w;
523
+ do {
524
+ w = stack.pop();
525
+ onStack[w] = false;
526
+ component[w] = members.length;
527
+ list.push(w);
528
+ } while (w !== frame.v);
529
+ members.push(list);
530
+ }
531
+ }
532
+ }
533
+ const pending = new Array(members.length).fill(0);
534
+ for (let v = 0; v < n; v++)
535
+ for (const w of succ[v])
536
+ if (component[v] !== component[w])
537
+ pending[component[w]]++;
538
+ const best = members.map((list) => list.reduce((a, b) => (priority(ops[a], ops[b]) <= 0 ? a : b)));
539
+ const ready = members.map((_, c) => c).filter((c) => pending[c] === 0);
540
+ const order = [];
541
+ const cyclic = [];
542
+ while (ready.length > 0) {
543
+ let pick = 0;
544
+ for (let k = 1; k < ready.length; k++)
545
+ if (priority(ops[best[ready[k]]], ops[best[ready[pick]]]) < 0)
546
+ pick = k;
547
+ const c = ready.splice(pick, 1)[0];
548
+ const list = members[c];
549
+ if (list.length === 1)
550
+ order.push(list[0]);
551
+ else {
552
+ cyclic.push(...list);
553
+ const inside = new Set(list);
554
+ const done = new Set();
555
+ const preds = new Map(list.map((v) => [v, 0]));
556
+ for (const v of list)
557
+ for (const w of succ[v])
558
+ if (inside.has(w))
559
+ preds.set(w, preds.get(w) + 1);
560
+ while (done.size < list.length) {
561
+ const left = list.filter((v) => !done.has(v));
562
+ const free = left.filter((v) => preds.get(v) === 0);
563
+ const pool = free.length > 0 ? free : left;
564
+ const v = pool.reduce((a, b) => (priority(ops[a], ops[b]) <= 0 ? a : b));
565
+ done.add(v);
566
+ order.push(v);
567
+ for (const w of succ[v])
568
+ if (inside.has(w) && !done.has(w))
569
+ preds.set(w, preds.get(w) - 1);
570
+ }
571
+ }
572
+ for (const v of list)
573
+ for (const w of succ[v])
574
+ if (component[w] !== c && --pending[component[w]] === 0)
575
+ ready.push(component[w]);
576
+ }
577
+ return { order, cyclic };
578
+ }
579
+ /**
580
+ * **El orden de ESCRITURA** de un conjunto que solo ENTRA (atajo de `relationTransitionOrder` sin borrados): `context` =
581
+ * las tuplas que existen y no se escriben.
582
+ */
583
+ export function relationWriteOrder(items, view, context = []) {
584
+ return relationTransitionOrder({ writes: items, context }, view).steps.map((s) => s.item);
585
+ }
586
+ /** **El orden de BORRADO** de un conjunto que solo SALE (las purgas de `openfga`): allows → membresías → denies. */
587
+ export function relationDeleteOrder(items, view, context = []) {
588
+ return relationTransitionOrder({ deletes: items, context }, view).steps.map((s) => s.item);
589
+ }
590
+ /*
591
+ * Cierre 5 de D2 (decisión del dueño §2026-10-16 (10), opción A): aquí vivía `relationWithheldWrites` (cierre 4), la
592
+ * RETENCIÓN de lo que un deny que no viaja (`renewal-unsafe`, `deny-conditional`) dejaría conceder. Se fue entera: en vez
593
+ * de retener tupla a tupla —con su cascada, su conflicto global `carrier-conflict` y el hueco D4-1 que el auditor midió—,
594
+ * la PARTICIÓN afectada recibe CERO escrituras y cero borrados (`src/relations/reconcile.ts`, `planPartition` ⇒
595
+ * `refusal`), y el resto migra. Una partición negada queda exactamente como estaba, que es lo único que se puede
596
+ * certificar sin una escritura atómica de la renovación (openfga/openfga#2151).
597
+ */
598
+ //# sourceMappingURL=tuple_order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tuple_order.js","sourceRoot":"","sources":["../../../src/relations/tuple_order.ts"],"names":[],"mappings":"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"}
@@ -51,6 +51,14 @@ export declare function isUniqueViolation(error: unknown): boolean;
51
51
  * crudo del motor ni un 503 disfrazado de indeterminado.
52
52
  */
53
53
  export declare function isDeadlock(error: unknown): boolean;
54
+ /**
55
+ * **¿Es el 400 del tope de operaciones por `Write` del servidor OpenFGA?** MEDIDO en v1.19.0 (cierre 2 de D1 · ⚪ N3):
56
+ * el SDK lanza `FgaApiValidationError` con `statusCode` 400 y `apiErrorCode` `exceeded_entity_limit` («The number of
57
+ * write operations exceeds the allowed limit of N»). Se mira el error y su `cause` directa (los dos drivers lo envuelven
58
+ * en un `AuthorizationBackendError`). PUNTO DE PASO ÚNICO de los dos puertos (lote D · D2, el gemelo de roles de N3):
59
+ * un despliegue con `--max-tuples-per-write` < 100 no es transitorio y no puede salir como 503.
60
+ */
61
+ export declare function isServerWriteLimit(error: unknown): boolean;
54
62
  /**
55
63
  * ¿El error viene de un deadline vencido? knex lanza `KnexTimeoutError` (o, si
56
64
  * además falló la cancelación, el error de cancelación con `timeout` puesto);