@nestarc/webhook 0.2.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/LICENSE +21 -0
- package/README.md +281 -0
- package/dist/adapters/fetch-http-client.d.ts +6 -0
- package/dist/adapters/fetch-http-client.d.ts.map +1 -0
- package/dist/adapters/fetch-http-client.js +56 -0
- package/dist/adapters/fetch-http-client.js.map +1 -0
- package/dist/adapters/prisma-delivery.repository.d.ts +18 -0
- package/dist/adapters/prisma-delivery.repository.d.ts.map +1 -0
- package/dist/adapters/prisma-delivery.repository.js +162 -0
- package/dist/adapters/prisma-delivery.repository.js.map +1 -0
- package/dist/adapters/prisma-endpoint.repository.d.ts +18 -0
- package/dist/adapters/prisma-endpoint.repository.d.ts.map +1 -0
- package/dist/adapters/prisma-endpoint.repository.js +157 -0
- package/dist/adapters/prisma-endpoint.repository.js.map +1 -0
- package/dist/adapters/prisma-event.repository.d.ts +8 -0
- package/dist/adapters/prisma-event.repository.d.ts.map +1 -0
- package/dist/adapters/prisma-event.repository.js +39 -0
- package/dist/adapters/prisma-event.repository.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +57 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/webhook-delivery.interface.d.ts +39 -0
- package/dist/interfaces/webhook-delivery.interface.d.ts.map +1 -0
- package/dist/interfaces/webhook-delivery.interface.js +3 -0
- package/dist/interfaces/webhook-delivery.interface.js.map +1 -0
- package/dist/interfaces/webhook-endpoint.interface.d.ts +34 -0
- package/dist/interfaces/webhook-endpoint.interface.d.ts.map +1 -0
- package/dist/interfaces/webhook-endpoint.interface.js +3 -0
- package/dist/interfaces/webhook-endpoint.interface.js.map +1 -0
- package/dist/interfaces/webhook-options.interface.d.ts +45 -0
- package/dist/interfaces/webhook-options.interface.d.ts.map +1 -0
- package/dist/interfaces/webhook-options.interface.js +3 -0
- package/dist/interfaces/webhook-options.interface.js.map +1 -0
- package/dist/ports/webhook-delivery.repository.d.ts +26 -0
- package/dist/ports/webhook-delivery.repository.d.ts.map +1 -0
- package/dist/ports/webhook-delivery.repository.js +3 -0
- package/dist/ports/webhook-delivery.repository.js.map +1 -0
- package/dist/ports/webhook-endpoint.repository.d.ts +15 -0
- package/dist/ports/webhook-endpoint.repository.d.ts.map +1 -0
- package/dist/ports/webhook-endpoint.repository.js +3 -0
- package/dist/ports/webhook-endpoint.repository.js.map +1 -0
- package/dist/ports/webhook-event.repository.d.ts +5 -0
- package/dist/ports/webhook-event.repository.d.ts.map +1 -0
- package/dist/ports/webhook-event.repository.js +3 -0
- package/dist/ports/webhook-event.repository.js.map +1 -0
- package/dist/ports/webhook-http-client.d.ts +5 -0
- package/dist/ports/webhook-http-client.d.ts.map +1 -0
- package/dist/ports/webhook-http-client.js +3 -0
- package/dist/ports/webhook-http-client.js.map +1 -0
- package/dist/webhook.admin.service.d.ts +22 -0
- package/dist/webhook.admin.service.d.ts.map +1 -0
- package/dist/webhook.admin.service.js +58 -0
- package/dist/webhook.admin.service.js.map +1 -0
- package/dist/webhook.circuit-breaker.d.ts +12 -0
- package/dist/webhook.circuit-breaker.d.ts.map +1 -0
- package/dist/webhook.circuit-breaker.js +58 -0
- package/dist/webhook.circuit-breaker.js.map +1 -0
- package/dist/webhook.constants.d.ts +17 -0
- package/dist/webhook.constants.d.ts.map +1 -0
- package/dist/webhook.constants.js +26 -0
- package/dist/webhook.constants.js.map +1 -0
- package/dist/webhook.delivery-admin.service.d.ts +9 -0
- package/dist/webhook.delivery-admin.service.d.ts.map +1 -0
- package/dist/webhook.delivery-admin.service.js +36 -0
- package/dist/webhook.delivery-admin.service.js.map +1 -0
- package/dist/webhook.delivery-worker.d.ts +23 -0
- package/dist/webhook.delivery-worker.d.ts.map +1 -0
- package/dist/webhook.delivery-worker.js +141 -0
- package/dist/webhook.delivery-worker.js.map +1 -0
- package/dist/webhook.dispatcher.d.ts +14 -0
- package/dist/webhook.dispatcher.d.ts.map +1 -0
- package/dist/webhook.dispatcher.js +54 -0
- package/dist/webhook.dispatcher.js.map +1 -0
- package/dist/webhook.endpoint-admin.service.d.ts +23 -0
- package/dist/webhook.endpoint-admin.service.d.ts.map +1 -0
- package/dist/webhook.endpoint-admin.service.js +97 -0
- package/dist/webhook.endpoint-admin.service.js.map +1 -0
- package/dist/webhook.event.d.ts +6 -0
- package/dist/webhook.event.d.ts.map +1 -0
- package/dist/webhook.event.js +22 -0
- package/dist/webhook.event.js.map +1 -0
- package/dist/webhook.module.d.ts +15 -0
- package/dist/webhook.module.d.ts.map +1 -0
- package/dist/webhook.module.js +176 -0
- package/dist/webhook.module.js.map +1 -0
- package/dist/webhook.retry-policy.d.ts +7 -0
- package/dist/webhook.retry-policy.d.ts.map +1 -0
- package/dist/webhook.retry-policy.js +38 -0
- package/dist/webhook.retry-policy.js.map +1 -0
- package/dist/webhook.service.d.ts +17 -0
- package/dist/webhook.service.d.ts.map +1 -0
- package/dist/webhook.service.js +63 -0
- package/dist/webhook.service.js.map +1 -0
- package/dist/webhook.signer.d.ts +12 -0
- package/dist/webhook.signer.d.ts.map +1 -0
- package/dist/webhook.signer.js +75 -0
- package/dist/webhook.signer.js.map +1 -0
- package/dist/webhook.url-validator.d.ts +3 -0
- package/dist/webhook.url-validator.d.ts.map +1 -0
- package/dist/webhook.url-validator.js +156 -0
- package/dist/webhook.url-validator.js.map +1 -0
- package/package.json +61 -0
- package/src/sql/create-webhook-tables.sql +72 -0
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { WebhookEndpointAdminService } from './webhook.endpoint-admin.service';
|
|
2
|
+
import { WebhookDeliveryAdminService } from './webhook.delivery-admin.service';
|
|
3
|
+
import { CreateEndpointDto, EndpointRecord, EndpointRecordWithSecret, UpdateEndpointDto } from './interfaces/webhook-endpoint.interface';
|
|
4
|
+
import { DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
5
|
+
/**
|
|
6
|
+
* @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService directly.
|
|
7
|
+
* This facade will be removed in v0.3.0.
|
|
8
|
+
*/
|
|
9
|
+
export declare class WebhookAdminService {
|
|
10
|
+
private readonly endpoints;
|
|
11
|
+
private readonly deliveries;
|
|
12
|
+
constructor(endpoints: WebhookEndpointAdminService, deliveries: WebhookDeliveryAdminService);
|
|
13
|
+
createEndpoint(dto: CreateEndpointDto): Promise<EndpointRecordWithSecret>;
|
|
14
|
+
listEndpoints(tenantId?: string): Promise<EndpointRecord[]>;
|
|
15
|
+
getEndpoint(endpointId: string): Promise<EndpointRecord | null>;
|
|
16
|
+
updateEndpoint(endpointId: string, dto: UpdateEndpointDto): Promise<EndpointRecord | null>;
|
|
17
|
+
deleteEndpoint(endpointId: string): Promise<boolean>;
|
|
18
|
+
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
19
|
+
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
20
|
+
sendTestEvent(endpointId: string): Promise<string | null>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=webhook.admin.service.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.WebhookAdminService = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const webhook_endpoint_admin_service_1 = require("./webhook.endpoint-admin.service");
|
|
15
|
+
const webhook_delivery_admin_service_1 = require("./webhook.delivery-admin.service");
|
|
16
|
+
/**
|
|
17
|
+
* @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService directly.
|
|
18
|
+
* This facade will be removed in v0.3.0.
|
|
19
|
+
*/
|
|
20
|
+
let WebhookAdminService = class WebhookAdminService {
|
|
21
|
+
endpoints;
|
|
22
|
+
deliveries;
|
|
23
|
+
constructor(endpoints, deliveries) {
|
|
24
|
+
this.endpoints = endpoints;
|
|
25
|
+
this.deliveries = deliveries;
|
|
26
|
+
}
|
|
27
|
+
async createEndpoint(dto) {
|
|
28
|
+
return this.endpoints.createEndpoint(dto);
|
|
29
|
+
}
|
|
30
|
+
async listEndpoints(tenantId) {
|
|
31
|
+
return this.endpoints.listEndpoints(tenantId);
|
|
32
|
+
}
|
|
33
|
+
async getEndpoint(endpointId) {
|
|
34
|
+
return this.endpoints.getEndpoint(endpointId);
|
|
35
|
+
}
|
|
36
|
+
async updateEndpoint(endpointId, dto) {
|
|
37
|
+
return this.endpoints.updateEndpoint(endpointId, dto);
|
|
38
|
+
}
|
|
39
|
+
async deleteEndpoint(endpointId) {
|
|
40
|
+
return this.endpoints.deleteEndpoint(endpointId);
|
|
41
|
+
}
|
|
42
|
+
async getDeliveryLogs(endpointId, filters) {
|
|
43
|
+
return this.deliveries.getDeliveryLogs(endpointId, filters);
|
|
44
|
+
}
|
|
45
|
+
async retryDelivery(deliveryId) {
|
|
46
|
+
return this.deliveries.retryDelivery(deliveryId);
|
|
47
|
+
}
|
|
48
|
+
async sendTestEvent(endpointId) {
|
|
49
|
+
return this.endpoints.sendTestEvent(endpointId);
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
exports.WebhookAdminService = WebhookAdminService;
|
|
53
|
+
exports.WebhookAdminService = WebhookAdminService = __decorate([
|
|
54
|
+
(0, common_1.Injectable)(),
|
|
55
|
+
__metadata("design:paramtypes", [webhook_endpoint_admin_service_1.WebhookEndpointAdminService,
|
|
56
|
+
webhook_delivery_admin_service_1.WebhookDeliveryAdminService])
|
|
57
|
+
], WebhookAdminService);
|
|
58
|
+
//# sourceMappingURL=webhook.admin.service.js.map
|
|
@@ -0,0 +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;AAY/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,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;AA3CY,kDAAmB;8BAAnB,mBAAmB;IAD/B,IAAA,mBAAU,GAAE;qCAGmB,4DAA2B;QAC1B,4DAA2B;GAH/C,mBAAmB,CA2C/B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
2
|
+
import { WebhookEndpointRepository } from './ports/webhook-endpoint.repository';
|
|
3
|
+
export declare class WebhookCircuitBreaker {
|
|
4
|
+
private readonly endpointRepo;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly failureThreshold;
|
|
7
|
+
private readonly cooldownMinutes;
|
|
8
|
+
constructor(endpointRepo: WebhookEndpointRepository, options: WebhookModuleOptions);
|
|
9
|
+
afterDelivery(endpointId: string, success: boolean): Promise<void>;
|
|
10
|
+
recoverEligibleEndpoints(): Promise<number>;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=webhook.circuit-breaker.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.circuit-breaker.d.ts","sourceRoot":"","sources":["../src/webhook.circuit-breaker.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,qBACa,qBAAqB;IAO9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAN/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;gBAItB,YAAY,EAAE,yBAAyB,EAExD,OAAO,EAAE,oBAAoB;IAQzB,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBlE,wBAAwB,IAAI,OAAO,CAAC,MAAM,CAAC;CASlD"}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var WebhookCircuitBreaker_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WebhookCircuitBreaker = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
19
|
+
let WebhookCircuitBreaker = WebhookCircuitBreaker_1 = class WebhookCircuitBreaker {
|
|
20
|
+
endpointRepo;
|
|
21
|
+
logger = new common_1.Logger(WebhookCircuitBreaker_1.name);
|
|
22
|
+
failureThreshold;
|
|
23
|
+
cooldownMinutes;
|
|
24
|
+
constructor(endpointRepo, options) {
|
|
25
|
+
this.endpointRepo = endpointRepo;
|
|
26
|
+
this.failureThreshold =
|
|
27
|
+
options.circuitBreaker?.failureThreshold ?? webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_THRESHOLD;
|
|
28
|
+
this.cooldownMinutes =
|
|
29
|
+
options.circuitBreaker?.cooldownMinutes ?? webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES;
|
|
30
|
+
}
|
|
31
|
+
async afterDelivery(endpointId, success) {
|
|
32
|
+
if (success) {
|
|
33
|
+
await this.endpointRepo.resetFailures(endpointId);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
const failures = await this.endpointRepo.incrementFailures(endpointId);
|
|
37
|
+
if (failures >= this.failureThreshold) {
|
|
38
|
+
await this.endpointRepo.disableEndpoint(endpointId, 'consecutive_failures_exceeded');
|
|
39
|
+
this.logger.warn(`Endpoint ${endpointId} disabled: consecutive_failures_exceeded (threshold=${this.failureThreshold})`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
async recoverEligibleEndpoints() {
|
|
44
|
+
const count = await this.endpointRepo.recoverEligibleEndpoints(this.cooldownMinutes);
|
|
45
|
+
if (count > 0) {
|
|
46
|
+
this.logger.log(`Recovered ${count} endpoint(s) after cooldown`);
|
|
47
|
+
}
|
|
48
|
+
return count;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.WebhookCircuitBreaker = WebhookCircuitBreaker;
|
|
52
|
+
exports.WebhookCircuitBreaker = WebhookCircuitBreaker = WebhookCircuitBreaker_1 = __decorate([
|
|
53
|
+
(0, common_1.Injectable)(),
|
|
54
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY)),
|
|
55
|
+
__param(1, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
56
|
+
__metadata("design:paramtypes", [Object, Object])
|
|
57
|
+
], WebhookCircuitBreaker);
|
|
58
|
+
//# sourceMappingURL=webhook.circuit-breaker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.circuit-breaker.js","sourceRoot":"","sources":["../src/webhook.circuit-breaker.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAC5D,2DAK6B;AAKtB,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAOb;IANF,MAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAChD,gBAAgB,CAAS;IACzB,eAAe,CAAS;IAEzC,YAEmB,YAAuC,EAExD,OAA6B;QAFZ,iBAAY,GAAZ,YAAY,CAA2B;QAIxD,IAAI,CAAC,gBAAgB;YACnB,OAAO,CAAC,cAAc,EAAE,gBAAgB,IAAI,qDAAiC,CAAC;QAChF,IAAI,CAAC,eAAe;YAClB,OAAO,CAAC,cAAc,EAAE,eAAe,IAAI,4DAAwC,CAAC;IACxF,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB,EAAE,OAAgB;QACtD,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;QACpD,CAAC;aAAM,CAAC;YACN,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;YACvE,IAAI,QAAQ,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBACtC,MAAM,IAAI,CAAC,YAAY,CAAC,eAAe,CACrC,UAAU,EACV,+BAA+B,CAChC,CAAC;gBACF,IAAI,CAAC,MAAM,CAAC,IAAI,CACd,YAAY,UAAU,uDAAuD,IAAI,CAAC,gBAAgB,GAAG,CACtG,CAAC;YACJ,CAAC;QACH,CAAC;IACH,CAAC;IAED,KAAK,CAAC,wBAAwB;QAC5B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,wBAAwB,CAC5D,IAAI,CAAC,eAAe,CACrB,CAAC;QACF,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,KAAK,6BAA6B,CAAC,CAAC;QACnE,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF,CAAA;AA3CY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;IAOR,WAAA,IAAA,eAAM,EAAC,+CAA2B,CAAC,CAAA;IAEnC,WAAA,IAAA,eAAM,EAAC,0CAAsB,CAAC,CAAA;;GARtB,qBAAqB,CA2CjC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export declare const WEBHOOK_MODULE_OPTIONS = "WEBHOOK_MODULE_OPTIONS";
|
|
2
|
+
export declare const WEBHOOK_EVENT_REPOSITORY = "WEBHOOK_EVENT_REPOSITORY";
|
|
3
|
+
export declare const WEBHOOK_ENDPOINT_REPOSITORY = "WEBHOOK_ENDPOINT_REPOSITORY";
|
|
4
|
+
export declare const WEBHOOK_DELIVERY_REPOSITORY = "WEBHOOK_DELIVERY_REPOSITORY";
|
|
5
|
+
export declare const WEBHOOK_HTTP_CLIENT = "WEBHOOK_HTTP_CLIENT";
|
|
6
|
+
/** Svix/Stripe-style exponential backoff schedule (seconds) */
|
|
7
|
+
export declare const DEFAULT_BACKOFF_SCHEDULE: number[];
|
|
8
|
+
export declare const DEFAULT_DELIVERY_TIMEOUT = 10000;
|
|
9
|
+
export declare const DEFAULT_MAX_RETRIES = 5;
|
|
10
|
+
export declare const DEFAULT_JITTER_FACTOR = 0.1;
|
|
11
|
+
export declare const DEFAULT_CIRCUIT_BREAKER_THRESHOLD = 5;
|
|
12
|
+
export declare const DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = 60;
|
|
13
|
+
export declare const DEFAULT_POLLING_INTERVAL = 5000;
|
|
14
|
+
export declare const DEFAULT_POLLING_BATCH_SIZE = 50;
|
|
15
|
+
export declare const DEFAULT_STALE_SENDING_MINUTES = 5;
|
|
16
|
+
export declare const RESPONSE_BODY_MAX_LENGTH = 1024;
|
|
17
|
+
//# sourceMappingURL=webhook.constants.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.constants.d.ts","sourceRoot":"","sources":["../src/webhook.constants.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sBAAsB,2BAA2B,CAAC;AAE/D,eAAO,MAAM,wBAAwB,6BAA6B,CAAC;AACnE,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,2BAA2B,gCAAgC,CAAC;AACzE,eAAO,MAAM,mBAAmB,wBAAwB,CAAC;AAEzD,+DAA+D;AAC/D,eAAO,MAAM,wBAAwB,UAMpC,CAAC;AAEF,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,mBAAmB,IAAI,CAAC;AACrC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AAEzC,eAAO,MAAM,iCAAiC,IAAI,CAAC;AACnD,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAE3D,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,eAAO,MAAM,0BAA0B,KAAK,CAAC;AAC7C,eAAO,MAAM,6BAA6B,IAAI,CAAC;AAE/C,eAAO,MAAM,wBAAwB,OAAO,CAAC"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.RESPONSE_BODY_MAX_LENGTH = exports.DEFAULT_STALE_SENDING_MINUTES = exports.DEFAULT_POLLING_BATCH_SIZE = exports.DEFAULT_POLLING_INTERVAL = exports.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_THRESHOLD = exports.DEFAULT_JITTER_FACTOR = 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 = void 0;
|
|
4
|
+
exports.WEBHOOK_MODULE_OPTIONS = 'WEBHOOK_MODULE_OPTIONS';
|
|
5
|
+
exports.WEBHOOK_EVENT_REPOSITORY = 'WEBHOOK_EVENT_REPOSITORY';
|
|
6
|
+
exports.WEBHOOK_ENDPOINT_REPOSITORY = 'WEBHOOK_ENDPOINT_REPOSITORY';
|
|
7
|
+
exports.WEBHOOK_DELIVERY_REPOSITORY = 'WEBHOOK_DELIVERY_REPOSITORY';
|
|
8
|
+
exports.WEBHOOK_HTTP_CLIENT = 'WEBHOOK_HTTP_CLIENT';
|
|
9
|
+
/** Svix/Stripe-style exponential backoff schedule (seconds) */
|
|
10
|
+
exports.DEFAULT_BACKOFF_SCHEDULE = [
|
|
11
|
+
30, // 30 seconds
|
|
12
|
+
300, // 5 minutes
|
|
13
|
+
1800, // 30 minutes
|
|
14
|
+
7200, // 2 hours
|
|
15
|
+
86400, // 24 hours
|
|
16
|
+
];
|
|
17
|
+
exports.DEFAULT_DELIVERY_TIMEOUT = 10_000;
|
|
18
|
+
exports.DEFAULT_MAX_RETRIES = 5;
|
|
19
|
+
exports.DEFAULT_JITTER_FACTOR = 0.1;
|
|
20
|
+
exports.DEFAULT_CIRCUIT_BREAKER_THRESHOLD = 5;
|
|
21
|
+
exports.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = 60;
|
|
22
|
+
exports.DEFAULT_POLLING_INTERVAL = 5_000;
|
|
23
|
+
exports.DEFAULT_POLLING_BATCH_SIZE = 50;
|
|
24
|
+
exports.DEFAULT_STALE_SENDING_MINUTES = 5;
|
|
25
|
+
exports.RESPONSE_BODY_MAX_LENGTH = 1024;
|
|
26
|
+
//# sourceMappingURL=webhook.constants.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.constants.js","sourceRoot":"","sources":["../src/webhook.constants.ts"],"names":[],"mappings":";;;AAAa,QAAA,sBAAsB,GAAG,wBAAwB,CAAC;AAElD,QAAA,wBAAwB,GAAG,0BAA0B,CAAC;AACtD,QAAA,2BAA2B,GAAG,6BAA6B,CAAC;AAC5D,QAAA,2BAA2B,GAAG,6BAA6B,CAAC;AAC5D,QAAA,mBAAmB,GAAG,qBAAqB,CAAC;AAEzD,+DAA+D;AAClD,QAAA,wBAAwB,GAAG;IACtC,EAAE,EAAM,aAAa;IACrB,GAAG,EAAK,YAAY;IACpB,IAAI,EAAI,aAAa;IACrB,IAAI,EAAI,UAAU;IAClB,KAAK,EAAG,WAAW;CACpB,CAAC;AAEW,QAAA,wBAAwB,GAAG,MAAM,CAAC;AAClC,QAAA,mBAAmB,GAAG,CAAC,CAAC;AACxB,QAAA,qBAAqB,GAAG,GAAG,CAAC;AAE5B,QAAA,iCAAiC,GAAG,CAAC,CAAC;AACtC,QAAA,wCAAwC,GAAG,EAAE,CAAC;AAE9C,QAAA,wBAAwB,GAAG,KAAK,CAAC;AACjC,QAAA,0BAA0B,GAAG,EAAE,CAAC;AAChC,QAAA,6BAA6B,GAAG,CAAC,CAAC;AAElC,QAAA,wBAAwB,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { WebhookDeliveryRepository } from './ports/webhook-delivery.repository';
|
|
2
|
+
import { DeliveryLogFilters, DeliveryRecord } from './interfaces/webhook-delivery.interface';
|
|
3
|
+
export declare class WebhookDeliveryAdminService {
|
|
4
|
+
private readonly deliveryRepo;
|
|
5
|
+
constructor(deliveryRepo: WebhookDeliveryRepository);
|
|
6
|
+
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
7
|
+
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=webhook.delivery-admin.service.d.ts.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.WebhookDeliveryAdminService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
18
|
+
let WebhookDeliveryAdminService = class WebhookDeliveryAdminService {
|
|
19
|
+
deliveryRepo;
|
|
20
|
+
constructor(deliveryRepo) {
|
|
21
|
+
this.deliveryRepo = deliveryRepo;
|
|
22
|
+
}
|
|
23
|
+
async getDeliveryLogs(endpointId, filters) {
|
|
24
|
+
return this.deliveryRepo.getDeliveryLogs(endpointId, filters);
|
|
25
|
+
}
|
|
26
|
+
async retryDelivery(deliveryId) {
|
|
27
|
+
return this.deliveryRepo.retryDelivery(deliveryId);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.WebhookDeliveryAdminService = WebhookDeliveryAdminService;
|
|
31
|
+
exports.WebhookDeliveryAdminService = WebhookDeliveryAdminService = __decorate([
|
|
32
|
+
(0, common_1.Injectable)(),
|
|
33
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY)),
|
|
34
|
+
__metadata("design:paramtypes", [Object])
|
|
35
|
+
], WebhookDeliveryAdminService);
|
|
36
|
+
//# sourceMappingURL=webhook.delivery-admin.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.delivery-admin.service.js","sourceRoot":"","sources":["../src/webhook.delivery-admin.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAAkE;AAQ3D,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,aAAa,CAAC,UAAkB;QACpC,OAAO,IAAI,CAAC,YAAY,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAhBY,kEAA2B;sCAA3B,2BAA2B;IADvC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,+CAA2B,CAAC,CAAA;;GAF3B,2BAA2B,CAgBvC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { WebhookCircuitBreaker } from './webhook.circuit-breaker';
|
|
3
|
+
import { WebhookDispatcher } from './webhook.dispatcher';
|
|
4
|
+
import { WebhookRetryPolicy } from './webhook.retry-policy';
|
|
5
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
6
|
+
import { WebhookDeliveryRepository } from './ports/webhook-delivery.repository';
|
|
7
|
+
export declare class WebhookDeliveryWorker implements OnModuleDestroy {
|
|
8
|
+
private readonly deliveryRepo;
|
|
9
|
+
private readonly dispatcher;
|
|
10
|
+
private readonly retryPolicy;
|
|
11
|
+
private readonly circuitBreaker;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private readonly batchSize;
|
|
14
|
+
private readonly staleSendingMinutes;
|
|
15
|
+
private isShuttingDown;
|
|
16
|
+
private isPolling;
|
|
17
|
+
private activeDeliveries;
|
|
18
|
+
constructor(deliveryRepo: WebhookDeliveryRepository, dispatcher: WebhookDispatcher, retryPolicy: WebhookRetryPolicy, circuitBreaker: WebhookCircuitBreaker, options: WebhookModuleOptions);
|
|
19
|
+
poll(): Promise<void>;
|
|
20
|
+
private processDelivery;
|
|
21
|
+
onModuleDestroy(): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=webhook.delivery-worker.d.ts.map
|
|
@@ -0,0 +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,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAEL,yBAAyB,EAC1B,MAAM,qCAAqC,CAAC;AAE7C,qBACa,qBAAsB,YAAW,eAAe;IAUzD,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAZjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA0C;IACjE,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAS;IAC7C,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAK;gBAIV,YAAY,EAAE,yBAAyB,EACvC,UAAU,EAAE,iBAAiB,EAC7B,WAAW,EAAE,kBAAkB,EAC/B,cAAc,EAAE,qBAAqB,EAEtD,OAAO,EAAE,oBAAoB;IAOzB,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAmCb,eAAe;IAiEvB,eAAe,IAAI,OAAO,CAAC,IAAI,CAAC;CAevC"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
var WebhookDeliveryWorker_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WebhookDeliveryWorker = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const webhook_circuit_breaker_1 = require("./webhook.circuit-breaker");
|
|
19
|
+
const webhook_dispatcher_1 = require("./webhook.dispatcher");
|
|
20
|
+
const webhook_retry_policy_1 = require("./webhook.retry-policy");
|
|
21
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
22
|
+
let WebhookDeliveryWorker = WebhookDeliveryWorker_1 = class WebhookDeliveryWorker {
|
|
23
|
+
deliveryRepo;
|
|
24
|
+
dispatcher;
|
|
25
|
+
retryPolicy;
|
|
26
|
+
circuitBreaker;
|
|
27
|
+
logger = new common_1.Logger(WebhookDeliveryWorker_1.name);
|
|
28
|
+
batchSize;
|
|
29
|
+
staleSendingMinutes;
|
|
30
|
+
isShuttingDown = false;
|
|
31
|
+
isPolling = false;
|
|
32
|
+
activeDeliveries = 0;
|
|
33
|
+
constructor(deliveryRepo, dispatcher, retryPolicy, circuitBreaker, options) {
|
|
34
|
+
this.deliveryRepo = deliveryRepo;
|
|
35
|
+
this.dispatcher = dispatcher;
|
|
36
|
+
this.retryPolicy = retryPolicy;
|
|
37
|
+
this.circuitBreaker = circuitBreaker;
|
|
38
|
+
this.batchSize = options.polling?.batchSize ?? webhook_constants_1.DEFAULT_POLLING_BATCH_SIZE;
|
|
39
|
+
this.staleSendingMinutes =
|
|
40
|
+
options.polling?.staleSendingMinutes ?? webhook_constants_1.DEFAULT_STALE_SENDING_MINUTES;
|
|
41
|
+
}
|
|
42
|
+
async poll() {
|
|
43
|
+
if (this.isShuttingDown)
|
|
44
|
+
return;
|
|
45
|
+
if (this.isPolling)
|
|
46
|
+
return;
|
|
47
|
+
this.isPolling = true;
|
|
48
|
+
try {
|
|
49
|
+
await this.circuitBreaker.recoverEligibleEndpoints();
|
|
50
|
+
// Recover deliveries stuck in SENDING from crashed workers
|
|
51
|
+
const recovered = await this.deliveryRepo.recoverStaleSending(this.staleSendingMinutes);
|
|
52
|
+
if (recovered > 0) {
|
|
53
|
+
this.logger.warn(`Recovered ${recovered} stale SENDING deliveries`);
|
|
54
|
+
}
|
|
55
|
+
const claimed = await this.deliveryRepo.claimPendingDeliveries(this.batchSize);
|
|
56
|
+
if (claimed.length === 0)
|
|
57
|
+
return;
|
|
58
|
+
const deliveries = await this.deliveryRepo.enrichDeliveries(claimed.map((d) => d.id));
|
|
59
|
+
await Promise.all(deliveries.map((delivery) => this.processDelivery(delivery)));
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
this.logger.error(`Poll cycle failed: ${error}`);
|
|
63
|
+
}
|
|
64
|
+
finally {
|
|
65
|
+
this.isPolling = false;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async processDelivery(delivery) {
|
|
69
|
+
this.activeDeliveries++;
|
|
70
|
+
try {
|
|
71
|
+
const result = await this.dispatcher.dispatch(delivery);
|
|
72
|
+
const newAttempts = delivery.attempts + 1;
|
|
73
|
+
// Persist delivery state — if this fails, catch resets to PENDING (safe)
|
|
74
|
+
if (result.success) {
|
|
75
|
+
await this.deliveryRepo.markSent(delivery.id, newAttempts, result);
|
|
76
|
+
}
|
|
77
|
+
else if (newAttempts >= delivery.max_attempts) {
|
|
78
|
+
await this.deliveryRepo.markFailed(delivery.id, newAttempts, result);
|
|
79
|
+
this.logger.warn(`Delivery ${delivery.id} exhausted retries (${newAttempts}/${delivery.max_attempts})`);
|
|
80
|
+
}
|
|
81
|
+
else {
|
|
82
|
+
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
83
|
+
await this.deliveryRepo.markRetry(delivery.id, newAttempts, nextAt, result);
|
|
84
|
+
}
|
|
85
|
+
// Circuit breaker — failure here must NOT revert delivery state
|
|
86
|
+
try {
|
|
87
|
+
await this.circuitBreaker.afterDelivery(delivery.endpoint_id, result.success);
|
|
88
|
+
}
|
|
89
|
+
catch (cbError) {
|
|
90
|
+
this.logger.error(`Circuit breaker update failed for ${delivery.endpoint_id}: ${cbError}`);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
this.logger.error(`Delivery ${delivery.id} processing error: ${error}`);
|
|
95
|
+
// Increment attempts and apply backoff — never reset without accounting
|
|
96
|
+
try {
|
|
97
|
+
const newAttempts = delivery.attempts + 1;
|
|
98
|
+
const errorResult = {
|
|
99
|
+
success: false,
|
|
100
|
+
latencyMs: 0,
|
|
101
|
+
error: error instanceof Error ? error.message : String(error),
|
|
102
|
+
};
|
|
103
|
+
if (newAttempts >= delivery.max_attempts) {
|
|
104
|
+
await this.deliveryRepo.markFailed(delivery.id, newAttempts, errorResult);
|
|
105
|
+
this.logger.warn(`Delivery ${delivery.id} exhausted retries on exception (${newAttempts}/${delivery.max_attempts})`);
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
const nextAt = this.retryPolicy.nextAttemptAt(newAttempts);
|
|
109
|
+
await this.deliveryRepo.markRetry(delivery.id, newAttempts, nextAt, errorResult);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
catch (fallbackError) {
|
|
113
|
+
this.logger.error(`Delivery ${delivery.id} fallback error handling failed: ${fallbackError}`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
this.activeDeliveries--;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
async onModuleDestroy() {
|
|
121
|
+
this.isShuttingDown = true;
|
|
122
|
+
this.logger.log('Shutting down delivery worker...');
|
|
123
|
+
const deadline = Date.now() + 30_000;
|
|
124
|
+
while (this.activeDeliveries > 0 && Date.now() < deadline) {
|
|
125
|
+
await new Promise((resolve) => setTimeout(resolve, 100));
|
|
126
|
+
}
|
|
127
|
+
if (this.activeDeliveries > 0) {
|
|
128
|
+
this.logger.warn(`Shutdown with ${this.activeDeliveries} active deliveries`);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
};
|
|
132
|
+
exports.WebhookDeliveryWorker = WebhookDeliveryWorker;
|
|
133
|
+
exports.WebhookDeliveryWorker = WebhookDeliveryWorker = WebhookDeliveryWorker_1 = __decorate([
|
|
134
|
+
(0, common_1.Injectable)(),
|
|
135
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY)),
|
|
136
|
+
__param(4, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
137
|
+
__metadata("design:paramtypes", [Object, webhook_dispatcher_1.WebhookDispatcher,
|
|
138
|
+
webhook_retry_policy_1.WebhookRetryPolicy,
|
|
139
|
+
webhook_circuit_breaker_1.WebhookCircuitBreaker, Object])
|
|
140
|
+
], WebhookDeliveryWorker);
|
|
141
|
+
//# sourceMappingURL=webhook.delivery-worker.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.delivery-worker.js","sourceRoot":"","sources":["../src/webhook.delivery-worker.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { WebhookSigner } from './webhook.signer';
|
|
2
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
3
|
+
import { WebhookHttpClient } from './ports/webhook-http-client';
|
|
4
|
+
import { DeliveryResult } from './interfaces/webhook-delivery.interface';
|
|
5
|
+
import { PendingDelivery } from './ports/webhook-delivery.repository';
|
|
6
|
+
export declare class WebhookDispatcher {
|
|
7
|
+
private readonly signer;
|
|
8
|
+
private readonly httpClient;
|
|
9
|
+
private readonly timeout;
|
|
10
|
+
private readonly allowPrivateUrls;
|
|
11
|
+
constructor(signer: WebhookSigner, httpClient: WebhookHttpClient, options: WebhookModuleOptions);
|
|
12
|
+
dispatch(delivery: PendingDelivery): Promise<DeliveryResult>;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=webhook.dispatcher.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.dispatcher.d.ts","sourceRoot":"","sources":["../src/webhook.dispatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,yCAAyC,CAAC;AACzE,OAAO,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAGtE,qBACa,iBAAiB;IAK1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAEvB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAN7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAGxB,MAAM,EAAE,aAAa,EAErB,UAAU,EAAE,iBAAiB,EAE9C,OAAO,EAAE,oBAAoB;IAMzB,QAAQ,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,cAAc,CAAC;CAsBnE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.WebhookDispatcher = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const webhook_signer_1 = require("./webhook.signer");
|
|
18
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
19
|
+
const webhook_constants_2 = require("./webhook.constants");
|
|
20
|
+
const webhook_url_validator_1 = require("./webhook.url-validator");
|
|
21
|
+
let WebhookDispatcher = class WebhookDispatcher {
|
|
22
|
+
signer;
|
|
23
|
+
httpClient;
|
|
24
|
+
timeout;
|
|
25
|
+
allowPrivateUrls;
|
|
26
|
+
constructor(signer, httpClient, options) {
|
|
27
|
+
this.signer = signer;
|
|
28
|
+
this.httpClient = httpClient;
|
|
29
|
+
this.timeout = options.delivery?.timeout ?? webhook_constants_2.DEFAULT_DELIVERY_TIMEOUT;
|
|
30
|
+
this.allowPrivateUrls = options.allowPrivateUrls ?? false;
|
|
31
|
+
}
|
|
32
|
+
async dispatch(delivery) {
|
|
33
|
+
// DNS rebinding defense — validate resolved IPs before every dispatch
|
|
34
|
+
if (!this.allowPrivateUrls) {
|
|
35
|
+
const hostname = new URL(delivery.url).hostname;
|
|
36
|
+
await (0, webhook_url_validator_1.resolveAndValidateHost)(hostname);
|
|
37
|
+
}
|
|
38
|
+
const body = JSON.stringify({
|
|
39
|
+
type: delivery.event_type,
|
|
40
|
+
data: delivery.payload,
|
|
41
|
+
});
|
|
42
|
+
const timestamp = Math.floor(Date.now() / 1000);
|
|
43
|
+
const headers = this.signer.sign(delivery.event_id, timestamp, body, delivery.secret);
|
|
44
|
+
return this.httpClient.post(delivery.url, headers, body, this.timeout);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
exports.WebhookDispatcher = WebhookDispatcher;
|
|
48
|
+
exports.WebhookDispatcher = WebhookDispatcher = __decorate([
|
|
49
|
+
(0, common_1.Injectable)(),
|
|
50
|
+
__param(1, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_HTTP_CLIENT)),
|
|
51
|
+
__param(2, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
52
|
+
__metadata("design:paramtypes", [webhook_signer_1.WebhookSigner, Object, Object])
|
|
53
|
+
], WebhookDispatcher);
|
|
54
|
+
//# sourceMappingURL=webhook.dispatcher.js.map
|
|
@@ -0,0 +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,IAAI,CAC9B,QAAQ,CAAC,QAAQ,EACjB,SAAS,EACT,IAAI,EACJ,QAAQ,CAAC,MAAM,CAChB,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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { WebhookSigner } from './webhook.signer';
|
|
2
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
3
|
+
import { WebhookEndpointRepository } from './ports/webhook-endpoint.repository';
|
|
4
|
+
import { WebhookEventRepository } from './ports/webhook-event.repository';
|
|
5
|
+
import { WebhookDeliveryRepository } from './ports/webhook-delivery.repository';
|
|
6
|
+
import { CreateEndpointDto, EndpointRecord, EndpointRecordWithSecret, UpdateEndpointDto } from './interfaces/webhook-endpoint.interface';
|
|
7
|
+
export declare class WebhookEndpointAdminService {
|
|
8
|
+
private readonly endpointRepo;
|
|
9
|
+
private readonly eventRepo;
|
|
10
|
+
private readonly deliveryRepo;
|
|
11
|
+
private readonly signer;
|
|
12
|
+
private readonly logger;
|
|
13
|
+
private readonly allowPrivateUrls;
|
|
14
|
+
constructor(endpointRepo: WebhookEndpointRepository, eventRepo: WebhookEventRepository, deliveryRepo: WebhookDeliveryRepository, signer: WebhookSigner, options: WebhookModuleOptions);
|
|
15
|
+
createEndpoint(dto: CreateEndpointDto): Promise<EndpointRecordWithSecret>;
|
|
16
|
+
listEndpoints(tenantId?: string): Promise<EndpointRecord[]>;
|
|
17
|
+
getEndpoint(endpointId: string): Promise<EndpointRecord | null>;
|
|
18
|
+
updateEndpoint(endpointId: string, dto: UpdateEndpointDto): Promise<EndpointRecord | null>;
|
|
19
|
+
deleteEndpoint(endpointId: string): Promise<boolean>;
|
|
20
|
+
sendTestEvent(endpointId: string): Promise<string | null>;
|
|
21
|
+
private validateBase64Secret;
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=webhook.endpoint-admin.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.endpoint-admin.service.d.ts","sourceRoot":"","sources":["../src/webhook.endpoint-admin.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOjD,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EACL,iBAAiB,EACjB,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,yCAAyC,CAAC;AAGjD,qBACa,2BAA2B;IAMpC,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM;IAVzB,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgD;IACvE,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAU;gBAIxB,YAAY,EAAE,yBAAyB,EAEvC,SAAS,EAAE,sBAAsB,EAEjC,YAAY,EAAE,yBAAyB,EACvC,MAAM,EAAE,aAAa,EAEtC,OAAO,EAAE,oBAAoB;IAKzB,cAAc,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IA0BzE,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;IAO3B,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAIpD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAe/D,OAAO,CAAC,oBAAoB;CAgB7B"}
|