@hostwebhook/platform-contracts 0.4.0 → 0.6.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.
|
@@ -68,6 +68,38 @@ export interface GrabadorDeHistorial {
|
|
|
68
68
|
* tiene que garantizarlo también.
|
|
69
69
|
*/
|
|
70
70
|
cerrar(correlationId: string): void;
|
|
71
|
+
/**
|
|
72
|
+
* Sella la versión del flujo y devuelve su huella, o `null` si no hay flujo
|
|
73
|
+
* que sellar.
|
|
74
|
+
*
|
|
75
|
+
* ## 🔥 Por qué está en el contrato y no se calcula donde se graba
|
|
76
|
+
*
|
|
77
|
+
* La huella ES la forma del flujo, y la forma se lee del LIENZO, que hoy
|
|
78
|
+
* vive en el gateway. Sin lienzo no hay huella, y no se puede inventar.
|
|
79
|
+
*
|
|
80
|
+
* Cuando hw-nodes empezó a grabar el historial por su cuenta, esta llamada
|
|
81
|
+
* se quedó fuera — y el efecto no era «esta corrida pierde su foto»:
|
|
82
|
+
* `asegurarVersion` no CONSULTA la versión, la **CREA**. El que graba el paso
|
|
83
|
+
* es el único que la llama, así que sin ella **deja de haber fotos** y el
|
|
84
|
+
* historial de versiones del flujo se congela en la última que selló el
|
|
85
|
+
* gateway.
|
|
86
|
+
*
|
|
87
|
+
* ## ⚠️ Es `Promise`, a diferencia de los otros dos
|
|
88
|
+
*
|
|
89
|
+
* `registrarPaso` y `cerrar` son `void` porque corren en el camino caliente
|
|
90
|
+
* de cada paso. Éste no: se llama **una vez por corrida** —quien lo
|
|
91
|
+
* implemente debe recordar el resultado por `correlationId`— y el que graba
|
|
92
|
+
* necesita la huella para escribirla en la fila. Un `void` aquí obligaría a
|
|
93
|
+
* escribir la corrida sin huella y volver a por ella después.
|
|
94
|
+
*
|
|
95
|
+
* ⚠️ Y devuelve `null` de verdad cuando no hay nada que sellar (sin
|
|
96
|
+
* `workspaceId`, o si el lienzo falla). `null` NO es «reusa la última»:
|
|
97
|
+
* escribir una huella que no es la de esa corrida se lee peor que no tener
|
|
98
|
+
* ninguna, porque nadie sospecha de ella.
|
|
99
|
+
*/
|
|
100
|
+
sellarVersion(orgId: string, workspaceId?: string,
|
|
101
|
+
/** De qué nodo salió la corrida. Decide QUÉ flujo se sella. */
|
|
102
|
+
sourceId?: string): Promise<string | null>;
|
|
71
103
|
}
|
|
72
104
|
/**
|
|
73
105
|
* ⚠️ Cadena y no `Symbol`, igual que el resto de tokens de la Fase 2.
|
|
@@ -75,11 +75,56 @@ export interface EventoDeCorrida {
|
|
|
75
75
|
headers?: unknown;
|
|
76
76
|
sourceIp?: unknown;
|
|
77
77
|
webhookId?: unknown;
|
|
78
|
+
/** El cuerpo del evento. Lo leen diez sitios. */
|
|
79
|
+
payload?: unknown;
|
|
80
|
+
/**
|
|
81
|
+
* 🔥 El paso en una cadena de webhooks encadenados. Lo lee
|
|
82
|
+
* `onDeliveryResult` para decidir si sigue la cadena, y sin él la cadena se
|
|
83
|
+
* corta en el primer salto **sin error**.
|
|
84
|
+
*/
|
|
85
|
+
chainStep?: unknown;
|
|
78
86
|
}
|
|
79
87
|
/** Y de un webhook: dos campos. */
|
|
88
|
+
/**
|
|
89
|
+
* Lo que el motor lee de un webhook.
|
|
90
|
+
*
|
|
91
|
+
* 🔥 Esto declaraba DOS campos —`id` y `name`— y el motor lee dieciocho. El
|
|
92
|
+
* hueco no era cosmético: `onDeliveryResult` implementa el CORTACIRCUITOS
|
|
93
|
+
* leyendo `circuitState`, `healthStatus` y los contadores de medio abierto. Con
|
|
94
|
+
* el tipo estrecho, quien construyera el objeto mirando esta interfaz mandaría
|
|
95
|
+
* sólo `id` y `name`, los cinco campos llegarían `undefined`, y
|
|
96
|
+
* `circuitState === 'open'` sería SIEMPRE falso.
|
|
97
|
+
*
|
|
98
|
+
* O sea: el cortacircuitos dejaría de saltar y de recuperarse, en silencio y
|
|
99
|
+
* con todo en verde. Se vio al ir a poner `onDeliveryResult` en el contrato.
|
|
100
|
+
*
|
|
101
|
+
* ⚠️ Todo opcional salvo `id`: es un añadido, no un cambio de forma.
|
|
102
|
+
*/
|
|
80
103
|
export interface WebhookDeCorrida {
|
|
81
104
|
id: unknown;
|
|
82
105
|
name?: unknown;
|
|
106
|
+
_id?: unknown;
|
|
107
|
+
organizationId?: unknown;
|
|
108
|
+
workspaceId?: unknown;
|
|
109
|
+
userId?: unknown;
|
|
110
|
+
entity?: unknown;
|
|
111
|
+
targetUrl?: unknown;
|
|
112
|
+
retryStrategy?: unknown;
|
|
113
|
+
retryDelaySeconds?: unknown;
|
|
114
|
+
maxRetries?: unknown;
|
|
115
|
+
delaySeconds?: unknown;
|
|
116
|
+
priority?: unknown;
|
|
117
|
+
circuitState?: unknown;
|
|
118
|
+
healthStatus?: unknown;
|
|
119
|
+
halfOpenSuccesses?: unknown;
|
|
120
|
+
halfOpenSuccessThreshold?: unknown;
|
|
121
|
+
autoReplayOnRecovery?: unknown;
|
|
122
|
+
}
|
|
123
|
+
/** Lo que devolvió una entrega. */
|
|
124
|
+
export interface ResultadoDeEntrega {
|
|
125
|
+
success: boolean;
|
|
126
|
+
statusCode: number;
|
|
127
|
+
responseBody: string;
|
|
83
128
|
}
|
|
84
129
|
/**
|
|
85
130
|
* El contexto de la corrida.
|
|
@@ -192,6 +237,35 @@ export interface DespachoDelMotor {
|
|
|
192
237
|
comment?: string;
|
|
193
238
|
[k: string]: unknown;
|
|
194
239
|
}): Promise<void>;
|
|
240
|
+
/**
|
|
241
|
+
* La vuelta siguiente de un bucle, cuando la trae un trabajo de la cola.
|
|
242
|
+
*
|
|
243
|
+
* ⚠️ No es lo mismo que `dispatchOutputNodes`: el bucle lleva su propio
|
|
244
|
+
* estado —`loopStateId` en el contexto— y esta llamada continúa una iteración
|
|
245
|
+
* concreta, no arranca un despacho.
|
|
246
|
+
*/
|
|
247
|
+
handleLoopIteration(event: EventoDeCorrida, webhook: WebhookDeCorrida, loopNode: unknown, payload: Record<string, unknown>, ctx: ContextoDeCorrida, depth: number): Promise<void>;
|
|
248
|
+
/** Vacía el buffer de un agregador cuando le toca. */
|
|
249
|
+
handleAggregatorFlush(data: {
|
|
250
|
+
aggregatorNodeId: string;
|
|
251
|
+
groupKey: string;
|
|
252
|
+
webhookId: string;
|
|
253
|
+
orgId: string;
|
|
254
|
+
propagationDepth: number;
|
|
255
|
+
backoffCapMs?: number;
|
|
256
|
+
[k: string]: unknown;
|
|
257
|
+
}): Promise<void>;
|
|
258
|
+
/**
|
|
259
|
+
* Lo que pasa DESPUÉS de entregar: nodos de aguas abajo y cortacircuitos.
|
|
260
|
+
*
|
|
261
|
+
* 🔥 Es el que obligó a ensanchar `WebhookDeCorrida`. Lee `circuitState`,
|
|
262
|
+
* `healthStatus` y los contadores de medio abierto para decidir si el
|
|
263
|
+
* circuito se abre, se cierra o sigue igual — con el tipo estrecho de antes,
|
|
264
|
+
* esos campos llegaban `undefined` y el cortacircuitos no hacía nada.
|
|
265
|
+
*/
|
|
266
|
+
onDeliveryResult(event: EventoDeCorrida, webhook: WebhookDeCorrida, result: ResultadoDeEntrega, ctx: ContextoDeCorrida & {
|
|
267
|
+
isRouter?: boolean;
|
|
268
|
+
}): Promise<void>;
|
|
195
269
|
/** Reanuda cuando a un merge se le acaba el tiempo de espera. */
|
|
196
270
|
resumeAfterMergeTimeout(mergeState: EstadoDeMerge, mergeNode: NodoDeMerge): Promise<void>;
|
|
197
271
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hostwebhook/platform-contracts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.6.0",
|
|
4
4
|
"description": "Contratos compartidos entre los servicios de HostWebhook: addons del plan, identidad interna, y las formas que cruzan una frontera de red",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|