-
Notifications
You must be signed in to change notification settings - Fork 13
/
Copy pathutils.ts
71 lines (61 loc) · 1.87 KB
/
utils.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
import { TypedDocumentString } from "./graphql";
const MILLI_MULTIPLYER = 1000;
interface TokenData {
iat: number;
owner: string;
iss: string;
exp: number;
token: string;
email: string;
type: "access" | "refresh";
user_id: string;
is_staff: boolean;
}
const decodeToken = (token: string): { exp: number; iss: string } => {
const tokenParts = token.split(".");
const decodedTokenData = Buffer.from(tokenParts[1] || "", "base64").toString();
const parsedTokenData = JSON.parse(decodedTokenData) as TokenData;
return parsedTokenData;
};
// returns timestamp
const getTokenExpiry = (token: string): number => {
const parsedTokenData = decodeToken(token);
// because api returns seconds, but Date.now() works in millis
return parsedTokenData.exp * MILLI_MULTIPLYER || 0;
};
export const getTokenIss = (token: string): string => {
const parsedTokenData = decodeToken(token);
return parsedTokenData.iss;
};
export const isExpiredToken = (token: string, tokenGracePeriod: number) => {
return getTokenExpiry(token) - tokenGracePeriod <= Date.now();
};
// query here is document node but because of graphql-tag using
// a different version of graphql and pnpm overrides not working
// https://github.com/pnpm/pnpm/issues/4097
// we're gonna do this instead
export const getRequestData = <TResult, TVariables>(
query: TypedDocumentString<TResult, TVariables>,
variables: TVariables,
requestInit?: Partial<RequestInit>,
) => ({
...requestInit,
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
query,
variables,
}),
});
export class InvariantError extends Error {
constructor(message: string) {
super(message);
}
}
export function invariant(condition: unknown, message?: string): asserts condition {
if (!condition) {
throw new InvariantError(`Invariant Violation: ${message || ""}`);
}
}