@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,97 @@
|
|
|
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 WebhookEndpointAdminService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WebhookEndpointAdminService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const webhook_signer_1 = require("./webhook.signer");
|
|
19
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
20
|
+
const webhook_url_validator_1 = require("./webhook.url-validator");
|
|
21
|
+
let WebhookEndpointAdminService = WebhookEndpointAdminService_1 = class WebhookEndpointAdminService {
|
|
22
|
+
endpointRepo;
|
|
23
|
+
eventRepo;
|
|
24
|
+
deliveryRepo;
|
|
25
|
+
signer;
|
|
26
|
+
logger = new common_1.Logger(WebhookEndpointAdminService_1.name);
|
|
27
|
+
allowPrivateUrls;
|
|
28
|
+
constructor(endpointRepo, eventRepo, deliveryRepo, signer, options) {
|
|
29
|
+
this.endpointRepo = endpointRepo;
|
|
30
|
+
this.eventRepo = eventRepo;
|
|
31
|
+
this.deliveryRepo = deliveryRepo;
|
|
32
|
+
this.signer = signer;
|
|
33
|
+
this.allowPrivateUrls = options.allowPrivateUrls ?? false;
|
|
34
|
+
}
|
|
35
|
+
async createEndpoint(dto) {
|
|
36
|
+
if (!this.allowPrivateUrls) {
|
|
37
|
+
await (0, webhook_url_validator_1.validateWebhookUrl)(dto.url);
|
|
38
|
+
}
|
|
39
|
+
let secret;
|
|
40
|
+
if (!dto.secret || dto.secret === 'auto') {
|
|
41
|
+
secret = this.signer.generateSecret();
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.validateBase64Secret(dto.secret);
|
|
45
|
+
secret = dto.secret;
|
|
46
|
+
}
|
|
47
|
+
const endpoint = await this.endpointRepo.createEndpoint(dto.url, secret, dto.events, dto.description ?? null, dto.metadata ?? null, dto.tenantId ?? null);
|
|
48
|
+
this.logger.log(`Endpoint created: ${endpoint.id} → ${dto.url}`);
|
|
49
|
+
return endpoint;
|
|
50
|
+
}
|
|
51
|
+
async listEndpoints(tenantId) {
|
|
52
|
+
return this.endpointRepo.listEndpoints(tenantId);
|
|
53
|
+
}
|
|
54
|
+
async getEndpoint(endpointId) {
|
|
55
|
+
return this.endpointRepo.getEndpoint(endpointId);
|
|
56
|
+
}
|
|
57
|
+
async updateEndpoint(endpointId, dto) {
|
|
58
|
+
if (dto.url && !this.allowPrivateUrls) {
|
|
59
|
+
await (0, webhook_url_validator_1.validateWebhookUrl)(dto.url);
|
|
60
|
+
}
|
|
61
|
+
return this.endpointRepo.updateEndpoint(endpointId, dto);
|
|
62
|
+
}
|
|
63
|
+
async deleteEndpoint(endpointId) {
|
|
64
|
+
return this.endpointRepo.deleteEndpoint(endpointId);
|
|
65
|
+
}
|
|
66
|
+
async sendTestEvent(endpointId) {
|
|
67
|
+
const endpoint = await this.endpointRepo.getEndpoint(endpointId);
|
|
68
|
+
if (!endpoint)
|
|
69
|
+
return null;
|
|
70
|
+
const eventId = await this.eventRepo.saveEvent('webhook.test', { test: true }, endpoint.tenantId ?? null);
|
|
71
|
+
await this.deliveryRepo.createTestDelivery(eventId, endpointId);
|
|
72
|
+
this.logger.log(`Test event sent to endpoint ${endpointId}`);
|
|
73
|
+
return eventId;
|
|
74
|
+
}
|
|
75
|
+
validateBase64Secret(secret) {
|
|
76
|
+
const base64Regex = /^[A-Za-z0-9+/]*={0,2}$/;
|
|
77
|
+
if (!base64Regex.test(secret) || secret.length === 0) {
|
|
78
|
+
throw new Error('Invalid secret: must be a valid base64-encoded string. ' +
|
|
79
|
+
'Use "auto" to generate one automatically.');
|
|
80
|
+
}
|
|
81
|
+
const decoded = Buffer.from(secret, 'base64');
|
|
82
|
+
if (decoded.length < 16) {
|
|
83
|
+
throw new Error('Invalid secret: decoded value must be at least 16 bytes. ' +
|
|
84
|
+
'Use "auto" to generate a secure secret.');
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
exports.WebhookEndpointAdminService = WebhookEndpointAdminService;
|
|
89
|
+
exports.WebhookEndpointAdminService = WebhookEndpointAdminService = WebhookEndpointAdminService_1 = __decorate([
|
|
90
|
+
(0, common_1.Injectable)(),
|
|
91
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY)),
|
|
92
|
+
__param(1, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_EVENT_REPOSITORY)),
|
|
93
|
+
__param(2, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY)),
|
|
94
|
+
__param(4, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
95
|
+
__metadata("design:paramtypes", [Object, Object, Object, webhook_signer_1.WebhookSigner, Object])
|
|
96
|
+
], WebhookEndpointAdminService);
|
|
97
|
+
//# sourceMappingURL=webhook.endpoint-admin.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.endpoint-admin.service.js","sourceRoot":"","sources":["../src/webhook.endpoint-admin.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.event.d.ts","sourceRoot":"","sources":["../src/webhook.event.ts"],"names":[],"mappings":"AAAA,8BAAsB,YAAY;IAChC,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAElC,IAAI,SAAS,IAAI,MAAM,CAQtB;IAED,SAAS,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAOrC"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.WebhookEvent = void 0;
|
|
4
|
+
class WebhookEvent {
|
|
5
|
+
static eventType;
|
|
6
|
+
get eventType() {
|
|
7
|
+
const type = this.constructor.eventType;
|
|
8
|
+
if (!type) {
|
|
9
|
+
throw new Error(`${this.constructor.name} must define static readonly eventType`);
|
|
10
|
+
}
|
|
11
|
+
return type;
|
|
12
|
+
}
|
|
13
|
+
toPayload() {
|
|
14
|
+
const payload = {};
|
|
15
|
+
for (const key of Object.keys(this)) {
|
|
16
|
+
payload[key] = this[key];
|
|
17
|
+
}
|
|
18
|
+
return payload;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
exports.WebhookEvent = WebhookEvent;
|
|
22
|
+
//# sourceMappingURL=webhook.event.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.event.js","sourceRoot":"","sources":["../src/webhook.event.ts"],"names":[],"mappings":";;;AAAA,MAAsB,YAAY;IAChC,MAAM,CAAU,SAAS,CAAS;IAElC,IAAI,SAAS;QACX,MAAM,IAAI,GAAI,IAAI,CAAC,WAAmC,CAAC,SAAS,CAAC;QACjE,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,MAAM,IAAI,KAAK,CACb,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,wCAAwC,CACjE,CAAC;QACJ,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,SAAS;QACP,MAAM,OAAO,GAA4B,EAAE,CAAC;QAC5C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACpC,OAAO,CAAC,GAAG,CAAC,GAAI,IAAgC,CAAC,GAAG,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;CACF;AApBD,oCAoBC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DynamicModule, OnModuleDestroy, OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { SchedulerRegistry } from '@nestjs/schedule';
|
|
3
|
+
import { WebhookDeliveryWorker } from './webhook.delivery-worker';
|
|
4
|
+
import { WebhookModuleOptions, WebhookModuleAsyncOptions } from './interfaces/webhook-options.interface';
|
|
5
|
+
export declare class WebhookModule implements OnModuleInit, OnModuleDestroy {
|
|
6
|
+
private readonly schedulerRegistry;
|
|
7
|
+
private readonly deliveryWorker;
|
|
8
|
+
private readonly options;
|
|
9
|
+
constructor(schedulerRegistry: SchedulerRegistry, deliveryWorker: WebhookDeliveryWorker, options: WebhookModuleOptions);
|
|
10
|
+
static forRoot(options: WebhookModuleOptions): DynamicModule;
|
|
11
|
+
static forRootAsync(asyncOptions: WebhookModuleAsyncOptions): DynamicModule;
|
|
12
|
+
onModuleInit(): void;
|
|
13
|
+
onModuleDestroy(): void;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=webhook.module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.module.d.ts","sourceRoot":"","sources":["../src/webhook.module.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,aAAa,EAIb,eAAe,EACf,YAAY,EAEb,MAAM,gBAAgB,CAAC;AACxB,OAAO,EAAkB,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAErE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAgBlE,OAAO,EACL,oBAAoB,EACpB,yBAAyB,EAE1B,MAAM,wCAAwC,CAAC;AAiFhD,qBAEa,aAAc,YAAW,YAAY,EAAE,eAAe;IAE/D,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,cAAc;IAE/B,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAHP,iBAAiB,EAAE,iBAAiB,EACpC,cAAc,EAAE,qBAAqB,EAErC,OAAO,EAAE,oBAAoB;IAGhD,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,oBAAoB,GAAG,aAAa;IAa5D,MAAM,CAAC,YAAY,CAAC,YAAY,EAAE,yBAAyB,GAAG,aAAa;IAwC3E,YAAY,IAAI,IAAI;IAQpB,eAAe,IAAI,IAAI;CAOxB"}
|
|
@@ -0,0 +1,176 @@
|
|
|
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 WebhookModule_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WebhookModule = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const schedule_1 = require("@nestjs/schedule");
|
|
19
|
+
const webhook_service_1 = require("./webhook.service");
|
|
20
|
+
const webhook_delivery_worker_1 = require("./webhook.delivery-worker");
|
|
21
|
+
const webhook_signer_1 = require("./webhook.signer");
|
|
22
|
+
const webhook_circuit_breaker_1 = require("./webhook.circuit-breaker");
|
|
23
|
+
const webhook_dispatcher_1 = require("./webhook.dispatcher");
|
|
24
|
+
const webhook_retry_policy_1 = require("./webhook.retry-policy");
|
|
25
|
+
const webhook_endpoint_admin_service_1 = require("./webhook.endpoint-admin.service");
|
|
26
|
+
const webhook_delivery_admin_service_1 = require("./webhook.delivery-admin.service");
|
|
27
|
+
const webhook_admin_service_1 = require("./webhook.admin.service");
|
|
28
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
29
|
+
const prisma_event_repository_1 = require("./adapters/prisma-event.repository");
|
|
30
|
+
const prisma_endpoint_repository_1 = require("./adapters/prisma-endpoint.repository");
|
|
31
|
+
const prisma_delivery_repository_1 = require("./adapters/prisma-delivery.repository");
|
|
32
|
+
const fetch_http_client_1 = require("./adapters/fetch-http-client");
|
|
33
|
+
function createPortProviders(options) {
|
|
34
|
+
return [
|
|
35
|
+
{
|
|
36
|
+
provide: webhook_constants_1.WEBHOOK_EVENT_REPOSITORY,
|
|
37
|
+
useFactory: () => options.eventRepository ?? new prisma_event_repository_1.PrismaEventRepository(options.prisma),
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
provide: webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY,
|
|
41
|
+
useFactory: () => options.endpointRepository ??
|
|
42
|
+
new prisma_endpoint_repository_1.PrismaEndpointRepository(options.prisma),
|
|
43
|
+
},
|
|
44
|
+
{
|
|
45
|
+
provide: webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY,
|
|
46
|
+
useFactory: () => options.deliveryRepository ??
|
|
47
|
+
new prisma_delivery_repository_1.PrismaDeliveryRepository(options.prisma),
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
provide: webhook_constants_1.WEBHOOK_HTTP_CLIENT,
|
|
51
|
+
useFactory: () => options.httpClient ?? new fetch_http_client_1.FetchHttpClient(),
|
|
52
|
+
},
|
|
53
|
+
];
|
|
54
|
+
}
|
|
55
|
+
function createAsyncPortProviders() {
|
|
56
|
+
return [
|
|
57
|
+
{
|
|
58
|
+
provide: webhook_constants_1.WEBHOOK_EVENT_REPOSITORY,
|
|
59
|
+
useFactory: (opts) => opts.eventRepository ?? new prisma_event_repository_1.PrismaEventRepository(opts.prisma),
|
|
60
|
+
inject: [webhook_constants_1.WEBHOOK_MODULE_OPTIONS],
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
provide: webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY,
|
|
64
|
+
useFactory: (opts) => opts.endpointRepository ?? new prisma_endpoint_repository_1.PrismaEndpointRepository(opts.prisma),
|
|
65
|
+
inject: [webhook_constants_1.WEBHOOK_MODULE_OPTIONS],
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
provide: webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY,
|
|
69
|
+
useFactory: (opts) => opts.deliveryRepository ?? new prisma_delivery_repository_1.PrismaDeliveryRepository(opts.prisma),
|
|
70
|
+
inject: [webhook_constants_1.WEBHOOK_MODULE_OPTIONS],
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
provide: webhook_constants_1.WEBHOOK_HTTP_CLIENT,
|
|
74
|
+
useFactory: (opts) => opts.httpClient ?? new fetch_http_client_1.FetchHttpClient(),
|
|
75
|
+
inject: [webhook_constants_1.WEBHOOK_MODULE_OPTIONS],
|
|
76
|
+
},
|
|
77
|
+
];
|
|
78
|
+
}
|
|
79
|
+
const CORE_PROVIDERS = [
|
|
80
|
+
webhook_signer_1.WebhookSigner,
|
|
81
|
+
webhook_retry_policy_1.WebhookRetryPolicy,
|
|
82
|
+
webhook_circuit_breaker_1.WebhookCircuitBreaker,
|
|
83
|
+
webhook_dispatcher_1.WebhookDispatcher,
|
|
84
|
+
webhook_service_1.WebhookService,
|
|
85
|
+
webhook_delivery_worker_1.WebhookDeliveryWorker,
|
|
86
|
+
webhook_endpoint_admin_service_1.WebhookEndpointAdminService,
|
|
87
|
+
webhook_delivery_admin_service_1.WebhookDeliveryAdminService,
|
|
88
|
+
webhook_admin_service_1.WebhookAdminService,
|
|
89
|
+
];
|
|
90
|
+
const EXPORTS = [
|
|
91
|
+
webhook_service_1.WebhookService,
|
|
92
|
+
webhook_endpoint_admin_service_1.WebhookEndpointAdminService,
|
|
93
|
+
webhook_delivery_admin_service_1.WebhookDeliveryAdminService,
|
|
94
|
+
webhook_admin_service_1.WebhookAdminService,
|
|
95
|
+
webhook_signer_1.WebhookSigner,
|
|
96
|
+
];
|
|
97
|
+
let WebhookModule = WebhookModule_1 = class WebhookModule {
|
|
98
|
+
schedulerRegistry;
|
|
99
|
+
deliveryWorker;
|
|
100
|
+
options;
|
|
101
|
+
constructor(schedulerRegistry, deliveryWorker, options) {
|
|
102
|
+
this.schedulerRegistry = schedulerRegistry;
|
|
103
|
+
this.deliveryWorker = deliveryWorker;
|
|
104
|
+
this.options = options;
|
|
105
|
+
}
|
|
106
|
+
static forRoot(options) {
|
|
107
|
+
return {
|
|
108
|
+
module: WebhookModule_1,
|
|
109
|
+
imports: [schedule_1.ScheduleModule.forRoot()],
|
|
110
|
+
providers: [
|
|
111
|
+
{ provide: webhook_constants_1.WEBHOOK_MODULE_OPTIONS, useValue: options },
|
|
112
|
+
...createPortProviders(options),
|
|
113
|
+
...CORE_PROVIDERS,
|
|
114
|
+
],
|
|
115
|
+
exports: EXPORTS,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
static forRootAsync(asyncOptions) {
|
|
119
|
+
const optionsProviders = [];
|
|
120
|
+
if (asyncOptions.useFactory) {
|
|
121
|
+
optionsProviders.push({
|
|
122
|
+
provide: webhook_constants_1.WEBHOOK_MODULE_OPTIONS,
|
|
123
|
+
useFactory: asyncOptions.useFactory,
|
|
124
|
+
inject: asyncOptions.inject ?? [],
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else if (asyncOptions.useClass) {
|
|
128
|
+
optionsProviders.push({ provide: asyncOptions.useClass, useClass: asyncOptions.useClass }, {
|
|
129
|
+
provide: webhook_constants_1.WEBHOOK_MODULE_OPTIONS,
|
|
130
|
+
useFactory: (factory) => factory.createWebhookOptions(),
|
|
131
|
+
inject: [asyncOptions.useClass],
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
else if (asyncOptions.useExisting) {
|
|
135
|
+
optionsProviders.push({
|
|
136
|
+
provide: webhook_constants_1.WEBHOOK_MODULE_OPTIONS,
|
|
137
|
+
useFactory: (factory) => factory.createWebhookOptions(),
|
|
138
|
+
inject: [asyncOptions.useExisting],
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
return {
|
|
142
|
+
module: WebhookModule_1,
|
|
143
|
+
imports: [schedule_1.ScheduleModule.forRoot(), ...(asyncOptions.imports ?? [])],
|
|
144
|
+
providers: [
|
|
145
|
+
...optionsProviders,
|
|
146
|
+
...createAsyncPortProviders(),
|
|
147
|
+
...CORE_PROVIDERS,
|
|
148
|
+
],
|
|
149
|
+
exports: EXPORTS,
|
|
150
|
+
};
|
|
151
|
+
}
|
|
152
|
+
onModuleInit() {
|
|
153
|
+
const interval = this.options.polling?.interval ?? webhook_constants_1.DEFAULT_POLLING_INTERVAL;
|
|
154
|
+
const intervalRef = setInterval(() => {
|
|
155
|
+
this.deliveryWorker.poll();
|
|
156
|
+
}, interval);
|
|
157
|
+
this.schedulerRegistry.addInterval('webhook-delivery-poll', intervalRef);
|
|
158
|
+
}
|
|
159
|
+
onModuleDestroy() {
|
|
160
|
+
try {
|
|
161
|
+
this.schedulerRegistry.deleteInterval('webhook-delivery-poll');
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
// Already cleaned up
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
};
|
|
168
|
+
exports.WebhookModule = WebhookModule;
|
|
169
|
+
exports.WebhookModule = WebhookModule = WebhookModule_1 = __decorate([
|
|
170
|
+
(0, common_1.Global)(),
|
|
171
|
+
(0, common_1.Module)({}),
|
|
172
|
+
__param(2, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
173
|
+
__metadata("design:paramtypes", [schedule_1.SchedulerRegistry,
|
|
174
|
+
webhook_delivery_worker_1.WebhookDeliveryWorker, Object])
|
|
175
|
+
], WebhookModule);
|
|
176
|
+
//# sourceMappingURL=webhook.module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.module.js","sourceRoot":"","sources":["../src/webhook.module.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
2
|
+
export declare class WebhookRetryPolicy {
|
|
3
|
+
private readonly jitter;
|
|
4
|
+
constructor(options: WebhookModuleOptions);
|
|
5
|
+
nextAttemptAt(attempt: number): Date;
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=webhook.retry-policy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.retry-policy.d.ts","sourceRoot":"","sources":["../src/webhook.retry-policy.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAE9E,qBACa,kBAAkB;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAU;gBAI/B,OAAO,EAAE,oBAAoB;IAK/B,aAAa,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CAUrC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
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.WebhookRetryPolicy = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
18
|
+
const webhook_constants_2 = require("./webhook.constants");
|
|
19
|
+
let WebhookRetryPolicy = class WebhookRetryPolicy {
|
|
20
|
+
jitter;
|
|
21
|
+
constructor(options) {
|
|
22
|
+
this.jitter = options.delivery?.jitter ?? true;
|
|
23
|
+
}
|
|
24
|
+
nextAttemptAt(attempt) {
|
|
25
|
+
const delay = webhook_constants_2.DEFAULT_BACKOFF_SCHEDULE[Math.min(attempt - 1, webhook_constants_2.DEFAULT_BACKOFF_SCHEDULE.length - 1)];
|
|
26
|
+
const jitterOffset = this.jitter
|
|
27
|
+
? Math.random() * delay * webhook_constants_2.DEFAULT_JITTER_FACTOR
|
|
28
|
+
: 0;
|
|
29
|
+
return new Date(Date.now() + (delay + jitterOffset) * 1000);
|
|
30
|
+
}
|
|
31
|
+
};
|
|
32
|
+
exports.WebhookRetryPolicy = WebhookRetryPolicy;
|
|
33
|
+
exports.WebhookRetryPolicy = WebhookRetryPolicy = __decorate([
|
|
34
|
+
(0, common_1.Injectable)(),
|
|
35
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
36
|
+
__metadata("design:paramtypes", [Object])
|
|
37
|
+
], WebhookRetryPolicy);
|
|
38
|
+
//# sourceMappingURL=webhook.retry-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.retry-policy.js","sourceRoot":"","sources":["../src/webhook.retry-policy.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAoD;AACpD,2DAA6D;AAC7D,2DAG6B;AAItB,IAAM,kBAAkB,GAAxB,MAAM,kBAAkB;IACZ,MAAM,CAAU;IAEjC,YAEE,OAA6B;QAE7B,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,IAAI,CAAC;IACjD,CAAC;IAED,aAAa,CAAC,OAAe;QAC3B,MAAM,KAAK,GACT,4CAAwB,CACtB,IAAI,CAAC,GAAG,CAAC,OAAO,GAAG,CAAC,EAAE,4CAAwB,CAAC,MAAM,GAAG,CAAC,CAAC,CAC3D,CAAC;QACJ,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM;YAC9B,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,KAAK,GAAG,yCAAqB;YAC/C,CAAC,CAAC,CAAC,CAAC;QACN,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,KAAK,GAAG,YAAY,CAAC,GAAG,IAAI,CAAC,CAAC;IAC9D,CAAC;CACF,CAAA;AApBY,gDAAkB;6BAAlB,kBAAkB;IAD9B,IAAA,mBAAU,GAAE;IAKR,WAAA,IAAA,eAAM,EAAC,0CAAsB,CAAC,CAAA;;GAJtB,kBAAkB,CAoB9B"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { WebhookEvent } from './webhook.event';
|
|
2
|
+
import { WebhookModuleOptions } from './interfaces/webhook-options.interface';
|
|
3
|
+
import { WebhookEventRepository } from './ports/webhook-event.repository';
|
|
4
|
+
import { WebhookEndpointRepository } from './ports/webhook-endpoint.repository';
|
|
5
|
+
import { WebhookDeliveryRepository } from './ports/webhook-delivery.repository';
|
|
6
|
+
export declare class WebhookService {
|
|
7
|
+
private readonly eventRepo;
|
|
8
|
+
private readonly endpointRepo;
|
|
9
|
+
private readonly deliveryRepo;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
private readonly maxAttempts;
|
|
12
|
+
constructor(eventRepo: WebhookEventRepository, endpointRepo: WebhookEndpointRepository, deliveryRepo: WebhookDeliveryRepository, options: WebhookModuleOptions);
|
|
13
|
+
send(event: WebhookEvent): Promise<string>;
|
|
14
|
+
sendToTenant(tenantId: string, event: WebhookEvent): Promise<string>;
|
|
15
|
+
private sendInternal;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=webhook.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.service.d.ts","sourceRoot":"","sources":["../src/webhook.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAO/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AAC9E,OAAO,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAChF,OAAO,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AAEhF,qBACa,cAAc;IAMvB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAE1B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAE7B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAT/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmC;IAC1D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAIlB,SAAS,EAAE,sBAAsB,EAEjC,YAAY,EAAE,yBAAyB,EAEvC,YAAY,EAAE,yBAAyB,EAExD,OAAO,EAAE,oBAAoB;IAKzB,IAAI,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;IAI1C,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC;YAI5D,YAAY;CA4C3B"}
|
|
@@ -0,0 +1,63 @@
|
|
|
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 WebhookService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WebhookService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const webhook_constants_1 = require("./webhook.constants");
|
|
19
|
+
let WebhookService = WebhookService_1 = class WebhookService {
|
|
20
|
+
eventRepo;
|
|
21
|
+
endpointRepo;
|
|
22
|
+
deliveryRepo;
|
|
23
|
+
logger = new common_1.Logger(WebhookService_1.name);
|
|
24
|
+
maxAttempts;
|
|
25
|
+
constructor(eventRepo, endpointRepo, deliveryRepo, options) {
|
|
26
|
+
this.eventRepo = eventRepo;
|
|
27
|
+
this.endpointRepo = endpointRepo;
|
|
28
|
+
this.deliveryRepo = deliveryRepo;
|
|
29
|
+
this.maxAttempts = options.delivery?.maxRetries ?? 5;
|
|
30
|
+
}
|
|
31
|
+
async send(event) {
|
|
32
|
+
return this.sendInternal(event, undefined);
|
|
33
|
+
}
|
|
34
|
+
async sendToTenant(tenantId, event) {
|
|
35
|
+
return this.sendInternal(event, tenantId);
|
|
36
|
+
}
|
|
37
|
+
async sendInternal(event, tenantId) {
|
|
38
|
+
const payload = event.toPayload();
|
|
39
|
+
const eventType = event.eventType;
|
|
40
|
+
return this.deliveryRepo.runInTransaction(async (tx) => {
|
|
41
|
+
const eventId = await this.eventRepo.saveEventInTransaction(tx, eventType, payload, tenantId ?? null);
|
|
42
|
+
const endpoints = await this.endpointRepo.findMatchingEndpointsInTransaction(tx, eventType, tenantId);
|
|
43
|
+
if (endpoints.length === 0) {
|
|
44
|
+
this.logger.debug(`No matching endpoints for event ${eventType} (eventId=${eventId})`);
|
|
45
|
+
return eventId;
|
|
46
|
+
}
|
|
47
|
+
const endpointIds = endpoints.map((ep) => ep.id);
|
|
48
|
+
await this.deliveryRepo.createDeliveriesInTransaction(tx, eventId, endpointIds, this.maxAttempts);
|
|
49
|
+
this.logger.log(`Event ${eventType} (${eventId}) → ${endpoints.length} endpoint(s)`);
|
|
50
|
+
return eventId;
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
};
|
|
54
|
+
exports.WebhookService = WebhookService;
|
|
55
|
+
exports.WebhookService = WebhookService = WebhookService_1 = __decorate([
|
|
56
|
+
(0, common_1.Injectable)(),
|
|
57
|
+
__param(0, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_EVENT_REPOSITORY)),
|
|
58
|
+
__param(1, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY)),
|
|
59
|
+
__param(2, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY)),
|
|
60
|
+
__param(3, (0, common_1.Inject)(webhook_constants_1.WEBHOOK_MODULE_OPTIONS)),
|
|
61
|
+
__metadata("design:paramtypes", [Object, Object, Object, Object])
|
|
62
|
+
], WebhookService);
|
|
63
|
+
//# sourceMappingURL=webhook.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.service.js","sourceRoot":"","sources":["../src/webhook.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,2CAA4D;AAE5D,2DAK6B;AAOtB,IAAM,cAAc,sBAApB,MAAM,cAAc;IAMN;IAEA;IAEA;IATF,MAAM,GAAG,IAAI,eAAM,CAAC,gBAAc,CAAC,IAAI,CAAC,CAAC;IACzC,WAAW,CAAS;IAErC,YAEmB,SAAiC,EAEjC,YAAuC,EAEvC,YAAuC,EAExD,OAA6B;QANZ,cAAS,GAAT,SAAS,CAAwB;QAEjC,iBAAY,GAAZ,YAAY,CAA2B;QAEvC,iBAAY,GAAZ,YAAY,CAA2B;QAIxD,IAAI,CAAC,WAAW,GAAG,OAAO,CAAC,QAAQ,EAAE,UAAU,IAAI,CAAC,CAAC;IACvD,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,KAAmB;QAC5B,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,QAAgB,EAAE,KAAmB;QACtD,OAAO,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5C,CAAC;IAEO,KAAK,CAAC,YAAY,CACxB,KAAmB,EACnB,QAA4B;QAE5B,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC;QAClC,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC;QAElC,OAAO,IAAI,CAAC,YAAY,CAAC,gBAAgB,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;YACrD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,sBAAsB,CACzD,EAAE,EACF,SAAS,EACT,OAAO,EACP,QAAQ,IAAI,IAAI,CACjB,CAAC;YAEF,MAAM,SAAS,GACb,MAAM,IAAI,CAAC,YAAY,CAAC,kCAAkC,CACxD,EAAE,EACF,SAAS,EACT,QAAQ,CACT,CAAC;YAEJ,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC3B,IAAI,CAAC,MAAM,CAAC,KAAK,CACf,mCAAmC,SAAS,aAAa,OAAO,GAAG,CACpE,CAAC;gBACF,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,WAAW,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;YACjD,MAAM,IAAI,CAAC,YAAY,CAAC,6BAA6B,CACnD,EAAE,EACF,OAAO,EACP,WAAW,EACX,IAAI,CAAC,WAAW,CACjB,CAAC;YAEF,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,SAAS,SAAS,KAAK,OAAO,OAAO,SAAS,CAAC,MAAM,cAAc,CACpE,CAAC;YAEF,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,CAAC;IACL,CAAC;CACF,CAAA;AArEY,wCAAc;yBAAd,cAAc;IAD1B,IAAA,mBAAU,GAAE;IAMR,WAAA,IAAA,eAAM,EAAC,4CAAwB,CAAC,CAAA;IAEhC,WAAA,IAAA,eAAM,EAAC,+CAA2B,CAAC,CAAA;IAEnC,WAAA,IAAA,eAAM,EAAC,+CAA2B,CAAC,CAAA;IAEnC,WAAA,IAAA,eAAM,EAAC,0CAAsB,CAAC,CAAA;;GAXtB,cAAc,CAqE1B"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export interface SignatureHeaders {
|
|
2
|
+
[key: string]: string;
|
|
3
|
+
'webhook-id': string;
|
|
4
|
+
'webhook-timestamp': string;
|
|
5
|
+
'webhook-signature': string;
|
|
6
|
+
}
|
|
7
|
+
export declare class WebhookSigner {
|
|
8
|
+
sign(eventId: string, timestamp: number, body: string, secret: string): SignatureHeaders;
|
|
9
|
+
verify(eventId: string, timestamp: number, body: string, secret: string, signature: string): boolean;
|
|
10
|
+
generateSecret(): string;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=webhook.signer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.signer.d.ts","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":"AAGA,MAAM,WAAW,gBAAgB;IAC/B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B;AAED,qBACa,aAAa;IACxB,IAAI,CACF,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,GACb,gBAAgB;IAcnB,MAAM,CACJ,OAAO,EAAE,MAAM,EACf,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,GAChB,OAAO;IAYV,cAAc,IAAI,MAAM;CAGzB"}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
19
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
20
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
21
|
+
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;
|
|
22
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
23
|
+
};
|
|
24
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
25
|
+
var ownKeys = function(o) {
|
|
26
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
27
|
+
var ar = [];
|
|
28
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
29
|
+
return ar;
|
|
30
|
+
};
|
|
31
|
+
return ownKeys(o);
|
|
32
|
+
};
|
|
33
|
+
return function (mod) {
|
|
34
|
+
if (mod && mod.__esModule) return mod;
|
|
35
|
+
var result = {};
|
|
36
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
37
|
+
__setModuleDefault(result, mod);
|
|
38
|
+
return result;
|
|
39
|
+
};
|
|
40
|
+
})();
|
|
41
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
42
|
+
exports.WebhookSigner = void 0;
|
|
43
|
+
const crypto = __importStar(require("crypto"));
|
|
44
|
+
const common_1 = require("@nestjs/common");
|
|
45
|
+
let WebhookSigner = class WebhookSigner {
|
|
46
|
+
sign(eventId, timestamp, body, secret) {
|
|
47
|
+
const toSign = `${eventId}.${timestamp}.${body}`;
|
|
48
|
+
const hmac = crypto
|
|
49
|
+
.createHmac('sha256', Buffer.from(secret, 'base64'))
|
|
50
|
+
.update(toSign)
|
|
51
|
+
.digest('base64');
|
|
52
|
+
return {
|
|
53
|
+
'webhook-id': eventId,
|
|
54
|
+
'webhook-timestamp': String(timestamp),
|
|
55
|
+
'webhook-signature': `v1,${hmac}`,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
verify(eventId, timestamp, body, secret, signature) {
|
|
59
|
+
const expected = this.sign(eventId, timestamp, body, secret);
|
|
60
|
+
const expectedSig = expected['webhook-signature'];
|
|
61
|
+
const a = Buffer.from(expectedSig);
|
|
62
|
+
const b = Buffer.from(signature);
|
|
63
|
+
if (a.length !== b.length)
|
|
64
|
+
return false;
|
|
65
|
+
return crypto.timingSafeEqual(a, b);
|
|
66
|
+
}
|
|
67
|
+
generateSecret() {
|
|
68
|
+
return crypto.randomBytes(32).toString('base64');
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
exports.WebhookSigner = WebhookSigner;
|
|
72
|
+
exports.WebhookSigner = WebhookSigner = __decorate([
|
|
73
|
+
(0, common_1.Injectable)()
|
|
74
|
+
], WebhookSigner);
|
|
75
|
+
//# sourceMappingURL=webhook.signer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.signer.js","sourceRoot":"","sources":["../src/webhook.signer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+CAAiC;AACjC,2CAA4C;AAUrC,IAAM,aAAa,GAAnB,MAAM,aAAa;IACxB,IAAI,CACF,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,MAAc;QAEd,MAAM,MAAM,GAAG,GAAG,OAAO,IAAI,SAAS,IAAI,IAAI,EAAE,CAAC;QACjD,MAAM,IAAI,GAAG,MAAM;aAChB,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;aACnD,MAAM,CAAC,MAAM,CAAC;aACd,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEpB,OAAO;YACL,YAAY,EAAE,OAAO;YACrB,mBAAmB,EAAE,MAAM,CAAC,SAAS,CAAC;YACtC,mBAAmB,EAAE,MAAM,IAAI,EAAE;SAClC,CAAC;IACJ,CAAC;IAED,MAAM,CACJ,OAAe,EACf,SAAiB,EACjB,IAAY,EACZ,MAAc,EACd,SAAiB;QAEjB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC7D,MAAM,WAAW,GAAG,QAAQ,CAAC,mBAAmB,CAAC,CAAC;QAElD,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACnC,MAAM,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAEjC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAExC,OAAO,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACtC,CAAC;IAED,cAAc;QACZ,OAAO,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IACnD,CAAC;CACF,CAAA;AAzCY,sCAAa;wBAAb,aAAa;IADzB,IAAA,mBAAU,GAAE;GACA,aAAa,CAyCzB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook.url-validator.d.ts","sourceRoot":"","sources":["../src/webhook.url-validator.ts"],"names":[],"mappings":"AAUA,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+BnE;AAoED,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAwB5E"}
|