@nestarc/webhook 0.9.0 → 0.11.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 +117 -31
- package/dist/adapters/fetch-http-client.d.ts.map +1 -1
- package/dist/adapters/fetch-http-client.js +1 -1
- package/dist/adapters/fetch-http-client.js.map +1 -1
- package/dist/adapters/plaintext-secret-vault.d.ts.map +1 -1
- package/dist/adapters/plaintext-secret-vault.js +12 -2
- package/dist/adapters/plaintext-secret-vault.js.map +1 -1
- package/dist/adapters/prisma-delivery.repository.d.ts +8 -4
- package/dist/adapters/prisma-delivery.repository.d.ts.map +1 -1
- package/dist/adapters/prisma-delivery.repository.js +135 -77
- package/dist/adapters/prisma-delivery.repository.js.map +1 -1
- package/dist/adapters/prisma-endpoint.repository.d.ts +4 -3
- package/dist/adapters/prisma-endpoint.repository.d.ts.map +1 -1
- package/dist/adapters/prisma-endpoint.repository.js +39 -6
- package/dist/adapters/prisma-endpoint.repository.js.map +1 -1
- package/dist/index.d.ts +12 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -2
- package/dist/index.js.map +1 -1
- package/dist/interfaces/webhook-delivery.interface.d.ts +6 -2
- package/dist/interfaces/webhook-delivery.interface.d.ts.map +1 -1
- package/dist/interfaces/webhook-endpoint.interface.d.ts +11 -2
- package/dist/interfaces/webhook-endpoint.interface.d.ts.map +1 -1
- package/dist/interfaces/webhook-options.interface.d.ts +46 -8
- package/dist/interfaces/webhook-options.interface.d.ts.map +1 -1
- package/dist/ports/webhook-delivery.repository.d.ts +28 -10
- package/dist/ports/webhook-delivery.repository.d.ts.map +1 -1
- package/dist/ports/webhook-endpoint.repository.d.ts +24 -4
- package/dist/ports/webhook-endpoint.repository.d.ts.map +1 -1
- package/dist/ports/webhook-event.repository.d.ts +3 -1
- package/dist/ports/webhook-event.repository.d.ts.map +1 -1
- package/dist/ports/webhook-http-client.d.ts +4 -0
- package/dist/ports/webhook-http-client.d.ts.map +1 -1
- package/dist/ports/webhook-secret-vault.d.ts +1 -0
- package/dist/ports/webhook-secret-vault.d.ts.map +1 -1
- package/dist/webhook.admin.service.d.ts +4 -3
- package/dist/webhook.admin.service.d.ts.map +1 -1
- package/dist/webhook.admin.service.js +5 -2
- package/dist/webhook.admin.service.js.map +1 -1
- package/dist/webhook.circuit-breaker.d.ts +11 -4
- package/dist/webhook.circuit-breaker.d.ts.map +1 -1
- package/dist/webhook.circuit-breaker.js +80 -19
- package/dist/webhook.circuit-breaker.js.map +1 -1
- package/dist/webhook.constants.d.ts +9 -2
- package/dist/webhook.constants.d.ts.map +1 -1
- package/dist/webhook.constants.js +11 -4
- package/dist/webhook.constants.js.map +1 -1
- package/dist/webhook.delivery-worker.d.ts +7 -0
- package/dist/webhook.delivery-worker.d.ts.map +1 -1
- package/dist/webhook.delivery-worker.js +122 -42
- package/dist/webhook.delivery-worker.js.map +1 -1
- package/dist/webhook.dispatcher.d.ts +1 -0
- package/dist/webhook.dispatcher.d.ts.map +1 -1
- package/dist/webhook.dispatcher.js +13 -6
- package/dist/webhook.dispatcher.js.map +1 -1
- package/dist/webhook.endpoint-admin.service.d.ts +4 -1
- package/dist/webhook.endpoint-admin.service.d.ts.map +1 -1
- package/dist/webhook.endpoint-admin.service.js +36 -9
- package/dist/webhook.endpoint-admin.service.js.map +1 -1
- package/dist/webhook.module.d.ts.map +1 -1
- package/dist/webhook.module.js +22 -13
- package/dist/webhook.module.js.map +1 -1
- package/dist/webhook.retry-classifier.d.ts +3 -0
- package/dist/webhook.retry-classifier.d.ts.map +1 -0
- package/dist/webhook.retry-classifier.js +17 -0
- package/dist/webhook.retry-classifier.js.map +1 -0
- package/package.json +4 -4
- package/src/sql/create-webhook-tables.sql +1 -1
- package/src/sql/migrations/v0.9.0.sql +32 -0
|
@@ -11,7 +11,8 @@ 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
|
|
14
|
+
const webhook_constants_1 = require("../webhook.constants");
|
|
15
|
+
const STALE_SENDING_RECOVERY_ERROR = 'Recovered stale SENDING delivery after worker lease expired';
|
|
15
16
|
function truncateAttemptResponseBody(body) {
|
|
16
17
|
if (body == null) {
|
|
17
18
|
return {
|
|
@@ -19,14 +20,14 @@ function truncateAttemptResponseBody(body) {
|
|
|
19
20
|
responseBodyTruncated: false,
|
|
20
21
|
};
|
|
21
22
|
}
|
|
22
|
-
if (body.length <=
|
|
23
|
+
if (body.length <= webhook_constants_1.ATTEMPT_RESPONSE_BODY_MAX_LENGTH) {
|
|
23
24
|
return {
|
|
24
25
|
responseBody: body,
|
|
25
26
|
responseBodyTruncated: false,
|
|
26
27
|
};
|
|
27
28
|
}
|
|
28
29
|
return {
|
|
29
|
-
responseBody: body.slice(0,
|
|
30
|
+
responseBody: body.slice(0, webhook_constants_1.ATTEMPT_RESPONSE_BODY_MAX_LENGTH),
|
|
30
31
|
responseBodyTruncated: true,
|
|
31
32
|
};
|
|
32
33
|
}
|
|
@@ -86,16 +87,20 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
86
87
|
)
|
|
87
88
|
RETURNING
|
|
88
89
|
webhook_deliveries.id,
|
|
89
|
-
webhook_deliveries.event_id,
|
|
90
|
-
webhook_deliveries.endpoint_id,
|
|
90
|
+
webhook_deliveries.event_id AS "eventId",
|
|
91
|
+
webhook_deliveries.endpoint_id AS "endpointId",
|
|
91
92
|
webhook_deliveries.attempts,
|
|
92
|
-
webhook_deliveries.max_attempts`;
|
|
93
|
+
webhook_deliveries.max_attempts AS "maxAttempts"`;
|
|
93
94
|
}
|
|
94
95
|
async enrichDeliveries(deliveryIds) {
|
|
95
96
|
const rows = await this.prisma.$queryRaw `
|
|
96
97
|
SELECT
|
|
97
|
-
d.id,
|
|
98
|
-
|
|
98
|
+
d.id,
|
|
99
|
+
d.event_id AS "eventId",
|
|
100
|
+
d.endpoint_id AS "endpointId",
|
|
101
|
+
d.attempts,
|
|
102
|
+
d.max_attempts AS "maxAttempts",
|
|
103
|
+
e.tenant_id::text AS "tenantId",
|
|
99
104
|
COALESCE(d.endpoint_url_snapshot, e.url) AS url,
|
|
100
105
|
COALESCE(d.signing_secret_snapshot, e.secret) AS secret,
|
|
101
106
|
CASE
|
|
@@ -103,63 +108,122 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
103
108
|
THEN ARRAY[]::text[]
|
|
104
109
|
ELSE ARRAY[d.secondary_signing_secret_snapshot]
|
|
105
110
|
END AS "additionalSecrets",
|
|
106
|
-
ev.event_type,
|
|
111
|
+
ev.event_type AS "eventType",
|
|
112
|
+
ev.payload
|
|
107
113
|
FROM webhook_deliveries d
|
|
108
114
|
JOIN webhook_endpoints e ON e.id = d.endpoint_id
|
|
109
115
|
JOIN webhook_events ev ON ev.id = d.event_id
|
|
110
116
|
WHERE d.id = ANY(${deliveryIds}::uuid[])`;
|
|
111
117
|
if (this.vault) {
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
118
|
+
await Promise.all(rows.map(async (row) => {
|
|
119
|
+
const [secret, additionalSecrets] = await Promise.all([
|
|
120
|
+
this.vault.decrypt(row.secret),
|
|
121
|
+
Promise.all(row.additionalSecrets.map((secret) => this.vault.decrypt(secret))),
|
|
122
|
+
]);
|
|
123
|
+
row.secret = secret;
|
|
124
|
+
row.additionalSecrets = additionalSecrets;
|
|
125
|
+
}));
|
|
116
126
|
}
|
|
117
127
|
return rows;
|
|
118
128
|
}
|
|
119
129
|
async markSent(deliveryId, attempts, result) {
|
|
120
|
-
await this.prisma.$
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
130
|
+
await this.prisma.$transaction(async (tx) => {
|
|
131
|
+
await tx.$executeRaw `
|
|
132
|
+
UPDATE webhook_deliveries
|
|
133
|
+
SET status = 'SENT', attempts = ${attempts},
|
|
134
|
+
last_attempt_at = NOW(), completed_at = NOW(),
|
|
135
|
+
response_status = ${result.statusCode ?? null},
|
|
136
|
+
response_body = ${result.body ?? null},
|
|
137
|
+
latency_ms = ${result.latencyMs}
|
|
138
|
+
WHERE id = ${deliveryId}::uuid`;
|
|
139
|
+
await this.appendAttemptLog(tx, deliveryId, attempts, 'SENT', result);
|
|
140
|
+
});
|
|
129
141
|
}
|
|
130
142
|
async markFailed(deliveryId, attempts, result) {
|
|
131
|
-
await this.prisma.$
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
143
|
+
await this.prisma.$transaction(async (tx) => {
|
|
144
|
+
await tx.$executeRaw `
|
|
145
|
+
UPDATE webhook_deliveries
|
|
146
|
+
SET status = 'FAILED', attempts = ${attempts},
|
|
147
|
+
last_attempt_at = NOW(), completed_at = NOW(),
|
|
148
|
+
next_attempt_at = NULL,
|
|
149
|
+
response_status = ${result.statusCode ?? null},
|
|
150
|
+
response_body = ${result.body ?? null},
|
|
151
|
+
latency_ms = ${result.latencyMs},
|
|
152
|
+
last_error = ${result.error ?? null}
|
|
153
|
+
WHERE id = ${deliveryId}::uuid`;
|
|
154
|
+
await this.appendAttemptLog(tx, deliveryId, attempts, 'FAILED', result);
|
|
155
|
+
});
|
|
141
156
|
}
|
|
142
157
|
async markRetry(deliveryId, attempts, nextAt, result) {
|
|
143
|
-
await this.prisma.$
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
158
|
+
await this.prisma.$transaction(async (tx) => {
|
|
159
|
+
await tx.$executeRaw `
|
|
160
|
+
UPDATE webhook_deliveries
|
|
161
|
+
SET status = 'PENDING', attempts = ${attempts},
|
|
162
|
+
last_attempt_at = NOW(), next_attempt_at = ${nextAt},
|
|
163
|
+
response_status = ${result.statusCode ?? null},
|
|
164
|
+
response_body = ${result.body ?? null},
|
|
165
|
+
latency_ms = ${result.latencyMs},
|
|
166
|
+
last_error = ${result.error ?? null}
|
|
167
|
+
WHERE id = ${deliveryId}::uuid`;
|
|
168
|
+
await this.appendAttemptLog(tx, deliveryId, attempts, 'PENDING', result);
|
|
169
|
+
});
|
|
153
170
|
}
|
|
154
171
|
async recoverStaleSending(stalenessMinutes) {
|
|
155
172
|
const interval = `${stalenessMinutes} minutes`;
|
|
156
173
|
const recovered = await this.prisma.$queryRaw `
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
174
|
+
WITH recovered AS (
|
|
175
|
+
UPDATE webhook_deliveries
|
|
176
|
+
SET attempts = attempts + 1,
|
|
177
|
+
status = CASE
|
|
178
|
+
WHEN attempts + 1 >= max_attempts THEN 'FAILED'
|
|
179
|
+
ELSE 'PENDING'
|
|
180
|
+
END,
|
|
181
|
+
claimed_at = NULL,
|
|
182
|
+
last_attempt_at = NOW(),
|
|
183
|
+
next_attempt_at = CASE
|
|
184
|
+
WHEN attempts + 1 >= max_attempts THEN NULL
|
|
185
|
+
ELSE NOW()
|
|
186
|
+
END,
|
|
187
|
+
completed_at = CASE
|
|
188
|
+
WHEN attempts + 1 >= max_attempts THEN NOW()
|
|
189
|
+
ELSE completed_at
|
|
190
|
+
END,
|
|
191
|
+
response_status = NULL,
|
|
192
|
+
response_body = NULL,
|
|
193
|
+
latency_ms = NULL,
|
|
194
|
+
last_error = ${STALE_SENDING_RECOVERY_ERROR}
|
|
195
|
+
WHERE status = 'SENDING'
|
|
196
|
+
AND claimed_at IS NOT NULL
|
|
197
|
+
AND claimed_at + ${interval}::interval < NOW()
|
|
198
|
+
RETURNING id, attempts, status
|
|
199
|
+
),
|
|
200
|
+
attempt_log AS (
|
|
201
|
+
INSERT INTO webhook_delivery_attempts (
|
|
202
|
+
delivery_id,
|
|
203
|
+
attempt_number,
|
|
204
|
+
status,
|
|
205
|
+
response_status,
|
|
206
|
+
response_body,
|
|
207
|
+
response_body_truncated,
|
|
208
|
+
latency_ms,
|
|
209
|
+
last_error
|
|
210
|
+
)
|
|
211
|
+
SELECT
|
|
212
|
+
id,
|
|
213
|
+
attempts,
|
|
214
|
+
status,
|
|
215
|
+
NULL,
|
|
216
|
+
NULL,
|
|
217
|
+
FALSE,
|
|
218
|
+
NULL,
|
|
219
|
+
${STALE_SENDING_RECOVERY_ERROR}
|
|
220
|
+
FROM recovered
|
|
221
|
+
ON CONFLICT (delivery_id, attempt_number) DO NOTHING
|
|
222
|
+
RETURNING delivery_id
|
|
223
|
+
)
|
|
224
|
+
SELECT recovered.id
|
|
225
|
+
FROM recovered
|
|
226
|
+
LEFT JOIN attempt_log ON attempt_log.delivery_id = recovered.id`;
|
|
163
227
|
return recovered.length;
|
|
164
228
|
}
|
|
165
229
|
async getDeliveryLogs(endpointId, filters) {
|
|
@@ -189,6 +253,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
189
253
|
d.event_id AS "eventId",
|
|
190
254
|
d.endpoint_id AS "endpointId",
|
|
191
255
|
COALESCE(d.endpoint_url_snapshot, ep.url) AS "destinationUrl",
|
|
256
|
+
ep.tenant_id::text AS "tenantId",
|
|
192
257
|
d.max_attempts AS "maxAttempts",
|
|
193
258
|
d.next_attempt_at AS "nextAttemptAt",
|
|
194
259
|
d.last_attempt_at AS "lastAttemptAt",
|
|
@@ -262,36 +327,29 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
262
327
|
FROM webhook_endpoints e
|
|
263
328
|
WHERE e.id = ${endpointId}::uuid`;
|
|
264
329
|
}
|
|
265
|
-
async appendAttemptLog(deliveryId, attempts, status, result) {
|
|
330
|
+
async appendAttemptLog(client, deliveryId, attempts, status, result) {
|
|
266
331
|
const { responseBody, responseBodyTruncated } = truncateAttemptResponseBody(result.body ?? null);
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
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
|
-
}
|
|
332
|
+
await client.$executeRaw `
|
|
333
|
+
INSERT INTO webhook_delivery_attempts (
|
|
334
|
+
delivery_id,
|
|
335
|
+
attempt_number,
|
|
336
|
+
status,
|
|
337
|
+
response_status,
|
|
338
|
+
response_body,
|
|
339
|
+
response_body_truncated,
|
|
340
|
+
latency_ms,
|
|
341
|
+
last_error
|
|
342
|
+
)
|
|
343
|
+
VALUES (
|
|
344
|
+
${deliveryId}::uuid,
|
|
345
|
+
${attempts},
|
|
346
|
+
${status},
|
|
347
|
+
${result.statusCode ?? null},
|
|
348
|
+
${responseBody},
|
|
349
|
+
${responseBodyTruncated},
|
|
350
|
+
${result.latencyMs},
|
|
351
|
+
${result.error ?? null}
|
|
352
|
+
)`;
|
|
295
353
|
}
|
|
296
354
|
};
|
|
297
355
|
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,4 +1,4 @@
|
|
|
1
|
-
import { WebhookEndpointRepository } from '../ports/webhook-endpoint.repository';
|
|
1
|
+
import { ResolvedCreateEndpointInput, ResolvedRotateEndpointSecretInput, WebhookEndpointRepository } from '../ports/webhook-endpoint.repository';
|
|
2
2
|
import { EndpointRecord, EndpointRecordWithSecret, UpdateEndpointDto } from '../interfaces/webhook-endpoint.interface';
|
|
3
3
|
import { WebhookSecretVault } from '../ports/webhook-secret-vault';
|
|
4
4
|
export declare class PrismaEndpointRepository implements WebhookEndpointRepository {
|
|
@@ -7,14 +7,15 @@ export declare class PrismaEndpointRepository implements WebhookEndpointReposito
|
|
|
7
7
|
constructor(prisma: any, vault?: WebhookSecretVault | undefined);
|
|
8
8
|
findMatchingEndpoints(eventType: string, tenantId: string | undefined): Promise<EndpointRecord[]>;
|
|
9
9
|
findMatchingEndpointsInTransaction(tx: any, eventType: string, tenantId: string | undefined): Promise<EndpointRecord[]>;
|
|
10
|
-
createEndpoint(
|
|
10
|
+
createEndpoint(input: ResolvedCreateEndpointInput): Promise<EndpointRecordWithSecret>;
|
|
11
11
|
getEndpoint(id: string): Promise<EndpointRecord | null>;
|
|
12
12
|
listEndpoints(tenantId?: string): Promise<EndpointRecord[]>;
|
|
13
13
|
updateEndpoint(id: string, dto: UpdateEndpointDto): Promise<EndpointRecord | null>;
|
|
14
|
+
rotateSecret(id: string, input: ResolvedRotateEndpointSecretInput): Promise<EndpointRecord | null>;
|
|
14
15
|
deleteEndpoint(id: string): Promise<boolean>;
|
|
15
16
|
resetFailures(endpointId: string): Promise<void>;
|
|
16
17
|
incrementFailures(endpointId: string): Promise<number>;
|
|
17
|
-
disableEndpoint(endpointId: string, reason: string): Promise<
|
|
18
|
+
disableEndpoint(endpointId: string, reason: string): Promise<boolean>;
|
|
18
19
|
recoverEligibleEndpoints(cooldownMinutes: number): Promise<number>;
|
|
19
20
|
}
|
|
20
21
|
//# sourceMappingURL=prisma-endpoint.repository.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-endpoint.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"prisma-endpoint.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"AACA,OAAO,EACL,2BAA2B,EAC3B,iCAAiC,EACjC,yBAAyB,EAC1B,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAClD,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAyBnE,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,KAAK,EAAE,2BAA2B,GACjC,OAAO,CAAC,wBAAwB,CAAC;IAkB9B,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,YAAY,CAChB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,iCAAiC,GACvC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAoB3B,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAM5C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAuBhD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAStD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQrE,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;CAazE"}
|
|
@@ -11,6 +11,7 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
12
|
exports.PrismaEndpointRepository = void 0;
|
|
13
13
|
const common_1 = require("@nestjs/common");
|
|
14
|
+
const webhook_constants_1 = require("../webhook.constants");
|
|
14
15
|
/** Public columns — excludes secret */
|
|
15
16
|
const ENDPOINT_COLUMNS = `
|
|
16
17
|
id, url, events, active, description, metadata,
|
|
@@ -62,11 +63,13 @@ let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
|
62
63
|
AND ($1 = ANY(events) OR '*' = ANY(events))`, eventType);
|
|
63
64
|
return rows;
|
|
64
65
|
}
|
|
65
|
-
async createEndpoint(
|
|
66
|
-
const encryptedSecret = this.vault
|
|
66
|
+
async createEndpoint(input) {
|
|
67
|
+
const encryptedSecret = this.vault
|
|
68
|
+
? await this.vault.encrypt(input.secret)
|
|
69
|
+
: input.secret;
|
|
67
70
|
const [endpoint] = await this.prisma.$queryRawUnsafe(`INSERT INTO webhook_endpoints (url, secret, events, description, metadata, tenant_id)
|
|
68
71
|
VALUES ($1, $2, $3::varchar[], $4, $5::jsonb, $6::uuid)
|
|
69
|
-
RETURNING ${ENDPOINT_COLUMNS_WITH_SECRET}`, url, encryptedSecret, events, description, metadata ? JSON.stringify(metadata) : null, tenantId);
|
|
72
|
+
RETURNING ${ENDPOINT_COLUMNS_WITH_SECRET}`, input.url, encryptedSecret, input.events, input.description, input.metadata ? JSON.stringify(input.metadata) : null, input.tenantId);
|
|
70
73
|
return endpoint;
|
|
71
74
|
}
|
|
72
75
|
async getEndpoint(id) {
|
|
@@ -115,6 +118,19 @@ let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
|
115
118
|
const results = await this.prisma.$queryRawUnsafe(query, ...values);
|
|
116
119
|
return results[0] ?? null;
|
|
117
120
|
}
|
|
121
|
+
async rotateSecret(id, input) {
|
|
122
|
+
const encryptedSecret = this.vault
|
|
123
|
+
? await this.vault.encrypt(input.secret)
|
|
124
|
+
: input.secret;
|
|
125
|
+
const results = await this.prisma.$queryRawUnsafe(`UPDATE webhook_endpoints
|
|
126
|
+
SET previous_secret = secret,
|
|
127
|
+
secret = $1,
|
|
128
|
+
previous_secret_expires_at = $2,
|
|
129
|
+
updated_at = NOW()
|
|
130
|
+
WHERE id = $3::uuid
|
|
131
|
+
RETURNING ${ENDPOINT_COLUMNS}`, encryptedSecret, input.previousSecretExpiresAt, id);
|
|
132
|
+
return results[0] ?? null;
|
|
133
|
+
}
|
|
118
134
|
async deleteEndpoint(id) {
|
|
119
135
|
const result = await this.prisma.$executeRaw `
|
|
120
136
|
DELETE FROM webhook_endpoints WHERE id = ${id}::uuid`;
|
|
@@ -123,8 +139,23 @@ let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
|
123
139
|
async resetFailures(endpointId) {
|
|
124
140
|
await this.prisma.$executeRaw `
|
|
125
141
|
UPDATE webhook_endpoints
|
|
126
|
-
SET consecutive_failures = 0,
|
|
127
|
-
|
|
142
|
+
SET consecutive_failures = 0,
|
|
143
|
+
active = CASE
|
|
144
|
+
WHEN disabled_reason = ${webhook_constants_1.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED}
|
|
145
|
+
THEN true
|
|
146
|
+
ELSE active
|
|
147
|
+
END,
|
|
148
|
+
disabled_at = CASE
|
|
149
|
+
WHEN disabled_reason = ${webhook_constants_1.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED}
|
|
150
|
+
THEN NULL
|
|
151
|
+
ELSE disabled_at
|
|
152
|
+
END,
|
|
153
|
+
disabled_reason = CASE
|
|
154
|
+
WHEN disabled_reason = ${webhook_constants_1.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED}
|
|
155
|
+
THEN NULL
|
|
156
|
+
ELSE disabled_reason
|
|
157
|
+
END,
|
|
158
|
+
updated_at = NOW()
|
|
128
159
|
WHERE id = ${endpointId}::uuid`;
|
|
129
160
|
}
|
|
130
161
|
async incrementFailures(endpointId) {
|
|
@@ -136,10 +167,11 @@ let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
|
136
167
|
return updated.consecutive_failures;
|
|
137
168
|
}
|
|
138
169
|
async disableEndpoint(endpointId, reason) {
|
|
139
|
-
await this.prisma.$executeRaw `
|
|
170
|
+
const updated = await this.prisma.$executeRaw `
|
|
140
171
|
UPDATE webhook_endpoints
|
|
141
172
|
SET active = false, disabled_at = NOW(), disabled_reason = ${reason}, updated_at = NOW()
|
|
142
173
|
WHERE id = ${endpointId}::uuid AND active = true`;
|
|
174
|
+
return updated > 0;
|
|
143
175
|
}
|
|
144
176
|
async recoverEligibleEndpoints(cooldownMinutes) {
|
|
145
177
|
const cooldownInterval = `${cooldownMinutes} minutes`;
|
|
@@ -149,6 +181,7 @@ let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
|
149
181
|
disabled_at = NULL, disabled_reason = NULL, updated_at = NOW()
|
|
150
182
|
WHERE active = false
|
|
151
183
|
AND disabled_at IS NOT NULL
|
|
184
|
+
AND disabled_reason = ${webhook_constants_1.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED}
|
|
152
185
|
AND disabled_at + ${cooldownInterval}::interval <= NOW()
|
|
153
186
|
RETURNING id`;
|
|
154
187
|
return recovered.length;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prisma-endpoint.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;
|
|
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
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
export { WebhookModule } from './webhook.module';
|
|
2
2
|
export { WebhookService } from './webhook.service';
|
|
3
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
3
4
|
export { WebhookDeliveryWorker } from './webhook.delivery-worker';
|
|
5
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
4
6
|
export { WebhookDispatcher } from './webhook.dispatcher';
|
|
7
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
5
8
|
export { WebhookRetryPolicy } from './webhook.retry-policy';
|
|
6
9
|
export { WebhookSigner, type SignatureHeaders } from './webhook.signer';
|
|
10
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
7
11
|
export { WebhookCircuitBreaker } from './webhook.circuit-breaker';
|
|
8
12
|
export { WebhookEvent } from './webhook.event';
|
|
9
13
|
export { WebhookEndpointAdminService } from './webhook.endpoint-admin.service';
|
|
10
14
|
export { WebhookDeliveryAdminService } from './webhook.delivery-admin.service';
|
|
11
|
-
/** @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService */
|
|
15
|
+
/** @deprecated since v0.2.0. Will be removed in v1.0.0. Use {@link WebhookEndpointAdminService} and {@link WebhookDeliveryAdminService}. */
|
|
12
16
|
export { WebhookAdminService } from './webhook.admin.service';
|
|
13
17
|
export type { WebhookEventRepository } from './ports/webhook-event.repository';
|
|
14
|
-
export type { WebhookEndpointRepository } from './ports/webhook-endpoint.repository';
|
|
15
|
-
export type { WebhookDeliveryRepository, PendingDelivery, } from './ports/webhook-delivery.repository';
|
|
18
|
+
export type { WebhookEndpointRepository, ResolvedCreateEndpointInput, ResolvedRotateEndpointSecretInput, } from './ports/webhook-endpoint.repository';
|
|
19
|
+
export type { WebhookDeliveryRepository, ClaimedDelivery, PendingDelivery, WebhookTransaction, } from './ports/webhook-delivery.repository';
|
|
16
20
|
export type { WebhookHttpClient } from './ports/webhook-http-client';
|
|
17
21
|
export type { WebhookSecretVault } from './ports/webhook-secret-vault';
|
|
18
22
|
export { PrismaEventRepository } from './adapters/prisma-event.repository';
|
|
@@ -20,9 +24,10 @@ export { PrismaEndpointRepository } from './adapters/prisma-endpoint.repository'
|
|
|
20
24
|
export { PrismaDeliveryRepository } from './adapters/prisma-delivery.repository';
|
|
21
25
|
export { FetchHttpClient } from './adapters/fetch-http-client';
|
|
22
26
|
export { PlaintextSecretVault } from './adapters/plaintext-secret-vault';
|
|
23
|
-
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, DeliveryFailedContext, DeliveryFailureKind, EndpointDisabledContext, } from './interfaces/webhook-options.interface';
|
|
24
|
-
export type { EndpointRecord, EndpointRecordWithSecret, CreateEndpointDto, UpdateEndpointDto, } from './interfaces/webhook-endpoint.interface';
|
|
25
|
-
export type { DeliveryStatus, DeliveryRecord, DeliveryAttemptRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
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
|
+
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, DeliveryFailedContext, DeliveryFailureKind, DeliveryRetryScheduledContext, EndpointDisabledContext, EndpointDegradedContext, } from './interfaces/webhook-options.interface';
|
|
28
|
+
export type { EndpointRecord, EndpointRecordWithSecret, CreateEndpointDto, UpdateEndpointDto, RotateEndpointSecretDto, } from './interfaces/webhook-endpoint.interface';
|
|
29
|
+
export type { DeliveryStatus, DeliveryAttemptStatus, DeliveryRecord, DeliveryAttemptRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
30
|
+
export { WEBHOOK_MODULE_OPTIONS, WEBHOOK_EVENT_REPOSITORY, WEBHOOK_ENDPOINT_REPOSITORY, WEBHOOK_DELIVERY_REPOSITORY, WEBHOOK_HTTP_CLIENT, WEBHOOK_SECRET_VAULT, 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, ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED, DEFAULT_STALE_SENDING_MINUTES, } from './webhook.constants';
|
|
31
|
+
export type { EndpointDisabledReason } from './webhook.constants';
|
|
27
32
|
export { validateWebhookUrl, resolveAndValidateHost, WebhookUrlValidationError, type WebhookUrlValidationReason, } from './webhook.url-validator';
|
|
28
33
|
//# 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,
|
|
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,6GAA6G;AAC7G,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,6GAA6G;AAC7G,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,6GAA6G;AAC7G,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,6GAA6G;AAC7G,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,4IAA4I;AAC5I,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,YAAY,EACV,yBAAyB,EACzB,2BAA2B,EAC3B,iCAAiC,GAClC,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EACV,yBAAyB,EACzB,eAAe,EACf,eAAe,EACf,kBAAkB,GACnB,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,6BAA6B,EAC7B,uBAAuB,EACvB,uBAAuB,GACxB,MAAM,wCAAwC,CAAC;AAGhD,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,EACjB,uBAAuB,GACxB,MAAM,yCAAyC,CAAC;AAEjD,YAAY,EACV,cAAc,EACd,qBAAqB,EACrB,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,oBAAoB,EACpB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,wCAAwC,EACxC,sDAAsD,EACtD,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAC7B,YAAY,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAGlE,OAAO,EACL,kBAAkB,EAClB,sBAAsB,EACtB,yBAAyB,EACzB,KAAK,0BAA0B,GAChC,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,20 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.WebhookUrlValidationError = exports.resolveAndValidateHost = exports.validateWebhookUrl = exports.DEFAULT_STALE_SENDING_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_THRESHOLD = exports.DEFAULT_POLLING_BATCH_SIZE = exports.DEFAULT_POLLING_INTERVAL = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_DELIVERY_TIMEOUT = exports.DEFAULT_BACKOFF_SCHEDULE = exports.WEBHOOK_HTTP_CLIENT = exports.WEBHOOK_DELIVERY_REPOSITORY = exports.WEBHOOK_ENDPOINT_REPOSITORY = exports.WEBHOOK_EVENT_REPOSITORY = exports.WEBHOOK_MODULE_OPTIONS = exports.PlaintextSecretVault = exports.FetchHttpClient = exports.PrismaDeliveryRepository = exports.PrismaEndpointRepository = exports.PrismaEventRepository = exports.WebhookAdminService = exports.WebhookDeliveryAdminService = exports.WebhookEndpointAdminService = exports.WebhookEvent = exports.WebhookCircuitBreaker = exports.WebhookSigner = exports.WebhookRetryPolicy = exports.WebhookDispatcher = exports.WebhookDeliveryWorker = exports.WebhookService = exports.WebhookModule = void 0;
|
|
3
|
+
exports.WebhookUrlValidationError = exports.resolveAndValidateHost = exports.validateWebhookUrl = exports.DEFAULT_STALE_SENDING_MINUTES = exports.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED = exports.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_THRESHOLD = exports.DEFAULT_POLLING_BATCH_SIZE = exports.DEFAULT_POLLING_INTERVAL = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_DELIVERY_TIMEOUT = exports.DEFAULT_BACKOFF_SCHEDULE = exports.WEBHOOK_SECRET_VAULT = exports.WEBHOOK_HTTP_CLIENT = exports.WEBHOOK_DELIVERY_REPOSITORY = exports.WEBHOOK_ENDPOINT_REPOSITORY = exports.WEBHOOK_EVENT_REPOSITORY = exports.WEBHOOK_MODULE_OPTIONS = exports.PlaintextSecretVault = exports.FetchHttpClient = exports.PrismaDeliveryRepository = exports.PrismaEndpointRepository = exports.PrismaEventRepository = exports.WebhookAdminService = exports.WebhookDeliveryAdminService = exports.WebhookEndpointAdminService = exports.WebhookEvent = exports.WebhookCircuitBreaker = exports.WebhookSigner = exports.WebhookRetryPolicy = exports.WebhookDispatcher = exports.WebhookDeliveryWorker = exports.WebhookService = exports.WebhookModule = void 0;
|
|
4
4
|
// Module
|
|
5
5
|
var webhook_module_1 = require("./webhook.module");
|
|
6
6
|
Object.defineProperty(exports, "WebhookModule", { enumerable: true, get: function () { return webhook_module_1.WebhookModule; } });
|
|
7
7
|
// Core services
|
|
8
8
|
var webhook_service_1 = require("./webhook.service");
|
|
9
9
|
Object.defineProperty(exports, "WebhookService", { enumerable: true, get: function () { return webhook_service_1.WebhookService; } });
|
|
10
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
10
11
|
var webhook_delivery_worker_1 = require("./webhook.delivery-worker");
|
|
11
12
|
Object.defineProperty(exports, "WebhookDeliveryWorker", { enumerable: true, get: function () { return webhook_delivery_worker_1.WebhookDeliveryWorker; } });
|
|
13
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
12
14
|
var webhook_dispatcher_1 = require("./webhook.dispatcher");
|
|
13
15
|
Object.defineProperty(exports, "WebhookDispatcher", { enumerable: true, get: function () { return webhook_dispatcher_1.WebhookDispatcher; } });
|
|
16
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
14
17
|
var webhook_retry_policy_1 = require("./webhook.retry-policy");
|
|
15
18
|
Object.defineProperty(exports, "WebhookRetryPolicy", { enumerable: true, get: function () { return webhook_retry_policy_1.WebhookRetryPolicy; } });
|
|
16
19
|
var webhook_signer_1 = require("./webhook.signer");
|
|
17
20
|
Object.defineProperty(exports, "WebhookSigner", { enumerable: true, get: function () { return webhook_signer_1.WebhookSigner; } });
|
|
21
|
+
/** @internal Wired automatically by WebhookModule. Exported for advanced testing/custom integration only. */
|
|
18
22
|
var webhook_circuit_breaker_1 = require("./webhook.circuit-breaker");
|
|
19
23
|
Object.defineProperty(exports, "WebhookCircuitBreaker", { enumerable: true, get: function () { return webhook_circuit_breaker_1.WebhookCircuitBreaker; } });
|
|
20
24
|
var webhook_event_1 = require("./webhook.event");
|
|
@@ -24,7 +28,7 @@ var webhook_endpoint_admin_service_1 = require("./webhook.endpoint-admin.service
|
|
|
24
28
|
Object.defineProperty(exports, "WebhookEndpointAdminService", { enumerable: true, get: function () { return webhook_endpoint_admin_service_1.WebhookEndpointAdminService; } });
|
|
25
29
|
var webhook_delivery_admin_service_1 = require("./webhook.delivery-admin.service");
|
|
26
30
|
Object.defineProperty(exports, "WebhookDeliveryAdminService", { enumerable: true, get: function () { return webhook_delivery_admin_service_1.WebhookDeliveryAdminService; } });
|
|
27
|
-
/** @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService */
|
|
31
|
+
/** @deprecated since v0.2.0. Will be removed in v1.0.0. Use {@link WebhookEndpointAdminService} and {@link WebhookDeliveryAdminService}. */
|
|
28
32
|
var webhook_admin_service_1 = require("./webhook.admin.service");
|
|
29
33
|
Object.defineProperty(exports, "WebhookAdminService", { enumerable: true, get: function () { return webhook_admin_service_1.WebhookAdminService; } });
|
|
30
34
|
// Default adapters
|
|
@@ -45,6 +49,7 @@ Object.defineProperty(exports, "WEBHOOK_EVENT_REPOSITORY", { enumerable: true, g
|
|
|
45
49
|
Object.defineProperty(exports, "WEBHOOK_ENDPOINT_REPOSITORY", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY; } });
|
|
46
50
|
Object.defineProperty(exports, "WEBHOOK_DELIVERY_REPOSITORY", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY; } });
|
|
47
51
|
Object.defineProperty(exports, "WEBHOOK_HTTP_CLIENT", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_HTTP_CLIENT; } });
|
|
52
|
+
Object.defineProperty(exports, "WEBHOOK_SECRET_VAULT", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_SECRET_VAULT; } });
|
|
48
53
|
Object.defineProperty(exports, "DEFAULT_BACKOFF_SCHEDULE", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_BACKOFF_SCHEDULE; } });
|
|
49
54
|
Object.defineProperty(exports, "DEFAULT_DELIVERY_TIMEOUT", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_DELIVERY_TIMEOUT; } });
|
|
50
55
|
Object.defineProperty(exports, "DEFAULT_MAX_RETRIES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_MAX_RETRIES; } });
|
|
@@ -52,7 +57,9 @@ Object.defineProperty(exports, "DEFAULT_POLLING_INTERVAL", { enumerable: true, g
|
|
|
52
57
|
Object.defineProperty(exports, "DEFAULT_POLLING_BATCH_SIZE", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_POLLING_BATCH_SIZE; } });
|
|
53
58
|
Object.defineProperty(exports, "DEFAULT_CIRCUIT_BREAKER_THRESHOLD", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_THRESHOLD; } });
|
|
54
59
|
Object.defineProperty(exports, "DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES; } });
|
|
60
|
+
Object.defineProperty(exports, "ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED", { enumerable: true, get: function () { return webhook_constants_1.ENDPOINT_DISABLED_REASON_CONSECUTIVE_FAILURES_EXCEEDED; } });
|
|
55
61
|
Object.defineProperty(exports, "DEFAULT_STALE_SENDING_MINUTES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_STALE_SENDING_MINUTES; } });
|
|
62
|
+
// URL validation
|
|
56
63
|
var webhook_url_validator_1 = require("./webhook.url-validator");
|
|
57
64
|
Object.defineProperty(exports, "validateWebhookUrl", { enumerable: true, get: function () { return webhook_url_validator_1.validateWebhookUrl; } });
|
|
58
65
|
Object.defineProperty(exports, "resolveAndValidateHost", { enumerable: true, get: function () { return webhook_url_validator_1.resolveAndValidateHost; } });
|
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,
|
|
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,6GAA6G;AAC7G,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,6GAA6G;AAC7G,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,6GAA6G;AAC7G,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,mDAAwE;AAA/D,+GAAA,aAAa,OAAA;AACtB,6GAA6G;AAC7G,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,4IAA4I;AAC5I,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAkB5B,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;AAoC7B,qBAAqB;AACrB,yDAgB6B;AAf3B,2HAAA,sBAAsB,OAAA;AACtB,6HAAA,wBAAwB,OAAA;AACxB,gIAAA,2BAA2B,OAAA;AAC3B,gIAAA,2BAA2B,OAAA;AAC3B,wHAAA,mBAAmB,OAAA;AACnB,yHAAA,oBAAoB,OAAA;AACpB,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,2JAAA,sDAAsD,OAAA;AACtD,kIAAA,6BAA6B,OAAA;AAI/B,iBAAiB;AACjB,iEAKiC;AAJ/B,2HAAA,kBAAkB,OAAA;AAClB,+HAAA,sBAAsB,OAAA;AACtB,kIAAA,yBAAyB,OAAA"}
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
export type DeliveryStatus = 'PENDING' | 'SENDING' | 'SENT' | 'FAILED';
|
|
2
|
+
export type DeliveryAttemptStatus = Exclude<DeliveryStatus, 'SENDING'>;
|
|
2
3
|
export interface DeliveryRecord {
|
|
3
4
|
id: string;
|
|
4
5
|
eventId: string;
|
|
5
6
|
endpointId: string;
|
|
6
|
-
|
|
7
|
+
/** Destination URL used for this delivery. Uses the queued snapshot when available. */
|
|
8
|
+
destinationUrl: string;
|
|
9
|
+
/** Null when the endpoint is global rather than tenant-scoped. */
|
|
10
|
+
tenantId: string | null;
|
|
7
11
|
status: DeliveryStatus;
|
|
8
12
|
attempts: number;
|
|
9
13
|
maxAttempts: number;
|
|
@@ -19,7 +23,7 @@ export interface DeliveryAttemptRecord {
|
|
|
19
23
|
id: string;
|
|
20
24
|
deliveryId: string;
|
|
21
25
|
attemptNumber: number;
|
|
22
|
-
status:
|
|
26
|
+
status: DeliveryAttemptStatus;
|
|
23
27
|
responseStatus: number | null;
|
|
24
28
|
responseBody: string | null;
|
|
25
29
|
responseBodyTruncated: boolean;
|
|
@@ -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,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;
|
|
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;AACvE,MAAM,MAAM,qBAAqB,GAAG,OAAO,CAAC,cAAc,EAAE,SAAS,CAAC,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,uFAAuF;IACvF,cAAc,EAAE,MAAM,CAAC;IACvB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,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,qBAAqB,CAAC;IAC9B,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"}
|