@nestarc/webhook 0.8.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/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 +1 -1
- 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/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.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
|
@@ -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
|
@@ -22,7 +22,7 @@ export { FetchHttpClient } from './adapters/fetch-http-client';
|
|
|
22
22
|
export { PlaintextSecretVault } from './adapters/plaintext-secret-vault';
|
|
23
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,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,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"}
|
|
@@ -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"}
|
|
@@ -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);
|