UNPKG

aquameta-datum

Version:

Service layer for the Aquameta database API

176 lines (151 loc) 17.8 kB
import pg from '@micburks/pg'; 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.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.Client({ ...mergedConfig, user: user.role_name }); await userClient.connect(); return userClient; } /** * Execute query server-side * @returns {Promise} */ export default 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 */ export 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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImNvbm5lY3Rpb24uanMiXSwibmFtZXMiOlsicGciLCJhbm9uQ29uZmlnIiwidXNlciIsImRhdGFiYXNlIiwiaG9zdCIsInBvcnQiLCJtYXgiLCJpZGxlVGltZW91dE1pbGxpc2Vjb25kcyIsImdldENvbm5lY3Rpb24iLCJjb25maWciLCJtZXJnZWRDb25maWciLCJjb25uZWN0aW9uIiwiYW5vbkNsaWVudCIsIkNsaWVudCIsImNvbm5lY3QiLCJzZXNzaW9uSWQiLCJyZXN1bHQiLCJxdWVyeSIsImUiLCJlbmQiLCJyb3dzIiwibGVuZ3RoIiwidXNlclJlc3VsdCIsIlJlc3VsdCIsImpzb24iLCJjb25zb2xlIiwibG9nIiwicm9sZV9uYW1lIiwidXNlckNsaWVudCIsImV4ZWN1dGVDb25uZWN0aW9uIiwiY2xpZW50IiwidmVyc2lvbiIsIm1ldGhvZCIsInVybCIsIkpTT04iLCJzdHJpbmdpZnkiLCJhcmdzIiwiZGF0YSIsInJlcyIsInJhd1Jlc3BvbnNlIiwidGhlbiIsInIiLCJtYXAiLCJyb3ciLCJlcnJvciIsImNvbnN0cnVjdG9yIiwic3RhdHVzIiwibWVzc2FnZSIsInJlc3BvbnNlIiwibWltZXR5cGUiLCJzdGF0dXNUZXh0IiwicGFyc2UiLCJwYXJzZVNvdXJjZVVybCIsInBhdGhuYW1lIiwic2NoZW1hTmFtZSIsInJlbGF0aW9uTmFtZSIsInJlc3QiLCJzcGxpdCIsImZpbGVOYW1lIiwiam9pbiIsImxhc3RQZXJpb2QiLCJsYXN0SW5kZXhPZiIsIm5hbWUiLCJzbGljZSIsImNvbHVtbiJdLCJtYXBwaW5ncyI6IkFBRUEsT0FBT0EsRUFBUCxNQUFlLGNBQWY7QUFRQSxNQUFNQyxVQUE2QixHQUFHO0FBQ3BDQyxFQUFBQSxJQUFJLEVBQUUsV0FEOEI7QUFFcENDLEVBQUFBLFFBQVEsRUFBRSxVQUYwQjtBQUdwQ0MsRUFBQUEsSUFBSSxFQUFFLFdBSDhCO0FBSXBDQyxFQUFBQSxJQUFJLEVBQUUsSUFKOEI7QUFLcENDLEVBQUFBLEdBQUcsRUFBRSxDQUwr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QUFnQkEsUUFBaEI7QUFDQSxTQUFLQyxRQUFMLEdBQWdCQSxRQUFoQjtBQUNEOztBQUNELFFBQU16QixJQUFOLEdBQXVDO0FBQ3JDLFdBQU9VLElBQUksQ0FBQ2lCLEtBQUwsQ0FBVyxLQUFLSCxRQUFoQixDQUFQO0FBQ0Q7O0FBYlU7QUFnQmI7Ozs7Ozs7O0FBUUE7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQkEsT0FBTyxTQUFTSSxjQUFULENBQXdCQyxRQUF4QixFQUEyRDtBQUNoRSxRQUFNLElBQUtDLFVBQUwsRUFBaUJDLFlBQWpCLEVBQStCLEdBQUdDLElBQWxDLElBQTBDSCxRQUFRLENBQUNJLEtBQVQsQ0FBZSxHQUFmLENBQWhEO0FBQ0EsUUFBTUMsUUFBUSxHQUFHRixJQUFJLENBQUNHLElBQUwsQ0FBVSxHQUFWLENBQWpCO0FBQ0EsUUFBTUMsVUFBVSxHQUFHRixRQUFRLENBQUNHLFdBQVQsQ0FBcUIsR0FBckIsQ0FBbkI7QUFDQSxRQUFNQyxJQUFJLEdBQUdKLFFBQVEsQ0FBQ0ssS0FBVCxDQUFlLENBQWYsRUFBa0JILFVBQWxCLENBQWI7QUFDQSxRQUFNSSxNQUFNLEdBQUdOLFFBQVEsQ0FBQ0ssS0FBVCxDQUFlSCxVQUFVLEdBQUcsQ0FBNUIsQ0FBZjtBQUVBLFNBQU87QUFBQ04sSUFBQUEsVUFBRDtBQUFhQyxJQUFBQSxZQUFiO0FBQTJCUyxJQUFBQSxNQUEzQjtBQUFtQ0YsSUFBQUE7QUFBbkMsR0FBUDtBQUNEIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQGZsb3dcblxuaW1wb3J0IHBnIGZyb20gJ0BtaWNidXJrcy9wZyc7XG5pbXBvcnQgdHlwZSB7XG4gIENsaWVudCxcbiAgQ29ubmVjdGlvbk9wdGlvbnMsXG4gIEV4ZWN1dGFibGUsXG4gIFF1ZXJ5UmVzdWx0LFxufSBmcm9tICcuLi90eXBlcy5qcyc7XG5cbmNvbnN0IGFub25Db25maWc6IENvbm5lY3Rpb25PcHRpb25zID0ge1xuICB1c2VyOiAnYW5vbnltb3VzJyxcbiAgZGF0YWJhc2U6ICdhcXVhbWV0YScsXG4gIGhvc3Q6ICdsb2NhbGhvc3QnLFxuICBwb3J0OiA1NDMyLFxuICBtYXg6IDQsXG4gIGlkbGVUaW1lb3V0TWlsbGlzZWNvbmRzOiAzMDAwMCxcbn07XG5cbnR5cGUgUGdDb25uZWN0aW9uID0ge1xuICBjb25uZWN0OiAoKSA9PiBQcm9taXNlPHZvaWQ+LFxuICBxdWVyeTogKHN0cmluZywgQXJyYXk8YW55PikgPT4gUHJvbWlzZTxRdWVyeVJlc3VsdD4sXG4gIGVuZDogKCkgPT4gUHJvbWlzZTx2b2lkPixcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIGdldENvbm5lY3Rpb24oY29uZmlnPzoge1xuICBbc3RyaW5nXTogYW55LFxuICBjb25uZWN0aW9uPzoge1tzdHJpbmddOiBhbnl9LFxufSk6IFByb21pc2U8UGdDb25uZWN0aW9uPiB7XG4gIGNvbnN0IG1lcmdlZENvbmZpZyA9IHtcbiAgICAuLi5hbm9uQ29uZmlnLFxuICAgIC4uLigoY29uZmlnICYmIGNvbmZpZy5jb25uZWN0aW9uKSB8fCB7fSksXG4gIH07XG4gIC8vIERvbid0IGFsbG93IHVzZXIgdG8gYmUgb3ZlcnJpZGRlblxuICBtZXJnZWRDb25maWcudXNlciA9IGFub25Db25maWcudXNlcjtcbiAgY29uc3QgYW5vbkNsaWVudDogUGdDb25uZWN0aW9uID0gbmV3IHBnLkNsaWVudChtZXJnZWRDb25maWcpO1xuXG4gIGF3YWl0IGFub25DbGllbnQuY29ubmVjdCgpO1xuXG4gIGlmICghbWVyZ2VkQ29uZmlnLnNlc3Npb25JZCkge1xuICAgIHJldHVybiBhbm9uQ2xpZW50O1xuICB9XG5cbiAgbGV0IHJlc3VsdDtcbiAgdHJ5IHtcbiAgICByZXN1bHQgPSBhd2FpdCBhbm9uQ2xpZW50LnF1ZXJ5KFxuICAgICAgJ3NlbGVjdCAocm9sZV9pZCkubmFtZSBhcyByb2xlX25hbWUgZnJvbSBlbmRwb2ludC5zZXNzaW9uIHdoZXJlIGlkID0gJDE6OnV1aWQnLFxuICAgICAgW21lcmdlZENvbmZpZy5zZXNzaW9uSWRdLFxuICAgICk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBhd2FpdCBhbm9uQ2xpZW50LmVuZCgpO1xuICAgIHRocm93IGU7XG4gIH1cblxuICAvLyBJZiBsb2dpbiBmYWlscyAtIGNvbnRpbnVlIHJlcXVlc3QgYXMgYW5vbnltb3VzXG4gIGlmICghcmVzdWx0IHx8ICFyZXN1bHQucm93cyB8fCByZXN1bHQucm93cy5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gYW5vbkNsaWVudDtcbiAgfVxuXG4gIC8vIFJlbGVhc2UgQ2xpZW50IC0gVE9ETzogcmVsZWFzZSBiYWNrIHRvIHBvb2xcbiAgYXdhaXQgYW5vbkNsaWVudC5lbmQoKTtcblxuICAvLyBMb2dnZWQgaW5cbiAgY29uc3QgdXNlclJlc3VsdCA9IG5ldyBSZXN1bHQocmVzdWx0LnJvd3NbMF0pO1xuICBjb25zdCB1c2VyID0gYXdhaXQgdXNlclJlc3VsdC5qc29uKCk7XG4gIGNvbnNvbGUubG9nKGBjb25uZWN0aW9uOiBsb2dnZWQgaW4gYXMgJHt1c2VyLnJvbGVfbmFtZX1gKTtcbiAgY29uc3QgdXNlckNsaWVudCA9IG5ldyBwZy5DbGllbnQoe1xuICAgIC4uLm1lcmdlZENvbmZpZyxcbiAgICB1c2VyOiB1c2VyLnJvbGVfbmFtZSxcbiAgfSk7XG4gIGF3YWl0IHVzZXJDbGllbnQuY29ubmVjdCgpO1xuICByZXR1cm4gdXNlckNsaWVudDtcbn1cblxuLyoqXG4gKiBFeGVjdXRlIHF1ZXJ5IHNlcnZlci1zaWRlXG4gKiBAcmV0dXJucyB7UHJvbWlzZX1cbiAqL1xuZXhwb3J0IGRlZmF1bHQgYXN5bmMgZnVuY3Rpb24gZXhlY3V0ZUNvbm5lY3Rpb24oXG4gIGNsaWVudDogQ2xpZW50LFxuICBxdWVyeTogRXhlY3V0YWJsZSxcbik6IFByb21pc2U8UXVlcnlSZXN1bHQ+IHtcbiAgbGV0IGNvbm5lY3Rpb247XG5cbiAgdHJ5IHtcbiAgICBjb25uZWN0aW9uID0gYXdhaXQgZ2V0Q29ubmVjdGlvbihjbGllbnQpO1xuICAgIC8vIGxldCByZXN1bHQ7XG4gICAgLypcbiAgICBpZiAocXVlcnkuYXJncyAmJiBxdWVyeS5hcmdzLnNvdXJjZSkge1xuICAgICAgY29uc3Qge3NjaGVtYU5hbWUsIHJlbGF0aW9uTmFtZSwgY29sdW1uLCBuYW1lfSA9IHBhcnNlU291cmNlVXJsKFxuICAgICAgICBxdWVyeS51cmwsXG4gICAgICApO1xuICAgICAgY29uc3QgcXVlcnlSZXN1bHQgPSBhd2FpdCBjb25uZWN0aW9uLnF1ZXJ5KFxuICAgICAgICBgXG4gICAgICAgIHNlbGVjdCBjb250ZW50LCBtaW1ldHlwZVxuICAgICAgICBmcm9tIChzZWxlY3QgJDEgYXMgY29udGVudCwgJyQxJyBhcyBleHRlbnNpb24gZnJvbSAkMy4kNCB3aGVyZSBuYW1lPSckMicpIGFzIGNcbiAgICAgICAgam9pbiBlbmRwb2ludC5taW1ldHlwZV9leHRlbnNpb24gbWUgb24gYy5leHRlbnNpb249bWUuZXh0ZW5zaW9uXG4gICAgICAgIGpvaW4gZW5kcG9pbnQubWltZXR5cGUgbSBvbiBtZS5taW1ldHlwZV9pZD1tLmlkO1xuICAgICAgYCxcbiAgICAgICAgW2NvbHVtbiwgbmFtZSwgc2NoZW1hTmFtZSwgcmVsYXRpb25OYW1lXSxcbiAgICAgICk7XG4gICAgICByZXN1bHQgPSB7Li4ucXVlcnlSZXN1bHR9O1xuICAgICAgaWYgKHJlc3VsdCAmJiByZXN1bHQucm93cyAmJiByZXN1bHQucm93cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IDIwMDtcbiAgICAgICAgcmVzdWx0Lm1lc3NhZ2UgPSAnT0snO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9IDQwNDtcbiAgICAgICAgcmVzdWx0LnN0YXR1cyA9ICdOT1QgRk9VTkQnO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAqL1xuICAgIGNvbnNvbGUubG9nKFxuICAgICAgJ3RyeWluZyBjb25uZWN0aW9uJyxcbiAgICAgIHF1ZXJ5LnZlcnNpb24gfHwgY2xpZW50LnZlcnNpb24sXG4gICAgICBxdWVyeS5tZXRob2QsXG4gICAgICBxdWVyeS51cmwsXG4gICAgICBKU09OLnN0cmluZ2lmeShxdWVyeS5hcmdzKSxcbiAgICAgIEpTT04uc3RyaW5naWZ5KHF1ZXJ5LmRhdGEpLFxuICAgICk7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29ubmVjdGlvbi5xdWVyeShcbiAgICAgICdzZWxlY3Qgc3RhdHVzLCBtZXNzYWdlLCByZXNwb25zZSwgbWltZXR5cGUgJyArXG4gICAgICAgICdmcm9tIGVuZHBvaW50LnJlcXVlc3QoJDEsICQyLCAkMywgJDQ6Ompzb24sICQ1Ojpqc29uKScsXG4gICAgICBbXG4gICAgICAgIHF1ZXJ5LnZlcnNpb24gfHwgY2xpZW50LnZlcnNpb24sXG4gICAgICAgIHF1ZXJ5Lm1ldGhvZCxcbiAgICAgICAgcXVlcnkudXJsLFxuICAgICAgICBKU09OLnN0cmluZ2lmeShxdWVyeS5hcmdzKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkocXVlcnkuZGF0YSksXG4gICAgICBdLFxuICAgICk7XG4gICAgLy99XG5cbiAgICAvLyBUT0RPOiBlbmQgY29ubmVjdGlvbiBpZiB1c2VyQ2xpZW50LCBidXQgcmVsZWFzZSBpZiBhbm9uQ2xpZW50P1xuICAgIGF3YWl0IGNvbm5lY3Rpb24uZW5kKCk7XG5cbiAgICBjb25zdCByZXMgPSBuZXcgUmVzdWx0KHJlc3VsdC5yb3dzWzBdKTtcbiAgICBpZiAoY2xpZW50LnJhd1Jlc3BvbnNlKSB7XG4gICAgICByZXR1cm4gcmVzO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcmVzLmpzb24oKS50aGVuKHIgPT4ge1xuICAgICAgICBpZiAoci5yZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gci5yZXN1bHQubWFwKCh7cm93fSkgPT4gcm93KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIFByb2JsZW0gd2l0aCBjb25uZWN0aW5nIHRvIGRhdGFiYXNlXG4gICAgY29uc29sZS5lcnJvcihgY29ubmVjdGlvbjogZXJyb3IgdHJ5aW5nIHRvIGNvbm5lY3QgdG8gZGF0YWJhc2VgKTtcbiAgICBjb25zb2xlLmVycm9yKGUpO1xuICAgIGlmIChjb25uZWN0aW9uKSB7XG4gICAgICBhd2FpdCBjb25uZWN0aW9uLmVuZCgpO1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxufVxuXG50eXBlIFJlc3VsdEFyZ3MgPSB7XG4gIHN0YXR1czogc3RyaW5nLFxuICBtZXNzYWdlOiBzdHJpbmcsXG4gIHJlc3BvbnNlOiBzdHJpbmcsXG4gIG1pbWV0eXBlOiBzdHJpbmcsXG59O1xuLy8gTWltaWMgcmVzcG9uc2UgZnJvbSBmZXRjaFxuY2xhc3MgUmVzdWx0IHtcbiAgc3RhdHVzOiBzdHJpbmc7XG4gIHN0YXR1c1RleHQ6IHN0cmluZztcbiAgcmVzcG9uc2U6IHN0cmluZztcbiAgbWltZXR5cGU6IHN0cmluZztcbiAgY29uc3RydWN0b3Ioe3N0YXR1cywgbWVzc2FnZSwgcmVzcG9uc2UsIG1pbWV0eXBlfTogUmVzdWx0QXJncykge1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHRoaXMuc3RhdHVzVGV4dCA9IG1lc3NhZ2U7XG4gICAgdGhpcy5yZXNwb25zZSA9IHJlc3BvbnNlO1xuICAgIHRoaXMubWltZXR5cGUgPSBtaW1ldHlwZTtcbiAgfVxuICBhc3luYyBqc29uKCk6IFByb21pc2U8e1tzdHJpbmddOiBhbnl9PiB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UodGhpcy5yZXNwb25zZSk7XG4gIH1cbn1cblxuLyoqXG4gKiBUT0RPIEkgd2FudCB0byBrZWVwIHRyYWNrIG9mIGhvdyBtYW55IHBvb2xzIGFyZSBvcGVuIGFuZCB3aGVuIHRoZXkgY29ubmVjdFxuICogcGctcG9vbCBoYXMgc29tZSBncmVhdCBldmVudHNcbiAqIHBvb2wub24oJ2Nvbm5lY3QnLCBjbGllbnQgPT4ge1xuICogICBjbGllbnQuY291bnQgPSBjb3VudCsrXG4gKiB9KVxuICovXG5cbi8qKlxuICogVE9ETyBpbiBvcmRlciB0byBkbyB0aGlzLCBJIHdvdWxkIGhhdmUgdG8ga2VlcCB0cmFjayBvZiB0aGUgb3BlbiBwb29scyxcbiAqIGluc3RlYWQgb2YgZG9pbmcgaXQgd2l0aCBwZy5jb25uZWN0KClcbiAqXG4gKiB2YXIgcG9vbCA9IG5ldyBwZy5Qb29sKGNvbmZpZylcbiAqIHBvb2wuY29ubmVjdChjYWxsYmFjaylcbiAqXG4gKiBpcyB0aGUgc2FtZSBhc1xuICpcbiAqIHBnLmNvbm5lY3QoY29uZmlnLCBjYWxsYmFjaylcbiAqXG4gKiBhbmQgdGhpcyB3YXksIHBnIHdpbGwga2VlcCB0cmFjayBvZiB0aGUgcG9vbHMgYW5kIG5vdCBjcmVhdGUgYSBuZXcgb25lIHdoZW5cbiAqIHRoZSBzYW1lIGNvbmZpZyBoYXMgYmVlbiBwYXNzZWQgaW4gdHdpY2VcbiAqL1xuXG50eXBlIFBhcnNlZFNvdXJjZVVybCA9IHtcbiAgc2NoZW1hTmFtZTogc3RyaW5nLFxuICByZWxhdGlvbk5hbWU6IHN0cmluZyxcbiAgY29sdW1uOiBzdHJpbmcsXG4gIG5hbWU6IHN0cmluZyxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZVNvdXJjZVVybChwYXRobmFtZTogc3RyaW5nKTogUGFyc2VkU291cmNlVXJsIHtcbiAgY29uc3QgWywgLCBzY2hlbWFOYW1lLCByZWxhdGlvbk5hbWUsIC4uLnJlc3RdID0gcGF0aG5hbWUuc3BsaXQoJy8nKTtcbiAgY29uc3QgZmlsZU5hbWUgPSByZXN0LmpvaW4oJy8nKTtcbiAgY29uc3QgbGFzdFBlcmlvZCA9IGZpbGVOYW1lLmxhc3RJbmRleE9mKCcuJyk7XG4gIGNvbnN0IG5hbWUgPSBmaWxlTmFtZS5zbGljZSgwLCBsYXN0UGVyaW9kKTtcbiAgY29uc3QgY29sdW1uID0gZmlsZU5hbWUuc2xpY2UobGFzdFBlcmlvZCArIDEpO1xuXG4gIHJldHVybiB7c2NoZW1hTmFtZSwgcmVsYXRpb25OYW1lLCBjb2x1bW4sIG5hbWV9O1xufVxuIl19