Add PBandGraphOauth scaffold and auth UI
This commit is contained in:
+71
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||
* Licensed under the MIT License.
|
||||
*/
|
||||
|
||||
import http from "http";
|
||||
import { IHttpRetryPolicy } from "./IHttpRetryPolicy.js";
|
||||
|
||||
export class LinearRetryPolicy implements IHttpRetryPolicy {
|
||||
maxRetries: number;
|
||||
retryDelay: number;
|
||||
httpStatusCodesToRetryOn: Array<number>;
|
||||
|
||||
constructor(
|
||||
maxRetries: number,
|
||||
retryDelay: number,
|
||||
httpStatusCodesToRetryOn: Array<number>
|
||||
) {
|
||||
this.maxRetries = maxRetries;
|
||||
this.retryDelay = retryDelay;
|
||||
this.httpStatusCodesToRetryOn = httpStatusCodesToRetryOn;
|
||||
}
|
||||
|
||||
private retryAfterMillisecondsToSleep(
|
||||
retryHeader: http.IncomingHttpHeaders["retry-after"]
|
||||
): number {
|
||||
if (!retryHeader) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
// retry-after header is in seconds
|
||||
let millisToSleep = Math.round(parseFloat(retryHeader) * 1000);
|
||||
|
||||
/*
|
||||
* retry-after header is in HTTP Date format
|
||||
* <day-name>, <day> <month> <year> <hour>:<minute>:<second> GMT
|
||||
*/
|
||||
if (isNaN(millisToSleep)) {
|
||||
millisToSleep = Math.max(
|
||||
0,
|
||||
// .valueOf() is needed to subtract dates in TypeScript
|
||||
new Date(retryHeader).valueOf() - new Date().valueOf()
|
||||
);
|
||||
}
|
||||
|
||||
return millisToSleep;
|
||||
}
|
||||
|
||||
async pauseForRetry(
|
||||
httpStatusCode: number,
|
||||
currentRetry: number,
|
||||
retryAfterHeader: http.IncomingHttpHeaders["retry-after"]
|
||||
): Promise<boolean> {
|
||||
if (
|
||||
this.httpStatusCodesToRetryOn.includes(httpStatusCode) &&
|
||||
currentRetry < this.maxRetries
|
||||
) {
|
||||
const retryAfterDelay: number =
|
||||
this.retryAfterMillisecondsToSleep(retryAfterHeader);
|
||||
|
||||
await new Promise((resolve) => {
|
||||
// retryAfterHeader value of 0 evaluates to false, and this.retryDelay will be used
|
||||
return setTimeout(resolve, retryAfterDelay || this.retryDelay);
|
||||
});
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user