@orbit/jsonapi
Version:
JSON:API support for Orbit.
237 lines • 34.2 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.JSONAPIRequestProcessor = void 0;
const core_1 = require("@orbit/core");
const data_1 = require("@orbit/data");
const exceptions_1 = require("./lib/exceptions");
const utils_1 = require("@orbit/utils");
const jsonapi_url_builder_1 = require("./jsonapi-url-builder");
const jsonapi_serializer_builder_1 = require("./serializers/jsonapi-serializer-builder");
const jsonapi_serializers_1 = require("./serializers/jsonapi-serializers");
const { assert, deprecate } = core_1.Orbit;
class JSONAPIRequestProcessor {
constructor(settings) {
let { sourceName, allowedContentTypes, schema, keyMap, SerializerClass, serializerFor, serializerClassFor, serializerSettingsFor } = settings;
this.sourceName = sourceName;
this.allowedContentTypes = allowedContentTypes || [
'application/vnd.api+json',
'application/json'
];
this.schema = schema;
this.keyMap = keyMap;
if (SerializerClass) {
deprecate("The 'SerializerClass' setting for 'JSONAPIRequestProcessor' has been deprecated. Pass 'serializerFor', 'serializerClassFor', and/or 'serializerSettingsFor' instead.");
this._serializer = new SerializerClass({
schema,
keyMap
});
}
this._serializerFor = (0, jsonapi_serializer_builder_1.buildJSONAPISerializerFor)({
schema,
keyMap,
serializerFor,
serializerClassFor,
serializerSettingsFor
});
const URLBuilderClass = settings.URLBuilderClass || jsonapi_url_builder_1.JSONAPIURLBuilder;
const urlBuilderOptions = {
host: settings.host,
namespace: settings.namespace,
keyMap: settings.keyMap,
serializer: this._serializer,
serializerFor: this._serializerFor
};
this.urlBuilder = new URLBuilderClass(urlBuilderOptions);
this.initDefaultFetchSettings(settings);
}
/**
* @deprecated since v0.17, use `serializerFor` instead
*/
get serializer() {
deprecate("'JSONAPIRequestProcessor#serializer' has been deprecated. Use 'serializerFor' instead.");
if (this._serializer) {
return this._serializer;
}
else {
return this._serializerFor(jsonapi_serializers_1.JSONAPISerializers.ResourceDocument);
}
}
get serializerFor() {
return this._serializerFor;
}
fetch(url, customSettings) {
let settings = this.initFetchSettings(customSettings);
let fullUrl = url;
if (settings.params) {
fullUrl = this.urlBuilder.appendQueryParams(fullUrl, settings.params);
delete settings.params;
}
let fetchFn = core_1.Orbit.fetch || core_1.Orbit.globals.fetch;
// console.log('fetch', fullUrl, settings, 'polyfill', fetchFn.polyfill);
if (settings.timeout !== undefined && settings.timeout > 0) {
let timeout = settings.timeout;
delete settings.timeout;
return new Promise((resolve, reject) => {
let timedOut;
let timer = core_1.Orbit.globals.setTimeout(() => {
timedOut = true;
reject(new exceptions_1.NetworkError(`No fetch response within ${timeout}ms.`));
}, timeout);
fetchFn(fullUrl, settings)
.catch((e) => {
core_1.Orbit.globals.clearTimeout(timer);
if (!timedOut) {
return this.handleFetchError(e);
}
})
.then((response) => {
core_1.Orbit.globals.clearTimeout(timer);
if (!timedOut) {
return this.handleFetchResponse(response);
}
})
.then(resolve, reject);
});
}
else {
return fetchFn(fullUrl, settings)
.catch((e) => this.handleFetchError(e))
.then((response) => this.handleFetchResponse(response));
}
}
initFetchSettings(customSettings = {}) {
let settings = (0, utils_1.deepMerge)({}, this.defaultFetchSettings, customSettings);
if (settings.json) {
assert("`json` and `body` can't both be set for fetch requests.", !settings.body);
settings.body = JSON.stringify(settings.json);
delete settings.json;
}
if (settings.headers && !settings.body) {
delete settings.headers['Content-Type'];
}
return settings;
}
operationsFromDeserializedDocument(deserialized) {
const records = [];
Array.prototype.push.apply(records, (0, utils_1.toArray)(deserialized.data));
if (deserialized.included) {
Array.prototype.push.apply(records, deserialized.included);
}
return records.map((record) => {
return {
op: 'updateRecord',
record
};
});
}
buildFetchSettings(request) {
var _a;
const settings = {
params: {},
...(_a = request.options) === null || _a === void 0 ? void 0 : _a.settings
};
if (request.options) {
const { filter, sort, page, include, fields } = request.options;
if (filter) {
settings.params.filter = this.urlBuilder.buildFilterParam(filter, request);
}
if (sort) {
settings.params.sort = this.urlBuilder.buildSortParam(sort, request);
}
if (page) {
settings.params.page = this.urlBuilder.buildPageParam(page, request);
}
if (include) {
settings.params.include = this.urlBuilder.buildIncludeParam(include, request);
}
if (fields) {
settings.params.fields = this.urlBuilder.buildFieldsParam(fields, request);
}
}
return settings;
}
mergeRequestOptions(options) {
return (0, data_1.requestOptionsForSource)(options, this.sourceName);
}
/**
* @deprecated since v0.17, use `mergeRequestOptions` instead
*/
customRequestOptions(queryOrTransform, queryExpressionOrOperation) {
deprecate("'JSONAPIRequestProcessor#customRequestOptions' has been deprecated. Use 'mergeRequestOptions' instead.");
return this.mergeRequestOptions([
queryOrTransform.options,
queryExpressionOrOperation.options
]);
}
/* eslint-disable @typescript-eslint/no-unused-vars */
preprocessResponseDocument(document, request) { }
/* eslint-enable @typescript-eslint/no-unused-vars */
responseHasContent(response, ignoreUnrecognizedContent) {
let contentType = response.headers.get('Content-Type');
if (contentType) {
for (let allowedContentType of this.allowedContentTypes) {
if (contentType.indexOf(allowedContentType) > -1) {
return true;
}
}
if (!ignoreUnrecognizedContent) {
throw new exceptions_1.InvalidServerResponse(`The server responded with the content type '${contentType}', which is not allowed. Allowed content types include: '${this.allowedContentTypes.join("', '")}'.`);
}
}
return false;
}
initDefaultFetchSettings(settings) {
this.defaultFetchSettings = {
headers: {
Accept: 'application/vnd.api+json',
'Content-Type': 'application/vnd.api+json'
},
timeout: 5000
};
if (settings.defaultFetchSettings) {
(0, utils_1.deepMerge)(this.defaultFetchSettings, settings.defaultFetchSettings);
}
}
async handleFetchResponse(response) {
const responseDetail = {
response
};
if (response.status >= 200 && response.status < 300) {
if (response.status !== 204 && this.responseHasContent(response)) {
responseDetail.document = await response.json();
}
}
else if (response.status !== 304 && response.status !== 404) {
if (this.responseHasContent(response, true)) {
const document = await response.json();
await this.handleFetchResponseError(response, document);
}
else {
await this.handleFetchResponseError(response);
}
}
return responseDetail;
}
async handleFetchResponseError(response, data) {
let error;
if (response.status >= 400 && response.status < 500) {
error = new exceptions_1.ClientError(response.statusText);
}
else {
error = new exceptions_1.ServerError(response.statusText);
}
error.response = response;
error.data = data;
throw error;
}
async handleFetchError(e) {
if (typeof e === 'string') {
throw new exceptions_1.NetworkError(e);
}
else {
throw e;
}
}
}
exports.JSONAPIRequestProcessor = JSONAPIRequestProcessor;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvbmFwaS1yZXF1ZXN0LXByb2Nlc3Nvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9qc29uYXBpLXJlcXVlc3QtcHJvY2Vzc29yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLHNDQUFvQztBQUNwQyxzQ0FBc0Q7QUFVdEQsaURBSzBCO0FBRzFCLHdDQUFrRDtBQUlsRCwrREFHK0I7QUFVL0IseUZBQXFGO0FBQ3JGLDJFQUF1RTtBQUl2RSxNQUFNLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLFlBQUssQ0FBQztBQW9DcEMsTUFBYSx1QkFBdUI7SUFVbEMsWUFBWSxRQUF5QztRQUNuRCxJQUFJLEVBQ0YsVUFBVSxFQUNWLG1CQUFtQixFQUNuQixNQUFNLEVBQ04sTUFBTSxFQUNOLGVBQWUsRUFDZixhQUFhLEVBQ2Isa0JBQWtCLEVBQ2xCLHFCQUFxQixFQUN0QixHQUFHLFFBQVEsQ0FBQztRQUViLElBQUksQ0FBQyxVQUFVLEdBQUcsVUFBVSxDQUFDO1FBQzdCLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxtQkFBbUIsSUFBSTtZQUNoRCwwQkFBMEI7WUFDMUIsa0JBQWtCO1NBQ25CLENBQUM7UUFDRixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLENBQUMsTUFBTSxHQUFHLE1BQU0sQ0FBQztRQUNyQixJQUFJLGVBQWUsRUFBRTtZQUNuQixTQUFTLENBQ1Asc0tBQXNLLENBQ3ZLLENBQUM7WUFDRixJQUFJLENBQUMsV0FBVyxHQUFHLElBQUksZUFBZSxDQUFDO2dCQUNyQyxNQUFNO2dCQUNOLE1BQU07YUFDUCxDQUFDLENBQUM7U0FDSjtRQUNELElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBQSxzREFBeUIsRUFBQztZQUM5QyxNQUFNO1lBQ04sTUFBTTtZQUNOLGFBQWE7WUFDYixrQkFBa0I7WUFDbEIscUJBQXFCO1NBQ3RCLENBQUMsQ0FBQztRQUNILE1BQU0sZUFBZSxHQUFHLFFB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QkFDTCxNQUFNLElBQUksQ0FBQyx3QkFBd0IsQ0FBQyxRQUFRLENBQUMsQ0FBQzthQUMvQztTQUNGO1FBQ0QsT0FBTyxjQUFjLENBQUM7SUFDeEIsQ0FBQztJQUVTLEtBQUssQ0FBQyx3QkFBd0IsQ0FDdEMsUUFBa0IsRUFDbEIsSUFBYztRQUVkLElBQUksS0FBVSxDQUFDO1FBQ2YsSUFBSSxRQUFRLENBQUMsTUFBTSxJQUFJLEdBQUcsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLEdBQUcsRUFBRTtZQUNuRCxLQUFLLEdBQUcsSUFBSSx3QkFBVyxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsQ0FBQztTQUM5QzthQUFNO1lBQ0wsS0FBSyxHQUFHLElBQUksd0JBQVcsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDOUM7UUFDRCxLQUFLLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQztRQUMxQixLQUFLLENBQUMsSUFBSSxHQUFHLElBQUksQ0FBQztRQUNsQixNQUFNLEtBQUssQ0FBQztJQUNkLENBQUM7SUFFUyxLQUFLLENBQUMsZ0JBQWdCLENBQUMsQ0FBaUI7UUFDaEQsSUFBSSxPQUFPLENBQUMsS0FBSyxRQUFRLEVBQUU7WUFDekIsTUFBTSxJQUFJLHlCQUFZLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0I7YUFBTTtZQUNMLE1BQU0sQ0FBQyxDQUFDO1NBQ1Q7SUFDSCxDQUFDO0NBQ0Y7QUF2VUQsMERBdVVDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgT3JiaXQgfSBmcm9tICdAb3JiaXQvY29yZSc7XG5pbXBvcnQgeyByZXF1ZXN0T3B0aW9uc0ZvclNvdXJjZSB9IGZyb20gJ0BvcmJpdC9kYXRhJztcbmltcG9ydCB7XG4gIFJlY29yZEtleU1hcCxcbiAgSW5pdGlhbGl6ZWRSZWNvcmQsXG4gIFJlY29yZFNjaGVtYSxcbiAgUmVjb3JkUXVlcnlFeHByZXNzaW9uLFxuICBSZWNvcmRUcmFuc2Zvcm0sXG4gIFJlY29yZFF1ZXJ5XG59IGZyb20gJ0BvcmJpdC9yZWNvcmRzJztcbmltcG9ydCB7IERpY3QgfSBmcm9tICdAb3JiaXQvdXRpbHMnO1xuaW1wb3J0IHtcbiAgTmV0d29ya0Vycm9yLFxuICBJbnZhbGlkU2VydmVyUmVzcG9uc2UsXG4gIENsaWVudEVycm9yLFxuICBTZXJ2ZXJFcnJvclxufSBmcm9tICcuL2xpYi9leGNlcHRpb25zJztcbmltcG9ydCB7IFJlY29yZFRyYW5zZm9ybVJlcXVlc3QgfSBmcm9tICcuL2xpYi90cmFuc2Zvcm0tcmVxdWVzdHMnO1xuaW1wb3J0IHsgUmVjb3JkUXVlcnlSZXF1ZXN0IH0gZnJvbSAnLi9saWIvcXVlcnktcmVxdWVzdHMnO1xuaW1wb3J0IHsgZGVlcE1lcmdlLCB0b0FycmF5IH0gZnJvbSAnQG9yYml0L3V0aWxzJztcbmltcG9ydCB7IFJlc291cmNlRG9jdW1lbnQgfSBmcm9tICcuL3Jlc291cmNlLWRvY3VtZW50JztcbmltcG9ydCB7IFJlY29yZERvY3VtZW50IH0gZnJvbSAnLi9yZWNvcmQtZG9jdW1lbnQnO1xuaW1wb3J0IHsgSlNPTkFQSVJlcXVlc3RPcHRpb25zIH0gZnJvbSAnLi9saWIvanNvbmFwaS1yZXF1ZXN0LW9wdGlvbnMnO1xuaW1wb3J0IHtcbiAgSlNPTkFQSVVSTEJ1aWxkZXIsXG4gIEpTT05BUElVUkxCdWlsZGVyU2V0dGluZ3Ncbn0gZnJvbSAnLi9qc29uYXBpLXVybC1idWlsZGVyJztcbmltcG9ydCB7XG4gIEpTT05BUElTZXJpYWxpemVyLFxuICBKU09OQVBJU2VyaWFsaXplclNldHRpbmdzXG59IGZyb20gJy4vanNvbmFwaS1zZXJpYWxpemVyJztcbmltcG9ydCB7XG4gIFNlcmlhbGl6ZXJGb3JGbixcbiAgU2VyaWFsaXplckNsYXNzRm9yRm4sXG4gIFNlcmlhbGl6ZXJTZXR0aW5nc0ZvckZuXG59IGZyb20gJ0BvcmJpdC9zZXJpYWxpemVycyc7XG5pbXBvcnQgeyBidWlsZEpTT05BUElTZXJpYWxpemVyRm9yIH0gZnJvbSAnLi9zZXJpYWxpemVycy9qc29uYXBpLXNlcmlhbGl6ZXItYnVpbGRlcic7XG5pbXBvcnQgeyBKU09OQVBJU2VyaWFsaXplcnMgfSBmcm9tICcuL3NlcmlhbGl6ZXJzL2pzb25hcGktc2VyaWFsaXplcnMnO1xuaW1wb3J0IHsgUmVjb3JkT3BlcmF0aW9uIH0gZnJvbSAnQG9yYml0L3JlY29yZHMnO1xuaW1wb3J0IHsgSlNPTkFQSVJlc3BvbnNlIH0gZnJvbSAnLi9qc29uYXBpLXJlc3BvbnNlJztcblxuY29uc3QgeyBhc3NlcnQsIGRlcHJlY2F0ZSB9ID0gT3JiaXQ7XG5cbmV4cG9ydCBpbnRlcmZhY2UgRmV0Y2hTZXR0aW5ncyB7XG4gIGhlYWRlcnM/OiBEaWN0PGFueT47XG4gIG1ldGhvZD86IHN0cmluZztcbiAganNvbj86IERpY3Q8YW55PjtcbiAgYm9keT86IHN0cmluZztcbiAgcGFyYW1zPzogRGljdDxhbnk+O1xuICB0aW1lb3V0PzogbnVtYmVyO1xuICBjcmVkZW50aWFscz86IHN0cmluZztcbiAgY2FjaGU/OiBzdHJpbmc7XG4gIHJlZGlyZWN0Pzogc3RyaW5nO1xuICByZWZlcnJlcj86IHN0cmluZztcbiAgcmVmZXJyZXJQb2xpY3k/OiBzdHJpbmc7XG4gIGludGVncml0eT86IHN0cmluZztcbn1cblxuZXhwb3J0IGludGVyZmFjZSBKU09OQVBJUmVxdWVzdFByb2Nlc3NvclNldHRpbmdzIHtcbiAgc291cmNlTmFtZTogc3RyaW5nO1xuICBzZXJpYWxpemVyRm9yPzogU2VyaWFsaXplckZvckZuO1xuICBzZXJpYWxpemVyQ2xhc3NGb3I/OiBTZXJpYWxpemVyQ2xhc3NGb3JGbjtcbiAgc2VyaWFsaXplclNldHRpbmdzRm9yPzogU2VyaWFsaXplclNldHRpbmdzRm9yRm47XG4gIFNlcmlhbGl6ZXJDbGFzcz86IG5ldyAoXG4gICAgc2V0dGluZ3M6IEpTT05BUElTZXJpYWxpemVyU2V0dGluZ3NcbiAgKSA9PiBKU09OQVBJU2VyaWFsaXplcjtcbiAgVVJMQnVpbGRlckNsYXNzPzogbmV3IChcbiAgICBzZXR0aW5nczogSlNPTkFQSVVSTEJ1aWxkZXJTZXR0aW5nc1xuICApID0+IEpTT05BUElVUkxCdWlsZGVyO1xuICBuYW1lc3BhY2U/OiBzdHJpbmc7XG4gIGhvc3Q/OiBzdHJpbmc7XG4gIGRlZmF1bHRGZXRjaFNldHRpbmdzPzogRmV0Y2hTZXR0aW5ncztcbiAgYWxsb3dlZENvbnRlbnRUeXBlcz86IHN0cmluZ1tdO1xuICBzY2hlbWE6IFJlY29yZFNjaGVtYTtcbiAga2V5TWFwPzogUmVjb3JkS2V5TWFwO1xufVxuXG5leHBvcnQgY2xhc3MgSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3Ige1xuICBzb3VyY2VOYW1lOiBzdHJpbmc7XG4gIHVybEJ1aWxkZXI6IEpTT05BUElVUkxCdWlsZGVyO1xuICBhbGxvd2VkQ29udGVudFR5cGVzOiBzdHJpbmdbXTtcbiAgZGVmYXVsdEZldGNoU2V0dGluZ3MhOiBGZXRjaFNldHRpbmdzO1xuICBzY2hlbWE6IFJlY29yZFNjaGVtYTtcbiAga2V5TWFwPzogUmVjb3JkS2V5TWFwO1xuICBwcm90ZWN0ZWQgX3NlcmlhbGl6ZXI/OiBKU09OQVBJU2VyaWFsaXplcjtcbiAgcHJvdGVjdGVkIF9zZXJpYWxpemVyRm9yOiBTZXJpYWxpemVyRm9yRm47XG5cbiAgY29uc3RydWN0b3Ioc2V0dGluZ3M6IEpTT05BUElSZXF1ZXN0UHJvY2Vzc29yU2V0dGluZ3MpIHtcbiAgICBsZXQge1xuICAgICAgc291cmNlTmFtZSxcbiAgICAgIGFsbG93ZWRDb250ZW50VHlwZXMsXG4gICAgICBzY2hlbWEsXG4gICAgICBrZXlNYXAsXG4gICAgICBTZXJpYWxpemVyQ2xhc3MsXG4gICAgICBzZXJpYWxpemVyRm9yLFxuICAgICAgc2VyaWFsaXplckNsYXNzRm9yLFxuICAgICAgc2VyaWFsaXplclNldHRpbmdzRm9yXG4gICAgfSA9IHNldHRpbmdzO1xuXG4gICAgdGhpcy5zb3VyY2VOYW1lID0gc291cmNlTmFtZTtcbiAgICB0aGlzLmFsbG93ZWRDb250ZW50VHlwZXMgPSBhbGxvd2VkQ29udGVudFR5cGVzIHx8IFtcbiAgICAgICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLFxuICAgICAgJ2FwcGxpY2F0aW9uL2pzb24nXG4gICAgXTtcbiAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB0aGlzLmtleU1hcCA9IGtleU1hcDtcbiAgICBpZiAoU2VyaWFsaXplckNsYXNzKSB7XG4gICAgICBkZXByZWNhdGUoXG4gICAgICAgIFwiVGhlICdTZXJpYWxpemVyQ2xhc3MnIHNldHRpbmcgZm9yICdKU09OQVBJUmVxdWVzdFByb2Nlc3NvcicgaGFzIGJlZW4gZGVwcmVjYXRlZC4gUGFzcyAnc2VyaWFsaXplckZvcicsICdzZXJpYWxpemVyQ2xhc3NGb3InLCBhbmQvb3IgJ3NlcmlhbGl6ZXJTZXR0aW5nc0ZvcicgaW5zdGVhZC5cIlxuICAgICAgKTtcbiAgICAgIHRoaXMuX3NlcmlhbGl6ZXIgPSBuZXcgU2VyaWFsaXplckNsYXNzKHtcbiAgICAgICAgc2NoZW1hLFxuICAgICAgICBrZXlNYXBcbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLl9zZXJpYWxpemVyRm9yID0gYnVpbGRKU09OQVBJU2VyaWFsaXplckZvcih7XG4gICAgICBzY2hlbWEsXG4gICAgICBrZXlNYXAsXG4gICAgICBzZXJpYWxpemVyRm9yLFxuICAgICAgc2VyaWFsaXplckNsYXNzRm9yLFxuICAgICAgc2VyaWFsaXplclNldHRpbmdzRm9yXG4gICAgfSk7XG4gICAgY29uc3QgVVJMQnVpbGRlckNsYXNzID0gc2V0dGluZ3MuVVJMQnVpbGRlckNsYXNzIHx8IEpTT05BUElVUkxCdWlsZGVyO1xuICAgIGNvbnN0IHVybEJ1aWxkZXJPcHRpb25zOiBKU09OQVBJVVJMQnVpbGRlclNldHRpbmdzID0ge1xuICAgICAgaG9zdDogc2V0dGluZ3MuaG9zdCxcbiAgICAgIG5hbWVzcGFjZTogc2V0dGluZ3MubmFtZXNwYWNlLFxuICAgICAga2V5TWFwOiBzZXR0aW5ncy5rZXlNYXAsXG4gICAgICBzZXJpYWxpemVyOiB0aGlzLl9zZXJpYWxpemVyLFxuICAgICAgc2VyaWFsaXplckZvcjogdGhpcy5fc2VyaWFsaXplckZvclxuICAgIH07XG4gICAgdGhpcy51cmxCdWlsZGVyID0gbmV3IFVSTEJ1aWxkZXJDbGFzcyh1cmxCdWlsZGVyT3B0aW9ucyk7XG4gICAgdGhpcy5pbml0RGVmYXVsdEZldGNoU2V0dGluZ3Moc2V0dGluZ3MpO1xuICB9XG5cbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIHNpbmNlIHYwLjE3LCB1c2UgYHNlcmlhbGl6ZXJGb3JgIGluc3RlYWRcbiAgICovXG4gIGdldCBzZXJpYWxpemVyKCk6IEpTT05BUElTZXJpYWxpemVyIHtcbiAgICBkZXByZWNhdGUoXG4gICAgICBcIidKU09OQVBJUmVxdWVzdFByb2Nlc3NvciNzZXJpYWxpemVyJyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgJ3NlcmlhbGl6ZXJGb3InIGluc3RlYWQuXCJcbiAgICApO1xuICAgIGlmICh0aGlzLl9zZXJpYWxpemVyKSB7XG4gICAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplcjtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZXJGb3IoXG4gICAgICAgIEpTT05BUElTZXJpYWxpemVycy5SZXNvdXJjZURvY3VtZW50XG4gICAgICApIGFzIEpTT05BUElTZXJpYWxpemVyO1xuICAgIH1cbiAgfVxuXG4gIGdldCBzZXJpYWxpemVyRm9yKCk6IFNlcmlhbGl6ZXJGb3JGbiB7XG4gICAgcmV0dXJuIHRoaXMuX3NlcmlhbGl6ZXJGb3I7XG4gIH1cblxuICBmZXRjaCh1cmw6IHN0cmluZywgY3VzdG9tU2V0dGluZ3M/OiBGZXRjaFNldHRpbmdzKTogUHJvbWlzZTxKU09OQVBJUmVzcG9uc2U+IHtcbiAgICBsZXQgc2V0dGluZ3MgPSB0aGlzLmluaXRGZXRjaFNldHRpbmdzKGN1c3RvbVNldHRpbmdzKTtcblxuICAgIGxldCBmdWxsVXJsID0gdXJsO1xuICAgIGlmIChzZXR0aW5ncy5wYXJhbXMpIHtcbiAgICAgIGZ1bGxVcmwgPSB0aGlzLnVybEJ1aWxkZXIuYXBwZW5kUXVlcnlQYXJhbXMoZnVsbFVybCwgc2V0dGluZ3MucGFyYW1zKTtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5wYXJhbXM7XG4gICAgfVxuXG4gICAgbGV0IGZldGNoRm4gPSAoT3JiaXQgYXMgYW55KS5mZXRjaCB8fCBPcmJpdC5nbG9iYWxzLmZldGNoO1xuXG4gICAgLy8gY29uc29sZS5sb2coJ2ZldGNoJywgZnVsbFVybCwgc2V0dGluZ3MsICdwb2x5ZmlsbCcsIGZldGNoRm4ucG9seWZpbGwpO1xuXG4gICAgaWYgKHNldHRpbmdzLnRpbWVvdXQgIT09IHVuZGVmaW5lZCAmJiBzZXR0aW5ncy50aW1lb3V0ID4gMCkge1xuICAgICAgbGV0IHRpbWVvdXQgPSBzZXR0aW5ncy50aW1lb3V0O1xuICAgICAgZGVsZXRlIHNldHRpbmdzLnRpbWVvdXQ7XG5cbiAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIGxldCB0aW1lZE91dDogYm9vbGVhbjtcblxuICAgICAgICBsZXQgdGltZXIgPSBPcmJpdC5nbG9iYWxzLnNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRpbWVkT3V0ID0gdHJ1ZTtcbiAgICAgICAgICByZWplY3QobmV3IE5ldHdvcmtFcnJvcihgTm8gZmV0Y2ggcmVzcG9uc2Ugd2l0aGluICR7dGltZW91dH1tcy5gKSk7XG4gICAgICAgIH0sIHRpbWVvdXQpO1xuXG4gICAgICAgIGZldGNoRm4oZnVsbFVybCwgc2V0dGluZ3MpXG4gICAgICAgICAgLmNhdGNoKChlOiBFcnJvcikgPT4ge1xuICAgICAgICAgICAgT3JiaXQuZ2xvYmFscy5jbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgICAgICBpZiAoIXRpbWVkT3V0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZldGNoRXJyb3IoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSlcbiAgICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4ge1xuICAgICAgICAgICAgT3JiaXQuZ2xvYmFscy5jbGVhclRpbWVvdXQodGltZXIpO1xuXG4gICAgICAgICAgICBpZiAoIXRpbWVkT3V0KSB7XG4gICAgICAgICAgICAgIHJldHVybiB0aGlzLmhhbmRsZUZldGNoUmVzcG9uc2UocmVzcG9uc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pXG4gICAgICAgICAgLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmV0Y2hGbihmdWxsVXJsLCBzZXR0aW5ncylcbiAgICAgICAgLmNhdGNoKChlOiBFcnJvcikgPT4gdGhpcy5oYW5kbGVGZXRjaEVycm9yKGUpKVxuICAgICAgICAudGhlbigocmVzcG9uc2U6IGFueSkgPT4gdGhpcy5oYW5kbGVGZXRjaFJlc3BvbnNlKHJlc3BvbnNlKSk7XG4gICAgfVxuICB9XG5cbiAgaW5pdEZldGNoU2V0dGluZ3MoY3VzdG9tU2V0dGluZ3M6IEZldGNoU2V0dGluZ3MgPSB7fSk6IEZldGNoU2V0dGluZ3Mge1xuICAgIGxldCBzZXR0aW5nczogRmV0Y2hTZXR0aW5ncyA9IGRlZXBNZXJnZShcbiAgICAgIHt9LFxuICAgICAgdGhpcy5kZWZhdWx0RmV0Y2hTZXR0aW5ncyxcbiAgICAgIGN1c3RvbVNldHRpbmdzXG4gICAgKTtcblxuICAgIGlmIChzZXR0aW5ncy5qc29uKSB7XG4gICAgICBhc3NlcnQoXG4gICAgICAgIFwiYGpzb25gIGFuZCBgYm9keWAgY2FuJ3QgYm90aCBiZSBzZXQgZm9yIGZldGNoIHJlcXVlc3RzLlwiLFxuICAgICAgICAhc2V0dGluZ3MuYm9keVxuICAgICAgKTtcbiAgICAgIHNldHRpbmdzLmJvZHkgPSBKU09OLnN0cmluZ2lmeShzZXR0aW5ncy5qc29uKTtcbiAgICAgIGRlbGV0ZSBzZXR0aW5ncy5qc29uO1xuICAgIH1cblxuICAgIGlmIChzZXR0aW5ncy5oZWFkZXJzICYmICFzZXR0aW5ncy5ib2R5KSB7XG4gICAgICBkZWxldGUgc2V0dGluZ3MuaGVhZGVyc1snQ29udGVudC1UeXBlJ107XG4gICAgfVxuXG4gICAgcmV0dXJuIHNldHRpbmdzO1xuICB9XG5cbiAgb3BlcmF0aW9uc0Zyb21EZXNlcmlhbGl6ZWREb2N1bWVudChcbiAgICBkZXNlcmlhbGl6ZWQ6IFJlY29yZERvY3VtZW50XG4gICk6IFJlY29yZE9wZXJhdGlvbltdIHtcbiAgICBjb25zdCByZWNvcmRzOiBJbml0aWFsaXplZFJlY29yZFtdID0gW107XG4gICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVjb3JkcywgdG9BcnJheShkZXNlcmlhbGl6ZWQuZGF0YSkpO1xuXG4gICAgaWYgKGRlc2VyaWFsaXplZC5pbmNsdWRlZCkge1xuICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkocmVjb3JkcywgZGVzZXJpYWxpemVkLmluY2x1ZGVkKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcmVjb3Jkcy5tYXAoKHJlY29yZCkgPT4ge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb3A6ICd1cGRhdGVSZWNvcmQnLFxuICAgICAgICByZWNvcmRcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBidWlsZEZldGNoU2V0dGluZ3MoXG4gICAgcmVxdWVzdDogUmVjb3JkUXVlcnlSZXF1ZXN0IHwgUmVjb3JkVHJhbnNmb3JtUmVxdWVzdFxuICApOiBGZXRjaFNldHRpbmdzIHtcbiAgICBjb25zdCBzZXR0aW5ncyA9IHtcbiAgICAgIHBhcmFtczoge30sXG4gICAgICAuLi5yZXF1ZXN0Lm9wdGlvbnM/LnNldHRpbmdzXG4gICAgfTtcblxuICAgIGlmIChyZXF1ZXN0Lm9wdGlvbnMpIHtcbiAgICAgIGNvbnN0IHsgZmlsdGVyLCBzb3J0LCBwYWdlLCBpbmNsdWRlLCBmaWVsZHMgfSA9IHJlcXVlc3Qub3B0aW9ucztcblxuICAgICAgaWYgKGZpbHRlcikge1xuICAgICAgICBzZXR0aW5ncy5wYXJhbXMuZmlsdGVyID0gdGhpcy51cmxCdWlsZGVyLmJ1aWxkRmlsdGVyUGFyYW0oXG4gICAgICAgICAgZmlsdGVyLFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNvcnQpIHtcbiAgICAgICAgc2V0dGluZ3MucGFyYW1zLnNvcnQgPSB0aGlzLnVybEJ1aWxkZXIuYnVpbGRTb3J0UGFyYW0oc29ydCwgcmVxdWVzdCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChwYWdlKSB7XG4gICAgICAgIHNldHRpbmdzLnBhcmFtcy5wYWdlID0gdGhpcy51cmxCdWlsZGVyLmJ1aWxkUGFnZVBhcmFtKHBhZ2UsIHJlcXVlc3QpO1xuICAgICAgfVxuXG4gICAgICBpZiAoaW5jbHVkZSkge1xuICAgICAgICBzZXR0aW5ncy5wYXJhbXMuaW5jbHVkZSA9IHRoaXMudXJsQnVpbGRlci5idWlsZEluY2x1ZGVQYXJhbShcbiAgICAgICAgICBpbmNsdWRlLFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGZpZWxkcykge1xuICAgICAgICBzZXR0aW5ncy5wYXJhbXMuZmllbGRzID0gdGhpcy51cmxCdWlsZGVyLmJ1aWxkRmllbGRzUGFyYW0oXG4gICAgICAgICAgZmllbGRzLFxuICAgICAgICAgIHJlcXVlc3RcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc2V0dGluZ3M7XG4gIH1cblxuICBtZXJnZVJlcXVlc3RPcHRpb25zKFxuICAgIG9wdGlvbnM6XG4gICAgICB8IEpTT05BUElSZXF1ZXN0T3B0aW9uc1xuICAgICAgfCB1bmRlZmluZWRcbiAgICAgIHwgKEpTT05BUElSZXF1ZXN0T3B0aW9ucyB8IHVuZGVmaW5lZClbXVxuICApOiBKU09OQVBJUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIHJldHVybiByZXF1ZXN0T3B0aW9uc0ZvclNvdXJjZTxKU09OQVBJUmVxdWVzdE9wdGlvbnM+KFxuICAgICAgb3B0aW9ucyxcbiAgICAgIHRoaXMuc291cmNlTmFtZVxuICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQGRlcHJlY2F0ZWQgc2luY2UgdjAuMTcsIHVzZSBgbWVyZ2VSZXF1ZXN0T3B0aW9uc2AgaW5zdGVhZFxuICAgKi9cbiAgY3VzdG9tUmVxdWVzdE9wdGlvbnMoXG4gICAgcXVlcnlPclRyYW5zZm9ybTogUmVjb3JkUXVlcnkgfCBSZWNvcmRUcmFuc2Zvcm0sXG4gICAgcXVlcnlFeHByZXNzaW9uT3JPcGVyYXRpb246IFJlY29yZFF1ZXJ5RXhwcmVzc2lvbiB8IFJlY29yZE9wZXJhdGlvblxuICApOiBKU09OQVBJUmVxdWVzdE9wdGlvbnMgfCB1bmRlZmluZWQge1xuICAgIGRlcHJlY2F0ZShcbiAgICAgIFwiJ0pTT05BUElSZXF1ZXN0UHJvY2Vzc29yI2N1c3RvbVJlcXVlc3RPcHRpb25zJyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgJ21lcmdlUmVxdWVzdE9wdGlvbnMnIGluc3RlYWQuXCJcbiAgICApO1xuICAgIHJldHVybiB0aGlzLm1lcmdlUmVxdWVzdE9wdGlvbnMoW1xuICAgICAgcXVlcnlPclRyYW5zZm9ybS5vcHRpb25zLFxuICAgICAgcXVlcnlFeHByZXNzaW9uT3JPcGVyYXRpb24ub3B0aW9uc1xuICAgIF0pO1xuICB9XG5cbiAgLyogZXNsaW50LWRpc2FibGUgQHR5cGVzY3JpcHQtZXNsaW50L25vLXVudXNlZC12YXJzICovXG4gIHByZXByb2Nlc3NSZXNwb25zZURvY3VtZW50KFxuICAgIGRvY3VtZW50OiBSZXNvdXJjZURvY3VtZW50IHwgdW5kZWZpbmVkLFxuICAgIHJlcXVlc3Q6IFJlY29yZFF1ZXJ5UmVxdWVzdCB8IFJlY29yZFRyYW5zZm9ybVJlcXVlc3RcbiAgKTogdm9pZCB7fVxuICAvKiBlc2xpbnQtZW5hYmxlIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFycyAqL1xuXG4gIHByb3RlY3RlZCByZXNwb25zZUhhc0NvbnRlbnQoXG4gICAgcmVzcG9uc2U6IFJlc3BvbnNlLFxuICAgIGlnbm9yZVVucmVjb2duaXplZENvbnRlbnQ/OiBib29sZWFuXG4gICk6IGJvb2xlYW4ge1xuICAgIGxldCBjb250ZW50VHlwZSA9IHJlc3BvbnNlLmhlYWRlcnMuZ2V0KCdDb250ZW50LVR5cGUnKTtcbiAgICBpZiAoY29udGVudFR5cGUpIHtcbiAgICAgIGZvciAobGV0IGFsbG93ZWRDb250ZW50VHlwZSBvZiB0aGlzLmFsbG93ZWRDb250ZW50VHlwZXMpIHtcbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlLmluZGV4T2YoYWxsb3dlZENvbnRlbnRUeXBlKSA+IC0xKSB7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmICghaWdub3JlVW5yZWNvZ25pemVkQ29udGVudCkge1xuICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFNlcnZlclJlc3BvbnNlKFxuICAgICAgICAgIGBUaGUgc2VydmVyIHJlc3BvbmRlZCB3aXRoIHRoZSBjb250ZW50IHR5cGUgJyR7Y29udGVudFR5cGV9Jywgd2hpY2ggaXMgbm90IGFsbG93ZWQuIEFsbG93ZWQgY29udGVudCB0eXBlcyBpbmNsdWRlOiAnJHt0aGlzLmFsbG93ZWRDb250ZW50VHlwZXMuam9pbihcbiAgICAgICAgICAgIFwiJywgJ1wiXG4gICAgICAgICAgKX0nLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcHJvdGVjdGVkIGluaXREZWZhdWx0RmV0Y2hTZXR0aW5ncyhcbiAgICBzZXR0aW5nczogSlNPTkFQSVJlcXVlc3RQcm9jZXNzb3JTZXR0aW5nc1xuICApOiB2b2lkIHtcbiAgICB0aGlzLmRlZmF1bHRGZXRjaFNldHRpbmdzID0ge1xuICAgICAgaGVhZGVyczoge1xuICAgICAgICBBY2NlcHQ6ICdhcHBsaWNhdGlvbi92bmQuYXBpK2pzb24nLFxuICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL3ZuZC5hcGkranNvbidcbiAgICAgIH0sXG4gICAgICB0aW1lb3V0OiA1MDAwXG4gICAgfTtcblxuICAgIGlmIChzZXR0aW5ncy5kZWZhdWx0RmV0Y2hTZXR0aW5ncykge1xuICAgICAgZGVlcE1lcmdlKHRoaXMuZGVmYXVsdEZldGNoU2V0dGluZ3MsIHNldHRpbmdzLmRlZmF1bHRGZXRjaFNldHRpbmdzKTtcbiAgICB9XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRmV0Y2hSZXNwb25zZShcbiAgICByZXNwb25zZTogUmVzcG9uc2VcbiAgKTogUHJvbWlzZTxKU09OQVBJUmVzcG9uc2U+IHtcbiAgICBjb25zdCByZXNwb25zZURldGFpbDogSlNPTkFQSVJlc3BvbnNlID0ge1xuICAgICAgcmVzcG9uc2VcbiAgICB9O1xuICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPj0gMjAwICYmIHJlc3BvbnNlLnN0YXR1cyA8IDMwMCkge1xuICAgICAgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMjA0ICYmIHRoaXMucmVzcG9uc2VIYXNDb250ZW50KHJlc3BvbnNlKSkge1xuICAgICAgICByZXNwb25zZURldGFpbC5kb2N1bWVudCA9IGF3YWl0IHJlc3BvbnNlLmpzb24oKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN0YXR1cyAhPT0gMzA0ICYmIHJlc3BvbnNlLnN0YXR1cyAhPT0gNDA0KSB7XG4gICAgICBpZiAodGhpcy5yZXNwb25zZUhhc0NvbnRlbnQocmVzcG9uc2UsIHRydWUpKSB7XG4gICAgICAgIGNvbnN0IGRvY3VtZW50ID0gYXdhaXQgcmVzcG9uc2UuanNvbigpO1xuICAgICAgICBhd2FpdCB0aGlzLmhhbmRsZUZldGNoUmVzcG9uc2VFcnJvcihyZXNwb25zZSwgZG9jdW1lbnQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgYXdhaXQgdGhpcy5oYW5kbGVGZXRjaFJlc3BvbnNlRXJyb3IocmVzcG9uc2UpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2VEZXRhaWw7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRmV0Y2hSZXNwb25zZUVycm9yKFxuICAgIHJlc3BvbnNlOiBSZXNwb25zZSxcbiAgICBkYXRhPzogdW5rbm93blxuICApOiBQcm9taXNlPEVycm9yPiB7XG4gICAgbGV0IGVycm9yOiBhbnk7XG4gICAgaWYgKHJlc3BvbnNlLnN0YXR1cyA+PSA0MDAgJiYgcmVzcG9uc2Uuc3RhdHVzIDwgNTAwKSB7XG4gICAgICBlcnJvciA9IG5ldyBDbGllbnRFcnJvcihyZXNwb25zZS5zdGF0dXNUZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgZXJyb3IgPSBuZXcgU2VydmVyRXJyb3IocmVzcG9uc2Uuc3RhdHVzVGV4dCk7XG4gICAgfVxuICAgIGVycm9yLnJlc3BvbnNlID0gcmVzcG9uc2U7XG4gICAgZXJyb3IuZGF0YSA9IGRhdGE7XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBwcm90ZWN0ZWQgYXN5bmMgaGFuZGxlRmV0Y2hFcnJvcihlOiBFcnJvciB8IHN0cmluZyk6IFByb21pc2U8RXJyb3I+IHtcbiAgICBpZiAodHlwZW9mIGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgTmV0d29ya0Vycm9yKGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBlO1xuICAgIH1cbiAgfVxufVxuIl19
;