aquameta-datum
Version:
Service layer for the Aquameta database API
187 lines (158 loc) • 18 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = executeConnection;
exports.parseSourceUrl = parseSourceUrl;
var _pg = _interopRequireDefault(require("@micburks/pg"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
const anonConfig = {
user: 'anonymous',
database: 'aquameta',
host: 'localhost',
port: 5432,
max: 4,
idleTimeoutMilliseconds: 30000
};
async function getConnection(config) {
const mergedConfig = { ...anonConfig,
...(config && config.connection || {})
}; // Don't allow user to be overridden
mergedConfig.user = anonConfig.user;
const anonClient = new _pg.default.Client(mergedConfig);
await anonClient.connect();
if (!mergedConfig.sessionId) {
return anonClient;
}
let result;
try {
result = await anonClient.query('select (role_id).name as role_name from endpoint.session where id = $1::uuid', [mergedConfig.sessionId]);
} catch (e) {
await anonClient.end();
throw e;
} // If login fails - continue request as anonymous
if (!result || !result.rows || result.rows.length === 0) {
return anonClient;
} // Release Client - TODO: release back to pool
await anonClient.end(); // Logged in
const userResult = new Result(result.rows[0]);
const user = await userResult.json();
console.log(`connection: logged in as ${user.role_name}`);
const userClient = new _pg.default.Client({ ...mergedConfig,
user: user.role_name
});
await userClient.connect();
return userClient;
}
/**
* Execute query server-side
* @returns {Promise}
*/
async function executeConnection(client, query) {
let connection;
try {
connection = await getConnection(client); // let result;
/*
if (query.args && query.args.source) {
const {schemaName, relationName, column, name} = parseSourceUrl(
query.url,
);
const queryResult = await connection.query(
`
select content, mimetype
from (select $1 as content, '$1' as extension from $3.$4 where name='$2') as c
join endpoint.mimetype_extension me on c.extension=me.extension
join endpoint.mimetype m on me.mimetype_id=m.id;
`,
[column, name, schemaName, relationName],
);
result = {...queryResult};
if (result && result.rows && result.rows.length !== 0) {
result.status = 200;
result.message = 'OK';
} else {
result.status = 404;
result.status = 'NOT FOUND';
}
} else {
*/
console.log('trying connection', query.version || client.version, query.method, query.url, JSON.stringify(query.args), JSON.stringify(query.data));
const result = await connection.query('select status, message, response, mimetype ' + 'from endpoint.request($1, $2, $3, $4::json, $5::json)', [query.version || client.version, query.method, query.url, JSON.stringify(query.args), JSON.stringify(query.data)]); //}
// TODO: end connection if userClient, but release if anonClient?
await connection.end();
const res = new Result(result.rows[0]);
if (client.rawResponse) {
return res;
} else {
return res.json().then(r => {
if (r.result) {
return r.result.map(({
row
}) => row);
} else {
return [];
}
});
}
} catch (e) {
// Problem with connecting to database
console.error(`connection: error trying to connect to database`);
console.error(e);
if (connection) {
await connection.end();
}
return null;
}
}
// Mimic response from fetch
class Result {
constructor({
status,
message,
response,
mimetype
}) {
this.status = status;
this.statusText = message;
this.response = response;
this.mimetype = mimetype;
}
async json() {
return JSON.parse(this.response);
}
}
/**
* TODO I want to keep track of how many pools are open and when they connect
* pg-pool has some great events
* pool.on('connect', client => {
* client.count = count++
* })
*/
/**
* TODO in order to do this, I would have to keep track of the open pools,
* instead of doing it with pg.connect()
*
* var pool = new pg.Pool(config)
* pool.connect(callback)
*
* is the same as
*
* pg.connect(config, callback)
*
* and this way, pg will keep track of the pools and not create a new one when
* the same config has been passed in twice
*/
function parseSourceUrl(pathname) {
const [,, schemaName, relationName, ...rest] = pathname.split('/');
const fileName = rest.join('/');
const lastPeriod = fileName.lastIndexOf('.');
const name = fileName.slice(0, lastPeriod);
const column = fileName.slice(lastPeriod + 1);
return {
schemaName,
relationName,
column,
name
};
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24uanMiXSwibmFtZXMiOlsiYW5vbkNvbmZpZyIsInVzZXIiLCJkYXRhYmFzZSIsImhvc3QiLCJwb3J0IiwibWF4IiwiaWRsZVRpbWVvdXRNaWxsaXNlY29uZHMiLCJnZXRDb25uZWN0aW9uIiwiY29uZmlnIiwibWVyZ2VkQ29uZmlnIiwiY29ubmVjdGlvbiIsImFub25DbGllbnQiLCJwZyIsIkNsaWVudCIsImNvbm5lY3QiLCJzZXNzaW9uSWQiLCJyZXN1bHQiLCJxdWVyeSIsImUiLCJlbmQiLCJyb3dzIiwibGVuZ3RoIiwidXNlclJlc3VsdCIsIlJlc3VsdCIsImpzb24iLCJjb25zb2xlIiwibG9nIiwicm9sZV9uYW1lIiwidXNlckNsaWVudCIsImV4ZWN1dGVDb25uZWN0aW9uIiwiY2xpZW50IiwidmVyc2lvbiIsIm1ldGhvZCIsInVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcmdzIiwiZGF0YSIsInJlcyIsInJhd1Jlc3BvbnNlIiwidGhlbiIsInIiLCJtYXAiLCJyb3ciLCJlcnJvciIsImNvbnN0cnVjdG9yIiwic3RhdHVzIiwibWVzc2FnZSIsInJlc3BvbnNlIiwibWltZXR5cGUiLCJzdGF0dXNUZXh0IiwicGFyc2UiLCJwYXJzZVNvdXJjZVVybCIsInBhdGhuYW1lIiwic2NoZW1hTmFtZSIsInJlbGF0aW9uTmFtZSIsInJlc3QiLCJzcGxpdCIsImZpbGVOYW1lIiwiam9pbiIsImxhc3RQZXJpb2QiLCJsYXN0SW5kZXhPZiIsIm5hbWUiLCJzbGljZSIsImNvbHVtbiJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7QUFFQTs7OztBQVFBLE1BQU1BLFVBQTZCLEdBQUc7QUFDcENDLEVBQUFBLElBQUksRUFBRSxXQUQ4QjtBQUVwQ0MsRUFBQUEsUUFBUSxFQUFFLFVBRjBCO0FBR3BDQyxFQUFBQSxJQUFJLEVBQUUsV0FIOEI7QUFJcENDLEVBQUFBLElBQUksRUFBRSxJQUo4QjtBQUtwQ0MsRUFBQUEsR0FBRyxFQUFFLENBTCtCO0FBTXBDQyxF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QUwsR0FBZ0JBLFFBQWhCO0FBQ0Q7O0FBQ0QsUUFBTXpCLElBQU4sR0FBdUM7QUFDckMsV0FBT1UsSUFBSSxDQUFDaUIsS0FBTCxDQUFXLEtBQUtILFFBQWhCLENBQVA7QUFDRDs7QUFiVTtBQWdCYjs7Ozs7Ozs7QUFRQTs7Ozs7Ozs7Ozs7Ozs7OztBQXNCTyxTQUFTSSxjQUFULENBQXdCQyxRQUF4QixFQUEyRDtBQUNoRSxRQUFNLElBQUtDLFVBQUwsRUFBaUJDLFlBQWpCLEVBQStCLEdBQUdDLElBQWxDLElBQTBDSCxRQUFRLENBQUNJLEtBQVQsQ0FBZSxHQUFmLENBQWhEO0FBQ0EsUUFBTUMsUUFBUSxHQUFHRixJQUFJLENBQUNHLElBQUwsQ0FBVSxHQUFWLENBQWpCO0FBQ0EsUUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNHLFdBQVQsQ0FBcUIsR0FBckIsQ0FBbkI7QUFDQSxRQUFNQyxJQUFJLEdBQUdKLFFBQVEsQ0FBQ0ssS0FBVCxDQUFlLENBQWYsRUFBa0JILFVBQWxCLENBQWI7QUFDQSxRQUFNSSxNQUFNLEdBQUdOLFFBQVEsQ0FBQ0ssS0FBVCxDQUFlSCxVQUFVLEdBQUcsQ0FBNUIsQ0FBZjtBQUVBLFNBQU87QUFBQ04sSUFBQUEsVUFBRDtBQUFhQyxJQUFBQSxZQUFiO0FBQTJCUyxJQUFBQSxNQUEzQjtBQUFtQ0YsSUFBQUE7QUFBbkMsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IHBnIGZyb20gJ0BtaWNidXJrcy9wZyc7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudCxcbiAgQ29ubmVjdGlvbk9wdGlvbnMsXG4gIEV4ZWN1dGFibGUsXG4gIFF1ZXJ5UmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNvbnN0IGFub25Db25maWc6IENvbm5lY3Rpb25PcHRpb25zID0ge1xuICB1c2VyOiAnYW5vbnltb3VzJyxcbiAgZGF0YWJhc2U6ICdhcXVhbWV0YScsXG4gIGhvc3Q6ICdsb2NhbGhvc3QnLFxuICBwb3J0OiA1NDMyLFxuICBtYXg6IDQsXG4gIGlkbGVUaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMCxcbn07XG5cbnR5cGUgUGdDb25uZWN0aW9uID0ge1xuICBjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBxdWVyeTogKHN0cmluZywgQXJyYXk8YW55PikgPT4gUHJvbWlzZTxRdWVyeVJlc3VsdD4sXG4gIGVuZDogKCkgPT4gUHJvbWlzZTx2b2lkPixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oY29uZmlnPzoge1xuICBbc3RyaW5nXTogYW55LFxuICBjb25uZWN0aW9uPzoge1tzdHJpbmddOiBhbnl9LFxufSk6IFByb21pc2U8UGdDb25uZWN0aW9uPiB7XG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IHtcbiAgICAuLi5hbm9uQ29uZmlnLFxuICAgIC4uLigoY29uZmlnICYmIGNvbmZpZy5jb25uZWN0aW9uKSB8fCB7fSksXG4gIH07XG4gIC8vIERvbid0IGFsbG93IHVzZXIgdG8gYmUgb3ZlcnJpZGRlblxuICBtZXJnZWRDb25maWcudXNlciA9IGFub25Db25maWcudXNlcjtcbiAgY29uc3QgYW5vbkNsaWVudDogUGdDb25uZWN0aW9uID0gbmV3IHBnLkNsaWVudChtZXJnZWRDb25maWcpO1xuXG4gIGF3YWl0IGFub25DbGllbnQuY29ubmVjdCgpO1xuXG4gIGlmICghbWVyZ2VkQ29uZmlnLnNlc3Npb25JZCkge1xuICAgIHJldHVybiBhbm9uQ2xpZW50O1xuICB9XG5cbiAgbGV0IHJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCBhbm9uQ2xpZW50LnF1ZXJ5KFxuICAgICAgJ3NlbGVjdCAocm9sZV9pZCkubmFtZSBhcyByb2xlX25hbWUgZnJvbSBlbmRwb2ludC5zZXNzaW9uIHdoZXJlIGlkID0gJDE6OnV1aWQnLFxuICAgICAgW21lcmdlZENvbmZpZy5zZXNzaW9uSWRdLFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhd2FpdCBhbm9uQ2xpZW50LmVuZCgpO1xuICAgIHRocm93IGU7XG4gIH1cblxuICAvLyBJZiBsb2dpbiBmYWlscyAtIGNvbnRpbnVlIHJlcXVlc3QgYXMgYW5vbnltb3VzXG4gIGlmICghcmVzdWx0IHx8ICFyZXN1bHQucm93cyB8fCByZXN1bHQucm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYW5vbkNsaWVudDtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgQ2xpZW50IC0gVE9ETzogcmVsZWFzZSBiYWNrIHRvIHBvb2xcbiAgYXdhaXQgYW5vbkNsaWVudC5lbmQoKTtcblxuICAvLyBMb2dnZWQgaW5cbiAgY29uc3QgdXNlclJlc3VsdCA9IG5ldyBSZXN1bHQocmVzdWx0LnJvd3NbMF0pO1xuICBjb25zdCB1c2VyID0gYXdhaXQgdXNlclJlc3VsdC5qc29uKCk7XG4gIGNvbnNvbGUubG9nKGBjb25uZWN0aW9uOiBsb2dnZWQgaW4gYXMgJHt1c2VyLnJvbGVfbmFtZX1gKTtcbiAgY29uc3QgdXNlckNsaWVudCA9IG5ldyBwZy5DbGllbnQoe1xuICAgIC4uLm1lcmdlZENvbmZpZyxcbiAgICB1c2VyOiB1c2VyLnJvbGVfbmFtZSxcbiAgfSk7XG4gIGF3YWl0IHVzZXJDbGllbnQuY29ubmVjdCgpO1xuICByZXR1cm4gdXNlckNsaWVudDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIHF1ZXJ5IHNlcnZlci1zaWRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNvbm5lY3Rpb24oXG4gIGNsaWVudDogQ2xpZW50LFxuICBxdWVyeTogRXhlY3V0YWJsZSxcbik6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcbiAgbGV0IGNvbm5lY3Rpb247XG5cbiAgdHJ5IHtcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbihjbGllbnQpO1xuICAgIC8vIGxldCByZXN1bHQ7XG4gICAgLypcbiAgICBpZiAocXVlcnkuYXJncyAmJiBxdWVyeS5hcmdzLnNvdXJjZSkge1xuICAgICAgY29uc3Qge3NjaGVtYU5hbWUsIHJlbGF0aW9uTmFtZSwgY29sdW1uLCBuYW1lfSA9IHBhcnNlU291cmNlVXJsKFxuICAgICAgICBxdWVyeS51cmwsXG4gICAgICApO1xuICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KFxuICAgICAgICBgXG4gICAgICAgIHNlbGVjdCBjb250ZW50LCBtaW1ldHlwZVxuICAgICAgICBmcm9tIChzZWxlY3QgJDEgYXMgY29udGVudCwgJyQxJyBhcyBleHRlbnNpb24gZnJvbSAkMy4kNCB3aGVyZSBuYW1lPSckMicpIGFzIGNcbiAgICAgICAgam9pbiBlbmRwb2ludC5taW1ldHlwZV9leHRlbnNpb24gbWUgb24gYy5leHRlbnNpb249bWUuZXh0ZW5zaW9uXG4gICAgICAgIGpvaW4gZW5kcG9pbnQubWltZXR5cGUgbSBvbiBtZS5taW1ldHlwZV9pZD1tLmlkO1xuICAgICAgYCxcbiAgICAgICAgW2NvbHVtbiwgbmFtZSwgc2NoZW1hTmFtZSwgcmVsYXRpb25OYW1lXSxcbiAgICAgICk7XG4gICAgICByZXN1bHQgPSB7Li4ucXVlcnlSZXN1bHR9O1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucm93cyAmJiByZXN1bHQucm93cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IDIwMDtcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAnT0snO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IDQwNDtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9ICdOT1QgRk9VTkQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAqL1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ3RyeWluZyBjb25uZWN0aW9uJyxcbiAgICAgIHF1ZXJ5LnZlcnNpb24gfHwgY2xpZW50LnZlcnNpb24sXG4gICAgICBxdWVyeS5tZXRob2QsXG4gICAgICBxdWVyeS51cmwsXG4gICAgICBKU09OLnN0cmluZ2lmeShxdWVyeS5hcmdzKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHF1ZXJ5LmRhdGEpLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbi5xdWVyeShcbiAgICAgICdzZWxlY3Qgc3RhdHVzLCBtZXNzYWdlLCByZXNwb25zZSwgbWltZXR5cGUgJyArXG4gICAgICAgICdmcm9tIGVuZHBvaW50LnJlcXVlc3QoJDEsICQyLCAkMywgJDQ6Ompzb24sICQ1Ojpqc29uKScsXG4gICAgICBbXG4gICAgICAgIHF1ZXJ5LnZlcnNpb24gfHwgY2xpZW50LnZlcnNpb24sXG4gICAgICAgIHF1ZXJ5Lm1ldGhvZCxcbiAgICAgICAgcXVlcnkudXJsLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShxdWVyeS5hcmdzKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocXVlcnkuZGF0YSksXG4gICAgICBdLFxuICAgICk7XG4gICAgLy99XG5cbiAgICAvLyBUT0RPOiBlbmQgY29ubmVjdGlvbiBpZiB1c2VyQ2xpZW50LCBidXQgcmVsZWFzZSBpZiBhbm9uQ2xpZW50P1xuICAgIGF3YWl0IGNvbm5lY3Rpb24uZW5kKCk7XG5cbiAgICBjb25zdCByZXMgPSBuZXcgUmVzdWx0KHJlc3VsdC5yb3dzWzBdKTtcbiAgICBpZiAoY2xpZW50LnJhd1Jlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKHIgPT4ge1xuICAgICAgICBpZiAoci5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gci5yZXN1bHQubWFwKCh7cm93fSkgPT4gcm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFByb2JsZW0gd2l0aCBjb25uZWN0aW5nIHRvIGRhdGFiYXNlXG4gICAgY29uc29sZS5lcnJvcihgY29ubmVjdGlvbjogZXJyb3IgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VgKTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmVuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG50eXBlIFJlc3VsdEFyZ3MgPSB7XG4gIHN0YXR1czogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIHJlc3BvbnNlOiBzdHJpbmcsXG4gIG1pbWV0eXBlOiBzdHJpbmcsXG59O1xuLy8gTWltaWMgcmVzcG9uc2UgZnJvbSBmZXRjaFxuY2xhc3MgUmVzdWx0IHtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgbWltZXR5cGU6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe3N0YXR1cywgbWVzc2FnZSwgcmVzcG9uc2UsIG1pbWV0eXBlfTogUmVzdWx0QXJncykge1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IG1lc3NhZ2U7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMubWltZXR5cGUgPSBtaW1ldHlwZTtcbiAgfVxuICBhc3luYyBqc29uKCk6IFByb21pc2U8e1tzdHJpbmddOiBhbnl9PiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZXNwb25zZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUT0RPIEkgd2FudCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHBvb2xzIGFyZSBvcGVuIGFuZCB3aGVuIHRoZXkgY29ubmVjdFxuICogcGctcG9vbCBoYXMgc29tZSBncmVhdCBldmVudHNcbiAqIHBvb2wub24oJ2Nvbm5lY3QnLCBjbGllbnQgPT4ge1xuICogICBjbGllbnQuY291bnQgPSBjb3VudCsrXG4gKiB9KVxuICovXG5cbi8qKlxuICogVE9ETyBpbiBvcmRlciB0byBkbyB0aGlzLCBJIHdvdWxkIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgb3BlbiBwb29scyxcbiAqIGluc3RlYWQgb2YgZG9pbmcgaXQgd2l0aCBwZy5jb25uZWN0KClcbiAqXG4gKiB2YXIgcG9vbCA9IG5ldyBwZy5Qb29sKGNvbmZpZylcbiAqIHBvb2wuY29ubmVjdChjYWxsYmFjaylcbiAqXG4gKiBpcyB0aGUgc2FtZSBhc1xuICpcbiAqIHBnLmNvbm5lY3QoY29uZmlnLCBjYWxsYmFjaylcbiAqXG4gKiBhbmQgdGhpcyB3YXksIHBnIHdpbGwga2VlcCB0cmFjayBvZiB0aGUgcG9vbHMgYW5kIG5vdCBjcmVhdGUgYSBuZXcgb25lIHdoZW5cbiAqIHRoZSBzYW1lIGNvbmZpZyBoYXMgYmVlbiBwYXNzZWQgaW4gdHdpY2VcbiAqL1xuXG50eXBlIFBhcnNlZFNvdXJjZVVybCA9IHtcbiAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNvdXJjZVVybChwYXRobmFtZTogc3RyaW5nKTogUGFyc2VkU291cmNlVXJsIHtcbiAgY29uc3QgWywgLCBzY2hlbWFOYW1lLCByZWxhdGlvbk5hbWUsIC4uLnJlc3RdID0gcGF0aG5hbWUuc3BsaXQoJy8nKTtcbiAgY29uc3QgZmlsZU5hbWUgPSByZXN0LmpvaW4oJy8nKTtcbiAgY29uc3QgbGFzdFBlcmlvZCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7XG4gIGNvbnN0IG5hbWUgPSBmaWxlTmFtZS5zbGljZSgwLCBsYXN0UGVyaW9kKTtcbiAgY29uc3QgY29sdW1uID0gZmlsZU5hbWUuc2xpY2UobGFzdFBlcmlvZCArIDEpO1xuXG4gIHJldHVybiB7c2NoZW1hTmFtZSwgcmVsYXRpb25OYW1lLCBjb2x1bW4sIG5hbWV9O1xufVxuIl19