@controldealquiler/sdk 1.2.2 → 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/LICENSE +7 -3
- package/README.md +35 -1
- package/dist/cli.js +39 -39
- package/dist/index.d.ts +28 -46
- package/dist/index.js +2 -2
- package/package.json +3 -3
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 {
|
|
@@ -256,7 +252,11 @@ interface Borradores {
|
|
|
256
252
|
local: ResultadoLecturaAlta | null;
|
|
257
253
|
}>;
|
|
258
254
|
}
|
|
259
|
-
|
|
255
|
+
/** `permitir` (por defecto): ante el 409 se sube el fichero por multipart. `rechazar`: no sale ningún multipart; el 409 se relanza. */
|
|
256
|
+
type LecturaEnServidor = 'permitir' | 'rechazar';
|
|
257
|
+
declare function crearBorradores(http: Http, o?: {
|
|
258
|
+
lecturaEnServidor?: LecturaEnServidor;
|
|
259
|
+
}): Borradores;
|
|
260
260
|
|
|
261
261
|
/** Todas las cajas de un fichero del alta: `acta` (0 o 1 por contrato) y `movimientos` solo van con paquete. */
|
|
262
262
|
declare const CAJAS: readonly ["contract", "tenant_id", "other", "acta", "movimientos", "foto"];
|
|
@@ -354,8 +354,7 @@ interface ViviendaAlta {
|
|
|
354
354
|
municipio?: string;
|
|
355
355
|
direccion: string;
|
|
356
356
|
/**
|
|
357
|
-
* Código postal (5 cifras),
|
|
358
|
-
* 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.
|
|
359
358
|
*/
|
|
360
359
|
cp: string;
|
|
361
360
|
ficheros: FicheroAlta[];
|
|
@@ -378,13 +377,11 @@ interface DepsAlta {
|
|
|
378
377
|
http: Http;
|
|
379
378
|
borradores: Borradores;
|
|
380
379
|
descifrador: Descifrador;
|
|
381
|
-
/** `fetch` para subir los
|
|
380
|
+
/** `fetch` para subir los ficheros a la URL firmada. */
|
|
382
381
|
fetch?: typeof fetch;
|
|
383
382
|
/** Origen del sitio (`https://controldealquiler.com`) para componer el enlace. */
|
|
384
383
|
origen: string;
|
|
385
|
-
/**
|
|
386
|
-
extraer?: OpcionesLector['extraer'];
|
|
387
|
-
/** «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. */
|
|
388
385
|
hoy?: () => string;
|
|
389
386
|
/** Espera entre sondeos del lote y entre reintentos de lectura (ms). */
|
|
390
387
|
intervaloMs?: number;
|
|
@@ -395,18 +392,16 @@ interface DepsAlta {
|
|
|
395
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,
|
|
396
393
|
* se usa la sugerencia del servidor (`GET /v1/yo` → `limites.concurrencia_ficheros`) y, si falta o falla, 4.
|
|
397
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
|
|
398
|
-
* 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`.
|
|
399
396
|
*/
|
|
400
397
|
concurrenciaFicheros?: number;
|
|
401
|
-
/** Uso interno: la sugerencia del servidor, memorizada por cliente (`concurrenciaDelServidor`). */
|
|
402
|
-
concurrenciaSugerida?: () => Promise<number>;
|
|
403
398
|
}
|
|
404
399
|
/** `crearAlta(d, e)` = `crearAltaConContexto(d, e)`. Lanza SIEMPRE `ErrorAlta` (nada más). */
|
|
405
400
|
declare function crearAlta(deps: DepsAlta, e: EntradaAlta): Promise<ResultadoAlta>;
|
|
406
401
|
interface Clientes {
|
|
407
402
|
/**
|
|
408
403
|
* Alta de un cliente con sus viviendas y ficheros por el circuito del panel. Idempotente por `ref`.
|
|
409
|
-
* `previo`
|
|
404
|
+
* `previo` está reservado para los reintentos de `crearVarios`: no hace falta pasarlo.
|
|
410
405
|
*/
|
|
411
406
|
crear(e: EntradaAlta, previo?: {
|
|
412
407
|
creado: Creado;
|
|
@@ -425,7 +420,7 @@ interface ResultadoMantenimiento {
|
|
|
425
420
|
imposibles: number;
|
|
426
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. */
|
|
427
422
|
errores: ErrorCliente[];
|
|
428
|
-
/** 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. */
|
|
429
424
|
sobresSinAbrir: number;
|
|
430
425
|
/** `false` si en algún momento faltó una cabecera `Date` válida del servidor: en ese caso no se declaró nada. */
|
|
431
426
|
relojServidor: boolean;
|
|
@@ -580,9 +575,7 @@ interface RenovacionApi {
|
|
|
580
575
|
fijar(f: FijarRenovacion): Promise<unknown>;
|
|
581
576
|
}
|
|
582
577
|
/**
|
|
583
|
-
* Tipos
|
|
584
|
-
* público y no importa del servidor, así que los repite aquí y `tests/api/webhook-tipos-sdk.test.ts` los compara con la
|
|
585
|
-
* migración para que no se desfasen.
|
|
578
|
+
* Tipos de evento de webhook que la API puede enviar.
|
|
586
579
|
*/
|
|
587
580
|
declare const TIPOS_WEBHOOK: readonly ["cliente.activado", "cliente.ido", "lote.terminado", "credencial.caduca_pronto", "mantenimiento.pendiente"];
|
|
588
581
|
type TipoWebhook = (typeof TIPOS_WEBHOOK)[number];
|
|
@@ -667,20 +660,7 @@ type ResultadoFotoSdk = {
|
|
|
667
660
|
ok: false;
|
|
668
661
|
error: 'IMAGEN_NO_PROCESABLE';
|
|
669
662
|
};
|
|
670
|
-
/** Lo mínimo de `sharp` que usamos (se tipa a mano: la dependencia es opcional y puede no estar instalada). */
|
|
671
|
-
interface SharpInstancia {
|
|
672
|
-
rotate(): SharpInstancia;
|
|
673
|
-
resize(o: Record<string, unknown>): SharpInstancia;
|
|
674
|
-
clone(): SharpInstancia;
|
|
675
|
-
jpeg(o: {
|
|
676
|
-
quality: number;
|
|
677
|
-
}): SharpInstancia;
|
|
678
|
-
toBuffer(): Promise<Uint8Array>;
|
|
679
|
-
}
|
|
680
|
-
type SharpFn = (entrada: Uint8Array, opciones?: Record<string, unknown>) => SharpInstancia;
|
|
681
663
|
interface DepsFoto {
|
|
682
|
-
/** Solo para los tests: sustituye a la carga de `sharp` (`null` = no instalado). */
|
|
683
|
-
cargarSharp?: () => Promise<SharpFn | null>;
|
|
684
664
|
}
|
|
685
665
|
declare function prepararFoto(bytes: Uint8Array, mime: string, deps?: DepsFoto): Promise<ResultadoFotoSdk>;
|
|
686
666
|
|
|
@@ -692,8 +672,6 @@ declare class ErrorFirmaWebhook extends Error {
|
|
|
692
672
|
}
|
|
693
673
|
type CabecerasWebhook = Headers | Record<string, string | string[] | undefined>;
|
|
694
674
|
interface OpcionesVerificar {
|
|
695
|
-
/** «Ahora» en milisegundos Unix; por defecto `Date.now()`. Solo para tests. */
|
|
696
|
-
ahora?: () => number;
|
|
697
675
|
/** Ventana en segundos a cada lado (por defecto 300). */
|
|
698
676
|
toleranciaS?: number;
|
|
699
677
|
}
|
|
@@ -706,7 +684,7 @@ interface WebhookVerificado {
|
|
|
706
684
|
declare function verificarWebhook(cuerpo: string | Uint8Array, cabeceras: CabecerasWebhook, secreto: string | readonly string[], opciones?: OpcionesVerificar): WebhookVerificado;
|
|
707
685
|
|
|
708
686
|
interface ClienteCda {
|
|
709
|
-
/** Llamada de bajo nivel
|
|
687
|
+
/** Llamada de bajo nivel a la API; sobre ella se construyen `clientes`, `borradores` y `mantenimiento`. */
|
|
710
688
|
peticion<T = unknown>(p: Peticion): Promise<T>;
|
|
711
689
|
http: Http;
|
|
712
690
|
descifrador: Descifrador;
|
|
@@ -724,16 +702,20 @@ interface OpcionesCliente {
|
|
|
724
702
|
baseUrl?: string;
|
|
725
703
|
descifrador: Descifrador;
|
|
726
704
|
fetch?: typeof fetch;
|
|
727
|
-
/** Solo para los tests: sustituye a pdf.js al leer actas, contratos y movimientos. */
|
|
728
|
-
extraer?: OpcionesLector['extraer'];
|
|
729
705
|
hoy?: () => string;
|
|
730
706
|
intervaloMs?: number;
|
|
731
707
|
maxEsperaMs?: number;
|
|
732
708
|
dormir?: (ms: number) => Promise<void>;
|
|
733
709
|
/** Ficheros de una vivienda procesados a la vez (1 a 8). Si no se fija, el SDK usa la que sugiere `GET /v1/yo` o, si falta, 4. La API admite 10 peticiones/s por cuenta, ráfaga de 50. */
|
|
734
710
|
concurrenciaFicheros?: number;
|
|
711
|
+
/**
|
|
712
|
+
* Qué hacer si la API pasa a leer en el servidor (`409 AGENCIA_MODO_SERVIDOR`). `'permitir'` (por defecto): el SDK sube el fichero
|
|
713
|
+
* por multipart, sin el cifrado de extremo a extremo. `'rechazar'`: no sale ningún multipart; `leer`, el alta y `crearBorradores`
|
|
714
|
+
* fallan (el alta con `ErrorAlta`, `corta: true`, `reintentable: false`).
|
|
715
|
+
*/
|
|
716
|
+
lecturaEnServidor?: LecturaEnServidor;
|
|
735
717
|
}
|
|
736
718
|
declare function crearCliente(o: OpcionesCliente): ClienteCda;
|
|
737
719
|
|
|
738
720
|
export { ErrorAlta, ErrorApiSdk, ErrorClaveIntegracion, ErrorDeEntorno, ErrorFirmaWebhook, FOTO_BYTES_OBJETIVO, FOTO_CALIDAD, FOTO_CALIDAD_2, FOTO_LADO_MAX, TIPOS_WEBHOOK, TOLERANCIA_WEBHOOK_S, TOPE_BYTES, URL_BASE_SANDBOX, abrirContenidoFichero, abrirJson, abrirNombreFichero, abrirSobreBytes, admiteIdempotencia, base64ToBytes, bytesToBase64, clasificar, codigoDe, crearAlta, crearBorradores, crearCliente, crearClientes, crearGestion, crearHttp, crearMantenimiento, crearVarios, descifradorDeClave, descifradorDeFichero, envolver, esperaDeRetryAfter, etiquetaIfMatch, importarPrivadaPkcs8, leerFicheroLocal, prepararFoto, reenvolverClave, sellarFichero, sellarJson, sellarSobreB64, sha256Hex, sobreDeB64, verificarWebhook };
|
|
739
|
-
export type { Borradores, BuzonApi, CabecerasWebhook, ClienteApi, ClienteCda, Clientes, ClientesGestion, Consejo, ContextoAlta, Creado, Creditos, DepsAlta, DepsGestion, DepsMantenimiento, Descifrador, DestinoWebhook, EdicionCliente, EntradaAlta, EntregaWebhook, ErrorCliente, Escrito, FallidoAlta, FicheroAlta, FicheroSellado, FijarRenovacion, Gestion, Http, Incluir, InformeVarios, LectorVigente, Mantenimiento, ModoRenovacion, MotivoFirmaWebhook, OpcionesCliente, OpcionesEscritura, OpcionesHttp, OpcionesLector, OpcionesListar, OpcionesVarios, OpcionesVerificar, OrigenClaveIntegracion, PaginaClientes, PasoAlta, Peticion, ReglaRenovacion, Remitentes, RenovacionApi, ResultadoAlta, ResultadoFotoSdk, ResultadoMantenimiento, SalidaLectorLocal, Sobre, SobreApi, SobreB64Cliente, TipoWebhook, ViviendaAlta, ViviendaApi, ViviendaEdicion, Viviendas, WebhookVerificado, Webhooks };
|
|
721
|
+
export type { Borradores, BuzonApi, CabecerasWebhook, ClienteApi, ClienteCda, Clientes, ClientesGestion, Consejo, ContextoAlta, Creado, Creditos, DepsAlta, DepsGestion, DepsMantenimiento, Descifrador, DestinoWebhook, EdicionCliente, EntradaAlta, EntregaWebhook, ErrorCliente, Escrito, FallidoAlta, FicheroAlta, FicheroSellado, FijarRenovacion, Gestion, Http, Incluir, InformeVarios, LectorVigente, LecturaEnServidor, Mantenimiento, ModoRenovacion, MotivoFirmaWebhook, OpcionesCliente, OpcionesEscritura, OpcionesHttp, OpcionesLector, OpcionesListar, OpcionesVarios, OpcionesVerificar, OrigenClaveIntegracion, PaginaClientes, PasoAlta, Peticion, ReglaRenovacion, Remitentes, RenovacionApi, ResultadoAlta, ResultadoFotoSdk, ResultadoMantenimiento, SalidaLectorLocal, Sobre, SobreApi, SobreB64Cliente, TipoWebhook, ViviendaAlta, ViviendaApi, ViviendaEdicion, Viviendas, WebhookVerificado, Webhooks };
|