@nestarc/webhook 0.7.0 → 0.9.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 +20 -1
- package/dist/adapters/prisma-delivery.repository.d.ts +5 -3
- package/dist/adapters/prisma-delivery.repository.d.ts.map +1 -1
- package/dist/adapters/prisma-delivery.repository.js +136 -5
- package/dist/adapters/prisma-delivery.repository.js.map +1 -1
- package/dist/adapters/prisma-endpoint.repository.d.ts.map +1 -1
- package/dist/adapters/prisma-endpoint.repository.js +2 -0
- package/dist/adapters/prisma-endpoint.repository.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/webhook-delivery.interface.d.ts +13 -0
- package/dist/interfaces/webhook-delivery.interface.d.ts.map +1 -1
- package/dist/interfaces/webhook-endpoint.interface.d.ts +1 -0
- package/dist/interfaces/webhook-endpoint.interface.d.ts.map +1 -1
- package/dist/interfaces/webhook-options.interface.d.ts +16 -0
- package/dist/interfaces/webhook-options.interface.d.ts.map +1 -1
- package/dist/ports/webhook-delivery.repository.d.ts +3 -1
- package/dist/ports/webhook-delivery.repository.d.ts.map +1 -1
- package/dist/webhook.admin.service.d.ts +2 -1
- package/dist/webhook.admin.service.d.ts.map +1 -1
- package/dist/webhook.admin.service.js +3 -0
- package/dist/webhook.admin.service.js.map +1 -1
- package/dist/webhook.delivery-admin.service.d.ts +2 -1
- package/dist/webhook.delivery-admin.service.d.ts.map +1 -1
- package/dist/webhook.delivery-admin.service.js +3 -0
- package/dist/webhook.delivery-admin.service.js.map +1 -1
- package/dist/webhook.delivery-worker.d.ts.map +1 -1
- package/dist/webhook.delivery-worker.js +13 -3
- package/dist/webhook.delivery-worker.js.map +1 -1
- package/dist/webhook.dispatcher.js +1 -1
- package/dist/webhook.dispatcher.js.map +1 -1
- package/dist/webhook.signer.d.ts +2 -0
- package/dist/webhook.signer.d.ts.map +1 -1
- package/dist/webhook.signer.js +28 -14
- package/dist/webhook.signer.js.map +1 -1
- package/package.json +1 -1
- package/src/sql/create-webhook-tables.sql +26 -0
package/README.md
CHANGED
|
@@ -186,9 +186,28 @@ export class WebhookController {
|
|
|
186
186
|
| `polling.staleSendingMinutes` | `5` | Minutes before a stuck SENDING delivery is recovered |
|
|
187
187
|
| `allowPrivateUrls` | `false` | Allow private/internal URLs (dev/test only) |
|
|
188
188
|
| `secretVault` | `PlaintextSecretVault` | Custom vault for encrypting/decrypting endpoint secrets at rest |
|
|
189
|
-
| `onDeliveryFailed` | — | Fire-and-forget callback when a delivery exhausts all retries. Receives `DeliveryFailedContext` (`tenantId` is `null` for global endpoints). |
|
|
189
|
+
| `onDeliveryFailed` | — | Fire-and-forget callback when a delivery exhausts all retries. Receives `DeliveryFailedContext` (`tenantId` is `null` for global endpoints). See **Delivery failure classification** below. |
|
|
190
190
|
| `onEndpointDisabled` | — | Fire-and-forget callback when the circuit breaker disables an endpoint. Fires once at exact threshold crossing. |
|
|
191
191
|
|
|
192
|
+
**Delivery failure classification.** `DeliveryFailedContext.failureKind` categorizes why a delivery was abandoned after all retries:
|
|
193
|
+
|
|
194
|
+
| `failureKind` | When | Extra fields |
|
|
195
|
+
|---|---|---|
|
|
196
|
+
| `url_validation` | SSRF defense rejected the URL (private, loopback, link-local, etc.) | `validationReason`, `validationUrl`, `resolvedIp` |
|
|
197
|
+
| `dispatch_error` | Dispatcher threw (DNS failure, ECONNREFUSED, timeout) | — |
|
|
198
|
+
| `http_error` | Endpoint responded with non-2xx status | `responseStatus` |
|
|
199
|
+
|
|
200
|
+
```ts
|
|
201
|
+
onDeliveryFailed: (ctx) => {
|
|
202
|
+
if (ctx.failureKind === 'url_validation') {
|
|
203
|
+
// ctx.validationReason: 'private' | 'loopback' | 'link_local' | ...
|
|
204
|
+
alerting.endpointMisconfigured(ctx.endpointId, ctx.validationReason);
|
|
205
|
+
} else if (ctx.failureKind === 'http_error') {
|
|
206
|
+
alerting.downstreamUnhealthy(ctx.endpointId, ctx.responseStatus);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
```
|
|
210
|
+
|
|
192
211
|
### Custom adapters
|
|
193
212
|
|
|
194
213
|
Replace default Prisma or fetch implementations by providing custom ports:
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { PendingDelivery, WebhookDeliveryRepository } from '../ports/webhook-delivery.repository';
|
|
2
|
-
import { DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
2
|
+
import { DeliveryAttemptRecord, DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
3
3
|
import { WebhookSecretVault } from '../ports/webhook-secret-vault';
|
|
4
4
|
export declare class PrismaDeliveryRepository implements WebhookDeliveryRepository {
|
|
5
|
-
|
|
6
|
-
|
|
5
|
+
protected readonly prisma: any;
|
|
6
|
+
protected readonly vault?: WebhookSecretVault | undefined;
|
|
7
7
|
constructor(prisma: any, vault?: WebhookSecretVault | undefined);
|
|
8
8
|
createDeliveriesInTransaction(tx: any, eventId: string, endpointIds: string[], maxAttempts: number): Promise<void>;
|
|
9
9
|
runInTransaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T>;
|
|
@@ -14,7 +14,9 @@ export declare class PrismaDeliveryRepository implements WebhookDeliveryReposito
|
|
|
14
14
|
markRetry(deliveryId: string, attempts: number, nextAt: Date, result: DeliveryResult): Promise<void>;
|
|
15
15
|
recoverStaleSending(stalenessMinutes: number): Promise<number>;
|
|
16
16
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
17
|
+
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
17
18
|
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
18
19
|
createTestDelivery(eventId: string, endpointId: string): Promise<void>;
|
|
20
|
+
protected appendAttemptLog(deliveryId: string, attempts: number, status: 'PENDING' | 'SENT' | 'FAILED', result: DeliveryResult): Promise<void>;
|
|
19
21
|
}
|
|
20
22
|
//# sourceMappingURL=prisma-delivery.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-delivery.repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,yBAAyB,EAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACf,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"prisma-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-delivery.repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,eAAe,EACf,yBAAyB,EAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACf,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAyBnE,qBACa,wBAAyB,YAAW,yBAAyB;IAEtE,SAAS,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG;IAC9B,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,kBAAkB;gBAD1B,MAAM,EAAE,GAAG,EACX,KAAK,CAAC,EAAE,kBAAkB,YAAA;IAGzC,6BAA6B,CACjC,EAAE,EAAE,GAAG,EACP,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC;IAqCV,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqBrE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAgCnE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAYrF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAavF,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAaV,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAY9D,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAkDtB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAkBzE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQnD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;cA+B5D,gBAAgB,CAC9B,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,EACrC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;CAkCjB"}
|
|
@@ -11,6 +11,25 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.PrismaDeliveryRepository = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
|
+
const MAX_ATTEMPT_RESPONSE_BODY_LENGTH = 4096;
|
|
15
|
+
function truncateAttemptResponseBody(body) {
|
|
16
|
+
if (body == null) {
|
|
17
|
+
return {
|
|
18
|
+
responseBody: null,
|
|
19
|
+
responseBodyTruncated: false,
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (body.length <= MAX_ATTEMPT_RESPONSE_BODY_LENGTH) {
|
|
23
|
+
return {
|
|
24
|
+
responseBody: body,
|
|
25
|
+
responseBodyTruncated: false,
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
responseBody: body.slice(0, MAX_ATTEMPT_RESPONSE_BODY_LENGTH),
|
|
30
|
+
responseBodyTruncated: true,
|
|
31
|
+
};
|
|
32
|
+
}
|
|
14
33
|
let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
15
34
|
prisma;
|
|
16
35
|
vault;
|
|
@@ -19,8 +38,35 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
19
38
|
this.vault = vault;
|
|
20
39
|
}
|
|
21
40
|
async createDeliveriesInTransaction(tx, eventId, endpointIds, maxAttempts) {
|
|
22
|
-
await tx.$executeRawUnsafe(`INSERT INTO webhook_deliveries (
|
|
23
|
-
|
|
41
|
+
await tx.$executeRawUnsafe(`INSERT INTO webhook_deliveries (
|
|
42
|
+
event_id,
|
|
43
|
+
endpoint_id,
|
|
44
|
+
status,
|
|
45
|
+
attempts,
|
|
46
|
+
max_attempts,
|
|
47
|
+
next_attempt_at,
|
|
48
|
+
endpoint_url_snapshot,
|
|
49
|
+
signing_secret_snapshot,
|
|
50
|
+
secondary_signing_secret_snapshot
|
|
51
|
+
)
|
|
52
|
+
SELECT
|
|
53
|
+
$1::uuid,
|
|
54
|
+
e.id,
|
|
55
|
+
'PENDING',
|
|
56
|
+
0,
|
|
57
|
+
$3,
|
|
58
|
+
NOW(),
|
|
59
|
+
e.url,
|
|
60
|
+
e.secret,
|
|
61
|
+
CASE
|
|
62
|
+
WHEN e.previous_secret IS NOT NULL
|
|
63
|
+
AND e.previous_secret_expires_at IS NOT NULL
|
|
64
|
+
AND e.previous_secret_expires_at > NOW()
|
|
65
|
+
THEN e.previous_secret
|
|
66
|
+
ELSE NULL
|
|
67
|
+
END
|
|
68
|
+
FROM webhook_endpoints e
|
|
69
|
+
WHERE e.id = ANY($2::uuid[])`, eventId, endpointIds, maxAttempts);
|
|
24
70
|
}
|
|
25
71
|
async runInTransaction(fn) {
|
|
26
72
|
return this.prisma.$transaction(fn);
|
|
@@ -50,7 +96,13 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
50
96
|
SELECT
|
|
51
97
|
d.id, d.event_id, d.endpoint_id, d.attempts, d.max_attempts,
|
|
52
98
|
e.tenant_id::text AS tenant_id,
|
|
53
|
-
|
|
99
|
+
COALESCE(d.endpoint_url_snapshot, e.url) AS url,
|
|
100
|
+
COALESCE(d.signing_secret_snapshot, e.secret) AS secret,
|
|
101
|
+
CASE
|
|
102
|
+
WHEN d.secondary_signing_secret_snapshot IS NULL
|
|
103
|
+
THEN ARRAY[]::text[]
|
|
104
|
+
ELSE ARRAY[d.secondary_signing_secret_snapshot]
|
|
105
|
+
END AS "additionalSecrets",
|
|
54
106
|
ev.event_type, ev.payload
|
|
55
107
|
FROM webhook_deliveries d
|
|
56
108
|
JOIN webhook_endpoints e ON e.id = d.endpoint_id
|
|
@@ -59,6 +111,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
59
111
|
if (this.vault) {
|
|
60
112
|
for (const row of rows) {
|
|
61
113
|
row.secret = await this.vault.decrypt(row.secret);
|
|
114
|
+
row.additionalSecrets = await Promise.all((row.additionalSecrets ?? []).map((secret) => this.vault.decrypt(secret)));
|
|
62
115
|
}
|
|
63
116
|
}
|
|
64
117
|
return rows;
|
|
@@ -72,6 +125,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
72
125
|
response_body = ${result.body ?? null},
|
|
73
126
|
latency_ms = ${result.latencyMs}
|
|
74
127
|
WHERE id = ${deliveryId}::uuid`;
|
|
128
|
+
await this.appendAttemptLog(deliveryId, attempts, 'SENT', result);
|
|
75
129
|
}
|
|
76
130
|
async markFailed(deliveryId, attempts, result) {
|
|
77
131
|
await this.prisma.$executeRaw `
|
|
@@ -83,6 +137,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
83
137
|
latency_ms = ${result.latencyMs},
|
|
84
138
|
last_error = ${result.error ?? null}
|
|
85
139
|
WHERE id = ${deliveryId}::uuid`;
|
|
140
|
+
await this.appendAttemptLog(deliveryId, attempts, 'FAILED', result);
|
|
86
141
|
}
|
|
87
142
|
async markRetry(deliveryId, attempts, nextAt, result) {
|
|
88
143
|
await this.prisma.$executeRaw `
|
|
@@ -94,6 +149,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
94
149
|
latency_ms = ${result.latencyMs},
|
|
95
150
|
last_error = ${result.error ?? null}
|
|
96
151
|
WHERE id = ${deliveryId}::uuid`;
|
|
152
|
+
await this.appendAttemptLog(deliveryId, attempts, 'PENDING', result);
|
|
97
153
|
}
|
|
98
154
|
async recoverStaleSending(stalenessMinutes) {
|
|
99
155
|
const interval = `${stalenessMinutes} minutes`;
|
|
@@ -132,6 +188,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
132
188
|
SELECT d.id, d.status, d.attempts,
|
|
133
189
|
d.event_id AS "eventId",
|
|
134
190
|
d.endpoint_id AS "endpointId",
|
|
191
|
+
COALESCE(d.endpoint_url_snapshot, ep.url) AS "destinationUrl",
|
|
135
192
|
d.max_attempts AS "maxAttempts",
|
|
136
193
|
d.next_attempt_at AS "nextAttemptAt",
|
|
137
194
|
d.last_attempt_at AS "lastAttemptAt",
|
|
@@ -142,6 +199,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
142
199
|
d.last_error AS "lastError"
|
|
143
200
|
FROM webhook_deliveries d
|
|
144
201
|
JOIN webhook_events ev ON ev.id = d.event_id
|
|
202
|
+
JOIN webhook_endpoints ep ON ep.id = d.endpoint_id
|
|
145
203
|
WHERE ${conditions.join(' AND ')}
|
|
146
204
|
ORDER BY d.last_attempt_at DESC NULLS LAST
|
|
147
205
|
LIMIT $${paramIndex++}
|
|
@@ -150,6 +208,23 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
150
208
|
const results = await this.prisma.$queryRawUnsafe(query, ...values);
|
|
151
209
|
return results;
|
|
152
210
|
}
|
|
211
|
+
async getDeliveryAttempts(deliveryId) {
|
|
212
|
+
return this.prisma.$queryRaw `
|
|
213
|
+
SELECT
|
|
214
|
+
id,
|
|
215
|
+
delivery_id AS "deliveryId",
|
|
216
|
+
attempt_number AS "attemptNumber",
|
|
217
|
+
status,
|
|
218
|
+
response_status AS "responseStatus",
|
|
219
|
+
response_body AS "responseBody",
|
|
220
|
+
response_body_truncated AS "responseBodyTruncated",
|
|
221
|
+
latency_ms AS "latencyMs",
|
|
222
|
+
last_error AS "lastError",
|
|
223
|
+
created_at AS "createdAt"
|
|
224
|
+
FROM webhook_delivery_attempts
|
|
225
|
+
WHERE delivery_id = ${deliveryId}::uuid
|
|
226
|
+
ORDER BY attempt_number ASC`;
|
|
227
|
+
}
|
|
153
228
|
async retryDelivery(deliveryId) {
|
|
154
229
|
const result = await this.prisma.$executeRaw `
|
|
155
230
|
UPDATE webhook_deliveries
|
|
@@ -159,8 +234,64 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
159
234
|
}
|
|
160
235
|
async createTestDelivery(eventId, endpointId) {
|
|
161
236
|
await this.prisma.$executeRaw `
|
|
162
|
-
INSERT INTO webhook_deliveries (
|
|
163
|
-
|
|
237
|
+
INSERT INTO webhook_deliveries (
|
|
238
|
+
event_id,
|
|
239
|
+
endpoint_id,
|
|
240
|
+
status,
|
|
241
|
+
max_attempts,
|
|
242
|
+
next_attempt_at,
|
|
243
|
+
endpoint_url_snapshot,
|
|
244
|
+
signing_secret_snapshot,
|
|
245
|
+
secondary_signing_secret_snapshot
|
|
246
|
+
)
|
|
247
|
+
SELECT
|
|
248
|
+
${eventId}::uuid,
|
|
249
|
+
e.id,
|
|
250
|
+
'PENDING',
|
|
251
|
+
1,
|
|
252
|
+
NOW(),
|
|
253
|
+
e.url,
|
|
254
|
+
e.secret,
|
|
255
|
+
CASE
|
|
256
|
+
WHEN e.previous_secret IS NOT NULL
|
|
257
|
+
AND e.previous_secret_expires_at IS NOT NULL
|
|
258
|
+
AND e.previous_secret_expires_at > NOW()
|
|
259
|
+
THEN e.previous_secret
|
|
260
|
+
ELSE NULL
|
|
261
|
+
END
|
|
262
|
+
FROM webhook_endpoints e
|
|
263
|
+
WHERE e.id = ${endpointId}::uuid`;
|
|
264
|
+
}
|
|
265
|
+
async appendAttemptLog(deliveryId, attempts, status, result) {
|
|
266
|
+
const { responseBody, responseBodyTruncated } = truncateAttemptResponseBody(result.body ?? null);
|
|
267
|
+
try {
|
|
268
|
+
await this.prisma.$executeRaw `
|
|
269
|
+
INSERT INTO webhook_delivery_attempts (
|
|
270
|
+
delivery_id,
|
|
271
|
+
attempt_number,
|
|
272
|
+
status,
|
|
273
|
+
response_status,
|
|
274
|
+
response_body,
|
|
275
|
+
response_body_truncated,
|
|
276
|
+
latency_ms,
|
|
277
|
+
last_error
|
|
278
|
+
)
|
|
279
|
+
VALUES (
|
|
280
|
+
${deliveryId}::uuid,
|
|
281
|
+
${attempts},
|
|
282
|
+
${status},
|
|
283
|
+
${result.statusCode ?? null},
|
|
284
|
+
${responseBody},
|
|
285
|
+
${responseBodyTruncated},
|
|
286
|
+
${result.latencyMs},
|
|
287
|
+
${result.error ?? null}
|
|
288
|
+
)`;
|
|
289
|
+
}
|
|
290
|
+
catch (error) {
|
|
291
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
292
|
+
// Best-effort logging only. Delivery state has already been committed above.
|
|
293
|
+
console.error(`[PrismaDeliveryRepository] Failed to append attempt log for ${deliveryId}#${attempts}: ${message}`);
|
|
294
|
+
}
|
|
164
295
|
}
|
|
165
296
|
};
|
|
166
297
|
exports.PrismaDeliveryRepository = PrismaDeliveryRepository;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-delivery.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-delivery.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;
|
|
1
|
+
{"version":3,"file":"prisma-delivery.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-delivery.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-endpoint.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"prisma-endpoint.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAwBnE,qBACa,wBAAyB,YAAW,yBAAyB;IAEtE,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC;gBADN,MAAM,EAAE,GAAG,EACX,KAAK,CAAC,EAAE,kBAAkB,YAAA;IAGvC,qBAAqB,CACzB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBtB,kCAAkC,CACtC,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAoBtB,cAAc,CAClB,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,wBAAwB,CAAC;IAgB9B,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAQvD,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAe3D,cAAc,CAClB,EAAE,EAAE,MAAM,EACV,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAqC3B,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQhD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOlE,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAYzE"}
|
|
@@ -18,6 +18,7 @@ const ENDPOINT_COLUMNS = `
|
|
|
18
18
|
consecutive_failures AS "consecutiveFailures",
|
|
19
19
|
disabled_at AS "disabledAt",
|
|
20
20
|
disabled_reason AS "disabledReason",
|
|
21
|
+
previous_secret_expires_at AS "previousSecretExpiresAt",
|
|
21
22
|
created_at AS "createdAt",
|
|
22
23
|
updated_at AS "updatedAt"`;
|
|
23
24
|
/** Internal columns — includes secret (for creation response only) */
|
|
@@ -27,6 +28,7 @@ const ENDPOINT_COLUMNS_WITH_SECRET = `
|
|
|
27
28
|
consecutive_failures AS "consecutiveFailures",
|
|
28
29
|
disabled_at AS "disabledAt",
|
|
29
30
|
disabled_reason AS "disabledReason",
|
|
31
|
+
previous_secret_expires_at AS "previousSecretExpiresAt",
|
|
30
32
|
created_at AS "createdAt",
|
|
31
33
|
updated_at AS "updatedAt"`;
|
|
32
34
|
let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-endpoint.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAS5C,uCAAuC;AACvC,MAAM,gBAAgB,GAAG
|
|
1
|
+
{"version":3,"file":"prisma-endpoint.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -20,9 +20,9 @@ export { PrismaEndpointRepository } from './adapters/prisma-endpoint.repository'
|
|
|
20
20
|
export { PrismaDeliveryRepository } from './adapters/prisma-delivery.repository';
|
|
21
21
|
export { FetchHttpClient } from './adapters/fetch-http-client';
|
|
22
22
|
export { PlaintextSecretVault } from './adapters/plaintext-secret-vault';
|
|
23
|
-
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, DeliveryFailedContext, EndpointDisabledContext, } from './interfaces/webhook-options.interface';
|
|
23
|
+
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, DeliveryFailedContext, DeliveryFailureKind, EndpointDisabledContext, } from './interfaces/webhook-options.interface';
|
|
24
24
|
export type { EndpointRecord, EndpointRecordWithSecret, CreateEndpointDto, UpdateEndpointDto, } from './interfaces/webhook-endpoint.interface';
|
|
25
|
-
export type { DeliveryStatus, DeliveryRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
25
|
+
export type { DeliveryStatus, DeliveryRecord, DeliveryAttemptRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
26
26
|
export { WEBHOOK_MODULE_OPTIONS, WEBHOOK_EVENT_REPOSITORY, WEBHOOK_ENDPOINT_REPOSITORY, WEBHOOK_DELIVERY_REPOSITORY, WEBHOOK_HTTP_CLIENT, DEFAULT_BACKOFF_SCHEDULE, DEFAULT_DELIVERY_TIMEOUT, DEFAULT_MAX_RETRIES, DEFAULT_POLLING_INTERVAL, DEFAULT_POLLING_BATCH_SIZE, DEFAULT_CIRCUIT_BREAKER_THRESHOLD, DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES, DEFAULT_STALE_SENDING_MINUTES, } from './webhook.constants';
|
|
27
27
|
export { validateWebhookUrl, resolveAndValidateHost, WebhookUrlValidationError, type WebhookUrlValidationReason, } from './webhook.url-validator';
|
|
28
28
|
//# 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":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,YAAY,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,YAAY,EACV,yBAAyB,EACzB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAGzE,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,uBAAuB,GACxB,MAAM,wCAAwC,CAAC;AAGhD,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AAEjD,YAAY,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,GACnB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,YAAY,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,YAAY,EACV,yBAAyB,EACzB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,YAAY,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAGvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oCAAoC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,wBAAwB,EAAE,MAAM,uCAAuC,CAAC;AACjF,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,oBAAoB,EAAE,MAAM,mCAAmC,CAAC;AAGzE,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,cAAc,EACd,qBAAqB,EACrB,mBAAmB,EACnB,uBAAuB,GACxB,MAAM,wCAAwC,CAAC;AAGhD,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AAEjD,YAAY,EACV,cAAc,EACd,cAAc,EACd,qBAAqB,EACrB,WAAW,EACX,cAAc,EACd,kBAAkB,GACnB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,gBAAgB;AAChB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,mDAAwE;AAA/D,+GAAA,aAAa,OAAA;AACtB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,kFAAkF;AAClF,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAY5B,mBAAmB;AACnB,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,oFAAiF;AAAxE,sIAAA,wBAAwB,OAAA;AACjC,oFAAiF;AAAxE,sIAAA,wBAAwB,OAAA;AACjC,kEAA+D;AAAtD,oHAAA,eAAe,OAAA;AACxB,4EAAyE;AAAhE,8HAAA,oBAAoB,OAAA;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,gBAAgB;AAChB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,mDAAwE;AAA/D,+GAAA,aAAa,OAAA;AACtB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,kFAAkF;AAClF,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAY5B,mBAAmB;AACnB,8EAA2E;AAAlE,gIAAA,qBAAqB,OAAA;AAC9B,oFAAiF;AAAxE,sIAAA,wBAAwB,OAAA;AACjC,oFAAiF;AAAxE,sIAAA,wBAAwB,OAAA;AACjC,kEAA+D;AAAtD,oHAAA,eAAe,OAAA;AACxB,4EAAyE;AAAhE,8HAAA,oBAAoB,OAAA;AAgC7B,qBAAqB;AACrB,yDAc6B;AAb3B,2HAAA,sBAAsB,OAAA;AACtB,6HAAA,wBAAwB,OAAA;AACxB,gIAAA,2BAA2B,OAAA;AAC3B,gIAAA,2BAA2B,OAAA;AAC3B,wHAAA,mBAAmB,OAAA;AACnB,6HAAA,wBAAwB,OAAA;AACxB,6HAAA,wBAAwB,OAAA;AACxB,wHAAA,mBAAmB,OAAA;AACnB,6HAAA,wBAAwB,OAAA;AACxB,+HAAA,0BAA0B,OAAA;AAC1B,sIAAA,iCAAiC,OAAA;AACjC,6IAAA,wCAAwC,OAAA;AACxC,kIAAA,6BAA6B,OAAA;AAG/B,iEAKiC;AAJ/B,2HAAA,kBAAkB,OAAA;AAClB,+HAAA,sBAAsB,OAAA;AACtB,kIAAA,yBAAyB,OAAA"}
|
|
@@ -3,6 +3,7 @@ export interface DeliveryRecord {
|
|
|
3
3
|
id: string;
|
|
4
4
|
eventId: string;
|
|
5
5
|
endpointId: string;
|
|
6
|
+
destinationUrl?: string | null;
|
|
6
7
|
status: DeliveryStatus;
|
|
7
8
|
attempts: number;
|
|
8
9
|
maxAttempts: number;
|
|
@@ -14,6 +15,18 @@ export interface DeliveryRecord {
|
|
|
14
15
|
latencyMs: number | null;
|
|
15
16
|
lastError: string | null;
|
|
16
17
|
}
|
|
18
|
+
export interface DeliveryAttemptRecord {
|
|
19
|
+
id: string;
|
|
20
|
+
deliveryId: string;
|
|
21
|
+
attemptNumber: number;
|
|
22
|
+
status: DeliveryStatus | 'PENDING';
|
|
23
|
+
responseStatus: number | null;
|
|
24
|
+
responseBody: string | null;
|
|
25
|
+
responseBodyTruncated: boolean;
|
|
26
|
+
latencyMs: number | null;
|
|
27
|
+
lastError: string | null;
|
|
28
|
+
createdAt: Date;
|
|
29
|
+
}
|
|
17
30
|
export interface EventRecord {
|
|
18
31
|
id: string;
|
|
19
32
|
eventType: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-delivery.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-delivery.interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
1
|
+
{"version":3,"file":"webhook-delivery.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-delivery.interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,qBAAqB;IACpC,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,MAAM,EAAE,cAAc,GAAG,SAAS,CAAC;IACnC,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,qBAAqB,EAAE,OAAO,CAAC;IAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-endpoint.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-endpoint.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,0HAA0H;AAC1H,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
|
1
|
+
{"version":3,"file":"webhook-endpoint.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-endpoint.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uBAAuB,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC;IACtC,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,0HAA0H;AAC1H,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -4,6 +4,7 @@ import { WebhookEndpointRepository } from '../ports/webhook-endpoint.repository'
|
|
|
4
4
|
import { WebhookDeliveryRepository } from '../ports/webhook-delivery.repository';
|
|
5
5
|
import { WebhookHttpClient } from '../ports/webhook-http-client';
|
|
6
6
|
import { WebhookSecretVault } from '../ports/webhook-secret-vault';
|
|
7
|
+
import { WebhookUrlValidationReason } from '../webhook.url-validator';
|
|
7
8
|
export interface DeliveryOptions {
|
|
8
9
|
timeout?: number;
|
|
9
10
|
maxRetries?: number;
|
|
@@ -22,6 +23,13 @@ export interface PollingOptions {
|
|
|
22
23
|
/** Minutes before a SENDING delivery is considered stale and reset to PENDING. Default: 5 */
|
|
23
24
|
staleSendingMinutes?: number;
|
|
24
25
|
}
|
|
26
|
+
/**
|
|
27
|
+
* Category of failure that caused the delivery to exhaust retries.
|
|
28
|
+
* - `url_validation`: SSRF defense rejected the URL (private/loopback/link-local/etc.)
|
|
29
|
+
* - `dispatch_error`: dispatcher threw an exception (timeout, ECONNREFUSED, etc.)
|
|
30
|
+
* - `http_error`: endpoint responded with a non-2xx status code
|
|
31
|
+
*/
|
|
32
|
+
export type DeliveryFailureKind = 'url_validation' | 'dispatch_error' | 'http_error';
|
|
25
33
|
export interface DeliveryFailedContext {
|
|
26
34
|
deliveryId: string;
|
|
27
35
|
endpointId: string;
|
|
@@ -32,6 +40,14 @@ export interface DeliveryFailedContext {
|
|
|
32
40
|
maxAttempts: number;
|
|
33
41
|
lastError: string | null;
|
|
34
42
|
responseStatus: number | null;
|
|
43
|
+
/** High-level classification. Omitted for backward compatibility when unknown. */
|
|
44
|
+
failureKind?: DeliveryFailureKind;
|
|
45
|
+
/** Set only when `failureKind === 'url_validation'` — structured reason from `WebhookUrlValidationError`. */
|
|
46
|
+
validationReason?: WebhookUrlValidationReason;
|
|
47
|
+
/** Set only when `failureKind === 'url_validation'` — URL that triggered validation failure. */
|
|
48
|
+
validationUrl?: string;
|
|
49
|
+
/** Set only when `failureKind === 'url_validation'` and DNS resolution was involved. */
|
|
50
|
+
resolvedIp?: string;
|
|
35
51
|
}
|
|
36
52
|
export interface EndpointDisabledContext {
|
|
37
53
|
endpointId: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
1
|
+
import { DeliveryAttemptRecord, DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
2
2
|
export interface PendingDelivery {
|
|
3
3
|
id: string;
|
|
4
4
|
event_id: string;
|
|
@@ -8,6 +8,7 @@ export interface PendingDelivery {
|
|
|
8
8
|
max_attempts: number;
|
|
9
9
|
url: string;
|
|
10
10
|
secret: string;
|
|
11
|
+
additionalSecrets?: string[];
|
|
11
12
|
event_type: string;
|
|
12
13
|
payload: Record<string, unknown>;
|
|
13
14
|
}
|
|
@@ -21,6 +22,7 @@ export interface WebhookDeliveryRepository {
|
|
|
21
22
|
markRetry(deliveryId: string, attempts: number, nextAt: Date, result: DeliveryResult): Promise<void>;
|
|
22
23
|
recoverStaleSending(stalenessMinutes: number): Promise<number>;
|
|
23
24
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
25
|
+
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
24
26
|
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
25
27
|
createTestDelivery(eventId: string, endpointId: string): Promise<void>;
|
|
26
28
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-delivery.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACf,MAAM,0CAA0C,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,6BAA6B,CAC3B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEpE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErG,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7F,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE"}
|
|
1
|
+
{"version":3,"file":"webhook-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-delivery.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACf,MAAM,0CAA0C,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,6BAA6B,CAC3B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEpE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErG,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7F,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC,CAAC;IAC1E,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { WebhookEndpointAdminService } from './webhook.endpoint-admin.service';
|
|
2
2
|
import { WebhookDeliveryAdminService } from './webhook.delivery-admin.service';
|
|
3
3
|
import { CreateEndpointDto, EndpointRecord, EndpointRecordWithSecret, UpdateEndpointDto } from './interfaces/webhook-endpoint.interface';
|
|
4
|
-
import { DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
4
|
+
import { DeliveryAttemptRecord, DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
5
5
|
/**
|
|
6
6
|
* @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService directly.
|
|
7
7
|
* This facade will be removed in v0.3.0.
|
|
@@ -16,6 +16,7 @@ export declare class WebhookAdminService {
|
|
|
16
16
|
updateEndpoint(endpointId: string, dto: UpdateEndpointDto): Promise<EndpointRecord | null>;
|
|
17
17
|
deleteEndpoint(endpointId: string): Promise<boolean>;
|
|
18
18
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
19
|
+
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
19
20
|
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
20
21
|
sendTestEvent(endpointId: string): Promise<string | null>;
|
|
21
22
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.admin.service.d.ts","sourceRoot":"","sources":["../src/webhook.admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,kBAAkB,EAClB,cAAc,EACf,MAAM,yCAAyC,CAAC;AAEjD;;;GAGG;AACH,qBACa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,SAAS,EAAE,2BAA2B,EACtC,UAAU,EAAE,2BAA2B;IAGpD,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAIzE,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI/D,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI3B,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhE"}
|
|
1
|
+
{"version":3,"file":"webhook.admin.service.d.ts","sourceRoot":"","sources":["../src/webhook.admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,yCAAyC,CAAC;AACjD,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,yCAAyC,CAAC;AAEjD;;;GAGG;AACH,qBACa,mBAAmB;IAE5B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,UAAU;gBADV,SAAS,EAAE,2BAA2B,EACtC,UAAU,EAAE,2BAA2B;IAGpD,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAIzE,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAI3D,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI/D,cAAc,CAClB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,iBAAiB,GACrB,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAI3B,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAIzE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAInD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAGhE"}
|
|
@@ -42,6 +42,9 @@ let WebhookAdminService = class WebhookAdminService {
|
|
|
42
42
|
async getDeliveryLogs(endpointId, filters) {
|
|
43
43
|
return this.deliveries.getDeliveryLogs(endpointId, filters);
|
|
44
44
|
}
|
|
45
|
+
async getDeliveryAttempts(deliveryId) {
|
|
46
|
+
return this.deliveries.getDeliveryAttempts(deliveryId);
|
|
47
|
+
}
|
|
45
48
|
async retryDelivery(deliveryId) {
|
|
46
49
|
return this.deliveries.retryDelivery(deliveryId);
|
|
47
50
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.admin.service.js","sourceRoot":"","sources":["../src/webhook.admin.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,qFAA+E;AAC/E,qFAA+E;
|
|
1
|
+
{"version":3,"file":"webhook.admin.service.js","sourceRoot":"","sources":["../src/webhook.admin.service.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAC5C,qFAA+E;AAC/E,qFAA+E;AAa/E;;;GAGG;AAEI,IAAM,mBAAmB,GAAzB,MAAM,mBAAmB;IAEX;IACA;IAFnB,YACmB,SAAsC,EACtC,UAAuC;QADvC,cAAS,GAAT,SAAS,CAA6B;QACtC,eAAU,GAAV,UAAU,CAA6B;IACvD,CAAC;IAEJ,KAAK,CAAC,cAAc,CAAC,GAAsB;QACzC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;IAC5C,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,QAAiB;QACnC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,UAAkB;QAClC,OAAO,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAkB,EAClB,GAAsB;QAEtB,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAAkB;QACrC,OAAO,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,UAAkB,EAClB,OAA4B;QAE5B,OAAO,IAAI,CAAC,UAAU,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,UAAU,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,OAAO,IAAI,CAAC,UAAU,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACnD,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,OAAO,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IAClD,CAAC;CACF,CAAA;AA/CY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAGmB,4DAA2B;QAC1B,4DAA2B;GAH/C,mBAAmB,CA+C/B"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { WebhookDeliveryRepository } from './ports/webhook-delivery.repository';
|
|
2
|
-
import { DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
2
|
+
import { DeliveryAttemptRecord, DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
3
3
|
export declare class WebhookDeliveryAdminService {
|
|
4
4
|
private readonly deliveryRepo;
|
|
5
5
|
constructor(deliveryRepo: WebhookDeliveryRepository);
|
|
6
6
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
7
|
+
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
7
8
|
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=webhook.delivery-admin.service.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-admin.service.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-admin.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EACL,kBAAkB,EAClB,cAAc,EACf,MAAM,yCAAyC,CAAC;AAEjD,qBACa,2BAA2B;IAGpC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,yBAAyB;IAGpD,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG1D"}
|
|
1
|
+
{"version":3,"file":"webhook.delivery-admin.service.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-admin.service.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EACL,qBAAqB,EACrB,kBAAkB,EAClB,cAAc,EACf,MAAM,yCAAyC,CAAC;AAEjD,qBACa,2BAA2B;IAGpC,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAAZ,YAAY,EAAE,yBAAyB;IAGpD,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAItB,mBAAmB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAIzE,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;CAG1D"}
|
|
@@ -23,6 +23,9 @@ let WebhookDeliveryAdminService = class WebhookDeliveryAdminService {
|
|
|
23
23
|
async getDeliveryLogs(endpointId, filters) {
|
|
24
24
|
return this.deliveryRepo.getDeliveryLogs(endpointId, filters);
|
|
25
25
|
}
|
|
26
|
+
async getDeliveryAttempts(deliveryId) {
|
|
27
|
+
return this.deliveryRepo.getDeliveryAttempts(deliveryId);
|
|
28
|
+
}
|
|
26
29
|
async retryDelivery(deliveryId) {
|
|
27
30
|
return this.deliveryRepo.retryDelivery(deliveryId);
|
|
28
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-admin.service.js","sourceRoot":"","sources":["../src/webhook.delivery-admin.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAkE;
|
|
1
|
+
{"version":3,"file":"webhook.delivery-admin.service.js","sourceRoot":"","sources":["../src/webhook.delivery-admin.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAkE;AAS3D,IAAM,2BAA2B,GAAjC,MAAM,2BAA2B;IAGnB;IAFnB,YAEmB,YAAuC;QAAvC,iBAAY,GAAZ,YAAY,CAA2B;IACvD,CAAC;IAEJ,KAAK,CAAC,eAAe,CACnB,UAAkB,EAClB,OAA4B;QAE5B,OAAO,IAAI,CAAC,YAAY,CAAC,eAAe,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,UAAkB;QAC1C,OAAO,IAAI,CAAC,YAAY,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AApBY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,+CAA2B,CAAC,CAAA;;GAF3B,2BAA2B,CAoBvC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-worker.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAO5D,OAAO,
|
|
1
|
+
{"version":3,"file":"webhook.delivery-worker.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAO5D,OAAO,EAEL,oBAAoB,EACrB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EAEL,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAa7C,qBACa,qBAAsB,YAAW,eAAe;IAUzD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAd1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAK;gBAIV,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,qBAAqB,EAErC,OAAO,EAAE,oBAAoB;IAO1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAmCb,eAAe;IAyF7B,OAAO,CAAC,sBAAsB;IAyBxB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAevC"}
|
|
@@ -19,6 +19,7 @@ const webhook_circuit_breaker_1 = require("./webhook.circuit-breaker");
|
|
|
19
19
|
const webhook_dispatcher_1 = require("./webhook.dispatcher");
|
|
20
20
|
const webhook_retry_policy_1 = require("./webhook.retry-policy");
|
|
21
21
|
const webhook_constants_1 = require("./webhook.constants");
|
|
22
|
+
const webhook_url_validator_1 = require("./webhook.url-validator");
|
|
22
23
|
let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorker {
|
|
23
24
|
deliveryRepo;
|
|
24
25
|
dispatcher;
|
|
@@ -79,7 +80,7 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
79
80
|
else if (newAttempts >= delivery.max_attempts) {
|
|
80
81
|
await this.deliveryRepo.markFailed(delivery.id, newAttempts, result);
|
|
81
82
|
this.logger.warn(`Delivery ${delivery.id} exhausted retries (${newAttempts}/${delivery.max_attempts})`);
|
|
82
|
-
this.fireDeliveryFailedHook(delivery, newAttempts, result.error ?? null, result.statusCode ?? null);
|
|
83
|
+
this.fireDeliveryFailedHook(delivery, newAttempts, result.error ?? null, result.statusCode ?? null, { failureKind: 'http_error' });
|
|
83
84
|
}
|
|
84
85
|
else {
|
|
85
86
|
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
@@ -106,7 +107,15 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
106
107
|
if (newAttempts >= delivery.max_attempts) {
|
|
107
108
|
await this.deliveryRepo.markFailed(delivery.id, newAttempts, errorResult);
|
|
108
109
|
this.logger.warn(`Delivery ${delivery.id} exhausted retries on exception (${newAttempts}/${delivery.max_attempts})`);
|
|
109
|
-
|
|
110
|
+
const meta = error instanceof webhook_url_validator_1.WebhookUrlValidationError
|
|
111
|
+
? {
|
|
112
|
+
failureKind: 'url_validation',
|
|
113
|
+
validationReason: error.reason,
|
|
114
|
+
validationUrl: error.url ?? delivery.url,
|
|
115
|
+
resolvedIp: error.resolvedIp,
|
|
116
|
+
}
|
|
117
|
+
: { failureKind: 'dispatch_error' };
|
|
118
|
+
this.fireDeliveryFailedHook(delivery, newAttempts, errorResult.error ?? null, null, meta);
|
|
110
119
|
}
|
|
111
120
|
else {
|
|
112
121
|
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
@@ -121,7 +130,7 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
121
130
|
this.activeDeliveries--;
|
|
122
131
|
}
|
|
123
132
|
}
|
|
124
|
-
fireDeliveryFailedHook(delivery, attempts, lastError, responseStatus) {
|
|
133
|
+
fireDeliveryFailedHook(delivery, attempts, lastError, responseStatus, meta = {}) {
|
|
125
134
|
if (!this.options.onDeliveryFailed)
|
|
126
135
|
return;
|
|
127
136
|
void Promise.resolve(this.options.onDeliveryFailed({
|
|
@@ -133,6 +142,7 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
133
142
|
maxAttempts: delivery.max_attempts,
|
|
134
143
|
lastError,
|
|
135
144
|
responseStatus,
|
|
145
|
+
...meta,
|
|
136
146
|
})).catch((hookError) => {
|
|
137
147
|
this.logger.error(`onDeliveryFailed callback error: ${hookError}`);
|
|
138
148
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-worker.js","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA6E;AAC7E,uEAAkE;AAClE,6DAAyD;AACzD,iEAA4D;AAC5D,2DAK6B;
|
|
1
|
+
{"version":3,"file":"webhook.delivery-worker.js","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -40,7 +40,7 @@ let WebhookDispatcher = class WebhookDispatcher {
|
|
|
40
40
|
data: delivery.payload,
|
|
41
41
|
});
|
|
42
42
|
const timestamp = Math.floor(Date.now() / 1000);
|
|
43
|
-
const headers = this.signer.
|
|
43
|
+
const headers = this.signer.signAll(delivery.event_id, timestamp, body, [delivery.secret, ...(delivery.additionalSecrets ?? [])]);
|
|
44
44
|
return this.httpClient.post(delivery.url, headers, body, this.timeout);
|
|
45
45
|
}
|
|
46
46
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.dispatcher.js","sourceRoot":"","sources":["../src/webhook.dispatcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qDAAiD;AACjD,2DAAkF;AAClF,2DAA+D;AAK/D,mEAAiE;AAG1D,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAKT;IAEA;IANF,OAAO,CAAS;IAChB,gBAAgB,CAAU;IAE3C,YACmB,MAAqB,EAErB,UAA6B,EAE9C,OAA6B;QAJZ,WAAM,GAAN,MAAM,CAAe;QAErB,eAAU,GAAV,UAAU,CAAmB;QAI9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,4CAAwB,CAAC;QACrE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAyB;QACtC,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAChD,MAAM,IAAA,8CAAsB,EAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,IAAI,EAAE,QAAQ,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,
|
|
1
|
+
{"version":3,"file":"webhook.dispatcher.js","sourceRoot":"","sources":["../src/webhook.dispatcher.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,qDAAiD;AACjD,2DAAkF;AAClF,2DAA+D;AAK/D,mEAAiE;AAG1D,IAAM,iBAAiB,GAAvB,MAAM,iBAAiB;IAKT;IAEA;IANF,OAAO,CAAS;IAChB,gBAAgB,CAAU;IAE3C,YACmB,MAAqB,EAErB,UAA6B,EAE9C,OAA6B;QAJZ,WAAM,GAAN,MAAM,CAAe;QAErB,eAAU,GAAV,UAAU,CAAmB;QAI9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,QAAQ,EAAE,OAAO,IAAI,4CAAwB,CAAC;QACrE,IAAI,CAAC,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,KAAK,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAyB;QACtC,sEAAsE;QACtE,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC;YAChD,MAAM,IAAA,8CAAsB,EAAC,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;YAC1B,IAAI,EAAE,QAAQ,CAAC,UAAU;YACzB,IAAI,EAAE,QAAQ,CAAC,OAAO;SACvB,CAAC,CAAC;QAEH,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;QAChD,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CACjC,QAAQ,CAAC,QAAQ,EACjB,SAAS,EACT,IAAI,EACJ,CAAC,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,QAAQ,CAAC,iBAAiB,IAAI,EAAE,CAAC,CAAC,CACzD,CAAC;QAEF,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;IACzE,CAAC;CACF,CAAA;AArCY,8CAAiB;4BAAjB,iBAAiB;IAD7B,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,uCAAmB,CAAC,CAAA;IAE3B,WAAA,IAAA,eAAM,EAAC,0CAAsB,CAAC,CAAA;qCAHN,8BAAa;GAL7B,iBAAiB,CAqC7B"}
|
package/dist/webhook.signer.d.ts
CHANGED
|
@@ -5,8 +5,10 @@ export interface SignatureHeaders {
|
|
|
5
5
|
'webhook-signature': string;
|
|
6
6
|
}
|
|
7
7
|
export declare class WebhookSigner {
|
|
8
|
+
signAll(eventId: string, timestamp: number, body: string, secrets: string[]): SignatureHeaders;
|
|
8
9
|
sign(eventId: string, timestamp: number, body: string, secret: string): SignatureHeaders;
|
|
9
10
|
verify(eventId: string, timestamp: number, body: string, secret: string, signature: string): boolean;
|
|
10
11
|
generateSecret(): string;
|
|
12
|
+
private signSingle;
|
|
11
13
|
}
|
|
12
14
|
//# sourceMappingURL=webhook.signer.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.signer.d.ts","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qBACa,aAAa;IACxB,IAAI,CACF,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,gBAAgB;
|
|
1
|
+
{"version":3,"file":"webhook.signer.d.ts","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qBACa,aAAa;IACxB,OAAO,CACL,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EAAE,GAChB,gBAAgB;IAgBnB,IAAI,CACF,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,gBAAgB;IAInB,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO;IAcV,cAAc,IAAI,MAAM;IAIxB,OAAO,CAAC,UAAU;CAcnB"}
|
package/dist/webhook.signer.js
CHANGED
|
@@ -43,30 +43,44 @@ exports.WebhookSigner = void 0;
|
|
|
43
43
|
const crypto = __importStar(require("crypto"));
|
|
44
44
|
const common_1 = require("@nestjs/common");
|
|
45
45
|
let WebhookSigner = class WebhookSigner {
|
|
46
|
-
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
.
|
|
50
|
-
|
|
51
|
-
|
|
46
|
+
signAll(eventId, timestamp, body, secrets) {
|
|
47
|
+
const signatures = secrets
|
|
48
|
+
.filter((secret) => Boolean(secret))
|
|
49
|
+
.map((secret) => this.signSingle(eventId, timestamp, body, secret));
|
|
50
|
+
if (signatures.length === 0) {
|
|
51
|
+
throw new Error('At least one signing secret is required');
|
|
52
|
+
}
|
|
52
53
|
return {
|
|
53
54
|
'webhook-id': eventId,
|
|
54
55
|
'webhook-timestamp': String(timestamp),
|
|
55
|
-
'webhook-signature':
|
|
56
|
+
'webhook-signature': signatures.join(' '),
|
|
56
57
|
};
|
|
57
58
|
}
|
|
59
|
+
sign(eventId, timestamp, body, secret) {
|
|
60
|
+
return this.signAll(eventId, timestamp, body, [secret]);
|
|
61
|
+
}
|
|
58
62
|
verify(eventId, timestamp, body, secret, signature) {
|
|
59
|
-
const expected = this.
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
63
|
+
const expected = this.signSingle(eventId, timestamp, body, secret);
|
|
64
|
+
const providedSignatures = signature.trim().split(/\s+/).filter(Boolean);
|
|
65
|
+
return providedSignatures.some((candidate) => {
|
|
66
|
+
const a = Buffer.from(expected);
|
|
67
|
+
const b = Buffer.from(candidate);
|
|
68
|
+
if (a.length !== b.length)
|
|
69
|
+
return false;
|
|
70
|
+
return crypto.timingSafeEqual(a, b);
|
|
71
|
+
});
|
|
66
72
|
}
|
|
67
73
|
generateSecret() {
|
|
68
74
|
return crypto.randomBytes(32).toString('base64');
|
|
69
75
|
}
|
|
76
|
+
signSingle(eventId, timestamp, body, secret) {
|
|
77
|
+
const toSign = `${eventId}.${timestamp}.${body}`;
|
|
78
|
+
const hmac = crypto
|
|
79
|
+
.createHmac('sha256', Buffer.from(secret, 'base64'))
|
|
80
|
+
.update(toSign)
|
|
81
|
+
.digest('base64');
|
|
82
|
+
return `v1,${hmac}`;
|
|
83
|
+
}
|
|
70
84
|
};
|
|
71
85
|
exports.WebhookSigner = WebhookSigner;
|
|
72
86
|
exports.WebhookSigner = WebhookSigner = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.signer.js","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,2CAA4C;AAUrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,
|
|
1
|
+
{"version":3,"file":"webhook.signer.js","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,2CAA4C;AAUrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,OAAO,CACL,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,OAAiB;QAEjB,MAAM,UAAU,GAAG,OAAO;aACvB,MAAM,CAAC,CAAC,MAAM,EAAoB,EAAE,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aACrD,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC7D,CAAC;QAED,OAAO;YACL,YAAY,EAAE,OAAO;YACrB,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;YACtC,mBAAmB,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC;SAC1C,CAAC;IACJ,CAAC;IAED,IAAI,CACF,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,MAAc;QAEd,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CACJ,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,MAAc,EACd,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACnE,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAEzE,OAAO,kBAAkB,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE;YAC3C,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAChC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAEjC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;gBAAE,OAAO,KAAK,CAAC;YAExC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACtC,CAAC,CAAC,CAAC;IACL,CAAC;IAED,cAAc;QACZ,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;IAEO,UAAU,CAChB,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,MAAc;QAEd,MAAM,MAAM,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM;aAChB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aACnD,MAAM,CAAC,MAAM,CAAC;aACd,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEpB,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;CACF,CAAA;AArEY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAqEzB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestarc/webhook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.9.0",
|
|
4
4
|
"description": "Outbound webhook delivery for NestJS — HMAC signing, exponential retry, circuit breaker, delivery logs, fan-out, Standard Webhooks compatible",
|
|
5
5
|
"author": "nestarc",
|
|
6
6
|
"license": "MIT",
|
|
@@ -9,6 +9,8 @@ CREATE TABLE IF NOT EXISTS webhook_endpoints (
|
|
|
9
9
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
10
10
|
url VARCHAR(2048) NOT NULL,
|
|
11
11
|
secret VARCHAR(255) NOT NULL,
|
|
12
|
+
previous_secret TEXT,
|
|
13
|
+
previous_secret_expires_at TIMESTAMPTZ,
|
|
12
14
|
events VARCHAR(255)[] NOT NULL DEFAULT '{}',
|
|
13
15
|
active BOOLEAN NOT NULL DEFAULT TRUE,
|
|
14
16
|
description VARCHAR(500),
|
|
@@ -47,6 +49,9 @@ CREATE TABLE IF NOT EXISTS webhook_deliveries (
|
|
|
47
49
|
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
48
50
|
event_id UUID NOT NULL REFERENCES webhook_events(id),
|
|
49
51
|
endpoint_id UUID NOT NULL REFERENCES webhook_endpoints(id),
|
|
52
|
+
endpoint_url_snapshot TEXT,
|
|
53
|
+
signing_secret_snapshot TEXT,
|
|
54
|
+
secondary_signing_secret_snapshot TEXT,
|
|
50
55
|
status VARCHAR(20) NOT NULL DEFAULT 'PENDING'
|
|
51
56
|
CHECK (status IN ('PENDING', 'SENDING', 'SENT', 'FAILED')),
|
|
52
57
|
attempts INT NOT NULL DEFAULT 0,
|
|
@@ -76,3 +81,24 @@ CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_endpoint_status
|
|
|
76
81
|
ON webhook_deliveries (endpoint_id, status);
|
|
77
82
|
CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_event
|
|
78
83
|
ON webhook_deliveries (event_id);
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
|
|
87
|
+
CREATE TABLE IF NOT EXISTS webhook_delivery_attempts (
|
|
88
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
|
|
89
|
+
delivery_id UUID NOT NULL REFERENCES webhook_deliveries(id) ON DELETE CASCADE,
|
|
90
|
+
attempt_number INT NOT NULL,
|
|
91
|
+
status VARCHAR(20) NOT NULL
|
|
92
|
+
CHECK (status IN ('PENDING', 'SENDING', 'SENT', 'FAILED')),
|
|
93
|
+
response_status INT,
|
|
94
|
+
response_body TEXT,
|
|
95
|
+
response_body_truncated BOOLEAN NOT NULL DEFAULT FALSE,
|
|
96
|
+
latency_ms INT,
|
|
97
|
+
last_error TEXT,
|
|
98
|
+
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
|
99
|
+
CONSTRAINT webhook_delivery_attempts_delivery_id_attempt_number_key
|
|
100
|
+
UNIQUE (delivery_id, attempt_number)
|
|
101
|
+
);
|
|
102
|
+
|
|
103
|
+
CREATE INDEX IF NOT EXISTS idx_delivery_attempts_delivery_created
|
|
104
|
+
ON webhook_delivery_attempts (delivery_id, created_at);
|