@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/README.md +476 -0
- package/dist/__tests__/client.test.d.ts +1 -0
- package/dist/__tests__/client.test.js +105 -0
- package/dist/__tests__/incoming.test.d.ts +1 -0
- package/dist/__tests__/incoming.test.js +316 -0
- package/dist/__tests__/package-identity.test.d.ts +1 -0
- package/dist/__tests__/package-identity.test.js +19 -0
- package/dist/__tests__/standardWebhooks.test.d.ts +1 -0
- package/dist/__tests__/standardWebhooks.test.js +102 -0
- package/dist/__tests__/webhooks.test.d.ts +1 -0
- package/dist/__tests__/webhooks.test.js +190 -0
- package/dist/client.d.ts +103 -0
- package/dist/client.js +344 -0
- package/dist/errors.d.ts +28 -0
- package/dist/errors.js +53 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +37 -0
- package/dist/types.d.ts +293 -0
- package/dist/types.js +3 -0
- package/dist/webhooks.d.ts +83 -0
- package/dist/webhooks.js +241 -0
- package/package.json +47 -0
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
|
package/dist/errors.d.ts
ADDED
|
@@ -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==
|
package/dist/index.d.ts
ADDED
|
@@ -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==
|