@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.
Files changed (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +281 -0
  3. package/dist/adapters/fetch-http-client.d.ts +6 -0
  4. package/dist/adapters/fetch-http-client.d.ts.map +1 -0
  5. package/dist/adapters/fetch-http-client.js +56 -0
  6. package/dist/adapters/fetch-http-client.js.map +1 -0
  7. package/dist/adapters/prisma-delivery.repository.d.ts +18 -0
  8. package/dist/adapters/prisma-delivery.repository.d.ts.map +1 -0
  9. package/dist/adapters/prisma-delivery.repository.js +162 -0
  10. package/dist/adapters/prisma-delivery.repository.js.map +1 -0
  11. package/dist/adapters/prisma-endpoint.repository.d.ts +18 -0
  12. package/dist/adapters/prisma-endpoint.repository.d.ts.map +1 -0
  13. package/dist/adapters/prisma-endpoint.repository.js +157 -0
  14. package/dist/adapters/prisma-endpoint.repository.js.map +1 -0
  15. package/dist/adapters/prisma-event.repository.d.ts +8 -0
  16. package/dist/adapters/prisma-event.repository.d.ts.map +1 -0
  17. package/dist/adapters/prisma-event.repository.js +39 -0
  18. package/dist/adapters/prisma-event.repository.js.map +1 -0
  19. package/dist/index.d.ts +26 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +57 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/interfaces/webhook-delivery.interface.d.ts +39 -0
  24. package/dist/interfaces/webhook-delivery.interface.d.ts.map +1 -0
  25. package/dist/interfaces/webhook-delivery.interface.js +3 -0
  26. package/dist/interfaces/webhook-delivery.interface.js.map +1 -0
  27. package/dist/interfaces/webhook-endpoint.interface.d.ts +34 -0
  28. package/dist/interfaces/webhook-endpoint.interface.d.ts.map +1 -0
  29. package/dist/interfaces/webhook-endpoint.interface.js +3 -0
  30. package/dist/interfaces/webhook-endpoint.interface.js.map +1 -0
  31. package/dist/interfaces/webhook-options.interface.d.ts +45 -0
  32. package/dist/interfaces/webhook-options.interface.d.ts.map +1 -0
  33. package/dist/interfaces/webhook-options.interface.js +3 -0
  34. package/dist/interfaces/webhook-options.interface.js.map +1 -0
  35. package/dist/ports/webhook-delivery.repository.d.ts +26 -0
  36. package/dist/ports/webhook-delivery.repository.d.ts.map +1 -0
  37. package/dist/ports/webhook-delivery.repository.js +3 -0
  38. package/dist/ports/webhook-delivery.repository.js.map +1 -0
  39. package/dist/ports/webhook-endpoint.repository.d.ts +15 -0
  40. package/dist/ports/webhook-endpoint.repository.d.ts.map +1 -0
  41. package/dist/ports/webhook-endpoint.repository.js +3 -0
  42. package/dist/ports/webhook-endpoint.repository.js.map +1 -0
  43. package/dist/ports/webhook-event.repository.d.ts +5 -0
  44. package/dist/ports/webhook-event.repository.d.ts.map +1 -0
  45. package/dist/ports/webhook-event.repository.js +3 -0
  46. package/dist/ports/webhook-event.repository.js.map +1 -0
  47. package/dist/ports/webhook-http-client.d.ts +5 -0
  48. package/dist/ports/webhook-http-client.d.ts.map +1 -0
  49. package/dist/ports/webhook-http-client.js +3 -0
  50. package/dist/ports/webhook-http-client.js.map +1 -0
  51. package/dist/webhook.admin.service.d.ts +22 -0
  52. package/dist/webhook.admin.service.d.ts.map +1 -0
  53. package/dist/webhook.admin.service.js +58 -0
  54. package/dist/webhook.admin.service.js.map +1 -0
  55. package/dist/webhook.circuit-breaker.d.ts +12 -0
  56. package/dist/webhook.circuit-breaker.d.ts.map +1 -0
  57. package/dist/webhook.circuit-breaker.js +58 -0
  58. package/dist/webhook.circuit-breaker.js.map +1 -0
  59. package/dist/webhook.constants.d.ts +17 -0
  60. package/dist/webhook.constants.d.ts.map +1 -0
  61. package/dist/webhook.constants.js +26 -0
  62. package/dist/webhook.constants.js.map +1 -0
  63. package/dist/webhook.delivery-admin.service.d.ts +9 -0
  64. package/dist/webhook.delivery-admin.service.d.ts.map +1 -0
  65. package/dist/webhook.delivery-admin.service.js +36 -0
  66. package/dist/webhook.delivery-admin.service.js.map +1 -0
  67. package/dist/webhook.delivery-worker.d.ts +23 -0
  68. package/dist/webhook.delivery-worker.d.ts.map +1 -0
  69. package/dist/webhook.delivery-worker.js +141 -0
  70. package/dist/webhook.delivery-worker.js.map +1 -0
  71. package/dist/webhook.dispatcher.d.ts +14 -0
  72. package/dist/webhook.dispatcher.d.ts.map +1 -0
  73. package/dist/webhook.dispatcher.js +54 -0
  74. package/dist/webhook.dispatcher.js.map +1 -0
  75. package/dist/webhook.endpoint-admin.service.d.ts +23 -0
  76. package/dist/webhook.endpoint-admin.service.d.ts.map +1 -0
  77. package/dist/webhook.endpoint-admin.service.js +97 -0
  78. package/dist/webhook.endpoint-admin.service.js.map +1 -0
  79. package/dist/webhook.event.d.ts +6 -0
  80. package/dist/webhook.event.d.ts.map +1 -0
  81. package/dist/webhook.event.js +22 -0
  82. package/dist/webhook.event.js.map +1 -0
  83. package/dist/webhook.module.d.ts +15 -0
  84. package/dist/webhook.module.d.ts.map +1 -0
  85. package/dist/webhook.module.js +176 -0
  86. package/dist/webhook.module.js.map +1 -0
  87. package/dist/webhook.retry-policy.d.ts +7 -0
  88. package/dist/webhook.retry-policy.d.ts.map +1 -0
  89. package/dist/webhook.retry-policy.js +38 -0
  90. package/dist/webhook.retry-policy.js.map +1 -0
  91. package/dist/webhook.service.d.ts +17 -0
  92. package/dist/webhook.service.d.ts.map +1 -0
  93. package/dist/webhook.service.js +63 -0
  94. package/dist/webhook.service.js.map +1 -0
  95. package/dist/webhook.signer.d.ts +12 -0
  96. package/dist/webhook.signer.d.ts.map +1 -0
  97. package/dist/webhook.signer.js +75 -0
  98. package/dist/webhook.signer.js.map +1 -0
  99. package/dist/webhook.url-validator.d.ts +3 -0
  100. package/dist/webhook.url-validator.d.ts.map +1 -0
  101. package/dist/webhook.url-validator.js +156 -0
  102. package/dist/webhook.url-validator.js.map +1 -0
  103. package/package.json +61 -0
  104. 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"}
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-delivery.interface.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-endpoint.interface.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-options.interface.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-delivery.repository.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-endpoint.repository.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-event.repository.js.map
@@ -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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=webhook-http-client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"webhook-http-client.js","sourceRoot":"","sources":["../../src/ports/webhook-http-client.ts"],"names":[],"mappings":""}