@nestarc/webhook 0.11.0 → 0.12.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 +46 -1
- package/dist/adapters/prisma-delivery.repository.d.ts +2 -1
- package/dist/adapters/prisma-delivery.repository.d.ts.map +1 -1
- package/dist/adapters/prisma-delivery.repository.js +68 -1
- package/dist/adapters/prisma-delivery.repository.js.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/interfaces/webhook-options.interface.d.ts +52 -0
- package/dist/interfaces/webhook-options.interface.d.ts.map +1 -1
- package/dist/ports/webhook-delivery.repository.d.ts +8 -0
- package/dist/ports/webhook-delivery.repository.d.ts.map +1 -1
- package/dist/webhook.delivery-worker.d.ts +15 -0
- package/dist/webhook.delivery-worker.d.ts.map +1 -1
- package/dist/webhook.delivery-worker.js +151 -8
- package/dist/webhook.delivery-worker.js.map +1 -1
- package/package.json +1 -1
- package/src/sql/create-webhook-tables.sql +6 -0
- package/src/sql/migrations/v0.12.0.sql +10 -0
package/README.md
CHANGED
|
@@ -218,8 +218,12 @@ export class WebhookController {
|
|
|
218
218
|
| `circuitBreaker.cooldownMinutes` | `60` | Minutes before attempting recovery |
|
|
219
219
|
| `polling.enabled` | `true` | Set to `false` to disable the polling loop (API-only mode) |
|
|
220
220
|
| `polling.interval` | `5000` | Delivery worker poll interval (ms) |
|
|
221
|
-
| `polling.batchSize` | `50` | Max
|
|
221
|
+
| `polling.batchSize` | `50` | Max rows claimed in one database claim |
|
|
222
222
|
| `polling.staleSendingMinutes` | `5` | Minutes before a stuck SENDING delivery is recovered |
|
|
223
|
+
| `polling.maxConcurrency` | `polling.batchSize` | Max delivery dispatches in flight per worker process |
|
|
224
|
+
| `polling.drainWhileBacklogged` | `false` | Keep claiming additional batches inside one poll while backlog and capacity remain |
|
|
225
|
+
| `polling.maxDrainLoopsPerPoll` | `1`, or `10` when drain mode is enabled | Max claim loops inside one poll cycle |
|
|
226
|
+
| `polling.drainLoopDelayMs` | `0` | Optional delay between drain loops |
|
|
223
227
|
| `allowPrivateUrls` | `false` | Allow private/internal URLs (dev/test only) |
|
|
224
228
|
| `secretVault` | `PlaintextSecretVault` | Custom vault for encrypting/decrypting endpoint secrets at rest |
|
|
225
229
|
| `onDeliveryFailed` | — | Fire-and-forget callback when a delivery exhausts retries or receives a non-retryable response. Receives `DeliveryFailedContext` (`tenantId` is `null` for global endpoints). See **Delivery failure classification** below. |
|
|
@@ -229,6 +233,47 @@ export class WebhookController {
|
|
|
229
233
|
|
|
230
234
|
The retry schedule is fixed exponential (`30s`, `5m`, `30m`, `2h`, `24h`). Use `delivery.jitter` to enable or disable random jitter.
|
|
231
235
|
|
|
236
|
+
### Worker Capacity And Observer Metrics
|
|
237
|
+
|
|
238
|
+
The delivery worker keeps the previous default behavior: one poll claims up to `polling.batchSize` rows and waits for those deliveries before the next interval. Set `polling.maxConcurrency` to cap in-flight dispatches below or above a claim size, and set `polling.drainWhileBacklogged: true` when a worker should continue draining queued deliveries inside the same poll cycle.
|
|
239
|
+
|
|
240
|
+
```ts
|
|
241
|
+
WebhookModule.forRoot({
|
|
242
|
+
prisma,
|
|
243
|
+
polling: {
|
|
244
|
+
interval: 1_000,
|
|
245
|
+
batchSize: 100,
|
|
246
|
+
maxConcurrency: 200,
|
|
247
|
+
drainWhileBacklogged: true,
|
|
248
|
+
maxDrainLoopsPerPoll: 10,
|
|
249
|
+
},
|
|
250
|
+
workerObserver: {
|
|
251
|
+
onPollComplete(result) {
|
|
252
|
+
metrics.count('webhook.worker.claimed', result.claimed);
|
|
253
|
+
metrics.count('webhook.worker.sent', result.sent);
|
|
254
|
+
metrics.count('webhook.worker.retried', result.retried);
|
|
255
|
+
metrics.gauge('webhook.worker.poll.duration_ms', result.durationMs);
|
|
256
|
+
},
|
|
257
|
+
onDeliveryComplete(result) {
|
|
258
|
+
metrics.count(`webhook.delivery.${result.status}`, 1);
|
|
259
|
+
},
|
|
260
|
+
onPollError(error) {
|
|
261
|
+
logger.error({ error }, 'webhook worker poll failed');
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
});
|
|
265
|
+
```
|
|
266
|
+
|
|
267
|
+
Observer callbacks are best-effort. Exceptions thrown by observer callbacks are logged and do not fail delivery processing.
|
|
268
|
+
|
|
269
|
+
Backlog diagnostics are available on repository implementations that support `getBacklogSummary()`:
|
|
270
|
+
|
|
271
|
+
```ts
|
|
272
|
+
const summary = await deliveryRepository.getBacklogSummary?.();
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
The summary includes `pendingCount`, `sendingCount`, `runnablePendingCount`, `oldestPendingAgeMs`, and `oldestRunnableAgeMs`.
|
|
276
|
+
|
|
232
277
|
Webhook receiver responses are classified before scheduling another attempt:
|
|
233
278
|
|
|
234
279
|
| Response | Behavior |
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ClaimedDelivery, PendingDelivery, WebhookDeliveryRepository, WebhookTransaction } from '../ports/webhook-delivery.repository';
|
|
1
|
+
import { ClaimedDelivery, DeliveryBacklogSummary, PendingDelivery, WebhookDeliveryRepository, WebhookTransaction } from '../ports/webhook-delivery.repository';
|
|
2
2
|
import { DeliveryAttemptRecord, DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
3
3
|
import { WebhookSecretVault } from '../ports/webhook-secret-vault';
|
|
4
4
|
type AttemptLogClient = {
|
|
@@ -16,6 +16,7 @@ export declare class PrismaDeliveryRepository implements WebhookDeliveryReposito
|
|
|
16
16
|
markFailed(deliveryId: string, attempts: number, result: DeliveryResult): Promise<void>;
|
|
17
17
|
markRetry(deliveryId: string, attempts: number, nextAt: Date, result: DeliveryResult): Promise<void>;
|
|
18
18
|
recoverStaleSending(stalenessMinutes: number): Promise<number>;
|
|
19
|
+
getBacklogSummary(): Promise<DeliveryBacklogSummary>;
|
|
19
20
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
20
21
|
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
21
22
|
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
@@ -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,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EACnB,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;AAGnE,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,CAAC,CAAC,GAAG,OAAO,EACvB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,KACjB,OAAO,CAAC,CAAC,CAAC,CAAC;CACjB,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,sBAAsB,EACtB,eAAe,EACf,yBAAyB,EACzB,kBAAkB,EACnB,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;AAGnE,KAAK,gBAAgB,GAAG;IACtB,WAAW,EAAE,CAAC,CAAC,GAAG,OAAO,EACvB,OAAO,EAAE,oBAAoB,EAC7B,GAAG,MAAM,EAAE,OAAO,EAAE,KACjB,OAAO,CAAC,CAAC,CAAC,CAAC;CACjB,CAAC;AA4CF,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,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI3E,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAqBrE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IA4CnE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAcrF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAgBvF,SAAS,CACb,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,IAAI,EACZ,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;IAeV,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA2D9D,iBAAiB,IAAI,OAAO,CAAC,sBAAsB,CAAC;IAwEpD,eAAe,CACnB,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC;IAmDtB,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,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,MAAM,EAChB,MAAM,EAAE,SAAS,GAAG,MAAM,GAAG,QAAQ,EACrC,MAAM,EAAE,cAAc,GACrB,OAAO,CAAC,IAAI,CAAC;CA0BjB"}
|
|
@@ -31,6 +31,13 @@ function truncateAttemptResponseBody(body) {
|
|
|
31
31
|
responseBodyTruncated: true,
|
|
32
32
|
};
|
|
33
33
|
}
|
|
34
|
+
function normalizeBacklogNumber(value, field) {
|
|
35
|
+
const normalized = Number(value);
|
|
36
|
+
if (!Number.isFinite(normalized)) {
|
|
37
|
+
throw new Error(`Invalid backlog summary ${field}: ${String(value)}`);
|
|
38
|
+
}
|
|
39
|
+
return normalized;
|
|
40
|
+
}
|
|
34
41
|
let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
35
42
|
prisma;
|
|
36
43
|
vault;
|
|
@@ -194,7 +201,7 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
194
201
|
last_error = ${STALE_SENDING_RECOVERY_ERROR}
|
|
195
202
|
WHERE status = 'SENDING'
|
|
196
203
|
AND claimed_at IS NOT NULL
|
|
197
|
-
AND claimed_at
|
|
204
|
+
AND claimed_at < NOW() - ${interval}::interval
|
|
198
205
|
RETURNING id, attempts, status
|
|
199
206
|
),
|
|
200
207
|
attempt_log AS (
|
|
@@ -226,6 +233,66 @@ let PrismaDeliveryRepository = class PrismaDeliveryRepository {
|
|
|
226
233
|
LEFT JOIN attempt_log ON attempt_log.delivery_id = recovered.id`;
|
|
227
234
|
return recovered.length;
|
|
228
235
|
}
|
|
236
|
+
async getBacklogSummary() {
|
|
237
|
+
const rows = await this.prisma.$queryRaw `
|
|
238
|
+
WITH backlog AS (
|
|
239
|
+
SELECT
|
|
240
|
+
COUNT(*) FILTER (WHERE status = 'PENDING') AS "pendingCount",
|
|
241
|
+
COUNT(*) FILTER (WHERE status = 'SENDING') AS "sendingCount",
|
|
242
|
+
COUNT(*) FILTER (
|
|
243
|
+
WHERE status = 'PENDING'
|
|
244
|
+
AND next_attempt_at <= NOW()
|
|
245
|
+
) AS "runnablePendingCount",
|
|
246
|
+
MIN(next_attempt_at) FILTER (
|
|
247
|
+
WHERE status = 'PENDING'
|
|
248
|
+
) AS "oldestPendingAt",
|
|
249
|
+
MIN(next_attempt_at) FILTER (
|
|
250
|
+
WHERE status = 'PENDING'
|
|
251
|
+
AND next_attempt_at <= NOW()
|
|
252
|
+
) AS "oldestRunnableAt"
|
|
253
|
+
FROM webhook_deliveries
|
|
254
|
+
)
|
|
255
|
+
SELECT
|
|
256
|
+
"pendingCount",
|
|
257
|
+
"sendingCount",
|
|
258
|
+
"runnablePendingCount",
|
|
259
|
+
CASE
|
|
260
|
+
WHEN "oldestPendingAt" IS NULL THEN NULL
|
|
261
|
+
ELSE GREATEST(
|
|
262
|
+
0,
|
|
263
|
+
FLOOR(EXTRACT(EPOCH FROM (NOW() - "oldestPendingAt")) * 1000)::bigint
|
|
264
|
+
)
|
|
265
|
+
END AS "oldestPendingAgeMs",
|
|
266
|
+
CASE
|
|
267
|
+
WHEN "oldestRunnableAt" IS NULL THEN NULL
|
|
268
|
+
ELSE GREATEST(
|
|
269
|
+
0,
|
|
270
|
+
FLOOR(EXTRACT(EPOCH FROM (NOW() - "oldestRunnableAt")) * 1000)::bigint
|
|
271
|
+
)
|
|
272
|
+
END AS "oldestRunnableAgeMs"
|
|
273
|
+
FROM backlog`;
|
|
274
|
+
const row = rows[0];
|
|
275
|
+
if (!row) {
|
|
276
|
+
return {
|
|
277
|
+
pendingCount: 0,
|
|
278
|
+
sendingCount: 0,
|
|
279
|
+
runnablePendingCount: 0,
|
|
280
|
+
oldestPendingAgeMs: null,
|
|
281
|
+
oldestRunnableAgeMs: null,
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
return {
|
|
285
|
+
pendingCount: normalizeBacklogNumber(row.pendingCount, 'pendingCount'),
|
|
286
|
+
sendingCount: normalizeBacklogNumber(row.sendingCount, 'sendingCount'),
|
|
287
|
+
runnablePendingCount: normalizeBacklogNumber(row.runnablePendingCount, 'runnablePendingCount'),
|
|
288
|
+
oldestPendingAgeMs: row.oldestPendingAgeMs == null
|
|
289
|
+
? null
|
|
290
|
+
: normalizeBacklogNumber(row.oldestPendingAgeMs, 'oldestPendingAgeMs'),
|
|
291
|
+
oldestRunnableAgeMs: row.oldestRunnableAgeMs == null
|
|
292
|
+
? null
|
|
293
|
+
: normalizeBacklogNumber(row.oldestRunnableAgeMs, 'oldestRunnableAgeMs'),
|
|
294
|
+
};
|
|
295
|
+
}
|
|
229
296
|
async getDeliveryLogs(endpointId, filters) {
|
|
230
297
|
const conditions = ['d.endpoint_id = $1::uuid'];
|
|
231
298
|
const values = [endpointId];
|
|
@@ -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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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ export { WebhookDeliveryAdminService } from './webhook.delivery-admin.service';
|
|
|
16
16
|
export { WebhookAdminService } from './webhook.admin.service';
|
|
17
17
|
export type { WebhookEventRepository } from './ports/webhook-event.repository';
|
|
18
18
|
export type { WebhookEndpointRepository, ResolvedCreateEndpointInput, ResolvedRotateEndpointSecretInput, } from './ports/webhook-endpoint.repository';
|
|
19
|
-
export type { WebhookDeliveryRepository, ClaimedDelivery, PendingDelivery, WebhookTransaction, } from './ports/webhook-delivery.repository';
|
|
19
|
+
export type { WebhookDeliveryRepository, ClaimedDelivery, DeliveryBacklogSummary, PendingDelivery, WebhookTransaction, } from './ports/webhook-delivery.repository';
|
|
20
20
|
export type { WebhookHttpClient } from './ports/webhook-http-client';
|
|
21
21
|
export type { WebhookSecretVault } from './ports/webhook-secret-vault';
|
|
22
22
|
export { PrismaEventRepository } from './adapters/prisma-event.repository';
|
|
@@ -24,7 +24,7 @@ export { PrismaEndpointRepository } from './adapters/prisma-endpoint.repository'
|
|
|
24
24
|
export { PrismaDeliveryRepository } from './adapters/prisma-delivery.repository';
|
|
25
25
|
export { FetchHttpClient } from './adapters/fetch-http-client';
|
|
26
26
|
export { PlaintextSecretVault } from './adapters/plaintext-secret-vault';
|
|
27
|
-
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, DeliveryFailedContext, DeliveryFailureKind, DeliveryRetryScheduledContext, EndpointDisabledContext, EndpointDegradedContext, } from './interfaces/webhook-options.interface';
|
|
27
|
+
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, WebhookPollContext, WebhookPollResult, WebhookDeliveryProcessingStatus, WebhookDeliveryProcessingResult, WebhookWorkerObserver, DeliveryFailedContext, DeliveryFailureKind, DeliveryRetryScheduledContext, EndpointDisabledContext, EndpointDegradedContext, } from './interfaces/webhook-options.interface';
|
|
28
28
|
export type { EndpointRecord, EndpointRecordWithSecret, CreateEndpointDto, UpdateEndpointDto, RotateEndpointSecretDto, } from './interfaces/webhook-endpoint.interface';
|
|
29
29
|
export type { DeliveryStatus, DeliveryAttemptStatus, DeliveryRecord, DeliveryAttemptRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
30
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';
|
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,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"}
|
|
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,sBAAsB,EACtB,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,kBAAkB,EAClB,iBAAiB,EACjB,+BAA+B,EAC/B,+BAA+B,EAC/B,qBAAqB,EACrB,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.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,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;
|
|
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;AAmB5B,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;AAyC7B,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"}
|
|
@@ -25,6 +25,56 @@ export interface PollingOptions {
|
|
|
25
25
|
batchSize?: number;
|
|
26
26
|
/** Minutes before a SENDING delivery is considered stale and reset to PENDING. Default: 5 */
|
|
27
27
|
staleSendingMinutes?: number;
|
|
28
|
+
/** Maximum delivery dispatches in flight per worker process. Default: batchSize */
|
|
29
|
+
maxConcurrency?: number;
|
|
30
|
+
/** When true, one poll cycle keeps claiming while backlog and capacity remain. Default: false */
|
|
31
|
+
drainWhileBacklogged?: boolean;
|
|
32
|
+
/** Maximum claim/drain loops inside one poll cycle. Default: 1, or 10 when drainWhileBacklogged is true */
|
|
33
|
+
maxDrainLoopsPerPoll?: number;
|
|
34
|
+
/** Optional sleep between continuous drain loops. Default: 0 */
|
|
35
|
+
drainLoopDelayMs?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface WebhookPollContext {
|
|
38
|
+
batchSize: number;
|
|
39
|
+
maxConcurrency: number;
|
|
40
|
+
drainWhileBacklogged: boolean;
|
|
41
|
+
maxDrainLoopsPerPoll: number;
|
|
42
|
+
drainLoopDelayMs: number;
|
|
43
|
+
activeDeliveries: number;
|
|
44
|
+
}
|
|
45
|
+
export interface WebhookPollResult {
|
|
46
|
+
claimed: number;
|
|
47
|
+
enriched: number;
|
|
48
|
+
sent: number;
|
|
49
|
+
failed: number;
|
|
50
|
+
retried: number;
|
|
51
|
+
recoveredStale: number;
|
|
52
|
+
durationMs: number;
|
|
53
|
+
loops: number;
|
|
54
|
+
}
|
|
55
|
+
export type WebhookDeliveryProcessingStatus = 'sent' | 'failed' | 'retried';
|
|
56
|
+
export interface WebhookDeliveryProcessingResult {
|
|
57
|
+
deliveryId: string;
|
|
58
|
+
endpointId: string;
|
|
59
|
+
eventId: string;
|
|
60
|
+
tenantId: string | null;
|
|
61
|
+
attempts: number;
|
|
62
|
+
maxAttempts: number;
|
|
63
|
+
status: WebhookDeliveryProcessingStatus;
|
|
64
|
+
responseStatus: number | null;
|
|
65
|
+
lastError: string | null;
|
|
66
|
+
latencyMs: number | null;
|
|
67
|
+
nextAttemptAt?: Date;
|
|
68
|
+
failureKind?: DeliveryFailureKind;
|
|
69
|
+
validationReason?: WebhookUrlValidationReason;
|
|
70
|
+
validationUrl?: string;
|
|
71
|
+
resolvedIp?: string;
|
|
72
|
+
}
|
|
73
|
+
export interface WebhookWorkerObserver {
|
|
74
|
+
onPollStart?(context: WebhookPollContext): void;
|
|
75
|
+
onPollComplete?(result: WebhookPollResult): void;
|
|
76
|
+
onDeliveryComplete?(result: WebhookDeliveryProcessingResult): void;
|
|
77
|
+
onPollError?(error: unknown): void;
|
|
28
78
|
}
|
|
29
79
|
/**
|
|
30
80
|
* Category of failure that caused the delivery to stop after retry exhaustion
|
|
@@ -97,6 +147,8 @@ export interface WebhookModuleOptions<TPrisma = unknown> {
|
|
|
97
147
|
delivery?: DeliveryOptions;
|
|
98
148
|
circuitBreaker?: CircuitBreakerOptions;
|
|
99
149
|
polling?: PollingOptions;
|
|
150
|
+
/** Best-effort worker lifecycle and delivery metrics observer. Observer errors are logged and ignored. */
|
|
151
|
+
workerObserver?: WebhookWorkerObserver;
|
|
100
152
|
/** Allow private/internal URLs for endpoints. Only enable in development/testing. Default: false */
|
|
101
153
|
allowPrivateUrls?: boolean;
|
|
102
154
|
/** Custom port overrides — provide these to replace default Prisma/fetch adapters. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,cAAc,EACd,yBAAyB,EACzB,IAAI,EACL,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,sCAAsC,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACjE,OAAO,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACnE,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AAEtE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wFAAwF;IACxF,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,sIAAsI;IACtI,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,mBAAmB,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"webhook-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,6 +21,13 @@ export interface PendingDelivery extends ClaimedDelivery {
|
|
|
21
21
|
eventType: string;
|
|
22
22
|
payload: Record<string, unknown>;
|
|
23
23
|
}
|
|
24
|
+
export interface DeliveryBacklogSummary {
|
|
25
|
+
pendingCount: number;
|
|
26
|
+
sendingCount: number;
|
|
27
|
+
runnablePendingCount: number;
|
|
28
|
+
oldestPendingAgeMs: number | null;
|
|
29
|
+
oldestRunnableAgeMs: number | null;
|
|
30
|
+
}
|
|
24
31
|
export interface WebhookDeliveryRepository {
|
|
25
32
|
/**
|
|
26
33
|
* Creates queued delivery rows inside the provided transaction.
|
|
@@ -37,6 +44,7 @@ export interface WebhookDeliveryRepository {
|
|
|
37
44
|
markRetry(deliveryId: string, attempts: number, nextAt: Date, result: DeliveryResult): Promise<void>;
|
|
38
45
|
/** @returns number of stale SENDING deliveries recovered or failed. */
|
|
39
46
|
recoverStaleSending(stalenessMinutes: number): Promise<number>;
|
|
47
|
+
getBacklogSummary?(): Promise<DeliveryBacklogSummary>;
|
|
40
48
|
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
41
49
|
/** @returns attempts sorted by attemptNumber ASC. */
|
|
42
50
|
getDeliveryAttempts(deliveryId: string): Promise<DeliveryAttemptRecord[]>;
|
|
@@ -1 +1 @@
|
|
|
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,OAAO,CAAC,MAAM,uBAAuB,EAAE,OAAO,MAAM,CAAC;AAErD,+DAA+D;AAC/D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,CAAC,uBAAuB,CAAC,EAAE,oBAAoB,CAAC;CAC1D,CAAC;AAEF,0FAA0F;AAC1F,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,4GAA4G;AAC5G,MAAM,WAAW,eAAgB,SAAQ,eAAe;IACtD,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC;;;OAGG;IACH,6BAA6B,CAC3B,EAAE,EAAE,kBAAkB,EACtB,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,8GAA8G;IAC9G,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,kBAAkB,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAE5E,sGAAsG;IACtG,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,uEAAuE;IACvE,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,qDAAqD;IACrD,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
|
+
{"version":3,"file":"webhook-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-delivery.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,15 +12,30 @@ export declare class WebhookDeliveryWorker implements OnModuleDestroy {
|
|
|
12
12
|
private readonly options;
|
|
13
13
|
private readonly logger;
|
|
14
14
|
private readonly batchSize;
|
|
15
|
+
private readonly maxConcurrency;
|
|
16
|
+
private readonly drainWhileBacklogged;
|
|
17
|
+
private readonly maxDrainLoopsPerPoll;
|
|
18
|
+
private readonly drainLoopDelayMs;
|
|
15
19
|
private readonly staleSendingMinutes;
|
|
20
|
+
private readonly activeDeliveryTasks;
|
|
16
21
|
private isShuttingDown;
|
|
17
22
|
private isPolling;
|
|
18
23
|
private activePollCycle;
|
|
19
24
|
private activeDeliveries;
|
|
20
25
|
constructor(deliveryRepo: WebhookDeliveryRepository, dispatcher: WebhookDispatcher, retryPolicy: WebhookRetryPolicy, circuitBreaker: WebhookCircuitBreaker, options: WebhookModuleOptions);
|
|
21
26
|
poll(): Promise<void>;
|
|
27
|
+
private sleep;
|
|
28
|
+
private waitForAvailableCapacity;
|
|
22
29
|
private runPollCycle;
|
|
30
|
+
private scheduleDelivery;
|
|
23
31
|
private processDelivery;
|
|
32
|
+
private positiveInteger;
|
|
33
|
+
private nonNegativeInteger;
|
|
34
|
+
private availableCapacity;
|
|
35
|
+
private createPollContext;
|
|
36
|
+
private createEmptyPollResult;
|
|
37
|
+
private notifyObserver;
|
|
38
|
+
private createDeliveryProcessingResult;
|
|
24
39
|
private updateCircuitBreakerAfterDelivery;
|
|
25
40
|
private fireDeliveryRetryScheduledHook;
|
|
26
41
|
private fireDeliveryFailedHook;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-worker.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAO5D,OAAO,
|
|
1
|
+
{"version":3,"file":"webhook.delivery-worker.d.ts","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAC7E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAO5D,OAAO,EAGL,oBAAoB,EAGrB,MAAM,wCAAwC,CAAC;AAEhD,OAAO,EAEL,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAc7C,qBACa,qBAAsB,YAAW,eAAe;IAkBzD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;IAtB1B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IACxC,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAU;IAC/C,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAS;IAC9C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAEhC;IACJ,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,gBAAgB,CAAK;gBAIV,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,qBAAqB,EAErC,OAAO,EAAE,oBAAoB;IAwB1C,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBb,KAAK;YAKL,wBAAwB;YAUxB,YAAY;IA+D1B,OAAO,CAAC,gBAAgB;YAmBV,eAAe;IA+J7B,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,kBAAkB;IAM1B,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,iBAAiB;IAWzB,OAAO,CAAC,qBAAqB;IAa7B,OAAO,CAAC,cAAc;IA8BtB,OAAO,CAAC,8BAA8B;YAwBxB,iCAAiC;IAkB/C,OAAO,CAAC,8BAA8B;IAgCtC,OAAO,CAAC,sBAAsB;IA8B9B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,qBAAqB;IAM7B,OAAO,CAAC,QAAQ;IAQV,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAqBvC"}
|
|
@@ -29,7 +29,12 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
29
29
|
options;
|
|
30
30
|
logger = new common_1.Logger(WebhookDeliveryWorker_1.name);
|
|
31
31
|
batchSize;
|
|
32
|
+
maxConcurrency;
|
|
33
|
+
drainWhileBacklogged;
|
|
34
|
+
maxDrainLoopsPerPoll;
|
|
35
|
+
drainLoopDelayMs;
|
|
32
36
|
staleSendingMinutes;
|
|
37
|
+
activeDeliveryTasks = new Set();
|
|
33
38
|
isShuttingDown = false;
|
|
34
39
|
isPolling = false;
|
|
35
40
|
activePollCycle = null;
|
|
@@ -40,7 +45,12 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
40
45
|
this.retryPolicy = retryPolicy;
|
|
41
46
|
this.circuitBreaker = circuitBreaker;
|
|
42
47
|
this.options = options;
|
|
43
|
-
this.batchSize = options.polling?.batchSize
|
|
48
|
+
this.batchSize = this.positiveInteger(options.polling?.batchSize, webhook_constants_1.DEFAULT_POLLING_BATCH_SIZE);
|
|
49
|
+
this.maxConcurrency = this.positiveInteger(options.polling?.maxConcurrency, this.batchSize);
|
|
50
|
+
this.drainWhileBacklogged =
|
|
51
|
+
options.polling?.drainWhileBacklogged ?? false;
|
|
52
|
+
this.maxDrainLoopsPerPoll = this.positiveInteger(options.polling?.maxDrainLoopsPerPoll, this.drainWhileBacklogged ? 10 : 1);
|
|
53
|
+
this.drainLoopDelayMs = this.nonNegativeInteger(options.polling?.drainLoopDelayMs, 0);
|
|
44
54
|
this.staleSendingMinutes =
|
|
45
55
|
options.polling?.staleSendingMinutes ?? webhook_constants_1.DEFAULT_STALE_SENDING_MINUTES;
|
|
46
56
|
}
|
|
@@ -62,23 +72,83 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
62
72
|
this.isPolling = false;
|
|
63
73
|
}
|
|
64
74
|
}
|
|
75
|
+
async sleep(ms) {
|
|
76
|
+
if (ms <= 0)
|
|
77
|
+
return;
|
|
78
|
+
await new Promise((resolve) => setTimeout(resolve, ms));
|
|
79
|
+
}
|
|
80
|
+
async waitForAvailableCapacity() {
|
|
81
|
+
while (!this.isShuttingDown &&
|
|
82
|
+
this.availableCapacity() <= 0 &&
|
|
83
|
+
this.activeDeliveryTasks.size > 0) {
|
|
84
|
+
await Promise.race(this.activeDeliveryTasks);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
65
87
|
async runPollCycle() {
|
|
88
|
+
const startedAt = Date.now();
|
|
89
|
+
const pollResult = this.createEmptyPollResult();
|
|
90
|
+
const pollTasks = [];
|
|
91
|
+
this.notifyObserver('onPollStart', this.createPollContext());
|
|
66
92
|
try {
|
|
67
93
|
await this.circuitBreaker.recoverEligibleEndpoints();
|
|
68
94
|
// Recover deliveries stuck in SENDING from crashed workers
|
|
69
95
|
const recovered = await this.deliveryRepo.recoverStaleSending(this.staleSendingMinutes);
|
|
96
|
+
pollResult.recoveredStale = recovered;
|
|
70
97
|
if (recovered > 0) {
|
|
71
98
|
this.logger.warn(`Recovered ${recovered} stale SENDING deliveries`);
|
|
72
99
|
}
|
|
73
|
-
const
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
100
|
+
const maxLoops = this.drainWhileBacklogged
|
|
101
|
+
? this.maxDrainLoopsPerPoll
|
|
102
|
+
: 1;
|
|
103
|
+
for (let loop = 0; loop < maxLoops && !this.isShuttingDown; loop++) {
|
|
104
|
+
if (loop > 0) {
|
|
105
|
+
await this.sleep(this.drainLoopDelayMs);
|
|
106
|
+
if (this.isShuttingDown)
|
|
107
|
+
break;
|
|
108
|
+
}
|
|
109
|
+
await this.waitForAvailableCapacity();
|
|
110
|
+
if (this.isShuttingDown)
|
|
111
|
+
break;
|
|
112
|
+
const claimSize = Math.min(this.batchSize, this.availableCapacity());
|
|
113
|
+
if (claimSize <= 0)
|
|
114
|
+
break;
|
|
115
|
+
const claimed = await this.deliveryRepo.claimPendingDeliveries(claimSize);
|
|
116
|
+
if (claimed.length === 0)
|
|
117
|
+
break;
|
|
118
|
+
pollResult.claimed += claimed.length;
|
|
119
|
+
pollResult.loops++;
|
|
120
|
+
const deliveries = await this.deliveryRepo.enrichDeliveries(claimed.map((d) => d.id));
|
|
121
|
+
pollResult.enriched += deliveries.length;
|
|
122
|
+
for (const delivery of deliveries) {
|
|
123
|
+
pollTasks.push(this.scheduleDelivery(delivery, pollResult));
|
|
124
|
+
}
|
|
125
|
+
if (!this.drainWhileBacklogged)
|
|
126
|
+
break;
|
|
127
|
+
}
|
|
128
|
+
await Promise.all(pollTasks);
|
|
78
129
|
}
|
|
79
130
|
catch (error) {
|
|
131
|
+
this.notifyObserver('onPollError', error);
|
|
80
132
|
this.logError('Poll cycle failed', error);
|
|
81
133
|
}
|
|
134
|
+
finally {
|
|
135
|
+
pollResult.durationMs = Date.now() - startedAt;
|
|
136
|
+
this.notifyObserver('onPollComplete', pollResult);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
scheduleDelivery(delivery, pollResult) {
|
|
140
|
+
const task = this.processDelivery(delivery).then((result) => {
|
|
141
|
+
if (result) {
|
|
142
|
+
pollResult[result.status]++;
|
|
143
|
+
this.notifyObserver('onDeliveryComplete', result);
|
|
144
|
+
}
|
|
145
|
+
return result;
|
|
146
|
+
});
|
|
147
|
+
this.activeDeliveryTasks.add(task);
|
|
148
|
+
task.finally(() => {
|
|
149
|
+
this.activeDeliveryTasks.delete(task);
|
|
150
|
+
});
|
|
151
|
+
return task;
|
|
82
152
|
}
|
|
83
153
|
async processDelivery(delivery) {
|
|
84
154
|
this.activeDeliveries++;
|
|
@@ -91,24 +161,30 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
91
161
|
const retryable = (0, webhook_retry_classifier_1.isRetryableDeliveryResult)(result);
|
|
92
162
|
if (result.success) {
|
|
93
163
|
await this.deliveryRepo.markSent(delivery.id, newAttempts, result);
|
|
164
|
+
await this.updateCircuitBreakerAfterDelivery(delivery, true);
|
|
165
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'sent', result);
|
|
94
166
|
}
|
|
95
167
|
else if (!retryable) {
|
|
96
168
|
await this.deliveryRepo.markFailed(delivery.id, newAttempts, result);
|
|
97
169
|
this.logger.warn(`Delivery ${delivery.id} failed with non-retryable HTTP status ${result.statusCode} (${newAttempts}/${delivery.maxAttempts})`);
|
|
98
170
|
this.fireDeliveryFailedHook(delivery, newAttempts, result.error ?? null, result.statusCode ?? null, this.classifyResultFailure(result));
|
|
171
|
+
await this.updateCircuitBreakerAfterDelivery(delivery, false);
|
|
172
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'failed', result, this.classifyResultFailure(result));
|
|
99
173
|
}
|
|
100
174
|
else if (newAttempts >= delivery.maxAttempts) {
|
|
101
175
|
await this.deliveryRepo.markFailed(delivery.id, newAttempts, result);
|
|
102
176
|
this.logger.warn(`Delivery ${delivery.id} exhausted retries (${newAttempts}/${delivery.maxAttempts})`);
|
|
103
177
|
this.fireDeliveryFailedHook(delivery, newAttempts, result.error ?? null, result.statusCode ?? null, this.classifyResultFailure(result));
|
|
178
|
+
await this.updateCircuitBreakerAfterDelivery(delivery, false);
|
|
179
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'failed', result, this.classifyResultFailure(result));
|
|
104
180
|
}
|
|
105
181
|
else {
|
|
106
182
|
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
107
183
|
await this.deliveryRepo.markRetry(delivery.id, newAttempts, nextAt, result);
|
|
108
184
|
this.fireDeliveryRetryScheduledHook(delivery, newAttempts, nextAt, result.error ?? null, result.statusCode ?? null, this.classifyResultFailure(result));
|
|
185
|
+
await this.updateCircuitBreakerAfterDelivery(delivery, false);
|
|
186
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'retried', result, this.classifyResultFailure(result), nextAt);
|
|
109
187
|
}
|
|
110
|
-
// Circuit breaker — failure here must NOT revert delivery state
|
|
111
|
-
await this.updateCircuitBreakerAfterDelivery(delivery, result.success);
|
|
112
188
|
}
|
|
113
189
|
catch (error) {
|
|
114
190
|
this.logError(`Delivery ${delivery.id} processing error`, error);
|
|
@@ -129,6 +205,7 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
129
205
|
if (dispatcherException) {
|
|
130
206
|
await this.updateCircuitBreakerAfterDelivery(delivery, false);
|
|
131
207
|
}
|
|
208
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'failed', errorResult, meta);
|
|
132
209
|
}
|
|
133
210
|
else {
|
|
134
211
|
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
@@ -137,16 +214,82 @@ let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorke
|
|
|
137
214
|
this.fireDeliveryRetryScheduledHook(delivery, newAttempts, nextAt, errorResult.error ?? null, null, meta);
|
|
138
215
|
await this.updateCircuitBreakerAfterDelivery(delivery, false);
|
|
139
216
|
}
|
|
217
|
+
return this.createDeliveryProcessingResult(delivery, newAttempts, 'retried', errorResult, meta, nextAt);
|
|
140
218
|
}
|
|
141
219
|
}
|
|
142
220
|
catch (fallbackError) {
|
|
143
221
|
this.logError(`Delivery ${delivery.id} fallback error handling failed`, fallbackError);
|
|
222
|
+
return null;
|
|
144
223
|
}
|
|
145
224
|
}
|
|
146
225
|
finally {
|
|
147
226
|
this.activeDeliveries--;
|
|
148
227
|
}
|
|
149
228
|
}
|
|
229
|
+
positiveInteger(value, fallback) {
|
|
230
|
+
return typeof value === 'number' && Number.isInteger(value) && value > 0
|
|
231
|
+
? value
|
|
232
|
+
: fallback;
|
|
233
|
+
}
|
|
234
|
+
nonNegativeInteger(value, fallback) {
|
|
235
|
+
return typeof value === 'number' && Number.isInteger(value) && value >= 0
|
|
236
|
+
? value
|
|
237
|
+
: fallback;
|
|
238
|
+
}
|
|
239
|
+
availableCapacity() {
|
|
240
|
+
return Math.max(0, this.maxConcurrency - this.activeDeliveryTasks.size);
|
|
241
|
+
}
|
|
242
|
+
createPollContext() {
|
|
243
|
+
return {
|
|
244
|
+
batchSize: this.batchSize,
|
|
245
|
+
maxConcurrency: this.maxConcurrency,
|
|
246
|
+
drainWhileBacklogged: this.drainWhileBacklogged,
|
|
247
|
+
maxDrainLoopsPerPoll: this.maxDrainLoopsPerPoll,
|
|
248
|
+
drainLoopDelayMs: this.drainLoopDelayMs,
|
|
249
|
+
activeDeliveries: this.activeDeliveries,
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
createEmptyPollResult() {
|
|
253
|
+
return {
|
|
254
|
+
claimed: 0,
|
|
255
|
+
enriched: 0,
|
|
256
|
+
sent: 0,
|
|
257
|
+
failed: 0,
|
|
258
|
+
retried: 0,
|
|
259
|
+
recoveredStale: 0,
|
|
260
|
+
durationMs: 0,
|
|
261
|
+
loops: 0,
|
|
262
|
+
};
|
|
263
|
+
}
|
|
264
|
+
notifyObserver(callbackName, payload) {
|
|
265
|
+
const callback = this.options.workerObserver?.[callbackName];
|
|
266
|
+
if (!callback)
|
|
267
|
+
return;
|
|
268
|
+
try {
|
|
269
|
+
void Promise.resolve(callback(payload)).catch((observerError) => {
|
|
270
|
+
this.logError(`workerObserver.${String(callbackName)} callback error`, observerError);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
catch (observerError) {
|
|
274
|
+
this.logError(`workerObserver.${String(callbackName)} callback error`, observerError);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
createDeliveryProcessingResult(delivery, attempts, status, result, meta = {}, nextAttemptAt) {
|
|
278
|
+
return {
|
|
279
|
+
deliveryId: delivery.id,
|
|
280
|
+
endpointId: delivery.endpointId,
|
|
281
|
+
eventId: delivery.eventId,
|
|
282
|
+
tenantId: delivery.tenantId,
|
|
283
|
+
attempts,
|
|
284
|
+
maxAttempts: delivery.maxAttempts,
|
|
285
|
+
status,
|
|
286
|
+
responseStatus: result.statusCode ?? null,
|
|
287
|
+
lastError: result.error ?? null,
|
|
288
|
+
latencyMs: result.latencyMs ?? null,
|
|
289
|
+
...(nextAttemptAt ? { nextAttemptAt } : {}),
|
|
290
|
+
...meta,
|
|
291
|
+
};
|
|
292
|
+
}
|
|
150
293
|
async updateCircuitBreakerAfterDelivery(delivery, success) {
|
|
151
294
|
try {
|
|
152
295
|
await this.circuitBreaker.afterDelivery(delivery.endpointId, success, { tenantId: delivery.tenantId, url: delivery.url });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"webhook.delivery-worker.js","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"webhook.delivery-worker.js","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nestarc/webhook",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.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",
|
|
@@ -77,6 +77,12 @@ CREATE TABLE IF NOT EXISTS webhook_deliveries (
|
|
|
77
77
|
|
|
78
78
|
CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_status_next
|
|
79
79
|
ON webhook_deliveries (status, next_attempt_at);
|
|
80
|
+
CREATE INDEX IF NOT EXISTS webhook_deliveries_runnable_pending_idx
|
|
81
|
+
ON webhook_deliveries (next_attempt_at, id)
|
|
82
|
+
WHERE status = 'PENDING';
|
|
83
|
+
CREATE INDEX IF NOT EXISTS webhook_deliveries_sending_claimed_idx
|
|
84
|
+
ON webhook_deliveries (claimed_at, id)
|
|
85
|
+
WHERE status = 'SENDING';
|
|
80
86
|
CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_endpoint_status
|
|
81
87
|
ON webhook_deliveries (endpoint_id, status);
|
|
82
88
|
CREATE INDEX IF NOT EXISTS idx_webhook_deliveries_event
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
-- @nestarc/webhook v0.12.0 - worker capacity diagnostics indexes
|
|
2
|
+
-- Adds partial indexes for high-volume delivery worker claim and stale recovery paths.
|
|
3
|
+
|
|
4
|
+
CREATE INDEX IF NOT EXISTS webhook_deliveries_runnable_pending_idx
|
|
5
|
+
ON webhook_deliveries (next_attempt_at, id)
|
|
6
|
+
WHERE status = 'PENDING';
|
|
7
|
+
|
|
8
|
+
CREATE INDEX IF NOT EXISTS webhook_deliveries_sending_claimed_idx
|
|
9
|
+
ON webhook_deliveries (claimed_at, id)
|
|
10
|
+
WHERE status = 'SENDING';
|