@jantstack/adonis-authz 2.4.0-alpha.1 → 2.4.0-alpha.2
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 +248 -18
- 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 +12 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +10 -0
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +7 -0
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +36 -0
- 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 +47 -9
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +318 -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 +27 -6
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +140 -16
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +35 -3
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +61 -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 +17 -0
- package/build/src/relations/define_relations_config.d.ts.map +1 -1
- package/build/src/relations/define_relations_config.js +30 -1
- package/build/src/relations/define_relations_config.js.map +1 -1
- package/build/src/relations/manager.d.ts +25 -3
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +76 -19
- 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 +432 -17
- 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 +197 -10
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js.map +1 -1
- package/build/stubs/migration.stub +20 -10
- package/package.json +1 -1
package/build/src/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/errors.ts"],"names":[],"mappings":"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
|
|
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":"AAAA,OAAO,EAAE,MAAM,6BAA6B,CAAA;AAC5C,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAA;AAClE,OAAO,EAAE,yBAAyB,EAAE,gCAAgC,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAA;AACnH,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAElE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoDG;AAEH,2EAA2E;AAC3E,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAA;AAE9B,wIAAwI;AACxI,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAA;AAE7C,MAAM,yBAAyB,GAAG,KAAK,CAAA;AAgCvC,SAAS,IAAI,CAAC,OAAyB;IACrC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,IAAI,yBAAyB,EAAE,CAAA;AAC1G,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,SAAS,CAAI,MAAc,EAAE,SAAiB,EAAE,SAAiB,EAAE,EAAoB;IAC9F,OAAO,YAAY,CACjB,QAAQ,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,EAC1C,SAAS,EACT,GAAG,EAAE,CAAC,IAAI,gCAAgC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CACzE,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,MAAc;IAChC,MAAM,KAAK,GAAG,IAAI,yBAAyB,CACzC,MAAM,EACN,YAAY,EACZ,IAAI,KAAK,CAAC,oBAAoB,aAAa,OAAO,qBAAqB,EAAE,CAAC,CAC3E,CAAA;IACD,KAAK,CAAC,OAAO;QACX,GAAG,MAAM,4CAA4C,qBAAqB,UAAU,aAAa,KAAK;YACtG,kHAAkH;YAClH,uFAAuF,CAAA;IACzF,OAAO,KAAK,CAAA;AACd,CAAC;AAED,SAAS,IAAI,CAAC,GAAY;IACxB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAA;IAClD,MAAM,KAAK,GAAG,OAAO,GAAG,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;IACzD,OAAO,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CAAC,UAA4B,EAAE;IAChE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,IAAI,GAAU,MAAM,SAAS,CAAC,MAAM,EAAE,aAAa,EAAE,SAAS,EAAE,GAAG,EAAE,CACzE,EAAE;SACC,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;SAC1B,MAAM,CAAC,eAAe,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,CAAC,CAC/E,CAAA;IACD,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC;QAAE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;IACnB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,CAAA;IACpC,IAAI,KAAK,KAAK,IAAI;QAAE,MAAM,UAAU,CAAC,MAAM,CAAC,CAAA;IAC5C,OAAO;QACL,MAAM,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QACxG,MAAM,EAAE,GAAG,CAAC,aAAa,KAAK,IAAI,IAAI,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC;QACxG,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC;QAClC,KAAK;KACN,CAAA;AACH,CAAC;AAED,mHAAmH;AACnH,MAAM,UAAU,YAAY,CAAC,GAAc,EAAE,KAAa;IACxD,IAAI,GAAG,CAAC,MAAM,KAAK,IAAI;QAAE,OAAO,KAAK,CAAA;IACrC,OAAO,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,GAAG,KAAK,CAAA;AACpD,CAAC;AAOD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,OAA6B;IACvF,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC;QAAE,OAAM;IAC7C,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,EAAE,CAAA;IAC1F,MAAM,IAAI,wBAAwB,CAChC,GAAG,SAAS,8CAA8C,GAAG,CAAC,MAAM,IAAI,IAAI,2BAA2B;QACrG,sFAAsF,CACzF,CAAA;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAgF,EAChF,UAA4B,EAAE;IAE9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,EAAE,CACxE,EAAE;SACC,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;SAC1B,KAAK,CAAC,CAAC,CAAM,EAAE,EAAE;QAChB,sEAAsE;QACtE,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC,OAAO,CAAC,CAAC,OAAY,EAAE,EAAE;YACpD,OAAO,CAAC,YAAY,CAAC,iBAAiB,CAAC,CAAC,QAAQ,CAAC,iBAAiB,EAAE,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,CAAA;QACxF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC;SACD,MAAM,CAAC;QACN,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,aAAa,EAAE,KAAK,CAAC,MAAM;QAC3B,eAAe,EAAE,KAAK,CAAC,OAAO;QAC9B,YAAY,EAAE,EAAE,CAAC,GAAG,CAAC,kBAAkB,CAAC;QACxC,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC;KAClC,CAAC,CACL,CAAA;IACD,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,qEAAqE;QACrE,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;QACxC,IAAI,YAAY,CAAC,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;YAAE,OAAO,IAAI,CAAA;QAC/C,gFAAgF;QAChF,OAAO,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;IACtC,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACxC,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM;QAAE,OAAO,IAAI,CAAA,CAAC,6EAA6E;IAC1H,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAA;AACnD,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,KAAkB,EAClB,KAAyC,EACzC,UAA4B,EAAE;IAE9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,cAAc,EAAE,SAAS,EAAE,GAAG,EAAE,CACtE,EAAE;SACC,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;SAC1B,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;SAClC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;SACpC,KAAK,CAAC,iBAAiB,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC;SAC1C,MAAM,CAAC,EAAE,eAAe,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CACjF,CAAA;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;AAC5B,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAkB,EAClB,KAAwB,EACxB,UAA4B,EAAE;IAE9B,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;IAC3C,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,OAAO,CAAC,CAAA;IACxC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAA;IACrE,MAAM,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,KAAK,IAAI,IAAI,GAAG,CAAC,OAAO,IAAI,KAAK,CAAC,KAAK,CAAC,CAAA;IAC5E,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,EAAE,CAAA;IAC7C,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,GAAG,EAAE,CACxE,EAAE;SACC,IAAI,CAAC,qBAAqB,CAAC;SAC3B,KAAK,CAAC,IAAI,EAAE,aAAa,CAAC;SAC1B,KAAK,CAAC,cAAc,EAAE,KAAK,CAAC,KAAK,CAAC;SAClC,KAAK,CAAC,eAAe,EAAE,KAAK,CAAC,MAAM,CAAC;SACpC,MAAM,CAAC,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,eAAe,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAClH,CAAA;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,CAAA;AAClD,CAAC;AAED,+EAA+E;AAC/E,MAAM,UAAU,YAAY,CAAC,MAAqB;IAChD,MAAM,MAAM,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACvC,OAAO,MAAM,KAAK,UAAU,IAAI,MAAM,KAAK,WAAW,IAAI,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAA;AACtG,CAAC"}
|
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
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;
|
|
1
|
+
{"version":3,"file":"manager.d.ts","sourceRoot":"","sources":["../../src/manager.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAA;AA0B7D,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAqC1D,OAAO,KAAK,EACV,mBAAmB,EAEnB,gBAAgB,EAGhB,WAAW,EACX,cAAc,EACd,WAAW,EACX,OAAO,EACP,eAAe,EACf,YAAY,EACZ,YAAY,EACZ,SAAS,EAGT,iBAAiB,EACjB,cAAc,EAGd,gBAAgB,EAChB,eAAe,EAIf,kBAAkB,EAElB,gBAAgB,EAChB,QAAQ,EAER,qBAAqB,EACrB,SAAS,EACT,UAAU,EAEX,MAAM,YAAY,CAAA;AAuBnB;;;;;GAKG;AACH,MAAM,MAAM,iBAAiB,GAAG,IAAI,CAClC,oBAAoB,EAClB,WAAW,GACX,SAAS,GACT,cAAc,GACd,YAAY,GACZ,WAAW,GACX,gBAAgB,GAChB,OAAO,GACP,QAAQ,GACR,MAAM,GACN,YAAY,GACZ,QAAQ,GACR,QAAQ,GACR,YAAY,GACZ,UAAU,GACV,YAAY,GACZ,sBAAsB,GACtB,eAAe,GACf,kBAAkB,GAClB,wBAAwB,GACxB,kBAAkB,GAClB,kBAAkB,GAClB,kBAAkB,CACrB,CAAA;AAED;;;;;GAKG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,iBAAiB,EAAE,QAAQ,EAAE,eAAe,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC,CAEhH;AAED,qGAAqG;AACrG,eAAO,MAAM,kBAAkB,OAAQ,CAAA;AACvC,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAC7C;;;;;;GAMG;AACH,eAAO,MAAM,eAAe,WAAa,CAAA;AACzC;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,MAAM,CAAA;AACtC,eAAO,MAAM,mBAAmB,QAAS,CAAA;AAGzC,gGAAgG;AAChG,eAAO,MAAM,uBAAuB,QAAS,CAAA;AAE7C,MAAM,WAAW,iBAAiB;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB;;;;OAIG;IACH,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CACnB;AAgBD,4FAA4F;AAC5F,MAAM,WAAW,YAAY;IAC3B,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,UAAU,GAAG,SAAS,CAAA;IAC5B,8EAA8E;IAC9E,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,KAAK,EAAE,MAAM,CAAA;CACd;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,OAAO,EAAE,MAAM,GAAG,IAAI,CAAA;IACtB,0FAA0F;IAC1F,MAAM,EAAE,MAAM,OAAO,CAAC,OAAO,CAAC,CAAA;CAC/B;AAOD;;;;;;;;GAQG;AACH,qBAAa,oBAAoB;;gBAwBnB,MAAM,EAAE,mBAAmB;IAkCvC;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,OAAO,GAAE,iBAAsB,GAAG,iBAAiB;IAmB9D;;;;;;;;;;;;;;OAcG;IACG,MAAM,IAAI,OAAO,CAAC,mBAAmB,CAAC;IAiH5C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAkCG;IACG,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,CAAC,EAAE,UAAU,CAAA;KAAO,GAAG,OAAO,CAAC,WAAW,CAAC;IA4DjH;;;OAGG;IACG,QAAQ,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,OAAO,CAAC;IAiBpD;;;;OAIG;IACH,IAAI,MAAM,IAAI,OAAO,CAEpB;IAED,mGAAmG;IAC7F,YAAY,IAAI,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAYlD;;;;;;;OAOG;IACG,gBAAgB,CAAC,CAAC,EACtB,MAAM,EAAE,MAAM,EACd,EAAE,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE;QAAE,IAAI,CAAC,EAAE,UAAU,CAAC;QAAC,iBAAiB,CAAC,EAAE,OAAO,CAAA;KAAO,GAC/D,OAAO,CAAC,CAAC,CAAC;IAyHb,mDAAmD;IACnD,iBAAiB,IAAI,IAAI;IAiCzB;;;;;;;OAOG;IACH,QAAQ,CAAC,MAAM;0BAOW,QAAQ,UAAU,QAAQ,YAAY,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAAC;QAiBnG;;;;;;;;;;;;WAYG;uBACkB,QAAQ,aAAa,QAAQ,YAAY,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAAC;QAenG;;;;;;;;;;;;;;;;;;;;;;WAsBG;0BACqB,QAAQ,YAAY,qBAAqB,KAAG,OAAO,CAAC,IAAI,CAAC;MA6ClF;IAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2CG;IACG,iBAAiB,CACrB,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GACrE,OAAO,CAAC,gBAAgB,CAAC;IAkJ5B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OAsCG;IACG,SAAS,CACb,OAAO,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,GAAG,gBAAgB,GACxD,OAAO,CAAC,eAAe,CAAC;IA+Z3B;;;;;OAKG;IACG,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IA8J5D,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAKrF,OAAO,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC;IAKtF;;;;;;;;OAQG;IACG,aAAa,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA0BpG,2GAA2G;IACrG,YAAY,CAAC,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC;IAKrE,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKxE,SAAS,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAKlE,cAAc,CAAC,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,CAAC;IAKpF,mHAAmH;IAC7G,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAM3E;;;;;;;OAOG;IACG,oBAAoB,CAAC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,QAAQ,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IAiKnF;;;;;;;;;;;;;;;OAeG;IACG,gBAAgB,CACpB,KAAK,EAAE,UAAU,EACjB,UAAU,EAAE,QAAQ,EACpB,IAAI,EAAE,cAAc,EACpB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC;IAoGvB;;;;;;;;OAQG;IACG,gBAAgB,CACpB,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,iBAAiB,EAC1B,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC;IA4FvB;;;;;;OAMG;IACG,gBAAgB,CAAC,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAsBxG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2FG;IACG,gBAAgB,CAAC,OAAO,GAAE;QAAE,KAAK,CAAC,EAAE,OAAO,CAAC;QAAC,cAAc,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC;QAC3F,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,WAAW,CAAC;YAAC,KAAK,EAAE,QAAQ,CAAC;YAAC,WAAW,EAAE,MAAM,EAAE,CAAC;YAAC,WAAW,EAAE,MAAM,GAAG,SAAS,CAAC;YAAC,aAAa,EAAE,OAAO,GAAG,SAAS,CAAA;SAAE,CAAC,CAAA;QAClJ,MAAM,EAAE,cAAc,EAAE,CAAA;QACxB,OAAO,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,cAAc,CAAC;YAAC,MAAM,EAAE,iBAAiB,CAAA;SAAE,CAAC,CAAA;QACnE,2FAA2F;QAC3F,SAAS,EAAE,OAAO,CAAA;QAClB,MAAM,EAAE,OAAO,CAAA;KAChB,CAAC;IAshBF;;;;;;OAMG;IACG,KAAK,CACT,OAAO,EAAE,UAAU,EACnB,IAAI,EAAE,SAAS,EACf,KAAK,EAAE,QAAQ,EACf,OAAO,CAAC,EAAE,YAAY,GACrB,OAAO,CAAC,YAAY,CAAC;IA6CxB;;;;;OAKG;IACG,MAAM,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAkB1G,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAUpG,UAAU,CAAC,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC;IAUvH;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACG,gBAAgB,CACpB,OAAO,EAAE,UAAU,EACnB,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,SAAS,EACpB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,gBAAgB,CAAC;IAoE5B;;;;;;;OAOG;IACG,sBAAsB,CAC1B,QAAQ,EAAE,eAAe,EAAE,EAC3B,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAA;KAAO,GACnC,OAAO,CAAC,QAAQ,EAAE,CAAC;CA8NvB"}
|
package/build/src/manager.js
CHANGED
|
@@ -4,7 +4,7 @@ import { v7 as uuidv7 } from 'uuid';
|
|
|
4
4
|
import { assertCatalogUuid, assertIdentity, assertScope, assertScopeType, assertSubject, assertValidSlug, chainKeysFrom, normalizeRoleQuery, scopeFromKey, scopeKey, scopeSpellings, } from './identity.js';
|
|
5
5
|
import { expiryChanged } from './expiry.js';
|
|
6
6
|
import { randomBytes } from 'node:crypto';
|
|
7
|
-
import { DEFAULT_FREEZE_LEASE_MS, acquireFreeze, freezeIsLive, freezeKindOf, readFreezeRow, releaseFreeze, renewFreeze, } from './freeze.js';
|
|
7
|
+
import { DEFAULT_FREEZE_LEASE_MS, acquireFreeze, freezeIsLive, freezeKindOf, readFreezeRow, assertNotFrozenRow, releaseFreeze, renewFreeze, } from './freeze.js';
|
|
8
8
|
import { assertKnownScope, isAuthzError, resolveChain, rootOnlyResolver } from './shared/backend_guard.js';
|
|
9
9
|
import { CatalogCache, GLOBAL_OWNER_KEY, invalidateAuthzCatalog, isRoleVisibleWith, readLocalRoles, withAuthzCatalogWrite } from './catalog/catalog_cache.js';
|
|
10
10
|
import { assertAssignableAt } from './catalog/catalog.js';
|
|
@@ -196,10 +196,65 @@ export class AuthorizationManager {
|
|
|
196
196
|
}
|
|
197
197
|
driver = driver.withClock(clock);
|
|
198
198
|
}
|
|
199
|
+
this.#assertTransactionalWritesRequired(driver);
|
|
199
200
|
this.#assertScopeDriftGuarded(driver);
|
|
200
201
|
this.#driver = driver;
|
|
201
202
|
return driver;
|
|
202
203
|
}
|
|
204
|
+
/**
|
|
205
|
+
* **Puerta 2 de `{ transaction }`** (L-2, opt-in): con
|
|
206
|
+
* `requireTransactionalWrites: true` el driver activo tiene que declarar
|
|
207
|
+
* `transactionalWrites: true` o el manager falla AL RESOLVERLO — antes de
|
|
208
|
+
* cachearlo, así que toda lectura, toda escritura y `driver()` fallan igual:
|
|
209
|
+
* el despliegue no arranca. Es la forma honesta de «fallar al construirse»:
|
|
210
|
+
* el roadmap lo pedía incondicional y eso haría `openfga` inconstruible en
|
|
211
|
+
* cualquier app que solo lo tenga registrado (y el driver se resuelve
|
|
212
|
+
* perezosamente y por nombre, así que al construir no se sabe si alguien
|
|
213
|
+
* pasará `{ transaction }`). Quien quiera fallar al arrancar, lo pide.
|
|
214
|
+
*/
|
|
215
|
+
#assertTransactionalWritesRequired(driver) {
|
|
216
|
+
if (this.#config.requireTransactionalWrites !== true)
|
|
217
|
+
return;
|
|
218
|
+
if (driver.capabilities?.transactionalWrites === true)
|
|
219
|
+
return;
|
|
220
|
+
throw new AuthorizationConfigError(`config.requireTransactionalWrites está en true y el driver '${this.#config.default}' declara ` +
|
|
221
|
+
`transactionalWrites: ${driver.capabilities ? String(driver.capabilities.transactionalWrites) : 'nada (sin capabilities)'}: ` +
|
|
222
|
+
`no puede inscribir grant/revoke/deny/removeDeny en la transacción del consumidor («los dos o ninguno»), así ` +
|
|
223
|
+
`que el manager no se resuelve. Usa un driver que la declare (database) o quita requireTransactionalWrites.`);
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* **Puerta 1 de `{ transaction }`** (L-2, siempre activa): una escritura de
|
|
227
|
+
* HECHOS con `{ transaction }` a un driver que no declara
|
|
228
|
+
* `transactionalWrites: true` es 500 `E_AUTHZ_UNSUPPORTED` nombrando driver
|
|
229
|
+
* y operación, ANTES de la barrera, de la identidad y del driver (cero
|
|
230
|
+
* llamadas). Nunca se ignora, nunca un `logger.warn`: aceptarla y no
|
|
231
|
+
* cumplirla sería publicar con nuestra firma la fuga del cruce 4 · S5.
|
|
232
|
+
* `scopes.*` NO pasa por aquí: su `transaction` ENCOLA (encolar ≠ escribir).
|
|
233
|
+
*/
|
|
234
|
+
async #assertTransactionalWrite(options, operation) {
|
|
235
|
+
if (options?.transaction === undefined || options.transaction === null)
|
|
236
|
+
return;
|
|
237
|
+
const driver = await this.driver();
|
|
238
|
+
if (driver.capabilities?.transactionalWrites === true)
|
|
239
|
+
return;
|
|
240
|
+
throw UnsupportedOperationError.transactional(operation, this.#config.default, 'roles');
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* La marca del evento de una escritura inscrita en la transacción del
|
|
244
|
+
* llamante (L-3): `onWrite` se dispara cuando el DRIVER vuelve, y en ese
|
|
245
|
+
* momento la fila existe solo dentro de esa transacción — es un hecho si y
|
|
246
|
+
* solo si el llamante confirma, cosa que el paquete nunca ve. Quien audita
|
|
247
|
+
* lo necesita para no registrar como firme lo que un rollback deshace.
|
|
248
|
+
*/
|
|
249
|
+
#transactional(options) {
|
|
250
|
+
return options?.transaction === undefined || options.transaction === null ? {} : { transactional: true };
|
|
251
|
+
}
|
|
252
|
+
/** La API de delegación no admite `{ transaction }` (§1.4 del veredicto `{trx}`): 500 antes de tocar nada. */
|
|
253
|
+
#assertNoTransaction(options, operation) {
|
|
254
|
+
if (options?.transaction === undefined || options.transaction === null)
|
|
255
|
+
return;
|
|
256
|
+
throw UnsupportedOperationError.transactionalCatalog(operation);
|
|
257
|
+
}
|
|
203
258
|
/**
|
|
204
259
|
* **El gate de deriva del árbol, en el MANAGER** (3b-2e · E3; cierra el
|
|
205
260
|
* agujero que declaró el 3b-2d).
|
|
@@ -366,10 +421,16 @@ export class AuthorizationManager {
|
|
|
366
421
|
* A1.1/A1.3): si este manager ya sostiene el freeze, la ventana interior
|
|
367
422
|
* no toma otro ni lo levanta al salir — la exterior sigue en pie.
|
|
368
423
|
*/
|
|
369
|
-
async withFrozenWrites(reason, fn) {
|
|
370
|
-
|
|
424
|
+
async withFrozenWrites(reason, fn, options = {}) {
|
|
425
|
+
// L-1 · J1: una pasada que quiera correr DENTRO de la ventana del
|
|
426
|
+
// operador (el cutover) y publicar su `lapsed` —`authz:relations:reconcile`,
|
|
427
|
+
// que vive fuera de este manager— pide `kind: 'reconcile'` y
|
|
428
|
+
// `operatorAsContext: true`, lo mismo que hace `reconcile` de roles.
|
|
429
|
+
const context = await this.#durableFreezeContext(reason, options.kind ?? 'platform', {
|
|
430
|
+
operatorAsContext: options.operatorAsContext === true,
|
|
431
|
+
});
|
|
371
432
|
try {
|
|
372
|
-
return await fn();
|
|
433
|
+
return await fn({ fence: context.fence, leaseMs: context.leaseMs, lapsed: context.lapsed });
|
|
373
434
|
}
|
|
374
435
|
finally {
|
|
375
436
|
await context.release();
|
|
@@ -454,25 +515,23 @@ export class AuthorizationManager {
|
|
|
454
515
|
* freeze, y con `catalogRevalidate: { everyMs }` la fila del memo ni se
|
|
455
516
|
* lee.
|
|
456
517
|
*/
|
|
457
|
-
async #assertNotFrozen(operation
|
|
518
|
+
async #assertNotFrozen(operation) {
|
|
458
519
|
const root = this.#root();
|
|
459
520
|
const held = root.#heldFreeze;
|
|
460
521
|
if (held) {
|
|
461
522
|
throw new AuthorizationFrozenError(`${operation}: el motor de autorización está congelado (${held.reason}) y no acepta escrituras. ` +
|
|
462
523
|
`Las lecturas siguen funcionando; reintenta esta escritura cuando la operación termine.`);
|
|
463
524
|
}
|
|
464
|
-
//
|
|
465
|
-
// por
|
|
466
|
-
// un pool de 1
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
throw new AuthorizationFrozenError(`${operation}: el motor de autorización está congelado (${row.reason})${lift} y no acepta escrituras. ` +
|
|
475
|
-
`Las lecturas siguen funcionando; reintenta esta escritura cuando la ventana termine.`);
|
|
525
|
+
// La fila se lee SIEMPRE por la conexión del motor (L-1 · 🟠 8). Hasta
|
|
526
|
+
// L-1 se leía por la transacción del consumidor si la escritura llegaba
|
|
527
|
+
// con una —«para no interbloquear un pool de 1»—, y eso era el agujero:
|
|
528
|
+
// la barrera la decidía el snapshot del llamante (medido en SQLite, MySQL
|
|
529
|
+
// y PG). Con pool 1 el precio es un 503 con deadline, no un bypass.
|
|
530
|
+
await assertNotFrozenRow(operation, {
|
|
531
|
+
driver: this.#config.default,
|
|
532
|
+
nowMs: root.#wallMs(),
|
|
533
|
+
timeoutMs: this.#config.freezeTimeoutMs,
|
|
534
|
+
});
|
|
476
535
|
}
|
|
477
536
|
/** Solo tests: fuerza re-resolución del driver. */
|
|
478
537
|
clearCachedDriver() {
|
|
@@ -1163,7 +1222,10 @@ export class AuthorizationManager {
|
|
|
1163
1222
|
* `{}` si no hay actor: el evento no inventa autores).
|
|
1164
1223
|
*/
|
|
1165
1224
|
async #writeOptions(options, operation) {
|
|
1166
|
-
|
|
1225
|
+
// Sin cast sobre `transaction` (L-1 · 🟠 8): la barrera no lee nada del
|
|
1226
|
+
// llamante, y `transaction` solo lo consumen los tipos que lo declaran
|
|
1227
|
+
// (`ScopeTreeWriteOptions`, para ENCOLAR — nunca para decidir).
|
|
1228
|
+
await this.#assertNotFrozen(operation);
|
|
1167
1229
|
if (options?.actor !== undefined)
|
|
1168
1230
|
assertSubject(options.actor);
|
|
1169
1231
|
if (this.#config.requireActor === true && !options?.actor) {
|
|
@@ -1594,6 +1656,7 @@ export class AuthorizationManager {
|
|
|
1594
1656
|
* Devuelve el rol y notifica `role_defined`.
|
|
1595
1657
|
*/
|
|
1596
1658
|
async defineScopedRole(actor, ownerScope, spec, options) {
|
|
1659
|
+
this.#assertNoTransaction(options, 'defineScopedRole');
|
|
1597
1660
|
const who = await this.#requireActor(actor, 'defineScopedRole');
|
|
1598
1661
|
this.#assertOwnerScope(ownerScope, 'defineScopedRole');
|
|
1599
1662
|
const parsed = this.#parseScopedRoleSpec(spec);
|
|
@@ -1693,6 +1756,7 @@ export class AuthorizationManager {
|
|
|
1693
1756
|
* escribe ni notifica (idempotente). Notifica `role_updated`.
|
|
1694
1757
|
*/
|
|
1695
1758
|
async updateScopedRole(actor, roleUuid, changes, options) {
|
|
1759
|
+
this.#assertNoTransaction(options, 'updateScopedRole');
|
|
1696
1760
|
const who = await this.#requireActor(actor, 'updateScopedRole');
|
|
1697
1761
|
assertCatalogUuid('rol', roleUuid);
|
|
1698
1762
|
const parsed = this.#parseScopedRoleChanges(changes);
|
|
@@ -1786,6 +1850,7 @@ export class AuthorizationManager {
|
|
|
1786
1850
|
* su owner. Notifica `role_purged`. No necesita `listDenies`.
|
|
1787
1851
|
*/
|
|
1788
1852
|
async deleteScopedRole(actor, roleUuid, options) {
|
|
1853
|
+
this.#assertNoTransaction(options, 'deleteScopedRole');
|
|
1789
1854
|
const who = await this.#requireActor(actor, 'deleteScopedRole');
|
|
1790
1855
|
assertCatalogUuid('rol', roleUuid);
|
|
1791
1856
|
const driver = await this.driver();
|
|
@@ -2397,13 +2462,15 @@ export class AuthorizationManager {
|
|
|
2397
2462
|
* `E_AUTHZ_AMBIGUOUS_ROLE`, nunca «el más cercano gana»).
|
|
2398
2463
|
*/
|
|
2399
2464
|
async grant(subject, role, scope, options) {
|
|
2465
|
+
await this.#assertTransactionalWrite(options, 'grant');
|
|
2400
2466
|
const actor = await this.#writeOptions(options, 'grant');
|
|
2401
2467
|
assertIdentity({ subject, role, scope, expiresAt: options?.expiresAt });
|
|
2402
2468
|
await this.#assertWithin(scope, options, 'grant');
|
|
2403
2469
|
// 3E · Q7: el evento lleva el rol RESUELTO (uuid + slug + nivel + owner),
|
|
2404
2470
|
// no la pregunta cruda. Solo se resuelve si hay hook que lo vaya a leer.
|
|
2405
2471
|
const roles = await this.#resolvedRoles(role, scope, 'grant');
|
|
2406
|
-
const
|
|
2472
|
+
const transactional = this.#transactional(options);
|
|
2473
|
+
const outcome = (await this.#write({ action: 'granted', subject, scope, roles, expiresAt: options?.expiresAt ?? null, ...actor, ...transactional }, async () => (await this.driver()).grant(subject, role, scope, options))) ??
|
|
2407
2474
|
// Un driver de terceros que aún devuelva `void`: la firma promete un
|
|
2408
2475
|
// `GrantOutcome` y no miente (E1). Sin lectura previa no hay caducidad
|
|
2409
2476
|
// anterior que contar: es lo que pidió el llamante, y `existed: false`.
|
|
@@ -2419,6 +2486,7 @@ export class AuthorizationManager {
|
|
|
2419
2486
|
expiresAt: outcome.expiresAt,
|
|
2420
2487
|
previousExpiresAt: outcome.previousExpiresAt,
|
|
2421
2488
|
...actor,
|
|
2489
|
+
...transactional,
|
|
2422
2490
|
});
|
|
2423
2491
|
}
|
|
2424
2492
|
else {
|
|
@@ -2429,6 +2497,7 @@ export class AuthorizationManager {
|
|
|
2429
2497
|
roles,
|
|
2430
2498
|
expiresAt: outcome.expiresAt,
|
|
2431
2499
|
...actor,
|
|
2500
|
+
...transactional,
|
|
2432
2501
|
});
|
|
2433
2502
|
}
|
|
2434
2503
|
return outcome;
|
|
@@ -2440,27 +2509,38 @@ export class AuthorizationManager {
|
|
|
2440
2509
|
* rol.
|
|
2441
2510
|
*/
|
|
2442
2511
|
async revoke(subject, role, scope, options) {
|
|
2512
|
+
await this.#assertTransactionalWrite(options, 'revoke');
|
|
2443
2513
|
const actor = await this.#writeOptions(options, 'revoke');
|
|
2444
2514
|
assertIdentity({ subject, role, scope });
|
|
2445
2515
|
await this.#assertWithin(scope, options, 'revoke');
|
|
2446
|
-
const event = {
|
|
2447
|
-
|
|
2516
|
+
const event = {
|
|
2517
|
+
action: 'revoked',
|
|
2518
|
+
subject,
|
|
2519
|
+
scope,
|
|
2520
|
+
roles: await this.#resolvedRoles(role, scope, 'revoke'),
|
|
2521
|
+
...actor,
|
|
2522
|
+
...this.#transactional(options),
|
|
2523
|
+
};
|
|
2524
|
+
// L-2: las opciones viajan al driver (`transaction`, si la puerta la dejó pasar) — como en `grant`.
|
|
2525
|
+
await this.#write(event, async () => (await this.driver()).revoke(subject, role, scope, options));
|
|
2448
2526
|
await this.#notify(event);
|
|
2449
2527
|
}
|
|
2450
2528
|
async deny(subject, permission, scope, options) {
|
|
2529
|
+
await this.#assertTransactionalWrite(options, 'deny');
|
|
2451
2530
|
const actor = await this.#writeOptions(options, 'deny');
|
|
2452
2531
|
assertIdentity({ subject, permission, scope });
|
|
2453
2532
|
await this.#assertWithin(scope, options, 'deny');
|
|
2454
|
-
const event = { action: 'denied', subject, scope, permission, ...actor };
|
|
2455
|
-
await this.#write(event, async () => (await this.driver()).deny(subject, permission, scope));
|
|
2533
|
+
const event = { action: 'denied', subject, scope, permission, ...actor, ...this.#transactional(options) };
|
|
2534
|
+
await this.#write(event, async () => (await this.driver()).deny(subject, permission, scope, options));
|
|
2456
2535
|
await this.#notify(event);
|
|
2457
2536
|
}
|
|
2458
2537
|
async removeDeny(subject, permission, scope, options) {
|
|
2538
|
+
await this.#assertTransactionalWrite(options, 'removeDeny');
|
|
2459
2539
|
const actor = await this.#writeOptions(options, 'removeDeny');
|
|
2460
2540
|
assertIdentity({ subject, permission, scope });
|
|
2461
2541
|
await this.#assertWithin(scope, options, 'removeDeny');
|
|
2462
|
-
const event = { action: 'deny_removed', subject, scope, permission, ...actor };
|
|
2463
|
-
await this.#write(event, async () => (await this.driver()).removeDeny(subject, permission, scope));
|
|
2542
|
+
const event = { action: 'deny_removed', subject, scope, permission, ...actor, ...this.#transactional(options) };
|
|
2543
|
+
await this.#write(event, async () => (await this.driver()).removeDeny(subject, permission, scope, options));
|
|
2464
2544
|
await this.#notify(event);
|
|
2465
2545
|
}
|
|
2466
2546
|
/**
|
|
@@ -2711,6 +2791,17 @@ export class AuthorizationManager {
|
|
|
2711
2791
|
* `indeterminate: true`, para que quien audita registre "puede haber
|
|
2712
2792
|
* ocurrido" en vez de nada. Cualquier otro fallo (422, conexión rechazada)
|
|
2713
2793
|
* significa que la escritura no ocurrió y se propaga sin evento.
|
|
2794
|
+
*
|
|
2795
|
+
* **Dentro de la transacción del llamante (L-3) el deadline sigue siendo
|
|
2796
|
+
* `indeterminate: true`**, y el evento lleva además `transactional: true`.
|
|
2797
|
+
* El auditor del panel `{trx}` (🟡 12) objetó que ahí «el rollback la
|
|
2798
|
+
* determina»; pero lo que determina el rollback lo determina el LLAMANTE
|
|
2799
|
+
* y el paquete no lo ve: en el instante del 503 la sentencia puede haber
|
|
2800
|
+
* aterrizado en la transacción (SQLite no cancela; en PG la transacción
|
|
2801
|
+
* queda abortada y ya no puede confirmar; en MySQL la sentencia se mata y
|
|
2802
|
+
* la transacción sigue viva) y el llamante puede confirmar o no. Lo
|
|
2803
|
+
* honesto es el mismo «no lo sé» de siempre más la marca de que la última
|
|
2804
|
+
* palabra es su commit. Medido por motor en `database_transaction.spec.ts`.
|
|
2714
2805
|
*/
|
|
2715
2806
|
async #write(event, fn) {
|
|
2716
2807
|
try {
|