@railhook/node 2.12.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/dist/client.js ADDED
@@ -0,0 +1,344 @@
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.Railhook = 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 = '2.12.0';
44
+ class Railhook {
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
+ this.incomingSources = new IncomingSources(this);
57
+ this.incomingEvents = new IncomingEvents(this);
58
+ }
59
+ async request(method, path, body, idempotencyKey) {
60
+ const url = new url_1.URL(path, this.baseUrl);
61
+ const isHttps = url.protocol === 'https:';
62
+ const lib = isHttps ? https : http;
63
+ const headers = {
64
+ 'X-API-Key': this.apiKey,
65
+ 'Content-Type': 'application/json',
66
+ 'User-Agent': `railhook-node/${SDK_VERSION}`,
67
+ };
68
+ if (idempotencyKey) {
69
+ headers['Idempotency-Key'] = idempotencyKey;
70
+ }
71
+ const options = {
72
+ method,
73
+ hostname: url.hostname,
74
+ port: url.port || (isHttps ? 443 : 80),
75
+ path: url.pathname + url.search,
76
+ headers,
77
+ timeout: this.timeout,
78
+ };
79
+ return new Promise((resolve, reject) => {
80
+ const req = lib.request(options, (res) => {
81
+ let data = '';
82
+ res.on('data', (chunk) => (data += chunk));
83
+ res.on('end', () => {
84
+ try {
85
+ const rateLimitInfo = this.extractRateLimitInfo(res.headers);
86
+ if (res.statusCode === 204) {
87
+ resolve(undefined);
88
+ return;
89
+ }
90
+ const parsed = data ? JSON.parse(data) : {};
91
+ if (res.statusCode && res.statusCode >= 400) {
92
+ reject(this.handleError(res.statusCode, parsed, rateLimitInfo));
93
+ return;
94
+ }
95
+ resolve(parsed);
96
+ }
97
+ catch (err) {
98
+ reject(new errors_1.RailhookError('Failed to parse response', 500));
99
+ }
100
+ });
101
+ });
102
+ req.on('error', (err) => {
103
+ reject(new errors_1.RailhookError(err.message, 0, 'network_error'));
104
+ });
105
+ req.on('timeout', () => {
106
+ req.destroy();
107
+ reject(new errors_1.RailhookError('Request timeout', 0, 'timeout'));
108
+ });
109
+ if (body) {
110
+ req.write(JSON.stringify(body));
111
+ }
112
+ req.end();
113
+ });
114
+ }
115
+ /**
116
+ * Generic GET request to any API path.
117
+ * Use this for endpoints not yet covered by the SDK.
118
+ */
119
+ async get(path) {
120
+ return this.request('GET', path);
121
+ }
122
+ /**
123
+ * Generic POST request to any API path.
124
+ * Use this for endpoints not yet covered by the SDK.
125
+ */
126
+ async post(path, body, idempotencyKey) {
127
+ return this.request('POST', path, body, idempotencyKey);
128
+ }
129
+ /**
130
+ * Generic PUT request to any API path.
131
+ * Use this for endpoints not yet covered by the SDK.
132
+ */
133
+ async put(path, body) {
134
+ return this.request('PUT', path, body);
135
+ }
136
+ /**
137
+ * Generic PATCH request to any API path.
138
+ * Use this for endpoints not yet covered by the SDK.
139
+ */
140
+ async patch(path, body) {
141
+ return this.request('PATCH', path, body);
142
+ }
143
+ /**
144
+ * Generic DELETE request to any API path.
145
+ * Use this for endpoints not yet covered by the SDK.
146
+ */
147
+ async delete(path) {
148
+ return this.request('DELETE', path);
149
+ }
150
+ extractRateLimitInfo(headers) {
151
+ const limit = headers['x-ratelimit-limit'];
152
+ const remaining = headers['x-ratelimit-remaining'];
153
+ const reset = headers['x-ratelimit-reset'];
154
+ if (limit && remaining && reset) {
155
+ return {
156
+ limit: parseInt(limit, 10),
157
+ remaining: parseInt(remaining, 10),
158
+ reset: parseInt(reset, 10),
159
+ };
160
+ }
161
+ return undefined;
162
+ }
163
+ handleError(status, body, rateLimitInfo) {
164
+ const message = body.message || 'Unknown error';
165
+ switch (status) {
166
+ case 401:
167
+ return new errors_1.AuthenticationError(message);
168
+ case 404:
169
+ return new errors_1.NotFoundError(message);
170
+ case 429:
171
+ return new errors_1.RateLimitError(message,
172
+ // `reset` is a Unix timestamp in seconds (see RateLimitInfo), so the
173
+ // fallback has to be in seconds too, not Date.now() + 60000.
174
+ rateLimitInfo || { limit: 0, remaining: 0, reset: Math.floor(Date.now() / 1000) + 60 });
175
+ case 400:
176
+ return new errors_1.ValidationError(message, body.fieldErrors || {});
177
+ default:
178
+ return new errors_1.RailhookError(message, status, body.error);
179
+ }
180
+ }
181
+ }
182
+ exports.Railhook = Railhook;
183
+ class Events {
184
+ constructor(client) {
185
+ this.client = client;
186
+ }
187
+ async send(event, idempotencyKey) {
188
+ return this.client.request('POST', '/api/v1/events', event, idempotencyKey);
189
+ }
190
+ }
191
+ class Endpoints {
192
+ constructor(client) {
193
+ this.client = client;
194
+ }
195
+ async create(projectId, params) {
196
+ return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints`, params);
197
+ }
198
+ async get(projectId, endpointId) {
199
+ return this.client.request('GET', `/api/v1/projects/${projectId}/endpoints/${endpointId}`);
200
+ }
201
+ /**
202
+ * Lists a project's endpoints.
203
+ *
204
+ * The API returns a Spring page envelope here, not a bare array — the
205
+ * endpoints themselves are in `.content`.
206
+ */
207
+ async list(projectId, params = {}) {
208
+ const query = new URLSearchParams();
209
+ if (params.page !== undefined)
210
+ query.set('page', params.page.toString());
211
+ if (params.size !== undefined)
212
+ query.set('size', params.size.toString());
213
+ const queryString = query.toString();
214
+ const path = `/api/v1/projects/${projectId}/endpoints${queryString ? `?${queryString}` : ''}`;
215
+ return this.client.request('GET', path);
216
+ }
217
+ async update(projectId, endpointId, params) {
218
+ return this.client.request('PUT', `/api/v1/projects/${projectId}/endpoints/${endpointId}`, params);
219
+ }
220
+ async delete(projectId, endpointId) {
221
+ return this.client.request('DELETE', `/api/v1/projects/${projectId}/endpoints/${endpointId}`);
222
+ }
223
+ async rotateSecret(projectId, endpointId) {
224
+ return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints/${endpointId}/rotate-secret`);
225
+ }
226
+ async test(projectId, endpointId) {
227
+ return this.client.request('POST', `/api/v1/projects/${projectId}/endpoints/${endpointId}/test`);
228
+ }
229
+ }
230
+ class Subscriptions {
231
+ constructor(client) {
232
+ this.client = client;
233
+ }
234
+ async create(projectId, params) {
235
+ return this.client.request('POST', `/api/v1/projects/${projectId}/subscriptions`, params);
236
+ }
237
+ async get(projectId, subscriptionId) {
238
+ return this.client.request('GET', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`);
239
+ }
240
+ async list(projectId) {
241
+ return this.client.request('GET', `/api/v1/projects/${projectId}/subscriptions`);
242
+ }
243
+ async update(projectId, subscriptionId, params) {
244
+ return this.client.request('PUT', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`, params);
245
+ }
246
+ async delete(projectId, subscriptionId) {
247
+ return this.client.request('DELETE', `/api/v1/projects/${projectId}/subscriptions/${subscriptionId}`);
248
+ }
249
+ }
250
+ class Deliveries {
251
+ constructor(client) {
252
+ this.client = client;
253
+ }
254
+ async get(deliveryId) {
255
+ return this.client.request('GET', `/api/v1/deliveries/${deliveryId}`);
256
+ }
257
+ async list(projectId, params = {}) {
258
+ const query = new URLSearchParams();
259
+ if (params.status)
260
+ query.set('status', params.status);
261
+ if (params.endpointId)
262
+ query.set('endpointId', params.endpointId);
263
+ if (params.fromDate)
264
+ query.set('fromDate', params.fromDate);
265
+ if (params.toDate)
266
+ query.set('toDate', params.toDate);
267
+ if (params.page !== undefined)
268
+ query.set('page', params.page.toString());
269
+ if (params.size !== undefined)
270
+ query.set('size', params.size.toString());
271
+ const queryString = query.toString();
272
+ const path = `/api/v1/deliveries/projects/${projectId}${queryString ? `?${queryString}` : ''}`;
273
+ return this.client.request('GET', path);
274
+ }
275
+ async getAttempts(deliveryId) {
276
+ return this.client.request('GET', `/api/v1/deliveries/${deliveryId}/attempts`);
277
+ }
278
+ async replay(deliveryId) {
279
+ return this.client.request('POST', `/api/v1/deliveries/${deliveryId}/replay`);
280
+ }
281
+ }
282
+ class IncomingSources {
283
+ constructor(client) {
284
+ this.client = client;
285
+ }
286
+ async create(projectId, params) {
287
+ return this.client.request('POST', `/api/v1/projects/${projectId}/incoming-sources`, params);
288
+ }
289
+ async get(projectId, sourceId) {
290
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
291
+ }
292
+ async list(projectId) {
293
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-sources`);
294
+ }
295
+ async update(projectId, sourceId, params) {
296
+ return this.client.request('PUT', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}`, params);
297
+ }
298
+ async delete(projectId, sourceId) {
299
+ return this.client.request('DELETE', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}`);
300
+ }
301
+ // ── Destinations ──
302
+ async createDestination(projectId, sourceId, params) {
303
+ return this.client.request('POST', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`, params);
304
+ }
305
+ async getDestination(projectId, sourceId, destinationId) {
306
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destinationId}`);
307
+ }
308
+ async listDestinations(projectId, sourceId) {
309
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations`);
310
+ }
311
+ async updateDestination(projectId, sourceId, destinationId, params) {
312
+ return this.client.request('PUT', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destinationId}`, params);
313
+ }
314
+ async deleteDestination(projectId, sourceId, destinationId) {
315
+ return this.client.request('DELETE', `/api/v1/projects/${projectId}/incoming-sources/${sourceId}/destinations/${destinationId}`);
316
+ }
317
+ }
318
+ class IncomingEvents {
319
+ constructor(client) {
320
+ this.client = client;
321
+ }
322
+ async list(projectId, params = {}) {
323
+ const query = new URLSearchParams();
324
+ if (params.sourceId)
325
+ query.set('sourceId', params.sourceId);
326
+ if (params.page !== undefined)
327
+ query.set('page', params.page.toString());
328
+ if (params.size !== undefined)
329
+ query.set('size', params.size.toString());
330
+ const queryString = query.toString();
331
+ const path = `/api/v1/projects/${projectId}/incoming-events${queryString ? `?${queryString}` : ''}`;
332
+ return this.client.request('GET', path);
333
+ }
334
+ async get(projectId, eventId) {
335
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-events/${eventId}`);
336
+ }
337
+ async getAttempts(projectId, eventId) {
338
+ return this.client.request('GET', `/api/v1/projects/${projectId}/incoming-events/${eventId}/attempts`);
339
+ }
340
+ async replay(projectId, eventId) {
341
+ return this.client.request('POST', `/api/v1/projects/${projectId}/incoming-events/${eventId}/replay`);
342
+ }
343
+ }
344
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2NsaWVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSw2Q0FBK0I7QUFDL0IsMkNBQTZCO0FBQzdCLDZCQUEwQjtBQTRCMUIscUNBTWtCO0FBRWxCLE1BQU0sZ0JBQWdCLEdBQUcsdUJBQXVCLENBQUM7QUFDakQsTUFBTSxlQUFlLEdBQUcsS0FBSyxDQUFDO0FBQzlCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQztBQUU3QixNQUFhLFFBQVE7SUFZbkIsWUFBWSxNQUFzQjtRQUNoQyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ25CLE1BQU0sSUFBSSxLQUFLLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUN6QyxDQUFDO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO1FBQzVCLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDLE9BQU8sSUFBSSxnQkFBZ0IsQ0FBQztRQUNsRCxJQUFJLENBQUMsT0FBTyxHQUFHLE1BQU0sQ0FBQyxPQUFPLElBQUksZUFBZSxDQUFDO1FBRWpELElBQUksQ0FBQyxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDL0IsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsYUFBYSxHQUFHLElBQUksYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzdDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGVBQWUsR0FBRyxJQUFJLGVBQWUsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNqRCxJQUFJLENBQUMsY0FBYyxHQUFHLElBQUksY0FBYyxDQUFDLElBQUks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QUFNLElBQUksR0FBRyxvQkFBb0IsU0FBUyxtQkFBbUIsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLFdBQVcsRUFBRSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztRQUVwRyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFtQyxLQUFLLEVBQUUsSUFBSSxDQUFDLENBQUM7SUFDNUUsQ0FBQztJQUVELEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBaUIsRUFBRSxPQUFlO1FBQzFDLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQ3hCLEtBQUssRUFDTCxvQkFBb0IsU0FBUyxvQkFBb0IsT0FBTyxFQUFFLENBQzNELENBQUM7SUFDSixDQUFDO0lBRUQsS0FBSyxDQUFDLFdBQVcsQ0FDZixTQUFpQixFQUNqQixPQUFlO1FBRWYsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FDeEIsS0FBSyxFQUNMLG9CQUFvQixTQUFTLG9CQUFvQixPQUFPLFdBQVcsQ0FDcEUsQ0FBQztJQUNKLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBTSxDQUFDLFNBQWlCLEVBQUUsT0FBZTtRQUM3QyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUN4QixNQUFNLEVBQ04sb0JBQW9CLFNBQVMsb0JBQW9CLE9BQU8sU0FBUyxDQUNsRSxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgaHR0cHMgZnJvbSAnaHR0cHMnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCB7IFVSTCB9IGZyb20gJ3VybCc7XG5pbXBvcnQge1xuICBSYWlsaG9va0NvbmZpZyxcbiAgRXZlbnQsXG4gIEV2ZW50UmVzcG9uc2UsXG4gIEVuZHBvaW50LFxuICBFbmRwb2ludENyZWF0ZVBhcmFtcyxcbiAgRW5kcG9pbnRVcGRhdGVQYXJhbXMsXG4gIEVuZHBvaW50TGlzdFBhcmFtcyxcbiAgU3Vic2NyaXB0aW9uLFxuICBTdWJzY3JpcHRpb25DcmVhdGVQYXJhbXMsXG4gIERlbGl2ZXJ5LFxuICBEZWxpdmVyeUF0dGVtcHQsXG4gIERlbGl2ZXJ5TGlzdFBhcmFtcyxcbiAgUGFnaW5hdGVkUmVzcG9uc2UsXG4gIEVuZHBvaW50VGVzdFJlc3VsdCxcbiAgUmF0ZUxpbWl0SW5mbyxcbiAgSW5jb21pbmdTb3VyY2UsXG4gIEluY29taW5nU291cmNlQ3JlYXRlUGFyYW1zLFxuICBJbmNvbWluZ1NvdXJjZVVwZGF0ZVBhcmFtcyxcbiAgSW5jb21pbmdEZXN0aW5hdGlvbixcbiAgSW5jb21pbmdEZXN0aW5hdGlvbkNyZWF0ZVBhcmFtcyxcbiAgSW5jb21pbmdEZXN0aW5hdGlvblVwZGF0ZVBhcmFtcyxcbiAgSW5jb21pbmdFdmVudCxcbiAgSW5jb21pbmdFdmVudExpc3RQYXJhbXMsXG4gIEluY29taW5nRm9yd2FyZEF0dGVtcHQsXG4gIFJlcGxheUV2ZW50UmVzcG9uc2UsXG59IGZyb20gJy4vdHlwZXMnO1xuaW1wb3J0IHtcbiAgUmFpbGhvb2tFcnJvcixcbiAgQXV0aGVudGljYXRpb25FcnJvcixcbiAgUmF0ZUxpbWl0RXJyb3IsXG4gIFZhbGlkYXRpb25FcnJvcixcbiAgTm90Rm91bmRFcnJvcixcbn0gZnJvbSAnLi9lcnJvcnMnO1xuXG5jb25zdCBERUZBVUxUX0JBU0VfVVJMID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6ODA4MCc7XG5jb25zdCBERUZBVUxUX1RJTUVPVVQgPSAzMDAwMDtcbmNvbnN0IFNES19WRVJTSU9OID0gJzIuMTIuMCc7XG5cbmV4cG9ydCBjbGFzcyBSYWlsaG9vayB7XG4gIHByaXZhdGUgcmVhZG9ubHkgYXBpS2V5OiBzdHJpbmc7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFzZVVybDogc3RyaW5nO1xuICBwcml2YXRlIHJlYWRvbmx5IHRpbWVvdXQ6IG51bWJlcjtcblxuICBwdWJsaWMgcmVhZG9ubHkgZXZlbnRzOiBFdmVudHM7XG4gIHB1YmxpYyByZWFkb25seSBlbmRwb2ludHM6IEVuZHBvaW50cztcbiAgcHVibGljIHJlYWRvbmx5IHN1YnNjcmlwdGlvbnM6IFN1YnNjcmlwdGlvbnM7XG4gIHB1YmxpYyByZWFkb25seSBkZWxpdmVyaWVzOiBEZWxpdmVyaWVzO1xuICBwdWJsaWMgcmVhZG9ubHkgaW5jb21pbmdTb3VyY2VzOiBJbmNvbWluZ1NvdXJjZXM7XG4gIHB1YmxpYyByZWFkb25seSBpbmNvbWluZ0V2ZW50czogSW5jb21pbmdFdmVudHM7XG5cbiAgY29uc3RydWN0b3IoY29uZmlnOiBSYWlsaG9va0NvbmZpZykge1xuICAgIGlmICghY29uZmlnLmFwaUtleSkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdBUEkga2V5IGlzIHJlcXVpcmVkJyk7XG4gICAgfVxuXG4gICAgdGhpcy5hcGlLZXkgPSBjb25maWcuYXBpS2V5O1xuICAgIHRoaXMuYmFzZVVybCA9IGNvbmZpZy5iYXNlVXJsIHx8IERFRkFVTFRfQkFTRV9VUkw7XG4gICAgdGhpcy50aW1lb3V0ID0gY29uZmlnLnRpbWVvdXQgfHwgREVGQVVMVF9USU1FT1VUO1xuXG4gICAgdGhpcy5ldmVudHMgPSBuZXcgRXZlbnRzKHRoaXMpO1xuICAgIHRoaXMuZW5kcG9pbnRzID0gbmV3IEVuZHBvaW50cyh0aGlzKTtcbiAgICB0aGlzLnN1YnNjcmlwdGlvbnMgPSBuZXcgU3Vic2NyaXB0aW9ucyh0aGlzKTtcbiAgICB0aGlzLmRlbGl2ZXJpZXMgPSBuZXcgRGVsaXZlcmllcyh0aGlzKTtcbiAgICB0aGlzLmluY29taW5nU291cmNlcyA9IG5ldyBJbmNvbWluZ1NvdXJjZXModGhpcyk7XG4gICAgdGhpcy5pbmNvbWluZ0V2ZW50cyA9IG5ldyBJbmNvbWluZ0V2ZW50cyh0aGlzKTtcbiAgfVxuXG4gIGFzeW5jIHJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiBzdHJpbmcsXG4gICAgcGF0aDogc3RyaW5nLFxuICAgIGJvZHk/OiB1bmtub3duLFxuICAgIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nXG4gICk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHVybCA9IG5ldyBVUkwocGF0aCwgdGhpcy5iYXNlVXJsKTtcbiAgICBjb25zdCBpc0h0dHBzID0gdXJsLnByb3RvY29sID09PSAnaHR0cHM6JztcbiAgICBjb25zdCBsaWIgPSBpc0h0dHBzID8gaHR0cHMgOiBodHRwO1xuXG4gICAgY29uc3QgaGVhZGVyczogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHtcbiAgICAgICdYLUFQSS1LZXknOiB0aGlzLmFwaUtleSxcbiAgICAgICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAnVXNlci1BZ2VudCc6IGByYWlsaG9vay1ub2RlLyR7U0RLX1ZFUlNJT059YCxcbiAgICB9O1xuXG4gICAgaWYgKGlkZW1wb3RlbmN5S2V5KSB7XG4gICAgICBoZWFkZXJzWydJZGVtcG90ZW5jeS1LZXknXSA9IGlkZW1wb3RlbmN5S2V5O1xuICAgIH1cblxuICAgIGNvbnN0IG9wdGlvbnM6IGh0dHAuUmVxdWVzdE9wdGlvbnMgPSB7XG4gICAgICBtZXRob2QsXG4gICAgICBob3N0bmFtZTogdXJsLmhvc3RuYW1lLFxuICAgICAgcG9ydDogdXJsLnBvcnQgfHwgKGlzSHR0cHMgPyA0NDMgOiA4MCksXG4gICAgICBwYXRoOiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoLFxuICAgICAgaGVhZGVycyxcbiAgICAgIHRpbWVvdXQ6IHRoaXMudGltZW91dCxcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIGNvbnN0IHJlcSA9IGxpYi5yZXF1ZXN0KG9wdGlvbnMsIChyZXMpID0+IHtcbiAgICAgICAgbGV0IGRhdGEgPSAnJztcbiAgICAgICAgcmVzLm9uKCdkYXRhJywgKGNodW5rKSA9PiAoZGF0YSArPSBjaHVuaykpO1xuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgcmF0ZUxpbWl0SW5mbyA9IHRoaXMuZXh0cmFjdFJhdGVMaW1pdEluZm8ocmVzLmhlYWRlcnMpO1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgPT09IDIwNCkge1xuICAgICAgICAgICAgICByZXNvbHZlKHVuZGVmaW5lZCBhcyBUKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwYXJzZWQgPSBkYXRhID8gSlNPTi5wYXJzZShkYXRhKSA6IHt9O1xuXG4gICAgICAgICAgICBpZiAocmVzLnN0YXR1c0NvZGUgJiYgcmVzLnN0YXR1c0NvZGUgPj0gNDAwKSB7XG4gICAgICAgICAgICAgIHJlamVjdCh0aGlzLmhhbmRsZUVycm9yKHJlcy5zdGF0dXNDb2RlLCBwYXJzZWQsIHJhdGVMaW1pdEluZm8pKTtcbiAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXNvbHZlKHBhcnNlZCBhcyBUKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgIHJlamVjdChuZXcgUmFpbGhvb2tFcnJvcignRmFpbGVkIHRvIHBhcnNlIHJlc3BvbnNlJywgNTAwKSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pO1xuXG4gICAgICByZXEub24oJ2Vycm9yJywgKGVycikgPT4ge1xuICAgICAgICByZWplY3QobmV3IFJhaWxob29rRXJyb3IoZXJyLm1lc3NhZ2UsIDAsICduZXR3b3JrX2Vycm9yJykpO1xuICAgICAgfSk7XG5cbiAgICAgIHJlcS5vbigndGltZW91dCcsICgpID0+IHtcbiAgICAgICAgcmVxLmRlc3Ryb3koKTtcbiAgICAgICAgcmVqZWN0KG5ldyBSYWlsaG9va0Vycm9yKCdSZXF1ZXN0IHRpbWVvdXQnLCAwLCAndGltZW91dCcpKTtcbiAgICAgIH0pO1xuXG4gICAgICBpZiAoYm9keSkge1xuICAgICAgICByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkoYm9keSkpO1xuICAgICAgfVxuXG4gICAgICByZXEuZW5kKCk7XG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJpYyBHRVQgcmVxdWVzdCB0byBhbnkgQVBJIHBhdGguXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgbm90IHlldCBjb3ZlcmVkIGJ5IHRoZSBTREsuXG4gICAqL1xuICBhc3luYyBnZXQ8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oJ0dFVCcsIHBhdGgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyaWMgUE9TVCByZXF1ZXN0IHRvIGFueSBBUEkgcGF0aC5cbiAgICogVXNlIHRoaXMgZm9yIGVuZHBvaW50cyBub3QgeWV0IGNvdmVyZWQgYnkgdGhlIFNESy5cbiAgICovXG4gIGFzeW5jIHBvc3Q8VCA9IHVua25vd24+KHBhdGg6IHN0cmluZywgYm9keT86IHVua25vd24sIGlkZW1wb3RlbmN5S2V5Pzogc3RyaW5nKTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMucmVxdWVzdDxUPignUE9TVCcsIHBhdGgsIGJvZHksIGlkZW1wb3RlbmN5S2V5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmljIFBVVCByZXF1ZXN0IHRvIGFueSBBUEkgcGF0aC5cbiAgICogVXNlIHRoaXMgZm9yIGVuZHBvaW50cyBub3QgeWV0IGNvdmVyZWQgYnkgdGhlIFNESy5cbiAgICovXG4gIGFzeW5jIHB1dDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBib2R5PzogdW5rbm93bik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oJ1BVVCcsIHBhdGgsIGJvZHkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEdlbmVyaWMgUEFUQ0ggcmVxdWVzdCB0byBhbnkgQVBJIHBhdGguXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgbm90IHlldCBjb3ZlcmVkIGJ5IHRoZSBTREsuXG4gICAqL1xuICBhc3luYyBwYXRjaDxUID0gdW5rbm93bj4ocGF0aDogc3RyaW5nLCBib2R5PzogdW5rbm93bik6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oJ1BBVENIJywgcGF0aCwgYm9keSk7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJpYyBERUxFVEUgcmVxdWVzdCB0byBhbnkgQVBJIHBhdGguXG4gICAqIFVzZSB0aGlzIGZvciBlbmRwb2ludHMgbm90IHlldCBjb3ZlcmVkIGJ5IHRoZSBTREsuXG4gICAqL1xuICBhc3luYyBkZWxldGU8VCA9IHZvaWQ+KHBhdGg6IHN0cmluZyk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3Q8VD4oJ0RFTEVURScsIHBhdGgpO1xuICB9XG5cbiAgcHJpdmF0ZSBleHRyYWN0UmF0ZUxpbWl0SW5mbyhoZWFkZXJzOiBodHRwLkluY29taW5nSHR0cEhlYWRlcnMpOiBSYXRlTGltaXRJbmZvIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBsaW1pdCA9IGhlYWRlcnNbJ3gtcmF0ZWxpbWl0LWxpbWl0J107XG4gICAgY29uc3QgcmVtYWluaW5nID0gaGVhZGVyc1sneC1yYXRlbGltaXQtcmVtYWluaW5nJ107XG4gICAgY29uc3QgcmVzZXQgPSBoZWFkZXJzWyd4LXJhdGVsaW1pdC1yZXNldCddO1xuXG4gICAgaWYgKGxpbWl0ICYmIHJlbWFpbmluZyAmJiByZXNldCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbGltaXQ6IHBhcnNlSW50KGxpbWl0IGFzIHN0cmluZywgMTApLFxuICAgICAgICByZW1haW5pbmc6IHBhcnNlSW50KHJlbWFpbmluZyBhcyBzdHJpbmcsIDEwKSxcbiAgICAgICAgcmVzZXQ6IHBhcnNlSW50KHJlc2V0IGFzIHN0cmluZywgMTApLFxuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgfVxuXG4gIHByaXZhdGUgaGFuZGxlRXJyb3IoXG4gICAgc3RhdHVzOiBudW1iZXIsXG4gICAgYm9keTogUmVjb3JkPHN0cmluZywgdW5rbm93bj4sXG4gICAgcmF0ZUxpbWl0SW5mbz86IFJhdGVMaW1pdEluZm9cbiAgKTogUmFpbGhvb2tFcnJvciB7XG4gICAgY29uc3QgbWVzc2FnZSA9IChib2R5Lm1lc3NhZ2UgYXMgc3RyaW5nKSB8fCAnVW5rbm93biBlcnJvcic7XG5cbiAgICBzd2l0Y2ggKHN0YXR1cykge1xuICAgICAgY2FzZSA0MDE6XG4gICAgICAgIHJldHVybiBuZXcgQXV0aGVudGljYXRpb25FcnJvcihtZXNzYWdlKTtcbiAgICAgIGNhc2UgNDA0OlxuICAgICAgICByZXR1cm4gbmV3IE5vdEZvdW5kRXJyb3IobWVzc2FnZSk7XG4gICAgICBjYXNlIDQyOTpcbiAgICAgICAgcmV0dXJuIG5ldyBSYXRlTGltaXRFcnJvcihcbiAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgIC8vIGByZXNldGAgaXMgYSBVbml4IHRpbWVzdGFtcCBpbiBzZWNvbmRzIChzZWUgUmF0ZUxpbWl0SW5mbyksIHNvIHRoZVxuICAgICAgICAgIC8vIGZhbGxiYWNrIGhhcyB0byBiZSBpbiBzZWNvbmRzIHRvbywgbm90IERhdGUubm93KCkgKyA2MDAwMC5cbiAgICAgICAgICByYXRlTGltaXRJbmZvIHx8IHsgbGltaXQ6IDAsIHJlbWFpbmluZzogMCwgcmVzZXQ6IE1hdGguZmxvb3IoRGF0ZS5ub3coKSAvIDEwMDApICsgNjAgfVxuICAgICAgICApO1xuICAgICAgY2FzZSA0MDA6XG4gICAgICAgIHJldHVybiBuZXcgVmFsaWRhdGlvbkVycm9yKFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgKGJvZHkuZmllbGRFcnJvcnMgYXMgUmVjb3JkPHN0cmluZywgc3RyaW5nPikgfHwge31cbiAgICAgICAgKTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBuZXcgUmFpbGhvb2tFcnJvcihtZXNzYWdlLCBzdGF0dXMsIGJvZHkuZXJyb3IgYXMgc3RyaW5nKTtcbiAgICB9XG4gIH1cbn1cblxuY2xhc3MgRXZlbnRzIHtcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBjbGllbnQ6IFJhaWxob29rKSB7fVxuXG4gIGFzeW5jIHNlbmQoZXZlbnQ6IEV2ZW50LCBpZGVtcG90ZW5jeUtleT86IHN0cmluZyk6IFByb21pc2U8RXZlbnRSZXNwb25zZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEV2ZW50UmVzcG9uc2U+KFxuICAgICAgJ1BPU1QnLFxuICAgICAgJy9hcGkvdjEvZXZlbnRzJyxcbiAgICAgIGV2ZW50LFxuICAgICAgaWRlbXBvdGVuY3lLZXlcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIEVuZHBvaW50cyB7XG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgY2xpZW50OiBSYWlsaG9vaykge31cblxuICBhc3luYyBjcmVhdGUocHJvamVjdElkOiBzdHJpbmcsIHBhcmFtczogRW5kcG9pbnRDcmVhdGVQYXJhbXMpOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnQ+KFxuICAgICAgJ1BPU1QnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2VuZHBvaW50c2AsXG4gICAgICBwYXJhbXNcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0KHByb2plY3RJZDogc3RyaW5nLCBlbmRwb2ludElkOiBzdHJpbmcpOiBQcm9taXNlPEVuZHBvaW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RW5kcG9pbnQ+KFxuICAgICAgJ0dFVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vZW5kcG9pbnRzLyR7ZW5kcG9pbnRJZH1gXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0cyBhIHByb2plY3QncyBlbmRwb2ludHMuXG4gICAqXG4gICAqIFRoZSBBUEkgcmV0dXJucyBhIFNwcmluZyBwYWdlIGVudmVsb3BlIGhlcmUsIG5vdCBhIGJhcmUgYXJyYXkg4oCUIHRoZVxuICAgKiBlbmRwb2ludHMgdGhlbXNlbHZlcyBhcmUgaW4gYC5jb250ZW50YC5cbiAgICovXG4gIGFzeW5jIGxpc3QoXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBFbmRwb2ludExpc3RQYXJhbXMgPSB7fVxuICApOiBQcm9taXNlPFBhZ2luYXRlZFJlc3BvbnNlPEVuZHBvaW50Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChwYXJhbXMucGFnZSAhPT0gdW5kZWZpbmVkKSBxdWVyeS5zZXQoJ3BhZ2UnLCBwYXJhbXMucGFnZS50b1N0cmluZygpKTtcbiAgICBpZiAocGFyYW1zLnNpemUgIT09IHVuZGVmaW5lZCkgcXVlcnkuc2V0KCdzaXplJywgcGFyYW1zLnNpemUudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5LnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGF0aCA9IGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHMke3F1ZXJ5U3RyaW5nID8gYD8ke3F1ZXJ5U3RyaW5nfWAgOiAnJ31gO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8UGFnaW5hdGVkUmVzcG9uc2U8RW5kcG9pbnQ+PignR0VUJywgcGF0aCk7XG4gIH1cblxuICBhc3luYyB1cGRhdGUoXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgZW5kcG9pbnRJZDogc3RyaW5nLFxuICAgIHBhcmFtczogRW5kcG9pbnRVcGRhdGVQYXJhbXNcbiAgKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEVuZHBvaW50PihcbiAgICAgICdQVVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2VuZHBvaW50cy8ke2VuZHBvaW50SWR9YCxcbiAgICAgIHBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGUocHJvamVjdElkOiBzdHJpbmcsIGVuZHBvaW50SWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PHZvaWQ+KFxuICAgICAgJ0RFTEVURScsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vZW5kcG9pbnRzLyR7ZW5kcG9pbnRJZH1gXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJvdGF0ZVNlY3JldChwcm9qZWN0SWQ6IHN0cmluZywgZW5kcG9pbnRJZDogc3RyaW5nKTogUHJvbWlzZTxFbmRwb2ludD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEVuZHBvaW50PihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9lbmRwb2ludHMvJHtlbmRwb2ludElkfS9yb3RhdGUtc2VjcmV0YFxuICAgICk7XG4gIH1cblxuICBhc3luYyB0ZXN0KHByb2plY3RJZDogc3RyaW5nLCBlbmRwb2ludElkOiBzdHJpbmcpOiBQcm9taXNlPEVuZHBvaW50VGVzdFJlc3VsdD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEVuZHBvaW50VGVzdFJlc3VsdD4oXG4gICAgICAnUE9TVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vZW5kcG9pbnRzLyR7ZW5kcG9pbnRJZH0vdGVzdGBcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIFN1YnNjcmlwdGlvbnMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUmFpbGhvb2spIHt9XG5cbiAgYXN5bmMgY3JlYXRlKHByb2plY3RJZDogc3RyaW5nLCBwYXJhbXM6IFN1YnNjcmlwdGlvbkNyZWF0ZVBhcmFtcyk6IFByb21pc2U8U3Vic2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8U3Vic2NyaXB0aW9uPihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9zdWJzY3JpcHRpb25zYCxcbiAgICAgIHBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXQocHJvamVjdElkOiBzdHJpbmcsIHN1YnNjcmlwdGlvbklkOiBzdHJpbmcpOiBQcm9taXNlPFN1YnNjcmlwdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PFN1YnNjcmlwdGlvbj4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9zdWJzY3JpcHRpb25zLyR7c3Vic2NyaXB0aW9uSWR9YFxuICAgICk7XG4gIH1cblxuICBhc3luYyBsaXN0KHByb2plY3RJZDogc3RyaW5nKTogUHJvbWlzZTxTdWJzY3JpcHRpb25bXT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PFN1YnNjcmlwdGlvbltdPihcbiAgICAgICdHRVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3N1YnNjcmlwdGlvbnNgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBzdWJzY3JpcHRpb25JZDogc3RyaW5nLFxuICAgIHBhcmFtczogUGFydGlhbDxTdWJzY3JpcHRpb25DcmVhdGVQYXJhbXM+XG4gICk6IFByb21pc2U8U3Vic2NyaXB0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8U3Vic2NyaXB0aW9uPihcbiAgICAgICdQVVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L3N1YnNjcmlwdGlvbnMvJHtzdWJzY3JpcHRpb25JZH1gLFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGRlbGV0ZShwcm9qZWN0SWQ6IHN0cmluZywgc3Vic2NyaXB0aW9uSWQ6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PHZvaWQ+KFxuICAgICAgJ0RFTEVURScsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vc3Vic2NyaXB0aW9ucy8ke3N1YnNjcmlwdGlvbklkfWBcbiAgICApO1xuICB9XG59XG5cbmNsYXNzIERlbGl2ZXJpZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUmFpbGhvb2spIHt9XG5cbiAgYXN5bmMgZ2V0KGRlbGl2ZXJ5SWQ6IHN0cmluZyk6IFByb21pc2U8RGVsaXZlcnk+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDxEZWxpdmVyeT4oJ0dFVCcsIGAvYXBpL3YxL2RlbGl2ZXJpZXMvJHtkZWxpdmVyeUlkfWApO1xuICB9XG5cbiAgYXN5bmMgbGlzdChcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IERlbGl2ZXJ5TGlzdFBhcmFtcyA9IHt9XG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8RGVsaXZlcnk+PiB7XG4gICAgY29uc3QgcXVlcnkgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7XG4gICAgaWYgKHBhcmFtcy5zdGF0dXMpIHF1ZXJ5LnNldCgnc3RhdHVzJywgcGFyYW1zLnN0YXR1cyk7XG4gICAgaWYgKHBhcmFtcy5lbmRwb2ludElkKSBxdWVyeS5zZXQoJ2VuZHBvaW50SWQnLCBwYXJhbXMuZW5kcG9pbnRJZCk7XG4gICAgaWYgKHBhcmFtcy5mcm9tRGF0ZSkgcXVlcnkuc2V0KCdmcm9tRGF0ZScsIHBhcmFtcy5mcm9tRGF0ZSk7XG4gICAgaWYgKHBhcmFtcy50b0RhdGUpIHF1ZXJ5LnNldCgndG9EYXRlJywgcGFyYW1zLnRvRGF0ZSk7XG4gICAgaWYgKHBhcmFtcy5wYWdlICE9PSB1bmRlZmluZWQpIHF1ZXJ5LnNldCgncGFnZScsIHBhcmFtcy5wYWdlLnRvU3RyaW5nKCkpO1xuICAgIGlmIChwYXJhbXMuc2l6ZSAhPT0gdW5kZWZpbmVkKSBxdWVyeS5zZXQoJ3NpemUnLCBwYXJhbXMuc2l6ZS50b1N0cmluZygpKTtcblxuICAgIGNvbnN0IHF1ZXJ5U3RyaW5nID0gcXVlcnkudG9TdHJpbmcoKTtcbiAgICBjb25zdCBwYXRoID0gYC9hcGkvdjEvZGVsaXZlcmllcy9wcm9qZWN0cy8ke3Byb2plY3RJZH0ke3F1ZXJ5U3RyaW5nID8gYD8ke3F1ZXJ5U3RyaW5nfWAgOiAnJ31gO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8UGFnaW5hdGVkUmVzcG9uc2U8RGVsaXZlcnk+PignR0VUJywgcGF0aCk7XG4gIH1cblxuICBhc3luYyBnZXRBdHRlbXB0cyhkZWxpdmVyeUlkOiBzdHJpbmcpOiBQcm9taXNlPERlbGl2ZXJ5QXR0ZW1wdFtdPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8RGVsaXZlcnlBdHRlbXB0W10+KFxuICAgICAgJ0dFVCcsXG4gICAgICBgL2FwaS92MS9kZWxpdmVyaWVzLyR7ZGVsaXZlcnlJZH0vYXR0ZW1wdHNgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHJlcGxheShkZWxpdmVyeUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDx2b2lkPignUE9TVCcsIGAvYXBpL3YxL2RlbGl2ZXJpZXMvJHtkZWxpdmVyeUlkfS9yZXBsYXlgKTtcbiAgfVxufVxuXG5jbGFzcyBJbmNvbWluZ1NvdXJjZXMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUmFpbGhvb2spIHt9XG5cbiAgYXN5bmMgY3JlYXRlKHByb2plY3RJZDogc3RyaW5nLCBwYXJhbXM6IEluY29taW5nU291cmNlQ3JlYXRlUGFyYW1zKTogUHJvbWlzZTxJbmNvbWluZ1NvdXJjZT4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEluY29taW5nU291cmNlPihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzYCxcbiAgICAgIHBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBnZXQocHJvamVjdElkOiBzdHJpbmcsIHNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPEluY29taW5nU291cmNlPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8SW5jb21pbmdTb3VyY2U+KFxuICAgICAgJ0dFVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdChwcm9qZWN0SWQ6IHN0cmluZyk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8SW5jb21pbmdTb3VyY2U+PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8UGFnaW5hdGVkUmVzcG9uc2U8SW5jb21pbmdTb3VyY2U+PihcbiAgICAgICdHRVQnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXNgXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIHVwZGF0ZShwcm9qZWN0SWQ6IHN0cmluZywgc291cmNlSWQ6IHN0cmluZywgcGFyYW1zOiBJbmNvbWluZ1NvdXJjZVVwZGF0ZVBhcmFtcyk6IFByb21pc2U8SW5jb21pbmdTb3VyY2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDxJbmNvbWluZ1NvdXJjZT4oXG4gICAgICAnUFVUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9YCxcbiAgICAgIHBhcmFtc1xuICAgICk7XG4gIH1cblxuICBhc3luYyBkZWxldGUocHJvamVjdElkOiBzdHJpbmcsIHNvdXJjZUlkOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDx2b2lkPihcbiAgICAgICdERUxFVEUnLFxuICAgICAgYC9hcGkvdjEvcHJvamVjdHMvJHtwcm9qZWN0SWR9L2luY29taW5nLXNvdXJjZXMvJHtzb3VyY2VJZH1gXG4gICAgKTtcbiAgfVxuXG4gIC8vIOKUgOKUgCBEZXN0aW5hdGlvbnMg4pSA4pSAXG5cbiAgYXN5bmMgY3JlYXRlRGVzdGluYXRpb24oXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgc291cmNlSWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IEluY29taW5nRGVzdGluYXRpb25DcmVhdGVQYXJhbXNcbiAgKTogUHJvbWlzZTxJbmNvbWluZ0Rlc3RpbmF0aW9uPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8SW5jb21pbmdEZXN0aW5hdGlvbj4oXG4gICAgICAnUE9TVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfS9kZXN0aW5hdGlvbnNgLFxuICAgICAgcGFyYW1zXG4gICAgKTtcbiAgfVxuXG4gIGFzeW5jIGdldERlc3RpbmF0aW9uKFxuICAgIHByb2plY3RJZDogc3RyaW5nLFxuICAgIHNvdXJjZUlkOiBzdHJpbmcsXG4gICAgZGVzdGluYXRpb25JZDogc3RyaW5nXG4gICk6IFByb21pc2U8SW5jb21pbmdEZXN0aW5hdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEluY29taW5nRGVzdGluYXRpb24+KFxuICAgICAgJ0dFVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfS9kZXN0aW5hdGlvbnMvJHtkZXN0aW5hdGlvbklkfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgbGlzdERlc3RpbmF0aW9ucyhcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBzb3VyY2VJZDogc3RyaW5nXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8SW5jb21pbmdEZXN0aW5hdGlvbj4+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDxQYWdpbmF0ZWRSZXNwb25zZTxJbmNvbWluZ0Rlc3RpbmF0aW9uPj4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9uc2BcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgdXBkYXRlRGVzdGluYXRpb24oXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgc291cmNlSWQ6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvbklkOiBzdHJpbmcsXG4gICAgcGFyYW1zOiBJbmNvbWluZ0Rlc3RpbmF0aW9uVXBkYXRlUGFyYW1zXG4gICk6IFByb21pc2U8SW5jb21pbmdEZXN0aW5hdGlvbj4ge1xuICAgIHJldHVybiB0aGlzLmNsaWVudC5yZXF1ZXN0PEluY29taW5nRGVzdGluYXRpb24+KFxuICAgICAgJ1BVVCcsXG4gICAgICBgL2FwaS92MS9wcm9qZWN0cy8ke3Byb2plY3RJZH0vaW5jb21pbmctc291cmNlcy8ke3NvdXJjZUlkfS9kZXN0aW5hdGlvbnMvJHtkZXN0aW5hdGlvbklkfWAsXG4gICAgICBwYXJhbXNcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZGVsZXRlRGVzdGluYXRpb24oXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgc291cmNlSWQ6IHN0cmluZyxcbiAgICBkZXN0aW5hdGlvbklkOiBzdHJpbmdcbiAgKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8dm9pZD4oXG4gICAgICAnREVMRVRFJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1zb3VyY2VzLyR7c291cmNlSWR9L2Rlc3RpbmF0aW9ucy8ke2Rlc3RpbmF0aW9uSWR9YFxuICAgICk7XG4gIH1cbn1cblxuY2xhc3MgSW5jb21pbmdFdmVudHMge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNsaWVudDogUmFpbGhvb2spIHt9XG5cbiAgYXN5bmMgbGlzdChcbiAgICBwcm9qZWN0SWQ6IHN0cmluZyxcbiAgICBwYXJhbXM6IEluY29taW5nRXZlbnRMaXN0UGFyYW1zID0ge31cbiAgKTogUHJvbWlzZTxQYWdpbmF0ZWRSZXNwb25zZTxJbmNvbWluZ0V2ZW50Pj4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpO1xuICAgIGlmIChwYXJhbXMuc291cmNlSWQpIHF1ZXJ5LnNldCgnc291cmNlSWQnLCBwYXJhbXMuc291cmNlSWQpO1xuICAgIGlmIChwYXJhbXMucGFnZSAhPT0gdW5kZWZpbmVkKSBxdWVyeS5zZXQoJ3BhZ2UnLCBwYXJhbXMucGFnZS50b1N0cmluZygpKTtcbiAgICBpZiAocGFyYW1zLnNpemUgIT09IHVuZGVmaW5lZCkgcXVlcnkuc2V0KCdzaXplJywgcGFyYW1zLnNpemUudG9TdHJpbmcoKSk7XG5cbiAgICBjb25zdCBxdWVyeVN0cmluZyA9IHF1ZXJ5LnRvU3RyaW5nKCk7XG4gICAgY29uc3QgcGF0aCA9IGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1ldmVudHMke3F1ZXJ5U3RyaW5nID8gYD8ke3F1ZXJ5U3RyaW5nfWAgOiAnJ31gO1xuXG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8UGFnaW5hdGVkUmVzcG9uc2U8SW5jb21pbmdFdmVudD4+KCdHRVQnLCBwYXRoKTtcbiAgfVxuXG4gIGFzeW5jIGdldChwcm9qZWN0SWQ6IHN0cmluZywgZXZlbnRJZDogc3RyaW5nKTogUHJvbWlzZTxJbmNvbWluZ0V2ZW50PiB7XG4gICAgcmV0dXJuIHRoaXMuY2xpZW50LnJlcXVlc3Q8SW5jb21pbmdFdmVudD4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1ldmVudHMvJHtldmVudElkfWBcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgZ2V0QXR0ZW1wdHMoXG4gICAgcHJvamVjdElkOiBzdHJpbmcsXG4gICAgZXZlbnRJZDogc3RyaW5nXG4gICk6IFByb21pc2U8UGFnaW5hdGVkUmVzcG9uc2U8SW5jb21pbmdGb3J3YXJkQXR0ZW1wdD4+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDxQYWdpbmF0ZWRSZXNwb25zZTxJbmNvbWluZ0ZvcndhcmRBdHRlbXB0Pj4oXG4gICAgICAnR0VUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1ldmVudHMvJHtldmVudElkfS9hdHRlbXB0c2BcbiAgICApO1xuICB9XG5cbiAgYXN5bmMgcmVwbGF5KHByb2plY3RJZDogc3RyaW5nLCBldmVudElkOiBzdHJpbmcpOiBQcm9taXNlPFJlcGxheUV2ZW50UmVzcG9uc2U+IHtcbiAgICByZXR1cm4gdGhpcy5jbGllbnQucmVxdWVzdDxSZXBsYXlFdmVudFJlc3BvbnNlPihcbiAgICAgICdQT1NUJyxcbiAgICAgIGAvYXBpL3YxL3Byb2plY3RzLyR7cHJvamVjdElkfS9pbmNvbWluZy1ldmVudHMvJHtldmVudElkfS9yZXBsYXlgXG4gICAgKTtcbiAgfVxufVxuIl19
@@ -0,0 +1,28 @@
1
+ import { RateLimitInfo } from './types';
2
+ export declare class RailhookError 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 RailhookError {
8
+ constructor(message?: string);
9
+ }
10
+ export declare class RateLimitError extends RailhookError {
11
+ readonly rateLimitInfo: RateLimitInfo;
12
+ constructor(message: string, rateLimitInfo: RateLimitInfo);
13
+ /**
14
+ * Milliseconds to wait before retrying.
15
+ *
16
+ * `rateLimitInfo.reset` is the raw `X-RateLimit-Reset` header, which the API
17
+ * sends as a Unix timestamp in **seconds**; comparing it to `Date.now()`
18
+ * (milliseconds) directly always yields a large negative number, i.e. 0.
19
+ */
20
+ get retryAfter(): number;
21
+ }
22
+ export declare class ValidationError extends RailhookError {
23
+ readonly fieldErrors: Record<string, string>;
24
+ constructor(message: string, fieldErrors?: Record<string, string>);
25
+ }
26
+ export declare class NotFoundError extends RailhookError {
27
+ constructor(message?: string);
28
+ }
package/dist/errors.js ADDED
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotFoundError = exports.ValidationError = exports.RateLimitError = exports.AuthenticationError = exports.RailhookError = void 0;
4
+ class RailhookError extends Error {
5
+ constructor(message, status, code) {
6
+ super(message);
7
+ this.name = 'RailhookError';
8
+ this.status = status;
9
+ this.code = code;
10
+ }
11
+ }
12
+ exports.RailhookError = RailhookError;
13
+ class AuthenticationError extends RailhookError {
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 RailhookError {
21
+ constructor(message, rateLimitInfo) {
22
+ super(message, 429, 'rate_limit_exceeded');
23
+ this.name = 'RateLimitError';
24
+ this.rateLimitInfo = rateLimitInfo;
25
+ }
26
+ /**
27
+ * Milliseconds to wait before retrying.
28
+ *
29
+ * `rateLimitInfo.reset` is the raw `X-RateLimit-Reset` header, which the API
30
+ * sends as a Unix timestamp in **seconds**; comparing it to `Date.now()`
31
+ * (milliseconds) directly always yields a large negative number, i.e. 0.
32
+ */
33
+ get retryAfter() {
34
+ return Math.max(0, this.rateLimitInfo.reset * 1000 - Date.now());
35
+ }
36
+ }
37
+ exports.RateLimitError = RateLimitError;
38
+ class ValidationError extends RailhookError {
39
+ constructor(message, fieldErrors = {}) {
40
+ super(message, 400, 'validation_error');
41
+ this.name = 'ValidationError';
42
+ this.fieldErrors = fieldErrors;
43
+ }
44
+ }
45
+ exports.ValidationError = ValidationError;
46
+ class NotFoundError extends RailhookError {
47
+ constructor(message = 'Resource not found') {
48
+ super(message, 404, 'not_found');
49
+ this.name = 'NotFoundError';
50
+ }
51
+ }
52
+ exports.NotFoundError = NotFoundError;
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3JzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2Vycm9ycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFFQSxNQUFhLGFBQWMsU0FBUSxLQUFLO0lBSXRDLFlBQVksT0FBZSxFQUFFLE1BQWMsRUFBRSxJQUFhO1FBQ3hELEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNmLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO1FBQzVCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxJQUFJLEdBQUcsSUFBSSxDQUFDO0lBQ25CLENBQUM7Q0FDRjtBQVZELHNDQVVDO0FBRUQsTUFBYSxtQkFBb0IsU0FBUSxhQUFhO0lBQ3BELFlBQVksVUFBa0IsaUJBQWlCO1FBQzdDLEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLHNCQUFzQixDQUFDLENBQUM7UUFDNUMsSUFBSSxDQUFDLElBQUksR0FBRyxxQkFBcUIsQ0FBQztJQUNwQyxDQUFDO0NBQ0Y7QUFMRCxrREFLQztBQUVELE1BQWEsY0FBZSxTQUFRLGFBQWE7SUFHL0MsWUFBWSxPQUFlLEVBQUUsYUFBNEI7UUFDdkQsS0FBSyxDQUFDLE9BQU8sRUFBRSxHQUFHLEVBQUUscUJBQXFCLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLGdCQUFnQixDQUFDO1FBQzdCLElBQUksQ0FBQyxhQUFhLEdBQUcsYUFBYSxDQUFDO0lBQ3JDLENBQUM7SUFFRDs7Ozs7O09BTUc7SUFDSCxJQUFJLFVBQVU7UUFDWixPQUFPLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsS0FBSyxHQUFHLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUNuRSxDQUFDO0NBQ0Y7QUFuQkQsd0NBbUJDO0FBRUQsTUFBYSxlQUFnQixTQUFRLGFBQWE7SUFHaEQsWUFBWSxPQUFlLEVBQUUsY0FBc0MsRUFBRTtRQUNuRSxLQUFLLENBQUMsT0FBTyxFQUFFLEdBQUcsRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO1FBQ3hDLElBQUksQ0FBQyxJQUFJLEdBQUcsaUJBQWlCLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxXQUFXLENBQUM7SUFDakMsQ0FBQztDQUNGO0FBUkQsMENBUUM7QUFFRCxNQUFhLGFBQWMsU0FBUSxhQUFhO0lBQzlDLFlBQVksVUFBa0Isb0JBQW9CO1FBQ2hELEtBQUssQ0FBQyxPQUFPLEVBQUUsR0FBRyxFQUFFLFdBQVcsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQyxJQUFJLEdBQUcsZUFBZSxDQUFDO0lBQzlCLENBQUM7Q0FDRjtBQUxELHNDQUtDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgUmF0ZUxpbWl0SW5mbyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgY2xhc3MgUmFpbGhvb2tFcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHN0YXR1czogbnVtYmVyO1xuICBwdWJsaWMgcmVhZG9ubHkgY29kZT86IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcsIHN0YXR1czogbnVtYmVyLCBjb2RlPzogc3RyaW5nKSB7XG4gICAgc3VwZXIobWVzc2FnZSk7XG4gICAgdGhpcy5uYW1lID0gJ1JhaWxob29rRXJyb3InO1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhlbnRpY2F0aW9uRXJyb3IgZXh0ZW5kcyBSYWlsaG9va0Vycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ0ludmFsaWQgQVBJIGtleScpIHtcbiAgICBzdXBlcihtZXNzYWdlLCA0MDEsICdhdXRoZW50aWNhdGlvbl9lcnJvcicpO1xuICAgIHRoaXMubmFtZSA9ICdBdXRoZW50aWNhdGlvbkVycm9yJztcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgUmF0ZUxpbWl0RXJyb3IgZXh0ZW5kcyBSYWlsaG9va0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IHJhdGVMaW1pdEluZm86IFJhdGVMaW1pdEluZm87XG5cbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nLCByYXRlTGltaXRJbmZvOiBSYXRlTGltaXRJbmZvKSB7XG4gICAgc3VwZXIobWVzc2FnZSwgNDI5LCAncmF0ZV9saW1pdF9leGNlZWRlZCcpO1xuICAgIHRoaXMubmFtZSA9ICdSYXRlTGltaXRFcnJvcic7XG4gICAgdGhpcy5yYXRlTGltaXRJbmZvID0gcmF0ZUxpbWl0SW5mbztcbiAgfVxuXG4gIC8qKlxuICAgKiBNaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgcmV0cnlpbmcuXG4gICAqXG4gICAqIGByYXRlTGltaXRJbmZvLnJlc2V0YCBpcyB0aGUgcmF3IGBYLVJhdGVMaW1pdC1SZXNldGAgaGVhZGVyLCB3aGljaCB0aGUgQVBJXG4gICAqIHNlbmRzIGFzIGEgVW5peCB0aW1lc3RhbXAgaW4gKipzZWNvbmRzKio7IGNvbXBhcmluZyBpdCB0byBgRGF0ZS5ub3coKWBcbiAgICogKG1pbGxpc2Vjb25kcykgZGlyZWN0bHkgYWx3YXlzIHlpZWxkcyBhIGxhcmdlIG5lZ2F0aXZlIG51bWJlciwgaS5lLiAwLlxuICAgKi9cbiAgZ2V0IHJldHJ5QWZ0ZXIoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gTWF0aC5tYXgoMCwgdGhpcy5yYXRlTGltaXRJbmZvLnJlc2V0ICogMTAwMCAtIERhdGUubm93KCkpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBSYWlsaG9va0Vycm9yIHtcbiAgcHVibGljIHJlYWRvbmx5IGZpZWxkRXJyb3JzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+O1xuXG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZywgZmllbGRFcnJvcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fSkge1xuICAgIHN1cGVyKG1lc3NhZ2UsIDQwMCwgJ3ZhbGlkYXRpb25fZXJyb3InKTtcbiAgICB0aGlzLm5hbWUgPSAnVmFsaWRhdGlvbkVycm9yJztcbiAgICB0aGlzLmZpZWxkRXJyb3JzID0gZmllbGRFcnJvcnM7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIE5vdEZvdW5kRXJyb3IgZXh0ZW5kcyBSYWlsaG9va0Vycm9yIHtcbiAgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nID0gJ1Jlc291cmNlIG5vdCBmb3VuZCcpIHtcbiAgICBzdXBlcihtZXNzYWdlLCA0MDQsICdub3RfZm91bmQnKTtcbiAgICB0aGlzLm5hbWUgPSAnTm90Rm91bmRFcnJvcic7XG4gIH1cbn1cbiJdfQ==
@@ -0,0 +1,7 @@
1
+ export { Railhook } from './client';
2
+ export { RailhookError, RateLimitError, AuthenticationError, ValidationError, NotFoundError } from './errors';
3
+ export { Railhook as WebhookPlatform } from './client';
4
+ export { RailhookError as WebhookPlatformError } from './errors';
5
+ export { verifySignature, verifyStandardWebhook, constructEvent, generateSignature } from './webhooks';
6
+ export type { WebhookHeaders, VerifyOptions } from './webhooks';
7
+ export * from './types';
package/dist/index.js ADDED
@@ -0,0 +1,37 @@
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.generateSignature = exports.constructEvent = exports.verifyStandardWebhook = exports.verifySignature = exports.WebhookPlatformError = exports.WebhookPlatform = exports.NotFoundError = exports.ValidationError = exports.AuthenticationError = exports.RateLimitError = exports.RailhookError = exports.Railhook = void 0;
18
+ var client_1 = require("./client");
19
+ Object.defineProperty(exports, "Railhook", { enumerable: true, get: function () { return client_1.Railhook; } });
20
+ var errors_1 = require("./errors");
21
+ Object.defineProperty(exports, "RailhookError", { enumerable: true, get: function () { return errors_1.RailhookError; } });
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
+ Object.defineProperty(exports, "NotFoundError", { enumerable: true, get: function () { return errors_1.NotFoundError; } });
26
+ // Backward-compatible aliases
27
+ var client_2 = require("./client");
28
+ Object.defineProperty(exports, "WebhookPlatform", { enumerable: true, get: function () { return client_2.Railhook; } });
29
+ var errors_2 = require("./errors");
30
+ Object.defineProperty(exports, "WebhookPlatformError", { enumerable: true, get: function () { return errors_2.RailhookError; } });
31
+ var webhooks_1 = require("./webhooks");
32
+ Object.defineProperty(exports, "verifySignature", { enumerable: true, get: function () { return webhooks_1.verifySignature; } });
33
+ Object.defineProperty(exports, "verifyStandardWebhook", { enumerable: true, get: function () { return webhooks_1.verifyStandardWebhook; } });
34
+ Object.defineProperty(exports, "constructEvent", { enumerable: true, get: function () { return webhooks_1.constructEvent; } });
35
+ Object.defineProperty(exports, "generateSignature", { enumerable: true, get: function () { return webhooks_1.generateSignature; } });
36
+ __exportStar(require("./types"), exports);
37
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxtQ0FBb0M7QUFBM0Isa0dBQUEsUUFBUSxPQUFBO0FBQ2pCLG1DQUE4RztBQUFyRyx1R0FBQSxhQUFhLE9BQUE7QUFBRSx3R0FBQSxjQUFjLE9BQUE7QUFBRSw2R0FBQSxtQkFBbUIsT0FBQTtBQUFFLHlHQUFBLGVBQWUsT0FBQTtBQUFFLHVHQUFBLGFBQWEsT0FBQTtBQUUzRiw4QkFBOEI7QUFDOUIsbUNBQXVEO0FBQTlDLHlHQUFBLFFBQVEsT0FBbUI7QUFDcEMsbUNBQWlFO0FBQXhELDhHQUFBLGFBQWEsT0FBd0I7QUFDOUMsdUNBQXVHO0FBQTlGLDJHQUFBLGVBQWUsT0FBQTtBQUFFLGlIQUFBLHFCQUFxQixPQUFBO0FBQUUsMEdBQUEsY0FBYyxPQUFBO0FBQUUsNkdBQUEsaUJBQWlCLE9BQUE7QUFFbEYsMENBQXdCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgUmFpbGhvb2sgfSBmcm9tICcuL2NsaWVudCc7XG5leHBvcnQgeyBSYWlsaG9va0Vycm9yLCBSYXRlTGltaXRFcnJvciwgQXV0aGVudGljYXRpb25FcnJvciwgVmFsaWRhdGlvbkVycm9yLCBOb3RGb3VuZEVycm9yIH0gZnJvbSAnLi9lcnJvcnMnO1xuXG4vLyBCYWNrd2FyZC1jb21wYXRpYmxlIGFsaWFzZXNcbmV4cG9ydCB7IFJhaWxob29rIGFzIFdlYmhvb2tQbGF0Zm9ybSB9IGZyb20gJy4vY2xpZW50JztcbmV4cG9ydCB7IFJhaWxob29rRXJyb3IgYXMgV2ViaG9va1BsYXRmb3JtRXJyb3IgfSBmcm9tICcuL2Vycm9ycyc7XG5leHBvcnQgeyB2ZXJpZnlTaWduYXR1cmUsIHZlcmlmeVN0YW5kYXJkV2ViaG9vaywgY29uc3RydWN0RXZlbnQsIGdlbmVyYXRlU2lnbmF0dXJlIH0gZnJvbSAnLi93ZWJob29rcyc7XG5leHBvcnQgdHlwZSB7IFdlYmhvb2tIZWFkZXJzLCBWZXJpZnlPcHRpb25zIH0gZnJvbSAnLi93ZWJob29rcyc7XG5leHBvcnQgKiBmcm9tICcuL3R5cGVzJztcbiJdfQ==