@controldealquiler/sdk 1.3.0 → 1.3.1
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 +4 -0
- package/dist/index.d.ts +16 -44
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -211,6 +211,10 @@ Se configura por entorno:
|
|
|
211
211
|
|
|
212
212
|
`controldealquiler` sin argumentos muestra la ayuda de cada comando.
|
|
213
213
|
|
|
214
|
+
## Cambios en 1.3.1
|
|
215
|
+
|
|
216
|
+
- Limpia los tipos publicados: quita comentarios internos y opciones reservadas a pruebas. Sin cambios de comportamiento.
|
|
217
|
+
|
|
214
218
|
## Cambios en 1.3.0
|
|
215
219
|
|
|
216
220
|
- Nueva opción `lecturaEnServidor: 'permitir' | 'rechazar'` (por defecto `'permitir'`, como hasta ahora). Con `'rechazar'`, el `409 AGENCIA_MODO_SERVIDOR` no sube el fichero por multipart: `borradores.leer`, `crearBorradores` y el alta fallan, y el alta lanza `ErrorAlta` con `corta: true` y `reintentable: false`.
|
package/dist/index.d.ts
CHANGED
|
@@ -49,13 +49,12 @@ interface Sobre {
|
|
|
49
49
|
iv: Uint8Array;
|
|
50
50
|
}
|
|
51
51
|
interface FicheroSellado {
|
|
52
|
-
/**
|
|
52
|
+
/** Contenido cifrado, listo para subir tal cual. */
|
|
53
53
|
blob: Uint8Array;
|
|
54
54
|
wrapped_file_key: Uint8Array;
|
|
55
55
|
nombre_cipher: Uint8Array;
|
|
56
56
|
nombre_iv: Uint8Array;
|
|
57
57
|
}
|
|
58
|
-
/** (Sin AAD en AES-GCM, compatible con `envelope.ts` tal cual: el formato no ata el sobre a su cliente.) */
|
|
59
58
|
/** Sella un JSON con la pública del destinatario (un único sobre). */
|
|
60
59
|
declare function sellarJson(valor: unknown, publicaSpki: Uint8Array): Promise<Sobre>;
|
|
61
60
|
/** Abre un sobre con la privada (CryptoKey RSA-OAEP con `decrypt`). */
|
|
@@ -96,7 +95,7 @@ interface Descifrador {
|
|
|
96
95
|
publicaAgenciaSpki(): Promise<string>;
|
|
97
96
|
/**
|
|
98
97
|
* La privada de sobres de la agencia como clave no extraíble, solo en memoria del proceso. La usa `clientes.crear` para
|
|
99
|
-
* re-envolver las claves de los ficheros hacia la llave efímera del alta
|
|
98
|
+
* re-envolver las claves de los ficheros hacia la llave efímera del alta, igual que el panel.
|
|
100
99
|
*/
|
|
101
100
|
clavePrivadaSobres(): Promise<CryptoKey>;
|
|
102
101
|
}
|
|
@@ -140,8 +139,8 @@ interface ParsedLeaseContract {
|
|
|
140
139
|
/** Dirección de la vivienda tal como consta (una línea, sin trocear), máx. 200 caracteres. */
|
|
141
140
|
property_address: string | null;
|
|
142
141
|
/**
|
|
143
|
-
*
|
|
144
|
-
*
|
|
142
|
+
* Referencia catastral de la vivienda que se importa a su ficha (ya validada por dígitos de control), o null si el
|
|
143
|
+
* contrato no la fija. Solo la rellena la lectura sin IA de las agencias; ausente en la lectura por IA.
|
|
145
144
|
*/
|
|
146
145
|
cadastral_ref_vivienda?: string | null;
|
|
147
146
|
}
|
|
@@ -156,7 +155,7 @@ interface VentanaEjercicios {
|
|
|
156
155
|
caducaAntesDe: string | null;
|
|
157
156
|
}
|
|
158
157
|
|
|
159
|
-
/** Lo que dice la certificación de la agencia
|
|
158
|
+
/** Lo que dice la certificación de la agencia: qué parser y qué conceptos están certificados. */
|
|
160
159
|
interface LectorCertificado {
|
|
161
160
|
parser: string;
|
|
162
161
|
conceptos: string[];
|
|
@@ -208,9 +207,8 @@ type ResultadoLecturaAlta = {
|
|
|
208
207
|
/** Filas leídas pero fuera de la ventana de ejercicios: se quitan con aviso. */
|
|
209
208
|
filasFuera: number;
|
|
210
209
|
/**
|
|
211
|
-
* Rótulo de cada fila de `filas` (mismo orden, ≤200 caracteres): texto libre del PDF.
|
|
212
|
-
*
|
|
213
|
-
* agencia para el sobre E2EE del titular, donde es el concepto de la transacción.
|
|
210
|
+
* Rótulo de cada fila de `filas` (mismo orden, ≤200 caracteres): texto libre del PDF. Nunca viaja a la API:
|
|
211
|
+
* solo lo usa el navegador de la agencia para el sobre cifrado del titular, donde es el concepto de la transacción.
|
|
214
212
|
*/
|
|
215
213
|
rotulos: string[];
|
|
216
214
|
} | {
|
|
@@ -219,7 +217,7 @@ type ResultadoLecturaAlta = {
|
|
|
219
217
|
transitorio: boolean;
|
|
220
218
|
};
|
|
221
219
|
|
|
222
|
-
/** Mismo tope que el servidor y el navegador (
|
|
220
|
+
/** Mismo tope que el servidor y el navegador (el mismo que aplica el panel). */
|
|
223
221
|
declare const TOPE_BYTES = 4000000;
|
|
224
222
|
/** Lector vivo de la agencia: `parser` y conceptos certificados (constantes del sistema, sin PII). */
|
|
225
223
|
type LectorVigente = LectorCertificado;
|
|
@@ -237,8 +235,6 @@ interface OpcionesLector {
|
|
|
237
235
|
/** El servidor aplica la ventana: aquí se lee con una ventana abierta, igual que el navegador. */
|
|
238
236
|
ventana?: VentanaEjercicios;
|
|
239
237
|
mime?: string;
|
|
240
|
-
/** Solo para los tests: sustituye a pdf.js. */
|
|
241
|
-
extraer?: (b: Uint8Array) => Promise<string | null>;
|
|
242
238
|
}
|
|
243
239
|
declare function leerFicheroLocal(bytes: Uint8Array, a: OpcionesLector): Promise<SalidaLectorLocal>;
|
|
244
240
|
interface Borradores {
|
|
@@ -358,8 +354,7 @@ interface ViviendaAlta {
|
|
|
358
354
|
municipio?: string;
|
|
359
355
|
direccion: string;
|
|
360
356
|
/**
|
|
361
|
-
* Código postal (5 cifras),
|
|
362
|
-
* del plan (su interfaz no lo traía); nunca se inventa uno (decisión de la Reina, 28-10).
|
|
357
|
+
* Código postal (5 cifras), obligatorio: el sobre de la vivienda lo exige y el titular lo ve. El SDK nunca inventa uno.
|
|
363
358
|
*/
|
|
364
359
|
cp: string;
|
|
365
360
|
ficheros: FicheroAlta[];
|
|
@@ -382,13 +377,11 @@ interface DepsAlta {
|
|
|
382
377
|
http: Http;
|
|
383
378
|
borradores: Borradores;
|
|
384
379
|
descifrador: Descifrador;
|
|
385
|
-
/** `fetch` para subir los
|
|
380
|
+
/** `fetch` para subir los ficheros a la URL firmada. */
|
|
386
381
|
fetch?: typeof fetch;
|
|
387
382
|
/** Origen del sitio (`https://controldealquiler.com`) para componer el enlace. */
|
|
388
383
|
origen: string;
|
|
389
|
-
/**
|
|
390
|
-
extraer?: OpcionesLector['extraer'];
|
|
391
|
-
/** «Hoy» de Madrid para validar los contratos; por defecto `lib/time/madrid.ts`. */
|
|
384
|
+
/** «Hoy» de Madrid para validar los contratos; por defecto, la fecha de hoy en Madrid. */
|
|
392
385
|
hoy?: () => string;
|
|
393
386
|
/** Espera entre sondeos del lote y entre reintentos de lectura (ms). */
|
|
394
387
|
intervaloMs?: number;
|
|
@@ -399,18 +392,16 @@ interface DepsAlta {
|
|
|
399
392
|
* Ficheros de una misma vivienda que se suben y leen a la vez (entero de 1 a 8; fuera de rango se acota). Si no se fija,
|
|
400
393
|
* se usa la sugerencia del servidor (`GET /v1/yo` → `limites.concurrencia_ficheros`) y, si falta o falla, 4.
|
|
401
394
|
* 1 los procesa uno tras otro. Las viviendas siguen en serie. Cada fichero cuesta unas 3 llamadas a la API y la API admite
|
|
402
|
-
* 10 peticiones/s por cuenta con ráfaga de 50
|
|
395
|
+
* 10 peticiones/s por cuenta con ráfaga de 50: un 429 se reintenta con `Retry-After`.
|
|
403
396
|
*/
|
|
404
397
|
concurrenciaFicheros?: number;
|
|
405
|
-
/** Uso interno: la sugerencia del servidor, memorizada por cliente (`concurrenciaDelServidor`). */
|
|
406
|
-
concurrenciaSugerida?: () => Promise<number>;
|
|
407
398
|
}
|
|
408
399
|
/** `crearAlta(d, e)` = `crearAltaConContexto(d, e)`. Lanza SIEMPRE `ErrorAlta` (nada más). */
|
|
409
400
|
declare function crearAlta(deps: DepsAlta, e: EntradaAlta): Promise<ResultadoAlta>;
|
|
410
401
|
interface Clientes {
|
|
411
402
|
/**
|
|
412
403
|
* Alta de un cliente con sus viviendas y ficheros por el circuito del panel. Idempotente por `ref`.
|
|
413
|
-
* `previo`
|
|
404
|
+
* `previo` está reservado para los reintentos de `crearVarios`: no hace falta pasarlo.
|
|
414
405
|
*/
|
|
415
406
|
crear(e: EntradaAlta, previo?: {
|
|
416
407
|
creado: Creado;
|
|
@@ -429,7 +420,7 @@ interface ResultadoMantenimiento {
|
|
|
429
420
|
imposibles: number;
|
|
430
421
|
/** Un error de un cliente (lote inválido, fallo del servidor…) no tumba la pasada: se recoge aquí y se sigue con los demás. */
|
|
431
422
|
errores: ErrorCliente[];
|
|
432
|
-
/** Sobres que la privada de la agencia no abre o que no validan: se quedan pendientes
|
|
423
|
+
/** Sobres que la privada de la agencia no abre o que no validan: se quedan pendientes. */
|
|
433
424
|
sobresSinAbrir: number;
|
|
434
425
|
/** `false` si en algún momento faltó una cabecera `Date` válida del servidor: en ese caso no se declaró nada. */
|
|
435
426
|
relojServidor: boolean;
|
|
@@ -584,9 +575,7 @@ interface RenovacionApi {
|
|
|
584
575
|
fijar(f: FijarRenovacion): Promise<unknown>;
|
|
585
576
|
}
|
|
586
577
|
/**
|
|
587
|
-
* Tipos
|
|
588
|
-
* público y no importa del servidor, así que los repite aquí y `tests/api/webhook-tipos-sdk.test.ts` los compara con la
|
|
589
|
-
* migración para que no se desfasen.
|
|
578
|
+
* Tipos de evento de webhook que la API puede enviar.
|
|
590
579
|
*/
|
|
591
580
|
declare const TIPOS_WEBHOOK: readonly ["cliente.activado", "cliente.ido", "lote.terminado", "credencial.caduca_pronto", "mantenimiento.pendiente"];
|
|
592
581
|
type TipoWebhook = (typeof TIPOS_WEBHOOK)[number];
|
|
@@ -671,20 +660,7 @@ type ResultadoFotoSdk = {
|
|
|
671
660
|
ok: false;
|
|
672
661
|
error: 'IMAGEN_NO_PROCESABLE';
|
|
673
662
|
};
|
|
674
|
-
/** Lo mínimo de `sharp` que usamos (se tipa a mano: la dependencia es opcional y puede no estar instalada). */
|
|
675
|
-
interface SharpInstancia {
|
|
676
|
-
rotate(): SharpInstancia;
|
|
677
|
-
resize(o: Record<string, unknown>): SharpInstancia;
|
|
678
|
-
clone(): SharpInstancia;
|
|
679
|
-
jpeg(o: {
|
|
680
|
-
quality: number;
|
|
681
|
-
}): SharpInstancia;
|
|
682
|
-
toBuffer(): Promise<Uint8Array>;
|
|
683
|
-
}
|
|
684
|
-
type SharpFn = (entrada: Uint8Array, opciones?: Record<string, unknown>) => SharpInstancia;
|
|
685
663
|
interface DepsFoto {
|
|
686
|
-
/** Solo para los tests: sustituye a la carga de `sharp` (`null` = no instalado). */
|
|
687
|
-
cargarSharp?: () => Promise<SharpFn | null>;
|
|
688
664
|
}
|
|
689
665
|
declare function prepararFoto(bytes: Uint8Array, mime: string, deps?: DepsFoto): Promise<ResultadoFotoSdk>;
|
|
690
666
|
|
|
@@ -696,8 +672,6 @@ declare class ErrorFirmaWebhook extends Error {
|
|
|
696
672
|
}
|
|
697
673
|
type CabecerasWebhook = Headers | Record<string, string | string[] | undefined>;
|
|
698
674
|
interface OpcionesVerificar {
|
|
699
|
-
/** «Ahora» en milisegundos Unix; por defecto `Date.now()`. Solo para tests. */
|
|
700
|
-
ahora?: () => number;
|
|
701
675
|
/** Ventana en segundos a cada lado (por defecto 300). */
|
|
702
676
|
toleranciaS?: number;
|
|
703
677
|
}
|
|
@@ -710,7 +684,7 @@ interface WebhookVerificado {
|
|
|
710
684
|
declare function verificarWebhook(cuerpo: string | Uint8Array, cabeceras: CabecerasWebhook, secreto: string | readonly string[], opciones?: OpcionesVerificar): WebhookVerificado;
|
|
711
685
|
|
|
712
686
|
interface ClienteCda {
|
|
713
|
-
/** Llamada de bajo nivel
|
|
687
|
+
/** Llamada de bajo nivel a la API; sobre ella se construyen `clientes`, `borradores` y `mantenimiento`. */
|
|
714
688
|
peticion<T = unknown>(p: Peticion): Promise<T>;
|
|
715
689
|
http: Http;
|
|
716
690
|
descifrador: Descifrador;
|
|
@@ -728,8 +702,6 @@ interface OpcionesCliente {
|
|
|
728
702
|
baseUrl?: string;
|
|
729
703
|
descifrador: Descifrador;
|
|
730
704
|
fetch?: typeof fetch;
|
|
731
|
-
/** Solo para los tests: sustituye a pdf.js al leer actas, contratos y movimientos. */
|
|
732
|
-
extraer?: OpcionesLector['extraer'];
|
|
733
705
|
hoy?: () => string;
|
|
734
706
|
intervaloMs?: number;
|
|
735
707
|
maxEsperaMs?: number;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@controldealquiler/sdk",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.1",
|
|
4
4
|
"license": "SEE LICENSE IN LICENSE",
|
|
5
5
|
"private": false,
|
|
6
6
|
"type": "module",
|
|
@@ -14,8 +14,8 @@
|
|
|
14
14
|
},
|
|
15
15
|
"scripts": {
|
|
16
16
|
"build": "node build.mjs",
|
|
17
|
-
"prepublishOnly": "node build.mjs && vitest run test/tipos-paquete.test.ts",
|
|
18
|
-
"test:tipos": "vitest run test/tipos-paquete.test.ts",
|
|
17
|
+
"prepublishOnly": "node build.mjs && vitest run test/tipos-paquete.test.ts test/vocabulario-interno.test.ts",
|
|
18
|
+
"test:tipos": "vitest run test/tipos-paquete.test.ts test/vocabulario-interno.test.ts",
|
|
19
19
|
"test": "vitest run --passWithNoTests"
|
|
20
20
|
},
|
|
21
21
|
"devDependencies": {
|