@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.
- package/README.md +496 -29
- package/build/commands/authz_catalog_diff.d.ts.map +1 -1
- package/build/commands/authz_catalog_diff.js +0 -1
- package/build/commands/authz_catalog_diff.js.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.js +0 -1
- package/build/commands/authz_catalog_prune_orphans.js.map +1 -1
- package/build/commands/authz_freeze.d.ts.map +1 -1
- package/build/commands/authz_freeze.js +1 -2
- package/build/commands/authz_freeze.js.map +1 -1
- package/build/commands/authz_reconcile.d.ts +15 -6
- package/build/commands/authz_reconcile.d.ts.map +1 -1
- package/build/commands/authz_reconcile.js +143 -20
- package/build/commands/authz_reconcile.js.map +1 -1
- package/build/commands/authz_relations_reconcile.d.ts +72 -1
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
- package/build/commands/authz_relations_reconcile.js +234 -21
- package/build/commands/authz_relations_reconcile.js.map +1 -1
- package/build/commands/authz_scopes_relay.d.ts +50 -0
- package/build/commands/authz_scopes_relay.d.ts.map +1 -1
- package/build/commands/authz_scopes_relay.js +213 -10
- package/build/commands/authz_scopes_relay.js.map +1 -1
- package/build/commands/authz_scopes_requeue.d.ts +80 -0
- package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
- package/build/commands/authz_scopes_requeue.js +230 -0
- package/build/commands/authz_scopes_requeue.js.map +1 -0
- package/build/commands/authz_unfreeze.d.ts +12 -4
- package/build/commands/authz_unfreeze.d.ts.map +1 -1
- package/build/commands/authz_unfreeze.js +74 -9
- package/build/commands/authz_unfreeze.js.map +1 -1
- package/build/commands/main.d.ts +16 -13
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +59 -11
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_provision.d.ts +49 -3
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +72 -7
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/index.d.ts +15 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +16 -3
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +7 -2
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +20 -3
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +106 -1
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +11 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_driver.d.ts +53 -14
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +104 -32
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +74 -9
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +391 -93
- package/build/src/drivers/database_relations_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +71 -10
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +195 -16
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_facts.d.ts +15 -0
- package/build/src/drivers/openfga_facts.d.ts.map +1 -1
- package/build/src/drivers/openfga_facts.js +25 -2
- package/build/src/drivers/openfga_facts.js.map +1 -1
- package/build/src/drivers/openfga_relations_driver.d.ts +72 -6
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +308 -50
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +175 -4
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +219 -3
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +100 -20
- package/build/src/freeze.d.ts.map +1 -1
- package/build/src/freeze.js +159 -25
- package/build/src/freeze.js.map +1 -1
- package/build/src/manager.d.ts +239 -7
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +1192 -148
- package/build/src/manager.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +2 -2
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +2 -2
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +2 -2
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_role.d.ts +2 -2
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +2 -2
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/relation_partition_trigger.d.ts.map +1 -1
- package/build/src/relation_partition_trigger.js +11 -3
- package/build/src/relation_partition_trigger.js.map +1 -1
- package/build/src/relations/define_relations_config.d.ts +51 -0
- package/build/src/relations/define_relations_config.d.ts.map +1 -1
- package/build/src/relations/define_relations_config.js +68 -1
- package/build/src/relations/define_relations_config.js.map +1 -1
- package/build/src/relations/manager.d.ts +106 -6
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +368 -30
- package/build/src/relations/manager.js.map +1 -1
- package/build/src/relations/reconcile.d.ts +81 -6
- package/build/src/relations/reconcile.d.ts.map +1 -1
- package/build/src/relations/reconcile.js +233 -77
- package/build/src/relations/reconcile.js.map +1 -1
- package/build/src/scope_outbox.d.ts +54 -0
- package/build/src/scope_outbox.d.ts.map +1 -1
- package/build/src/scope_outbox.js +274 -33
- package/build/src/scope_outbox.js.map +1 -1
- package/build/src/shared/backend_guard.d.ts +28 -0
- package/build/src/shared/backend_guard.d.ts.map +1 -1
- package/build/src/shared/backend_guard.js +52 -0
- package/build/src/shared/backend_guard.js.map +1 -1
- package/build/src/shared/sql_expiry.d.ts +2 -0
- package/build/src/shared/sql_expiry.d.ts.map +1 -1
- package/build/src/shared/sql_expiry.js +4 -0
- package/build/src/shared/sql_expiry.js.map +1 -1
- package/build/src/shared/transaction_guard.d.ts +53 -0
- package/build/src/shared/transaction_guard.d.ts.map +1 -0
- package/build/src/shared/transaction_guard.js +74 -0
- package/build/src/shared/transaction_guard.js.map +1 -0
- package/build/src/sql_descendants.d.ts +8 -0
- package/build/src/sql_descendants.d.ts.map +1 -1
- package/build/src/sql_descendants.js.map +1 -1
- package/build/src/testing/contract.d.ts +55 -4
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +244 -9
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +6 -4
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +3 -2
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/migration_contract.d.ts +9 -0
- package/build/src/testing/migration_contract.d.ts.map +1 -1
- package/build/src/testing/migration_contract.js +5 -2
- package/build/src/testing/migration_contract.js.map +1 -1
- package/build/src/testing/relations_contract.d.ts +23 -1
- package/build/src/testing/relations_contract.d.ts.map +1 -1
- package/build/src/testing/relations_contract.js +603 -19
- package/build/src/testing/relations_contract.js.map +1 -1
- package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
- package/build/src/testing/relations_reconcile_contract.js +49 -1
- package/build/src/testing/relations_reconcile_contract.js.map +1 -1
- package/build/src/testing/scope_outbox_contract.d.ts +98 -0
- package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
- package/build/src/testing/scope_outbox_contract.js +677 -0
- package/build/src/testing/scope_outbox_contract.js.map +1 -0
- package/build/src/traits/has_uuid.d.ts +2 -2
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +708 -38
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +55 -0
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/authorization.stub +45 -1
- package/build/stubs/migration.stub +20 -10
- package/package.json +1 -1
package/build/src/manager.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type AuthorizationConfig } from './define_config.js';
|
|
2
2
|
import type { FreezeKind, FreezeToken } from './freeze.js';
|
|
3
|
-
import type { AuthorizationDriver, AuthorizedScopes, CatalogRole, CatalogRoleRef, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, RoleQuery, ScopedRoleChanges, ScopedRoleSpec, ReconcileOptions, ReconcileReport, ScopedWriteOptions, ScopeRelayReport, ScopeRef, ScopeTreeWriteOptions, ScopeType, SubjectRef } from './types.js';
|
|
3
|
+
import type { AuthorizationDriver, AuthorizationDriverCapabilities, AuthorizedScopes, CatalogRole, CatalogRoleRef, DenyOptions, DenyRef, ExcludedSubtree, GrantOptions, GrantOutcome, RoleQuery, ScopedRoleChanges, ScopedRoleSpec, ReconcileOptions, ReconcileReport, ScopedWriteOptions, ScopeEnqueueReceipt, ScopeRequeueReport, ScopeRelayReport, ScopeRef, ScopeTreeWriteOptions, ScopeType, SubjectRef, RelationsDriverFactory } from './types.js';
|
|
4
4
|
/**
|
|
5
5
|
* Lo que devuelve `AuthorizationManager.forRequest()`: la misma API que el
|
|
6
6
|
* manager (lecturas, escrituras, `scopes.*`), con los ancestros memoizados
|
|
7
7
|
* SOLO en las lecturas. Es un tipo, no otra clase: la vista es un manager
|
|
8
8
|
* hijo que comparte config, driver y hooks con su padre.
|
|
9
9
|
*/
|
|
10
|
-
export type AuthorizationView = Pick<AuthorizationManager, 'authorize' | 'hasRole' | 'listSubjects' | 'listScopes' | 'listRoles' | 'listRoleScopes' | 'grant' | 'revoke' | 'deny' | 'removeDeny' | 'scopes' | 'driver' | 'forRequest' | 'isWithin' | 'listDenies' | 'effectivePermissions' | 'authorizeMany' | 'authorizedScopes' | 'expandExcludedSubtrees' | 'defineScopedRole' | 'updateScopedRole' | 'deleteScopedRole'>;
|
|
10
|
+
export type AuthorizationView = Pick<AuthorizationManager, 'authorize' | 'hasRole' | 'listSubjects' | 'listScopes' | 'listRoles' | 'listRoleScopes' | 'grant' | 'revoke' | 'deny' | 'removeDeny' | 'scopes' | 'driver' | 'capabilities' | 'forRequest' | 'isWithin' | 'listDenies' | 'effectivePermissions' | 'authorizeMany' | 'authorizedScopes' | 'expandExcludedSubtrees' | 'defineScopedRole' | 'updateScopedRole' | 'deleteScopedRole'>;
|
|
11
11
|
/**
|
|
12
12
|
* Expande los `excludedSubtrees` de un `all` (2D · F10) a la lista plana de
|
|
13
13
|
* scopes que hay que restar: cada scope denegado y TODOS sus descendientes,
|
|
@@ -34,8 +34,43 @@ export declare const MAX_SCOPE_BOUND = 10000000;
|
|
|
34
34
|
*/
|
|
35
35
|
export declare const DEFAULT_RELAY_BATCH = 100;
|
|
36
36
|
export declare const DEFAULT_RELAY_LIMIT = 10000;
|
|
37
|
+
/**
|
|
38
|
+
* **Saltos que la sonda de `only` sigue hacia atrás para heredar el ORIGEN de
|
|
39
|
+
* un bloqueo** (2.4.0-alpha.6). Cada salto es una consulta `earlierPending`
|
|
40
|
+
* (0,69 ms) sobre una entrada NO pedida; la cadena es de ids estrictamente
|
|
41
|
+
* decrecientes, así que termina sola — la cota solo acota el coste dentro de
|
|
42
|
+
* una petición inline. Pasada la cota el origen se toma por FALLO (la purga se
|
|
43
|
+
* aplaza a la pasada completa): degrada hacia lo seguro, nunca aplica sin saber.
|
|
44
|
+
*/
|
|
45
|
+
export declare const RELAY_ORIGIN_MAX_HOPS = 100;
|
|
46
|
+
/**
|
|
47
|
+
* **Cota PROPIA del censo de aparcadas** (alpha.5 · cierre, auditor 🟠 2). Las
|
|
48
|
+
* claves de `dead()` que taponan `attached`/`moved` se leen COMPLETAS en cada
|
|
49
|
+
* pasada, sean cuales sean `limit` y `batchSize` (con `--limit 50` o la receta
|
|
50
|
+
* inline `{ only, limit: 1 }` un censo acotado por `limit` dejaba a la aparcada
|
|
51
|
+
* 101 sin taponar y el `attached` colgaba del padre VIEJO — y la sonda de
|
|
52
|
+
* `only` no la ve porque `earlierPending` excluye lo aparcado). Si hay más
|
|
53
|
+
* aparcadas que esto, la pasada se NIEGA (500) en vez de aplicar con un tapón
|
|
54
|
+
* incompleto: una cola así es un incidente, no un lote.
|
|
55
|
+
*/
|
|
56
|
+
export declare const PARKED_CENSUS_MAX = 50000;
|
|
37
57
|
/** Vida por defecto de una vista de `forRequest()` para LEER (F9): un request, no un módulo. */
|
|
38
58
|
export declare const DEFAULT_VIEW_MAX_AGE_MS = 30000;
|
|
59
|
+
/**
|
|
60
|
+
* Cada cuánto reintenta `acquire()` una pasada con `waitForLeaseMs` (2.4.0-alpha.8;
|
|
61
|
+
* panel relay 2, cuestión 7). Medido en PG: 0,29 ms por sondeo ocupado, y el
|
|
62
|
+
* sondeo no retiene conexión entre intentos (la transacción del intento fallido
|
|
63
|
+
* se revierte). El default de `waitForLeaseMs` es 0: el `busy` inmediato de
|
|
64
|
+
* siempre.
|
|
65
|
+
*/
|
|
66
|
+
export declare const RELAY_LEASE_POLL_MS = 25;
|
|
67
|
+
/**
|
|
68
|
+
* Tope de `waitForLeaseMs` (cierre alpha.8, 🟡 1 del auditor): una espera sin tope
|
|
69
|
+
* cuelga la petición de un tenant; por encima es 500 `E_AUTHZ_CONFIG`. Y la espera
|
|
70
|
+
* se cuenta en SONDEOS (`waitForLeaseMs / RELAY_LEASE_POLL_MS`), no solo con el
|
|
71
|
+
* reloj de pared: con `config.clock` fijo el sondeo por reloj no terminaba nunca.
|
|
72
|
+
*/
|
|
73
|
+
export declare const RELAY_WAIT_LEASE_MAX_MS = 60000;
|
|
39
74
|
export interface ForRequestOptions {
|
|
40
75
|
/**
|
|
41
76
|
* Milisegundos durante los que la vista puede LEER (default 30 000).
|
|
@@ -63,6 +98,38 @@ export interface FreezeStatus {
|
|
|
63
98
|
untilMs: number | null;
|
|
64
99
|
fence: number;
|
|
65
100
|
}
|
|
101
|
+
/**
|
|
102
|
+
* Lo que `withFrozenWrites` le cuenta a la pasada que corre dentro (L-1 · J1):
|
|
103
|
+
* el fence de la ventana, su lease y si se PERDIÓ a mitad (`lapsed`), para
|
|
104
|
+
* que una pasada de plataforma ajena al manager publique la garantía en vez
|
|
105
|
+
* de suponerla (`report.frozen`).
|
|
106
|
+
*/
|
|
107
|
+
export interface FrozenWindow {
|
|
108
|
+
fence: number;
|
|
109
|
+
/**
|
|
110
|
+
* El lease de la ventana. En la ventana del OPERADOR adoptada
|
|
111
|
+
* (2.4.0-alpha.10) es lo que le QUEDABA al adoptarla (`untilMs − ahora`);
|
|
112
|
+
* `null` solo si la ventana no caduca.
|
|
113
|
+
*/
|
|
114
|
+
leaseMs: number | null;
|
|
115
|
+
/**
|
|
116
|
+
* Solo en la ventana del OPERADOR adoptada (2.4.0-alpha.10, 🟡 3 del sexto
|
|
117
|
+
* informe de COGNITIV): el instante (ms de pared) en el que caduca, de la
|
|
118
|
+
* fila, o `null` si no caduca. Quien adopta la ventana no la renueva: si
|
|
119
|
+
* caduca a mitad, `lapsed` lo dice; esto dice que PUEDE caducar.
|
|
120
|
+
*/
|
|
121
|
+
untilMs?: number | null;
|
|
122
|
+
/**
|
|
123
|
+
* EN QUÉ ventana corrió (2.4.0-alpha.10, S2): la del OPERADOR adoptada, una
|
|
124
|
+
* PROPIA tomada para la pasada, o la que ya sostenía este manager
|
|
125
|
+
* (`enclosing`). La salida de los comandos lo dice siempre: «corrí dentro del
|
|
126
|
+
* cutover» y «tomé mi ventana porque no había ninguna» eran letra a letra
|
|
127
|
+
* iguales.
|
|
128
|
+
*/
|
|
129
|
+
window?: 'operator' | 'own' | 'enclosing';
|
|
130
|
+
/** ¿Se perdió la ventana en algún momento? (renovación fallida, fila ajena o vencida). */
|
|
131
|
+
lapsed: () => Promise<boolean>;
|
|
132
|
+
}
|
|
66
133
|
/**
|
|
67
134
|
* Manager de autorización — la fachada que usan middleware, services y
|
|
68
135
|
* seeders. Resuelve el driver activo del config y notifica cada escritura
|
|
@@ -109,6 +176,34 @@ export declare class AuthorizationManager {
|
|
|
109
176
|
* sin `withClock` con `clock` declarado es 500 `E_AUTHZ_CONFIG`.
|
|
110
177
|
*/
|
|
111
178
|
driver(): Promise<AuthorizationDriver>;
|
|
179
|
+
/**
|
|
180
|
+
* **Lo que el driver ACTIVO declara, de solo lectura** (2.4.0-alpha.4;
|
|
181
|
+
* pregunta 1 de COGNITIV, panel alpha.4). Para que el código de tenant
|
|
182
|
+
* pueda ramificar —`if ((await authorization.capabilities()).transactionalWrites)
|
|
183
|
+
* grant(…, { transaction }) else grant(…)`— sin llamar a `driver()`, que
|
|
184
|
+
* sigue siendo API de PLATAFORMA (el grep del README sigue significando lo
|
|
185
|
+
* que significa).
|
|
186
|
+
*
|
|
187
|
+
* Es `(await this.driver()).capabilities` y NADA más, a propósito:
|
|
188
|
+
* - las capacidades son de la INSTANCIA (`database` decide
|
|
189
|
+
* `transactionalWrites` desde sus opciones), así que hay que resolver;
|
|
190
|
+
* - y se resuelve POR `driver()`, con sus dos puertas
|
|
191
|
+
* (`requireTransactionalWrites` y el gate de deriva del árbol) y su
|
|
192
|
+
* caché. Resolverlo por otro camino «para que la lectura no lance» y
|
|
193
|
+
* guardarlo en `#driver` dejaría `driver()` sirviendo un driver que
|
|
194
|
+
* nunca pasó por las puertas: un bypass permanente del gate de deriva
|
|
195
|
+
* (🔴 1 del auditor). Por eso hereda los 500 de las puertas
|
|
196
|
+
* (`E_AUTHZ_CONFIG`, `E_AUTHZ_SCOPE_DRIFT_UNGUARDED`) y la factory del
|
|
197
|
+
* consumidor: llámalo al arrancar (un hook `booted`/`ready`), no por
|
|
198
|
+
* request en un endpoint de metadatos.
|
|
199
|
+
*
|
|
200
|
+
* Devuelve una copia CONGELADA y NORMALIZADA: todas las claves de
|
|
201
|
+
* `AuthorizationDriverCapabilities` presentes, solo `true` es `true`
|
|
202
|
+
* (la misma lectura que la puerta 1), nunca `undefined`; mutarla no toca
|
|
203
|
+
* el objeto que leen las puertas. La vista de `forRequest()` delega en el
|
|
204
|
+
* padre (por `driver()`).
|
|
205
|
+
*/
|
|
206
|
+
capabilities(): Promise<Readonly<AuthorizationDriverCapabilities>>;
|
|
112
207
|
/**
|
|
113
208
|
* **Congela las ESCRITURAS del motor, DURABLE** (3b-7; decisión del dueño
|
|
114
209
|
* del 2026-08-31 (3b): B + E-analista). Operación de PLATAFORMA, como
|
|
@@ -159,8 +254,50 @@ export declare class AuthorizationManager {
|
|
|
159
254
|
* `freezeStatus()`: eso es la fila, no la memoria.
|
|
160
255
|
*/
|
|
161
256
|
get frozen(): boolean;
|
|
257
|
+
/**
|
|
258
|
+
* La clave (en `relations.drivers`) del driver de RELACIONES activo:
|
|
259
|
+
* `relations.default ?? default` (2.4.0-alpha.10). La lee el guard de la
|
|
260
|
+
* dirección rancia de `runRelationsReconcile`; desde el cierre del auditor
|
|
261
|
+
* (R4) el llamante ya no puede contradecirla con un `activeKey` propio.
|
|
262
|
+
*/
|
|
263
|
+
relationsDriverKey(): string;
|
|
264
|
+
/** Las claves registradas en `relations.drivers` del config de ESTE manager (vacío si no hay relaciones). */
|
|
265
|
+
relationsDriverKeys(): string[];
|
|
266
|
+
/**
|
|
267
|
+
* La factory registrada bajo `key` en `relations.drivers` de ESTE manager, o
|
|
268
|
+
* `undefined` (cierre del auditor de alpha.10 · R4). `runRelationsReconcile`
|
|
269
|
+
* resuelve el origen y el destino por aquí —del MISMO config que decide el
|
|
270
|
+
* activo— y juzga la identidad por la factory resuelta, no por la etiqueta:
|
|
271
|
+
* dos claves con la misma factory son el mismo driver (y dos factories DISTINTAS
|
|
272
|
+
* sobre el mismo backend NO: límite declarado, cierre-2 · C1).
|
|
273
|
+
*
|
|
274
|
+
* **API de PLATAFORMA, junto a `driver()`** (cierre-2 · C6): con esta factory
|
|
275
|
+
* cualquier código que tenga el manager —vistas de `forRequest()` incluidas—
|
|
276
|
+
* construye un driver de relaciones NO activo y escribe en él sin `assertWrite`,
|
|
277
|
+
* `requireActor`, freeze ni `onRelationWrite`. No añade capacidad (el config ya
|
|
278
|
+
* da las factories), pero es otra cosa que buscar en una revisión.
|
|
279
|
+
*/
|
|
280
|
+
relationsDriverFactory(key: string): RelationsDriverFactory | undefined;
|
|
162
281
|
/** El freeze VIVO de la fila compartida, o `null`. Lo lee cualquiera; solo el token lo levanta. */
|
|
163
282
|
freezeStatus(): Promise<FreezeStatus | null>;
|
|
283
|
+
/**
|
|
284
|
+
* **La ÚLTIMA ventana de la fila, también la CADUCADA** (2.4.0-alpha.10, 🟠 2
|
|
285
|
+
* del sexto informe de COGNITIV). `freezeStatus()` responde solo lo VIVO —y
|
|
286
|
+
* así lo siguen usando la barrera y los comandos—, de modo que una ventana
|
|
287
|
+
* cuyo lease venció era indistinguible de «nunca hubo»: `authz:unfreeze`
|
|
288
|
+
* decía éxito y el último paso del cutover no delataba que las escrituras
|
|
289
|
+
* habían vuelto a entrar a mitad. Se distingue por la fila: `releaseFreeze`
|
|
290
|
+
* pone el motivo a `null` al levantar, así que motivo puesto + `untilMs` en
|
|
291
|
+
* el pasado es una ventana que CADUCÓ sin que nadie la cerrase.
|
|
292
|
+
*
|
|
293
|
+
* `null` = nunca hubo o ya se levantó; `expired: false` = viva (lo mismo que
|
|
294
|
+
* `freezeStatus()`); `expired: true` = caducada. `checkedAtMs` es el instante
|
|
295
|
+
* del reloj del config con el que se decidió.
|
|
296
|
+
*/
|
|
297
|
+
lastFreezeStatus(): Promise<(FreezeStatus & {
|
|
298
|
+
expired: boolean;
|
|
299
|
+
checkedAtMs: number;
|
|
300
|
+
}) | null>;
|
|
164
301
|
/**
|
|
165
302
|
* `freeze()` + `finally unfreeze(token)`. El `finally` es la parte que
|
|
166
303
|
* importa: una migración que revienta a la mitad no puede dejar la
|
|
@@ -169,7 +306,10 @@ export declare class AuthorizationManager {
|
|
|
169
306
|
* A1.1/A1.3): si este manager ya sostiene el freeze, la ventana interior
|
|
170
307
|
* no toma otro ni lo levanta al salir — la exterior sigue en pie.
|
|
171
308
|
*/
|
|
172
|
-
withFrozenWrites<T>(reason: string, fn: () => Promise<T
|
|
309
|
+
withFrozenWrites<T>(reason: string, fn: (window: FrozenWindow) => Promise<T>, options?: {
|
|
310
|
+
kind?: FreezeKind;
|
|
311
|
+
operatorAsContext?: boolean;
|
|
312
|
+
}): Promise<T>;
|
|
173
313
|
/** Solo tests: fuerza re-resolución del driver. */
|
|
174
314
|
clearCachedDriver(): void;
|
|
175
315
|
/**
|
|
@@ -181,7 +321,7 @@ export declare class AuthorizationManager {
|
|
|
181
321
|
* Espía: si la validación falla, cero llamadas al driver.
|
|
182
322
|
*/
|
|
183
323
|
readonly scopes: {
|
|
184
|
-
attached: (child: ScopeRef, parent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<
|
|
324
|
+
attached: (child: ScopeRef, parent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<ScopeEnqueueReceipt>;
|
|
185
325
|
/**
|
|
186
326
|
* `moved` NO vuelve a juzgar el catálogo, y no tiene por qué (3b-1 · D3,
|
|
187
327
|
* auditor 3G): mover un scope es un hecho del árbol, no una escritura de
|
|
@@ -195,7 +335,7 @@ export declare class AuthorizationManager {
|
|
|
195
335
|
* invariante del sistema. Es ruidosa: `authz:catalog:diff` la lista como
|
|
196
336
|
* `shadowedByAncestor` (y `--fail-on-shadows` la cuenta como deriva).
|
|
197
337
|
*/
|
|
198
|
-
moved: (child: ScopeRef, newParent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<
|
|
338
|
+
moved: (child: ScopeRef, newParent: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<ScopeEnqueueReceipt>;
|
|
199
339
|
/**
|
|
200
340
|
* Hechos primero (el driver demuestra cero o lanza), arista después
|
|
201
341
|
* (S6): si la purga muere a medias, el subárbol sigue colgado y los
|
|
@@ -219,7 +359,7 @@ export declare class AuthorizationManager {
|
|
|
219
359
|
* O(1), sin rango que medir, sin árbol que enumerar y sin nada que
|
|
220
360
|
* declarar a medias.
|
|
221
361
|
*/
|
|
222
|
-
detached: (child: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<
|
|
362
|
+
detached: (child: ScopeRef, options?: ScopeTreeWriteOptions) => Promise<ScopeEnqueueReceipt>;
|
|
223
363
|
};
|
|
224
364
|
/**
|
|
225
365
|
* **Drena la outbox del árbol y aplica los cambios al driver** (3b-2d).
|
|
@@ -264,12 +404,104 @@ export declare class AuthorizationManager {
|
|
|
264
404
|
* **fail-open temporal** —el tenant antiguo conserva acceso tras un
|
|
265
405
|
* `moved`, los denies heredados no aplican tras un `attached`—. No hay
|
|
266
406
|
* 2PC; es el precio de tener el árbol en dos sitios.
|
|
407
|
+
*
|
|
408
|
+
* **`only` (2.4.0-alpha.5 · R1)**: relevar SOLO estas entradas —los ids del
|
|
409
|
+
* recibo de `scopes.*` que ESTE proceso acaba de recibir, jamás del cuerpo
|
|
410
|
+
* de una petición— sin leer la cola de los demás (medido: 4 507 ms → 19 ms
|
|
411
|
+
* con 500 entradas ajenas por delante). El orden por clave NO se relaja:
|
|
412
|
+
* antes de aplicar cada entrada pedida se sondea la cola ENTERA
|
|
413
|
+
* (`earlierPending`, o paginando `pending()` si la outbox no lo tiene) y,
|
|
414
|
+
* si hay una pendiente ANTERIOR que comparte clave de scope con ella, sale
|
|
415
|
+
* `deferred` con `depends-on:<id>` — nunca aplicada fuera de orden (el 🔴 1
|
|
416
|
+
* del panel relay, medido: un `attached(child, unit)` aplicado antes que su
|
|
417
|
+
* `moved(unit → orgB)` dejaba al editor de la org VIEJA autorizando sobre el
|
|
418
|
+
* hijo). `remaining` y `dead` siguen siendo GLOBALES. `only: []` es 500
|
|
419
|
+
* (un `filter` vacío del consumidor no puede acabar en drenaje ni en un
|
|
420
|
+
* reporte vacío en verde), y una outbox que no honre el filtro también.
|
|
421
|
+
*
|
|
422
|
+
* **Lo aparcado tapona por clave (alpha.5 · R2a)**: las claves de `dead()`
|
|
423
|
+
* siembran el bloqueo al inicio de la pasada para lo que CONCEDE o recuelga
|
|
424
|
+
* (`attached`/`moved`, `deferred` con `parked:<id>`) y dejan pasar lo que
|
|
425
|
+
* RETIRA (`detached`: una purga nunca queda bloqueada, invariante 11). Y un
|
|
426
|
+
* 503 del backend NO consume intento (`markFailed(..., { transient })`).
|
|
267
427
|
*/
|
|
268
428
|
relayScopeChanges(options?: {
|
|
269
429
|
limit?: number;
|
|
270
430
|
batchSize?: number;
|
|
271
431
|
dryRun?: boolean;
|
|
432
|
+
only?: Array<string | number>;
|
|
433
|
+
waitForLeaseMs?: number;
|
|
434
|
+
/**
|
|
435
|
+
* Bajo `only`, `dead[]` va SIN `error` por DEFECTO (2.4.0-alpha.8): la
|
|
436
|
+
* causa la escribe el backend sobre el árbol de OTRO tenant; `'full'`
|
|
437
|
+
* la devuelve (lo de hasta alpha.7). Sin `only` no cambia nada.
|
|
438
|
+
*/
|
|
439
|
+
deadDetail?: 'full';
|
|
272
440
|
}): Promise<ScopeRelayReport>;
|
|
441
|
+
/**
|
|
442
|
+
* **Devuelve entradas APARCADAS a la cola** (2.4.0-alpha.5 · R2b; panel
|
|
443
|
+
* relay, cuestión 2). Es lo que hay detrás de `node ace authz:scopes:requeue
|
|
444
|
+
* --id`. Operación de PLATAFORMA como `relayScopeChanges` y `driver()`: sin
|
|
445
|
+
* actor, sin `within`, **no se expone por HTTP**.
|
|
446
|
+
*
|
|
447
|
+
* **La sonda anti-reversión vive AQUÍ, no en la outbox**: reaplicar una
|
|
448
|
+
* entrada ANTERIOR a otra ya APLICADA sobre la misma clave de scope
|
|
449
|
+
* reescribe el árbol del store en un orden que nunca existió — el `moved`
|
|
450
|
+
* viejo tras el nuevo deja el padre VIEJO con UN solo padre, así que
|
|
451
|
+
* `assertOneParent` no lo delata y el tenant antiguo recupera el acceso
|
|
452
|
+
* (auditor 🔴 2, `relay-auditor-5.ts`, medido). Por eso, antes de tocar la
|
|
453
|
+
* cola, cada aparcada pedida se compara contra las aplicadas posteriores
|
|
454
|
+
* que compartan clave (`outbox.laterApplied`, espejo de `earlierPending`)
|
|
455
|
+
* y si hay alguna se NIEGA con 500 `E_AUTHZ_REQUEUE_REFUSED` nombrándola —
|
|
456
|
+
* todo o nada, cero filas tocadas—. El remedio correcto es
|
|
457
|
+
* `authz:reconcile --to=<driver>`, que recalcula con el árbol de HOY. La
|
|
458
|
+
* sonda es del manager porque necesita las claves del cambio
|
|
459
|
+
* (`#changeKeys`); `outbox.requeue` queda mecánico y una outbox de
|
|
460
|
+
* terceros la hereda gratis.
|
|
461
|
+
*
|
|
462
|
+
* **`force`** salta la sonda y devuelve el diff en `overrides`. Existe para
|
|
463
|
+
* el comando ace —que lo imprime y exige el flag explícito (decisión del
|
|
464
|
+
* dueño del 2026-09-09 (2))— y para nada más: llamarlo con `force: true`
|
|
465
|
+
* desde un endpoint es policy en una API sin policy.
|
|
466
|
+
*
|
|
467
|
+
* `attempts` queda en `maxAttempts − 1` (lo hace la outbox): si la causa
|
|
468
|
+
* sigue rota la entrada vuelve a aparcarse en UNA pasada y contamina su
|
|
469
|
+
* clave solo en esa pasada —un requeue automatizado de lo irreparable no
|
|
470
|
+
* es un grifo de aplazamiento permanente (auditor 🔴 2, segunda mitad)—; si
|
|
471
|
+
* el operador la arregló, entra a la primera. No hay bucle: lo aparcado no
|
|
472
|
+
* vuelve solo a `pending()`.
|
|
473
|
+
*
|
|
474
|
+
* Exige `dead`, `requeue` y `laterApplied` en el puerto (500
|
|
475
|
+
* `E_AUTHZ_UNSUPPORTED` nombrando el que falte): sin censo no se sabe qué
|
|
476
|
+
* se reencola y sin sonda no hay requeue. Sin `apply` no pasa por la
|
|
477
|
+
* barrera del freeze: no escribe en el backend; la pasada que aplique la
|
|
478
|
+
* entrada sí la pasa.
|
|
479
|
+
*
|
|
480
|
+
* **`apply: true` — reencolar Y relevar en la misma llamada** (2.4.0-alpha.8;
|
|
481
|
+
* panel relay 2, cuestión 4; decisión del dueño 2026-09-10 (4)). Medido
|
|
482
|
+
* (tester P14): la reencolada vuelve con su id ORIGINAL (menor) y la
|
|
483
|
+
* siguiente pasada `only` del tenant salía `deferred · depends-on:` — el
|
|
484
|
+
* incidente no se cerraba con un comando. Con `apply`, tras reencolar se
|
|
485
|
+
* releva SOLO eso (`only` = exactamente los ids reencolados: los
|
|
486
|
+
* dependientes NO se arrastran, quedan `deferred`/pendientes y el reporte lo
|
|
487
|
+
* dice —«`only` es mi recibo»—) y el reporte del relay viaja en
|
|
488
|
+
* `report.relay`. Cuatro condiciones, todas fijadas con caso: (1) **un solo
|
|
489
|
+
* lease** para toda la llamada (tomarlo dos veces era `busy` en verde,
|
|
490
|
+
* auditor 🟠 5) — se toma PRIMERO, y si está ocupado es `relay.busy` con
|
|
491
|
+
* CERO filas reencoladas (reencolar y decir `busy` dejaba `attempts = max −
|
|
492
|
+
* 1` y la entrada se volvía a aparcar contaminando su clave); (2) **pasa la
|
|
493
|
+
* barrera del freeze** ANTES de tocar nada (con `apply` escribe el árbol);
|
|
494
|
+
* (3) **excluyente con `force`** (500 juntos: con las dos, revertir el árbol
|
|
495
|
+
* pasaba de dos llamadas de plataforma a una, auditor 🟠 6); (4) la sonda
|
|
496
|
+
* anti-reversión corre ANTES de reencolar, como siempre. `waitForLeaseMs`
|
|
497
|
+
* (solo con `apply`) es la misma espera acotada que en el relay, para que
|
|
498
|
+
* el comando que cierra el incidente no pierda siempre contra el cron.
|
|
499
|
+
*/
|
|
500
|
+
requeueScopeChanges(ids: Array<string | number>, options?: {
|
|
501
|
+
force?: boolean;
|
|
502
|
+
apply?: boolean;
|
|
503
|
+
waitForLeaseMs?: number;
|
|
504
|
+
}): Promise<ScopeRequeueReport>;
|
|
273
505
|
/**
|
|
274
506
|
* **`authz:reconcile --to=<driver>`** (3b-3a): la ÚNICA primitiva de
|
|
275
507
|
* migración y verificación del paquete, y el motivo de la fase entera —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"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"}
|