in src/login/server.ts [59:114]
export function createServer(nonce: string): {
server: http.Server;
redirectPromise: Promise<RedirectResult>;
codePromise: Promise<CodeResult>;
} {
let deferredRedirect: Deferred<RedirectResult>;
const redirectPromise = new Promise<RedirectResult>((resolve, reject) => deferredRedirect = { resolve, reject });
let deferredCode: Deferred<CodeResult>;
const codePromise = new Promise<CodeResult>((resolve, reject) => deferredCode = { resolve, reject });
const codeTimer = setTimeout(() => {
deferredCode.reject(new Error('Timeout waiting for code'));
}, 5 * 60 * 1000);
function cancelCodeTimer() {
clearTimeout(codeTimer);
}
const server: http.Server = http.createServer(function (req, res) {
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
const reqUrl: url.UrlWithParsedQuery = url.parse(req.url!, /* parseQueryString */ true);
switch (reqUrl.pathname) {
case '/signin':
const receivedNonce: string = (reqUrl.query.nonce.toString() || '').replace(/ /g, '+');
if (receivedNonce === nonce) {
deferredRedirect.resolve({ req, res });
} else {
const err = new Error('Nonce does not match.');
deferredRedirect.resolve({ err, res });
}
break;
case '/':
sendFile(res, path.join(ext.context.asAbsolutePath('codeFlowResult'), 'index.html'), 'text/html; charset=utf-8');
break;
case '/main.css':
sendFile(res, path.join(ext.context.asAbsolutePath('codeFlowResult'), 'main.css'), 'text/css; charset=utf-8');
break;
case '/callback':
deferredCode.resolve(callback(nonce, reqUrl)
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment
.then(code => ({ code, res }), err => ({ err, res })));
break;
default:
res.writeHead(404);
res.end();
break;
}
});
codePromise.then(cancelCodeTimer, cancelCodeTimer);
return {
server,
redirectPromise,
codePromise
};
}