UNPKG

@rudderstack/integrations-lib

Version:

A comprehensive TypeScript library providing shared utilities, SDKs, and tools for RudderStack integrations and destinations.

182 lines 24.9 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.BaseSDK = void 0; const factory_1 = require("../../network/factory"); // Note: StatTags is exported from src/network/index.ts to avoid duplicate exports /** * Abstract base class for all SDKs * Provides common functionality including HTTP client management, request execution, * retry logic, and enhanced features when configured */ class BaseSDK { constructor(authObject, config) { this.validateAuthObject(authObject); this.authObject = authObject; this.config = config; this.httpClient = this.initializeHttpClient(); } // eslint-disable-next-line class-methods-use-this validateAuthObject(_authObject) { // Default implementation does nothing - override if validation is needed // Most SDKs will want to override this to validate required fields } // eslint-disable-next-line class-methods-use-this getHeaders() { // Default implementation returns empty headers - override to add headers return {}; } // eslint-disable-next-line class-methods-use-this shouldRetryOnError(_response) { // Default implementation does not retry - override if retry logic is needed return false; } /** * Initialize HTTP client based on configuration * Uses enhanced client with metrics/logging if config provided, otherwise basic client * No baseURL is set - SDKs will use buildRequestUrl() to construct full URLs */ initializeHttpClient() { // If enhanced config provided, use HTTP client with metrics/logging if (this.config?.httpClient) { const { logger, statsClient, defaultStatTags } = this.config.httpClient; if (logger !== undefined || statsClient !== undefined) { // Use enhanced HTTP client with metrics and logging return factory_1.HttpClientFactory.getHttpClientWithMetrics(factory_1.ClientNames.Axios, logger, statsClient, defaultStatTags); } } // Fallback to basic HTTP client (backward compatibility) return factory_1.HttpClientFactory.getHttpClient(factory_1.ClientNames.Axios); } /** * Execute HTTP request - single attempt, no retry logic */ async executeRequest(method, endpoint, data, statTags) { try { const headers = this.getHeaders(); const requestConfig = { headers, }; const fullUrl = this.buildRequestUrl(endpoint); return await this.makeHttpRequest(method, fullUrl, data, requestConfig, statTags); } catch (error) { return { type: 'client-error', statusCode: 0, message: error instanceof Error ? error.message : 'Unknown error', responseBody: error, }; } } /** * Execute HTTP request with configurable token refresh attempts * For SDKs that need more control over retry behavior */ executeRequestWithTokenRefreshAttempts(method, endpoint, data, statTags, maxRetries = 1) { return this.executeRequestWithRetryAttempt(method, endpoint, maxRetries, 0, data, statTags); } /** * Internal recursive method for retry attempts */ async executeRequestWithRetryAttempt(method, endpoint, maxRetries, currentAttempt, data, statTags) { try { const headers = this.getHeaders(); const requestConfig = { headers, }; const fullUrl = this.buildRequestUrl(endpoint); const response = await this.makeHttpRequest(method, fullUrl, data, requestConfig, statTags); // If successful or not retryable, return response if (response.type === 'success' || !this.shouldRetryOnError(response)) { return response; } // If refreshToken is not implemented, return the response if (!this.refreshToken) { return response; } // If this is the last attempt, return the response if (currentAttempt >= maxRetries) { return response; } // Refresh token and retry await this.refreshToken(); return await this.executeRequestWithRetryAttempt(method, endpoint, maxRetries, currentAttempt + 1, data, statTags); } catch (error) { const errorResponse = { type: 'client-error', statusCode: 0, message: error instanceof Error ? error.message : 'Unknown error', responseBody: error, }; // If refreshToken is not implemented, return the response if (!this.refreshToken) { return errorResponse; } // If this is the last attempt, return error if (currentAttempt >= maxRetries) { return errorResponse; } // Refresh token and retry await this.refreshToken(); return await this.executeRequestWithRetryAttempt(method, endpoint, maxRetries, currentAttempt + 1, data, statTags); } } /** * Make HTTP request based on method - eliminates code duplication * Passes statTags to HTTP client for metrics and logging */ makeHttpRequest(method, url, data, requestConfig, statTags) { // Add statTags to request config for HTTP client const configWithStatTags = { ...requestConfig, statTags, }; switch (method) { case 'get': return this.httpClient.get(url, configWithStatTags); case 'post': return this.httpClient.post(url, data, configWithStatTags); case 'put': return this.httpClient.put(url, data, configWithStatTags); case 'delete': return this.httpClient.delete(url, configWithStatTags); case 'patch': return this.httpClient.patch(url, data, configWithStatTags); default: throw new Error(`Unsupported HTTP method: ${method}`); } } /** * Convenience method for GET requests */ get(endpoint, statTags) { return this.executeRequest('get', endpoint, undefined, statTags); } /** * Convenience method for POST requests */ post(endpoint, data, statTags) { return this.executeRequest('post', endpoint, data, statTags); } /** * Convenience method for PUT requests */ put(endpoint, data, statTags) { return this.executeRequest('put', endpoint, data, statTags); } /** * Convenience method for DELETE requests */ delete(endpoint, statTags) { return this.executeRequest('delete', endpoint, undefined, statTags); } /** * Convenience method for PATCH requests */ patch(endpoint, data, statTags) { return this.executeRequest('patch', endpoint, data, statTags); } } exports.BaseSDK = BaseSDK; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmFzZS1zZGsuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvc2Rrcy9jb21tb24vYmFzZS1zZGsudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBT0EsbURBQXVFO0FBS3ZFLGtGQUFrRjtBQUVsRjs7OztHQUlHO0FBQ0gsTUFBc0IsT0FBTztJQU8zQixZQUFZLFVBQXVCLEVBQUUsTUFBZ0I7UUFDbkQsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3BDLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDaEQsQ0FBQztJQUVELGtEQUFrRDtJQUNsRCxrQkFBa0IsQ0FBQyxXQUFvQjtRQUNyQyx5RUFBeUU7UUFDekUsbUVBQW1FO0lBQ3JFLENBQUM7SUFLRCxrREFBa0Q7SUFDeEMsVUFBVTtRQUNsQix5RUFBeUU7UUFDekUsT0FBTyxFQUFFLENBQUM7SUFDWixDQUFDO0lBRUQsa0RBQWtEO0lBQ2xELGtCQUFrQixDQUFDLFNBQStCO1FBQ2hELDRFQUE0RTtRQUM1RSxPQUFPLEtBQUssQ0FBQztJQUNmLENBQUM7SUFJRDs7OztPQUlHO0lBQ0ssb0JBQW9CO1FBQzFCLG9FQUFvRTtRQUNwRSxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUUsVUFBVSxFQUFFLENBQUM7WUFDNUIsTUFBTSxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUUsZUFBZSxFQUFFLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUM7WUFFeEUsSUFBSSxNQUFNLEtBQUssU0FBUyxJQUFJLFdBQVcsS0FBSyxTQUFTLEVBQUUsQ0FBQztnQkFDdEQsb0RBQW9EO2dCQUNwRCxPQUFPLDJCQUFpQixDQUFDLHdCQUF3QixDQUMvQyxxQkFBVyxDQUFDLEtBQUssRUFD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Q0FBQyxjQUFjLENBQUksT0FBTyxFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDbkUsQ0FBQztDQUNGO0FBaFFELDBCQWdRQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFwaVJlc3BvbnNlLFxuICBIdHRwQ2xpZW50LFxuICBJSHR0cExvZ2dlcixcbiAgSUh0dHBTdGF0c0NsaWVudCxcbiAgU3RhdFRhZ3MsXG59IGZyb20gJy4uLy4uL25ldHdvcmsvY2xpZW50cy90eXBlcyc7XG5pbXBvcnQgeyBDbGllbnROYW1lcywgSHR0cENsaWVudEZhY3RvcnkgfSBmcm9tICcuLi8uLi9uZXR3b3JrL2ZhY3RvcnknO1xuaW1wb3J0IHsgQmFzZVNES0NvbmZpZyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vLyBSZS1leHBvcnQgdHlwZXMgZm9yIGNvbnZlbmllbmNlXG5leHBvcnQgdHlwZSB7IEJhc2VTREtDb25maWcgfTtcbi8vIE5vdGU6IFN0YXRUYWdzIGlzIGV4cG9ydGVkIGZyb20gc3JjL25ldHdvcmsvaW5kZXgudHMgdG8gYXZvaWQgZHVwbGljYXRlIGV4cG9ydHNcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgU0RLc1xuICogUHJvdmlkZXMgY29tbW9uIGZ1bmN0aW9uYWxpdHkgaW5jbHVkaW5nIEhUVFAgY2xpZW50IG1hbmFnZW1lbnQsIHJlcXVlc3QgZXhlY3V0aW9uLFxuICogcmV0cnkgbG9naWMsIGFuZCBlbmhhbmNlZCBmZWF0dXJlcyB3aGVuIGNvbmZpZ3VyZWRcbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEJhc2VTREs8VEF1dGhPYmplY3QsIFRDb25maWcgZXh0ZW5kcyBCYXNlU0RLQ29uZmlnID0gQmFzZVNES0NvbmZpZz4ge1xuICBwcm90ZWN0ZWQgYXV0aE9iamVjdDogVEF1dGhPYmplY3Q7XG5cbiAgcHJvdGVjdGVkIGh0dHBDbGllbnQ6IEh0dHBDbGllbnQ7XG5cbiAgcHJvdGVjdGVkIGNvbmZpZz86IFRDb25maWc7XG5cbiAgY29uc3RydWN0b3IoYXV0aE9iamVjdDogVEF1dGhPYmplY3QsIGNvbmZpZz86IFRDb25maWcpIHtcbiAgICB0aGlzLnZhbGlkYXRlQXV0aE9iamVjdChhdXRoT2JqZWN0KTtcbiAgICB0aGlzLmF1dGhPYmplY3QgPSBhdXRoT2JqZWN0O1xuICAgIHRoaXMuY29uZmlnID0gY29uZmlnO1xuICAgIHRoaXMuaHR0cENsaWVudCA9IHRoaXMuaW5pdGlhbGl6ZUh0dHBDbGllbnQoKTtcbiAgfVxuXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBjbGFzcy1tZXRob2RzLXVzZS10aGlzXG4gIHZhbGlkYXRlQXV0aE9iamVjdChfYXV0aE9iamVjdDogdW5rbm93bik6IHZvaWQge1xuICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nIC0gb3ZlcnJpZGUgaWYgdmFsaWRhdGlvbiBpcyBuZWVkZWRcbiAgICAvLyBNb3N0IFNES3Mgd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoaXMgdG8gdmFsaWRhdGUgcmVxdWlyZWQgZmllbGRzXG4gIH1cblxuICAvLyBBYnN0cmFjdCBtZXRob2QgZm9yIGJ1aWxkaW5nIHJlcXVlc3QgVVJMcyAtIGVhY2ggU0RLIGltcGxlbWVudHMgaXRzIG93biBVUkwgY29uc3RydWN0aW9uIGxvZ2ljXG4gIHByb3RlY3RlZCBhYnN0cmFjdCBidWlsZFJlcXVlc3RVcmwoZW5kcG9pbnQ6IHN0cmluZyk6IHN0cmluZztcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgY2xhc3MtbWV0aG9kcy11c2UtdGhpc1xuICBwcm90ZWN0ZWQgZ2V0SGVhZGVycygpOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IHtcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgZW1wdHkgaGVhZGVycyAtIG92ZXJyaWRlIHRvIGFkZCBoZWFkZXJzXG4gICAgcmV0dXJuIHt9O1xuICB9XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGNsYXNzLW1ldGhvZHMtdXNlLXRoaXNcbiAgc2hvdWxkUmV0cnlPbkVycm9yKF9yZXNwb25zZTogQXBpUmVzcG9uc2U8dW5rbm93bj4pOiBib29sZWFuIHtcbiAgICAvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHJldHJ5IC0gb3ZlcnJpZGUgaWYgcmV0cnkgbG9naWMgaXMgbmVlZGVkXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIHJlZnJlc2hUb2tlbj8oKTogUHJvbWlzZTx2b2lkPjtcblxuICAvKipcbiAgICogSW5pdGlhbGl6ZSBIVFRQIGNsaWVudCBiYXNlZCBvbiBjb25maWd1cmF0aW9uXG4gICAqIFVzZXMgZW5oYW5jZWQgY2xpZW50IHdpdGggbWV0cmljcy9sb2dnaW5nIGlmIGNvbmZpZyBwcm92aWRlZCwgb3RoZXJ3aXNlIGJhc2ljIGNsaWVudFxuICAgKiBObyBiYXNlVVJMIGlzIHNldCAtIFNES3Mgd2lsbCB1c2UgYnVpbGRSZXF1ZXN0VXJsKCkgdG8gY29uc3RydWN0IGZ1bGwgVVJMc1xuICAgKi9cbiAgcHJpdmF0ZSBpbml0aWFsaXplSHR0cENsaWVudCgpOiBIdHRwQ2xpZW50IHtcbiAgICAvLyBJZiBlbmhhbmNlZCBjb25maWcgcHJvdmlkZWQsIHVzZSBIVFRQIGNsaWVudCB3aXRoIG1ldHJpY3MvbG9nZ2luZ1xuICAgIGlmICh0aGlzLmNvbmZpZz8uaHR0cENsaWVudCkge1xuICAgICAgY29uc3QgeyBsb2dnZXIsIHN0YXRzQ2xpZW50LCBkZWZhdWx0U3RhdFRhZ3MgfSA9IHRoaXMuY29uZmlnLmh0dHBDbGllbnQ7XG5cbiAgICAgIGlmIChsb2dnZXIgIT09IHVuZGVmaW5lZCB8fCBzdGF0c0NsaWVudCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIC8vIFVzZSBlbmhhbmNlZCBIVFRQIGNsaWVudCB3aXRoIG1ldHJpY3MgYW5kIGxvZ2dpbmdcbiAgICAgICAgcmV0dXJuIEh0dHBDbGllbnRGYWN0b3J5LmdldEh0dHBDbGllbnRXaXRoTWV0cmljcyhcbiAgICAgICAgICBDbGllbnROYW1lcy5BeGlvcyxcbiAgICAgICAgICBsb2dnZXIgYXMgSUh0dHBMb2dnZXIsXG4gICAgICAgICAgc3RhdHNDbGllbnQgYXMgSUh0dHBTdGF0c0NsaWVudCxcbiAgICAgICAgICBkZWZhdWx0U3RhdFRhZ3MsXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRmFsbGJhY2sgdG8gYmFzaWMgSFRUUCBjbGllbnQgKGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpXG4gICAgcmV0dXJuIEh0dHBDbGllbnRGYWN0b3J5LmdldEh0dHBDbGllbnQoQ2xpZW50TmFtZXMuQXhpb3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEV4ZWN1dGUgSFRUUCByZXF1ZXN0IC0gc2luZ2xlIGF0dGVtcHQsIG5vIHJldHJ5IGxvZ2ljXG4gICAqL1xuICBwcm90ZWN0ZWQgYXN5bmMgZXhlY3V0ZVJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ2RlbGV0ZScgfCAncGF0Y2gnLFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgZGF0YT86IHVua25vd24sXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKCk7XG4gICAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZ1bGxVcmwgPSB0aGlzLmJ1aWxkUmVxdWVzdFVybChlbmRwb2ludCk7XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLm1ha2VIdHRwUmVxdWVzdDxUPihtZXRob2QsIGZ1bGxVcmwsIGRhdGEsIHJlcXVlc3RDb25maWcsIHN0YXRUYWdzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogJ2NsaWVudC1lcnJvcicsXG4gICAgICAgIHN0YXR1c0NvZGU6IDAsXG4gICAgICAgIG1lc3NhZ2U6IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogJ1Vua25vd24gZXJyb3InLFxuICAgICAgICByZXNwb25zZUJvZHk6IGVycm9yLFxuICAgICAgfSBhcyBBcGlSZXNwb25zZTxUPjtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRXhlY3V0ZSBIVFRQIHJlcXVlc3Qgd2l0aCBjb25maWd1cmFibGUgdG9rZW4gcmVmcmVzaCBhdHRlbXB0c1xuICAgKiBGb3IgU0RLcyB0aGF0IG5lZWQgbW9yZSBjb250cm9sIG92ZXIgcmV0cnkgYmVoYXZpb3JcbiAgICovXG4gIHByb3RlY3RlZCBleGVjdXRlUmVxdWVzdFdpdGhUb2tlblJlZnJlc2hBdHRlbXB0czxUPihcbiAgICBtZXRob2Q6ICdnZXQnIHwgJ3Bvc3QnIHwgJ3B1dCcgfCAnZGVsZXRlJyB8ICdwYXRjaCcsXG4gICAgZW5kcG9pbnQ6IHN0cmluZyxcbiAgICBkYXRhPzogdW5rbm93bixcbiAgICBzdGF0VGFncz86IFN0YXRUYWdzLFxuICAgIG1heFJldHJpZXMgPSAxLFxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3RXaXRoUmV0cnlBdHRlbXB0PFQ+KG1ldGhvZCwgZW5kcG9pbnQsIG1heFJldHJpZXMsIDAsIGRhdGEsIHN0YXRUYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBJbnRlcm5hbCByZWN1cnNpdmUgbWV0aG9kIGZvciByZXRyeSBhdHRlbXB0c1xuICAgKi9cbiAgcHJpdmF0ZSBhc3luYyBleGVjdXRlUmVxdWVzdFdpdGhSZXRyeUF0dGVtcHQ8VD4oXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ2RlbGV0ZScgfCAncGF0Y2gnLFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgbWF4UmV0cmllczogbnVtYmVyLFxuICAgIGN1cnJlbnRBdHRlbXB0OiBudW1iZXIsXG4gICAgZGF0YT86IHVua25vd24sXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCBoZWFkZXJzID0gdGhpcy5nZXRIZWFkZXJzKCk7XG4gICAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgICBoZWFkZXJzLFxuICAgICAgfTtcbiAgICAgIGNvbnN0IGZ1bGxVcmwgPSB0aGlzLmJ1aWxkUmVxdWVzdFVybChlbmRwb2ludCk7XG5cbiAgICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgdGhpcy5tYWtlSHR0cFJlcXVlc3Q8VD4oXG4gICAgICAgIG1ldGhvZCxcbiAgICAgICAgZnVsbFVybCxcbiAgICAgICAgZGF0YSxcbiAgICAgICAgcmVxdWVzdENvbmZpZyxcbiAgICAgICAgc3RhdFRhZ3MsXG4gICAgICApO1xuXG4gICAgICAvLyBJZiBzdWNjZXNzZnVsIG9yIG5vdCByZXRyeWFibGUsIHJldHVybiByZXNwb25zZVxuICAgICAgaWYgKHJlc3BvbnNlLnR5cGUgPT09ICdzdWNjZXNzJyB8fCAhdGhpcy5zaG91bGRSZXRyeU9uRXJyb3IocmVzcG9uc2UpKSB7XG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgcmVmcmVzaFRva2VuIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIHRoZSByZXNwb25zZVxuICAgICAgaWYgKCF0aGlzLnJlZnJlc2hUb2tlbikge1xuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGxhc3QgYXR0ZW1wdCwgcmV0dXJuIHRoZSByZXNwb25zZVxuICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICAvLyBSZWZyZXNoIHRva2VuIGFuZCByZXRyeVxuICAgICAgYXdhaXQgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmV4ZWN1dGVSZXF1ZXN0V2l0aFJldHJ5QXR0ZW1wdDxUPihcbiAgICAgICAgbWV0aG9kLFxuICAgICAgICBlbmRwb2ludCxcbiAgICAgICAgbWF4UmV0cmllcyxcbiAgICAgICAgY3VycmVudEF0dGVtcHQgKyAxLFxuICAgICAgICBkYXRhLFxuICAgICAgICBzdGF0VGFncyxcbiAgICAgICk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnN0IGVycm9yUmVzcG9uc2U6IEFwaVJlc3BvbnNlPFQ+ID0ge1xuICAgICAgICB0eXBlOiAnY2xpZW50LWVycm9yJyxcbiAgICAgICAgc3RhdHVzQ29kZTogMCxcbiAgICAgICAgbWVzc2FnZTogZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGVycm9yLm1lc3NhZ2UgOiAnVW5rbm93biBlcnJvcicsXG4gICAgICAgIHJlc3BvbnNlQm9keTogZXJyb3IsXG4gICAgICB9IGFzIEFwaVJlc3BvbnNlPFQ+O1xuXG4gICAgICAvLyBJZiByZWZyZXNoVG9rZW4gaXMgbm90IGltcGxlbWVudGVkLCByZXR1cm4gdGhlIHJlc3BvbnNlXG4gICAgICBpZiAoIXRoaXMucmVmcmVzaFRva2VuKSB7XG4gICAgICAgIHJldHVybiBlcnJvclJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICAvLyBJZiB0aGlzIGlzIHRoZSBsYXN0IGF0dGVtcHQsIHJldHVybiBlcnJvclxuICAgICAgaWYgKGN1cnJlbnRBdHRlbXB0ID49IG1heFJldHJpZXMpIHtcbiAgICAgICAgcmV0dXJuIGVycm9yUmVzcG9uc2U7XG4gICAgICB9XG5cbiAgICAgIC8vIFJlZnJlc2ggdG9rZW4gYW5kIHJldHJ5XG4gICAgICBhd2FpdCB0aGlzLnJlZnJlc2hUb2tlbigpO1xuICAgICAgcmV0dXJuIGF3YWl0IHRoaXMuZXhlY3V0ZVJlcXVlc3RXaXRoUmV0cnlBdHRlbXB0PFQ+KFxuICAgICAgICBtZXRob2QsXG4gICAgICAgIGVuZHBvaW50LFxuICAgICAgICBtYXhSZXRyaWVzLFxuICAgICAgICBjdXJyZW50QXR0ZW1wdCArIDEsXG4gICAgICAgIGRhdGEsXG4gICAgICAgIHN0YXRUYWdzLFxuICAgICAgKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogTWFrZSBIVFRQIHJlcXVlc3QgYmFzZWQgb24gbWV0aG9kIC0gZWxpbWluYXRlcyBjb2RlIGR1cGxpY2F0aW9uXG4gICAqIFBhc3NlcyBzdGF0VGFncyB0byBIVFRQIGNsaWVudCBmb3IgbWV0cmljcyBhbmQgbG9nZ2luZ1xuICAgKi9cbiAgcHJpdmF0ZSBtYWtlSHR0cFJlcXVlc3Q8VD4oXG4gICAgbWV0aG9kOiAnZ2V0JyB8ICdwb3N0JyB8ICdwdXQnIHwgJ2RlbGV0ZScgfCAncGF0Y2gnLFxuICAgIHVybDogc3RyaW5nLFxuICAgIGRhdGE6IHVua25vd24sXG4gICAgcmVxdWVzdENvbmZpZzogeyBoZWFkZXJzOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+IH0sXG4gICAgc3RhdFRhZ3M/OiBTdGF0VGFncyxcbiAgKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIC8vIEFkZCBzdGF0VGFncyB0byByZXF1ZXN0IGNvbmZpZyBmb3IgSFRUUCBjbGllbnRcbiAgICBjb25zdCBjb25maWdXaXRoU3RhdFRhZ3MgPSB7XG4gICAgICAuLi5yZXF1ZXN0Q29uZmlnLFxuICAgICAgc3RhdFRhZ3MsXG4gICAgfTtcblxuICAgIHN3aXRjaCAobWV0aG9kKSB7XG4gICAgICBjYXNlICdnZXQnOlxuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LmdldDxUPih1cmwsIGNvbmZpZ1dpdGhTdGF0VGFncyk7XG4gICAgICBjYXNlICdwb3N0JzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wb3N0PFQ+KHVybCwgZGF0YSwgY29uZmlnV2l0aFN0YXRUYWdzKTtcbiAgICAgIGNhc2UgJ3B1dCc6XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucHV0PFQ+KHVybCwgZGF0YSwgY29uZmlnV2l0aFN0YXRUYWdzKTtcbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQuZGVsZXRlPFQ+KHVybCwgY29uZmlnV2l0aFN0YXRUYWdzKTtcbiAgICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgICAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5wYXRjaDxUPih1cmwsIGRhdGEsIGNvbmZpZ1dpdGhTdGF0VGFncyk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIEhUVFAgbWV0aG9kOiAke21ldGhvZH1gKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBHRVQgcmVxdWVzdHNcbiAgICovXG4gIHByb3RlY3RlZCBnZXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgc3RhdFRhZ3M/OiBTdGF0VGFncyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxUPignZ2V0JywgZW5kcG9pbnQsIHVuZGVmaW5lZCwgc3RhdFRhZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgUE9TVCByZXF1ZXN0c1xuICAgKi9cbiAgcHJvdGVjdGVkIHBvc3Q8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgc3RhdFRhZ3M/OiBTdGF0VGFncyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxUPigncG9zdCcsIGVuZHBvaW50LCBkYXRhLCBzdGF0VGFncyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBQVVQgcmVxdWVzdHNcbiAgICovXG4gIHByb3RlY3RlZCBwdXQ8VD4oZW5kcG9pbnQ6IHN0cmluZywgZGF0YTogdW5rbm93biwgc3RhdFRhZ3M/OiBTdGF0VGFncyk6IFByb21pc2U8QXBpUmVzcG9uc2U8VD4+IHtcbiAgICByZXR1cm4gdGhpcy5leGVjdXRlUmVxdWVzdDxUPigncHV0JywgZW5kcG9pbnQsIGRhdGEsIHN0YXRUYWdzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIERFTEVURSByZXF1ZXN0c1xuICAgKi9cbiAgcHJvdGVjdGVkIGRlbGV0ZTxUPihlbmRwb2ludDogc3RyaW5nLCBzdGF0VGFncz86IFN0YXRUYWdzKTogUHJvbWlzZTxBcGlSZXNwb25zZTxUPj4ge1xuICAgIHJldHVybiB0aGlzLmV4ZWN1dGVSZXF1ZXN0PFQ+KCdkZWxldGUnLCBlbmRwb2ludCwgdW5kZWZpbmVkLCBzdGF0VGFncyk7XG4gIH1cblxuICAvKipcbiAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBQQVRDSCByZXF1ZXN0c1xuICAgKi9cbiAgcHJvdGVjdGVkIHBhdGNoPFQ+KFxuICAgIGVuZHBvaW50OiBzdHJpbmcsXG4gICAgZGF0YTogdW5rbm93bixcbiAgICBzdGF0VGFncz86IFN0YXRUYWdzLFxuICApOiBQcm9taXNlPEFwaVJlc3BvbnNlPFQ+PiB7XG4gICAgcmV0dXJuIHRoaXMuZXhlY3V0ZVJlcXVlc3Q8VD4oJ3BhdGNoJywgZW5kcG9pbnQsIGRhdGEsIHN0YXRUYWdzKTtcbiAgfVxufVxuIl19