forked from isaacplmann/sturdy-uis
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.ts
More file actions
68 lines (62 loc) · 1.62 KB
/
index.ts
File metadata and controls
68 lines (62 loc) · 1.62 KB
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
import { people, planets } from './mock-data';
function randomizedDelay<T>(maxDelay: number, callback: () => T): Promise<T> {
return new Promise<T>((resolve, reject) => {
setTimeout(() => {
resolve(callback());
}, Math.random() * maxDelay);
});
}
function randomizedError<T>(errorRate: number, callback: () => T): Promise<T> {
if (Math.random() < errorRate) {
return Promise.reject(
'500 Error! I sense a great disturbance in the network.'
);
} else {
return Promise.resolve(callback());
}
}
const DEFAULT_MAX_DELAY = 3000;
const DEFAULT_ERROR_RATE = 0.5;
export function mockFetch<T>(
{ maxDelay, errorRate } = {
maxDelay: DEFAULT_MAX_DELAY,
errorRate: DEFAULT_ERROR_RATE
},
callback: () => T
): Promise<T> {
console.log('Starting mockFetch of ' + callback.name);
return randomizedDelay(maxDelay, () => callback())
.then(result => randomizedError(errorRate, () => result))
.then(
result => {
console.log('Successful fetch of ' + callback.name);
return result;
},
error => {
console.log('Error fetching ' + callback.name);
throw error;
}
);
}
export function fetchPeople(
{ maxDelay, errorRate } = {
maxDelay: DEFAULT_MAX_DELAY,
errorRate: DEFAULT_ERROR_RATE
}
) {
function getPeople() {
return people;
}
return mockFetch({ maxDelay, errorRate }, getPeople);
}
export function fetchPlanets(
{ maxDelay, errorRate } = {
maxDelay: DEFAULT_MAX_DELAY,
errorRate: DEFAULT_ERROR_RATE
}
) {
function getPlanets() {
return planets;
}
return mockFetch({ maxDelay, errorRate }, getPlanets);
}