@jantstack/adonis-authz 2.4.0-alpha.1 → 2.4.0-alpha.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +496 -29
- package/build/commands/authz_catalog_diff.d.ts.map +1 -1
- package/build/commands/authz_catalog_diff.js +0 -1
- package/build/commands/authz_catalog_diff.js.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.d.ts.map +1 -1
- package/build/commands/authz_catalog_prune_orphans.js +0 -1
- package/build/commands/authz_catalog_prune_orphans.js.map +1 -1
- package/build/commands/authz_freeze.d.ts.map +1 -1
- package/build/commands/authz_freeze.js +1 -2
- package/build/commands/authz_freeze.js.map +1 -1
- package/build/commands/authz_reconcile.d.ts +15 -6
- package/build/commands/authz_reconcile.d.ts.map +1 -1
- package/build/commands/authz_reconcile.js +143 -20
- package/build/commands/authz_reconcile.js.map +1 -1
- package/build/commands/authz_relations_reconcile.d.ts +72 -1
- package/build/commands/authz_relations_reconcile.d.ts.map +1 -1
- package/build/commands/authz_relations_reconcile.js +234 -21
- package/build/commands/authz_relations_reconcile.js.map +1 -1
- package/build/commands/authz_scopes_relay.d.ts +50 -0
- package/build/commands/authz_scopes_relay.d.ts.map +1 -1
- package/build/commands/authz_scopes_relay.js +213 -10
- package/build/commands/authz_scopes_relay.js.map +1 -1
- package/build/commands/authz_scopes_requeue.d.ts +80 -0
- package/build/commands/authz_scopes_requeue.d.ts.map +1 -0
- package/build/commands/authz_scopes_requeue.js +230 -0
- package/build/commands/authz_scopes_requeue.js.map +1 -0
- package/build/commands/authz_unfreeze.d.ts +12 -4
- package/build/commands/authz_unfreeze.d.ts.map +1 -1
- package/build/commands/authz_unfreeze.js +74 -9
- package/build/commands/authz_unfreeze.js.map +1 -1
- package/build/commands/main.d.ts +16 -13
- package/build/commands/main.d.ts.map +1 -1
- package/build/commands/main.js +59 -11
- package/build/commands/main.js.map +1 -1
- package/build/commands/openfga_provision.d.ts +49 -3
- package/build/commands/openfga_provision.d.ts.map +1 -1
- package/build/commands/openfga_provision.js +72 -7
- package/build/commands/openfga_provision.js.map +1 -1
- package/build/index.d.ts +15 -5
- package/build/index.d.ts.map +1 -1
- package/build/index.js +16 -3
- package/build/index.js.map +1 -1
- package/build/providers/authz_provider.d.ts +7 -2
- package/build/providers/authz_provider.d.ts.map +1 -1
- package/build/providers/authz_provider.js +20 -3
- package/build/providers/authz_provider.js.map +1 -1
- package/build/src/define_config.d.ts +106 -1
- package/build/src/define_config.d.ts.map +1 -1
- package/build/src/define_config.js +11 -0
- package/build/src/define_config.js.map +1 -1
- package/build/src/drivers/database_driver.d.ts +53 -14
- package/build/src/drivers/database_driver.d.ts.map +1 -1
- package/build/src/drivers/database_driver.js +104 -32
- package/build/src/drivers/database_driver.js.map +1 -1
- package/build/src/drivers/database_relations_driver.d.ts +74 -9
- package/build/src/drivers/database_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/database_relations_driver.js +391 -93
- package/build/src/drivers/database_relations_driver.js.map +1 -1
- package/build/src/drivers/openfga_driver.d.ts +71 -10
- package/build/src/drivers/openfga_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_driver.js +195 -16
- package/build/src/drivers/openfga_driver.js.map +1 -1
- package/build/src/drivers/openfga_facts.d.ts +15 -0
- package/build/src/drivers/openfga_facts.d.ts.map +1 -1
- package/build/src/drivers/openfga_facts.js +25 -2
- package/build/src/drivers/openfga_facts.js.map +1 -1
- package/build/src/drivers/openfga_relations_driver.d.ts +72 -6
- package/build/src/drivers/openfga_relations_driver.d.ts.map +1 -1
- package/build/src/drivers/openfga_relations_driver.js +308 -50
- package/build/src/drivers/openfga_relations_driver.js.map +1 -1
- package/build/src/errors.d.ts +175 -4
- package/build/src/errors.d.ts.map +1 -1
- package/build/src/errors.js +219 -3
- package/build/src/errors.js.map +1 -1
- package/build/src/freeze.d.ts +100 -20
- package/build/src/freeze.d.ts.map +1 -1
- package/build/src/freeze.js +159 -25
- package/build/src/freeze.js.map +1 -1
- package/build/src/manager.d.ts +239 -7
- package/build/src/manager.d.ts.map +1 -1
- package/build/src/manager.js +1192 -148
- package/build/src/manager.js.map +1 -1
- package/build/src/models/authz_assignment.d.ts +2 -2
- package/build/src/models/authz_assignment.d.ts.map +1 -1
- package/build/src/models/authz_deny.d.ts +2 -2
- package/build/src/models/authz_deny.d.ts.map +1 -1
- package/build/src/models/authz_permission.d.ts +2 -2
- package/build/src/models/authz_permission.d.ts.map +1 -1
- package/build/src/models/authz_role.d.ts +2 -2
- package/build/src/models/authz_role.d.ts.map +1 -1
- package/build/src/models/authz_role_permission.d.ts +2 -2
- package/build/src/models/authz_role_permission.d.ts.map +1 -1
- package/build/src/relation_partition_trigger.d.ts.map +1 -1
- package/build/src/relation_partition_trigger.js +11 -3
- package/build/src/relation_partition_trigger.js.map +1 -1
- package/build/src/relations/define_relations_config.d.ts +51 -0
- package/build/src/relations/define_relations_config.d.ts.map +1 -1
- package/build/src/relations/define_relations_config.js +68 -1
- package/build/src/relations/define_relations_config.js.map +1 -1
- package/build/src/relations/manager.d.ts +106 -6
- package/build/src/relations/manager.d.ts.map +1 -1
- package/build/src/relations/manager.js +368 -30
- package/build/src/relations/manager.js.map +1 -1
- package/build/src/relations/reconcile.d.ts +81 -6
- package/build/src/relations/reconcile.d.ts.map +1 -1
- package/build/src/relations/reconcile.js +233 -77
- package/build/src/relations/reconcile.js.map +1 -1
- package/build/src/scope_outbox.d.ts +54 -0
- package/build/src/scope_outbox.d.ts.map +1 -1
- package/build/src/scope_outbox.js +274 -33
- package/build/src/scope_outbox.js.map +1 -1
- package/build/src/shared/backend_guard.d.ts +28 -0
- package/build/src/shared/backend_guard.d.ts.map +1 -1
- package/build/src/shared/backend_guard.js +52 -0
- package/build/src/shared/backend_guard.js.map +1 -1
- package/build/src/shared/sql_expiry.d.ts +2 -0
- package/build/src/shared/sql_expiry.d.ts.map +1 -1
- package/build/src/shared/sql_expiry.js +4 -0
- package/build/src/shared/sql_expiry.js.map +1 -1
- package/build/src/shared/transaction_guard.d.ts +53 -0
- package/build/src/shared/transaction_guard.d.ts.map +1 -0
- package/build/src/shared/transaction_guard.js +74 -0
- package/build/src/shared/transaction_guard.js.map +1 -0
- package/build/src/sql_descendants.d.ts +8 -0
- package/build/src/sql_descendants.d.ts.map +1 -1
- package/build/src/sql_descendants.js.map +1 -1
- package/build/src/testing/contract.d.ts +55 -4
- package/build/src/testing/contract.d.ts.map +1 -1
- package/build/src/testing/contract.js +244 -9
- package/build/src/testing/contract.js.map +1 -1
- package/build/src/testing/main.d.ts +6 -4
- package/build/src/testing/main.d.ts.map +1 -1
- package/build/src/testing/main.js +3 -2
- package/build/src/testing/main.js.map +1 -1
- package/build/src/testing/migration_contract.d.ts +9 -0
- package/build/src/testing/migration_contract.d.ts.map +1 -1
- package/build/src/testing/migration_contract.js +5 -2
- package/build/src/testing/migration_contract.js.map +1 -1
- package/build/src/testing/relations_contract.d.ts +23 -1
- package/build/src/testing/relations_contract.d.ts.map +1 -1
- package/build/src/testing/relations_contract.js +603 -19
- package/build/src/testing/relations_contract.js.map +1 -1
- package/build/src/testing/relations_reconcile_contract.d.ts.map +1 -1
- package/build/src/testing/relations_reconcile_contract.js +49 -1
- package/build/src/testing/relations_reconcile_contract.js.map +1 -1
- package/build/src/testing/scope_outbox_contract.d.ts +98 -0
- package/build/src/testing/scope_outbox_contract.d.ts.map +1 -0
- package/build/src/testing/scope_outbox_contract.js +677 -0
- package/build/src/testing/scope_outbox_contract.js.map +1 -0
- package/build/src/traits/has_uuid.d.ts +2 -2
- package/build/src/traits/has_uuid.d.ts.map +1 -1
- package/build/src/types.d.ts +708 -38
- package/build/src/types.d.ts.map +1 -1
- package/build/src/types.js +55 -0
- package/build/src/types.js.map +1 -1
- package/build/stubs/config/authorization.stub +45 -1
- package/build/stubs/migration.stub +20 -10
- package/package.json +1 -1
package/build/src/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,34 +74,88 @@ 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>;
|
|
105
|
+
/** El holder con el que se publica una fila con motivo y SIN holder (legada o a mano); también es su token. */
|
|
106
|
+
export declare const UNKNOWN_HOLDER = "?";
|
|
107
|
+
/** Prefijo del holder de la ventana del OPERADOR (`freeze()` con `kind: 'operator'`). */
|
|
108
|
+
export declare const OPERATOR_HOLDER_PREFIX = "operator:";
|
|
109
|
+
/**
|
|
110
|
+
* `isOperatorHolder` en SQL, por motor (cierre-2 de alpha.10 · C3): los
|
|
111
|
+
* `OPERATOR_HOLDER_PREFIX.length` primeros CARACTERES de `freeze_holder` igual a
|
|
112
|
+
* `operator:`, sensible a mayúsculas y acentos. SQLite: `substr()` no hereda
|
|
113
|
+
* collation ⇒ `BINARY`. PostgreSQL: `COLLATE "C"` (byte a byte aunque la base
|
|
114
|
+
* declare otra). MySQL: la collation de la columna es la de la tabla (`_ai_ci` por
|
|
115
|
+
* defecto: `OPERATOR:` y `opérator:` serían iguales), así que se compara como
|
|
116
|
+
* BINARIO. El prefijo es ASCII, así que «9 caracteres» y «9 unidades UTF-16» (JS)
|
|
117
|
+
* coinciden siempre que la comparación sea verdadera. Sin `LIKE`: ni comodines ni
|
|
118
|
+
* collation. Cualquier otro dialecto ⇒ 500 `E_AUTHZ_UNSUPPORTED_DIALECT` ANTES de
|
|
119
|
+
* tocar la fila (re-ataque del cierre-2 · ⚪ 3: el `substr` de SQLite en MSSQL
|
|
120
|
+
* sería un error del motor envuelto como 503, que invita a reintentar para siempre).
|
|
121
|
+
*/
|
|
122
|
+
export declare function operatorHolderSql(connection?: any): {
|
|
123
|
+
sql: string;
|
|
124
|
+
bindings: unknown[];
|
|
125
|
+
};
|
|
126
|
+
/**
|
|
127
|
+
* Qué pasó al intentar tomar el freeze: `acquired` (con el token), `held` (hay
|
|
128
|
+
* un freeze VIVO de otro dueño) o `expired-operator` (la fila es una ventana de
|
|
129
|
+
* OPERADOR con el lease vencido, que no se pisa). `row` es la fila releída para
|
|
130
|
+
* REDACTAR el error; la decisión ya la tomó el UPDATE.
|
|
131
|
+
*/
|
|
132
|
+
export type FreezeAcquireOutcome = {
|
|
133
|
+
status: 'acquired';
|
|
134
|
+
token: FreezeToken;
|
|
135
|
+
} | {
|
|
136
|
+
status: 'held';
|
|
137
|
+
row: FreezeRow;
|
|
138
|
+
} | {
|
|
139
|
+
status: 'expired-operator';
|
|
140
|
+
row: FreezeRow;
|
|
141
|
+
};
|
|
84
142
|
/**
|
|
85
143
|
* Toma el freeze si NADIE lo sostiene vivo (condicional y atómico: dos
|
|
86
|
-
* `acquire` a la vez acaban en exactamente uno).
|
|
87
|
-
*
|
|
88
|
-
*
|
|
144
|
+
* `acquire` a la vez acaban en exactamente uno). Una fila con el lease VENCIDO
|
|
145
|
+
* se toma encima (el dueño murió: la flota vuelve sola) **salvo que sea una
|
|
146
|
+
* ventana de OPERADOR** (cierre del auditor de alpha.10 · R2): esa exclusión va
|
|
147
|
+
* DENTRO del `WHERE` del mismo `UPDATE`, en los tres motores. Hasta el cierre
|
|
148
|
+
* vivía en `freeze()` como «leo la fila, compruebo, tomo», y con un reloj que
|
|
149
|
+
* cruzaba el vencimiento entre la comprobación y el UPDATE la pasada pisaba la
|
|
150
|
+
* ventana del operador sin 503 — el TOCTOU que el atómico existe para cerrar.
|
|
89
151
|
*/
|
|
152
|
+
export declare function acquireFreezeOutcome(input: {
|
|
153
|
+
reason: string;
|
|
154
|
+
holder: string;
|
|
155
|
+
untilMs: number | null;
|
|
156
|
+
nowMs: number;
|
|
157
|
+
}, options?: FreezeSqlOptions, attempt?: number): Promise<FreezeAcquireOutcome>;
|
|
158
|
+
/** `acquireFreezeOutcome` reducido a «el token o `null`» (lo usan los casos que siembran una fila ajena). */
|
|
90
159
|
export declare function acquireFreeze(input: {
|
|
91
160
|
reason: string;
|
|
92
161
|
holder: string;
|
|
@@ -115,6 +184,17 @@ export declare function releaseFreeze(token: FreezeToken, input: {
|
|
|
115
184
|
released: boolean;
|
|
116
185
|
lapsed: boolean;
|
|
117
186
|
}>;
|
|
118
|
-
/**
|
|
187
|
+
/**
|
|
188
|
+
* **La regla ÚNICA del prefijo de operador** (cierre-2 de alpha.10 · C3): los
|
|
189
|
+
* `OPERATOR_HOLDER_PREFIX.length` primeros caracteres del holder son EXACTAMENTE
|
|
190
|
+
* `operator:` — sensible a mayúsculas y a acentos, sin comodines. La MISMA
|
|
191
|
+
* comparación va en el `WHERE` de `acquireFreezeOutcome` (`operatorHolderSql`) y
|
|
192
|
+
* aquí; hasta el cierre-2 el SQL usaba `LIKE` (insensible a mayúsculas en SQLite y
|
|
193
|
+
* en MySQL `_ci`) y JS partía por `:`, así que un holder `OPERATOR:…` caducado era
|
|
194
|
+
* «de operador» para el UPDATE y `unknown` para JS ⇒ 423 «VIVO» sobre una fila
|
|
195
|
+
* caducada, distinto por motor.
|
|
196
|
+
*/
|
|
197
|
+
export declare function isOperatorHolder(holder: string | null): boolean;
|
|
198
|
+
/** El `kind` que el holder lleva escrito (`operator:123:ab…` → `operator`); el de operador, por `isOperatorHolder`. */
|
|
119
199
|
export declare function freezeKindOf(holder: string | null): FreezeKind | 'unknown';
|
|
120
200
|
//# sourceMappingURL=freeze.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"freeze.d.ts","sourceRoot":"","sources":["../../src/freeze.ts"],"names":[],"mappings":"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"}
|
package/build/src/freeze.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
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, UnsupportedDialectError, } from './errors.js';
|
|
4
4
|
import { CATALOG_VERSION_TABLE } from './catalog/catalog_cache.js';
|
|
5
|
+
import { dialectOf, isMysqlDialect, isSqliteDialect } from './shared/sql_expiry.js';
|
|
5
6
|
/**
|
|
6
7
|
* El **freeze DURABLE** (3b-7; decisión del dueño del 2026-08-31 (3b):
|
|
7
8
|
* B + E-analista). Primitivas SQL puras; la policy (quién congela, el
|
|
@@ -39,6 +40,21 @@ import { CATALOG_VERSION_TABLE } from './catalog/catalog_cache.js';
|
|
|
39
40
|
* congelado»: el mismo patrón que la fila `id = 1` del memo. Un upsert
|
|
40
41
|
* perezoso desde la barrera sería una escritura en el camino de lectura,
|
|
41
42
|
* fuera de `withAuthzCatalogWrite`, y una carrera gratis.
|
|
43
|
+
*
|
|
44
|
+
* **La barrera se lee SIEMPRE por la conexión del motor, nunca por un
|
|
45
|
+
* cliente del llamante** (L-1 · 🟠 8, dictamen del juez del panel `{trx}`).
|
|
46
|
+
* Hasta L-1 `readFreezeRow` aceptaba `client` —la transacción del consumidor,
|
|
47
|
+
* «para no interbloquear un pool de 1»— y eso convertía la AUTORIDAD en una
|
|
48
|
+
* decisión del llamante: un cliente que responde «no congelado», o el
|
|
49
|
+
* snapshot REPEATABLE READ de una transacción abierta ANTES del freeze, dejaba
|
|
50
|
+
* entrar la escritura (medido: auditor C1 en SQLite; MySQL/PG en
|
|
51
|
+
* `freeze.spec.ts`). La regla: *la escritura va por tu transacción; la
|
|
52
|
+
* autoridad que decide si puedes escribir, nunca*. El precio, decidido por el
|
|
53
|
+
* dueño: `{ transaction }` exige pool ≥ 2 — con pool 1 la lectura de la
|
|
54
|
+
* barrera espera una conexión que el llamante sostiene y sale **503
|
|
55
|
+
* `E_AUTHZ_BACKEND_TIMEOUT` al vencer SU deadline** (`withDeadline`, porque
|
|
56
|
+
* el `timeout()` de knex NO cubre la espera del pool: medido, 60 s), jamás
|
|
57
|
+
* un cuelgue ni un bypass.
|
|
42
58
|
*/
|
|
43
59
|
/** La fila del freeze durable (la `id = 1` es la versión del catálogo). */
|
|
44
60
|
export const FREEZE_ROW_ID = 2;
|
|
@@ -48,6 +64,17 @@ const DEFAULT_FREEZE_TIMEOUT_MS = 5_000;
|
|
|
48
64
|
function opts(options) {
|
|
49
65
|
return { driver: options.driver ?? 'freeze', timeoutMs: options.timeoutMs ?? DEFAULT_FREEZE_TIMEOUT_MS };
|
|
50
66
|
}
|
|
67
|
+
/**
|
|
68
|
+
* Una consulta del freeze con deadline TOTAL. `guardSql` fija el `timeout()`
|
|
69
|
+
* de knex, que solo cuenta desde que la consulta tiene conexión: si el pool
|
|
70
|
+
* está agotado (el llamante sostiene la única conexión de `:memory:`), la
|
|
71
|
+
* espera la gobierna `acquireConnectionTimeout` (60 s por defecto) — medido,
|
|
72
|
+
* L-1. `withDeadline` cubre también esa espera, así que con pool 1 la
|
|
73
|
+
* barrera responde 503 en `timeoutMs`, no en un minuto.
|
|
74
|
+
*/
|
|
75
|
+
function freezeSql(driver, operation, timeoutMs, fn) {
|
|
76
|
+
return withDeadline(guardSql(driver, operation, timeoutMs, fn), timeoutMs, () => new AuthorizationBackendTimeoutError(driver, operation, timeoutMs));
|
|
77
|
+
}
|
|
51
78
|
function missingRow(driver) {
|
|
52
79
|
const error = new AuthorizationBackendError(driver, 'freeze.row', new Error(`no hay fila id = ${FREEZE_ROW_ID} en ${CATALOG_VERSION_TABLE}`));
|
|
53
80
|
error.message =
|
|
@@ -62,11 +89,14 @@ function toMs(raw) {
|
|
|
62
89
|
const value = typeof raw === 'number' ? raw : Number(raw);
|
|
63
90
|
return Number.isFinite(value) ? value : null;
|
|
64
91
|
}
|
|
65
|
-
/**
|
|
92
|
+
/**
|
|
93
|
+
* Lee la fila del freeze **por la conexión del motor** (503 clasificado si la
|
|
94
|
+
* base no responde o el pool no da una conexión en `timeoutMs`; 503 «migración
|
|
95
|
+
* no aplicada» si no existe). No acepta cliente: es la autoridad (L-1 · 🟠 8).
|
|
96
|
+
*/
|
|
66
97
|
export async function readFreezeRow(options = {}) {
|
|
67
98
|
const { driver, timeoutMs } = opts(options);
|
|
68
|
-
const
|
|
69
|
-
const rows = await guardSql(driver, 'freeze.read', timeoutMs, () => client
|
|
99
|
+
const rows = await freezeSql(driver, 'freeze.read', timeoutMs, () => db
|
|
70
100
|
.from(CATALOG_VERSION_TABLE)
|
|
71
101
|
.where('id', FREEZE_ROW_ID)
|
|
72
102
|
.select('freeze_reason', 'freeze_holder', 'freeze_until_ms', 'freeze_fence'));
|
|
@@ -89,21 +119,80 @@ export function freezeIsLive(row, nowMs) {
|
|
|
89
119
|
return false;
|
|
90
120
|
return row.untilMs === null || row.untilMs > nowMs;
|
|
91
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* **La barrera del freeze**, la MISMA para los dos motores (roles y
|
|
124
|
+
* relations, L-1 · J1): lee la fila por la conexión del motor y lanza 503
|
|
125
|
+
* `E_AUTHZ_FROZEN` (reintentable) si hay un freeze vivo en `nowMs`. Va
|
|
126
|
+
* delante de TODA escritura, antes de validar identidades o tocar el driver:
|
|
127
|
+
* durante una ventana una escritura no se valida a medias, se rechaza entera.
|
|
128
|
+
* Nunca recibe un cliente del llamante — ver el docblock del módulo.
|
|
129
|
+
*/
|
|
130
|
+
export async function assertNotFrozenRow(operation, options) {
|
|
131
|
+
const row = await readFreezeRow(options);
|
|
132
|
+
if (!freezeIsLive(row, options.nowMs))
|
|
133
|
+
return;
|
|
134
|
+
const lift = freezeKindOf(row.holder) === 'operator' ? ' (la levanta authz:unfreeze)' : '';
|
|
135
|
+
throw new AuthorizationFrozenError(`${operation}: el motor de autorización está congelado (${row.reason})${lift} y no acepta escrituras. ` +
|
|
136
|
+
`Las lecturas siguen funcionando; reintenta esta escritura cuando la ventana termine.`);
|
|
137
|
+
}
|
|
138
|
+
/** El holder con el que se publica una fila con motivo y SIN holder (legada o a mano); también es su token. */
|
|
139
|
+
export const UNKNOWN_HOLDER = '?';
|
|
140
|
+
/** Prefijo del holder de la ventana del OPERADOR (`freeze()` con `kind: 'operator'`). */
|
|
141
|
+
export const OPERATOR_HOLDER_PREFIX = 'operator:';
|
|
142
|
+
/**
|
|
143
|
+
* `isOperatorHolder` en SQL, por motor (cierre-2 de alpha.10 · C3): los
|
|
144
|
+
* `OPERATOR_HOLDER_PREFIX.length` primeros CARACTERES de `freeze_holder` igual a
|
|
145
|
+
* `operator:`, sensible a mayúsculas y acentos. SQLite: `substr()` no hereda
|
|
146
|
+
* collation ⇒ `BINARY`. PostgreSQL: `COLLATE "C"` (byte a byte aunque la base
|
|
147
|
+
* declare otra). MySQL: la collation de la columna es la de la tabla (`_ai_ci` por
|
|
148
|
+
* defecto: `OPERATOR:` y `opérator:` serían iguales), así que se compara como
|
|
149
|
+
* BINARIO. El prefijo es ASCII, así que «9 caracteres» y «9 unidades UTF-16» (JS)
|
|
150
|
+
* coinciden siempre que la comparación sea verdadera. Sin `LIKE`: ni comodines ni
|
|
151
|
+
* collation. Cualquier otro dialecto ⇒ 500 `E_AUTHZ_UNSUPPORTED_DIALECT` ANTES de
|
|
152
|
+
* tocar la fila (re-ataque del cierre-2 · ⚪ 3: el `substr` de SQLite en MSSQL
|
|
153
|
+
* sería un error del motor envuelto como 503, que invita a reintentar para siempre).
|
|
154
|
+
*/
|
|
155
|
+
export function operatorHolderSql(connection = db.connection()) {
|
|
156
|
+
const length = OPERATOR_HOLDER_PREFIX.length;
|
|
157
|
+
if (isMysqlDialect(connection)) {
|
|
158
|
+
return { sql: `CAST(SUBSTRING(freeze_holder, 1, ${length}) AS BINARY) = CAST(? AS BINARY)`, bindings: [OPERATOR_HOLDER_PREFIX] };
|
|
159
|
+
}
|
|
160
|
+
if (dialectOf(connection).startsWith('postgres')) {
|
|
161
|
+
return { sql: `substr(freeze_holder, 1, ${length}) COLLATE "C" = ?`, bindings: [OPERATOR_HOLDER_PREFIX] };
|
|
162
|
+
}
|
|
163
|
+
if (isSqliteDialect(connection)) {
|
|
164
|
+
return { sql: `substr(freeze_holder, 1, ${length}) = ?`, bindings: [OPERATOR_HOLDER_PREFIX] };
|
|
165
|
+
}
|
|
166
|
+
throw new UnsupportedDialectError(`freeze: dialecto '${dialectOf(connection)}' sin observación en la suite (hoy: PostgreSQL, MySQL 8 y SQLite)`);
|
|
167
|
+
}
|
|
92
168
|
/**
|
|
93
169
|
* Toma el freeze si NADIE lo sostiene vivo (condicional y atómico: dos
|
|
94
|
-
* `acquire` a la vez acaban en exactamente uno).
|
|
95
|
-
*
|
|
96
|
-
*
|
|
170
|
+
* `acquire` a la vez acaban en exactamente uno). Una fila con el lease VENCIDO
|
|
171
|
+
* se toma encima (el dueño murió: la flota vuelve sola) **salvo que sea una
|
|
172
|
+
* ventana de OPERADOR** (cierre del auditor de alpha.10 · R2): esa exclusión va
|
|
173
|
+
* DENTRO del `WHERE` del mismo `UPDATE`, en los tres motores. Hasta el cierre
|
|
174
|
+
* vivía en `freeze()` como «leo la fila, compruebo, tomo», y con un reloj que
|
|
175
|
+
* cruzaba el vencimiento entre la comprobación y el UPDATE la pasada pisaba la
|
|
176
|
+
* ventana del operador sin 503 — el TOCTOU que el atómico existe para cerrar.
|
|
97
177
|
*/
|
|
98
|
-
export async function
|
|
178
|
+
export async function acquireFreezeOutcome(input, options = {}, attempt = 0) {
|
|
99
179
|
const { driver, timeoutMs } = opts(options);
|
|
100
|
-
|
|
180
|
+
// Fuera de `freezeSql`: un dialecto no soportado es config (500), no un backend caído (503).
|
|
181
|
+
const operator = operatorHolderSql();
|
|
182
|
+
const updated = await freezeSql(driver, 'freeze.acquire', timeoutMs, () => db
|
|
101
183
|
.from(CATALOG_VERSION_TABLE)
|
|
102
184
|
.where('id', FREEZE_ROW_ID)
|
|
103
185
|
.where((q) => {
|
|
104
|
-
// Libre, o con el lease VENCIDO (un dueño muerto no bloquea la toma)
|
|
186
|
+
// Libre, o con el lease VENCIDO (un dueño muerto no bloquea la toma)…
|
|
105
187
|
q.whereNull('freeze_reason').orWhere((expired) => {
|
|
106
|
-
expired
|
|
188
|
+
expired
|
|
189
|
+
.whereNotNull('freeze_until_ms')
|
|
190
|
+
.andWhere('freeze_until_ms', '<=', input.nowMs)
|
|
191
|
+
// …salvo la ventana del OPERADOR vencida: es evidencia, no espacio libre (R2).
|
|
192
|
+
.andWhere((notOperator) => {
|
|
193
|
+
// La regla ÚNICA (`isOperatorHolder`), sin `LIKE`: comparación EXACTA de prefijo (cierre-2 · C3).
|
|
194
|
+
notOperator.whereNull('freeze_holder').orWhereRaw(`NOT (${operator.sql})`, operator.bindings);
|
|
195
|
+
});
|
|
107
196
|
});
|
|
108
197
|
})
|
|
109
198
|
.update({
|
|
@@ -114,17 +203,36 @@ export async function acquireFreeze(input, options = {}) {
|
|
|
114
203
|
updated_at: new Date(input.nowMs),
|
|
115
204
|
}));
|
|
116
205
|
if (Number(updated) === 0) {
|
|
117
|
-
// O hay un freeze vivo, o la fila no existe: distinguirlo es leerla.
|
|
206
|
+
// O hay un freeze vivo, o una ventana de operador vencida, o la fila no existe: distinguirlo es leerla.
|
|
118
207
|
const row = await readFreezeRow(options);
|
|
119
208
|
if (freezeIsLive(row, input.nowMs))
|
|
120
|
-
return
|
|
121
|
-
|
|
122
|
-
|
|
209
|
+
return { status: 'held', row };
|
|
210
|
+
if (row.reason !== null && freezeKindOf(row.holder) === 'operator')
|
|
211
|
+
return { status: 'expired-operator', row };
|
|
212
|
+
// Carrera minúscula (se liberó entre el UPDATE y el SELECT): reintenta UNA vez.
|
|
213
|
+
// Cierre-2 · C3: tras el reintento, una fila que NO está viva no es `held` (su
|
|
214
|
+
// letra dice «VIVO»). Con la regla única del prefijo esta rama solo la alcanza
|
|
215
|
+
// una fila que cambió dos veces entre UPDATE y SELECT: 503 reintentable que lo dice.
|
|
216
|
+
if (attempt >= 1) {
|
|
217
|
+
const error = new AuthorizationBackendError(driver, 'freeze.acquire', new Error('la fila del freeze cambió entre el UPDATE condicional y su relectura dos veces seguidas'));
|
|
218
|
+
error.message =
|
|
219
|
+
`${driver}: no se pudo tomar el freeze: la fila (${row.holder ?? 'sin holder'}, fence ${row.fence}) NO está viva ` +
|
|
220
|
+
`y aun así el UPDATE condicional no casó dos veces seguidas — otro proceso la está cambiando a la vez ` +
|
|
221
|
+
`(rama «contención tras reintento», no «freeze VIVO»). Reintenta.`;
|
|
222
|
+
throw error;
|
|
223
|
+
}
|
|
224
|
+
return acquireFreezeOutcome(input, options, attempt + 1);
|
|
123
225
|
}
|
|
124
226
|
const row = await readFreezeRow(options);
|
|
227
|
+
// Otro acquire ganó justo después (no debería: el nuestro dejó la fila viva).
|
|
125
228
|
if (row.holder !== input.holder)
|
|
126
|
-
return
|
|
127
|
-
return { fence: row.fence, holder: input.holder };
|
|
229
|
+
return { status: 'held', row };
|
|
230
|
+
return { status: 'acquired', token: { fence: row.fence, holder: input.holder } };
|
|
231
|
+
}
|
|
232
|
+
/** `acquireFreezeOutcome` reducido a «el token o `null`» (lo usan los casos que siembran una fila ajena). */
|
|
233
|
+
export async function acquireFreeze(input, options = {}) {
|
|
234
|
+
const outcome = await acquireFreezeOutcome(input, options);
|
|
235
|
+
return outcome.status === 'acquired' ? outcome.token : null;
|
|
128
236
|
}
|
|
129
237
|
/**
|
|
130
238
|
* Renueva el lease, CONDICIONAL por token y solo si aún no venció
|
|
@@ -134,7 +242,7 @@ export async function acquireFreeze(input, options = {}) {
|
|
|
134
242
|
*/
|
|
135
243
|
export async function renewFreeze(token, input, options = {}) {
|
|
136
244
|
const { driver, timeoutMs } = opts(options);
|
|
137
|
-
const updated = await
|
|
245
|
+
const updated = await freezeSql(driver, 'freeze.renew', timeoutMs, () => db
|
|
138
246
|
.from(CATALOG_VERSION_TABLE)
|
|
139
247
|
.where('id', FREEZE_ROW_ID)
|
|
140
248
|
.where('freeze_fence', token.fence)
|
|
@@ -152,21 +260,47 @@ export async function renewFreeze(token, input, options = {}) {
|
|
|
152
260
|
export async function releaseFreeze(token, input, options = {}) {
|
|
153
261
|
const { driver, timeoutMs } = opts(options);
|
|
154
262
|
const row = await readFreezeRow(options);
|
|
155
|
-
|
|
263
|
+
// La fila SIN holder (legada o escrita a mano) se publica como `UNKNOWN_HOLDER`
|
|
264
|
+
// en `freezeStatus()`/`lastFreezeStatus()`, así que ese es su token: sin esto
|
|
265
|
+
// `authz:unfreeze` no casaba nunca y repetía su aviso para siempre (cierre del
|
|
266
|
+
// auditor de alpha.10 · ⚪ 5). `freeze()` jamás escribe ese holder.
|
|
267
|
+
// Cierre-2 · C4: `'?'` publica DOS filas —holder NULL y holder LITERAL `'?'` (a
|
|
268
|
+
// mano)—, así que el token casa las dos (`IS NULL OR = '?'`); casar solo NULL
|
|
269
|
+
// dejaba la literal sin salida y `authz:unfreeze` en bucle con exit 1. Sigue
|
|
270
|
+
// atado al fence y nunca casa un holder real.
|
|
271
|
+
const unknownHolder = token.holder === UNKNOWN_HOLDER;
|
|
272
|
+
const mine = row.fence === token.fence && (unknownHolder ? row.holder === null || row.holder === UNKNOWN_HOLDER : row.holder === token.holder);
|
|
156
273
|
const lapsed = !mine || (row.untilMs !== null && row.untilMs <= input.nowMs);
|
|
157
274
|
if (!mine)
|
|
158
275
|
return { released: false, lapsed };
|
|
159
|
-
const updated = await
|
|
276
|
+
const updated = await freezeSql(driver, 'freeze.release', timeoutMs, () => db
|
|
160
277
|
.from(CATALOG_VERSION_TABLE)
|
|
161
278
|
.where('id', FREEZE_ROW_ID)
|
|
162
279
|
.where('freeze_fence', token.fence)
|
|
163
|
-
.where('freeze_holder', token.holder)
|
|
280
|
+
.where((q) => unknownHolder ? q.whereNull('freeze_holder').orWhere('freeze_holder', UNKNOWN_HOLDER) : q.where('freeze_holder', token.holder))
|
|
164
281
|
.update({ freeze_reason: null, freeze_holder: null, freeze_until_ms: null, updated_at: new Date(input.nowMs) }));
|
|
165
282
|
return { released: Number(updated) > 0, lapsed };
|
|
166
283
|
}
|
|
167
|
-
/**
|
|
284
|
+
/**
|
|
285
|
+
* **La regla ÚNICA del prefijo de operador** (cierre-2 de alpha.10 · C3): los
|
|
286
|
+
* `OPERATOR_HOLDER_PREFIX.length` primeros caracteres del holder son EXACTAMENTE
|
|
287
|
+
* `operator:` — sensible a mayúsculas y a acentos, sin comodines. La MISMA
|
|
288
|
+
* comparación va en el `WHERE` de `acquireFreezeOutcome` (`operatorHolderSql`) y
|
|
289
|
+
* aquí; hasta el cierre-2 el SQL usaba `LIKE` (insensible a mayúsculas en SQLite y
|
|
290
|
+
* en MySQL `_ci`) y JS partía por `:`, así que un holder `OPERATOR:…` caducado era
|
|
291
|
+
* «de operador» para el UPDATE y `unknown` para JS ⇒ 423 «VIVO» sobre una fila
|
|
292
|
+
* caducada, distinto por motor.
|
|
293
|
+
*/
|
|
294
|
+
export function isOperatorHolder(holder) {
|
|
295
|
+
return typeof holder === 'string' && holder.slice(0, OPERATOR_HOLDER_PREFIX.length) === OPERATOR_HOLDER_PREFIX;
|
|
296
|
+
}
|
|
297
|
+
/** El `kind` que el holder lleva escrito (`operator:123:ab…` → `operator`); el de operador, por `isOperatorHolder`. */
|
|
168
298
|
export function freezeKindOf(holder) {
|
|
169
|
-
|
|
170
|
-
|
|
299
|
+
if (isOperatorHolder(holder))
|
|
300
|
+
return 'operator';
|
|
301
|
+
if (typeof holder !== 'string' || !holder.includes(':'))
|
|
302
|
+
return 'unknown';
|
|
303
|
+
const prefix = holder.slice(0, holder.indexOf(':'));
|
|
304
|
+
return prefix === 'reconcile' || prefix === 'platform' ? prefix : 'unknown';
|
|
171
305
|
}
|
|
172
306
|
//# sourceMappingURL=freeze.js.map
|
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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"}
|