Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

@meteor-it/xrest

Package Overview
Dependencies
Maintainers
3
Versions
56
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@meteor-it/xrest - npm Package Compare versions

Comparing version 0.2.1 to 0.3.1

249

index.js

@@ -1,21 +0,28 @@

import Logger from '@meteor-it/logger';
import * as multipart from './multipart';
import {EventEmitter} from 'events';
import {METHODS} from 'http';
import * as http from 'http';
import * as https from 'https';
import {parse as parseUrl,resolve} from 'url';
import {stringify} from 'querystring';
import * as zlib from 'zlib';
import iconv from 'iconv-lite';
export * from './multipart';
const POSSIBLE_EVENTS=[...METHODS];
const POSSIBLE_MIDDLEWARES=['STREAM'];
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
function __export(m) {
for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];
}
Object.defineProperty(exports, "__esModule", { value: true });
const logger_1 = require("@meteor-it/logger");
const multipart = require("./multipart");
const events_1 = require("events");
const http_1 = require("http");
const http = require("http");
const https = require("https");
const url_1 = require("url");
const querystring_1 = require("querystring");
const zlib = require("zlib");
const iconv_lite_1 = require("iconv-lite");
__export(require("./multipart"));
const POSSIBLE_EVENTS = [...http_1.METHODS];
const POSSIBLE_MIDDLEWARES = ['STREAM'];
const USER_AGENT = 'Meteor-IT XRest';
const decoders = {

@@ -29,59 +36,47 @@ gzip(buf, callback) {

};
const parsers={
json(text,cb){
try{
cb(null,JSON.parse(text));
}catch(e){
cb(null,text);
const parsers = {
json(text, cb) {
try {
cb(null, JSON.parse(text));
}
catch (e) {
cb(null, text);
}
}
};
class Request extends EventEmitter {
url;
options;
headers;
class Request extends events_1.EventEmitter {
constructor(url, options) {
super();
this.prepare(url,options);
this.prepare(url, options);
}
prepare(url,options){
logger.debug('prepare(%s)',url);
if(url.indexOf('undefined')+1){
prepare(url, options) {
logger.debug('prepare(%s)', url);
if (url.indexOf('undefined') + 1) {
logger.warn('undefined found in request url! Stack for reference:');
logger.warn(new Error('reference stack').stack);
}
this.url = parseUrl(url);
if(!this.url.hostname)
this.url = url_1.parse(url);
if (!this.url.hostname)
console.log(this.url);
this.options = options;
this.headers = {
'Accept': '*/*',
'User-Agent': USER_AGENT,
'Host': this.url.host,
'Accept-Encoding': 'gzip, deflate',
...options.headers
};
this.headers = Object.assign({ 'Accept': '*/*', 'User-Agent': USER_AGENT, 'Host': this.url.host, 'Accept-Encoding': 'gzip, deflate' }, options.headers);
// set port and method defaults
if (!this.url.port)
if (!this.url.port)
this.url.port = (this.url.protocol == 'https:') ? '443' : '80';
if (!this.options.method)
if (!this.options.method)
this.options.method = (this.options.data) ? 'POST' : 'GET';
if (typeof this.options.followRedirects == 'undefined')
if (typeof this.options.followRedirects == 'undefined')
this.options.followRedirects = true;
if(this.options.timeout===undefined)
this.options.timeout=12000;
if(!this.options.parser)
this.options.parser=parsers.json;
if (this.options.timeout === undefined)
this.options.timeout = 12000;
if (!this.options.parser)
this.options.parser = parsers.json;
// stringify query given in options of not given in URL
if (this.options.query) {
if (typeof this.options.query == 'object')
this.url.query = stringify(this.options.query);
else this.url.query = this.options.query;
this.url.query = querystring_1.stringify(this.options.query);
else
this.url.query = this.options.query;
}
this.applyAuth();
if (this.options.multipart) {

@@ -97,3 +92,3 @@ this.headers['Content-Type'] = `multipart/form-data; boundary=${multipart.DEFAULT_BOUNDARY}`;

if (typeof this.options.data == 'object' && !Buffer.isBuffer(this.options.data)) {
this.options.data = stringify(this.options.data);
this.options.data = querystring_1.stringify(this.options.data);
this.headers['Content-Type'] = 'application/x-www-form-urlencoded';

@@ -111,5 +106,3 @@ this.headers['Content-Length'] = this.options.data.length;

}
const proto = (this.url.protocol == 'https:') ? https : http;
this.request = proto.request({

@@ -124,3 +117,2 @@ host: this.url.hostname,

});
this.makeRequest();

@@ -133,4 +125,6 @@ }

let path = this.url.pathname || '/';
if (this.url.hash) path += this.url.hash;
if (this.url.query) path += `?${this.url.query}`;
if (this.url.hash)
path += this.url.hash;
if (this.url.query)
path += `?${this.url.query}`;
return path;

@@ -140,3 +134,2 @@ }

let authParts;
if (this.url.auth) {

@@ -147,3 +140,2 @@ authParts = this.url.auth.split(':');

}
if (this.options.username && this.options.password !== undefined) {

@@ -163,3 +155,3 @@ const b = new Buffer([this.options.username, this.options.password].join(':'));

if (response.statusCode === 303) {
this.url = parseUrl(resolve(this.url.href, response.headers['location']));
this.url = url_1.parse(url_1.resolve(this.url.href, response.headers['location']));
this.options.method = 'GET';

@@ -170,3 +162,3 @@ delete this.options.data;

else {
this.url = parseUrl(resolve(this.url.href, response.headers['location']));
this.url = url_1.parse(url_1.resolve(this.url.href, response.headers['location']));
this.reRetry();

@@ -183,11 +175,8 @@ // TODO: Handle somehow infinite redirects

let body = '';
// When using browserify, response.setEncoding is not defined
if (typeof response.setEncoding == 'function')
response.setEncoding('binary');
response.on('data', chunk => {
body += chunk;
});
response.on('end', () => {

@@ -216,3 +205,2 @@ response.rawEncoded = body;

const decoder = response.headers['content-encoding'];
if (decoder in decoders) {

@@ -233,5 +221,5 @@ decoders[decoder].call(response, body, callback);

try {
return iconv.decode(body, charset);
return iconv_lite_1.default.decode(body, charset);
}
catch (err) {}
catch (err) { }
}

@@ -273,3 +261,3 @@ }

fireSuccess(body, response) {
if (parseInt(response.statusCode,10) >= 400) {
if (parseInt(response.statusCode, 10) >= 400) {
this.emit('fail', body, response);

@@ -303,3 +291,3 @@ }

reRetry() {
this.request.removeAllListeners().on('error', () => {});
this.request.removeAllListeners().on('error', () => { });
if (this.request.finished) {

@@ -311,16 +299,17 @@ this.request.abort();

}
async run() {
if (this.options.multipart) {
await multipart.write(this.request, this.options.data, () => {
run() {
return __awaiter(this, void 0, void 0, function* () {
if (this.options.multipart) {
yield multipart.write(this.request, this.options.data, () => {
this.request.end();
});
}
else {
if (this.options.data) {
this.request.write(this.options.data, this.options.encoding || 'utf8');
}
this.request.end();
});
}
else {
if (this.options.data) {
this.request.write(this.options.data, this.options.encoding || 'utf8');
}
this.request.end();
}
return this;
return this;
});
}

@@ -340,3 +329,2 @@ abort(err) {

}
this.request.on('close', () => {

@@ -350,3 +338,2 @@ if (err) {

});
this.aborted = true;

@@ -358,3 +345,3 @@ this.request.abort();

retry(timeout) {
timeout = parseInt(timeout,10);
timeout = parseInt(timeout, 10);
const fn = this.reRetry.bind(this);

@@ -370,49 +357,48 @@ if (!isFinite(timeout) || timeout <= 0) {

}
const logger=new Logger('xrest');
export function emit(eventString,options={}) {
let [event,path,...middlewares]=eventString.split(' ');
let middleFunctions=[];
for(let middleware of middlewares){
if(middleware.toUpperCase()!==middleware){
logger.warn('Upper case is preffered for middleware names! (Got: %s)',event);
middleware=middleware.toUpperCase();
const logger = new logger_1.default('xrest');
function emit(eventString, options = {}) {
let [event, path, ...middlewares] = eventString.split(' ');
let middleFunctions = [];
for (let middleware of middlewares) {
if (middleware.toUpperCase() !== middleware) {
logger.warn('Upper case is preffered for middleware names! (Got: %s)', event);
middleware = middleware.toUpperCase();
}
if(!~POSSIBLE_MIDDLEWARES.indexOf(middleware))
throw new Error('Unknown middleware: '+middleware);
if (!~POSSIBLE_MIDDLEWARES.indexOf(middleware))
throw new Error('Unknown middleware: ' + middleware);
middleFunctions.push(middleware);
}
if(event.toUpperCase()!==event){
logger.warn('Upper case is preffered for event names! (Got: %s)',event);
event=event.toUpperCase();
if (event.toUpperCase() !== event) {
logger.warn('Upper case is preffered for event names! (Got: %s)', event);
event = event.toUpperCase();
}
if(!~POSSIBLE_EVENTS.indexOf(event)){
throw new Error('Unknown event: '+event+', possible events are '+POSSIBLE_EVENTS.join(', ')+'!');
if (!~POSSIBLE_EVENTS.indexOf(event)) {
throw new Error('Unknown event: ' + event + ', possible events are ' + POSSIBLE_EVENTS.join(', ') + '!');
}
options.method = event;
const request=new Request(path,options);
if(~middleFunctions.indexOf('STREAM')){
const request = new Request(path, options);
if (~middleFunctions.indexOf('STREAM')) {
logger.debug('Streaming');
return new Promise((res,rej)=>{
return new Promise((res, rej) => {
request.run();
request.on('timeout',(ms)=>{
rej(new Error('Timeout: '+ms));
request.on('timeout', (ms) => {
rej(new Error('Timeout: ' + ms));
});
request.on('response',(response)=>{
request.on('response', (response) => {
res(response);
});
});
}else{
return new Promise((res,rej)=>{
}
else {
return new Promise((res, rej) => {
request.run();
request.on('timeout',(ms)=>{
rej(new Error('Timeout: '+ms));
request.on('timeout', (ms) => {
rej(new Error('Timeout: ' + ms));
});
request.on('complete',(result,response)=>{
if(result instanceof Error) {
request.on('complete', (result, response) => {
if (result instanceof Error) {
rej(result);
return;
}
response.body=result;
response.body = result;
res(response);

@@ -423,15 +409,16 @@ });

}
export default class XRest{
baseUrl;
defaultOptions;
constructor(url,defaultOptions){
logger.debug('new XRest(%s)',url);
this.baseUrl=url;
this.defaultOptions=defaultOptions;
exports.emit = emit;
class XRest {
constructor(url, defaultOptions) {
logger.debug('new XRest(%s)', url);
this.baseUrl = url;
this.defaultOptions = defaultOptions;
}
emit(eventString,options){
let [event,path,...middlewares]=eventString.split(' ');
path=resolve(this.baseUrl, path);
return emit([event,path,...middlewares].join(' '),options);
emit(eventString, options) {
let [event, path, ...middlewares] = eventString.split(' ');
path = url_1.resolve(this.baseUrl, path);
return emit([event, path, ...middlewares].join(' '), options);
}
}
}
exports.default = XRest;
//# sourceMappingURL=data:application/json;base64,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RyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUNaLE1BQU0sQ0FBQztnQkFDWCxDQUFDO2dCQUNELFFBQVEsQ0FBQyxJQUFJLEdBQUMsTUFBTSxDQUFDO2dCQUNyQixHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7WUFDbEIsQ0FBQyxDQUFDLENBQUM7UUFDUCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7QUFDTCxDQUFDO0FBaERELG9CQWdEQztBQUNEO0lBR0ksWUFBWSxHQUFHLEVBQUMsY0FBYztRQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBQyxHQUFHLENBQUMsQ0FBQztRQUNsQyxJQUFJLENBQUMsT0FBTyxHQUFDLEdBQUcsQ0FBQztRQUNqQixJQUFJLENBQUMsY0FBYyxHQUFDLGNBQWMsQ0FBQztJQUN2QyxDQUFDO0lBQ0QsSUFBSSxDQUFDLFdBQVcsRUFBQyxPQUFPO1FBQ3BCLElBQUksQ0FBQyxLQUFLLEVBQUMsSUFBSSxFQUFDLEdBQUcsV0FBVyxDQUFDLEdBQUMsV0FBVyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUN2RCxJQUFJLEdBQUMsYUFBTyxDQUFDLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7UUFDakMsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDLEtBQUssRUFBQyxJQUFJLEVBQUMsR0FBRyxXQUFXLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUMsT0FBTyxDQUFDLENBQUM7SUFDL0QsQ0FBQztDQUNKO0FBYkQsd0JBYUMiLCJmaWxlIjoieHJlc3QvaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgTG9nZ2VyIGZyb20gJ0BtZXRlb3ItaXQvbG9nZ2VyJztcblxuaW1wb3J0ICogYXMgbXVsdGlwYXJ0IGZyb20gJy4vbXVsdGlwYXJ0JztcblxuaW1wb3J0IHtFdmVudEVtaXR0ZXJ9IGZyb20gJ2V2ZW50cyc7XG5pbXBvcnQge01FVEhPRFN9IGZyb20gJ2h0dHAnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCAqIGFzIGh0dHBzIGZyb20gJ2h0dHBzJztcbmltcG9ydCB7cGFyc2UgYXMgcGFyc2VVcmwscmVzb2x2ZX0gZnJvbSAndXJsJztcbmltcG9ydCB7c3RyaW5naWZ5fSBmcm9tICdxdWVyeXN0cmluZyc7XG5pbXBvcnQgKiBhcyB6bGliIGZyb20gJ3psaWInO1xuaW1wb3J0IGljb252IGZyb20gJ2ljb252LWxpdGUnO1xuXG5leHBvcnQgKiBmcm9tICcuL211bHRpcGFydCc7XG5cbmNvbnN0IFBPU1NJQkxFX0VWRU5UUz1bLi4uTUVUSE9EU107XG5jb25zdCBQT1NTSUJMRV9NSURETEVXQVJFUz1bJ1NUUkVBTSddO1xuXG5jb25zdCBVU0VSX0FHRU5UID0gJ01ldGVvci1JVCBYUmVzdCc7XG5cbmNvbnN0IGRlY29kZXJzID0ge1xuICAgIGd6aXAoYnVmLCBjYWxsYmFjaykge1xuICAgICAgICB6bGliLmd1bnppcChidWYsIGNhbGxiYWNrKTtcbiAgICB9LFxuICAgIGRlZmxhdGUoYnVmLCBjYWxsYmFjaykge1xuICAgICAgICB6bGliLmluZmxhdGUoYnVmLCBjYWxsYmFjayk7XG4gICAgfVxufTtcbmNvbnN0IHBhcnNlcnM9e1xuICAgIGpzb24odGV4dCxjYil7XG4gICAgICAgIHRyeXtcbiAgICAgICAgICAgIGNiKG51bGwsSlNPTi5wYXJzZSh0ZXh0KSk7XG4gICAgICAgIH1jYXRjaChlKXtcbiAgICAgICAgICAgIGNiKG51bGwsdGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5jbGFzcyBSZXF1ZXN0IGV4dGVuZHMgRXZlbnRFbWl0dGVyIHtcbiAgICB1cmw7XG4gICAgb3B0aW9ucztcbiAgICBoZWFkZXJzO1xuICAgIFxuICAgIGNvbnN0cnVjdG9yKHVybCwgb3B0aW9ucykge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnByZXBhcmUodXJsLG9wdGlvbnMpO1xuICAgIH1cbiAgICBwcmVwYXJlKHVybCxvcHRpb25zKXtcbiAgICAgICAgbG9nZ2VyLmRlYnVnKCdwcmVwYXJlKCVzKScsdXJsKTtcbiAgICAgICAgaWYodXJsLmluZGV4T2YoJ3VuZGVmaW5lZCcpKzEpe1xuICAgICAgICAgICAgbG9nZ2VyLndhcm4oJ3VuZGVmaW5lZCBmb3VuZCBpbiByZXF1ZXN0IHVybCEgU3RhY2sgZm9yIHJlZmVyZW5jZTonKTtcbiAgICAgICAgICAgIGxvZ2dlci53YXJuKG5ldyBFcnJvcigncmVmZXJlbmNlIHN0YWNrJykuc3RhY2spO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudXJsID0gcGFyc2VVcmwodXJsKTtcbiAgICAgICAgaWYoIXRoaXMudXJsLmhvc3RuYW1lKVxuICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy51cmwpO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB0aGlzLmhlYWRlcnMgPSB7XG4gICAgICAgICAgICAnQWNjZXB0JzogJyovKicsXG4gICAgICAgICAgICAnVXNlci1BZ2VudCc6IFVTRVJfQUdFTlQsXG4gICAgICAgICAgICAnSG9zdCc6IHRoaXMudXJsLmhvc3QsXG4gICAgICAgICAgICAnQWNjZXB0LUVuY29kaW5nJzogJ2d6aXAsIGRlZmxhdGUnLFxuICAgICAgICAgICAgLi4ub3B0aW9ucy5oZWFkZXJzXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gc2V0IHBvcnQgYW5kIG1ldGhvZCBkZWZhdWx0c1xuICAgICAgICBpZiAoIXRoaXMudXJsLnBvcnQpIFxuICAgICAgICAgICAgdGhpcy51cmwucG9ydCA9ICh0aGlzLnVybC5wcm90b2NvbCA9PSAnaHR0cHM6JykgPyAnNDQzJyA6ICc4MCc7XG4gICAgICAgIGlmICghdGhpcy5vcHRpb25zLm1ldGhvZCkgXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMubWV0aG9kID0gKHRoaXMub3B0aW9ucy5kYXRhKSA/ICdQT1NUJyA6ICdHRVQnO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMgPT0gJ3VuZGVmaW5lZCcpIFxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLmZvbGxvd1JlZGlyZWN0cyA9IHRydWU7XG4gICAgICAgIGlmKHRoaXMub3B0aW9ucy50aW1lb3V0PT09dW5kZWZpbmVkKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnRpbWVvdXQ9MTIwMDA7XG4gICAgICAgIGlmKCF0aGlzLm9wdGlvbnMucGFyc2VyKVxuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhcnNlcj1wYXJzZXJzLmpzb247XG5cbiAgICAgICAgLy8gc3RyaW5naWZ5IHF1ZXJ5IGdpdmVuIGluIG9wdGlvbnMgb2Ygbm90IGdpdmVuIGluIFVSTFxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnF1ZXJ5KSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMub3B0aW9ucy5xdWVyeSA9PSAnb2JqZWN0JylcbiAgICAgICAgICAgICAgICB0aGlzLnVybC5xdWVyeSA9IHN0cmluZ2lmeSh0aGlzLm9wdGlvbnMucXVlcnkpO1xuICAgICAgICAgICAgZWxzZSB0aGlzLnVybC5xdWVyeSA9IHRoaXMub3B0aW9ucy5xdWVyeTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFwcGx5QXV0aCgpO1xuXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubXVsdGlwYXJ0KSB7XG4gICAgICAgICAgICB0aGlzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gYG11bHRpcGFydC9mb3JtLWRhdGE7IGJvdW5kYXJ5PSR7bXVsdGlwYXJ0LkRFRkFVTFRfQk9VTkRBUll9YDtcbiAgICAgICAgICAgIGNvbnN0IG11bHRpcGFydFNpemUgPSBtdWx0aXBhcnQuc2l6ZU9mKHRoaXMub3B0aW9ucy5kYXRhLCBtdWx0aXBhcnQuREVGQVVMVF9CT1VOREFSWSk7XG4gICAgICAgICAgICBpZiAoIWlzTmFOKG11bHRpcGFydFNpemUpKVxuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IG11bHRpcGFydFNpemU7XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgZ2V0IENvbnRlbnQtTGVuZ3RoIScpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGF0YSA9PSAnb2JqZWN0JyAmJiAhQnVmZmVyLmlzQnVmZmVyKHRoaXMub3B0aW9ucy5kYXRhKSkge1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gc3RyaW5naWZ5KHRoaXMub3B0aW9ucy5kYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddID0gJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCc7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gdGhpcy5vcHRpb25zLmRhdGEubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLm9wdGlvbnMuZGF0YSA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBCdWZmZXIodGhpcy5vcHRpb25zLmRhdGEsIHRoaXMub3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCcpO1xuICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5kYXRhID0gYnVmZmVyO1xuICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyc1snQ29udGVudC1MZW5ndGgnXSA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5kYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzWydDb250ZW50LUxlbmd0aCddID0gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHByb3RvID0gKHRoaXMudXJsLnByb3RvY29sID09ICdodHRwczonKSA/IGh0dHBzIDogaHR0cDtcblxuICAgICAgICB0aGlzLnJlcXVlc3QgPSBwcm90by5yZXF1ZXN0KHtcbiAgICAgICAgICAgIGhvc3Q6IHRoaXMudXJsLmhvc3RuYW1lLFxuICAgICAgICAgICAgcG9ydDogdGhpcy51cmwucG9ydCxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMuZnVsbFBhdGgoKSxcbiAgICAgICAgICAgIG1ldGhvZDogdGhpcy5vcHRpb25zLm1ldGhvZCxcbiAgICAgICAgICAgIGhlYWRlcnM6IHRoaXMuaGVhZGVycyxcbiAgICAgICAgICAgIHJlamVjdFVuYXV0aG9yaXplZDogdGhpcy5vcHRpb25zLnJlamVjdFVuYXV0aG9yaXplZCxcbiAgICAgICAgICAgIGFnZW50OiB0aGlzLm9wdGlvbnMuYWdlbnRcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5tYWtlUmVxdWVzdCgpO1xuICAgIH1cbiAgICBpc1JlZGlyZWN0KHJlc3BvbnNlKSB7XG4gICAgICAgIHJldHVybiAoWzMwMSwgMzAyLCAzMDMsIDMwN10uaW5jbHVkZXMocmVzcG9uc2Uuc3RhdHVzQ29kZSkpO1xuICAgIH1cbiAgICBmdWxsUGF0aCgpIHtcbiAgICAgICAgbGV0IHBhdGggPSB0aGlzLnVybC5wYXRobmFtZSB8fCAnLyc7XG4gICAgICAgIGlmICh0aGlzLnVybC5oYXNoKSBwYXRoICs9IHRoaXMudXJsLmhhc2g7XG4gICAgICAgIGlmICh0aGlzLnVybC5xdWVyeSkgcGF0aCArPSBgPyR7dGhpcy51cmwucXVlcnl9YDtcbiAgICAgICAgcmV0dXJuIHBhdGg7XG4gICAgfVxuICAgIGFwcGx5QXV0aCgpIHtcbiAgICAgICAgbGV0IGF1dGhQYXJ0cztcblxuICAgICAgICBpZiAodGhpcy51cmwuYXV0aCkge1xuICAgICAgICAgICAgYXV0aFBhcnRzID0gdGhpcy51cmwuYXV0aC5zcGxpdCgnOicpO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnVzZXJuYW1lID0gYXV0aFBhcnRzWzBdO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhc3N3b3JkID0gYXV0aFBhcnRzWzFdO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy51c2VybmFtZSAmJiB0aGlzLm9wdGlvbnMucGFzc3dvcmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgYiA9IG5ldyBCdWZmZXIoW3RoaXMub3B0aW9ucy51c2VybmFtZSwgdGhpcy5vcHRpb25zLnBhc3N3b3JkXS5qb2luKCc6JykpO1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmFzaWMgJHtiLnRvU3RyaW5nKCdiYXNlNjQnKX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5hY2Nlc3NUb2tlbikge1xuICAgICAgICAgICAgdGhpcy5oZWFkZXJzWydBdXRob3JpemF0aW9uJ10gPSBgQmVhcmVyICR7dGhpcy5vcHRpb25zLmFjY2Vzc1Rva2VufWA7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVzcG9uc2VIYW5kbGVyKHJlc3BvbnNlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVkaXJlY3QocmVzcG9uc2UpICYmIHRoaXMub3B0aW9ucy5mb2xsb3dSZWRpcmVjdHMpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgLy8gMzAzIHNob3VsZCByZWRpcmVjdCBhbmQgcmV0cmlldmUgY29udGVudCB3aXRoIHRoZSBHRVQgbWV0aG9kXG4gICAgICAgICAgICAgICAgLy8gaHR0cDovL3d3dy53My5vcmcvUHJvdG9jb2xzL3JmYzI2MTYvcmZjMjYxNi1zZWMxMC5odG1sI3NlYzEwLjMuNFxuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zdGF0dXNDb2RlID09PSAzMDMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwgPSBwYXJzZVVybChyZXNvbHZlKHRoaXMudXJsLmhyZWYsIHJlc3BvbnNlLmhlYWRlcnNbJ2xvY2F0aW9uJ10pKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLm1ldGhvZCA9ICdHRVQnO1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5vcHRpb25zLmRhdGE7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVSZXRyeSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmwgPSBwYXJzZVVybChyZXNvbHZlKHRoaXMudXJsLmhyZWYsIHJlc3BvbnNlLmhlYWRlcnNbJ2xvY2F0aW9uJ10pKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZVJldHJ5KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSBzb21laG93IGluZmluaXRlIHJlZGlyZWN0c1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBlcnIubWVzc2FnZSA9IGBGYWlsZWQgdG8gZm9sbG93IHJlZGlyZWN0OiAke2Vyci5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyLCByZXNwb25zZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgYm9keSA9ICcnO1xuXG4gICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGJyb3dzZXJpZnksIHJlc3BvbnNlLnNldEVuY29kaW5nIGlzIG5vdCBkZWZpbmVkXG4gICAgICAgICAgICBpZiAodHlwZW9mIHJlc3BvbnNlLnNldEVuY29kaW5nID09ICdmdW5jdGlvbicpXG4gICAgICAgICAgICAgICAgcmVzcG9uc2Uuc2V0RW5jb2RpbmcoJ2JpbmFyeScpO1xuXG4gICAgICAgICAgICByZXNwb25zZS5vbignZGF0YScsIGNodW5rID0+IHtcbiAgICAgICAgICAgICAgICBib2R5ICs9IGNodW5rO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHJlc3BvbnNlLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UucmF3RW5jb2RlZCA9IGJvZHk7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWNvZGUobmV3IEJ1ZmZlcihib2R5LCAnYmluYXJ5JyksIHJlc3BvbnNlLCAoZXJyLCBib2R5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVyciwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLnJhdyA9IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGJvZHkgPSB0aGlzLmljb252KGJvZHksIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmNvZGUoYm9keSwgcmVzcG9uc2UsIChlcnIsIGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZVN1Y2Nlc3MoYm9keSwgcmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlY29kZShib2R5LCByZXNwb25zZSwgY2FsbGJhY2spIHtcbiAgICAgICAgY29uc3QgZGVjb2RlciA9IHJlc3BvbnNlLmhlYWRlcnNbJ2NvbnRlbnQtZW5jb2RpbmcnXTtcblxuICAgICAgICBpZiAoZGVjb2RlciBpbiBkZWNvZGVycykge1xuICAgICAgICAgICAgZGVjb2RlcnNbZGVjb2Rlcl0uY2FsbChyZXNwb25zZSwgYm9keSwgY2FsbGJhY2spO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgYm9keSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaWNvbnYoYm9keSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQgPSByZXNwb25zZS5oZWFkZXJzWydjb250ZW50LXR5cGUnXTtcbiAgICAgICAgaWYgKGNoYXJzZXQpIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSAvXFxiY2hhcnNldD0oLispKD86O3wkKS9pLmV4ZWMoY2hhcnNldCk7XG4gICAgICAgICAgICBpZiAoY2hhcnNldCkge1xuICAgICAgICAgICAgICAgIGNoYXJzZXQgPSBjaGFyc2V0WzFdLnRyaW0oKS50b1VwcGVyQ2FzZSgpO1xuICAgICAgICAgICAgICAgIGlmIChjaGFyc2V0ICE9ICdVVEYtOCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpY29udi5kZWNvZGUoYm9keSwgY2hhcnNldCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikge31cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGJvZHk7XG4gICAgfVxuICAgIGVuY29kZShib2R5LCByZXNwb25zZSwgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5kZWNvZGluZyA9PSAnYnVmZmVyJykge1xuICAgICAgICAgICAgY2FsbGJhY2sobnVsbCwgYm9keSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBib2R5ID0gYm9keS50b1N0cmluZyh0aGlzLm9wdGlvbnMuZGVjb2RpbmcpO1xuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wYXJzZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucGFyc2VyLmNhbGwocmVzcG9uc2UsIGJvZHksIGNhbGxiYWNrKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKG51bGwsIGJvZHkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnIsIHJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMuZmlyZUNhbmNlbFRpbWVvdXQoKTtcbiAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVyciwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXBsZXRlJywgZXJyLCByZXNwb25zZSk7XG4gICAgfVxuICAgIGZpcmVDYW5jZWxUaW1lb3V0KCkge1xuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRpbWVvdXQpIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLm9wdGlvbnMudGltZW91dEZuKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmaXJlVGltZW91dChlcnIpIHtcbiAgICAgICAgdGhpcy5lbWl0KCd0aW1lb3V0JywgZXJyKTtcbiAgICAgICAgdGhpcy5hYm9ydGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy50aW1lZG91dCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVxdWVzdC5hYm9ydCgpO1xuICAgIH1cbiAgICBmaXJlU3VjY2Vzcyhib2R5LCByZXNwb25zZSkge1xuICAgICAgICBpZiAocGFyc2VJbnQocmVzcG9uc2Uuc3RhdHVzQ29kZSwxMCkgPj0gNDAwKSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ2ZhaWwnLCBib2R5LCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3N1Y2Nlc3MnLCBib2R5LCByZXNwb25zZSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbWl0KHJlc3BvbnNlLnN0YXR1c0NvZGUudG9TdHJpbmcoKS5yZXBsYWNlKC9cXGR7Mn0kLywgJ1hYJyksIGJvZHksIHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5lbWl0KHJlc3BvbnNlLnN0YXR1c0NvZGUudG9TdHJpbmcoKSwgYm9keSwgcmVzcG9uc2UpO1xuICAgICAgICB0aGlzLmVtaXQoJ2NvbXBsZXRlJywgYm9keSwgcmVzcG9uc2UpO1xuICAgIH1cbiAgICBtYWtlUmVxdWVzdCgpIHtcbiAgICAgICAgY29uc3QgdGltZW91dE1zID0gdGhpcy5vcHRpb25zLnRpbWVvdXQ7XG4gICAgICAgIGlmICh0aW1lb3V0TXMpIHtcbiAgICAgICAgICAgIHRoaXMub3B0aW9ucy50aW1lb3V0Rm4gPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVUaW1lb3V0KHRpbWVvdXRNcyk7XG4gICAgICAgICAgICB9LCB0aW1lb3V0TXMpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucmVxdWVzdC5vbigncmVzcG9uc2UnLCByZXNwb25zZSA9PiB7XG4gICAgICAgICAgICB0aGlzLmZpcmVDYW5jZWxUaW1lb3V0KCk7XG4gICAgICAgICAgICB0aGlzLmVtaXQoJ3Jlc3BvbnNlJywgcmVzcG9uc2UpO1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zZUhhbmRsZXIocmVzcG9uc2UpO1xuICAgICAgICB9KS5vbignZXJyb3InLCBlcnIgPT4ge1xuICAgICAgICAgICAgdGhpcy5maXJlQ2FuY2VsVGltZW91dCgpO1xuICAgICAgICAgICAgaWYgKCF0aGlzLmFib3J0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnIsIG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmVSZXRyeSgpIHtcbiAgICAgICAgdGhpcy5yZXF1ZXN0LnJlbW92ZUFsbExpc3RlbmVycygpLm9uKCdlcnJvcicsICgpID0+IHt9KTtcbiAgICAgICAgaWYgKHRoaXMucmVxdWVzdC5maW5pc2hlZCkge1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wcmVwYXJlKHRoaXMudXJsLmhyZWYsIHRoaXMub3B0aW9ucyk7IC8vIHJldXNpbmcgcmVxdWVzdCBvYmplY3QgdG8gaGFuZGxlIHJlY3Vyc2l2ZSBjYWxscyBhbmQgcmVtZW1iZXIgbGlzdGVuZXJzXG4gICAgICAgIHRoaXMucnVuKCk7XG4gICAgfVxuICAgIGFzeW5jIHJ1bigpIHtcbiAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5tdWx0aXBhcnQpIHtcbiAgICAgICAgICAgIGF3YWl0IG11bHRpcGFydC53cml0ZSh0aGlzLnJlcXVlc3QsIHRoaXMub3B0aW9ucy5kYXRhLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmVuZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmRhdGEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3Qud3JpdGUodGhpcy5vcHRpb25zLmRhdGEsIHRoaXMub3B0aW9ucy5lbmNvZGluZyB8fCAndXRmOCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0LmVuZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIGFib3J0KGVycikge1xuICAgICAgICBpZiAoZXJyKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGVyciA9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIGVyciA9IG5ldyBFcnJvcihlcnIpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIShlcnIgaW5zdGFuY2VvZiBFcnJvcikpIHtcbiAgICAgICAgICAgICAgICBlcnIgPSBuZXcgRXJyb3IoJ0Fib3J0RXJyb3InKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVyci50eXBlID0gJ2Fib3J0JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGVyciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlcXVlc3Qub24oJ2Nsb3NlJywgKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGVycikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVyciwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2NvbXBsZXRlJywgbnVsbCwgbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuYWJvcnRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMucmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICB0aGlzLmVtaXQoJ2Fib3J0JywgZXJyKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuICAgIHJldHJ5KHRpbWVvdXQpIHtcbiAgICAgICAgdGltZW91dCA9IHBhcnNlSW50KHRpbWVvdXQsMTApO1xuICAgICAgICBjb25zdCBmbiA9IHRoaXMucmVSZXRyeS5iaW5kKHRoaXMpO1xuICAgICAgICBpZiAoIWlzRmluaXRlKHRpbWVvdXQpIHx8IHRpbWVvdXQgPD0gMCkge1xuICAgICAgICAgICAgcHJvY2Vzcy5uZXh0VGljayhmbiwgdGltZW91dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZuLCB0aW1lb3V0KTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG5cbmNvbnN0IGxvZ2dlcj1uZXcgTG9nZ2VyKCd4cmVzdCcpO1xuXG5leHBvcnQgZnVuY3Rpb24gZW1pdChldmVudFN0cmluZyxvcHRpb25zPXt9KSB7XG4gICAgbGV0IFtldmVudCxwYXRoLC4uLm1pZGRsZXdhcmVzXT1ldmVudFN0cmluZy5zcGxpdCgnICcpO1xuICAgIGxldCBtaWRkbGVGdW5jdGlvbnM9W107XG4gICAgZm9yKGxldCBtaWRkbGV3YXJlIG9mIG1pZGRsZXdhcmVzKXtcbiAgICAgICAgaWYobWlkZGxld2FyZS50b1VwcGVyQ2FzZSgpIT09bWlkZGxld2FyZSl7XG4gICAgICAgICAgICBsb2dnZXIud2FybignVXBwZXIgY2FzZSBpcyBwcmVmZmVyZWQgZm9yIG1pZGRsZXdhcmUgbmFtZXMhIChHb3Q6ICVzKScsZXZlbnQpO1xuICAgICAgICAgICAgbWlkZGxld2FyZT1taWRkbGV3YXJlLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYoIX5QT1NTSUJMRV9NSURETEVXQVJFUy5pbmRleE9mKG1pZGRsZXdhcmUpKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIG1pZGRsZXdhcmU6ICcrbWlkZGxld2FyZSk7XG4gICAgICAgIG1pZGRsZUZ1bmN0aW9ucy5wdXNoKG1pZGRsZXdhcmUpO1xuICAgIH1cbiAgICBpZihldmVudC50b1VwcGVyQ2FzZSgpIT09ZXZlbnQpe1xuICAgICAgICBsb2dnZXIud2FybignVXBwZXIgY2FzZSBpcyBwcmVmZmVyZWQgZm9yIGV2ZW50IG5hbWVzISAoR290OiAlcyknLGV2ZW50KTtcbiAgICAgICAgZXZlbnQ9ZXZlbnQudG9VcHBlckNhc2UoKTtcbiAgICB9XG4gICAgaWYoIX5QT1NTSUJMRV9FVkVOVFMuaW5kZXhPZihldmVudCkpe1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gZXZlbnQ6ICcrZXZlbnQrJywgcG9zc2libGUgZXZlbnRzIGFyZSAnK1BPU1NJQkxFX0VWRU5UUy5qb2luKCcsICcpKychJyk7XG4gICAgfVxuICAgIG9wdGlvbnMubWV0aG9kID0gZXZlbnQ7XG4gICAgY29uc3QgcmVxdWVzdD1uZXcgUmVxdWVzdChwYXRoLG9wdGlvbnMpO1xuICAgIGlmKH5taWRkbGVGdW5jdGlvbnMuaW5kZXhPZignU1RSRUFNJykpe1xuICAgICAgICBsb2dnZXIuZGVidWcoJ1N0cmVhbWluZycpO1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcyxyZWopPT57XG4gICAgICAgICAgICByZXF1ZXN0LnJ1bigpO1xuICAgICAgICAgICAgcmVxdWVzdC5vbigndGltZW91dCcsKG1zKT0+e1xuICAgICAgICAgICAgICAgIHJlaihuZXcgRXJyb3IoJ1RpbWVvdXQ6ICcrbXMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxdWVzdC5vbigncmVzcG9uc2UnLChyZXNwb25zZSk9PntcbiAgICAgICAgICAgICAgICByZXMocmVzcG9uc2UpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1lbHNle1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlcyxyZWopPT57XG4gICAgICAgICAgICByZXF1ZXN0LnJ1bigpO1xuICAgICAgICAgICAgcmVxdWVzdC5vbigndGltZW91dCcsKG1zKT0+e1xuICAgICAgICAgICAgICAgIHJlaihuZXcgRXJyb3IoJ1RpbWVvdXQ6ICcrbXMpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmVxdWVzdC5vbignY29tcGxldGUnLChyZXN1bHQscmVzcG9uc2UpPT57XG4gICAgICAgICAgICAgICAgaWYocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmVzcG9uc2UuYm9keT1yZXN1bHQ7XG4gICAgICAgICAgICAgICAgcmVzKHJlc3BvbnNlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBYUmVzdHtcbiAgICBiYXNlVXJsO1xuICAgIGRlZmF1bHRPcHRpb25zO1xuICAgIGNvbnN0cnVjdG9yKHVybCxkZWZhdWx0T3B0aW9ucyl7XG4gICAgICAgIGxvZ2dlci5kZWJ1ZygnbmV3IFhSZXN0KCVzKScsdXJsKTtcbiAgICAgICAgdGhpcy5iYXNlVXJsPXVybDtcbiAgICAgICAgdGhpcy5kZWZhdWx0T3B0aW9ucz1kZWZhdWx0T3B0aW9ucztcbiAgICB9XG4gICAgZW1pdChldmVudFN0cmluZyxvcHRpb25zKXtcbiAgICAgICAgbGV0IFtldmVudCxwYXRoLC4uLm1pZGRsZXdhcmVzXT1ldmVudFN0cmluZy5zcGxpdCgnICcpO1xuICAgICAgICBwYXRoPXJlc29sdmUodGhpcy5iYXNlVXJsLCBwYXRoKTtcbiAgICAgICAgcmV0dXJuIGVtaXQoW2V2ZW50LHBhdGgsLi4ubWlkZGxld2FyZXNdLmpvaW4oJyAnKSxvcHRpb25zKTtcbiAgICB9XG59Il0sInNvdXJjZVJvb3QiOiIvc291cmNlLyJ9

@@ -1,29 +0,28 @@

import {
basename
}
from 'path';
import {
open,
read,
close
}
from '@meteor-it/fs';
export const DEFAULT_BOUNDARY = '84921024METEORITXREST74819204';
export class Stream {
stream;
string;
"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
Object.defineProperty(exports, "__esModule", { value: true });
const path_1 = require("path");
const fs_1 = require("@meteor-it/fs");
exports.DEFAULT_BOUNDARY = '84921024METEORITXREST74819204';
class Stream {
constructor(stream) {
if (this._isString(stream)) {
this.string = '';
}
this.stream = stream;
if (this._isString(stream)) {
this.string = '';
}
this.stream = stream;
}
write(data) {
if (this.string != undefined) {
this.string += data;
} else {
this.stream.write(data, 'binary');
}
if (this.string != undefined) {
this.string += data;
}
else {
this.stream.write(data, 'binary');
}
}

@@ -34,12 +33,7 @@ _isString(obj) {

}
export class File {
path;
filename;
fileSize;
encoding;
contentType;
exports.Stream = Stream;
class File {
constructor(path, filename, fileSize, encoding, contentType) {
this.path = path;
this.filename = filename || basename(path);
this.filename = filename || path_1.basename(path);
this.fileSize = fileSize;

@@ -50,12 +44,8 @@ this.encoding = encoding || 'binary';

}
export class FileStream {
filename;
fileSize;
encoding;
contentType;
exports.File = File;
class FileStream {
constructor(stream, filename, dataLength, encoding, contentType) {
if(!dataLength || dataLength!==dataLength)
if (!dataLength || dataLength !== dataLength)
throw new Error('Building FileStream without dataLength!');
this.stream=stream;
this.stream = stream;
this.filename = filename;

@@ -67,8 +57,4 @@ this.fileSize = dataLength;

}
export class Data {
filename;
contentType;
data;
exports.FileStream = FileStream;
class Data {
constructor(filename, contentType, data) {

@@ -80,7 +66,4 @@ this.filename = filename;

}
export class Part {
name;
value;
boundary;
exports.Data = Data;
class Part {
constructor(name, value, boundary) {

@@ -91,7 +74,5 @@ this.name = name;

}
//returns the Content-Disposition header
header() {
let header;
if (this.value.data) {

@@ -103,3 +84,3 @@ header = `Content-Disposition: form-data; name='${this.name}'; filename='${this.value.filename}'\r\nContent-Length: ${this.value.data.length}\r\nContent-Type: ${this.value.contentType}`;

}
else if(this.value instanceof FileStream) {
else if (this.value instanceof FileStream) {
header = `Content-Disposition: form-data; name='${this.name}'; filename='${this.value.filename}'\r\nContent-Length: ${this.value.fileSize}\r\nContent-Type: ${this.value.contentType}`;

@@ -110,6 +91,4 @@ }

}
return `--${this.boundary}\r\n${header}\r\n\r\n`;
}
//calculates the size of the Part

@@ -135,19 +114,17 @@ sizeOf() {

}
// Writes the Part out to a writable stream that supports the write(data) method
write(stream) {
return new Promise(async (resolve,reject)=>{
if(!stream.on)
if(stream.stream)
stream=stream.stream;
return new Promise((resolve, reject) => __awaiter(this, void 0, void 0, function* () {
if (!stream.on)
if (stream.stream)
stream = stream.stream;
//first write the Content-Disposition
stream.write(this.header());
//Now write out the body of the Part
if (this.value instanceof File) {
let fd = await open(this.value.path, 'r', '0666');
let fd = yield fs_1.open(this.value.path, 'r', '0666');
let position = 0;
let moreData = true;
while (moreData) {
let chunk = await read(fd, 4096, position, 'binary');
let chunk = yield fs_1.read(fd, 4096, position, 'binary');
stream.write(chunk);

@@ -160,3 +137,3 @@ position += 4096;

stream.write('\r\n');
close(fd);
fs_1.close(fd);
moreData = false;

@@ -166,13 +143,13 @@ resolve();

}
} else if(this.value instanceof FileStream){
this.value.stream.on('end', () =>{
}
else if (this.value instanceof FileStream) {
this.value.stream.on('end', () => {
stream.write('\r\n');
resolve();
});
let s=this.value.stream.pipe(stream,{
end:false // Do not end writing streams, may be there is more data incoming
let s = this.value.stream.pipe(stream, {
end: false // Do not end writing streams, may be there is more data incoming
});
} else if (this.value instanceof Data) {
}
else if (this.value instanceof Data) {
stream.write(this.value.data);

@@ -185,19 +162,14 @@ stream.write('\r\n');

resolve();
}
})
}
}));
}
}
export class MultiPartRequest {
encoding;
boundary;
data;
partNames;
exports.Part = Part;
class MultiPartRequest {
constructor(data, boundary) {
this.encoding = 'binary';
this.boundary = boundary || DEFAULT_BOUNDARY;
this.boundary = boundary || exports.DEFAULT_BOUNDARY;
this.data = data;
this.partNames = this._partNames();
}
_partNames() {

@@ -210,34 +182,37 @@ const partNames = [];

}
async write(stream) {
let partCount = 0;
// wrap the stream in our own Stream object
// See the Stream function above for the benefits of this
stream = new Stream(stream);
while (true) {
const partName = this.partNames[partCount];
const part = new Part(partName, this.data[partName], this.boundary);
await part.write(stream);
partCount++;
if (partCount >= this.partNames.length) {
stream.write(`--${this.boundary}--\r\n`);
return stream.string || '';
write(stream) {
return __awaiter(this, void 0, void 0, function* () {
let partCount = 0;
// wrap the stream in our own Stream object
// See the Stream function above for the benefits of this
stream = new Stream(stream);
while (true) {
const partName = this.partNames[partCount];
const part = new Part(partName, this.data[partName], this.boundary);
yield part.write(stream);
partCount++;
if (partCount >= this.partNames.length) {
stream.write(`--${this.boundary}--\r\n`);
return stream.string || '';
}
}
}
});
}
}
export function sizeOf(parts, boundary=DEFAULT_BOUNDARY) {
exports.MultiPartRequest = MultiPartRequest;
function sizeOf(parts, boundary = exports.DEFAULT_BOUNDARY) {
let totalSize = 0;
for (let name in parts)
totalSize += new Part(name, parts[name], boundary).sizeOf();
return totalSize + boundary.length + 6;
for (let name in parts)
totalSize += new Part(name, parts[name], boundary).sizeOf();
return totalSize + boundary.length + 6;
}
export async function write(stream, data, callback, boundary) {
let r = new MultiPartRequest(data, boundary);
await r.write(stream);
return r;
}
exports.sizeOf = sizeOf;
function write(stream, data, callback, boundary) {
return __awaiter(this, void 0, void 0, function* () {
let r = new MultiPartRequest(data, boundary);
yield r.write(stream);
return r;
});
}
exports.write = write;
//# sourceMappingURL=data:application/json;base64,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QUxELHdCQUtDO0FBQ0QsZUFBNEIsTUFBTSxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsUUFBUTs7UUFDeEQsSUFBSSxDQUFDLEdBQUcsSUFBSSxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFDN0MsTUFBTSxDQUFDLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3RCLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDYixDQUFDO0NBQUE7QUFKRCxzQkFJQyIsImZpbGUiOiJ4cmVzdC9tdWx0aXBhcnQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIGJhc2VuYW1lXG59XG5mcm9tICdwYXRoJztcbmltcG9ydCB7XG4gICAgb3BlbixcbiAgICByZWFkLFxuICAgIGNsb3NlXG59XG5mcm9tICdAbWV0ZW9yLWl0L2ZzJztcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfQk9VTkRBUlkgPSAnODQ5MjEwMjRNRVRFT1JJVFhSRVNUNzQ4MTkyMDQnO1xuXG5leHBvcnQgY2xhc3MgU3RyZWFtIHtcbiAgICBzdHJlYW07XG4gICAgc3RyaW5nO1xuICAgIGNvbnN0cnVjdG9yKHN0cmVhbSkge1xuICAgIFx0aWYgKHRoaXMuX2lzU3RyaW5nKHN0cmVhbSkpIHtcbiAgICBcdFx0dGhpcy5zdHJpbmcgPSAnJztcbiAgICBcdH1cbiAgICBcdHRoaXMuc3RyZWFtID0gc3RyZWFtO1xuICAgIH1cbiAgICB3cml0ZShkYXRhKSB7XG4gICAgXHRpZiAodGhpcy5zdHJpbmcgIT0gdW5kZWZpbmVkKSB7XG4gICAgXHRcdHRoaXMuc3RyaW5nICs9IGRhdGE7XG4gICAgXHR9IGVsc2Uge1xuICAgIFx0XHR0aGlzLnN0cmVhbS53cml0ZShkYXRhLCAnYmluYXJ5Jyk7XG4gICAgXHR9XG4gICAgfVxuICAgIF9pc1N0cmluZyhvYmopIHtcbiAgICAgICAgcmV0dXJuICEhKG9iaiA9PT0gJycgfHwgKG9iaiAmJiBvYmouY2hhckNvZGVBdCAmJiBvYmouc3Vic3RyKSk7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmlsZSB7XG4gICAgcGF0aDtcbiAgICBmaWxlbmFtZTtcbiAgICBmaWxlU2l6ZTtcbiAgICBlbmNvZGluZztcbiAgICBjb250ZW50VHlwZTtcbiAgICBjb25zdHJ1Y3RvcihwYXRoLCBmaWxlbmFtZSwgZmlsZVNpemUsIGVuY29kaW5nLCBjb250ZW50VHlwZSkge1xuICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWUgfHwgYmFzZW5hbWUocGF0aCk7XG4gICAgICAgIHRoaXMuZmlsZVNpemUgPSBmaWxlU2l6ZTtcbiAgICAgICAgdGhpcy5lbmNvZGluZyA9IGVuY29kaW5nIHx8ICdiaW5hcnknO1xuICAgICAgICB0aGlzLmNvbnRlbnRUeXBlID0gY29udGVudFR5cGUgfHwgJ2FwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSc7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgRmlsZVN0cmVhbSB7XG4gICAgZmlsZW5hbWU7XG4gICAgZmlsZVNpemU7XG4gICAgZW5jb2Rpbmc7XG4gICAgY29udGVudFR5cGU7XG4gICAgY29uc3RydWN0b3Ioc3RyZWFtLCBmaWxlbmFtZSwgZGF0YUxlbmd0aCwgZW5jb2RpbmcsIGNvbnRlbnRUeXBlKSB7XG4gICAgICAgIGlmKCFkYXRhTGVuZ3RoIHx8IGRhdGFMZW5ndGghPT1kYXRhTGVuZ3RoKVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdCdWlsZGluZyBGaWxlU3RyZWFtIHdpdGhvdXQgZGF0YUxlbmd0aCEnKTtcbiAgICAgICAgdGhpcy5zdHJlYW09c3RyZWFtO1xuICAgICAgICB0aGlzLmZpbGVuYW1lID0gZmlsZW5hbWU7XG4gICAgICAgIHRoaXMuZmlsZVNpemUgPSBkYXRhTGVuZ3RoO1xuICAgICAgICB0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgfHwgJ2JpbmFyeSc7XG4gICAgICAgIHRoaXMuY29udGVudFR5cGUgPSBjb250ZW50VHlwZSB8fCAnYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtJztcbiAgICB9XG59XG5cbmV4cG9ydCBjbGFzcyBEYXRhIHtcbiAgICBmaWxlbmFtZTtcbiAgICBjb250ZW50VHlwZTtcbiAgICBkYXRhO1xuXG4gICAgY29uc3RydWN0b3IoZmlsZW5hbWUsIGNvbnRlbnRUeXBlLCBkYXRhKSB7XG4gICAgICAgIHRoaXMuZmlsZW5hbWUgPSBmaWxlbmFtZTtcbiAgICAgICAgdGhpcy5jb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICdhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0nO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhO1xuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIFBhcnQge1xuICAgIG5hbWU7XG4gICAgdmFsdWU7XG4gICAgYm91bmRhcnk7XG4gICAgY29uc3RydWN0b3IobmFtZSwgdmFsdWUsIGJvdW5kYXJ5KSB7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGJvdW5kYXJ5O1xuICAgIH1cblxuICAgIC8vcmV0dXJucyB0aGUgQ29udGVudC1EaXNwb3NpdGlvbiBoZWFkZXJcdFx0XG4gICAgaGVhZGVyKCkge1xuICAgICAgICBsZXQgaGVhZGVyO1xuXG4gICAgICAgIGlmICh0aGlzLnZhbHVlLmRhdGEpIHtcbiAgICAgICAgICAgIGhlYWRlciA9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9JyR7dGhpcy5uYW1lfSc7IGZpbGVuYW1lPScke3RoaXMudmFsdWUuZmlsZW5hbWV9J1xcclxcbkNvbnRlbnQtTGVuZ3RoOiAke3RoaXMudmFsdWUuZGF0YS5sZW5ndGh9XFxyXFxuQ29udGVudC1UeXBlOiAke3RoaXMudmFsdWUuY29udGVudFR5cGV9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnZhbHVlIGluc3RhbmNlb2YgRmlsZSkge1xuICAgICAgICAgICAgaGVhZGVyID0gYENvbnRlbnQtRGlzcG9zaXRpb246IGZvcm0tZGF0YTsgbmFtZT0nJHt0aGlzLm5hbWV9JzsgZmlsZW5hbWU9JyR7dGhpcy52YWx1ZS5maWxlbmFtZX0nXFxyXFxuQ29udGVudC1MZW5ndGg6ICR7dGhpcy52YWx1ZS5maWxlU2l6ZX1cXHJcXG5Db250ZW50LVR5cGU6ICR7dGhpcy52YWx1ZS5jb250ZW50VHlwZX1gO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZpbGVTdHJlYW0pIHtcbiAgICAgICAgICAgIGhlYWRlciA9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9JyR7dGhpcy5uYW1lfSc7IGZpbGVuYW1lPScke3RoaXMudmFsdWUuZmlsZW5hbWV9J1xcclxcbkNvbnRlbnQtTGVuZ3RoOiAke3RoaXMudmFsdWUuZmlsZVNpemV9XFxyXFxuQ29udGVudC1UeXBlOiAke3RoaXMudmFsdWUuY29udGVudFR5cGV9YDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGhlYWRlciA9IGBDb250ZW50LURpc3Bvc2l0aW9uOiBmb3JtLWRhdGE7IG5hbWU9JyR7dGhpcy5uYW1lfSdgO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGAtLSR7dGhpcy5ib3VuZGFyeX1cXHJcXG4ke2hlYWRlcn1cXHJcXG5cXHJcXG5gO1xuICAgIH1cblxuICAgIC8vY2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgUGFydFxuICAgIHNpemVPZigpIHtcbiAgICAgICAgbGV0IHZhbHVlU2l6ZTtcbiAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICB2YWx1ZVNpemUgPSB0aGlzLnZhbHVlLmZpbGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBGaWxlU3RyZWFtKSB7XG4gICAgICAgICAgICB2YWx1ZVNpemUgPSB0aGlzLnZhbHVlLmZpbGVTaXplO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMudmFsdWUuZGF0YSkge1xuICAgICAgICAgICAgdmFsdWVTaXplID0gdGhpcy52YWx1ZS5kYXRhLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdGhpcy52YWx1ZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHZhbHVlU2l6ZSA9IHRoaXMudmFsdWUudG9TdHJpbmcoKS5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB2YWx1ZVNpemUgPSB0aGlzLnZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdmFsdWVTaXplICsgdGhpcy5oZWFkZXIoKS5sZW5ndGggKyAyO1xuICAgIH1cblxuICAgIC8vIFdyaXRlcyB0aGUgUGFydCBvdXQgdG8gYSB3cml0YWJsZSBzdHJlYW0gdGhhdCBzdXBwb3J0cyB0aGUgd3JpdGUoZGF0YSkgbWV0aG9kXG4gICAgd3JpdGUoc3RyZWFtKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSxyZWplY3QpPT57XG4gICAgICAgICAgICBpZighc3RyZWFtLm9uKVxuICAgICAgICAgICAgaWYoc3RyZWFtLnN0cmVhbSlcbiAgICAgICAgICAgICAgICBzdHJlYW09c3RyZWFtLnN0cmVhbTtcbiAgICAgICAgICAgIC8vZmlyc3Qgd3JpdGUgdGhlIENvbnRlbnQtRGlzcG9zaXRpb25cbiAgICAgICAgICAgIHN0cmVhbS53cml0ZSh0aGlzLmhlYWRlcigpKTtcbiAgICBcbiAgICAgICAgICAgIC8vTm93IHdyaXRlIG91dCB0aGUgYm9keSBvZiB0aGUgUGFydFxuICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgaW5zdGFuY2VvZiBGaWxlKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZkID0gYXdhaXQgb3Blbih0aGlzLnZhbHVlLnBhdGgsICdyJywgJzA2NjYnKTtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSAwO1xuICAgICAgICAgICAgICAgIGxldCBtb3JlRGF0YSA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG1vcmVEYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjaHVuayA9IGF3YWl0IHJlYWQoZmQsIDQwOTYsIHBvc2l0aW9uLCAnYmluYXJ5Jyk7XG4gICAgICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShjaHVuayk7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uICs9IDQwOTY7XG4gICAgICAgICAgICAgICAgICAgIGlmIChjaHVuaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9yZURhdGEgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKCdcXHJcXG4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKGZkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVEYXRhID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYodGhpcy52YWx1ZSBpbnN0YW5jZW9mIEZpbGVTdHJlYW0pe1xuXG4gICAgICAgICAgICAgICAgdGhpcy52YWx1ZS5zdHJlYW0ub24oJ2VuZCcsICgpID0+e1xuICAgICAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoJ1xcclxcbicpO1xuICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgbGV0IHM9dGhpcy52YWx1ZS5zdHJlYW0ucGlwZShzdHJlYW0se1xuICAgICAgICAgICAgICAgICAgICBlbmQ6ZmFsc2UgLy8gRG8gbm90IGVuZCB3cml0aW5nIHN0cmVhbXMsIG1heSBiZSB0aGVyZSBpcyBtb3JlIGRhdGEgaW5jb21pbmdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSBpbnN0YW5jZW9mIERhdGEpIHtcbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUodGhpcy52YWx1ZS5kYXRhKTtcbiAgICAgICAgICAgICAgICBzdHJlYW0ud3JpdGUoJ1xcclxcbicpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0cmVhbS53cml0ZShgJHt0aGlzLnZhbHVlfVxcclxcbmApO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH0gIFxuICAgICAgICB9KVxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIE11bHRpUGFydFJlcXVlc3Qge1xuICAgIGVuY29kaW5nO1xuICAgIGJvdW5kYXJ5O1xuICAgIGRhdGE7XG4gICAgcGFydE5hbWVzO1xuICAgIGNvbnN0cnVjdG9yKGRhdGEsIGJvdW5kYXJ5KSB7XG4gICAgICAgIHRoaXMuZW5jb2RpbmcgPSAnYmluYXJ5JztcbiAgICAgICAgdGhpcy5ib3VuZGFyeSA9IGJvdW5kYXJ5IHx8IERFRkFVTFRfQk9VTkRBUlk7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIHRoaXMucGFydE5hbWVzID0gdGhpcy5fcGFydE5hbWVzKCk7XG4gICAgfVxuXG4gICAgX3BhcnROYW1lcygpIHtcbiAgICAgICAgY29uc3QgcGFydE5hbWVzID0gW107XG4gICAgICAgIGZvciAoY29uc3QgbmFtZSBpbiB0aGlzLmRhdGEpIHtcbiAgICAgICAgICAgIHBhcnROYW1lcy5wdXNoKG5hbWUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBwYXJ0TmFtZXM7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUoc3RyZWFtKSB7XG4gICAgICAgIGxldCBwYXJ0Q291bnQgPSAwO1xuXG4gICAgICAgIC8vIHdyYXAgdGhlIHN0cmVhbSBpbiBvdXIgb3duIFN0cmVhbSBvYmplY3RcbiAgICAgICAgLy8gU2VlIHRoZSBTdHJlYW0gZnVuY3Rpb24gYWJvdmUgZm9yIHRoZSBiZW5lZml0cyBvZiB0aGlzXG4gICAgICAgIHN0cmVhbSA9IG5ldyBTdHJlYW0oc3RyZWFtKTtcbiAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgIGNvbnN0IHBhcnROYW1lID0gdGhpcy5wYXJ0TmFtZXNbcGFydENvdW50XTtcbiAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBuZXcgUGFydChwYXJ0TmFtZSwgdGhpcy5kYXRhW3BhcnROYW1lXSwgdGhpcy5ib3VuZGFyeSk7XG4gICAgICAgICAgICBhd2FpdCBwYXJ0LndyaXRlKHN0cmVhbSk7XG4gICAgICAgICAgICBwYXJ0Q291bnQrKztcbiAgICAgICAgICAgIGlmIChwYXJ0Q291bnQgPj0gdGhpcy5wYXJ0TmFtZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlKGAtLSR7dGhpcy5ib3VuZGFyeX0tLVxcclxcbmApO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS5zdHJpbmcgfHwgJyc7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cblxuZXhwb3J0IGZ1bmN0aW9uIHNpemVPZihwYXJ0cywgYm91bmRhcnk9REVGQVVMVF9CT1VOREFSWSkge1xuICAgIGxldCB0b3RhbFNpemUgPSAwO1xuICBcdGZvciAobGV0IG5hbWUgaW4gcGFydHMpIFxuICBcdCAgICB0b3RhbFNpemUgKz0gbmV3IFBhcnQobmFtZSwgcGFydHNbbmFtZV0sIGJvdW5kYXJ5KS5zaXplT2YoKTtcbiAgXHRyZXR1cm4gdG90YWxTaXplICsgYm91bmRhcnkubGVuZ3RoICsgNjtcbn1cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB3cml0ZShzdHJlYW0sIGRhdGEsIGNhbGxiYWNrLCBib3VuZGFyeSkge1xuICAgIGxldCByID0gbmV3IE11bHRpUGFydFJlcXVlc3QoZGF0YSwgYm91bmRhcnkpO1xuICAgIGF3YWl0IHIud3JpdGUoc3RyZWFtKTtcbiAgICByZXR1cm4gcjtcbn0iXSwic291cmNlUm9vdCI6Ii9zb3VyY2UvIn0=
{
"name": "@meteor-it/xrest",
"version": "0.2.1",
"version": "0.3.1",
"description": "I",

@@ -5,0 +5,0 @@ "main": "index.js",

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc