LookAtMySuitBot/js/node_modules/@azure/msal-node/dist/network/LoopbackClient.cjs

90 lines
3.4 KiB
JavaScript

/*! @azure/msal-node v2.5.1 2023-11-07 */
'use strict';
'use strict';
var msalCommon = require('@azure/msal-common');
var http = require('http');
var NodeAuthError = require('../error/NodeAuthError.cjs');
var Constants = require('../utils/Constants.cjs');
/*
* Copyright (c) Microsoft Corporation. All rights reserved.
* Licensed under the MIT License.
*/
class LoopbackClient {
/**
* Spins up a loopback server which returns the server response when the localhost redirectUri is hit
* @param successTemplate
* @param errorTemplate
* @returns
*/
async listenForAuthCode(successTemplate, errorTemplate) {
if (this.server) {
throw NodeAuthError.NodeAuthError.createLoopbackServerAlreadyExistsError();
}
return new Promise((resolve, reject) => {
this.server = http.createServer((req, res) => {
const url = req.url;
if (!url) {
res.end(errorTemplate ||
"Error occurred loading redirectUrl");
reject(NodeAuthError.NodeAuthError.createUnableToLoadRedirectUrlError());
return;
}
else if (url === msalCommon.Constants.FORWARD_SLASH) {
res.end(successTemplate ||
"Auth code was successfully acquired. You can close this window now.");
return;
}
const redirectUri = this.getRedirectUri();
const parsedUrl = new URL(url, redirectUri);
const authCodeResponse = msalCommon.UrlUtils.getDeserializedResponse(parsedUrl.search) || {};
if (authCodeResponse.code) {
res.writeHead(msalCommon.HttpStatus.REDIRECT, {
location: redirectUri,
}); // Prevent auth code from being saved in the browser history
res.end();
}
resolve(authCodeResponse);
});
this.server.listen(0); // Listen on any available port
});
}
/**
* Get the port that the loopback server is running on
* @returns
*/
getRedirectUri() {
if (!this.server || !this.server.listening) {
throw NodeAuthError.NodeAuthError.createNoLoopbackServerExistsError();
}
const address = this.server.address();
if (!address || typeof address === "string" || !address.port) {
this.closeServer();
throw NodeAuthError.NodeAuthError.createInvalidLoopbackAddressTypeError();
}
const port = address && address.port;
return `${Constants.Constants.HTTP_PROTOCOL}${Constants.Constants.LOCALHOST}:${port}`;
}
/**
* Close the loopback server
*/
closeServer() {
if (this.server) {
// Only stops accepting new connections, server will close once open/idle connections are closed.
this.server.close();
if (typeof this.server.closeAllConnections === "function") {
/*
* Close open/idle connections. This API is available in Node versions 18.2 and higher
*/
this.server.closeAllConnections();
}
this.server.unref();
this.server = undefined;
}
}
}
exports.LoopbackClient = LoopbackClient;
//# sourceMappingURL=LoopbackClient.cjs.map