@hostwebhook/platform-contracts 0.3.1 → 0.5.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.
|
@@ -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.
|
|
@@ -99,7 +144,30 @@ export interface ContextoDeCorrida {
|
|
|
99
144
|
orgId: string;
|
|
100
145
|
backoffCapMs?: number;
|
|
101
146
|
maxNodeCycles?: number;
|
|
147
|
+
/**
|
|
148
|
+
* ⚠️ `Record`, no `Map`, y es la única diferencia deliberada con el
|
|
149
|
+
* `PipelineContext` del motor: **un `Map` se serializa como `{}`**. Este
|
|
150
|
+
* contexto cruza un cable, así que el contrato pide la forma que sobrevive.
|
|
151
|
+
* Quien lo pase desde dentro tiene que aplanarlo (`Object.fromEntries`).
|
|
152
|
+
*/
|
|
102
153
|
nodeVisitCounts?: Record<string, number>;
|
|
154
|
+
/** Marca la corrida como prueba: no cuenta para el historial de producción. */
|
|
155
|
+
isTest?: boolean;
|
|
156
|
+
/** En una prueba, propagar por todos los nodos de aguas abajo. */
|
|
157
|
+
propagateNodes?: boolean;
|
|
158
|
+
/** 🔥 Tope contra la propagación infinita. Sin esto no hay red. */
|
|
159
|
+
propagationDepth?: number;
|
|
160
|
+
/** Saltarse la entrega primaria (despachos que sólo notifican). */
|
|
161
|
+
skipPrimaryDelivery?: boolean;
|
|
162
|
+
/** 🔥 Estado del bucle: con él, los nodos de dentro escriben checkpoints. */
|
|
163
|
+
loopStateId?: string;
|
|
164
|
+
/** Payloads de workspace que pisa el bucle en cada vuelta. */
|
|
165
|
+
wsPayloadOverrides?: Record<string, Record<string, unknown>>;
|
|
166
|
+
/**
|
|
167
|
+
* 🔥 Pila de llamadas entre workspaces (`"nodeType:nodeId"`). Es lo que
|
|
168
|
+
* detecta los ciclos de FlowLinks y aplica el `maxFlowCallDepth` del plan.
|
|
169
|
+
*/
|
|
170
|
+
callStack?: string[];
|
|
103
171
|
}
|
|
104
172
|
/** Una espera pendiente, de lo que el motor le lee. */
|
|
105
173
|
export interface EsperaPendiente {
|
|
@@ -169,6 +237,35 @@ export interface DespachoDelMotor {
|
|
|
169
237
|
comment?: string;
|
|
170
238
|
[k: string]: unknown;
|
|
171
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>;
|
|
172
269
|
/** Reanuda cuando a un merge se le acaba el tiempo de espera. */
|
|
173
270
|
resumeAfterMergeTimeout(mergeState: EstadoDeMerge, mergeNode: NodoDeMerge): Promise<void>;
|
|
174
271
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@hostwebhook/platform-contracts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.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",
|