@zentto/platform-client 0.2.0 → 0.4.0
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 +49 -1
- package/dist/auth/client.d.ts +10 -0
- package/dist/auth/client.d.ts.map +1 -1
- package/dist/auth/client.js +36 -0
- package/dist/auth/client.js.map +1 -1
- package/dist/cache/client.d.ts +3 -0
- package/dist/cache/client.d.ts.map +1 -1
- package/dist/cache/client.js +3 -0
- package/dist/cache/client.js.map +1 -1
- package/dist/events/client.d.ts +94 -0
- package/dist/events/client.d.ts.map +1 -0
- package/dist/events/client.js +208 -0
- package/dist/events/client.js.map +1 -0
- package/dist/events/envelope.d.ts +28 -0
- package/dist/events/envelope.d.ts.map +1 -0
- package/dist/events/envelope.js +38 -0
- package/dist/events/envelope.js.map +1 -0
- package/dist/events/index.d.ts +3 -0
- package/dist/events/index.d.ts.map +1 -0
- package/dist/events/index.js +3 -0
- package/dist/events/index.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/internal/circuit.d.ts +33 -0
- package/dist/internal/circuit.d.ts.map +1 -0
- package/dist/internal/circuit.js +73 -0
- package/dist/internal/circuit.js.map +1 -0
- package/dist/internal/errors.d.ts +57 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +96 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/http.d.ts +29 -9
- package/dist/internal/http.d.ts.map +1 -1
- package/dist/internal/http.js +41 -20
- package/dist/internal/http.js.map +1 -1
- package/dist/notify/client.d.ts +5 -0
- package/dist/notify/client.d.ts.map +1 -1
- package/dist/notify/client.js +13 -0
- package/dist/notify/client.js.map +1 -1
- package/dist/webhooks/index.d.ts +13 -0
- package/dist/webhooks/index.d.ts.map +1 -0
- package/dist/webhooks/index.js +57 -0
- package/dist/webhooks/index.js.map +1 -0
- package/package.json +20 -3
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,7 @@ export * as notify from "./notify/index.js";
|
|
|
2
2
|
export * as auth from "./auth/index.js";
|
|
3
3
|
export * as cache from "./cache/index.js";
|
|
4
4
|
export * as landing from "./landing/index.js";
|
|
5
|
+
export * as events from "./events/index.js";
|
|
6
|
+
export * as webhooks from "./webhooks/index.js";
|
|
7
|
+
export * from "./internal/errors.js";
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAGhD,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -5,4 +5,8 @@ export * as notify from "./notify/index.js";
|
|
|
5
5
|
export * as auth from "./auth/index.js";
|
|
6
6
|
export * as cache from "./cache/index.js";
|
|
7
7
|
export * as landing from "./landing/index.js";
|
|
8
|
+
export * as events from "./events/index.js";
|
|
9
|
+
export * as webhooks from "./webhooks/index.js";
|
|
10
|
+
// Tipos de error compartidos (útiles para `instanceof` en callers).
|
|
11
|
+
export * from "./internal/errors.js";
|
|
8
12
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,gDAAgD;AAEhD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,8EAA8E;AAC9E,2EAA2E;AAC3E,gDAAgD;AAEhD,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,IAAI,MAAM,iBAAiB,CAAC;AACxC,OAAO,KAAK,KAAK,MAAM,kBAAkB,CAAC;AAC1C,OAAO,KAAK,OAAO,MAAM,oBAAoB,CAAC;AAC9C,OAAO,KAAK,MAAM,MAAM,mBAAmB,CAAC;AAC5C,OAAO,KAAK,QAAQ,MAAM,qBAAqB,CAAC;AAEhD,oEAAoE;AACpE,cAAc,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker minimal — un breaker por (baseUrl, path-prefix).
|
|
3
|
+
*
|
|
4
|
+
* Estados:
|
|
5
|
+
* closed → pasa tráfico. Cuenta fallos consecutivos.
|
|
6
|
+
* open → rechaza inmediato. Despeja tras cooldown.
|
|
7
|
+
* half → deja pasar 1 request de prueba. Si falla, vuelve a open.
|
|
8
|
+
* Si pasa, vuelve a closed.
|
|
9
|
+
*
|
|
10
|
+
* Evita cascade failures cuando un servicio upstream se cae.
|
|
11
|
+
*/
|
|
12
|
+
export interface CircuitOptions {
|
|
13
|
+
/** Fallos consecutivos antes de abrir. Default 5. */
|
|
14
|
+
failureThreshold?: number;
|
|
15
|
+
/** Tiempo en open antes de probar half. Default 30s. */
|
|
16
|
+
cooldownMs?: number;
|
|
17
|
+
}
|
|
18
|
+
type State = "closed" | "open" | "half";
|
|
19
|
+
export declare class CircuitBreaker {
|
|
20
|
+
private readonly failureThreshold;
|
|
21
|
+
private readonly cooldownMs;
|
|
22
|
+
private readonly slots;
|
|
23
|
+
constructor(opts?: CircuitOptions);
|
|
24
|
+
private slot;
|
|
25
|
+
/** Llamado antes de disparar un request. Retorna false si el circuito está abierto. */
|
|
26
|
+
allow(key: string): boolean;
|
|
27
|
+
recordSuccess(key: string): void;
|
|
28
|
+
recordFailure(key: string): void;
|
|
29
|
+
/** Sólo para tests/debug. */
|
|
30
|
+
_state(key: string): State;
|
|
31
|
+
}
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=circuit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit.d.ts","sourceRoot":"","sources":["../../src/internal/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,MAAM,WAAW,cAAc;IAC7B,qDAAqD;IACrD,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,wDAAwD;IACxD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,KAAK,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,MAAM,CAAC;AASxC,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2B;gBAErC,IAAI,GAAE,cAAmB;IAKrC,OAAO,CAAC,IAAI;IASZ,uFAAuF;IACvF,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO;IAiB3B,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAOhC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAehC,6BAA6B;IAC7B,MAAM,CAAC,GAAG,EAAE,MAAM,GAAG,KAAK;CAG3B"}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Circuit breaker minimal — un breaker por (baseUrl, path-prefix).
|
|
3
|
+
*
|
|
4
|
+
* Estados:
|
|
5
|
+
* closed → pasa tráfico. Cuenta fallos consecutivos.
|
|
6
|
+
* open → rechaza inmediato. Despeja tras cooldown.
|
|
7
|
+
* half → deja pasar 1 request de prueba. Si falla, vuelve a open.
|
|
8
|
+
* Si pasa, vuelve a closed.
|
|
9
|
+
*
|
|
10
|
+
* Evita cascade failures cuando un servicio upstream se cae.
|
|
11
|
+
*/
|
|
12
|
+
export class CircuitBreaker {
|
|
13
|
+
failureThreshold;
|
|
14
|
+
cooldownMs;
|
|
15
|
+
slots = new Map();
|
|
16
|
+
constructor(opts = {}) {
|
|
17
|
+
this.failureThreshold = Math.max(1, opts.failureThreshold ?? 5);
|
|
18
|
+
this.cooldownMs = Math.max(1000, opts.cooldownMs ?? 30_000);
|
|
19
|
+
}
|
|
20
|
+
slot(key) {
|
|
21
|
+
let s = this.slots.get(key);
|
|
22
|
+
if (!s) {
|
|
23
|
+
s = { state: "closed", consecutiveFailures: 0, openedAt: 0, halfInFlight: false };
|
|
24
|
+
this.slots.set(key, s);
|
|
25
|
+
}
|
|
26
|
+
return s;
|
|
27
|
+
}
|
|
28
|
+
/** Llamado antes de disparar un request. Retorna false si el circuito está abierto. */
|
|
29
|
+
allow(key) {
|
|
30
|
+
const s = this.slot(key);
|
|
31
|
+
if (s.state === "closed")
|
|
32
|
+
return true;
|
|
33
|
+
if (s.state === "open") {
|
|
34
|
+
if (Date.now() - s.openedAt >= this.cooldownMs) {
|
|
35
|
+
s.state = "half";
|
|
36
|
+
s.halfInFlight = false;
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// half: solo 1 in-flight a la vez
|
|
43
|
+
if (s.halfInFlight)
|
|
44
|
+
return false;
|
|
45
|
+
s.halfInFlight = true;
|
|
46
|
+
return true;
|
|
47
|
+
}
|
|
48
|
+
recordSuccess(key) {
|
|
49
|
+
const s = this.slot(key);
|
|
50
|
+
s.consecutiveFailures = 0;
|
|
51
|
+
s.halfInFlight = false;
|
|
52
|
+
s.state = "closed";
|
|
53
|
+
}
|
|
54
|
+
recordFailure(key) {
|
|
55
|
+
const s = this.slot(key);
|
|
56
|
+
s.consecutiveFailures++;
|
|
57
|
+
s.halfInFlight = false;
|
|
58
|
+
if (s.state === "half") {
|
|
59
|
+
s.state = "open";
|
|
60
|
+
s.openedAt = Date.now();
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
if (s.consecutiveFailures >= this.failureThreshold) {
|
|
64
|
+
s.state = "open";
|
|
65
|
+
s.openedAt = Date.now();
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
/** Sólo para tests/debug. */
|
|
69
|
+
_state(key) {
|
|
70
|
+
return this.slot(key).state;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=circuit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"circuit.js","sourceRoot":"","sources":["../../src/internal/circuit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAkBH,MAAM,OAAO,cAAc;IACR,gBAAgB,CAAS;IACzB,UAAU,CAAS;IACnB,KAAK,GAAG,IAAI,GAAG,EAAgB,CAAC;IAEjD,YAAY,OAAuB,EAAE;QACnC,IAAI,CAAC,gBAAgB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,gBAAgB,IAAI,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,UAAU,IAAI,MAAM,CAAC,CAAC;IAC9D,CAAC;IAEO,IAAI,CAAC,GAAW;QACtB,IAAI,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,CAAC,CAAC,EAAE,CAAC;YACP,CAAC,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC;YAClF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QACzB,CAAC;QACD,OAAO,CAAC,CAAC;IACX,CAAC;IAED,uFAAuF;IACvF,KAAK,CAAC,GAAW;QACf,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,CAAC,KAAK,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QACtC,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,QAAQ,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;gBAC/C,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;gBACjB,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;YACzB,CAAC;iBAAM,CAAC;gBACN,OAAO,KAAK,CAAC;YACf,CAAC;QACH,CAAC;QACD,kCAAkC;QAClC,IAAI,CAAC,CAAC,YAAY;YAAE,OAAO,KAAK,CAAC;QACjC,CAAC,CAAC,YAAY,GAAG,IAAI,CAAC;QACtB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,mBAAmB,GAAG,CAAC,CAAC;QAC1B,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC,CAAC,KAAK,GAAG,QAAQ,CAAC;IACrB,CAAC;IAED,aAAa,CAAC,GAAW;QACvB,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACzB,CAAC,CAAC,mBAAmB,EAAE,CAAC;QACxB,CAAC,CAAC,YAAY,GAAG,KAAK,CAAC;QACvB,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM,EAAE,CAAC;YACvB,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;YACjB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACxB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,CAAC,mBAAmB,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YACnD,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC;YACjB,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,6BAA6B;IAC7B,MAAM,CAAC,GAAW;QAChB,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jerarquía de errores tipados del SDK.
|
|
3
|
+
*
|
|
4
|
+
* El SDK NO lanza por default (mantiene shape best-effort `{ ok, error }`).
|
|
5
|
+
* Estos errores se usan:
|
|
6
|
+
* a) En `result.errorInstance` para callers que quieran `instanceof`.
|
|
7
|
+
* b) Opcionalmente en modo `throwOnError: true` (futuro).
|
|
8
|
+
*
|
|
9
|
+
* La jerarquía permite reaccionar fino:
|
|
10
|
+
* if (err instanceof RateLimitedError) backoff();
|
|
11
|
+
* if (err instanceof AuthError) redirectToLogin();
|
|
12
|
+
*/
|
|
13
|
+
export declare class PlatformError extends Error {
|
|
14
|
+
readonly status?: number;
|
|
15
|
+
readonly path?: string;
|
|
16
|
+
readonly attempt?: number;
|
|
17
|
+
constructor(message: string, opts?: {
|
|
18
|
+
status?: number;
|
|
19
|
+
path?: string;
|
|
20
|
+
attempt?: number;
|
|
21
|
+
cause?: unknown;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
/** 4xx 401/403 — token inválido/expirado, scope faltante. */
|
|
25
|
+
export declare class AuthError extends PlatformError {
|
|
26
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
27
|
+
}
|
|
28
|
+
/** 4xx 400/422 — body mal formado, campos faltantes. */
|
|
29
|
+
export declare class ValidationError extends PlatformError {
|
|
30
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
31
|
+
}
|
|
32
|
+
/** 4xx 404 — recurso no existe. */
|
|
33
|
+
export declare class NotFoundError extends PlatformError {
|
|
34
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
35
|
+
}
|
|
36
|
+
/** 4xx 429 — rate limited upstream. */
|
|
37
|
+
export declare class RateLimitedError extends PlatformError {
|
|
38
|
+
readonly retryAfterSec?: number;
|
|
39
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1] & {
|
|
40
|
+
retryAfterSec?: number;
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** 5xx — error del servicio upstream. Normalmente reintentable. */
|
|
44
|
+
export declare class ServiceError extends PlatformError {
|
|
45
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
46
|
+
}
|
|
47
|
+
/** Errores de red (timeout, DNS, connection reset). Reintentables. */
|
|
48
|
+
export declare class NetworkError extends PlatformError {
|
|
49
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
50
|
+
}
|
|
51
|
+
/** Circuit breaker abierto — upstream fallando demasiado. */
|
|
52
|
+
export declare class CircuitOpenError extends PlatformError {
|
|
53
|
+
constructor(message: string, opts?: ConstructorParameters<typeof PlatformError>[1]);
|
|
54
|
+
}
|
|
55
|
+
/** Mapea HTTP status + contexto a un error tipado. */
|
|
56
|
+
export declare function mapHttpError(status: number | undefined, body: Record<string, unknown>, path: string, attempt: number): PlatformError;
|
|
57
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,qBAAa,aAAc,SAAQ,KAAK;IACtC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;gBAEd,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAE;CAQ1G;AAED,6DAA6D;AAC7D,qBAAa,SAAU,SAAQ,aAAa;gBAC9B,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,wDAAwD;AACxD,qBAAa,eAAgB,SAAQ,aAAa;gBACpC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,mCAAmC;AACnC,qBAAa,aAAc,SAAQ,aAAa;gBAClC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,uCAAuC;AACvC,qBAAa,gBAAiB,SAAQ,aAAa;IACjD,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;gBACpB,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC,GAAG;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE;CAKhH;AAED,mEAAmE;AACnE,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,sEAAsE;AACtE,qBAAa,YAAa,SAAQ,aAAa;gBACjC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,6DAA6D;AAC7D,qBAAa,gBAAiB,SAAQ,aAAa;gBACrC,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,qBAAqB,CAAC,OAAO,aAAa,CAAC,CAAC,CAAC,CAAC;CAInF;AAED,sDAAsD;AACtD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,aAAa,CAYpI"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Jerarquía de errores tipados del SDK.
|
|
3
|
+
*
|
|
4
|
+
* El SDK NO lanza por default (mantiene shape best-effort `{ ok, error }`).
|
|
5
|
+
* Estos errores se usan:
|
|
6
|
+
* a) En `result.errorInstance` para callers que quieran `instanceof`.
|
|
7
|
+
* b) Opcionalmente en modo `throwOnError: true` (futuro).
|
|
8
|
+
*
|
|
9
|
+
* La jerarquía permite reaccionar fino:
|
|
10
|
+
* if (err instanceof RateLimitedError) backoff();
|
|
11
|
+
* if (err instanceof AuthError) redirectToLogin();
|
|
12
|
+
*/
|
|
13
|
+
export class PlatformError extends Error {
|
|
14
|
+
status;
|
|
15
|
+
path;
|
|
16
|
+
attempt;
|
|
17
|
+
constructor(message, opts) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "PlatformError";
|
|
20
|
+
this.status = opts?.status;
|
|
21
|
+
this.path = opts?.path;
|
|
22
|
+
this.attempt = opts?.attempt;
|
|
23
|
+
if (opts?.cause !== undefined)
|
|
24
|
+
this.cause = opts.cause;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/** 4xx 401/403 — token inválido/expirado, scope faltante. */
|
|
28
|
+
export class AuthError extends PlatformError {
|
|
29
|
+
constructor(message, opts) {
|
|
30
|
+
super(message, opts);
|
|
31
|
+
this.name = "AuthError";
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/** 4xx 400/422 — body mal formado, campos faltantes. */
|
|
35
|
+
export class ValidationError extends PlatformError {
|
|
36
|
+
constructor(message, opts) {
|
|
37
|
+
super(message, opts);
|
|
38
|
+
this.name = "ValidationError";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
/** 4xx 404 — recurso no existe. */
|
|
42
|
+
export class NotFoundError extends PlatformError {
|
|
43
|
+
constructor(message, opts) {
|
|
44
|
+
super(message, opts);
|
|
45
|
+
this.name = "NotFoundError";
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
/** 4xx 429 — rate limited upstream. */
|
|
49
|
+
export class RateLimitedError extends PlatformError {
|
|
50
|
+
retryAfterSec;
|
|
51
|
+
constructor(message, opts) {
|
|
52
|
+
super(message, opts);
|
|
53
|
+
this.name = "RateLimitedError";
|
|
54
|
+
this.retryAfterSec = opts?.retryAfterSec;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** 5xx — error del servicio upstream. Normalmente reintentable. */
|
|
58
|
+
export class ServiceError extends PlatformError {
|
|
59
|
+
constructor(message, opts) {
|
|
60
|
+
super(message, opts);
|
|
61
|
+
this.name = "ServiceError";
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** Errores de red (timeout, DNS, connection reset). Reintentables. */
|
|
65
|
+
export class NetworkError extends PlatformError {
|
|
66
|
+
constructor(message, opts) {
|
|
67
|
+
super(message, opts);
|
|
68
|
+
this.name = "NetworkError";
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/** Circuit breaker abierto — upstream fallando demasiado. */
|
|
72
|
+
export class CircuitOpenError extends PlatformError {
|
|
73
|
+
constructor(message, opts) {
|
|
74
|
+
super(message, opts);
|
|
75
|
+
this.name = "CircuitOpenError";
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
/** Mapea HTTP status + contexto a un error tipado. */
|
|
79
|
+
export function mapHttpError(status, body, path, attempt) {
|
|
80
|
+
const msg = body.error ?? body.message ?? (status ? `HTTP ${status}` : "unknown error");
|
|
81
|
+
const opts = { status, path, attempt };
|
|
82
|
+
if (status === 401 || status === 403)
|
|
83
|
+
return new AuthError(msg, opts);
|
|
84
|
+
if (status === 404)
|
|
85
|
+
return new NotFoundError(msg, opts);
|
|
86
|
+
if (status === 429) {
|
|
87
|
+
const retryAfterSec = typeof body.retryAfter === "number" ? body.retryAfter : undefined;
|
|
88
|
+
return new RateLimitedError(msg, { ...opts, retryAfterSec });
|
|
89
|
+
}
|
|
90
|
+
if (status && status >= 400 && status < 500)
|
|
91
|
+
return new ValidationError(msg, opts);
|
|
92
|
+
if (status && status >= 500)
|
|
93
|
+
return new ServiceError(msg, opts);
|
|
94
|
+
return new NetworkError(msg, opts);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/internal/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/internal/http.d.ts
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP helper compartido entre submódulos.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Retries con backoff exponencial ante errores de red o 5xx.
|
|
6
|
+
* - Sin retry en 4xx (es error del caller).
|
|
7
|
+
* - Timeout por request.
|
|
8
|
+
* - Circuit breaker por (baseUrl): evita cascade cuando upstream cae.
|
|
9
|
+
* - Errores tipados (AuthError, RateLimitedError, ServiceError, etc.) en `errorInstance`.
|
|
10
|
+
* - Hook `beforeRetry` (ej. AuthClient lo usa para auto-refresh del JWT).
|
|
11
|
+
* - No lanza: siempre retorna Result<T> (ok/error).
|
|
10
12
|
*/
|
|
13
|
+
import { CircuitBreaker, type CircuitOptions } from "./circuit.js";
|
|
14
|
+
import { type PlatformError } from "./errors.js";
|
|
11
15
|
export interface HttpConfig {
|
|
12
16
|
baseUrl: string;
|
|
13
17
|
timeoutMs: number;
|
|
@@ -16,12 +20,23 @@ export interface HttpConfig {
|
|
|
16
20
|
path: string;
|
|
17
21
|
attempt: number;
|
|
18
22
|
}) => void;
|
|
23
|
+
/** Opcional: permite al AuthClient interceptar 401 para refresh + retry. */
|
|
24
|
+
beforeRetry?: (err: PlatformError, ctx: {
|
|
25
|
+
path: string;
|
|
26
|
+
attempt: number;
|
|
27
|
+
}) => Promise<{
|
|
28
|
+
retry: boolean;
|
|
29
|
+
headers?: Record<string, string>;
|
|
30
|
+
}>;
|
|
31
|
+
/** Circuit breaker compartido entre requests del mismo cliente. */
|
|
32
|
+
breaker: CircuitBreaker;
|
|
19
33
|
}
|
|
20
34
|
export interface HttpResult<T = unknown> {
|
|
21
35
|
ok: boolean;
|
|
22
36
|
status?: number;
|
|
23
37
|
data?: T;
|
|
24
38
|
error?: string;
|
|
39
|
+
errorInstance?: PlatformError;
|
|
25
40
|
}
|
|
26
41
|
export interface RequestOptions {
|
|
27
42
|
method: "GET" | "POST" | "PUT" | "DELETE" | "PATCH";
|
|
@@ -29,11 +44,16 @@ export interface RequestOptions {
|
|
|
29
44
|
body?: object;
|
|
30
45
|
headers?: Record<string, string>;
|
|
31
46
|
query?: Record<string, string | number | undefined | null>;
|
|
32
|
-
/** Enviar cookies (para endpoints que usan cookie httpOnly). */
|
|
33
47
|
credentials?: "include" | "omit";
|
|
34
48
|
}
|
|
35
49
|
export declare function httpRequest<T = unknown>(cfg: HttpConfig, opts: RequestOptions): Promise<HttpResult<T>>;
|
|
36
|
-
export
|
|
50
|
+
export interface HttpConfigInput {
|
|
37
51
|
baseUrl: string;
|
|
38
|
-
|
|
52
|
+
timeoutMs?: number;
|
|
53
|
+
retries?: number;
|
|
54
|
+
onError?: HttpConfig["onError"];
|
|
55
|
+
circuit?: CircuitOptions;
|
|
56
|
+
beforeRetry?: HttpConfig["beforeRetry"];
|
|
57
|
+
}
|
|
58
|
+
export declare function defaultHttpConfig(overrides: HttpConfigInput): HttpConfig;
|
|
39
59
|
//# sourceMappingURL=http.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,cAAc,EAAE,KAAK,cAAc,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAgD,KAAK,aAAa,EAAE,MAAM,aAAa,CAAC;AAE/F,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,CAAC,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAC;IACtE,4EAA4E;IAC5E,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC,CAAC;IAC5I,mEAAmE;IACnE,OAAO,EAAE,cAAc,CAAC;CACzB;AAED,MAAM,WAAW,UAAU,CAAC,CAAC,GAAG,OAAO;IACrC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,KAAK,GAAG,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,OAAO,CAAC;IACpD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,GAAG,IAAI,CAAC,CAAC;IAC3D,WAAW,CAAC,EAAE,SAAS,GAAG,MAAM,CAAC;CAClC;AAcD,wBAAsB,WAAW,CAAC,CAAC,GAAG,OAAO,EAC3C,GAAG,EAAE,UAAU,EACf,IAAI,EAAE,cAAc,GACnB,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CA+DxB;AAED,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,UAAU,CAAC,SAAS,CAAC,CAAC;IAChC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,WAAW,CAAC,EAAE,UAAU,CAAC,aAAa,CAAC,CAAC;CACzC;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,eAAe,GAAG,UAAU,CASxE"}
|
package/dist/internal/http.js
CHANGED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* HTTP helper compartido entre submódulos.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
4
|
+
* Features:
|
|
5
|
+
* - Retries con backoff exponencial ante errores de red o 5xx.
|
|
6
|
+
* - Sin retry en 4xx (es error del caller).
|
|
7
|
+
* - Timeout por request.
|
|
8
|
+
* - Circuit breaker por (baseUrl): evita cascade cuando upstream cae.
|
|
9
|
+
* - Errores tipados (AuthError, RateLimitedError, ServiceError, etc.) en `errorInstance`.
|
|
10
|
+
* - Hook `beforeRetry` (ej. AuthClient lo usa para auto-refresh del JWT).
|
|
11
|
+
* - No lanza: siempre retorna Result<T> (ok/error).
|
|
10
12
|
*/
|
|
13
|
+
import { CircuitBreaker } from "./circuit.js";
|
|
14
|
+
import { CircuitOpenError, NetworkError, mapHttpError } from "./errors.js";
|
|
11
15
|
function buildUrl(baseUrl, path, query) {
|
|
12
16
|
const url = `${baseUrl.replace(/\/$/, "")}${path.startsWith("/") ? path : `/${path}`}`;
|
|
13
17
|
if (!query)
|
|
@@ -23,10 +27,13 @@ function buildUrl(baseUrl, path, query) {
|
|
|
23
27
|
}
|
|
24
28
|
export async function httpRequest(cfg, opts) {
|
|
25
29
|
const url = buildUrl(cfg.baseUrl, opts.path, opts.query);
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
+
const breakerKey = cfg.baseUrl;
|
|
31
|
+
if (!cfg.breaker.allow(breakerKey)) {
|
|
32
|
+
const err = new CircuitOpenError(`Circuit open for ${cfg.baseUrl}`, { path: opts.path, attempt: 0 });
|
|
33
|
+
cfg.onError(err, { path: opts.path, attempt: 0 });
|
|
34
|
+
return { ok: false, error: err.message, errorInstance: err };
|
|
35
|
+
}
|
|
36
|
+
let headers = { "Content-Type": "application/json", ...opts.headers };
|
|
30
37
|
let lastErr;
|
|
31
38
|
for (let attempt = 0; attempt <= cfg.retries; attempt++) {
|
|
32
39
|
try {
|
|
@@ -39,29 +46,41 @@ export async function httpRequest(cfg, opts) {
|
|
|
39
46
|
});
|
|
40
47
|
const json = (await res.json().catch(() => ({})));
|
|
41
48
|
if (res.ok) {
|
|
49
|
+
cfg.breaker.recordSuccess(breakerKey);
|
|
42
50
|
return { ok: true, status: res.status, data: json };
|
|
43
51
|
}
|
|
44
|
-
|
|
52
|
+
const err = mapHttpError(res.status, json, opts.path, attempt);
|
|
53
|
+
lastErr = err;
|
|
54
|
+
// 4xx: sin retry por default. Pero beforeRetry puede pedir retry
|
|
55
|
+
// (ej. AuthClient refresca token y reintenta 401 una vez).
|
|
45
56
|
if (res.status >= 400 && res.status < 500) {
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
57
|
+
const shouldRetry = cfg.beforeRetry && attempt < cfg.retries
|
|
58
|
+
? await cfg.beforeRetry(err, { path: opts.path, attempt })
|
|
59
|
+
: { retry: false };
|
|
60
|
+
if (!shouldRetry.retry) {
|
|
61
|
+
// 4xx → NO toca el breaker (es error del caller, no del servicio).
|
|
62
|
+
return { ok: false, status: res.status, error: err.message, errorInstance: err };
|
|
63
|
+
}
|
|
64
|
+
if (shouldRetry.headers)
|
|
65
|
+
headers = { ...headers, ...shouldRetry.headers };
|
|
66
|
+
continue;
|
|
51
67
|
}
|
|
52
|
-
|
|
68
|
+
// 5xx → cuenta para el breaker
|
|
69
|
+
cfg.breaker.recordFailure(breakerKey);
|
|
53
70
|
}
|
|
54
|
-
catch (
|
|
71
|
+
catch (netErr) {
|
|
72
|
+
const err = new NetworkError(netErr.message, { path: opts.path, attempt, cause: netErr });
|
|
55
73
|
lastErr = err;
|
|
74
|
+
cfg.breaker.recordFailure(breakerKey);
|
|
56
75
|
}
|
|
57
76
|
if (attempt < cfg.retries) {
|
|
58
77
|
cfg.onError(lastErr, { path: opts.path, attempt });
|
|
59
78
|
await new Promise((r) => setTimeout(r, 250 * Math.pow(2, attempt)));
|
|
60
79
|
}
|
|
61
80
|
}
|
|
62
|
-
const err = lastErr ?? new
|
|
81
|
+
const err = lastErr ?? new NetworkError("unknown error", { path: opts.path, attempt: cfg.retries });
|
|
63
82
|
cfg.onError(err, { path: opts.path, attempt: cfg.retries });
|
|
64
|
-
return { ok: false, error: err.message };
|
|
83
|
+
return { ok: false, error: err.message, errorInstance: err };
|
|
65
84
|
}
|
|
66
85
|
export function defaultHttpConfig(overrides) {
|
|
67
86
|
return {
|
|
@@ -69,6 +88,8 @@ export function defaultHttpConfig(overrides) {
|
|
|
69
88
|
timeoutMs: overrides.timeoutMs ?? 10_000,
|
|
70
89
|
retries: Math.max(0, overrides.retries ?? 1),
|
|
71
90
|
onError: overrides.onError ?? (() => { }),
|
|
91
|
+
beforeRetry: overrides.beforeRetry,
|
|
92
|
+
breaker: new CircuitBreaker(overrides.circuit ?? {}),
|
|
72
93
|
};
|
|
73
94
|
}
|
|
74
95
|
//# sourceMappingURL=http.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"http.js","sourceRoot":"","sources":["../../src/internal/http.ts"],"names":[],"mappings":"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"}
|
package/dist/notify/client.d.ts
CHANGED
|
@@ -91,6 +91,11 @@ export declare class NotifyClient {
|
|
|
91
91
|
private readonly onError;
|
|
92
92
|
constructor(cfg: NotifyConfig);
|
|
93
93
|
request<T = unknown>(method: "POST" | "GET" | "DELETE" | "PUT", path: string, body?: object): Promise<NotifyResult<T>>;
|
|
94
|
+
health(): Promise<{
|
|
95
|
+
ok: boolean;
|
|
96
|
+
latencyMs?: number;
|
|
97
|
+
error?: string;
|
|
98
|
+
}>;
|
|
94
99
|
email: {
|
|
95
100
|
send: (params: SendEmailParams) => Promise<NotifyResult>;
|
|
96
101
|
sendQueued: (params: SendEmailParams & {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/notify/client.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/notify/client.ts"],"names":[],"mappings":"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"}
|
package/dist/notify/client.js
CHANGED
|
@@ -65,6 +65,19 @@ export class NotifyClient {
|
|
|
65
65
|
this.onError(err, { path, attempt: this.retries });
|
|
66
66
|
return { ok: false, error: err.message };
|
|
67
67
|
}
|
|
68
|
+
// ── Health ───────────────────────────────────────────────────────────────
|
|
69
|
+
async health() {
|
|
70
|
+
const t0 = Date.now();
|
|
71
|
+
try {
|
|
72
|
+
const res = await fetch(`${this.baseUrl}/health`, { signal: AbortSignal.timeout(this.timeoutMs) });
|
|
73
|
+
if (!res.ok)
|
|
74
|
+
return { ok: false, latencyMs: Date.now() - t0, error: `HTTP ${res.status}` };
|
|
75
|
+
return { ok: true, latencyMs: Date.now() - t0 };
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
return { ok: false, latencyMs: Date.now() - t0, error: err.message };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
68
81
|
// ── Email ────────────────────────────────────────────────────────────────
|
|
69
82
|
email = {
|
|
70
83
|
send: (params) => this.request("POST", "/api/email/send", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/notify/client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/notify/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AA0EH,MAAM,OAAO,YAAY;IACN,OAAO,CAAS;IAChB,MAAM,CAAS;IACf,SAAS,CAAS;IAClB,OAAO,CAAS;IAChB,OAAO,CAAuC;IAE/D,YAAY,GAAiB;QAC3B,IAAI,CAAC,OAAO,GAAG,CAAC,GAAG,CAAC,OAAO,IAAI,2BAA2B,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC/E,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,MAAM,CAAC;QACzC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,OAAO,IAAI,CAAC,CAAC,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;IAC3C,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,OAAO,CACX,MAAyC,EACzC,IAAY,EACZ,IAAa;QAEb,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,uBAAuB,EAAE,CAAC;QACvE,IAAI,OAA0B,CAAC;QAC/B,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,CAAC;YACzD,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,EAAE;oBAChD,MAAM;oBACN,OAAO,EAAE;wBACP,cAAc,EAAE,kBAAkB;wBAClC,WAAW,EAAE,IAAI,CAAC,MAAM;qBACzB;oBACD,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC7C,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC;iBAC5C,CAAC,CAAC;gBACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,CAA4B,CAAC;gBAC7E,IAAI,GAAG,CAAC,EAAE,EAAE,CAAC;oBACX,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,SAAS,EAAG,IAAI,CAAC,SAAoB,IAAK,IAAI,CAAC,EAAa;wBAC5D,GAAG,EAAE,IAAI,CAAC,GAAyB;wBACnC,IAAI,EAAE,IAAS;qBAChB,CAAC;gBACJ,CAAC;gBACD,6CAA6C;gBAC7C,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;oBAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAG,IAAI,CAAC,KAAgB,IAAI,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;gBAC9E,CAAC;gBACD,OAAO,GAAG,IAAI,KAAK,CAAC,QAAQ,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,OAAO,GAAG,GAAY,CAAC;YACzB,CAAC;YACD,IAAI,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;gBAC3B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;gBACzC,MAAM,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC;YACtE,CAAC;QACH,CAAC;QACD,MAAM,GAAG,GAAG,OAAO,IAAI,IAAI,KAAK,CAAC,eAAe,CAAC,CAAC;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;IAC3C,CAAC;IAED,4EAA4E;IAC5E,KAAK,CAAC,MAAM;QACV,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,CAAC,OAAO,SAAS,EAAE,EAAE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;YACnG,IAAI,CAAC,GAAG,CAAC,EAAE;gBAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3F,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC;QAClD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,KAAK,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC;QAClF,CAAC;IACH,CAAC;IAED,4EAA4E;IAC5E,KAAK,GAAG;QACN,IAAI,EAAE,CAAC,MAAuB,EAAyB,EAAE,CACvD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE;YACtC,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK,IAAI,IAAI;SAC5B,CAAC;QAEJ,UAAU,EAAE,CAAC,MAAkD,EAAyB,EAAE,CACxF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,wBAAwB,EAAE,MAAM,CAAC;QAExD,0EAA0E;QAC1E,YAAY,EAAE,CACZ,UAAkB,EAClB,IAAoH,EAC7F,EAAE,CACzB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE;YACtC,UAAU;YACV,EAAE,EAAE,IAAI,CAAC,EAAE;YACX,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI;SAC1B,CAAC;KACL,CAAC;IAEF,4EAA4E;IAC5E,QAAQ,GAAG;QACT,MAAM,EAAE,CAAC,CAAsB,EAAyB,EAAE,CACxD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE;YACpC,GAAG,CAAC;YACJ,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;SACjC,CAAC;KACL,CAAC;IAEF,4EAA4E;IAC5E,GAAG,GAAG;QACJ,IAAI,EAAE,CAAC,CAAgB,EAAyB,EAAE,CAChD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE;YACpC,GAAG,CAAC;YACJ,SAAS,EAAE,CAAC,CAAC,SAAS,IAAI,QAAQ;SACnC,CAAC;QACJ,MAAM,EAAE,CAAC,CAAkB,EAAyB,EAAE,CACpD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,iBAAiB,EAAE,CAAC,CAAC;KAC7C,CAAC;IAEF,4EAA4E;IAC5E,IAAI,GAAG;QACL,IAAI,EAAE,CAAC,CAAoB,EAAyB,EAAE,CACpD,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;KAC5C,CAAC;IAEF,4EAA4E;IAC5E,GAAG,GAAG;QACJ,IAAI,EAAE,CAAC,CAAmD,EAAyB,EAAE,CACnF,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,eAAe,EAAE,CAAC,CAAC;KAC3C,CAAC;IAEF,4EAA4E;IAC5E,QAAQ,GAAG;QACT,IAAI,EAAE,CAAC,UAAkB,EAAE,CAA6E,EAAyB,EAAE,CACjI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,2BAA2B,UAAU,OAAO,EAAE,CAAC,CAAC;KACxE,CAAC;CACH;AAED,+EAA+E;AAC/E;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,aAAa,CAAC,SAAiC;IAC7D,OAAO,IAAI,YAAY,CAAC;QACtB,OAAO,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc;QACnC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,EAAE;QACtE,GAAG,SAAS;KACb,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Verifica que el header `X-Zentto-Signature` matchee el HMAC-SHA256 del
|
|
3
|
+
* body crudo con la clave dada. Usa `timingSafeEqual` para prevenir timing
|
|
4
|
+
* attacks.
|
|
5
|
+
*
|
|
6
|
+
* @param rawBody string UTF-8 del body del POST (NO el parseado JSON).
|
|
7
|
+
* @param signature valor del header X-Zentto-Signature (formato "sha256=<hex>").
|
|
8
|
+
* @param key secret o secretHash según convención del publisher.
|
|
9
|
+
*/
|
|
10
|
+
export declare function verifySignature(rawBody: string, signature: string | string[] | undefined, key: string): boolean;
|
|
11
|
+
/** Firma un body con la misma convención (útil para tests y mocks). */
|
|
12
|
+
export declare function signBody(rawBody: string, key: string): string;
|
|
13
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/webhooks/index.ts"],"names":[],"mappings":"AA0BA;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,SAAS,EACxC,GAAG,EAAE,MAAM,GACV,OAAO,CAYT;AAED,uEAAuE;AACvE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAG7D"}
|