@webhook-platform/node 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +252 -0
- package/dist/__tests__/client.test.d.ts +1 -0
- package/dist/__tests__/client.test.js +79 -0
- package/dist/__tests__/webhooks.test.d.ts +1 -0
- package/dist/__tests__/webhooks.test.js +162 -0
- package/dist/client.d.ts +48 -0
- package/dist/client.js +229 -0
- package/dist/errors.d.ts +21 -0
- package/dist/errors.js +46 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.js +29 -0
- package/dist/types.d.ts +102 -0
- package/dist/types.js +3 -0
- package/dist/webhooks.d.ts +38 -0
- package/dist/webhooks.js +138 -0
- package/package.json +42 -0
package/dist/client.js
ADDED
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.WebhookPlatform = void 0;
|
|
37
|
+
const https = __importStar(require("https"));
|
|
38
|
+
const http = __importStar(require("http"));
|
|
39
|
+
const url_1 = require("url");
|
|
40
|
+
const errors_1 = require("./errors");
|
|
41
|
+
const DEFAULT_BASE_URL = 'http://localhost:8080';
|
|
42
|
+
const DEFAULT_TIMEOUT = 30000;
|
|
43
|
+
const SDK_VERSION = '1.0.0';
|
|
44
|
+
class WebhookPlatform {
|
|
45
|
+
constructor(config) {
|
|
46
|
+
if (!config.apiKey) {
|
|
47
|
+
throw new Error('API key is required');
|
|
48
|
+
}
|
|
49
|
+
this.apiKey = config.apiKey;
|
|
50
|
+
this.baseUrl = config.baseUrl || DEFAULT_BASE_URL;
|
|
51
|
+
this.timeout = config.timeout || DEFAULT_TIMEOUT;
|
|
52
|
+
this.events = new Events(this);
|
|
53
|
+
this.endpoints = new Endpoints(this);
|
|
54
|
+
this.subscriptions = new Subscriptions(this);
|
|
55
|
+
this.deliveries = new Deliveries(this);
|
|
56
|
+
}
|
|
57
|
+
async request(method, path, body, idempotencyKey) {
|
|
58
|
+
const url = new url_1.URL(path, this.baseUrl);
|
|
59
|
+
const isHttps = url.protocol === 'https:';
|
|
60
|
+
const lib = isHttps ? https : http;
|
|
61
|
+
const headers = {
|
|
62
|
+
'X-API-Key': this.apiKey,
|
|
63
|
+
'Content-Type': 'application/json',
|
|
64
|
+
'User-Agent': `webhook-platform-node/${SDK_VERSION}`,
|
|
65
|
+
};
|
|
66
|
+
if (idempotencyKey) {
|
|
67
|
+
headers['Idempotency-Key'] = idempotencyKey;
|
|
68
|
+
}
|
|
69
|
+
const options = {
|
|
70
|
+
method,
|
|
71
|
+
hostname: url.hostname,
|
|
72
|
+
port: url.port || (isHttps ? 443 : 80),
|
|
73
|
+
path: url.pathname + url.search,
|
|
74
|
+
headers,
|
|
75
|
+
timeout: this.timeout,
|
|
76
|
+
};
|
|
77
|
+
return new Promise((resolve, reject) => {
|
|
78
|
+
const req = lib.request(options, (res) => {
|
|
79
|
+
let data = '';
|
|
80
|
+
res.on('data', (chunk) => (data += chunk));
|
|
81
|
+
res.on('end', () => {
|
|
82
|
+
try {
|
|
83
|
+
const rateLimitInfo = this.extractRateLimitInfo(res.headers);
|
|
84
|
+
if (res.statusCode === 204) {
|
|
85
|
+
resolve(undefined);
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
const parsed = data ? JSON.parse(data) : {};
|
|
89
|
+
if (res.statusCode && res.statusCode >= 400) {
|
|
90
|
+
reject(this.handleError(res.statusCode, parsed, rateLimitInfo));
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
resolve(parsed);
|
|
94
|
+
}
|
|
95
|
+
catch (err) {
|
|
96
|
+
reject(new errors_1.WebhookPlatformError('Failed to parse response', 500));
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
req.on('error', (err) => {
|
|
101
|
+
reject(new errors_1.WebhookPlatformError(err.message, 0, 'network_error'));
|
|
102
|
+
});
|
|
103
|
+
req.on('timeout', () => {
|
|
104
|
+
req.destroy();
|
|
105
|
+
reject(new errors_1.WebhookPlatformError('Request timeout', 0, 'timeout'));
|
|
106
|
+
});
|
|
107
|
+
if (body) {
|
|
108
|
+
req.write(JSON.stringify(body));
|
|
109
|
+
}
|
|
110
|
+
req.end();
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
extractRateLimitInfo(headers) {
|
|
114
|
+
const limit = headers['x-ratelimit-limit'];
|
|
115
|
+
const remaining = headers['x-ratelimit-remaining'];
|
|
116
|
+
const reset = headers['x-ratelimit-reset'];
|
|
117
|
+
if (limit && remaining && reset) {
|
|
118
|
+
return {
|
|
119
|
+
limit: parseInt(limit, 10),
|
|
120
|
+
remaining: parseInt(remaining, 10),
|
|
121
|
+
reset: parseInt(reset, 10),
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
handleError(status, body, rateLimitInfo) {
|
|
127
|
+
const message = body.message || 'Unknown error';
|
|
128
|
+
switch (status) {
|
|
129
|
+
case 401:
|
|
130
|
+
return new errors_1.AuthenticationError(message);
|
|
131
|
+
case 404:
|
|
132
|
+
return new errors_1.NotFoundError(message);
|
|
133
|
+
case 429:
|
|
134
|
+
return new errors_1.RateLimitError(message, rateLimitInfo || { limit: 0, remaining: 0, reset: Date.now() + 60000 });
|
|
135
|
+
case 400:
|
|
136
|
+
return new errors_1.ValidationError(message, body.fieldErrors || {});
|
|
137
|
+
default:
|
|
138
|
+
return new errors_1.WebhookPlatformError(message, status, body.error);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
exports.WebhookPlatform = WebhookPlatform;
|
|
143
|
+
class Events {
|
|
144
|
+
constructor(client) {
|
|
145
|
+
this.client = client;
|
|
146
|
+
}
|
|
147
|
+
async send(event, idempotencyKey) {
|
|
148
|
+
return this.client.request('POST', '/api/v1/events', event, idempotencyKey);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
class Endpoints {
|
|
152
|
+
constructor(client) {
|
|
153
|
+
this.client = client;
|
|
154
|
+
}
|
|
155
|
+
async create(projectId, params) {
|
|
156
|
+
return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints`, params);
|
|
157
|
+
}
|
|
158
|
+
async get(projectId, endpointId) {
|
|
159
|
+
return this.client.request('GET', `/api/v1/projects/${projectId}/endpoints/${endpointId}`);
|
|
160
|
+
}
|
|
161
|
+
async list(projectId) {
|
|
162
|
+
return this.client.request('GET', `/api/v1/projects/${projectId}/endpoints`);
|
|
163
|
+
}
|
|
164
|
+
async update(projectId, endpointId, params) {
|
|
165
|
+
return this.client.request('PUT', `/api/v1/projects/${projectId}/endpoints/${endpointId}`, params);
|
|
166
|
+
}
|
|
167
|
+
async delete(projectId, endpointId) {
|
|
168
|
+
return this.client.request('DELETE', `/api/v1/projects/${projectId}/endpoints/${endpointId}`);
|
|
169
|
+
}
|
|
170
|
+
async rotateSecret(projectId, endpointId) {
|
|
171
|
+
return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints/${endpointId}/rotate-secret`);
|
|
172
|
+
}
|
|
173
|
+
async test(projectId, endpointId) {
|
|
174
|
+
return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints/${endpointId}/test`);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
class Subscriptions {
|
|
178
|
+
constructor(client) {
|
|
179
|
+
this.client = client;
|
|
180
|
+
}
|
|
181
|
+
async create(projectId, params) {
|
|
182
|
+
return this.client.request('POST', `/api/v1/projects/${projectId}/subscriptions`, params);
|
|
183
|
+
}
|
|
184
|
+
async get(projectId, subscriptionId) {
|
|
185
|
+
return this.client.request('GET', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`);
|
|
186
|
+
}
|
|
187
|
+
async list(projectId) {
|
|
188
|
+
return this.client.request('GET', `/api/v1/projects/${projectId}/subscriptions`);
|
|
189
|
+
}
|
|
190
|
+
async update(projectId, subscriptionId, params) {
|
|
191
|
+
return this.client.request('PUT', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`, params);
|
|
192
|
+
}
|
|
193
|
+
async delete(projectId, subscriptionId) {
|
|
194
|
+
return this.client.request('DELETE', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
class Deliveries {
|
|
198
|
+
constructor(client) {
|
|
199
|
+
this.client = client;
|
|
200
|
+
}
|
|
201
|
+
async get(deliveryId) {
|
|
202
|
+
return this.client.request('GET', `/api/v1/deliveries/${deliveryId}`);
|
|
203
|
+
}
|
|
204
|
+
async list(projectId, params = {}) {
|
|
205
|
+
const query = new URLSearchParams();
|
|
206
|
+
if (params.status)
|
|
207
|
+
query.set('status', params.status);
|
|
208
|
+
if (params.endpointId)
|
|
209
|
+
query.set('endpointId', params.endpointId);
|
|
210
|
+
if (params.fromDate)
|
|
211
|
+
query.set('fromDate', params.fromDate);
|
|
212
|
+
if (params.toDate)
|
|
213
|
+
query.set('toDate', params.toDate);
|
|
214
|
+
if (params.page !== undefined)
|
|
215
|
+
query.set('page', params.page.toString());
|
|
216
|
+
if (params.size !== undefined)
|
|
217
|
+
query.set('size', params.size.toString());
|
|
218
|
+
const queryString = query.toString();
|
|
219
|
+
const path = `/api/v1/deliveries/projects/${projectId}${queryString ? `?${queryString}` : ''}`;
|
|
220
|
+
return this.client.request('GET', path);
|
|
221
|
+
}
|
|
222
|
+
async getAttempts(deliveryId) {
|
|
223
|
+
return this.client.request('GET', `/api/v1/deliveries/${deliveryId}/attempts`);
|
|
224
|
+
}
|
|
225
|
+
async replay(deliveryId) {
|
|
226
|
+
return this.client.request('POST', `/api/v1/deliveries/${deliveryId}/replay`);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFDL0IsMkNBQTZCO0FBQzdCLDZCQUEwQjtBQWlCMUIscUNBTWtCO0FBRWxCLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUM7QUFDakQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQzlCLE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQztBQUU1QixNQUFhLGVBQWU7SUFVMUIsWUFBWSxNQUE2QjtRQUN2QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekMsQ0FBQztJQUVELEtBQUssQ0FBQyxPQUFPLENBQ1gsTUFBYyxFQUNkLElBQVksRUFDWixJQUFjLEVBQ2QsY0FBdUI7UUFFdkIsTUFBTSxHQUFHLEdBQUcsSUFBSSxTQUFH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QUFNLENBQUMsT0FBTyxDQUN4QixLQUFLLEVBQ0wsc0JBQXNCLFVBQVUsV0FBVyxDQUM1QyxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxNQUFNLENBQUMsVUFBa0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBTyxNQUFNLEVBQUUsc0JBQXNCLFVBQVUsU0FBUyxDQUFDLENBQUM7SUFDdEYsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQge1xuICBXZWJob29rUGxhdGZvcm1Db25maWcsXG4gIEV2ZW50LFxuICBFdmVudFJlc3BvbnNlLFxuICBFbmRwb2ludCxcbiAgRW5kcG9pbnRDcmVhdGVQYXJhbXMsXG4gIEVuZHBvaW50VXBkYXRlUGFyYW1zLFxuICBTdWJzY3JpcHRpb24sXG4gIFN1YnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyxcbiAgRGVsaXZlcnksXG4gIERlbGl2ZXJ5QXR0ZW1wdCxcbiAgRGVsaXZlcnlMaXN0UGFyYW1zLFxuICBQYWdpbmF0ZWRSZXNwb25zZSxcbiAgRW5kcG9pbnRUZXN0UmVzdWx0LFxuICBSYXRlTGltaXRJbmZvLFxufSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7XG4gIFdlYmhvb2tQbGF0Zm9ybUVycm9yLFxuICBBdXRoZW50aWNhdGlvbkVycm9yLFxuICBSYXRlTGltaXRFcnJvcixcbiAgVmFsaWRhdGlvbkVycm9yLFxuICBOb3RGb3VuZEVycm9yLFxufSBmcm9tICcuL2Vycm9ycyc7XG5cbmNvbnN0IERFRkFVTFRfQkFTRV9VUkwgPSAnaHR0cDovL2xvY2FsaG9zdDo4MDgwJztcbmNvbnN0IERFRkFVTFRfVElNRU9VVCA9IDMwMDAwO1xuY29uc3QgU0RLX1ZFUlNJT04gPSAnMS4wLjAnO1xuXG5leHBvcnQgY2xhc3MgV2ViaG9va1BsYXRmb3JtIHtcbiAgcHJpdmF0ZSByZWFkb25seSBhcGlLZXk6IHN0cmluZztcbiAgcHJpdmF0ZSByZWFkb25seSBiYXNlVXJsOiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgdGltZW91dDogbnVtYmVyO1xuXG4gIHB1YmxpYyByZWFkb25seSBldmVudHM6IEV2ZW50cztcbiAgcHVibGljIHJlYWRvbmx5IGVuZHBvaW50czogRW5kcG9pbnRzO1xuICBwdWJsaWMgcmVhZG9ubHkgc3Vic2NyaXB0aW9uczogU3Vic2NyaXB0aW9ucztcbiAgcHVibGljIHJlYWRvbmx5IGRlbGl2ZXJpZXM6IERlbGl2ZXJpZXM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBXZWJob29rUGxhdGZvcm1Db25maWcpIHtcbiAgICBpZiAoIWNvbmZpZy5hcGlLZXkpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignQVBJIGtleSBpcyByZXF1aXJlZCcpO1xuICAgIH1cblxuICAgIHRoaXMuYXBpS2V5ID0gY29uZmlnLmFwaUtleTtcbiAgICB0aGlzLmJhc2VVcmwgPSBjb25maWcuYmFzZVVybCB8fCBERUZBVUxUX0JBU0VfVVJMO1xuICAgIHRoaXMudGltZW91dCA9IGNvbmZpZy50aW1lb3V0IHx8IERFRkFVTFRfVElNRU9VVDtcblxuICAgIHRoaXMuZXZlbnRzID0gbmV3IEV2ZW50cyh0aGlzKTtcbiAgICB0aGlzLmVuZHBvaW50cyA9IG5ldyBFbmRwb2ludHModGhpcyk7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbnModGhpcyk7XG4gICAgdGhpcy5kZWxpdmVyaWVzID0gbmV3IERlbGl2ZXJpZXModGhpcyk7XG4gIH1cblxuICBhc3luYyByZXF1ZXN0PFQ+KFxuICAgIG1ldGhvZDogc3RyaW5nLFxuICAgIHBhdGg6IHN0cmluZyxcbiAgICBib2R5PzogdW5rbm93bixcbiAgICBpZGVtcG90ZW5jeUtleT86IHN0cmluZ1xuICApOiBQcm9taXNlPFQ+IHtcbiAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgsIHRoaXMuYmFzZVVybCk7XG4gICAgY29uc3QgaXNIdHRwcyA9IHVybC5wcm90b2NvbCA9PT0gJ2h0dHBzOic7XG4gICAgY29uc3QgbGliID0gaXNIdHRwcyA/IGh0dHBzIDogaHR0cDtcblxuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnWC1BUEktS2V5JzogdGhpcy5hcGlLZXksXG4gICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgJ1VzZXItQWdlbnQnOiBgd2ViaG9vay1wbGF0Zm9ybS1ub2RlLyR7U0RLX1ZFUlNJT059YCxcbiAgICB9O1xuXG4gICAgaWYgKGlkZW1wb3RlbmN5S2V5KSB7XG4gICAgICBoZWFkZXJzWydJZGVtcG90ZW5jeS1LZXknXSA9IGlkZW1wb3RlbmN5S2V5O1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdXJsLnBvcnQgfHwgKGlzSHR0cHMgPyA0NDMgOiA4MCksXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcSA9IGxpYi5yZXF1ZXN0KG9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0SW5mbyA9IHRoaXMuZXh0cmFjdFJhdGVMaW1pdEluZm8ocmVzLmhlYWRlcnMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCBhcyBUKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IHt9O1xuXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgJiYgcmVzLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgIHJlamVjdCh0aGlzLmhhbmRsZUVycm9yKHJlcy5zdGF0dXNDb2RlLCBwYXJzZWQsIHJhdGVMaW1pdEluZm8pKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHBhcnNlZCBhcyBUKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgV2ViaG9va1BsYXRmb3JtRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSByZXNwb25zZScsIDUwMCkpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCdlcnJvcicsIChlcnIpID0+IHtcbiAgICAgICAgcmVqZWN0KG5ldyBXZWJob29rUGxhdGZvcm1FcnJvcihlcnIubWVzc2FnZSwgMCwgJ25ldHdvcmtfZXJyb3InKSk7XG4gICAgICB9KTtcblxuICAgICAgcmVxLm9uKCd0aW1lb3V0JywgKCkgPT4ge1xuICAgICAgICByZXEuZGVzdHJveSgpO1xuICAgICAgICByZWplY3QobmV3IFdlYmhvb2tQbGF0Zm9ybUVycm9yKCdSZXF1ZXN0IHRpbWVvdXQnLCAwLCAndGltZW91dCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYm9keSkge1xuICAgICAgICByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgfVxuXG4gICAgICByZXEuZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICBwcml2YXRlIGV4dHJhY3RSYXRlTGltaXRJbmZvKGhlYWRlcnM6IGh0dHAuSW5jb21pbmdIdHRwSGVhZGVycyk6IFJhdGVMaW1pdEluZm8gfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IGxpbWl0ID0gaGVhZGVyc1sneC1yYXRlbGltaXQtbGltaXQnXTtcbiAgICBjb25zdCByZW1haW5pbmcgPSBoZWFkZXJzWyd4LXJhdGVsaW1pdC1yZW1haW5pbmcnXTtcbiAgICBjb25zdCByZXNldCA9IGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LXJlc2V0J107XG5cbiAgICBpZiAobGltaXQgJiYgcmVtYWluaW5nICYmIHJlc2V0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICBsaW1pdDogcGFyc2VJbnQobGltaXQgYXMgc3RyaW5nLCAxMCksXG4gICAgICAgIHJlbWFpbmluZzogcGFyc2VJbnQocmVtYWluaW5nIGFzIHN0cmluZywgMTApLFxuICAgICAgICByZXNldDogcGFyc2VJbnQocmVzZXQgYXMgc3RyaW5nLCAxMCksXG4gICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9XG5cbiAgcHJpdmF0ZSBoYW5kbGVFcnJvcihcbiAgICBzdGF0dXM6IG51bWJlcixcbiAgICBib2R5OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPixcbiAgICByYXRlTGltaXRJbmZvPzogUmF0ZUxpbWl0SW5mb1xuICApOiBXZWJob29rUGxhdGZvcm1FcnJvciB7XG4gICAgY29uc3QgbWVzc2FnZSA9IChib2R5Lm1lc3NhZ2UgYXMgc3RyaW5nKSB8fCAnVW5rbm93biBlcnJvcic7XG5cbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSA0MDE6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDA0OlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIDQyOTpcbiAgICAgICAgcmV0dXJuIG5ldyBSYXRlTGltaXRFcnJvcihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIHJhdGVMaW1pdEluZm8gfHwgeyBsaW1pdDogMCwgcmVtYWluaW5nOiAwLCByZXNldDogRGF0ZS5ub3coKSArIDYwMDAwIH1cbiAgICAgICAgKTtcbiAgICAgIGNhc2UgNDAwOlxuICAgICAgICByZXR1cm4gbmV3IFZhbGlkYXRpb25FcnJvcihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIChib2R5LmZpZWxkRXJyb3JzIGFzIFJlY29yZDxzdHJpbmcsIHN0cmluZz4pIHx8IHt9XG4gICAgICAgICk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4gbmV3IFdlYmhvb2tQbGF0Zm9ybUVycm9yKG1lc3NhZ2UsIHN0YXR1cywgYm9keS5lcnJvciBhcyBzdHJpbmcpO1xuICAgIH1cbiAgfVxufVxuXG5jbGFzcyBFdmVudHMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogV2ViaG9va1BsYXRmb3JtKSB7fVxuXG4gIGFzeW5jIHNlbmQoZXZlbnQ6IEV2ZW50LCBpZGVtcG90ZW5jeUtleT86IHN0cmluZyk6IFByb21pc2U8RXZlbnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEV2ZW50UmVzcG9uc2U+KFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9hcGkvdjEvZXZlbnRzJyxcbiAgICAgIGV2ZW50LFxuICAgICAgaWRlbXBvdGVuY3lLZXlcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEVuZHBvaW50cyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBXZWJob29rUGxhdGZvcm0pIHt9XG5cbiAgYXN5bmMgY3JlYXRlKHByb2plY3RJZDogc3RyaW5nLCBwYXJhbXM6IEVuZHBvaW50Q3JlYXRlUGFyYW1zKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEVuZHBvaW50PihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHNgLFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldChwcm9qZWN0SWQ6IHN0cmluZywgZW5kcG9pbnRJZDogc3RyaW5nKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEVuZHBvaW50PihcbiAgICAgICdHRVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YFxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0KHByb2plY3RJZDogc3RyaW5nKTogUHJvbWlzZTxFbmRwb2ludFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnRbXT4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHNgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBlbmRwb2ludElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBFbmRwb2ludFVwZGF0ZVBhcmFtc1xuICApOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnQ+KFxuICAgICAgJ1BVVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vZW5kcG9pbnRzLyR7ZW5kcG9pbnRJZH1gLFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShwcm9qZWN0SWQ6IHN0cmluZywgZW5kcG9pbnRJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8dm9pZD4oXG4gICAgICAnREVMRVRFJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHMvJHtlbmRwb2ludElkfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcm90YXRlU2VjcmV0KHByb2plY3RJZDogc3RyaW5nLCBlbmRwb2ludElkOiBzdHJpbmcpOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnQ+KFxuICAgICAgJ1BPU1QnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9L3JvdGF0ZS1zZWNyZXRgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHRlc3QocHJvamVjdElkOiBzdHJpbmcsIGVuZHBvaW50SWQ6IHN0cmluZyk6IFByb21pc2U8RW5kcG9pbnRUZXN0UmVzdWx0PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnRUZXN0UmVzdWx0PihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHMvJHtlbmRwb2ludElkfS90ZXN0YFxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgU3Vic2NyaXB0aW9ucyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBXZWJob29rUGxhdGZvcm0pIHt9XG5cbiAgYXN5bmMgY3JlYXRlKHByb2plY3RJZDogc3RyaW5nLCBwYXJhbXM6IFN1YnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyk6IFByb21pc2U8U3Vic2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8U3Vic2NyaXB0aW9uPihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9zdWJzY3JpcHRpb25zYCxcbiAgICAgIHBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXQocHJvamVjdElkOiBzdHJpbmcsIHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFN1YnNjcmlwdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PFN1YnNjcmlwdGlvbj4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9zdWJzY3JpcHRpb25zLyR7c3Vic2NyaXB0aW9uSWR9YFxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0KHByb2plY3RJZDogc3RyaW5nKTogUHJvbWlzZTxTdWJzY3JpcHRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PFN1YnNjcmlwdGlvbltdPihcbiAgICAgICdHRVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3N1YnNjcmlwdGlvbnNgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBzdWJzY3JpcHRpb25JZDogc3RyaW5nLFxuICAgIHBhcmFtczogUGFydGlhbDxTdWJzY3JpcHRpb25DcmVhdGVQYXJhbXM+XG4gICk6IFByb21pc2U8U3Vic2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8U3Vic2NyaXB0aW9uPihcbiAgICAgICdQVVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3N1YnNjcmlwdGlvbnMvJHtzdWJzY3JpcHRpb25JZH1gLFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShwcm9qZWN0SWQ6IHN0cmluZywgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PHZvaWQ+KFxuICAgICAgJ0RFTEVURScsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vc3Vic2NyaXB0aW9ucy8ke3N1YnNjcmlwdGlvbklkfWBcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIERlbGl2ZXJpZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogV2ViaG9va1BsYXRmb3JtKSB7fVxuXG4gIGFzeW5jIGdldChkZWxpdmVyeUlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGl2ZXJ5PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RGVsaXZlcnk+KCdHRVQnLCBgL2FwaS92MS9kZWxpdmVyaWVzLyR7ZGVsaXZlcnlJZH1gKTtcbiAgfVxuXG4gIGFzeW5jIGxpc3QoXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBEZWxpdmVyeUxpc3RQYXJhbXMgPSB7fVxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPERlbGl2ZXJ5Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChwYXJhbXMuc3RhdHVzKSBxdWVyeS5zZXQoJ3N0YXR1cycsIHBhcmFtcy5zdGF0dXMpO1xuICAgIGlmIChwYXJhbXMuZW5kcG9pbnRJZCkgcXVlcnkuc2V0KCdlbmRwb2ludElkJywgcGFyYW1zLmVuZHBvaW50SWQpO1xuICAgIGlmIChwYXJhbXMuZnJvbURhdGUpIHF1ZXJ5LnNldCgnZnJvbURhdGUnLCBwYXJhbXMuZnJvbURhdGUpO1xuICAgIGlmIChwYXJhbXMudG9EYXRlKSBxdWVyeS5zZXQoJ3RvRGF0ZScsIHBhcmFtcy50b0RhdGUpO1xuICAgIGlmIChwYXJhbXMucGFnZSAhPT0gdW5kZWZpbmVkKSBxdWVyeS5zZXQoJ3BhZ2UnLCBwYXJhbXMucGFnZS50b1N0cmluZygpKTtcbiAgICBpZiAocGFyYW1zLnNpemUgIT09IHVuZGVmaW5lZCkgcXVlcnkuc2V0KCdzaXplJywgcGFyYW1zLnNpemUudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5LnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGF0aCA9IGAvYXBpL3YxL2RlbGl2ZXJpZXMvcHJvamVjdHMvJHtwcm9qZWN0SWR9JHtxdWVyeVN0cmluZyA/IGA/JHtxdWVyeVN0cmluZ31gIDogJyd9YDtcblxuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PFBhZ2luYXRlZFJlc3BvbnNlPERlbGl2ZXJ5Pj4oJ0dFVCcsIHBhdGgpO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXR0ZW1wdHMoZGVsaXZlcnlJZDogc3RyaW5nKTogUHJvbWlzZTxEZWxpdmVyeUF0dGVtcHRbXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PERlbGl2ZXJ5QXR0ZW1wdFtdPihcbiAgICAgICdHRVQnLFxuICAgICAgYC9hcGkvdjEvZGVsaXZlcmllcy8ke2RlbGl2ZXJ5SWR9L2F0dGVtcHRzYFxuICAgICk7XG4gIH1cblxuICBhc3luYyByZXBsYXkoZGVsaXZlcnlJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8dm9pZD4oJ1BPU1QnLCBgL2FwaS92MS9kZWxpdmVyaWVzLyR7ZGVsaXZlcnlJZH0vcmVwbGF5YCk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { RateLimitInfo } from './types';
|
|
2
|
+
export declare class WebhookPlatformError extends Error {
|
|
3
|
+
readonly status: number;
|
|
4
|
+
readonly code?: string;
|
|
5
|
+
constructor(message: string, status: number, code?: string);
|
|
6
|
+
}
|
|
7
|
+
export declare class AuthenticationError extends WebhookPlatformError {
|
|
8
|
+
constructor(message?: string);
|
|
9
|
+
}
|
|
10
|
+
export declare class RateLimitError extends WebhookPlatformError {
|
|
11
|
+
readonly rateLimitInfo: RateLimitInfo;
|
|
12
|
+
constructor(message: string, rateLimitInfo: RateLimitInfo);
|
|
13
|
+
get retryAfter(): number;
|
|
14
|
+
}
|
|
15
|
+
export declare class ValidationError extends WebhookPlatformError {
|
|
16
|
+
readonly fieldErrors: Record<string, string>;
|
|
17
|
+
constructor(message: string, fieldErrors?: Record<string, string>);
|
|
18
|
+
}
|
|
19
|
+
export declare class NotFoundError extends WebhookPlatformError {
|
|
20
|
+
constructor(message?: string);
|
|
21
|
+
}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.NotFoundError = exports.ValidationError = exports.RateLimitError = exports.AuthenticationError = exports.WebhookPlatformError = void 0;
|
|
4
|
+
class WebhookPlatformError extends Error {
|
|
5
|
+
constructor(message, status, code) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'WebhookPlatformError';
|
|
8
|
+
this.status = status;
|
|
9
|
+
this.code = code;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
exports.WebhookPlatformError = WebhookPlatformError;
|
|
13
|
+
class AuthenticationError extends WebhookPlatformError {
|
|
14
|
+
constructor(message = 'Invalid API key') {
|
|
15
|
+
super(message, 401, 'authentication_error');
|
|
16
|
+
this.name = 'AuthenticationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.AuthenticationError = AuthenticationError;
|
|
20
|
+
class RateLimitError extends WebhookPlatformError {
|
|
21
|
+
constructor(message, rateLimitInfo) {
|
|
22
|
+
super(message, 429, 'rate_limit_exceeded');
|
|
23
|
+
this.name = 'RateLimitError';
|
|
24
|
+
this.rateLimitInfo = rateLimitInfo;
|
|
25
|
+
}
|
|
26
|
+
get retryAfter() {
|
|
27
|
+
return Math.max(0, this.rateLimitInfo.reset - Date.now());
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
exports.RateLimitError = RateLimitError;
|
|
31
|
+
class ValidationError extends WebhookPlatformError {
|
|
32
|
+
constructor(message, fieldErrors = {}) {
|
|
33
|
+
super(message, 400, 'validation_error');
|
|
34
|
+
this.name = 'ValidationError';
|
|
35
|
+
this.fieldErrors = fieldErrors;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
exports.ValidationError = ValidationError;
|
|
39
|
+
class NotFoundError extends WebhookPlatformError {
|
|
40
|
+
constructor(message = 'Resource not found') {
|
|
41
|
+
super(message, 404, 'not_found');
|
|
42
|
+
this.name = 'NotFoundError';
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
exports.NotFoundError = NotFoundError;
|
|
46
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLG9CQUFxQixTQUFRLEtBQUs7SUFJN0MsWUFBWSxPQUFlLEVBQUUsTUFBYyxFQUFFLElBQWE7UUFDeEQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ2YsSUFBSSxDQUFDLElBQUksR0FBRyxzQkFBc0IsQ0FBQztRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztJQUNuQixDQUFDO0NBQ0Y7QUFWRCxvREFVQztBQUVELE1BQWEsbUJBQW9CLFNBQVEsb0JBQW9CO0lBQzNELFlBQVksVUFBa0IsaUJBQWlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFMRCxrREFLQztBQUVELE1BQWEsY0FBZSxTQUFRLG9CQUFvQjtJQUd0RCxZQUFZLE9BQWUsRUFBRSxhQUE0QjtRQUN2RCxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxxQkFBcUIsQ0FBQyxDQUFDO1FBQzNDLElBQUksQ0FBQyxJQUFJLEdBQUcsZ0JBQWdCLENBQUM7UUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7SUFDckMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNaLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUM7SUFDNUQsQ0FBQztDQUNGO0FBWkQsd0NBWUM7QUFFRCxNQUFhLGVBQWdCLFNBQVEsb0JBQW9CO0lBR3ZELFlBQVksT0FBZSxFQUFFLGNBQXNDLEVBQUU7UUFDbkUsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUsa0JBQWtCLENBQUMsQ0FBQztRQUN4QyxJQUFJLENBQUMsSUFBSSxHQUFHLGlCQUFpQixDQUFDO1FBQzlCLElBQUksQ0FBQyxXQUFXLEdBQUcsV0FBVyxDQUFDO0lBQ2pDLENBQUM7Q0FDRjtBQVJELDBDQVFDO0FBRUQsTUFBYSxhQUFjLFNBQVEsb0JBQW9CO0lBQ3JELFlBQVksVUFBa0Isb0JBQW9CO1FBQ2hELEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUxELHNDQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF0ZUxpbWl0SW5mbyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgV2ViaG9va1BsYXRmb3JtRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSBzdGF0dXM6IG51bWJlcjtcbiAgcHVibGljIHJlYWRvbmx5IGNvZGU/OiBzdHJpbmc7XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBzdGF0dXM6IG51bWJlciwgY29kZT86IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdXZWJob29rUGxhdGZvcm1FcnJvcic7XG4gICAgdGhpcy5zdGF0dXMgPSBzdGF0dXM7XG4gICAgdGhpcy5jb2RlID0gY29kZTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgQXV0aGVudGljYXRpb25FcnJvciBleHRlbmRzIFdlYmhvb2tQbGF0Zm9ybUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ0ludmFsaWQgQVBJIGtleScpIHtcbiAgICBzdXBlcihtZXNzYWdlLCA0MDEsICdhdXRoZW50aWNhdGlvbl9lcnJvcicpO1xuICAgIHRoaXMubmFtZSA9ICdBdXRoZW50aWNhdGlvbkVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0RXJyb3IgZXh0ZW5kcyBXZWJob29rUGxhdGZvcm1FcnJvciB7XG4gIHB1YmxpYyByZWFkb25seSByYXRlTGltaXRJbmZvOiBSYXRlTGltaXRJbmZvO1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgcmF0ZUxpbWl0SW5mbzogUmF0ZUxpbWl0SW5mbykge1xuICAgIHN1cGVyKG1lc3NhZ2UsIDQyOSwgJ3JhdGVfbGltaXRfZXhjZWVkZWQnKTtcbiAgICB0aGlzLm5hbWUgPSAnUmF0ZUxpbWl0RXJyb3InO1xuICAgIHRoaXMucmF0ZUxpbWl0SW5mbyA9IHJhdGVMaW1pdEluZm87XG4gIH1cblxuICBnZXQgcmV0cnlBZnRlcigpOiBudW1iZXIge1xuICAgIHJldHVybiBNYXRoLm1heCgwLCB0aGlzLnJhdGVMaW1pdEluZm8ucmVzZXQgLSBEYXRlLm5vdygpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgVmFsaWRhdGlvbkVycm9yIGV4dGVuZHMgV2ViaG9va1BsYXRmb3JtRXJyb3Ige1xuICBwdWJsaWMgcmVhZG9ubHkgZmllbGRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz47XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCBmaWVsZEVycm9yczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9KSB7XG4gICAgc3VwZXIobWVzc2FnZSwgNDAwLCAndmFsaWRhdGlvbl9lcnJvcicpO1xuICAgIHRoaXMubmFtZSA9ICdWYWxpZGF0aW9uRXJyb3InO1xuICAgIHRoaXMuZmllbGRFcnJvcnMgPSBmaWVsZEVycm9ycztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTm90Rm91bmRFcnJvciBleHRlbmRzIFdlYmhvb2tQbGF0Zm9ybUVycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ1Jlc291cmNlIG5vdCBmb3VuZCcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCA0MDQsICdub3RfZm91bmQnKTtcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cbiJdfQ==
|
package/dist/index.d.ts
ADDED
package/dist/index.js
ADDED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
exports.constructEvent = exports.verifySignature = exports.ValidationError = exports.AuthenticationError = exports.RateLimitError = exports.WebhookPlatformError = exports.WebhookPlatform = void 0;
|
|
18
|
+
var client_1 = require("./client");
|
|
19
|
+
Object.defineProperty(exports, "WebhookPlatform", { enumerable: true, get: function () { return client_1.WebhookPlatform; } });
|
|
20
|
+
var errors_1 = require("./errors");
|
|
21
|
+
Object.defineProperty(exports, "WebhookPlatformError", { enumerable: true, get: function () { return errors_1.WebhookPlatformError; } });
|
|
22
|
+
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return errors_1.RateLimitError; } });
|
|
23
|
+
Object.defineProperty(exports, "AuthenticationError", { enumerable: true, get: function () { return errors_1.AuthenticationError; } });
|
|
24
|
+
Object.defineProperty(exports, "ValidationError", { enumerable: true, get: function () { return errors_1.ValidationError; } });
|
|
25
|
+
var webhooks_1 = require("./webhooks");
|
|
26
|
+
Object.defineProperty(exports, "verifySignature", { enumerable: true, get: function () { return webhooks_1.verifySignature; } });
|
|
27
|
+
Object.defineProperty(exports, "constructEvent", { enumerable: true, get: function () { return webhooks_1.constructEvent; } });
|
|
28
|
+
__exportStar(require("./types"), exports);
|
|
29
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBMkM7QUFBbEMseUdBQUEsZUFBZSxPQUFBO0FBQ3hCLG1DQUFzRztBQUE3Riw4R0FBQSxvQkFBb0IsT0FBQTtBQUFFLHdHQUFBLGNBQWMsT0FBQTtBQUFFLDZHQUFBLG1CQUFtQixPQUFBO0FBQUUseUdBQUEsZUFBZSxPQUFBO0FBQ25GLHVDQUE2RDtBQUFwRCwyR0FBQSxlQUFlLE9BQUE7QUFBRSwwR0FBQSxjQUFjLE9BQUE7QUFDeEMsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgV2ViaG9va1BsYXRmb3JtIH0gZnJvbSAnLi9jbGllbnQnO1xuZXhwb3J0IHsgV2ViaG9va1BsYXRmb3JtRXJyb3IsIFJhdGVMaW1pdEVycm9yLCBBdXRoZW50aWNhdGlvbkVycm9yLCBWYWxpZGF0aW9uRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgeyB2ZXJpZnlTaWduYXR1cmUsIGNvbnN0cnVjdEV2ZW50IH0gZnJvbSAnLi93ZWJob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
export interface WebhookPlatformConfig {
|
|
2
|
+
apiKey: string;
|
|
3
|
+
baseUrl?: string;
|
|
4
|
+
timeout?: number;
|
|
5
|
+
}
|
|
6
|
+
export interface Event {
|
|
7
|
+
type: string;
|
|
8
|
+
data: Record<string, unknown>;
|
|
9
|
+
}
|
|
10
|
+
export interface EventResponse {
|
|
11
|
+
eventId: string;
|
|
12
|
+
type: string;
|
|
13
|
+
createdAt: string;
|
|
14
|
+
deliveriesCreated: number;
|
|
15
|
+
}
|
|
16
|
+
export interface Endpoint {
|
|
17
|
+
id: string;
|
|
18
|
+
url: string;
|
|
19
|
+
description?: string;
|
|
20
|
+
secret: string;
|
|
21
|
+
enabled: boolean;
|
|
22
|
+
rateLimitPerSecond?: number;
|
|
23
|
+
createdAt: string;
|
|
24
|
+
}
|
|
25
|
+
export interface EndpointCreateParams {
|
|
26
|
+
url: string;
|
|
27
|
+
description?: string;
|
|
28
|
+
enabled?: boolean;
|
|
29
|
+
rateLimitPerSecond?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface EndpointUpdateParams {
|
|
32
|
+
url?: string;
|
|
33
|
+
description?: string;
|
|
34
|
+
enabled?: boolean;
|
|
35
|
+
rateLimitPerSecond?: number;
|
|
36
|
+
}
|
|
37
|
+
export interface Subscription {
|
|
38
|
+
id: string;
|
|
39
|
+
endpointId: string;
|
|
40
|
+
eventTypes: string[];
|
|
41
|
+
enabled: boolean;
|
|
42
|
+
createdAt: string;
|
|
43
|
+
}
|
|
44
|
+
export interface SubscriptionCreateParams {
|
|
45
|
+
endpointId: string;
|
|
46
|
+
eventTypes: string[];
|
|
47
|
+
enabled?: boolean;
|
|
48
|
+
}
|
|
49
|
+
export interface Delivery {
|
|
50
|
+
id: string;
|
|
51
|
+
eventId: string;
|
|
52
|
+
endpointId: string;
|
|
53
|
+
status: DeliveryStatus;
|
|
54
|
+
attemptCount: number;
|
|
55
|
+
maxAttempts: number;
|
|
56
|
+
nextAttemptAt?: string;
|
|
57
|
+
createdAt: string;
|
|
58
|
+
succeededAt?: string;
|
|
59
|
+
}
|
|
60
|
+
export type DeliveryStatus = 'PENDING' | 'SUCCESS' | 'FAILED' | 'DEAD_LETTER';
|
|
61
|
+
export interface DeliveryAttempt {
|
|
62
|
+
id: string;
|
|
63
|
+
attemptNumber: number;
|
|
64
|
+
httpStatus?: number;
|
|
65
|
+
responseBody?: string;
|
|
66
|
+
errorMessage?: string;
|
|
67
|
+
latencyMs: number;
|
|
68
|
+
attemptedAt: string;
|
|
69
|
+
}
|
|
70
|
+
export interface PaginatedResponse<T> {
|
|
71
|
+
content: T[];
|
|
72
|
+
totalElements: number;
|
|
73
|
+
totalPages: number;
|
|
74
|
+
size: number;
|
|
75
|
+
number: number;
|
|
76
|
+
}
|
|
77
|
+
export interface DeliveryListParams {
|
|
78
|
+
status?: DeliveryStatus;
|
|
79
|
+
endpointId?: string;
|
|
80
|
+
fromDate?: string;
|
|
81
|
+
toDate?: string;
|
|
82
|
+
page?: number;
|
|
83
|
+
size?: number;
|
|
84
|
+
}
|
|
85
|
+
export interface EndpointTestResult {
|
|
86
|
+
success: boolean;
|
|
87
|
+
httpStatus?: number;
|
|
88
|
+
latencyMs: number;
|
|
89
|
+
errorMessage?: string;
|
|
90
|
+
}
|
|
91
|
+
export interface RateLimitInfo {
|
|
92
|
+
limit: number;
|
|
93
|
+
remaining: number;
|
|
94
|
+
reset: number;
|
|
95
|
+
}
|
|
96
|
+
export interface WebhookEvent {
|
|
97
|
+
eventId: string;
|
|
98
|
+
deliveryId: string;
|
|
99
|
+
timestamp: number;
|
|
100
|
+
type: string;
|
|
101
|
+
data: Record<string, unknown>;
|
|
102
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va1BsYXRmb3JtQ29uZmlnIHtcbiAgYXBpS2V5OiBzdHJpbmc7XG4gIGJhc2VVcmw/OiBzdHJpbmc7XG4gIHRpbWVvdXQ/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRXZlbnQge1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEV2ZW50UmVzcG9uc2Uge1xuICBldmVudElkOiBzdHJpbmc7XG4gIHR5cGU6IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIGRlbGl2ZXJpZXNDcmVhdGVkOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5kcG9pbnQge1xuICBpZDogc3RyaW5nO1xuICB1cmw6IHN0cmluZztcbiAgZGVzY3JpcHRpb24/OiBzdHJpbmc7XG4gIHNlY3JldDogc3RyaW5nO1xuICBlbmFibGVkOiBib29sZWFuO1xuICByYXRlTGltaXRQZXJTZWNvbmQ/OiBudW1iZXI7XG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuZHBvaW50Q3JlYXRlUGFyYW1zIHtcbiAgdXJsOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uPzogc3RyaW5nO1xuICBlbmFibGVkPzogYm9vbGVhbjtcbiAgcmF0ZUxpbWl0UGVyU2Vjb25kPzogbnVtYmVyO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIEVuZHBvaW50VXBkYXRlUGFyYW1zIHtcbiAgdXJsPzogc3RyaW5nO1xuICBkZXNjcmlwdGlvbj86IHN0cmluZztcbiAgZW5hYmxlZD86IGJvb2xlYW47XG4gIHJhdGVMaW1pdFBlclNlY29uZD86IG51bWJlcjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRpb24ge1xuICBpZDogc3RyaW5nO1xuICBlbmRwb2ludElkOiBzdHJpbmc7XG4gIGV2ZW50VHlwZXM6IHN0cmluZ1tdO1xuICBlbmFibGVkOiBib29sZWFuO1xuICBjcmVhdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBTdWJzY3JpcHRpb25DcmVhdGVQYXJhbXMge1xuICBlbmRwb2ludElkOiBzdHJpbmc7XG4gIGV2ZW50VHlwZXM6IHN0cmluZ1tdO1xuICBlbmFibGVkPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEZWxpdmVyeSB7XG4gIGlkOiBzdHJpbmc7XG4gIGV2ZW50SWQ6IHN0cmluZztcbiAgZW5kcG9pbnRJZDogc3RyaW5nO1xuICBzdGF0dXM6IERlbGl2ZXJ5U3RhdHVzO1xuICBhdHRlbXB0Q291bnQ6IG51bWJlcjtcbiAgbWF4QXR0ZW1wdHM6IG51bWJlcjtcbiAgbmV4dEF0dGVtcHRBdD86IHN0cmluZztcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XG4gIHN1Y2NlZWRlZEF0Pzogc3RyaW5nO1xufVxuXG5leHBvcnQgdHlwZSBEZWxpdmVyeVN0YXR1cyA9ICdQRU5ESU5HJyB8ICdTVUNDRVNTJyB8ICdGQUlMRUQnIHwgJ0RFQURfTEVUVEVSJztcblxuZXhwb3J0IGludGVyZmFjZSBEZWxpdmVyeUF0dGVtcHQge1xuICBpZDogc3RyaW5nO1xuICBhdHRlbXB0TnVtYmVyOiBudW1iZXI7XG4gIGh0dHBTdGF0dXM/OiBudW1iZXI7XG4gIHJlc3BvbnNlQm9keT86IHN0cmluZztcbiAgZXJyb3JNZXNzYWdlPzogc3RyaW5nO1xuICBsYXRlbmN5TXM6IG51bWJlcjtcbiAgYXR0ZW1wdGVkQXQ6IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBQYWdpbmF0ZWRSZXNwb25zZTxUPiB7XG4gIGNvbnRlbnQ6IFRbXTtcbiAgdG90YWxFbGVtZW50czogbnVtYmVyO1xuICB0b3RhbFBhZ2VzOiBudW1iZXI7XG4gIHNpemU6IG51bWJlcjtcbiAgbnVtYmVyOiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRGVsaXZlcnlMaXN0UGFyYW1zIHtcbiAgc3RhdHVzPzogRGVsaXZlcnlTdGF0dXM7XG4gIGVuZHBvaW50SWQ/OiBzdHJpbmc7XG4gIGZyb21EYXRlPzogc3RyaW5nO1xuICB0b0RhdGU/OiBzdHJpbmc7XG4gIHBhZ2U/OiBudW1iZXI7XG4gIHNpemU/OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRW5kcG9pbnRUZXN0UmVzdWx0IHtcbiAgc3VjY2VzczogYm9vbGVhbjtcbiAgaHR0cFN0YXR1cz86IG51bWJlcjtcbiAgbGF0ZW5jeU1zOiBudW1iZXI7XG4gIGVycm9yTWVzc2FnZT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSYXRlTGltaXRJbmZvIHtcbiAgbGltaXQ6IG51bWJlcjtcbiAgcmVtYWluaW5nOiBudW1iZXI7XG4gIHJlc2V0OiBudW1iZXI7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgV2ViaG9va0V2ZW50IHtcbiAgZXZlbnRJZDogc3RyaW5nO1xuICBkZWxpdmVyeUlkOiBzdHJpbmc7XG4gIHRpbWVzdGFtcDogbnVtYmVyO1xuICB0eXBlOiBzdHJpbmc7XG4gIGRhdGE6IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuIl19
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { WebhookEvent } from './types';
|
|
2
|
+
export interface WebhookHeaders {
|
|
3
|
+
'x-signature'?: string;
|
|
4
|
+
'x-timestamp'?: string;
|
|
5
|
+
'x-event-id'?: string;
|
|
6
|
+
'x-delivery-id'?: string;
|
|
7
|
+
[key: string]: string | undefined;
|
|
8
|
+
}
|
|
9
|
+
export interface VerifyOptions {
|
|
10
|
+
tolerance?: number;
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Verifies the webhook signature using HMAC-SHA256
|
|
14
|
+
* @param payload - Raw request body as string
|
|
15
|
+
* @param signature - X-Signature header value (format: t=timestamp,v1=signature)
|
|
16
|
+
* @param secret - Endpoint webhook secret
|
|
17
|
+
* @param options - Verification options
|
|
18
|
+
* @returns true if signature is valid
|
|
19
|
+
* @throws WebhookPlatformError if signature is invalid
|
|
20
|
+
*/
|
|
21
|
+
export declare function verifySignature(payload: string, signature: string, secret: string, options?: VerifyOptions): boolean;
|
|
22
|
+
/**
|
|
23
|
+
* Constructs a webhook event from the request
|
|
24
|
+
* @param payload - Raw request body as string
|
|
25
|
+
* @param headers - Request headers
|
|
26
|
+
* @param secret - Endpoint webhook secret
|
|
27
|
+
* @param options - Verification options
|
|
28
|
+
* @returns Parsed and verified webhook event
|
|
29
|
+
*/
|
|
30
|
+
export declare function constructEvent(payload: string, headers: WebhookHeaders, secret: string, options?: VerifyOptions): WebhookEvent;
|
|
31
|
+
/**
|
|
32
|
+
* Generates a signature for testing purposes
|
|
33
|
+
* @param payload - Request body as string
|
|
34
|
+
* @param secret - Webhook secret
|
|
35
|
+
* @param timestamp - Optional timestamp (defaults to now)
|
|
36
|
+
* @returns Signature string in format t=timestamp,v1=signature
|
|
37
|
+
*/
|
|
38
|
+
export declare function generateSignature(payload: string, secret: string, timestamp?: number): string;
|