@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,157 @@
|
|
|
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.PrismaEndpointRepository = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
/** Public columns — excludes secret */
|
|
15
|
+
const ENDPOINT_COLUMNS = `
|
|
16
|
+
id, url, events, active, description, metadata,
|
|
17
|
+
tenant_id AS "tenantId",
|
|
18
|
+
consecutive_failures AS "consecutiveFailures",
|
|
19
|
+
disabled_at AS "disabledAt",
|
|
20
|
+
disabled_reason AS "disabledReason",
|
|
21
|
+
created_at AS "createdAt",
|
|
22
|
+
updated_at AS "updatedAt"`;
|
|
23
|
+
/** Internal columns — includes secret (for creation response only) */
|
|
24
|
+
const ENDPOINT_COLUMNS_WITH_SECRET = `
|
|
25
|
+
id, url, secret, events, active, description, metadata,
|
|
26
|
+
tenant_id AS "tenantId",
|
|
27
|
+
consecutive_failures AS "consecutiveFailures",
|
|
28
|
+
disabled_at AS "disabledAt",
|
|
29
|
+
disabled_reason AS "disabledReason",
|
|
30
|
+
created_at AS "createdAt",
|
|
31
|
+
updated_at AS "updatedAt"`;
|
|
32
|
+
let PrismaEndpointRepository = class PrismaEndpointRepository {
|
|
33
|
+
prisma;
|
|
34
|
+
constructor(prisma) {
|
|
35
|
+
this.prisma = prisma;
|
|
36
|
+
}
|
|
37
|
+
async findMatchingEndpoints(eventType, tenantId) {
|
|
38
|
+
if (tenantId !== undefined) {
|
|
39
|
+
const rows = await this.prisma.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints
|
|
40
|
+
WHERE active = true AND tenant_id = $1
|
|
41
|
+
AND ($2 = ANY(events) OR '*' = ANY(events))`, tenantId, eventType);
|
|
42
|
+
return rows;
|
|
43
|
+
}
|
|
44
|
+
const rows = await this.prisma.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints
|
|
45
|
+
WHERE active = true
|
|
46
|
+
AND ($1 = ANY(events) OR '*' = ANY(events))`, eventType);
|
|
47
|
+
return rows;
|
|
48
|
+
}
|
|
49
|
+
async findMatchingEndpointsInTransaction(tx, eventType, tenantId) {
|
|
50
|
+
if (tenantId !== undefined) {
|
|
51
|
+
const rows = await tx.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints
|
|
52
|
+
WHERE active = true AND tenant_id = $1
|
|
53
|
+
AND ($2 = ANY(events) OR '*' = ANY(events))`, tenantId, eventType);
|
|
54
|
+
return rows;
|
|
55
|
+
}
|
|
56
|
+
const rows = await tx.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints
|
|
57
|
+
WHERE active = true
|
|
58
|
+
AND ($1 = ANY(events) OR '*' = ANY(events))`, eventType);
|
|
59
|
+
return rows;
|
|
60
|
+
}
|
|
61
|
+
async createEndpoint(url, secret, events, description, metadata, tenantId) {
|
|
62
|
+
const [endpoint] = await this.prisma.$queryRawUnsafe(`INSERT INTO webhook_endpoints (url, secret, events, description, metadata, tenant_id)
|
|
63
|
+
VALUES ($1, $2, $3::varchar[], $4, $5::jsonb, $6)
|
|
64
|
+
RETURNING ${ENDPOINT_COLUMNS_WITH_SECRET}`, url, secret, events, description, metadata ? JSON.stringify(metadata) : null, tenantId);
|
|
65
|
+
return endpoint;
|
|
66
|
+
}
|
|
67
|
+
async getEndpoint(id) {
|
|
68
|
+
const results = await this.prisma.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints WHERE id = $1::uuid`, id);
|
|
69
|
+
return results[0] ?? null;
|
|
70
|
+
}
|
|
71
|
+
async listEndpoints(tenantId) {
|
|
72
|
+
if (tenantId) {
|
|
73
|
+
const filtered = await this.prisma.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints
|
|
74
|
+
WHERE tenant_id = $1 ORDER BY created_at DESC`, tenantId);
|
|
75
|
+
return filtered;
|
|
76
|
+
}
|
|
77
|
+
const all = await this.prisma.$queryRawUnsafe(`SELECT ${ENDPOINT_COLUMNS} FROM webhook_endpoints ORDER BY created_at DESC`);
|
|
78
|
+
return all;
|
|
79
|
+
}
|
|
80
|
+
async updateEndpoint(id, dto) {
|
|
81
|
+
const setClauses = ['updated_at = NOW()'];
|
|
82
|
+
const values = [];
|
|
83
|
+
let paramIndex = 1;
|
|
84
|
+
if (dto.url !== undefined) {
|
|
85
|
+
setClauses.push(`url = $${paramIndex++}`);
|
|
86
|
+
values.push(dto.url);
|
|
87
|
+
}
|
|
88
|
+
if (dto.events !== undefined) {
|
|
89
|
+
setClauses.push(`events = $${paramIndex++}::varchar[]`);
|
|
90
|
+
values.push(dto.events);
|
|
91
|
+
}
|
|
92
|
+
if (dto.description !== undefined) {
|
|
93
|
+
setClauses.push(`description = $${paramIndex++}`);
|
|
94
|
+
values.push(dto.description);
|
|
95
|
+
}
|
|
96
|
+
if (dto.metadata !== undefined) {
|
|
97
|
+
setClauses.push(`metadata = $${paramIndex++}::jsonb`);
|
|
98
|
+
values.push(JSON.stringify(dto.metadata));
|
|
99
|
+
}
|
|
100
|
+
if (dto.active !== undefined) {
|
|
101
|
+
setClauses.push(`active = $${paramIndex++}`);
|
|
102
|
+
values.push(dto.active);
|
|
103
|
+
}
|
|
104
|
+
values.push(id);
|
|
105
|
+
const query = `
|
|
106
|
+
UPDATE webhook_endpoints
|
|
107
|
+
SET ${setClauses.join(', ')}
|
|
108
|
+
WHERE id = $${paramIndex}::uuid
|
|
109
|
+
RETURNING ${ENDPOINT_COLUMNS}`;
|
|
110
|
+
const results = await this.prisma.$queryRawUnsafe(query, ...values);
|
|
111
|
+
return results[0] ?? null;
|
|
112
|
+
}
|
|
113
|
+
async deleteEndpoint(id) {
|
|
114
|
+
const result = await this.prisma.$executeRaw `
|
|
115
|
+
DELETE FROM webhook_endpoints WHERE id = ${id}::uuid`;
|
|
116
|
+
return result > 0;
|
|
117
|
+
}
|
|
118
|
+
async resetFailures(endpointId) {
|
|
119
|
+
await this.prisma.$executeRaw `
|
|
120
|
+
UPDATE webhook_endpoints
|
|
121
|
+
SET consecutive_failures = 0, active = true,
|
|
122
|
+
disabled_at = NULL, disabled_reason = NULL, updated_at = NOW()
|
|
123
|
+
WHERE id = ${endpointId}::uuid`;
|
|
124
|
+
}
|
|
125
|
+
async incrementFailures(endpointId) {
|
|
126
|
+
const [updated] = await this.prisma.$queryRaw `
|
|
127
|
+
UPDATE webhook_endpoints
|
|
128
|
+
SET consecutive_failures = consecutive_failures + 1, updated_at = NOW()
|
|
129
|
+
WHERE id = ${endpointId}::uuid
|
|
130
|
+
RETURNING consecutive_failures`;
|
|
131
|
+
return updated.consecutive_failures;
|
|
132
|
+
}
|
|
133
|
+
async disableEndpoint(endpointId, reason) {
|
|
134
|
+
await this.prisma.$executeRaw `
|
|
135
|
+
UPDATE webhook_endpoints
|
|
136
|
+
SET active = false, disabled_at = NOW(), disabled_reason = ${reason}, updated_at = NOW()
|
|
137
|
+
WHERE id = ${endpointId}::uuid AND active = true`;
|
|
138
|
+
}
|
|
139
|
+
async recoverEligibleEndpoints(cooldownMinutes) {
|
|
140
|
+
const cooldownInterval = `${cooldownMinutes} minutes`;
|
|
141
|
+
const recovered = await this.prisma.$queryRaw `
|
|
142
|
+
UPDATE webhook_endpoints
|
|
143
|
+
SET active = true, consecutive_failures = 0,
|
|
144
|
+
disabled_at = NULL, disabled_reason = NULL, updated_at = NOW()
|
|
145
|
+
WHERE active = false
|
|
146
|
+
AND disabled_at IS NOT NULL
|
|
147
|
+
AND disabled_at + ${cooldownInterval}::interval <= NOW()
|
|
148
|
+
RETURNING id`;
|
|
149
|
+
return recovered.length;
|
|
150
|
+
}
|
|
151
|
+
};
|
|
152
|
+
exports.PrismaEndpointRepository = PrismaEndpointRepository;
|
|
153
|
+
exports.PrismaEndpointRepository = PrismaEndpointRepository = __decorate([
|
|
154
|
+
(0, common_1.Injectable)(),
|
|
155
|
+
__metadata("design:paramtypes", [Object])
|
|
156
|
+
], PrismaEndpointRepository);
|
|
157
|
+
//# sourceMappingURL=prisma-endpoint.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-endpoint.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-endpoint.repository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WebhookEventRepository } from '../ports/webhook-event.repository';
|
|
2
|
+
export declare class PrismaEventRepository implements WebhookEventRepository {
|
|
3
|
+
private readonly prisma;
|
|
4
|
+
constructor(prisma: any);
|
|
5
|
+
saveEvent(eventType: string, payload: Record<string, unknown>, tenantId: string | null): Promise<string>;
|
|
6
|
+
saveEventInTransaction(tx: any, eventType: string, payload: Record<string, unknown>, tenantId: string | null): Promise<string>;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=prisma-event.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-event.repository.d.ts","sourceRoot":"","sources":["../../src/adapters/prisma-event.repository.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,qBACa,qBAAsB,YAAW,sBAAsB;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,GAAG;IAElC,SAAS,CACb,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC;IAQZ,sBAAsB,CAC1B,EAAE,EAAE,GAAG,EACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC;CAOnB"}
|
|
@@ -0,0 +1,39 @@
|
|
|
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.PrismaEventRepository = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
let PrismaEventRepository = class PrismaEventRepository {
|
|
15
|
+
prisma;
|
|
16
|
+
constructor(prisma) {
|
|
17
|
+
this.prisma = prisma;
|
|
18
|
+
}
|
|
19
|
+
async saveEvent(eventType, payload, tenantId) {
|
|
20
|
+
const [saved] = await this.prisma.$queryRaw `
|
|
21
|
+
INSERT INTO webhook_events (event_type, payload, tenant_id)
|
|
22
|
+
VALUES (${eventType}, ${JSON.stringify(payload)}::jsonb, ${tenantId})
|
|
23
|
+
RETURNING id`;
|
|
24
|
+
return saved.id;
|
|
25
|
+
}
|
|
26
|
+
async saveEventInTransaction(tx, eventType, payload, tenantId) {
|
|
27
|
+
const [saved] = await tx.$queryRaw `
|
|
28
|
+
INSERT INTO webhook_events (event_type, payload, tenant_id)
|
|
29
|
+
VALUES (${eventType}, ${JSON.stringify(payload)}::jsonb, ${tenantId})
|
|
30
|
+
RETURNING id`;
|
|
31
|
+
return saved.id;
|
|
32
|
+
}
|
|
33
|
+
};
|
|
34
|
+
exports.PrismaEventRepository = PrismaEventRepository;
|
|
35
|
+
exports.PrismaEventRepository = PrismaEventRepository = __decorate([
|
|
36
|
+
(0, common_1.Injectable)(),
|
|
37
|
+
__metadata("design:paramtypes", [Object])
|
|
38
|
+
], PrismaEventRepository);
|
|
39
|
+
//# sourceMappingURL=prisma-event.repository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma-event.repository.js","sourceRoot":"","sources":["../../src/adapters/prisma-event.repository.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAA4C;AAIrC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IACH;IAA7B,YAA6B,MAAW;QAAX,WAAM,GAAN,MAAM,CAAK;IAAG,CAAC;IAE5C,KAAK,CAAC,SAAS,CACb,SAAiB,EACjB,OAAgC,EAChC,QAAuB;QAEvB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,SAAS,CAAkB;;gBAEjD,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,QAAQ;mBACtD,CAAC;QAChB,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,sBAAsB,CAC1B,EAAO,EACP,SAAiB,EACjB,OAAgC,EAChC,QAAuB;QAEvB,MAAM,CAAC,KAAK,CAAC,GAAG,MAAM,EAAE,CAAC,SAAS,CAAkB;;gBAExC,SAAS,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,YAAY,QAAQ;mBACtD,CAAC;QAChB,OAAO,KAAK,CAAC,EAAE,CAAC;IAClB,CAAC;CACF,CAAA;AA3BY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;;GACA,qBAAqB,CA2BjC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
export { WebhookModule } from './webhook.module';
|
|
2
|
+
export { WebhookService } from './webhook.service';
|
|
3
|
+
export { WebhookDeliveryWorker } from './webhook.delivery-worker';
|
|
4
|
+
export { WebhookDispatcher } from './webhook.dispatcher';
|
|
5
|
+
export { WebhookRetryPolicy } from './webhook.retry-policy';
|
|
6
|
+
export { WebhookSigner, type SignatureHeaders } from './webhook.signer';
|
|
7
|
+
export { WebhookCircuitBreaker } from './webhook.circuit-breaker';
|
|
8
|
+
export { WebhookEvent } from './webhook.event';
|
|
9
|
+
export { WebhookEndpointAdminService } from './webhook.endpoint-admin.service';
|
|
10
|
+
export { WebhookDeliveryAdminService } from './webhook.delivery-admin.service';
|
|
11
|
+
/** @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService */
|
|
12
|
+
export { WebhookAdminService } from './webhook.admin.service';
|
|
13
|
+
export type { WebhookEventRepository } from './ports/webhook-event.repository';
|
|
14
|
+
export type { WebhookEndpointRepository } from './ports/webhook-endpoint.repository';
|
|
15
|
+
export type { WebhookDeliveryRepository, PendingDelivery, } from './ports/webhook-delivery.repository';
|
|
16
|
+
export type { WebhookHttpClient } from './ports/webhook-http-client';
|
|
17
|
+
export { PrismaEventRepository } from './adapters/prisma-event.repository';
|
|
18
|
+
export { PrismaEndpointRepository } from './adapters/prisma-endpoint.repository';
|
|
19
|
+
export { PrismaDeliveryRepository } from './adapters/prisma-delivery.repository';
|
|
20
|
+
export { FetchHttpClient } from './adapters/fetch-http-client';
|
|
21
|
+
export type { WebhookModuleOptions, WebhookModuleAsyncOptions, WebhookOptionsFactory, DeliveryOptions, CircuitBreakerOptions, PollingOptions, } from './interfaces/webhook-options.interface';
|
|
22
|
+
export type { EndpointRecord, EndpointRecordWithSecret, CreateEndpointDto, UpdateEndpointDto, } from './interfaces/webhook-endpoint.interface';
|
|
23
|
+
export type { DeliveryStatus, DeliveryRecord, EventRecord, DeliveryResult, DeliveryLogFilters, } from './interfaces/webhook-delivery.interface';
|
|
24
|
+
export { WEBHOOK_MODULE_OPTIONS, WEBHOOK_EVENT_REPOSITORY, WEBHOOK_ENDPOINT_REPOSITORY, WEBHOOK_DELIVERY_REPOSITORY, WEBHOOK_HTTP_CLIENT, DEFAULT_BACKOFF_SCHEDULE, DEFAULT_DELIVERY_TIMEOUT, DEFAULT_MAX_RETRIES, DEFAULT_POLLING_INTERVAL, DEFAULT_POLLING_BATCH_SIZE, DEFAULT_CIRCUIT_BREAKER_THRESHOLD, DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES, DEFAULT_STALE_SENDING_MINUTES, } from './webhook.constants';
|
|
25
|
+
export { validateWebhookUrl, resolveAndValidateHost } from './webhook.url-validator';
|
|
26
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAAE,aAAa,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AACxE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAG/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,kFAAkF;AAClF,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC;AAG9D,YAAY,EAAE,sBAAsB,EAAE,MAAM,kCAAkC,CAAC;AAC/E,YAAY,EAAE,yBAAyB,EAAE,MAAM,qCAAqC,CAAC;AACrF,YAAY,EACV,yBAAyB,EACzB,eAAe,GAChB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAGrE,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;AAG/D,YAAY,EACV,oBAAoB,EACpB,yBAAyB,EACzB,qBAAqB,EACrB,eAAe,EACf,qBAAqB,EACrB,cAAc,GACf,MAAM,wCAAwC,CAAC;AAGhD,YAAY,EACV,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EACjB,iBAAiB,GAClB,MAAM,yCAAyC,CAAC;AAEjD,YAAY,EACV,cAAc,EACd,cAAc,EACd,WAAW,EACX,cAAc,EACd,kBAAkB,GACnB,MAAM,yCAAyC,CAAC;AAGjD,OAAO,EACL,sBAAsB,EACtB,wBAAwB,EACxB,2BAA2B,EAC3B,2BAA2B,EAC3B,mBAAmB,EACnB,wBAAwB,EACxB,wBAAwB,EACxB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,iCAAiC,EACjC,wCAAwC,EACxC,6BAA6B,GAC9B,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.resolveAndValidateHost = exports.validateWebhookUrl = exports.DEFAULT_STALE_SENDING_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES = exports.DEFAULT_CIRCUIT_BREAKER_THRESHOLD = exports.DEFAULT_POLLING_BATCH_SIZE = exports.DEFAULT_POLLING_INTERVAL = exports.DEFAULT_MAX_RETRIES = exports.DEFAULT_DELIVERY_TIMEOUT = exports.DEFAULT_BACKOFF_SCHEDULE = exports.WEBHOOK_HTTP_CLIENT = exports.WEBHOOK_DELIVERY_REPOSITORY = exports.WEBHOOK_ENDPOINT_REPOSITORY = exports.WEBHOOK_EVENT_REPOSITORY = exports.WEBHOOK_MODULE_OPTIONS = exports.FetchHttpClient = exports.PrismaDeliveryRepository = exports.PrismaEndpointRepository = exports.PrismaEventRepository = exports.WebhookAdminService = exports.WebhookDeliveryAdminService = exports.WebhookEndpointAdminService = exports.WebhookEvent = exports.WebhookCircuitBreaker = exports.WebhookSigner = exports.WebhookRetryPolicy = exports.WebhookDispatcher = exports.WebhookDeliveryWorker = exports.WebhookService = exports.WebhookModule = void 0;
|
|
4
|
+
// Module
|
|
5
|
+
var webhook_module_1 = require("./webhook.module");
|
|
6
|
+
Object.defineProperty(exports, "WebhookModule", { enumerable: true, get: function () { return webhook_module_1.WebhookModule; } });
|
|
7
|
+
// Core services
|
|
8
|
+
var webhook_service_1 = require("./webhook.service");
|
|
9
|
+
Object.defineProperty(exports, "WebhookService", { enumerable: true, get: function () { return webhook_service_1.WebhookService; } });
|
|
10
|
+
var webhook_delivery_worker_1 = require("./webhook.delivery-worker");
|
|
11
|
+
Object.defineProperty(exports, "WebhookDeliveryWorker", { enumerable: true, get: function () { return webhook_delivery_worker_1.WebhookDeliveryWorker; } });
|
|
12
|
+
var webhook_dispatcher_1 = require("./webhook.dispatcher");
|
|
13
|
+
Object.defineProperty(exports, "WebhookDispatcher", { enumerable: true, get: function () { return webhook_dispatcher_1.WebhookDispatcher; } });
|
|
14
|
+
var webhook_retry_policy_1 = require("./webhook.retry-policy");
|
|
15
|
+
Object.defineProperty(exports, "WebhookRetryPolicy", { enumerable: true, get: function () { return webhook_retry_policy_1.WebhookRetryPolicy; } });
|
|
16
|
+
var webhook_signer_1 = require("./webhook.signer");
|
|
17
|
+
Object.defineProperty(exports, "WebhookSigner", { enumerable: true, get: function () { return webhook_signer_1.WebhookSigner; } });
|
|
18
|
+
var webhook_circuit_breaker_1 = require("./webhook.circuit-breaker");
|
|
19
|
+
Object.defineProperty(exports, "WebhookCircuitBreaker", { enumerable: true, get: function () { return webhook_circuit_breaker_1.WebhookCircuitBreaker; } });
|
|
20
|
+
var webhook_event_1 = require("./webhook.event");
|
|
21
|
+
Object.defineProperty(exports, "WebhookEvent", { enumerable: true, get: function () { return webhook_event_1.WebhookEvent; } });
|
|
22
|
+
// Admin services
|
|
23
|
+
var webhook_endpoint_admin_service_1 = require("./webhook.endpoint-admin.service");
|
|
24
|
+
Object.defineProperty(exports, "WebhookEndpointAdminService", { enumerable: true, get: function () { return webhook_endpoint_admin_service_1.WebhookEndpointAdminService; } });
|
|
25
|
+
var webhook_delivery_admin_service_1 = require("./webhook.delivery-admin.service");
|
|
26
|
+
Object.defineProperty(exports, "WebhookDeliveryAdminService", { enumerable: true, get: function () { return webhook_delivery_admin_service_1.WebhookDeliveryAdminService; } });
|
|
27
|
+
/** @deprecated Use WebhookEndpointAdminService and WebhookDeliveryAdminService */
|
|
28
|
+
var webhook_admin_service_1 = require("./webhook.admin.service");
|
|
29
|
+
Object.defineProperty(exports, "WebhookAdminService", { enumerable: true, get: function () { return webhook_admin_service_1.WebhookAdminService; } });
|
|
30
|
+
// Default adapters
|
|
31
|
+
var prisma_event_repository_1 = require("./adapters/prisma-event.repository");
|
|
32
|
+
Object.defineProperty(exports, "PrismaEventRepository", { enumerable: true, get: function () { return prisma_event_repository_1.PrismaEventRepository; } });
|
|
33
|
+
var prisma_endpoint_repository_1 = require("./adapters/prisma-endpoint.repository");
|
|
34
|
+
Object.defineProperty(exports, "PrismaEndpointRepository", { enumerable: true, get: function () { return prisma_endpoint_repository_1.PrismaEndpointRepository; } });
|
|
35
|
+
var prisma_delivery_repository_1 = require("./adapters/prisma-delivery.repository");
|
|
36
|
+
Object.defineProperty(exports, "PrismaDeliveryRepository", { enumerable: true, get: function () { return prisma_delivery_repository_1.PrismaDeliveryRepository; } });
|
|
37
|
+
var fetch_http_client_1 = require("./adapters/fetch-http-client");
|
|
38
|
+
Object.defineProperty(exports, "FetchHttpClient", { enumerable: true, get: function () { return fetch_http_client_1.FetchHttpClient; } });
|
|
39
|
+
// Constants & tokens
|
|
40
|
+
var webhook_constants_1 = require("./webhook.constants");
|
|
41
|
+
Object.defineProperty(exports, "WEBHOOK_MODULE_OPTIONS", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_MODULE_OPTIONS; } });
|
|
42
|
+
Object.defineProperty(exports, "WEBHOOK_EVENT_REPOSITORY", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_EVENT_REPOSITORY; } });
|
|
43
|
+
Object.defineProperty(exports, "WEBHOOK_ENDPOINT_REPOSITORY", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_ENDPOINT_REPOSITORY; } });
|
|
44
|
+
Object.defineProperty(exports, "WEBHOOK_DELIVERY_REPOSITORY", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_DELIVERY_REPOSITORY; } });
|
|
45
|
+
Object.defineProperty(exports, "WEBHOOK_HTTP_CLIENT", { enumerable: true, get: function () { return webhook_constants_1.WEBHOOK_HTTP_CLIENT; } });
|
|
46
|
+
Object.defineProperty(exports, "DEFAULT_BACKOFF_SCHEDULE", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_BACKOFF_SCHEDULE; } });
|
|
47
|
+
Object.defineProperty(exports, "DEFAULT_DELIVERY_TIMEOUT", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_DELIVERY_TIMEOUT; } });
|
|
48
|
+
Object.defineProperty(exports, "DEFAULT_MAX_RETRIES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_MAX_RETRIES; } });
|
|
49
|
+
Object.defineProperty(exports, "DEFAULT_POLLING_INTERVAL", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_POLLING_INTERVAL; } });
|
|
50
|
+
Object.defineProperty(exports, "DEFAULT_POLLING_BATCH_SIZE", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_POLLING_BATCH_SIZE; } });
|
|
51
|
+
Object.defineProperty(exports, "DEFAULT_CIRCUIT_BREAKER_THRESHOLD", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_THRESHOLD; } });
|
|
52
|
+
Object.defineProperty(exports, "DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_CIRCUIT_BREAKER_COOLDOWN_MINUTES; } });
|
|
53
|
+
Object.defineProperty(exports, "DEFAULT_STALE_SENDING_MINUTES", { enumerable: true, get: function () { return webhook_constants_1.DEFAULT_STALE_SENDING_MINUTES; } });
|
|
54
|
+
var webhook_url_validator_1 = require("./webhook.url-validator");
|
|
55
|
+
Object.defineProperty(exports, "validateWebhookUrl", { enumerable: true, get: function () { return webhook_url_validator_1.validateWebhookUrl; } });
|
|
56
|
+
Object.defineProperty(exports, "resolveAndValidateHost", { enumerable: true, get: function () { return webhook_url_validator_1.resolveAndValidateHost; } });
|
|
57
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,SAAS;AACT,mDAAiD;AAAxC,+GAAA,aAAa,OAAA;AAEtB,gBAAgB;AAChB,qDAAmD;AAA1C,iHAAA,cAAc,OAAA;AACvB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,2DAAyD;AAAhD,uHAAA,iBAAiB,OAAA;AAC1B,+DAA4D;AAAnD,0HAAA,kBAAkB,OAAA;AAC3B,mDAAwE;AAA/D,+GAAA,aAAa,OAAA;AACtB,qEAAkE;AAAzD,gIAAA,qBAAqB,OAAA;AAC9B,iDAA+C;AAAtC,6GAAA,YAAY,OAAA;AAErB,iBAAiB;AACjB,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,mFAA+E;AAAtE,6IAAA,2BAA2B,OAAA;AACpC,kFAAkF;AAClF,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA;AAW5B,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;AA4BxB,qBAAqB;AACrB,yDAc6B;AAb3B,2HAAA,sBAAsB,OAAA;AACtB,6HAAA,wBAAwB,OAAA;AACxB,gIAAA,2BAA2B,OAAA;AAC3B,gIAAA,2BAA2B,OAAA;AAC3B,wHAAA,mBAAmB,OAAA;AACnB,6HAAA,wBAAwB,OAAA;AACxB,6HAAA,wBAAwB,OAAA;AACxB,wHAAA,mBAAmB,OAAA;AACnB,6HAAA,wBAAwB,OAAA;AACxB,+HAAA,0BAA0B,OAAA;AAC1B,sIAAA,iCAAiC,OAAA;AACjC,6IAAA,wCAAwC,OAAA;AACxC,kIAAA,6BAA6B,OAAA;AAG/B,iEAAqF;AAA5E,2HAAA,kBAAkB,OAAA;AAAE,+HAAA,sBAAsB,OAAA"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type DeliveryStatus = 'PENDING' | 'SENDING' | 'SENT' | 'FAILED';
|
|
2
|
+
export interface DeliveryRecord {
|
|
3
|
+
id: string;
|
|
4
|
+
eventId: string;
|
|
5
|
+
endpointId: string;
|
|
6
|
+
status: DeliveryStatus;
|
|
7
|
+
attempts: number;
|
|
8
|
+
maxAttempts: number;
|
|
9
|
+
nextAttemptAt: Date | null;
|
|
10
|
+
lastAttemptAt: Date | null;
|
|
11
|
+
completedAt: Date | null;
|
|
12
|
+
responseStatus: number | null;
|
|
13
|
+
responseBody: string | null;
|
|
14
|
+
latencyMs: number | null;
|
|
15
|
+
lastError: string | null;
|
|
16
|
+
}
|
|
17
|
+
export interface EventRecord {
|
|
18
|
+
id: string;
|
|
19
|
+
eventType: string;
|
|
20
|
+
payload: Record<string, unknown>;
|
|
21
|
+
tenantId: string | null;
|
|
22
|
+
createdAt: Date;
|
|
23
|
+
}
|
|
24
|
+
export interface DeliveryResult {
|
|
25
|
+
success: boolean;
|
|
26
|
+
statusCode?: number;
|
|
27
|
+
body?: string;
|
|
28
|
+
latencyMs: number;
|
|
29
|
+
error?: string;
|
|
30
|
+
}
|
|
31
|
+
export interface DeliveryLogFilters {
|
|
32
|
+
status?: DeliveryStatus;
|
|
33
|
+
eventType?: string;
|
|
34
|
+
since?: Date;
|
|
35
|
+
until?: Date;
|
|
36
|
+
limit?: number;
|
|
37
|
+
offset?: number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=webhook-delivery.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-delivery.interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,SAAS,GAAG,MAAM,GAAG,QAAQ,CAAC;AAEvE,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,cAAc,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,aAAa,EAAE,IAAI,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,IAAI,GAAG,IAAI,CAAC;IACzB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,MAAM,WAAW,WAAW;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,kBAAkB;IACjC,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,IAAI,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery.interface.js","sourceRoot":"","sources":["../../src/interfaces/webhook-delivery.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export interface EndpointRecord {
|
|
2
|
+
id: string;
|
|
3
|
+
url: string;
|
|
4
|
+
events: string[];
|
|
5
|
+
active: boolean;
|
|
6
|
+
description: string | null;
|
|
7
|
+
metadata: Record<string, unknown> | null;
|
|
8
|
+
tenantId: string | null;
|
|
9
|
+
consecutiveFailures: number;
|
|
10
|
+
disabledAt: Date | null;
|
|
11
|
+
disabledReason: string | null;
|
|
12
|
+
createdAt: Date;
|
|
13
|
+
updatedAt: Date;
|
|
14
|
+
}
|
|
15
|
+
/** Internal record that includes the signing secret. Only used for endpoint creation response and delivery enrichment. */
|
|
16
|
+
export interface EndpointRecordWithSecret extends EndpointRecord {
|
|
17
|
+
secret: string;
|
|
18
|
+
}
|
|
19
|
+
export interface CreateEndpointDto {
|
|
20
|
+
url: string;
|
|
21
|
+
events: string[];
|
|
22
|
+
secret?: string | 'auto';
|
|
23
|
+
description?: string;
|
|
24
|
+
metadata?: Record<string, unknown>;
|
|
25
|
+
tenantId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface UpdateEndpointDto {
|
|
28
|
+
url?: string;
|
|
29
|
+
events?: string[];
|
|
30
|
+
description?: string;
|
|
31
|
+
metadata?: Record<string, unknown>;
|
|
32
|
+
active?: boolean;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=webhook-endpoint.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-endpoint.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-endpoint.interface.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;IACzC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,mBAAmB,EAAE,MAAM,CAAC;IAC5B,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACjB;AAED,0HAA0H;AAC1H,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACnC,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-endpoint.interface.js","sourceRoot":"","sources":["../../src/interfaces/webhook-endpoint.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { ModuleMetadata, Type } from '@nestjs/common';
|
|
2
|
+
import { WebhookEventRepository } from '../ports/webhook-event.repository';
|
|
3
|
+
import { WebhookEndpointRepository } from '../ports/webhook-endpoint.repository';
|
|
4
|
+
import { WebhookDeliveryRepository } from '../ports/webhook-delivery.repository';
|
|
5
|
+
import { WebhookHttpClient } from '../ports/webhook-http-client';
|
|
6
|
+
export interface DeliveryOptions {
|
|
7
|
+
timeout?: number;
|
|
8
|
+
maxRetries?: number;
|
|
9
|
+
backoff?: 'exponential';
|
|
10
|
+
jitter?: boolean;
|
|
11
|
+
}
|
|
12
|
+
export interface CircuitBreakerOptions {
|
|
13
|
+
failureThreshold?: number;
|
|
14
|
+
cooldownMinutes?: number;
|
|
15
|
+
}
|
|
16
|
+
export interface PollingOptions {
|
|
17
|
+
interval?: number;
|
|
18
|
+
batchSize?: number;
|
|
19
|
+
/** Minutes before a SENDING delivery is considered stale and reset to PENDING. Default: 5 */
|
|
20
|
+
staleSendingMinutes?: number;
|
|
21
|
+
}
|
|
22
|
+
export interface WebhookModuleOptions {
|
|
23
|
+
/** PrismaClient instance — used by default Prisma adapters. Not needed if all custom repositories are provided. */
|
|
24
|
+
prisma?: any;
|
|
25
|
+
delivery?: DeliveryOptions;
|
|
26
|
+
circuitBreaker?: CircuitBreakerOptions;
|
|
27
|
+
polling?: PollingOptions;
|
|
28
|
+
/** Allow private/internal URLs for endpoints. Only enable in development/testing. Default: false */
|
|
29
|
+
allowPrivateUrls?: boolean;
|
|
30
|
+
/** Custom port overrides — provide these to replace default Prisma/fetch adapters. */
|
|
31
|
+
eventRepository?: WebhookEventRepository;
|
|
32
|
+
endpointRepository?: WebhookEndpointRepository;
|
|
33
|
+
deliveryRepository?: WebhookDeliveryRepository;
|
|
34
|
+
httpClient?: WebhookHttpClient;
|
|
35
|
+
}
|
|
36
|
+
export interface WebhookOptionsFactory {
|
|
37
|
+
createWebhookOptions(): Promise<WebhookModuleOptions> | WebhookModuleOptions;
|
|
38
|
+
}
|
|
39
|
+
export interface WebhookModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
|
|
40
|
+
useFactory?: (...args: any[]) => Promise<WebhookModuleOptions> | WebhookModuleOptions;
|
|
41
|
+
inject?: any[];
|
|
42
|
+
useClass?: Type<WebhookOptionsFactory>;
|
|
43
|
+
useExisting?: Type<WebhookOptionsFactory>;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=webhook-options.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-options.interface.d.ts","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtD,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;AAEjE,MAAM,WAAW,eAAe;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,aAAa,CAAC;IACxB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,qBAAqB;IACpC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,mBAAmB,CAAC,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,mHAAmH;IACnH,MAAM,CAAC,EAAE,GAAG,CAAC;IACb,QAAQ,CAAC,EAAE,eAAe,CAAC;IAC3B,cAAc,CAAC,EAAE,qBAAqB,CAAC;IACvC,OAAO,CAAC,EAAE,cAAc,CAAC;IACzB,oGAAoG;IACpG,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,sFAAsF;IACtF,eAAe,CAAC,EAAE,sBAAsB,CAAC;IACzC,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,kBAAkB,CAAC,EAAE,yBAAyB,CAAC;IAC/C,UAAU,CAAC,EAAE,iBAAiB,CAAC;CAChC;AAED,MAAM,WAAW,qBAAqB;IACpC,oBAAoB,IAAI,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;CAC9E;AAED,MAAM,WAAW,yBAA0B,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IAChF,UAAU,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,oBAAoB,CAAC,GAAG,oBAAoB,CAAC;IACtF,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC;IACf,QAAQ,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,IAAI,CAAC,qBAAqB,CAAC,CAAC;CAC3C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-options.interface.js","sourceRoot":"","sources":["../../src/interfaces/webhook-options.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { DeliveryLogFilters, DeliveryRecord, DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
2
|
+
export interface PendingDelivery {
|
|
3
|
+
id: string;
|
|
4
|
+
event_id: string;
|
|
5
|
+
endpoint_id: string;
|
|
6
|
+
attempts: number;
|
|
7
|
+
max_attempts: number;
|
|
8
|
+
url: string;
|
|
9
|
+
secret: string;
|
|
10
|
+
event_type: string;
|
|
11
|
+
payload: Record<string, unknown>;
|
|
12
|
+
}
|
|
13
|
+
export interface WebhookDeliveryRepository {
|
|
14
|
+
createDeliveriesInTransaction(tx: unknown, eventId: string, endpointIds: string[], maxAttempts: number): Promise<void>;
|
|
15
|
+
runInTransaction<T>(fn: (tx: unknown) => Promise<T>): Promise<T>;
|
|
16
|
+
claimPendingDeliveries(batchSize: number): Promise<PendingDelivery[]>;
|
|
17
|
+
enrichDeliveries(deliveryIds: string[]): Promise<PendingDelivery[]>;
|
|
18
|
+
markSent(deliveryId: string, attempts: number, result: DeliveryResult): Promise<void>;
|
|
19
|
+
markFailed(deliveryId: string, attempts: number, result: DeliveryResult): Promise<void>;
|
|
20
|
+
markRetry(deliveryId: string, attempts: number, nextAt: Date, result: DeliveryResult): Promise<void>;
|
|
21
|
+
recoverStaleSending(stalenessMinutes: number): Promise<number>;
|
|
22
|
+
getDeliveryLogs(endpointId: string, filters?: DeliveryLogFilters): Promise<DeliveryRecord[]>;
|
|
23
|
+
retryDelivery(deliveryId: string): Promise<boolean>;
|
|
24
|
+
createTestDelivery(eventId: string, endpointId: string): Promise<void>;
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=webhook-delivery.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-delivery.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,cAAc,EACd,cAAc,EACf,MAAM,0CAA0C,CAAC;AAElD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACxC,6BAA6B,CAC3B,EAAE,EAAE,OAAO,EACX,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,EAAE,EACrB,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjB,gBAAgB,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,OAAO,KAAK,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;IAEjE,sBAAsB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IACtE,gBAAgB,CAAC,WAAW,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAAC;IAEpE,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACtF,UAAU,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACxF,SAAS,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAErG,mBAAmB,CAAC,gBAAgB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IAC/D,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC7F,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACpD,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACxE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-delivery.repository.js","sourceRoot":"","sources":["../../src/ports/webhook-delivery.repository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { EndpointRecord, EndpointRecordWithSecret, UpdateEndpointDto } from '../interfaces/webhook-endpoint.interface';
|
|
2
|
+
export interface WebhookEndpointRepository {
|
|
3
|
+
findMatchingEndpoints(eventType: string, tenantId: string | undefined): Promise<EndpointRecord[]>;
|
|
4
|
+
findMatchingEndpointsInTransaction(tx: unknown, eventType: string, tenantId: string | undefined): Promise<EndpointRecord[]>;
|
|
5
|
+
createEndpoint(url: string, secret: string, events: string[], description: string | null, metadata: Record<string, unknown> | null, tenantId: string | null): Promise<EndpointRecordWithSecret>;
|
|
6
|
+
getEndpoint(id: string): Promise<EndpointRecord | null>;
|
|
7
|
+
listEndpoints(tenantId?: string): Promise<EndpointRecord[]>;
|
|
8
|
+
updateEndpoint(id: string, dto: UpdateEndpointDto): Promise<EndpointRecord | null>;
|
|
9
|
+
deleteEndpoint(id: string): Promise<boolean>;
|
|
10
|
+
resetFailures(endpointId: string): Promise<void>;
|
|
11
|
+
incrementFailures(endpointId: string): Promise<number>;
|
|
12
|
+
disableEndpoint(endpointId: string, reason: string): Promise<void>;
|
|
13
|
+
recoverEligibleEndpoints(cooldownMinutes: number): Promise<number>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=webhook-endpoint.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-endpoint.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-endpoint.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,wBAAwB,EACxB,iBAAiB,EAClB,MAAM,0CAA0C,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,qBAAqB,CACnB,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE7B,kCAAkC,CAChC,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GAAG,SAAS,GAC3B,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAE7B,cAAc,CACZ,GAAG,EAAE,MAAM,EACX,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,MAAM,EAAE,EAChB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,EACxC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAErC,WAAW,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACxD,aAAa,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;IAC5D,cAAc,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACnF,cAAc,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IAE7C,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjD,iBAAiB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACvD,eAAe,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACnE,wBAAwB,CAAC,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;CACpE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-endpoint.repository.js","sourceRoot":"","sources":["../../src/ports/webhook-endpoint.repository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export interface WebhookEventRepository {
|
|
2
|
+
saveEvent(eventType: string, payload: Record<string, unknown>, tenantId: string | null): Promise<string>;
|
|
3
|
+
saveEventInTransaction(tx: unknown, eventType: string, payload: Record<string, unknown>, tenantId: string | null): Promise<string>;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=webhook-event.repository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-event.repository.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-event.repository.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,sBAAsB;IACrC,SAAS,CACP,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC,CAAC;IAEnB,sBAAsB,CACpB,EAAE,EAAE,OAAO,EACX,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,QAAQ,EAAE,MAAM,GAAG,IAAI,GACtB,OAAO,CAAC,MAAM,CAAC,CAAC;CACpB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-event.repository.js","sourceRoot":"","sources":["../../src/ports/webhook-event.repository.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { DeliveryResult } from '../interfaces/webhook-delivery.interface';
|
|
2
|
+
export interface WebhookHttpClient {
|
|
3
|
+
post(url: string, headers: Record<string, string>, body: string, timeout: number): Promise<DeliveryResult>;
|
|
4
|
+
}
|
|
5
|
+
//# sourceMappingURL=webhook-http-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-http-client.d.ts","sourceRoot":"","sources":["../../src/ports/webhook-http-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAE1E,MAAM,WAAW,iBAAiB;IAChC,IAAI,CACF,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC/B,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,cAAc,CAAC,CAAC;CAC5B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"webhook-http-client.js","sourceRoot":"","sources":["../../src/ports/webhook-http-client.ts"],"names":[],"mappings":""}
|