@jimiford/channel-webex 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,33 @@
1
+ /**
2
+ * OpenClaw Webex Channel Plugin
3
+ *
4
+ * A channel plugin for integrating Cisco Webex messaging with OpenClaw.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { WebexChannel, createWebexChannel, createAndInitialize } from './channel';
9
+ export { WebexSender, WebexApiRequestError } from './send';
10
+ export { WebexWebhookHandler, WebhookValidationError } from './webhook';
11
+ export type { WebexChannelConfig, DmPolicy, WebexPerson, WebexRoom, WebexMessage, WebexAttachment, AdaptiveCard, WebexWebhook, WebexWebhookResource, WebexWebhookEvent, WebexWebhookPayload, WebexWebhookData, CreateMessageRequest, CreateWebhookRequest, WebexApiError, PaginatedResponse, OpenClawEnvelope, OpenClawAttachment, OpenClawOutboundMessage, WebexChannelPlugin, WebhookHandler, RetryOptions, RequestOptions, } from './types';
12
+ import { createWebexChannel } from './channel';
13
+ export default createWebexChannel;
14
+ /**
15
+ * Plugin metadata for OpenClaw discovery
16
+ */
17
+ export declare const pluginMetadata: {
18
+ name: string;
19
+ version: string;
20
+ type: string;
21
+ channel: string;
22
+ description: string;
23
+ author: string;
24
+ repository: string;
25
+ capabilities: {
26
+ dm: boolean;
27
+ groups: boolean;
28
+ threads: boolean;
29
+ attachments: boolean;
30
+ cards: boolean;
31
+ webhooks: boolean;
32
+ };
33
+ };
package/dist/index.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ /**
3
+ * OpenClaw Webex Channel Plugin
4
+ *
5
+ * A channel plugin for integrating Cisco Webex messaging with OpenClaw.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.pluginMetadata = exports.WebhookValidationError = exports.WebexWebhookHandler = exports.WebexApiRequestError = exports.WebexSender = exports.createAndInitialize = exports.createWebexChannel = exports.WebexChannel = void 0;
11
+ // Main channel export
12
+ var channel_1 = require("./channel");
13
+ Object.defineProperty(exports, "WebexChannel", { enumerable: true, get: function () { return channel_1.WebexChannel; } });
14
+ Object.defineProperty(exports, "createWebexChannel", { enumerable: true, get: function () { return channel_1.createWebexChannel; } });
15
+ Object.defineProperty(exports, "createAndInitialize", { enumerable: true, get: function () { return channel_1.createAndInitialize; } });
16
+ // Sender export
17
+ var send_1 = require("./send");
18
+ Object.defineProperty(exports, "WebexSender", { enumerable: true, get: function () { return send_1.WebexSender; } });
19
+ Object.defineProperty(exports, "WebexApiRequestError", { enumerable: true, get: function () { return send_1.WebexApiRequestError; } });
20
+ // Webhook handler export
21
+ var webhook_1 = require("./webhook");
22
+ Object.defineProperty(exports, "WebexWebhookHandler", { enumerable: true, get: function () { return webhook_1.WebexWebhookHandler; } });
23
+ Object.defineProperty(exports, "WebhookValidationError", { enumerable: true, get: function () { return webhook_1.WebhookValidationError; } });
24
+ // Default export: factory function
25
+ const channel_2 = require("./channel");
26
+ exports.default = channel_2.createWebexChannel;
27
+ /**
28
+ * Plugin metadata for OpenClaw discovery
29
+ */
30
+ exports.pluginMetadata = {
31
+ name: '@openclaw/channel-webex',
32
+ version: '1.0.0',
33
+ type: 'channel',
34
+ channel: 'webex',
35
+ description: 'Cisco Webex messaging channel plugin for OpenClaw',
36
+ author: 'OpenClaw Contributors',
37
+ repository: 'https://github.com/openclaw/channel-webex',
38
+ capabilities: {
39
+ dm: true,
40
+ groups: true,
41
+ threads: true,
42
+ attachments: true,
43
+ cards: true,
44
+ webhooks: true,
45
+ },
46
+ };
47
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Ozs7R0FNRzs7O0FBRUgsc0JBQXNCO0FBQ3RCLHFDQUFrRjtBQUF6RSx1R0FBQSxZQUFZLE9BQUE7QUFBRSw2R0FBQSxrQkFBa0IsT0FBQTtBQUFFLDhHQUFBLG1CQUFtQixPQUFBO0FBRTlELGdCQUFnQjtBQUNoQiwrQkFBMkQ7QUFBbEQsbUdBQUEsV0FBVyxPQUFBO0FBQUUsNEdBQUEsb0JBQW9CLE9BQUE7QUFFMUMseUJBQXlCO0FBQ3pCLHFDQUF3RTtBQUEvRCw4R0FBQSxtQkFBbUIsT0FBQTtBQUFFLGlIQUFBLHNCQUFzQixPQUFBO0FBd0NwRCxtQ0FBbUM7QUFDbkMsdUNBQStDO0FBQy9DLGtCQUFlLDRCQUFrQixDQUFDO0FBRWxDOztHQUVHO0FBQ1UsUUFBQSxjQUFjLEdBQUc7SUFDNUIsSUFBSSxFQUFFLHlCQUF5QjtJQUMvQixPQUFPLEVBQUUsT0FBTztJQUNoQixJQUFJLEVBQUUsU0FBUztJQUNmLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLFdBQVcsRUFBRSxtREFBbUQ7SUFDaEUsTUFBTSxFQUFFLHVCQUF1QjtJQUMvQixVQUFVLEVBQUUsMkNBQTJDO0lBQ3ZELFlBQVksRUFBRTtRQUNaLEVBQUUsRUFBRSxJQUFJO1FBQ1IsTUFBTSxFQUFFLElBQUk7UUFDWixPQUFPLEVBQUUsSUFBSTtRQUNiLFdBQVcsRUFBRSxJQUFJO1FBQ2pCLEtBQUssRUFBRSxJQUFJO1FBQ1gsUUFBUSxFQUFFLElBQUk7S0FDZjtDQUNGLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIE9wZW5DbGF3IFdlYmV4IENoYW5uZWwgUGx1Z2luXG4gKlxuICogQSBjaGFubmVsIHBsdWdpbiBmb3IgaW50ZWdyYXRpbmcgQ2lzY28gV2ViZXggbWVzc2FnaW5nIHdpdGggT3BlbkNsYXcuXG4gKlxuICogQHBhY2thZ2VEb2N1bWVudGF0aW9uXG4gKi9cblxuLy8gTWFpbiBjaGFubmVsIGV4cG9ydFxuZXhwb3J0IHsgV2ViZXhDaGFubmVsLCBjcmVhdGVXZWJleENoYW5uZWwsIGNyZWF0ZUFuZEluaXRpYWxpemUgfSBmcm9tICcuL2NoYW5uZWwnO1xuXG4vLyBTZW5kZXIgZXhwb3J0XG5leHBvcnQgeyBXZWJleFNlbmRlciwgV2ViZXhBcGlSZXF1ZXN0RXJyb3IgfSBmcm9tICcuL3NlbmQnO1xuXG4vLyBXZWJob29rIGhhbmRsZXIgZXhwb3J0XG5leHBvcnQgeyBXZWJleFdlYmhvb2tIYW5kbGVyLCBXZWJob29rVmFsaWRhdGlvbkVycm9yIH0gZnJvbSAnLi93ZWJob29rJztcblxuLy8gVHlwZSBleHBvcnRzXG5leHBvcnQgdHlwZSB7XG4gIC8vIENvbmZpZ3VyYXRpb25cbiAgV2ViZXhDaGFubmVsQ29uZmlnLFxuICBEbVBvbGljeSxcblxuICAvLyBXZWJleCBBUEkgdHlwZXNcbiAgV2ViZXhQZXJzb24sXG4gIFdlYmV4Um9vbSxcbiAgV2ViZXhNZXNzYWdlLFxuICBXZWJleEF0dGFjaG1lbnQsXG4gIEFkYXB0aXZlQ2FyZCxcbiAgV2ViZXhXZWJob29rLFxuICBXZWJleFdlYmhvb2tSZXNvdXJjZSxcbiAgV2ViZXhXZWJob29rRXZlbnQsXG4gIFdlYmV4V2ViaG9va1BheWxvYWQsXG4gIFdlYmV4V2ViaG9va0RhdGEsXG5cbiAgLy8gUmVxdWVzdC9SZXNwb25zZSB0eXBlc1xuICBDcmVhdGVNZXNzYWdlUmVxdWVzdCxcbiAgQ3JlYXRlV2ViaG9va1JlcXVlc3QsXG4gIFdlYmV4QXBpRXJyb3IsXG4gIFBhZ2luYXRlZFJlc3BvbnNlLFxuXG4gIC8vIE9wZW5DbGF3IGVudmVsb3BlIHR5cGVzXG4gIE9wZW5DbGF3RW52ZWxvcGUsXG4gIE9wZW5DbGF3QXR0YWNobWVudCxcbiAgT3BlbkNsYXdPdXRib3VuZE1lc3NhZ2UsXG5cbiAgLy8gUGx1Z2luIHR5cGVzXG4gIFdlYmV4Q2hhbm5lbFBsdWdpbixcbiAgV2ViaG9va0hhbmRsZXIsXG5cbiAgLy8gSW50ZXJuYWwgdHlwZXMgKGV4cG9ydGVkIGZvciBhZHZhbmNlZCB1c2UpXG4gIFJldHJ5T3B0aW9ucyxcbiAgUmVxdWVzdE9wdGlvbnMsXG59IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBEZWZhdWx0IGV4cG9ydDogZmFjdG9yeSBmdW5jdGlvblxuaW1wb3J0IHsgY3JlYXRlV2ViZXhDaGFubmVsIH0gZnJvbSAnLi9jaGFubmVsJztcbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVdlYmV4Q2hhbm5lbDtcblxuLyoqXG4gKiBQbHVnaW4gbWV0YWRhdGEgZm9yIE9wZW5DbGF3IGRpc2NvdmVyeVxuICovXG5leHBvcnQgY29uc3QgcGx1Z2luTWV0YWRhdGEgPSB7XG4gIG5hbWU6ICdAb3BlbmNsYXcvY2hhbm5lbC13ZWJleCcsXG4gIHZlcnNpb246ICcxLjAuMCcsXG4gIHR5cGU6ICdjaGFubmVsJyxcbiAgY2hhbm5lbDogJ3dlYmV4JyxcbiAgZGVzY3JpcHRpb246ICdDaXNjbyBXZWJleCBtZXNzYWdpbmcgY2hhbm5lbCBwbHVnaW4gZm9yIE9wZW5DbGF3JyxcbiAgYXV0aG9yOiAnT3BlbkNsYXcgQ29udHJpYnV0b3JzJyxcbiAgcmVwb3NpdG9yeTogJ2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVuY2xhdy9jaGFubmVsLXdlYmV4JyxcbiAgY2FwYWJpbGl0aWVzOiB7XG4gICAgZG06IHRydWUsXG4gICAgZ3JvdXBzOiB0cnVlLFxuICAgIHRocmVhZHM6IHRydWUsXG4gICAgYXR0YWNobWVudHM6IHRydWUsXG4gICAgY2FyZHM6IHRydWUsXG4gICAgd2ViaG9va3M6IHRydWUsXG4gIH0sXG59O1xuIl19
package/dist/send.d.ts ADDED
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Webex Message Sending Module
3
+ */
4
+ import type { WebexChannelConfig, WebexMessage, OpenClawOutboundMessage } from './types';
5
+ export declare class WebexSender {
6
+ private config;
7
+ private apiBaseUrl;
8
+ private retryOptions;
9
+ constructor(config: WebexChannelConfig);
10
+ /**
11
+ * Send a message to Webex
12
+ */
13
+ send(message: OpenClawOutboundMessage): Promise<WebexMessage>;
14
+ /**
15
+ * Send a text message to a room
16
+ */
17
+ sendToRoom(roomId: string, text: string, markdown?: string): Promise<WebexMessage>;
18
+ /**
19
+ * Send a direct message to a person by ID
20
+ */
21
+ sendDirectById(personId: string, text: string, markdown?: string): Promise<WebexMessage>;
22
+ /**
23
+ * Send a direct message to a person by email
24
+ */
25
+ sendDirectByEmail(email: string, text: string, markdown?: string): Promise<WebexMessage>;
26
+ /**
27
+ * Send a message with file attachment
28
+ */
29
+ sendWithFile(roomId: string, text: string, fileUrl: string): Promise<WebexMessage>;
30
+ /**
31
+ * Send a threaded reply
32
+ */
33
+ sendReply(roomId: string, parentId: string, text: string, markdown?: string): Promise<WebexMessage>;
34
+ /**
35
+ * Get a message by ID
36
+ */
37
+ getMessage(messageId: string): Promise<WebexMessage>;
38
+ /**
39
+ * Delete a message by ID
40
+ */
41
+ deleteMessage(messageId: string): Promise<void>;
42
+ /**
43
+ * Build a Webex message request from an OpenClaw outbound message
44
+ */
45
+ private buildMessageRequest;
46
+ /**
47
+ * Create a message via the Webex API
48
+ */
49
+ private createMessage;
50
+ /**
51
+ * Validate a message request before sending
52
+ */
53
+ private validateMessageRequest;
54
+ /**
55
+ * Make an API request with retry logic
56
+ */
57
+ private request;
58
+ /**
59
+ * Execute a single API request
60
+ */
61
+ private executeRequest;
62
+ /**
63
+ * Parse error response from Webex API
64
+ */
65
+ private parseErrorResponse;
66
+ /**
67
+ * Determine if a request should be retried
68
+ */
69
+ private shouldRetry;
70
+ /**
71
+ * Calculate backoff delay with exponential backoff and jitter
72
+ */
73
+ private calculateBackoff;
74
+ /**
75
+ * Sleep for a given number of milliseconds
76
+ */
77
+ private sleep;
78
+ }
79
+ /**
80
+ * Custom error class for Webex API errors
81
+ */
82
+ export declare class WebexApiRequestError extends Error {
83
+ readonly statusCode: number;
84
+ readonly trackingId?: string;
85
+ readonly details?: Array<{
86
+ description: string;
87
+ }>;
88
+ constructor(message: string, statusCode: number, trackingId?: string, details?: Array<{
89
+ description: string;
90
+ }>);
91
+ toJSON(): object;
92
+ }
package/dist/send.js ADDED
@@ -0,0 +1,304 @@
1
+ "use strict";
2
+ /**
3
+ * Webex Message Sending Module
4
+ */
5
+ var __importDefault = (this && this.__importDefault) || function (mod) {
6
+ return (mod && mod.__esModule) ? mod : { "default": mod };
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.WebexApiRequestError = exports.WebexSender = void 0;
10
+ const node_fetch_1 = __importDefault(require("node-fetch"));
11
+ const DEFAULT_API_BASE_URL = 'https://webexapis.com/v1';
12
+ const DEFAULT_MAX_RETRIES = 3;
13
+ const DEFAULT_RETRY_DELAY_MS = 1000;
14
+ // Rate limit status codes that should trigger retry
15
+ const RETRY_STATUS_CODES = [429, 502, 503, 504];
16
+ class WebexSender {
17
+ config;
18
+ apiBaseUrl;
19
+ retryOptions;
20
+ constructor(config) {
21
+ this.config = config;
22
+ this.apiBaseUrl = config.apiBaseUrl || DEFAULT_API_BASE_URL;
23
+ this.retryOptions = {
24
+ maxRetries: config.maxRetries ?? DEFAULT_MAX_RETRIES,
25
+ retryDelayMs: config.retryDelayMs ?? DEFAULT_RETRY_DELAY_MS,
26
+ };
27
+ }
28
+ /**
29
+ * Send a message to Webex
30
+ */
31
+ async send(message) {
32
+ const request = this.buildMessageRequest(message);
33
+ return this.createMessage(request);
34
+ }
35
+ /**
36
+ * Send a text message to a room
37
+ */
38
+ async sendToRoom(roomId, text, markdown) {
39
+ return this.createMessage({
40
+ roomId,
41
+ text,
42
+ markdown,
43
+ });
44
+ }
45
+ /**
46
+ * Send a direct message to a person by ID
47
+ */
48
+ async sendDirectById(personId, text, markdown) {
49
+ return this.createMessage({
50
+ toPersonId: personId,
51
+ text,
52
+ markdown,
53
+ });
54
+ }
55
+ /**
56
+ * Send a direct message to a person by email
57
+ */
58
+ async sendDirectByEmail(email, text, markdown) {
59
+ return this.createMessage({
60
+ toPersonEmail: email,
61
+ text,
62
+ markdown,
63
+ });
64
+ }
65
+ /**
66
+ * Send a message with file attachment
67
+ */
68
+ async sendWithFile(roomId, text, fileUrl) {
69
+ return this.createMessage({
70
+ roomId,
71
+ text,
72
+ files: [fileUrl],
73
+ });
74
+ }
75
+ /**
76
+ * Send a threaded reply
77
+ */
78
+ async sendReply(roomId, parentId, text, markdown) {
79
+ return this.createMessage({
80
+ roomId,
81
+ parentId,
82
+ text,
83
+ markdown,
84
+ });
85
+ }
86
+ /**
87
+ * Get a message by ID
88
+ */
89
+ async getMessage(messageId) {
90
+ return this.request({
91
+ method: 'GET',
92
+ path: `/messages/${messageId}`,
93
+ });
94
+ }
95
+ /**
96
+ * Delete a message by ID
97
+ */
98
+ async deleteMessage(messageId) {
99
+ await this.request({
100
+ method: 'DELETE',
101
+ path: `/messages/${messageId}`,
102
+ });
103
+ }
104
+ /**
105
+ * Build a Webex message request from an OpenClaw outbound message
106
+ */
107
+ buildMessageRequest(message) {
108
+ const request = {};
109
+ // Determine target: roomId, personId, or email
110
+ const to = message.to;
111
+ if (to.includes('@')) {
112
+ request.toPersonEmail = to;
113
+ }
114
+ else if (to.startsWith('Y2lzY29zcGFyazovL3')) {
115
+ // Base64-encoded Webex IDs start with this prefix
116
+ if (to.includes('ROOM')) {
117
+ request.roomId = to;
118
+ }
119
+ else {
120
+ request.toPersonId = to;
121
+ }
122
+ }
123
+ else {
124
+ // Assume it's a roomId if not an email
125
+ request.roomId = to;
126
+ }
127
+ // Set content
128
+ if (message.content.text) {
129
+ request.text = message.content.text;
130
+ }
131
+ if (message.content.markdown) {
132
+ request.markdown = message.content.markdown;
133
+ }
134
+ if (message.content.files && message.content.files.length > 0) {
135
+ // Webex only allows one file per message
136
+ request.files = [message.content.files[0]];
137
+ }
138
+ if (message.content.card) {
139
+ request.attachments = [
140
+ {
141
+ contentType: 'application/vnd.microsoft.card.adaptive',
142
+ content: message.content.card,
143
+ },
144
+ ];
145
+ }
146
+ // Set threading
147
+ if (message.parentId) {
148
+ request.parentId = message.parentId;
149
+ }
150
+ return request;
151
+ }
152
+ /**
153
+ * Create a message via the Webex API
154
+ */
155
+ async createMessage(request) {
156
+ this.validateMessageRequest(request);
157
+ return this.request({
158
+ method: 'POST',
159
+ path: '/messages',
160
+ body: request,
161
+ });
162
+ }
163
+ /**
164
+ * Validate a message request before sending
165
+ */
166
+ validateMessageRequest(request) {
167
+ // Must have a target
168
+ if (!request.roomId && !request.toPersonId && !request.toPersonEmail) {
169
+ throw new Error('Message must have a target: roomId, toPersonId, or toPersonEmail');
170
+ }
171
+ // Must have content
172
+ if (!request.text && !request.markdown && !request.files?.length && !request.attachments?.length) {
173
+ throw new Error('Message must have content: text, markdown, files, or attachments');
174
+ }
175
+ // Text has a max size of 7439 bytes
176
+ if (request.text && Buffer.byteLength(request.text, 'utf8') > 7439) {
177
+ throw new Error('Message text exceeds maximum size of 7439 bytes');
178
+ }
179
+ }
180
+ /**
181
+ * Make an API request with retry logic
182
+ */
183
+ async request(options) {
184
+ let lastError = null;
185
+ let attempt = 0;
186
+ while (attempt <= this.retryOptions.maxRetries) {
187
+ try {
188
+ return await this.executeRequest(options);
189
+ }
190
+ catch (error) {
191
+ lastError = error;
192
+ attempt++;
193
+ if (attempt > this.retryOptions.maxRetries) {
194
+ break;
195
+ }
196
+ if (!this.shouldRetry(error, attempt)) {
197
+ break;
198
+ }
199
+ // Exponential backoff with jitter
200
+ const delay = this.calculateBackoff(attempt);
201
+ await this.sleep(delay);
202
+ }
203
+ }
204
+ throw lastError || new Error('Request failed after retries');
205
+ }
206
+ /**
207
+ * Execute a single API request
208
+ */
209
+ async executeRequest(options) {
210
+ const url = `${this.apiBaseUrl}${options.path}`;
211
+ const headers = {
212
+ 'Authorization': `Bearer ${this.config.token}`,
213
+ 'Content-Type': 'application/json',
214
+ ...options.headers,
215
+ };
216
+ const response = await (0, node_fetch_1.default)(url, {
217
+ method: options.method,
218
+ headers,
219
+ body: options.body ? JSON.stringify(options.body) : undefined,
220
+ });
221
+ if (!response.ok) {
222
+ const error = await this.parseErrorResponse(response);
223
+ throw error;
224
+ }
225
+ // DELETE requests return 204 No Content
226
+ if (response.status === 204) {
227
+ return undefined;
228
+ }
229
+ return response.json();
230
+ }
231
+ /**
232
+ * Parse error response from Webex API
233
+ */
234
+ async parseErrorResponse(response) {
235
+ let errorData = null;
236
+ try {
237
+ errorData = await response.json();
238
+ }
239
+ catch {
240
+ // Response body might not be JSON
241
+ }
242
+ const message = errorData?.message || `HTTP ${response.status}: ${response.statusText}`;
243
+ const error = new WebexApiRequestError(message, response.status, errorData?.trackingId, errorData?.errors);
244
+ return error;
245
+ }
246
+ /**
247
+ * Determine if a request should be retried
248
+ */
249
+ shouldRetry(error, attempt) {
250
+ if (error instanceof WebexApiRequestError) {
251
+ return RETRY_STATUS_CODES.includes(error.statusCode);
252
+ }
253
+ // Retry network errors
254
+ return error.message.includes('ECONNRESET') ||
255
+ error.message.includes('ETIMEDOUT') ||
256
+ error.message.includes('ENOTFOUND');
257
+ }
258
+ /**
259
+ * Calculate backoff delay with exponential backoff and jitter
260
+ */
261
+ calculateBackoff(attempt) {
262
+ const baseDelay = this.retryOptions.retryDelayMs;
263
+ const exponentialDelay = baseDelay * Math.pow(2, attempt - 1);
264
+ const jitter = Math.random() * 0.3 * exponentialDelay;
265
+ return Math.min(exponentialDelay + jitter, 30000); // Cap at 30 seconds
266
+ }
267
+ /**
268
+ * Sleep for a given number of milliseconds
269
+ */
270
+ sleep(ms) {
271
+ return new Promise(resolve => setTimeout(resolve, ms));
272
+ }
273
+ }
274
+ exports.WebexSender = WebexSender;
275
+ /**
276
+ * Custom error class for Webex API errors
277
+ */
278
+ class WebexApiRequestError extends Error {
279
+ statusCode;
280
+ trackingId;
281
+ details;
282
+ constructor(message, statusCode, trackingId, details) {
283
+ super(message);
284
+ this.name = 'WebexApiRequestError';
285
+ this.statusCode = statusCode;
286
+ this.trackingId = trackingId;
287
+ this.details = details;
288
+ // Maintains proper stack trace for where error was thrown
289
+ if (Error.captureStackTrace) {
290
+ Error.captureStackTrace(this, WebexApiRequestError);
291
+ }
292
+ }
293
+ toJSON() {
294
+ return {
295
+ name: this.name,
296
+ message: this.message,
297
+ statusCode: this.statusCode,
298
+ trackingId: this.trackingId,
299
+ details: this.details,
300
+ };
301
+ }
302
+ }
303
+ exports.WebexApiRequestError = WebexApiRequestError;
304
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VuZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zZW5kLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQTs7R0FFRzs7Ozs7O0FBRUgsNERBQTZDO0FBVzdDLE1BQU0sb0JBQW9CLEdBQUcsMEJBQTBCLENBQUM7QUFDeEQsTUFBTSxtQkFBbUIsR0FBRyxDQUFDLENBQUM7QUFDOUIsTUFBTSxzQkFBc0IsR0FBRyxJQUFJLENBQUM7QUFFcEMsb0RBQW9EO0FBQ3BELE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUVoRCxNQUFhLFdBQVc7SUFDZCxNQUFNLENBQXFCO0lBQzNCLFVBQVUsQ0FBUztJQUNuQixZQUFZLENBQWU7SUFFbkMsWUFBWSxNQUEwQjtRQUNwQyxJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxVQUFVLElBQUksb0JBQW9CLENBQUM7UUFDNUQsSUFBSSxDQUFDLFlBQVksR0FBRztZQUNsQixVQUFVLEVBQUUsTUFBTSxDQUFDLFVBQVUsSUFBSSxtQkFBbUI7WUFDcEQsWUFBWSxFQUFFLE1BQU0sQ0FBQyxZQUFZLElBQUksc0JBQXNCO1NBQzVELENBQUM7SUFDSixDQUFDO0lBRUQ7O09BRUc7SUFDSCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQWdDO1FBQ3pDLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUM7SUFDckMsQ0FBQztJQUVEOztPQUVHO0lBQ0gsS0FBSyxDQUFDLFVBQVUsQ0FBQyxNQUFjLEVBQUUsSUFBWSxFQUFFLFFBQWlCO1FBQzlELE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQztZQUN4QixNQUFNO1lBQ04sSUFBSTtZQUNKLFFB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aENELG9EQWdDQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogV2ViZXggTWVzc2FnZSBTZW5kaW5nIE1vZHVsZVxuICovXG5cbmltcG9ydCBmZXRjaCwgeyBSZXNwb25zZSB9IGZyb20gJ25vZGUtZmV0Y2gnO1xuaW1wb3J0IHR5cGUge1xuICBXZWJleENoYW5uZWxDb25maWcsXG4gIFdlYmV4TWVzc2FnZSxcbiAgQ3JlYXRlTWVzc2FnZVJlcXVlc3QsXG4gIE9wZW5DbGF3T3V0Ym91bmRNZXNzYWdlLFxuICBXZWJleEFwaUVycm9yLFxuICBSZXRyeU9wdGlvbnMsXG4gIFJlcXVlc3RPcHRpb25zLFxufSBmcm9tICcuL3R5cGVzJztcblxuY29uc3QgREVGQVVMVF9BUElfQkFTRV9VUkwgPSAnaHR0cHM6Ly93ZWJleGFwaXMuY29tL3YxJztcbmNvbnN0IERFRkFVTFRfTUFYX1JFVFJJRVMgPSAzO1xuY29uc3QgREVGQVVMVF9SRVRSWV9ERUxBWV9NUyA9IDEwMDA7XG5cbi8vIFJhdGUgbGltaXQgc3RhdHVzIGNvZGVzIHRoYXQgc2hvdWxkIHRyaWdnZXIgcmV0cnlcbmNvbnN0IFJFVFJZX1NUQVRVU19DT0RFUyA9IFs0MjksIDUwMiwgNTAzLCA1MDRdO1xuXG5leHBvcnQgY2xhc3MgV2ViZXhTZW5kZXIge1xuICBwcml2YXRlIGNvbmZpZzogV2ViZXhDaGFubmVsQ29uZmlnO1xuICBwcml2YXRlIGFwaUJhc2VVcmw6IHN0cmluZztcbiAgcHJpdmF0ZSByZXRyeU9wdGlvbnM6IFJldHJ5T3B0aW9ucztcblxuICBjb25zdHJ1Y3Rvcihjb25maWc6IFdlYmV4Q2hhbm5lbENvbmZpZykge1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuYXBpQmFzZVVybCA9IGNvbmZpZy5hcGlCYXNlVXJsIHx8IERFRkFVTFRfQVBJX0JBU0VfVVJMO1xuICAgIHRoaXMucmV0cnlPcHRpb25zID0ge1xuICAgICAgbWF4UmV0cmllczogY29uZmlnLm1heFJldHJpZXMgPz8gREVGQVVMVF9NQVhfUkVUUklFUyxcbiAgICAgIHJldHJ5RGVsYXlNczogY29uZmlnLnJldHJ5RGVsYXlNcyA/PyBERUZBVUxUX1JFVFJZX0RFTEFZX01TLFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIG1lc3NhZ2UgdG8gV2ViZXhcbiAgICovXG4gIGFzeW5jIHNlbmQobWVzc2FnZTogT3BlbkNsYXdPdXRib3VuZE1lc3NhZ2UpOiBQcm9taXNlPFdlYmV4TWVzc2FnZT4ge1xuICAgIGNvbnN0IHJlcXVlc3QgPSB0aGlzLmJ1aWxkTWVzc2FnZVJlcXVlc3QobWVzc2FnZSk7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZShyZXF1ZXN0KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgdGV4dCBtZXNzYWdlIHRvIGEgcm9vbVxuICAgKi9cbiAgYXN5bmMgc2VuZFRvUm9vbShyb29tSWQ6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtYXJrZG93bj86IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICByb29tSWQsXG4gICAgICB0ZXh0LFxuICAgICAgbWFya2Rvd24sXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogU2VuZCBhIGRpcmVjdCBtZXNzYWdlIHRvIGEgcGVyc29uIGJ5IElEXG4gICAqL1xuICBhc3luYyBzZW5kRGlyZWN0QnlJZChwZXJzb25JZDogc3RyaW5nLCB0ZXh0OiBzdHJpbmcsIG1hcmtkb3duPzogc3RyaW5nKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNzYWdlKHtcbiAgICAgIHRvUGVyc29uSWQ6IHBlcnNvbklkLFxuICAgICAgdGV4dCxcbiAgICAgIG1hcmtkb3duLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSBkaXJlY3QgbWVzc2FnZSB0byBhIHBlcnNvbiBieSBlbWFpbFxuICAgKi9cbiAgYXN5bmMgc2VuZERpcmVjdEJ5RW1haWwoZW1haWw6IHN0cmluZywgdGV4dDogc3RyaW5nLCBtYXJrZG93bj86IHN0cmluZyk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICB0b1BlcnNvbkVtYWlsOiBlbWFpbCxcbiAgICAgIHRleHQsXG4gICAgICBtYXJrZG93bixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTZW5kIGEgbWVzc2FnZSB3aXRoIGZpbGUgYXR0YWNobWVudFxuICAgKi9cbiAgYXN5bmMgc2VuZFdpdGhGaWxlKFxuICAgIHJvb21JZDogc3RyaW5nLFxuICAgIHRleHQ6IHN0cmluZyxcbiAgICBmaWxlVXJsOiBzdHJpbmdcbiAgKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5jcmVhdGVNZXNzYWdlKHtcbiAgICAgIHJvb21JZCxcbiAgICAgIHRleHQsXG4gICAgICBmaWxlczogW2ZpbGVVcmxdLFxuICAgIH0pO1xuICB9XG5cbiAgLyoqXG4gICAqIFNlbmQgYSB0aHJlYWRlZCByZXBseVxuICAgKi9cbiAgYXN5bmMgc2VuZFJlcGx5KFxuICAgIHJvb21JZDogc3RyaW5nLFxuICAgIHBhcmVudElkOiBzdHJpbmcsXG4gICAgdGV4dDogc3RyaW5nLFxuICAgIG1hcmtkb3duPzogc3RyaW5nXG4gICk6IFByb21pc2U8V2ViZXhNZXNzYWdlPiB7XG4gICAgcmV0dXJuIHRoaXMuY3JlYXRlTWVzc2FnZSh7XG4gICAgICByb29tSWQsXG4gICAgICBwYXJlbnRJZCxcbiAgICAgIHRleHQsXG4gICAgICBtYXJrZG93bixcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZXQgYSBtZXNzYWdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBnZXRNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFdlYmV4TWVzc2FnZT4oe1xuICAgICAgbWV0aG9kOiAnR0VUJyxcbiAgICAgIHBhdGg6IGAvbWVzc2FnZXMvJHttZXNzYWdlSWR9YCxcbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgYSBtZXNzYWdlIGJ5IElEXG4gICAqL1xuICBhc3luYyBkZWxldGVNZXNzYWdlKG1lc3NhZ2VJZDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgYXdhaXQgdGhpcy5yZXF1ZXN0PHZvaWQ+KHtcbiAgICAgIG1ldGhvZDogJ0RFTEVURScsXG4gICAgICBwYXRoOiBgL21lc3NhZ2VzLyR7bWVzc2FnZUlkfWAsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogQnVpbGQgYSBXZWJleCBtZXNzYWdlIHJlcXVlc3QgZnJvbSBhbiBPcGVuQ2xhdyBvdXRib3VuZCBtZXNzYWdlXG4gICAqL1xuICBwcml2YXRlIGJ1aWxkTWVzc2FnZVJlcXVlc3QobWVzc2FnZTogT3BlbkNsYXdPdXRib3VuZE1lc3NhZ2UpOiBDcmVhdGVNZXNzYWdlUmVxdWVzdCB7XG4gICAgY29uc3QgcmVxdWVzdDogQ3JlYXRlTWVzc2FnZVJlcXVlc3QgPSB7fTtcblxuICAgIC8vIERldGVybWluZSB0YXJnZXQ6IHJvb21JZCwgcGVyc29uSWQsIG9yIGVtYWlsXG4gICAgY29uc3QgdG8gPSBtZXNzYWdlLnRvO1xuICAgIGlmICh0by5pbmNsdWRlcygnQCcpKSB7XG4gICAgICByZXF1ZXN0LnRvUGVyc29uRW1haWwgPSB0bztcbiAgICB9IGVsc2UgaWYgKHRvLnN0YXJ0c1dpdGgoJ1kybHpZMjl6Y0dGeWF6b3ZMMycpKSB7XG4gICAgICAvLyBCYXNlNjQtZW5jb2RlZCBXZWJleCBJRHMgc3RhcnQgd2l0aCB0aGlzIHByZWZpeFxuICAgICAgaWYgKHRvLmluY2x1ZGVzKCdST09NJykpIHtcbiAgICAgICAgcmVxdWVzdC5yb29tSWQgPSB0bztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJlcXVlc3QudG9QZXJzb25JZCA9IHRvO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBBc3N1bWUgaXQncyBhIHJvb21JZCBpZiBub3QgYW4gZW1haWxcbiAgICAgIHJlcXVlc3Qucm9vbUlkID0gdG87XG4gICAgfVxuXG4gICAgLy8gU2V0IGNvbnRlbnRcbiAgICBpZiAobWVzc2FnZS5jb250ZW50LnRleHQpIHtcbiAgICAgIHJlcXVlc3QudGV4dCA9IG1lc3NhZ2UuY29udGVudC50ZXh0O1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50Lm1hcmtkb3duKSB7XG4gICAgICByZXF1ZXN0Lm1hcmtkb3duID0gbWVzc2FnZS5jb250ZW50Lm1hcmtkb3duO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmZpbGVzICYmIG1lc3NhZ2UuY29udGVudC5maWxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAvLyBXZWJleCBvbmx5IGFsbG93cyBvbmUgZmlsZSBwZXIgbWVzc2FnZVxuICAgICAgcmVxdWVzdC5maWxlcyA9IFttZXNzYWdlLmNvbnRlbnQuZmlsZXNbMF1dO1xuICAgIH1cbiAgICBpZiAobWVzc2FnZS5jb250ZW50LmNhcmQpIHtcbiAgICAgIHJlcXVlc3QuYXR0YWNobWVudHMgPSBbXG4gICAgICAgIHtcbiAgICAgICAgICBjb250ZW50VHlwZTogJ2FwcGxpY2F0aW9uL3ZuZC5taWNyb3NvZnQuY2FyZC5hZGFwdGl2ZScsXG4gICAgICAgICAgY29udGVudDogbWVzc2FnZS5jb250ZW50LmNhcmQsXG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH1cblxuICAgIC8vIFNldCB0aHJlYWRpbmdcbiAgICBpZiAobWVzc2FnZS5wYXJlbnRJZCkge1xuICAgICAgcmVxdWVzdC5wYXJlbnRJZCA9IG1lc3NhZ2UucGFyZW50SWQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlcXVlc3Q7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIGEgbWVzc2FnZSB2aWEgdGhlIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBjcmVhdGVNZXNzYWdlKHJlcXVlc3Q6IENyZWF0ZU1lc3NhZ2VSZXF1ZXN0KTogUHJvbWlzZTxXZWJleE1lc3NhZ2U+IHtcbiAgICB0aGlzLnZhbGlkYXRlTWVzc2FnZVJlcXVlc3QocmVxdWVzdCk7XG5cbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0PFdlYmV4TWVzc2FnZT4oe1xuICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICBwYXRoOiAnL21lc3NhZ2VzJyxcbiAgICAgIGJvZHk6IHJlcXVlc3QsXG4gICAgfSk7XG4gIH1cblxuICAvKipcbiAgICogVmFsaWRhdGUgYSBtZXNzYWdlIHJlcXVlc3QgYmVmb3JlIHNlbmRpbmdcbiAgICovXG4gIHByaXZhdGUgdmFsaWRhdGVNZXNzYWdlUmVxdWVzdChyZXF1ZXN0OiBDcmVhdGVNZXNzYWdlUmVxdWVzdCk6IHZvaWQge1xuICAgIC8vIE11c3QgaGF2ZSBhIHRhcmdldFxuICAgIGlmICghcmVxdWVzdC5yb29tSWQgJiYgIXJlcXVlc3QudG9QZXJzb25JZCAmJiAhcmVxdWVzdC50b1BlcnNvbkVtYWlsKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgbXVzdCBoYXZlIGEgdGFyZ2V0OiByb29tSWQsIHRvUGVyc29uSWQsIG9yIHRvUGVyc29uRW1haWwnKTtcbiAgICB9XG5cbiAgICAvLyBNdXN0IGhhdmUgY29udGVudFxuICAgIGlmICghcmVxdWVzdC50ZXh0ICYmICFyZXF1ZXN0Lm1hcmtkb3duICYmICFyZXF1ZXN0LmZpbGVzPy5sZW5ndGggJiYgIXJlcXVlc3QuYXR0YWNobWVudHM/Lmxlbmd0aCkge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdNZXNzYWdlIG11c3QgaGF2ZSBjb250ZW50OiB0ZXh0LCBtYXJrZG93biwgZmlsZXMsIG9yIGF0dGFjaG1lbnRzJyk7XG4gICAgfVxuXG4gICAgLy8gVGV4dCBoYXMgYSBtYXggc2l6ZSBvZiA3NDM5IGJ5dGVzXG4gICAgaWYgKHJlcXVlc3QudGV4dCAmJiBCdWZmZXIuYnl0ZUxlbmd0aChyZXF1ZXN0LnRleHQsICd1dGY4JykgPiA3NDM5KSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgdGV4dCBleGNlZWRzIG1heGltdW0gc2l6ZSBvZiA3NDM5IGJ5dGVzJyk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIE1ha2UgYW4gQVBJIHJlcXVlc3Qgd2l0aCByZXRyeSBsb2dpY1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyByZXF1ZXN0PFQ+KG9wdGlvbnM6IFJlcXVlc3RPcHRpb25zKTogUHJvbWlzZTxUPiB7XG4gICAgbGV0IGxhc3RFcnJvcjogRXJyb3IgfCBudWxsID0gbnVsbDtcbiAgICBsZXQgYXR0ZW1wdCA9IDA7XG5cbiAgICB3aGlsZSAoYXR0ZW1wdCA8PSB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgdGhpcy5leGVjdXRlUmVxdWVzdDxUPihvcHRpb25zKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxhc3RFcnJvciA9IGVycm9yIGFzIEVycm9yO1xuICAgICAgICBhdHRlbXB0Kys7XG5cbiAgICAgICAgaWYgKGF0dGVtcHQgPiB0aGlzLnJldHJ5T3B0aW9ucy5tYXhSZXRyaWVzKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMuc2hvdWxkUmV0cnkoZXJyb3IgYXMgRXJyb3IsIGF0dGVtcHQpKSB7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFeHBvbmVudGlhbCBiYWNrb2ZmIHdpdGggaml0dGVyXG4gICAgICAgIGNvbnN0IGRlbGF5ID0gdGhpcy5jYWxjdWxhdGVCYWNrb2ZmKGF0dGVtcHQpO1xuICAgICAgICBhd2FpdCB0aGlzLnNsZWVwKGRlbGF5KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aHJvdyBsYXN0RXJyb3IgfHwgbmV3IEVycm9yKCdSZXF1ZXN0IGZhaWxlZCBhZnRlciByZXRyaWVzJyk7XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBhIHNpbmdsZSBBUEkgcmVxdWVzdFxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdDxUPihvcHRpb25zOiBSZXF1ZXN0T3B0aW9ucyk6IFByb21pc2U8VD4ge1xuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpQmFzZVVybH0ke29wdGlvbnMucGF0aH1gO1xuICAgIGNvbnN0IGhlYWRlcnM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7XG4gICAgICAnQXV0aG9yaXphdGlvbic6IGBCZWFyZXIgJHt0aGlzLmNvbmZpZy50b2tlbn1gLFxuICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgIC4uLm9wdGlvbnMuaGVhZGVycyxcbiAgICB9O1xuXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaCh1cmwsIHtcbiAgICAgIG1ldGhvZDogb3B0aW9ucy5tZXRob2QsXG4gICAgICBoZWFkZXJzLFxuICAgICAgYm9keTogb3B0aW9ucy5ib2R5ID8gSlNPTi5zdHJpbmdpZnkob3B0aW9ucy5ib2R5KSA6IHVuZGVmaW5lZCxcbiAgICB9KTtcblxuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgIGNvbnN0IGVycm9yID0gYXdhaXQgdGhpcy5wYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgLy8gREVMRVRFIHJlcXVlc3RzIHJldHVybiAyMDQgTm8gQ29udGVudFxuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZCBhcyBUO1xuICAgIH1cblxuICAgIHJldHVybiByZXNwb25zZS5qc29uKCkgYXMgUHJvbWlzZTxUPjtcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZSBlcnJvciByZXNwb25zZSBmcm9tIFdlYmV4IEFQSVxuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBwYXJzZUVycm9yUmVzcG9uc2UocmVzcG9uc2U6IFJlc3BvbnNlKTogUHJvbWlzZTxFcnJvcj4ge1xuICAgIGxldCBlcnJvckRhdGE6IFdlYmV4QXBpRXJyb3IgfCBudWxsID0gbnVsbDtcblxuICAgIHRyeSB7XG4gICAgICBlcnJvckRhdGEgPSBhd2FpdCByZXNwb25zZS5qc29uKCkgYXMgV2ViZXhBcGlFcnJvcjtcbiAgICB9IGNhdGNoIHtcbiAgICAgIC8vIFJlc3BvbnNlIGJvZHkgbWlnaHQgbm90IGJlIEpTT05cbiAgICB9XG5cbiAgICBjb25zdCBtZXNzYWdlID0gZXJyb3JEYXRhPy5tZXNzYWdlIHx8IGBIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfTogJHtyZXNwb25zZS5zdGF0dXNUZXh0fWA7XG4gICAgY29uc3QgZXJyb3IgPSBuZXcgV2ViZXhBcGlSZXF1ZXN0RXJyb3IoXG4gICAgICBtZXNzYWdlLFxuICAgICAgcmVzcG9uc2Uuc3RhdHVzLFxuICAgICAgZXJyb3JEYXRhPy50cmFja2luZ0lkLFxuICAgICAgZXJyb3JEYXRhPy5lcnJvcnNcbiAgICApO1xuXG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG5cbiAgLyoqXG4gICAqIERldGVybWluZSBpZiBhIHJlcXVlc3Qgc2hvdWxkIGJlIHJldHJpZWRcbiAgICovXG4gIHByaXZhdGUgc2hvdWxkUmV0cnkoZXJyb3I6IEVycm9yLCBhdHRlbXB0OiBudW1iZXIpOiBib29sZWFuIHtcbiAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBXZWJleEFwaVJlcXVlc3RFcnJvcikge1xuICAgICAgcmV0dXJuIFJFVFJZX1NUQVRVU19DT0RFUy5pbmNsdWRlcyhlcnJvci5zdGF0dXNDb2RlKTtcbiAgICB9XG4gICAgLy8gUmV0cnkgbmV0d29yayBlcnJvcnNcbiAgICByZXR1cm4gZXJyb3IubWVzc2FnZS5pbmNsdWRlcygnRUNPTk5SRVNFVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VUSU1FRE9VVCcpIHx8XG4gICAgICAgICAgIGVycm9yLm1lc3NhZ2UuaW5jbHVkZXMoJ0VOT1RGT1VORCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIENhbGN1bGF0ZSBiYWNrb2ZmIGRlbGF5IHdpdGggZXhwb25lbnRpYWwgYmFja29mZiBhbmQgaml0dGVyXG4gICAqL1xuICBwcml2YXRlIGNhbGN1bGF0ZUJhY2tvZmYoYXR0ZW1wdDogbnVtYmVyKTogbnVtYmVyIHtcbiAgICBjb25zdCBiYXNlRGVsYXkgPSB0aGlzLnJldHJ5T3B0aW9ucy5yZXRyeURlbGF5TXM7XG4gICAgY29uc3QgZXhwb25lbnRpYWxEZWxheSA9IGJhc2VEZWxheSAqIE1hdGgucG93KDIsIGF0dGVtcHQgLSAxKTtcbiAgICBjb25zdCBqaXR0ZXIgPSBNYXRoLnJhbmRvbSgpICogMC4zICogZXhwb25lbnRpYWxEZWxheTtcbiAgICByZXR1cm4gTWF0aC5taW4oZXhwb25lbnRpYWxEZWxheSArIGppdHRlciwgMzAwMDApOyAvLyBDYXAgYXQgMzAgc2Vjb25kc1xuICB9XG5cbiAgLyoqXG4gICAqIFNsZWVwIGZvciBhIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHNcbiAgICovXG4gIHByaXZhdGUgc2xlZXAobXM6IG51bWJlcik6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZShyZXNvbHZlID0+IHNldFRpbWVvdXQocmVzb2x2ZSwgbXMpKTtcbiAgfVxufVxuXG4vKipcbiAqIEN1c3RvbSBlcnJvciBjbGFzcyBmb3IgV2ViZXggQVBJIGVycm9yc1xuICovXG5leHBvcnQgY2xhc3MgV2ViZXhBcGlSZXF1ZXN0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIHJlYWRvbmx5IHN0YXR1c0NvZGU6IG51bWJlcjtcbiAgcmVhZG9ubHkgdHJhY2tpbmdJZD86IHN0cmluZztcbiAgcmVhZG9ubHkgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PjtcblxuICBjb25zdHJ1Y3RvcihcbiAgICBtZXNzYWdlOiBzdHJpbmcsXG4gICAgc3RhdHVzQ29kZTogbnVtYmVyLFxuICAgIHRyYWNraW5nSWQ/OiBzdHJpbmcsXG4gICAgZGV0YWlscz86IEFycmF5PHsgZGVzY3JpcHRpb246IHN0cmluZyB9PlxuICApIHtcbiAgICBzdXBlcihtZXNzYWdlKTtcbiAgICB0aGlzLm5hbWUgPSAnV2ViZXhBcGlSZXF1ZXN0RXJyb3InO1xuICAgIHRoaXMuc3RhdHVzQ29kZSA9IHN0YXR1c0NvZGU7XG4gICAgdGhpcy50cmFja2luZ0lkID0gdHJhY2tpbmdJZDtcbiAgICB0aGlzLmRldGFpbHMgPSBkZXRhaWxzO1xuXG4gICAgLy8gTWFpbnRhaW5zIHByb3BlciBzdGFjayB0cmFjZSBmb3Igd2hlcmUgZXJyb3Igd2FzIHRocm93blxuICAgIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgICAgRXJyb3IuY2FwdHVyZVN0YWNrVHJhY2UodGhpcywgV2ViZXhBcGlSZXF1ZXN0RXJyb3IpO1xuICAgIH1cbiAgfVxuXG4gIHRvSlNPTigpOiBvYmplY3Qge1xuICAgIHJldHVybiB7XG4gICAgICBuYW1lOiB0aGlzLm5hbWUsXG4gICAgICBtZXNzYWdlOiB0aGlzLm1lc3NhZ2UsXG4gICAgICBzdGF0dXNDb2RlOiB0aGlzLnN0YXR1c0NvZGUsXG4gICAgICB0cmFja2luZ0lkOiB0aGlzLnRyYWNraW5nSWQsXG4gICAgICBkZXRhaWxzOiB0aGlzLmRldGFpbHMsXG4gICAgfTtcbiAgfVxufVxuIl19