-
Notifications
You must be signed in to change notification settings - Fork 7
/
cdfRetryValidator.ts
82 lines (75 loc) · 2.02 KB
/
cdfRetryValidator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// Copyright 2019 Cognite AS
import { inRange, some } from 'lodash';
import { HttpMethod } from './basicHttpClient';
import { RetryValidator } from './retryableHttpClient';
const MAX_RETRY_ATTEMPTS = 5;
const cdfEndpointsToRetry: { [key: string]: string[] } = {
[HttpMethod.Post]: [
'/assets/list',
'/assets/byids',
'/assets/search',
'/events/list',
'/events/byids',
'/events/search',
'/files/list',
'/files/byids',
'/files/search',
'/files/initupload',
'/files/downloadlink',
'/timeseries/byids',
'/timeseries/search',
'/timeseries/data',
'/timeseries/data/list',
'/timeseries/data/latest',
'/timeseries/data/delete',
],
};
export const cdfRetryValidator: RetryValidator = (
request,
response,
retryCount
) => {
if (retryCount >= MAX_RETRY_ATTEMPTS) {
return false;
}
if (!isValidRetryStatusCode(response.status)) {
return false;
}
if (universalRetryValidator(request, response, retryCount)) {
return true;
}
const endpoints = cdfEndpointsToRetry[request.method] || [];
if (matchPathWithEndpoints(request.path, endpoints)) {
return true;
}
return false;
};
const universalRetryValidator: RetryValidator = (
request,
response,
retryCount
) => {
if (retryCount >= MAX_RETRY_ATTEMPTS) {
return false;
}
const httpMethodsToRetry = ['GET', 'HEAD', 'OPTIONS', 'DELETE', 'PUT'];
const isRetryableHttpMethod =
httpMethodsToRetry.indexOf(request.method.toUpperCase()) !== -1;
if (!isRetryableHttpMethod) {
return false;
}
return isValidRetryStatusCode(response.status);
};
function isValidRetryStatusCode(status: number) {
return (
inRange(status, 100, 200) ||
inRange(status, 429, 430) ||
inRange(status, 500, 600)
);
}
function matchPathWithEndpoints(path: string, endpoints: string[]) {
return some(endpoints, endpoint => matchPathWithEndpoint(path, endpoint));
}
function matchPathWithEndpoint(path: string, endpoint: string) {
return path.toUpperCase().indexOf(endpoint.toUpperCase()) !== -1;
}