@jantstack/adonis-authz 2.4.0-alpha.1 → 2.4.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.
- package/README.md +299 -19
- package/build/commands/authz_relations_reconcile.d.ts +25 -1
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
- package/build/commands/authz_relations_reconcile.js +94 -6
- package/build/commands/authz_relations_reconcile.js.map +1 -1
- package/build/index.d.ts +13 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +15 -1
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +6 -1
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +18 -2
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +73 -1
- package/build/src/define_config.d.ts.map +1 -1
- 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 +57 -9
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +344 -89
- package/build/src/drivers/database_relations_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +17 -4
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +38 -3
- 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 +40 -6
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +244 -44
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +83 -4
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +139 -3
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +37 -16
- package/build/src/freeze.d.ts.map +1 -1
- package/build/src/freeze.js +53 -8
- package/build/src/freeze.js.map +1 -1
- package/build/src/manager.d.ts +16 -1
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +116 -25
- 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 +71 -6
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +301 -29
- package/build/src/relations/manager.js.map +1 -1
- package/build/src/relations/reconcile.d.ts +53 -4
- package/build/src/relations/reconcile.d.ts.map +1 -1
- package/build/src/relations/reconcile.js +92 -30
- package/build/src/relations/reconcile.js.map +1 -1
- package/build/src/scope_outbox.d.ts.map +1 -1
- package/build/src/scope_outbox.js +17 -10
- 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/transaction_guard.d.ts +50 -0
- package/build/src/shared/transaction_guard.d.ts.map +1 -0
- package/build/src/shared/transaction_guard.js +60 -0
- package/build/src/shared/transaction_guard.js.map +1 -0
- 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 +240 -8
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +4 -4
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +2 -2
- package/build/src/testing/main.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/traits/has_uuid.d.ts +2 -2
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +284 -16
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +4 -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/errors.d.ts
CHANGED
|
@@ -77,7 +77,54 @@ export declare class InvalidSlugError extends Exception {
|
|
|
77
77
|
export declare class AuthorizationConfigError extends Exception {
|
|
78
78
|
static status: number;
|
|
79
79
|
static code: string;
|
|
80
|
-
|
|
80
|
+
/**
|
|
81
|
+
* **`assertWrite` devolvió una promesa** (2.4.0-alpha.3 · D3, hallazgo H2).
|
|
82
|
+
* `assertWrite(ref): void` es SÍNCRONO y puro a propósito (R-13), pero
|
|
83
|
+
* TypeScript no lo defiende: `assertWrite: async (ref) => { throw … }`
|
|
84
|
+
* compila —una función que devuelve `Promise<void>` es asignable a `void`—,
|
|
85
|
+
* y hasta alpha.3 la promesa se descartaba y la ESCRITURA ENTRABA (un gate
|
|
86
|
+
* de policy que no rechaza nada, en silencio). Se cierra fail-closed: 500
|
|
87
|
+
* ANTES de tocar el driver, nombrando la causa y la receta. La letra la
|
|
88
|
+
* fija `tests/relations_events_docs.spec.ts` byte a byte.
|
|
89
|
+
*/
|
|
90
|
+
static asyncAssertWrite(operation: string): AuthorizationConfigError;
|
|
91
|
+
/**
|
|
92
|
+
* **`assertWrite` devolvió un VEREDICTO** (2.4.0-alpha.3, cierre del 🟠 3 /
|
|
93
|
+
* 🟡 4 del auditor): `assertWrite: (ref) => allowed.has(ref.object.type)`
|
|
94
|
+
* compila bajo `--strict` (cualquier retorno es asignable a `void`) y hasta
|
|
95
|
+
* el cierre el `false` se IGNORABA y la escritura entraba — el mismo
|
|
96
|
+
* fail-open que H2, y más frecuente que el `async`. `assertWrite` no
|
|
97
|
+
* devuelve veredictos: LANZA o no lanza. Todo retorno distinto de
|
|
98
|
+
* `undefined` es 500 ANTES del driver — también un `true` (un veredicto
|
|
99
|
+
* positivo es el mismo error de modelo: quien lo escribió cree que el
|
|
100
|
+
* `false` deniega) y también una FUNCIÓN con `.then` (el thenable que no
|
|
101
|
+
* es `typeof 'object'` y esquivaba la guarda de H2).
|
|
102
|
+
*/
|
|
103
|
+
static assertWriteReturned(operation: string, result: unknown): AuthorizationConfigError;
|
|
104
|
+
}
|
|
105
|
+
/** Un thenable, sea objeto o FUNCIÓN con `.then` (la forma que esquivaba `typeof result === 'object'`). */
|
|
106
|
+
export declare function isThenable(value: unknown): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* **Marca de ESCRITURA PARCIAL** (invariante 13, `2.4.0-alpha.3`, cierre del
|
|
109
|
+
* 🟡 6 del auditor). Una escritura del puerto que NO es una sola sentencia ni
|
|
110
|
+
* un solo `Write` —la purga de `openfga`, que recorre ortografías × tipos con
|
|
111
|
+
* varios `Read`+`deleteTuples`— puede fallar DESPUÉS de haber borrado parte:
|
|
112
|
+
* ese fallo no es «esa escritura no ocurrió» (que es lo que un 503 no-timeout
|
|
113
|
+
* significa para una escritura atómica) sino «puede haber ocurrido», lo mismo
|
|
114
|
+
* que un deadline vencido. El driver marca el error con `markPartialWrite`
|
|
115
|
+
* antes de propagarlo, y el manager (`#write`) notifica `onRelationWrite` con
|
|
116
|
+
* `indeterminate: true` ANTES de propagar, exactamente como con
|
|
117
|
+
* `AuthorizationBackendTimeoutError`. La marca es una propiedad
|
|
118
|
+
* (`partialWrite: true`) y no una clase: el error que se propaga conserva su
|
|
119
|
+
* clase y su `code` (503 `E_AUTHZ_BACKEND_UNAVAILABLE`, 500
|
|
120
|
+
* `E_AUTHZ_PURGE_INCOMPLETE`…) — lo que cambia es solo la auditoría. Un driver
|
|
121
|
+
* de terceros cuya purga sea multi-request tiene el mismo deber.
|
|
122
|
+
*/
|
|
123
|
+
export declare function markPartialWrite<E extends object>(error: E): E & {
|
|
124
|
+
partialWrite: true;
|
|
125
|
+
};
|
|
126
|
+
/** ¿El error viene marcado como escritura parcial (`markPartialWrite`)? */
|
|
127
|
+
export declare function isPartialWrite(error: unknown): boolean;
|
|
81
128
|
/**
|
|
82
129
|
* Invariante interno del motor violado (una escritura sin scopes, un batchCheck
|
|
83
130
|
* incompleto). 500: es un bug del paquete o de quien lo extiende, no del
|
|
@@ -347,6 +394,32 @@ export declare class UnsupportedOperationError extends Exception {
|
|
|
347
394
|
static status: number;
|
|
348
395
|
static code: string;
|
|
349
396
|
constructor(method: string, primitive: string, driver: string, hint?: string);
|
|
397
|
+
/**
|
|
398
|
+
* **Puerta 1 de `{ transaction }`** (L-2, panel `{trx}` (C)): la operación
|
|
399
|
+
* pidió escribir en la transacción del consumidor y el driver activo no
|
|
400
|
+
* declara `transactionalWrites: true`. 500 y no 422 por precedente
|
|
401
|
+
* (`membersOf`, `purgeRole`): no es una pregunta mal formada, es un
|
|
402
|
+
* despliegue que no casa con lo que se le pidió. La letra lleva la salida.
|
|
403
|
+
*/
|
|
404
|
+
static transactional(operation: string, driver: string, port: 'roles' | 'relations'): UnsupportedOperationError;
|
|
405
|
+
/**
|
|
406
|
+
* **El mismo rechazo, dicho por el DRIVER `openfga`** (L-5, defensa en
|
|
407
|
+
* profundidad como F-05 en L-0): `manager.driver()` es la salida documentada
|
|
408
|
+
* de las barreras y con `{ transaction }` entraría por aquí saltándose la
|
|
409
|
+
* puerta 1; el driver no puede intentar un `Write` que finja ir en la
|
|
410
|
+
* transacción del consumidor. Misma clase, mismo `code`, misma letra; la
|
|
411
|
+
* frase final dice que no hay salida por el driver — la alternativa que SÍ
|
|
412
|
+
* existe para el ÁRBOL es la outbox de scopes (encola en tu transacción);
|
|
413
|
+
* para HECHOS y relaciones no hay outbox (descartada por el panel `{trx}`:
|
|
414
|
+
* fail-open medido).
|
|
415
|
+
*/
|
|
416
|
+
static transactionalDriver(operation: string, driver: string, port: 'roles' | 'relations'): UnsupportedOperationError;
|
|
417
|
+
/**
|
|
418
|
+
* La API de delegación no admite `{ transaction }` (L-2, §1.4 del veredicto):
|
|
419
|
+
* escribe el catálogo por `withAuthzCatalogWrite`, que ES el serializador
|
|
420
|
+
* entre procesos (invariante 14); moverla al commit del consumidor lo anula.
|
|
421
|
+
*/
|
|
422
|
+
static transactionalCatalog(operation: string): UnsupportedOperationError;
|
|
350
423
|
}
|
|
351
424
|
/**
|
|
352
425
|
* Una vista de `forRequest()` se usó para LEER después de `maxAgeMs` (2D ·
|
|
@@ -600,7 +673,11 @@ export declare class ScopeDriftUnguardedError extends Exception {
|
|
|
600
673
|
* {type:'role_binding', id:<roleUuid>}, S)` escribía la tupla del binding y
|
|
601
674
|
* `check(evil, can_<P>, S)` devolvía `true` (escalada a `roles.authorize`,
|
|
602
675
|
* medida por el auditor). Junto con ⚪4 (un tipo reservado no se puede
|
|
603
|
-
* declarar) la colisión deja de existir en vez de vigilarse.
|
|
676
|
+
* declarar) la colisión deja de existir en vez de vigilarse. **Desde L-0 el
|
|
677
|
+
* mismo 422 lo lanzan también los dos drivers** en `relate`/`unrelate`, antes
|
|
678
|
+
* de tocar el backend (`assertRelationDeclared`, una sola función): el
|
|
679
|
+
* manager cortaba, pero `manager.driver()` y `reconcileRelations` entran por
|
|
680
|
+
* el driver y la escalada seguía abierta por ahí (panel `{trx}`, 🔴 2).
|
|
604
681
|
*/
|
|
605
682
|
export declare class RelationTypeUnknownError extends Exception {
|
|
606
683
|
static status: number;
|
|
@@ -609,8 +686,10 @@ export declare class RelationTypeUnknownError extends Exception {
|
|
|
609
686
|
/**
|
|
610
687
|
* **F-05, cara de la RELACIÓN.** El `object.type` está declarado, pero la
|
|
611
688
|
* `relation` no es una de las suyas en `defineRelationsConfig`. Mismo 422
|
|
612
|
-
* antes de tocar el driver
|
|
613
|
-
*
|
|
689
|
+
* antes de tocar el driver —y, desde L-0, también en el driver antes de tocar
|
|
690
|
+
* el backend—: una relación no declarada podría, en un futuro modelo, mapear a
|
|
691
|
+
* una relación propia de `facts` (hoy `document#assignee` en `openfga` salía
|
|
692
|
+
* como un 503 mal clasificado del servidor).
|
|
614
693
|
*/
|
|
615
694
|
export declare class RelationUnknownError extends Exception {
|
|
616
695
|
static status: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACtD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAgC;gBAE/B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAG9D;AAED;;;;;GAKG;AACH,qBAAa,gCAAiC,SAAQ,yBAAyB;IAC7E,MAAM,CAAC,IAAI,SAA4B;gBAE3B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAIlF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;gBAE3B,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAG9C;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAyB;CACrC;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmB;
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACtD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAgC;gBAE/B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAG9D;AAED;;;;;GAKG;AACH,qBAAa,gCAAiC,SAAQ,yBAAyB;IAC7E,MAAM,CAAC,IAAI,SAA4B;gBAE3B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,OAAO;CAIlF;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;gBAE3B,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO;CAG9C;AAED;;;;;GAKG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAyB;CACrC;AAED;;;;GAIG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmB;IAE9B;;;;;;;;;OASG;IACH,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,wBAAwB;IAUpE;;;;;;;;;;;OAWG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,wBAAwB;CAWzF;AAED,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAMlD;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,GAAG;IAAE,YAAY,EAAE,IAAI,CAAA;CAAE,CAWvF;AAED,2EAA2E;AAC3E,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAEtD;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;IACvD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAqB;CACjC;AAED;;;;;;GAMG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA0B;CACtC;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA8B;CAC1C;AAED;;;;GAIG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAyB;gBAExB,UAAU,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM;CAOnD;AAED;;;;;;GAMG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA2B;CACvC;AAED;;;;;;;;;GASG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmC;CAC/C;AAED;;;;;GAKG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA2B;CACvC;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmC;CAC/C;AAED;;;;;;;GAOG;AACH,qBAAa,2BAA4B,SAAQ,SAAS;IACxD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAqC;CACjD;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA0B;CACtC;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED,8EAA8E;AAC9E,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA+B;gBAE9B,IAAI,EAAE,MAAM;CAGzB;AAED;;;;;;GAMG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA+B;gBAE9B,IAAI,EAAE,OAAO;CAQ1B;AAED;;;;;GAKG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAwB;CACpC;AAED;;;;GAIG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED;;;;;;;;;;GAUG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA2B;CACvC;AAED;;;;GAIG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA2B;CACvC;AAED;;;;;;;GAOG;AACH,qBAAa,cAAe,SAAQ,SAAS;IAC3C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAuB;CACnC;AAED;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;CACxC;AAED;;;;;;GAMG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAkC;CAC9C;AAED;;;;;;GAMG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;CACxC;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,SAAS;IACpD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAgC;CAC5C;AAED;;;;;GAKG;AACH,qBAAa,iBAAkB,SAAQ,SAAS;IAC9C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA2B;CACvC;AAED;;;;;GAKG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACtD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAwB;gBAEvB,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAO5E;;;;;;OAMG;IACH,MAAM,CAAC,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,yBAAyB;IAa/G;;;;;;;;;;OAUG;IACH,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,WAAW,GAAG,yBAAyB;IASrH;;;;OAIG;IACH,MAAM,CAAC,oBAAoB,CAAC,SAAS,EAAE,MAAM,GAAG,yBAAyB;CAS1E;AAED;;;;;;GAMG;AACH,qBAAa,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAyB;CACrC;AAED;;;;GAIG;AACH,qBAAa,0BAA2B,SAAQ,SAAS;IACvD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAoC;CAChD;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;IAClD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA+B;CAC3C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,qBAAsB,SAAQ,SAAS;IAMhD,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAChG,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IAN7H,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA8B;gBAGvC,OAAO,EAAE,MAAM,EACN,MAAM,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,EACvF,OAAO,EAAE,aAAa,CAAC;QAAE,IAAI,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,IAAI,EAAE,MAAM,CAAC;YAAC,SAAS,EAAE,MAAM,CAAC;YAAC,KAAK,EAAE,MAAM,CAAA;SAAE,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,EAC3H,OAAO,CAAC,EAAE,YAAY;CAIzB;AAED;;;;;;GAMG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAiC;CAC7C;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;CACxC;AAED;;;;;;;;;;;GAWG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA4B;CACxC;AAED;;;;;;;;GAQG;AACH,qBAAa,mBAAoB,SAAQ,SAAS;IAChD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmB;IAE9B,uEAAuE;IACvE,QAAQ,CAAC,SAAS,QAAO;CAC1B;AAED;;;;;;;;;;GAUG;AACH,qBAAa,eAAgB,SAAQ,SAAS;IAC5C,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAwB;CACpC;AAED;;;;;;;;;;;;GAYG;AACH,qBAAa,yBAA0B,SAAQ,SAAS;IACtD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAmC;CAC/C;AAED;;;;;;;;;;;;;;GAcG;AACH,qBAAa,sBAAuB,SAAQ,SAAS;IACnD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAgC;CAC5C;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAkC;CAC9C;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,qBAAa,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAAkC;CAC9C;AAED;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,SAAM;IACnB,MAAM,CAAC,IAAI,SAA6B;CACzC"}
|
package/build/src/errors.js
CHANGED
|
@@ -84,6 +84,84 @@ export class InvalidSlugError extends Exception {
|
|
|
84
84
|
export class AuthorizationConfigError extends Exception {
|
|
85
85
|
static status = 500;
|
|
86
86
|
static code = 'E_AUTHZ_CONFIG';
|
|
87
|
+
/**
|
|
88
|
+
* **`assertWrite` devolvió una promesa** (2.4.0-alpha.3 · D3, hallazgo H2).
|
|
89
|
+
* `assertWrite(ref): void` es SÍNCRONO y puro a propósito (R-13), pero
|
|
90
|
+
* TypeScript no lo defiende: `assertWrite: async (ref) => { throw … }`
|
|
91
|
+
* compila —una función que devuelve `Promise<void>` es asignable a `void`—,
|
|
92
|
+
* y hasta alpha.3 la promesa se descartaba y la ESCRITURA ENTRABA (un gate
|
|
93
|
+
* de policy que no rechaza nada, en silencio). Se cierra fail-closed: 500
|
|
94
|
+
* ANTES de tocar el driver, nombrando la causa y la receta. La letra la
|
|
95
|
+
* fija `tests/relations_events_docs.spec.ts` byte a byte.
|
|
96
|
+
*/
|
|
97
|
+
static asyncAssertWrite(operation) {
|
|
98
|
+
return new AuthorizationConfigError(`${operation}: assertWrite devolvió una promesa (thenable) y tiene que ser SÍNCRONO y puro (R-13): ` +
|
|
99
|
+
`el manager no la espera, así que un rechazo asíncrono no habría rechazado nada y la escritura ` +
|
|
100
|
+
`habría entrado (fail-open). No se ha tocado el driver. La policy que necesita actor, base de datos ` +
|
|
101
|
+
`o await va en el servicio del consumidor, ANTES de llamar a relate/unrelate; assertWrite solo ` +
|
|
102
|
+
`recibe la referencia de la tupla y lanza o vuelve.`);
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* **`assertWrite` devolvió un VEREDICTO** (2.4.0-alpha.3, cierre del 🟠 3 /
|
|
106
|
+
* 🟡 4 del auditor): `assertWrite: (ref) => allowed.has(ref.object.type)`
|
|
107
|
+
* compila bajo `--strict` (cualquier retorno es asignable a `void`) y hasta
|
|
108
|
+
* el cierre el `false` se IGNORABA y la escritura entraba — el mismo
|
|
109
|
+
* fail-open que H2, y más frecuente que el `async`. `assertWrite` no
|
|
110
|
+
* devuelve veredictos: LANZA o no lanza. Todo retorno distinto de
|
|
111
|
+
* `undefined` es 500 ANTES del driver — también un `true` (un veredicto
|
|
112
|
+
* positivo es el mismo error de modelo: quien lo escribió cree que el
|
|
113
|
+
* `false` deniega) y también una FUNCIÓN con `.then` (el thenable que no
|
|
114
|
+
* es `typeof 'object'` y esquivaba la guarda de H2).
|
|
115
|
+
*/
|
|
116
|
+
static assertWriteReturned(operation, result) {
|
|
117
|
+
if (isThenable(result))
|
|
118
|
+
return AuthorizationConfigError.asyncAssertWrite(operation);
|
|
119
|
+
const shape = result === null ? 'null' : Array.isArray(result) ? 'array' : typeof result;
|
|
120
|
+
return new AuthorizationConfigError(`${operation}: assertWrite devolvió un valor (${shape}) y assertWrite no devuelve veredictos: LANZA ` +
|
|
121
|
+
`para rechazar o vuelve sin valor para permitir (R-13). Un 'false' devuelto no denegaba nada y la ` +
|
|
122
|
+
`escritura entraba (fail-open); un 'true' es el mismo error de modelo. No se ha tocado el driver. ` +
|
|
123
|
+
`La policy que necesita actor, base de datos o await va en el servicio del consumidor, ANTES de ` +
|
|
124
|
+
`llamar a relate/unrelate.`);
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/** Un thenable, sea objeto o FUNCIÓN con `.then` (la forma que esquivaba `typeof result === 'object'`). */
|
|
128
|
+
export function isThenable(value) {
|
|
129
|
+
return (value !== null &&
|
|
130
|
+
(typeof value === 'object' || typeof value === 'function') &&
|
|
131
|
+
typeof value.then === 'function');
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* **Marca de ESCRITURA PARCIAL** (invariante 13, `2.4.0-alpha.3`, cierre del
|
|
135
|
+
* 🟡 6 del auditor). Una escritura del puerto que NO es una sola sentencia ni
|
|
136
|
+
* un solo `Write` —la purga de `openfga`, que recorre ortografías × tipos con
|
|
137
|
+
* varios `Read`+`deleteTuples`— puede fallar DESPUÉS de haber borrado parte:
|
|
138
|
+
* ese fallo no es «esa escritura no ocurrió» (que es lo que un 503 no-timeout
|
|
139
|
+
* significa para una escritura atómica) sino «puede haber ocurrido», lo mismo
|
|
140
|
+
* que un deadline vencido. El driver marca el error con `markPartialWrite`
|
|
141
|
+
* antes de propagarlo, y el manager (`#write`) notifica `onRelationWrite` con
|
|
142
|
+
* `indeterminate: true` ANTES de propagar, exactamente como con
|
|
143
|
+
* `AuthorizationBackendTimeoutError`. La marca es una propiedad
|
|
144
|
+
* (`partialWrite: true`) y no una clase: el error que se propaga conserva su
|
|
145
|
+
* clase y su `code` (503 `E_AUTHZ_BACKEND_UNAVAILABLE`, 500
|
|
146
|
+
* `E_AUTHZ_PURGE_INCOMPLETE`…) — lo que cambia es solo la auditoría. Un driver
|
|
147
|
+
* de terceros cuya purga sea multi-request tiene el mismo deber.
|
|
148
|
+
*/
|
|
149
|
+
export function markPartialWrite(error) {
|
|
150
|
+
try {
|
|
151
|
+
Object.defineProperty(error, 'partialWrite', { value: true, enumerable: false, configurable: true });
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// Cierre-2 (⚪ 4 del re-ataque): un error CONGELADO (`Object.freeze`, un SDK
|
|
155
|
+
// o una capa intermedia) no admite la propiedad. Lanzar aquí sustituiría el
|
|
156
|
+
// 503/500 real por un `TypeError` sin `code` ni `status`, justo en el camino
|
|
157
|
+
// de una purga que ya borró: se propaga el ORIGINAL sin marca (se pierde el
|
|
158
|
+
// `indeterminate` de esa purga, no la clasificación del error).
|
|
159
|
+
}
|
|
160
|
+
return error;
|
|
161
|
+
}
|
|
162
|
+
/** ¿El error viene marcado como escritura parcial (`markPartialWrite`)? */
|
|
163
|
+
export function isPartialWrite(error) {
|
|
164
|
+
return error !== null && typeof error === 'object' && error.partialWrite === true;
|
|
87
165
|
}
|
|
88
166
|
/**
|
|
89
167
|
* Invariante interno del motor violado (una escritura sin scopes, un batchCheck
|
|
@@ -368,6 +446,58 @@ export class UnsupportedOperationError extends Exception {
|
|
|
368
446
|
super(`${primitive} necesita '${method}' y el driver '${driver}' no lo implementa: es un método opcional del ` +
|
|
369
447
|
`puerto (2.1) que este driver tiene que añadir para usar esta primitiva.` + (hint ? ` ${hint}` : ''));
|
|
370
448
|
}
|
|
449
|
+
/**
|
|
450
|
+
* **Puerta 1 de `{ transaction }`** (L-2, panel `{trx}` (C)): la operación
|
|
451
|
+
* pidió escribir en la transacción del consumidor y el driver activo no
|
|
452
|
+
* declara `transactionalWrites: true`. 500 y no 422 por precedente
|
|
453
|
+
* (`membersOf`, `purgeRole`): no es una pregunta mal formada, es un
|
|
454
|
+
* despliegue que no casa con lo que se le pidió. La letra lleva la salida.
|
|
455
|
+
*/
|
|
456
|
+
static transactional(operation, driver, port) {
|
|
457
|
+
const error = new UnsupportedOperationError('transactionalWrites', operation, driver);
|
|
458
|
+
error.message =
|
|
459
|
+
`${operation}: se pidió escribir en la transacción del consumidor ({ transaction }) y el driver '${driver}' ` +
|
|
460
|
+
`declara transactionalWrites: false (o no la declara): no puede inscribir la escritura en tu transacción ` +
|
|
461
|
+
`(«los dos o ninguno» sería falso; en openfga una tupla no entra en una transacción SQL). No se ha tocado el ` +
|
|
462
|
+
`driver. Salidas: usa el driver 'database' para ${port === 'roles' ? 'los hechos' : 'las relaciones'}, o ` +
|
|
463
|
+
`declara requireTransactionalWrites: true en config/authorization.ts` +
|
|
464
|
+
`${port === 'relations' ? ' (o en relations.requireTransactionalWrites)' : ''} para que esto falle al ARRANCAR ` +
|
|
465
|
+
`en vez de en esta ruta. Sin { transaction } la misma llamada entra.`;
|
|
466
|
+
return error;
|
|
467
|
+
}
|
|
468
|
+
/**
|
|
469
|
+
* **El mismo rechazo, dicho por el DRIVER `openfga`** (L-5, defensa en
|
|
470
|
+
* profundidad como F-05 en L-0): `manager.driver()` es la salida documentada
|
|
471
|
+
* de las barreras y con `{ transaction }` entraría por aquí saltándose la
|
|
472
|
+
* puerta 1; el driver no puede intentar un `Write` que finja ir en la
|
|
473
|
+
* transacción del consumidor. Misma clase, mismo `code`, misma letra; la
|
|
474
|
+
* frase final dice que no hay salida por el driver — la alternativa que SÍ
|
|
475
|
+
* existe para el ÁRBOL es la outbox de scopes (encola en tu transacción);
|
|
476
|
+
* para HECHOS y relaciones no hay outbox (descartada por el panel `{trx}`:
|
|
477
|
+
* fail-open medido).
|
|
478
|
+
*/
|
|
479
|
+
static transactionalDriver(operation, driver, port) {
|
|
480
|
+
const error = UnsupportedOperationError.transactional(operation, driver, port);
|
|
481
|
+
error.message +=
|
|
482
|
+
` Rechazado por el DRIVER '${driver}' (no por el manager): entrar por manager.driver() no es una salida — ` +
|
|
483
|
+
`una tupla del store no puede inscribirse en tu transacción ni fingirlo. Para el ÁRBOL de scopes la salida ` +
|
|
484
|
+
`que existe es scopes.outbox (encola en tu transacción y authz:scopes:relay aplica); para hechos y relaciones no hay outbox.`;
|
|
485
|
+
return error;
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* La API de delegación no admite `{ transaction }` (L-2, §1.4 del veredicto):
|
|
489
|
+
* escribe el catálogo por `withAuthzCatalogWrite`, que ES el serializador
|
|
490
|
+
* entre procesos (invariante 14); moverla al commit del consumidor lo anula.
|
|
491
|
+
*/
|
|
492
|
+
static transactionalCatalog(operation) {
|
|
493
|
+
const error = new UnsupportedOperationError('transactionalWrites', operation, 'catalog');
|
|
494
|
+
error.message =
|
|
495
|
+
`${operation}: { transaction } no se admite en la API de delegación: el catálogo se escribe por ` +
|
|
496
|
+
`withAuthzCatalogWrite (cerrojo de la fila de versión + bump como última sentencia, invariante 14), que es el ` +
|
|
497
|
+
`serializador del catálogo entre procesos; inscribirlo en tu transacción lo anularía. Solo grant/revoke/deny/` +
|
|
498
|
+
`removeDeny (hechos) y relate/unrelate/purge* (relaciones) admiten { transaction }.`;
|
|
499
|
+
return error;
|
|
500
|
+
}
|
|
371
501
|
}
|
|
372
502
|
/**
|
|
373
503
|
* Una vista de `forRequest()` se usó para LEER después de `maxAgeMs` (2D ·
|
|
@@ -599,7 +729,11 @@ export class ScopeDriftUnguardedError extends Exception {
|
|
|
599
729
|
* {type:'role_binding', id:<roleUuid>}, S)` escribía la tupla del binding y
|
|
600
730
|
* `check(evil, can_<P>, S)` devolvía `true` (escalada a `roles.authorize`,
|
|
601
731
|
* medida por el auditor). Junto con ⚪4 (un tipo reservado no se puede
|
|
602
|
-
* declarar) la colisión deja de existir en vez de vigilarse.
|
|
732
|
+
* declarar) la colisión deja de existir en vez de vigilarse. **Desde L-0 el
|
|
733
|
+
* mismo 422 lo lanzan también los dos drivers** en `relate`/`unrelate`, antes
|
|
734
|
+
* de tocar el backend (`assertRelationDeclared`, una sola función): el
|
|
735
|
+
* manager cortaba, pero `manager.driver()` y `reconcileRelations` entran por
|
|
736
|
+
* el driver y la escalada seguía abierta por ahí (panel `{trx}`, 🔴 2).
|
|
603
737
|
*/
|
|
604
738
|
export class RelationTypeUnknownError extends Exception {
|
|
605
739
|
static status = 422;
|
|
@@ -608,8 +742,10 @@ export class RelationTypeUnknownError extends Exception {
|
|
|
608
742
|
/**
|
|
609
743
|
* **F-05, cara de la RELACIÓN.** El `object.type` está declarado, pero la
|
|
610
744
|
* `relation` no es una de las suyas en `defineRelationsConfig`. Mismo 422
|
|
611
|
-
* antes de tocar el driver
|
|
612
|
-
*
|
|
745
|
+
* antes de tocar el driver —y, desde L-0, también en el driver antes de tocar
|
|
746
|
+
* el backend—: una relación no declarada podría, en un futuro modelo, mapear a
|
|
747
|
+
* una relación propia de `facts` (hoy `document#assignee` en `openfga` salía
|
|
748
|
+
* como un 503 mal clasificado del servidor).
|
|
613
749
|
*/
|
|
614
750
|
export class RelationUnknownError extends Exception {
|
|
615
751
|
static status = 422;
|
package/build/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAA;AAErD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,OAAO,yBAA0B,SAAQ,SAAS;IACtD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,6BAA6B,CAAA;IAE3C,YAAY,MAAc,EAAE,SAAiB,EAAE,KAAc;QAC3D,KAAK,CAAC,+BAA+B,MAAM,mBAAmB,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACxF,CAAC;;AAGH;;;;;GAKG;AACH,MAAM,OAAO,gCAAiC,SAAQ,yBAAyB;IAC7E,MAAM,CAAC,IAAI,GAAG,yBAAyB,CAAA;IAEvC,YAAY,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAE,KAAe;QAC/E,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,KAAK,CAAC,CAAA;QAC/B,IAAI,CAAC,OAAO,GAAG,+BAA+B,MAAM,qBAAqB,SAAS,QAAQ,SAAS,GAAG,CAAA;IACxG,CAAC;;AAGH;;;;GAIG;AACH,MAAM,OAAO,kBAAmB,SAAQ,SAAS;IAC/C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,yBAAyB,CAAA;IAEvC,YAAY,SAAiB,EAAE,KAAc;QAC3C,KAAK,CAAC,8CAA8C,SAAS,GAAG,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9E,CAAC;;AAGH;;;;;GAKG;AACH,MAAM,OAAO,oBAAqB,SAAQ,SAAS;IACjD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,0BAA0B,CAAA;;AAG1C;;;;GAIG;AACH,MAAM,OAAO,gBAAiB,SAAQ,SAAS;IAC7C,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,sBAAsB,CAAA;;AAGtC;;;;GAIG;AACH,MAAM,OAAO,wBAAyB,SAAQ,SAAS;IACrD,MAAM,CAAC,MAAM,GAAG,GAAG,CAAA;IACnB,MAAM,CAAC,IAAI,GAAG,gBAAgB,CAAA;;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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"}
|
package/build/src/freeze.d.ts
CHANGED
|
@@ -35,6 +35,21 @@
|
|
|
35
35
|
* congelado»: el mismo patrón que la fila `id = 1` del memo. Un upsert
|
|
36
36
|
* perezoso desde la barrera sería una escritura en el camino de lectura,
|
|
37
37
|
* fuera de `withAuthzCatalogWrite`, y una carrera gratis.
|
|
38
|
+
*
|
|
39
|
+
* **La barrera se lee SIEMPRE por la conexión del motor, nunca por un
|
|
40
|
+
* cliente del llamante** (L-1 · 🟠 8, dictamen del juez del panel `{trx}`).
|
|
41
|
+
* Hasta L-1 `readFreezeRow` aceptaba `client` —la transacción del consumidor,
|
|
42
|
+
* «para no interbloquear un pool de 1»— y eso convertía la AUTORIDAD en una
|
|
43
|
+
* decisión del llamante: un cliente que responde «no congelado», o el
|
|
44
|
+
* snapshot REPEATABLE READ de una transacción abierta ANTES del freeze, dejaba
|
|
45
|
+
* entrar la escritura (medido: auditor C1 en SQLite; MySQL/PG en
|
|
46
|
+
* `freeze.spec.ts`). La regla: *la escritura va por tu transacción; la
|
|
47
|
+
* autoridad que decide si puedes escribir, nunca*. El precio, decidido por el
|
|
48
|
+
* dueño: `{ transaction }` exige pool ≥ 2 — con pool 1 la lectura de la
|
|
49
|
+
* barrera espera una conexión que el llamante sostiene y sale **503
|
|
50
|
+
* `E_AUTHZ_BACKEND_TIMEOUT` al vencer SU deadline** (`withDeadline`, porque
|
|
51
|
+
* el `timeout()` de knex NO cubre la espera del pool: medido, 60 s), jamás
|
|
52
|
+
* un cuelgue ni un bypass.
|
|
38
53
|
*/
|
|
39
54
|
/** La fila del freeze durable (la `id = 1` es la versión del catálogo). */
|
|
40
55
|
export declare const FREEZE_ROW_ID = 2;
|
|
@@ -59,28 +74,34 @@ export interface FreezeRow {
|
|
|
59
74
|
export interface FreezeSqlOptions {
|
|
60
75
|
/** Etiqueta del driver en los errores 503 (default `freeze`). */
|
|
61
76
|
driver?: string;
|
|
62
|
-
/** Deadline de cada consulta (default 5000): vencido ⇒ 503. */
|
|
63
|
-
timeoutMs?: number;
|
|
64
77
|
/**
|
|
65
|
-
*
|
|
66
|
-
*
|
|
67
|
-
* barrera
|
|
68
|
-
* sostiene la suya, y con un pool de 1 (SQLite `:memory:`) eso es un
|
|
69
|
-
* interbloqueo, no una lectura. El precio, declarado: en un motor cuyo
|
|
70
|
-
* aislamiento por defecto congela la foto de las lecturas (InnoDB
|
|
71
|
-
* REPEATABLE READ), un freeze puesto DESPUÉS de abrir esa transacción
|
|
72
|
-
* puede no verse desde dentro — la misma ventana que una escritura que ya
|
|
73
|
-
* pasó su barrera (tester A4), y por eso la promesa publicada es «otro
|
|
74
|
-
* proceso recibe 503», no «ninguna escritura entra».
|
|
78
|
+
* Deadline TOTAL de cada consulta (default 5000), espera del pool incluida:
|
|
79
|
+
* vencido ⇒ 503 `E_AUTHZ_BACKEND_TIMEOUT`. No hay opción para leer por otro
|
|
80
|
+
* cliente: la barrera es autoridad y va por la conexión del motor (L-1).
|
|
75
81
|
*/
|
|
76
|
-
|
|
77
|
-
from: (table: string) => any;
|
|
78
|
-
};
|
|
82
|
+
timeoutMs?: number;
|
|
79
83
|
}
|
|
80
|
-
/**
|
|
84
|
+
/**
|
|
85
|
+
* Lee la fila del freeze **por la conexión del motor** (503 clasificado si la
|
|
86
|
+
* base no responde o el pool no da una conexión en `timeoutMs`; 503 «migración
|
|
87
|
+
* no aplicada» si no existe). No acepta cliente: es la autoridad (L-1 · 🟠 8).
|
|
88
|
+
*/
|
|
81
89
|
export declare function readFreezeRow(options?: FreezeSqlOptions): Promise<FreezeRow>;
|
|
82
90
|
/** ¿Está VIVO este freeze en el instante `nowMs`? (motivo puesto y lease sin vencer; `untilMs: null` no vence). */
|
|
83
91
|
export declare function freezeIsLive(row: FreezeRow, nowMs: number): boolean;
|
|
92
|
+
export interface FreezeBarrierOptions extends FreezeSqlOptions {
|
|
93
|
+
/** Milisegundos de PARED del reloj del config (el mismo que decide caducidades). */
|
|
94
|
+
nowMs: number;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* **La barrera del freeze**, la MISMA para los dos motores (roles y
|
|
98
|
+
* relations, L-1 · J1): lee la fila por la conexión del motor y lanza 503
|
|
99
|
+
* `E_AUTHZ_FROZEN` (reintentable) si hay un freeze vivo en `nowMs`. Va
|
|
100
|
+
* delante de TODA escritura, antes de validar identidades o tocar el driver:
|
|
101
|
+
* durante una ventana una escritura no se valida a medias, se rechaza entera.
|
|
102
|
+
* Nunca recibe un cliente del llamante — ver el docblock del módulo.
|
|
103
|
+
*/
|
|
104
|
+
export declare function assertNotFrozenRow(operation: string, options: FreezeBarrierOptions): Promise<void>;
|
|
84
105
|
/**
|
|
85
106
|
* Toma el freeze si NADIE lo sostiene vivo (condicional y atómico: dos
|
|
86
107
|
* `acquire` a la vez acaban en exactamente uno). Devuelve el token, o `null`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"AAKA
|
|
1
|
+
{"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"AAKA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,aAAa,IAAI,CAAA;AAE9B,wIAAwI;AACxI,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAI7C,4EAA4E;AAC5E,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,CAAA;AAE9D,iGAAiG;AACjG,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,KAAK,EAAE,MAAM,CAAA;IACb,+DAA+D;IAC/D,MAAM,EAAE,MAAM,CAAA;CACf;AAED,oDAAoD;AACpD,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAA;IACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd;AAED,MAAM,WAAW,gBAAgB;IAC/B,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAA;IACf;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAyCD;;;;GAIG;AACH,wBAAsB,aAAa,CAAC,OAAO,GAAE,gBAAqB,GAAG,OAAO,CAAC,SAAS,CAAC,CAkBtF;AAED,mHAAmH;AACnH,wBAAgB,YAAY,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAGnE;AAED,MAAM,WAAW,oBAAqB,SAAQ,gBAAgB;IAC5D,oFAAoF;IACpF,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,IAAI,CAAC,CAQxG;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EAChF,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CA8B7B;AAED;;;;;GAKG;AACH,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,EACzC,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC,OAAO,CAAC,CAYlB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,EACxB,OAAO,GAAE,gBAAqB,GAC7B,OAAO,CAAC;IAAE,QAAQ,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,CAAA;CAAE,CAAC,CAejD;AAED,+EAA+E;AAC/E,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,GAAG,UAAU,GAAG,SAAS,CAG1E"}
|
package/build/src/freeze.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import db from '@adonisjs/lucid/services/db';
|
|
2
|
-
import { guardSql } from './shared/backend_guard.js';
|
|
3
|
-
import { AuthorizationBackendError } from './errors.js';
|
|
2
|
+
import { guardSql, withDeadline } from './shared/backend_guard.js';
|
|
3
|
+
import { AuthorizationBackendError, AuthorizationBackendTimeoutError, AuthorizationFrozenError } from './errors.js';
|
|
4
4
|
import { CATALOG_VERSION_TABLE } from './catalog/catalog_cache.js';
|
|
5
5
|
/**
|
|
6
6
|
* El **freeze DURABLE** (3b-7; decisión del dueño del 2026-08-31 (3b):
|
|
@@ -39,6 +39,21 @@ import { CATALOG_VERSION_TABLE } from './catalog/catalog_cache.js';
|
|
|
39
39
|
* congelado»: el mismo patrón que la fila `id = 1` del memo. Un upsert
|
|
40
40
|
* perezoso desde la barrera sería una escritura en el camino de lectura,
|
|
41
41
|
* fuera de `withAuthzCatalogWrite`, y una carrera gratis.
|
|
42
|
+
*
|
|
43
|
+
* **La barrera se lee SIEMPRE por la conexión del motor, nunca por un
|
|
44
|
+
* cliente del llamante** (L-1 · 🟠 8, dictamen del juez del panel `{trx}`).
|
|
45
|
+
* Hasta L-1 `readFreezeRow` aceptaba `client` —la transacción del consumidor,
|
|
46
|
+
* «para no interbloquear un pool de 1»— y eso convertía la AUTORIDAD en una
|
|
47
|
+
* decisión del llamante: un cliente que responde «no congelado», o el
|
|
48
|
+
* snapshot REPEATABLE READ de una transacción abierta ANTES del freeze, dejaba
|
|
49
|
+
* entrar la escritura (medido: auditor C1 en SQLite; MySQL/PG en
|
|
50
|
+
* `freeze.spec.ts`). La regla: *la escritura va por tu transacción; la
|
|
51
|
+
* autoridad que decide si puedes escribir, nunca*. El precio, decidido por el
|
|
52
|
+
* dueño: `{ transaction }` exige pool ≥ 2 — con pool 1 la lectura de la
|
|
53
|
+
* barrera espera una conexión que el llamante sostiene y sale **503
|
|
54
|
+
* `E_AUTHZ_BACKEND_TIMEOUT` al vencer SU deadline** (`withDeadline`, porque
|
|
55
|
+
* el `timeout()` de knex NO cubre la espera del pool: medido, 60 s), jamás
|
|
56
|
+
* un cuelgue ni un bypass.
|
|
42
57
|
*/
|
|
43
58
|
/** La fila del freeze durable (la `id = 1` es la versión del catálogo). */
|
|
44
59
|
export const FREEZE_ROW_ID = 2;
|
|
@@ -48,6 +63,17 @@ const DEFAULT_FREEZE_TIMEOUT_MS = 5_000;
|
|
|
48
63
|
function opts(options) {
|
|
49
64
|
return { driver: options.driver ?? 'freeze', timeoutMs: options.timeoutMs ?? DEFAULT_FREEZE_TIMEOUT_MS };
|
|
50
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Una consulta del freeze con deadline TOTAL. `guardSql` fija el `timeout()`
|
|
68
|
+
* de knex, que solo cuenta desde que la consulta tiene conexión: si el pool
|
|
69
|
+
* está agotado (el llamante sostiene la única conexión de `:memory:`), la
|
|
70
|
+
* espera la gobierna `acquireConnectionTimeout` (60 s por defecto) — medido,
|
|
71
|
+
* L-1. `withDeadline` cubre también esa espera, así que con pool 1 la
|
|
72
|
+
* barrera responde 503 en `timeoutMs`, no en un minuto.
|
|
73
|
+
*/
|
|
74
|
+
function freezeSql(driver, operation, timeoutMs, fn) {
|
|
75
|
+
return withDeadline(guardSql(driver, operation, timeoutMs, fn), timeoutMs, () => new AuthorizationBackendTimeoutError(driver, operation, timeoutMs));
|
|
76
|
+
}
|
|
51
77
|
function missingRow(driver) {
|
|
52
78
|
const error = new AuthorizationBackendError(driver, 'freeze.row', new Error(`no hay fila id = ${FREEZE_ROW_ID} en ${CATALOG_VERSION_TABLE}`));
|
|
53
79
|
error.message =
|
|
@@ -62,11 +88,14 @@ function toMs(raw) {
|
|
|
62
88
|
const value = typeof raw === 'number' ? raw : Number(raw);
|
|
63
89
|
return Number.isFinite(value) ? value : null;
|
|
64
90
|
}
|
|
65
|
-
/**
|
|
91
|
+
/**
|
|
92
|
+
* Lee la fila del freeze **por la conexión del motor** (503 clasificado si la
|
|
93
|
+
* base no responde o el pool no da una conexión en `timeoutMs`; 503 «migración
|
|
94
|
+
* no aplicada» si no existe). No acepta cliente: es la autoridad (L-1 · 🟠 8).
|
|
95
|
+
*/
|
|
66
96
|
export async function readFreezeRow(options = {}) {
|
|
67
97
|
const { driver, timeoutMs } = opts(options);
|
|
68
|
-
const
|
|
69
|
-
const rows = await guardSql(driver, 'freeze.read', timeoutMs, () => client
|
|
98
|
+
const rows = await freezeSql(driver, 'freeze.read', timeoutMs, () => db
|
|
70
99
|
.from(CATALOG_VERSION_TABLE)
|
|
71
100
|
.where('id', FREEZE_ROW_ID)
|
|
72
101
|
.select('freeze_reason', 'freeze_holder', 'freeze_until_ms', 'freeze_fence'));
|
|
@@ -89,6 +118,22 @@ export function freezeIsLive(row, nowMs) {
|
|
|
89
118
|
return false;
|
|
90
119
|
return row.untilMs === null || row.untilMs > nowMs;
|
|
91
120
|
}
|
|
121
|
+
/**
|
|
122
|
+
* **La barrera del freeze**, la MISMA para los dos motores (roles y
|
|
123
|
+
* relations, L-1 · J1): lee la fila por la conexión del motor y lanza 503
|
|
124
|
+
* `E_AUTHZ_FROZEN` (reintentable) si hay un freeze vivo en `nowMs`. Va
|
|
125
|
+
* delante de TODA escritura, antes de validar identidades o tocar el driver:
|
|
126
|
+
* durante una ventana una escritura no se valida a medias, se rechaza entera.
|
|
127
|
+
* Nunca recibe un cliente del llamante — ver el docblock del módulo.
|
|
128
|
+
*/
|
|
129
|
+
export async function assertNotFrozenRow(operation, options) {
|
|
130
|
+
const row = await readFreezeRow(options);
|
|
131
|
+
if (!freezeIsLive(row, options.nowMs))
|
|
132
|
+
return;
|
|
133
|
+
const lift = freezeKindOf(row.holder) === 'operator' ? ' (la levanta authz:unfreeze)' : '';
|
|
134
|
+
throw new AuthorizationFrozenError(`${operation}: el motor de autorización está congelado (${row.reason})${lift} y no acepta escrituras. ` +
|
|
135
|
+
`Las lecturas siguen funcionando; reintenta esta escritura cuando la ventana termine.`);
|
|
136
|
+
}
|
|
92
137
|
/**
|
|
93
138
|
* Toma el freeze si NADIE lo sostiene vivo (condicional y atómico: dos
|
|
94
139
|
* `acquire` a la vez acaban en exactamente uno). Devuelve el token, o `null`
|
|
@@ -97,7 +142,7 @@ export function freezeIsLive(row, nowMs) {
|
|
|
97
142
|
*/
|
|
98
143
|
export async function acquireFreeze(input, options = {}) {
|
|
99
144
|
const { driver, timeoutMs } = opts(options);
|
|
100
|
-
const updated = await
|
|
145
|
+
const updated = await freezeSql(driver, 'freeze.acquire', timeoutMs, () => db
|
|
101
146
|
.from(CATALOG_VERSION_TABLE)
|
|
102
147
|
.where('id', FREEZE_ROW_ID)
|
|
103
148
|
.where((q) => {
|
|
@@ -134,7 +179,7 @@ export async function acquireFreeze(input, options = {}) {
|
|
|
134
179
|
*/
|
|
135
180
|
export async function renewFreeze(token, input, options = {}) {
|
|
136
181
|
const { driver, timeoutMs } = opts(options);
|
|
137
|
-
const updated = await
|
|
182
|
+
const updated = await freezeSql(driver, 'freeze.renew', timeoutMs, () => db
|
|
138
183
|
.from(CATALOG_VERSION_TABLE)
|
|
139
184
|
.where('id', FREEZE_ROW_ID)
|
|
140
185
|
.where('freeze_fence', token.fence)
|
|
@@ -156,7 +201,7 @@ export async function releaseFreeze(token, input, options = {}) {
|
|
|
156
201
|
const lapsed = !mine || (row.untilMs !== null && row.untilMs <= input.nowMs);
|
|
157
202
|
if (!mine)
|
|
158
203
|
return { released: false, lapsed };
|
|
159
|
-
const updated = await
|
|
204
|
+
const updated = await freezeSql(driver, 'freeze.release', timeoutMs, () => db
|
|
160
205
|
.from(CATALOG_VERSION_TABLE)
|
|
161
206
|
.where('id', FREEZE_ROW_ID)
|
|
162
207
|
.where('freeze_fence', token.fence)
|
package/build/src/freeze.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"freeze.js","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;
|
|
1
|
+
{"version":3,"file":"freeze.js","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"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"}
|
package/build/src/manager.d.ts
CHANGED
|
@@ -63,6 +63,18 @@ export interface FreezeStatus {
|
|
|
63
63
|
untilMs: number | null;
|
|
64
64
|
fence: number;
|
|
65
65
|
}
|
|
66
|
+
/**
|
|
67
|
+
* Lo que `withFrozenWrites` le cuenta a la pasada que corre dentro (L-1 · J1):
|
|
68
|
+
* el fence de la ventana, su lease y si se PERDIÓ a mitad (`lapsed`), para
|
|
69
|
+
* que una pasada de plataforma ajena al manager publique la garantía en vez
|
|
70
|
+
* de suponerla (`report.frozen`).
|
|
71
|
+
*/
|
|
72
|
+
export interface FrozenWindow {
|
|
73
|
+
fence: number;
|
|
74
|
+
leaseMs: number | null;
|
|
75
|
+
/** ¿Se perdió la ventana en algún momento? (renovación fallida, fila ajena o vencida). */
|
|
76
|
+
lapsed: () => Promise<boolean>;
|
|
77
|
+
}
|
|
66
78
|
/**
|
|
67
79
|
* Manager de autorización — la fachada que usan middleware, services y
|
|
68
80
|
* seeders. Resuelve el driver activo del config y notifica cada escritura
|
|
@@ -169,7 +181,10 @@ export declare class AuthorizationManager {
|
|
|
169
181
|
* A1.1/A1.3): si este manager ya sostiene el freeze, la ventana interior
|
|
170
182
|
* no toma otro ni lo levanta al salir — la exterior sigue en pie.
|
|
171
183
|
*/
|
|
172
|
-
withFrozenWrites<T>(reason: string, fn: () => Promise<T
|
|
184
|
+
withFrozenWrites<T>(reason: string, fn: (window: FrozenWindow) => Promise<T>, options?: {
|
|
185
|
+
kind?: FreezeKind;
|
|
186
|
+
operatorAsContext?: boolean;
|
|
187
|
+
}): Promise<T>;
|
|
173
188
|
/** Solo tests: fuerza re-resolución del driver. */
|
|
174
189
|
clearCachedDriver(): void;
|
|
175
190
|
/**
|