-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathruntime.ts
More file actions
68 lines (60 loc) · 1.72 KB
/
runtime.ts
File metadata and controls
68 lines (60 loc) · 1.72 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 {
APIGatewayProxyEvent,
APIGatewayProxyEventV2,
Context,
} from "aws-lambda";
export function toAwsEvent(
request: Request,
): APIGatewayProxyEvent | APIGatewayProxyEventV2 {
const header = request.headers.get("aws-event");
if (header == null)
throw new MissingAwsEventHeaderError(
`Provided request does not contain "aws-event" header.`,
);
return JSON.parse(header);
}
export function toAwsContext(request: Request): Context {
const header = request.headers.get("aws-context");
if (header == null)
throw new MissingAwsContextHeaderError(
`Provided request does not contain "aws-context" header.`,
);
const {
serializedAtTimeInMillis,
remainingTimeInMillis,
...rest
}: Omit<Context, "getRemainingTimeInMillis"> & {
serializedAtTimeInMillis: number;
remainingTimeInMillis: number;
} = JSON.parse(header);
return {
...rest,
getRemainingTimeInMillis: () => {
const diff = Date.now() - serializedAtTimeInMillis;
return remainingTimeInMillis - diff;
},
};
}
export function isAPIGatewayProxyEvent(
event: any,
): event is APIGatewayProxyEvent {
return (
typeof event.httpMethod === "string" &&
typeof event.path === "string" &&
typeof event.resource === "string" &&
typeof event.requestContext === "object"
);
}
export function isAPIGatewayProxyEventV2(
event: any,
): event is APIGatewayProxyEventV2 {
return (
event.version === "2.0" &&
typeof event.rawPath === "string" &&
typeof event.rawQueryString === "string" &&
typeof event.routeKey === "string" &&
typeof event.requestContext === "object"
);
}
class MissingAwsEventHeaderError extends Error {}
class MissingAwsContextHeaderError extends Error {}