-
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
function sleep(ms: number): Promise<void> {
return new Promise((resolve) => {
setTimeout(() => {
resolve();
}, ms);
});
}
type UserId = string & { __userId: never };
export interface User {
id: UserId;
displayName: string;
}
const usersData = new Map<UserId, Omit<User, "id">>([
["alice" as UserId, { displayName: "Alice" }],
["bob" as UserId, { displayName: "Bob" }],
["carol" as UserId, { displayName: "Carol" }],
]);
export async function fetchUserInfo(
req: Request,
abortSignal: AbortSignal,
): Promise<User> {
await sleep(Math.random() * 500 + 1000);
if (abortSignal.aborted) {
throw new Error("Operation was aborted.");
}
const url = new URL(req.url);
const id = url.searchParams.get("id") as UserId | null;
if (!id) {
throw new Error("UserId is required.");
}
const user = usersData.get(id);
if (!user) {
throw new Error(`User with UserId("${id}") does not exist.`);
}
return {
id,
...user,
};
}