Skip to content

Commit

Permalink
Make GitPod login support more robust
Browse files Browse the repository at this point in the history
  • Loading branch information
vgrichina committed Apr 2, 2020
1 parent c710336 commit 6a0b59d
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 21 deletions.
4 changes: 2 additions & 2 deletions .gitpod.yml
Expand Up @@ -4,5 +4,5 @@ github:
prebuilds:
addBadge: true
ports:
- port: 5000-5010
onOpen: ignore
- port: 6000
onOpen: open-browser
17 changes: 9 additions & 8 deletions index.js
Expand Up @@ -63,7 +63,7 @@ exports.login = async function(options) {

// find a callback URL on the local machine
try {
tempUrl = await capture.callback(5000);
tempUrl = await capture.callback(6000);
} catch (error) {
// console.error("Failed to find suitable port.", error.message)
// TODO: Is it? Try triggering error
Expand All @@ -75,23 +75,24 @@ exports.login = async function(options) {
if (process.env.GITPOD_WORKSPACE_URL) {
const workspaceUrl = new URL(process.env.GITPOD_WORKSPACE_URL);
newUrl.searchParams.set('success_url', `https://${tempUrl.port}-${workspaceUrl.hostname}`);
// Browser not opened, as will open automatically for opened port
} else {
newUrl.searchParams.set('success_url', `http://${tempUrl.hostname}:${tempUrl.port}`);
}

try {
// open a browser to capture NEAR Wallet callback (and quietly direct the user if open fails)
await open(newUrl.toString());
} catch (error) {
console.error(`Failed to open the URL [ ${newUrl.toString()} ]`, error);
try {
// open a browser to capture NEAR Wallet callback (and quietly direct the user if open fails)
await open(newUrl.toString());
} catch (error) {
console.error(`Failed to open the URL [ ${newUrl.toString()} ]`, error);
}
}
}

console.log(chalk`\n{dim If your browser doesn't automatically open, please visit this URL\n${newUrl.toString()}}`);

const getAccountFromWebpage = async () => {
// capture account_id as provided by NEAR Wallet
const [accountId] = await capture.payload(['account_id'], tempUrl);
const [accountId] = await capture.payload(['account_id'], tempUrl, newUrl);
return accountId;
};

Expand Down
32 changes: 21 additions & 11 deletions utils/capture-login-success.js
Expand Up @@ -13,30 +13,35 @@ let server;
@param port the port the server should use
@param hostname the hostname the server should use
*/
const payload = (fields, { port, hostname }) => new Promise((resolve, reject) => {

const message = renderWebPage('You are logged in. Please close this window.');
const payload = (fields, { port, hostname }, redirectUrl) => new Promise((resolve, reject) => {
server = stoppable(http.createServer(handler)).listen(port, hostname);

/**
request handler for single-use node server
*/
function handler(req, res){
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
try {
let parsedUrl = url.parse(req.url, true);
let results = fields.map((field) => parsedUrl.query[field]);
res.end(message, () => {
server.stop();
resolve(results);
});

if (Object.keys(parsedUrl.query).length > 0) {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/html');
// TODO: Make code more specialized (vs handling generic fields) and only output this if login succeeded end to end
res.end(renderWebPage('You are logged in. Please close this window.'), () => {
server.stop();
resolve(results);
});
} else {
res.writeHead(301, { Location: redirectUrl });
res.end();
}
} catch (e) {
console.log('Unexpected error: ', e);
console.error('Unexpected error: ', e);
res.statusCode = 400;
res.end('It\'s a scam!');
server.stop();
reject('Failed to capture accountId');
reject(new Error('Failed to capture accountId'));
}
}
});
Expand All @@ -49,6 +54,11 @@ const payload = (fields, { port, hostname }) => new Promise((resolve, reject) =>
@param range the number of ports to try scanning before giving up
*/
const callback = async (port = 3000, hostname = '127.0.0.1', range = 10) => {
if (process.env.GITPOD_WORKSPACE_URL) {
// NOTE: Port search interferes with GitPod port management
return { port, hostname };
}

const start = port;
const end = start + range;
let inUse = true;
Expand Down

0 comments on commit 6a0b59d

Please sign in to comment.