forked from aws-powertools/powertools-lambda-python
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi_gateway_websocket_event.py
136 lines (102 loc) · 3.44 KB
/
api_gateway_websocket_event.py
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
from __future__ import annotations
import base64
from functools import cached_property
from typing import Any
from aws_lambda_powertools.utilities.data_classes.common import (
CaseInsensitiveDict,
DictWrapper,
)
class APIGatewayWebSocketEventIdentity(DictWrapper):
@property
def source_ip(self) -> str:
return self["sourceIp"]
@property
def user_agent(self) -> str | None:
return self.get("userAgent")
class APIGatewayWebSocketEventRequestContext(DictWrapper):
@property
def route_key(self) -> str:
return self["routeKey"]
@property
def disconnect_status_code(self) -> int | None:
return self.get("disconnectStatusCode")
@property
def message_id(self) -> str | None:
return self.get("messageId")
@property
def event_type(self) -> str:
return self["eventType"]
@property
def extended_request_id(self) -> str:
return self["extendedRequestId"]
@property
def request_time(self) -> str:
return self["requestTime"]
@property
def message_direction(self) -> str:
return self["messageDirection"]
@property
def disconnect_reason(self) -> str | None:
return self.get("disconnectReason")
@property
def stage(self) -> str:
return self["stage"]
@property
def connected_at(self) -> int:
return self["connectedAt"]
@property
def request_time_epoch(self) -> int:
return self["requestTimeEpoch"]
@property
def identity(self) -> APIGatewayWebSocketEventIdentity:
return APIGatewayWebSocketEventIdentity(self["identity"])
@property
def request_id(self) -> str:
return self["requestId"]
@property
def domain_name(self) -> str:
return self["domainName"]
@property
def connection_id(self) -> str:
return self["connectionId"]
@property
def api_id(self) -> str:
return self["apiId"]
class APIGatewayWebSocketEvent(DictWrapper):
"""AWS proxy integration event for WebSocket API
Documentation:
--------------
- https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api-integration-requests.html
"""
@property
def is_base64_encoded(self) -> bool:
return self["isBase64Encoded"]
@property
def body(self) -> str | None:
return self.get("body")
@cached_property
def decoded_body(self) -> str | None:
body = self.body
if self.is_base64_encoded and body:
return base64.b64decode(body.encode()).decode()
return body
@cached_property
def json_body(self) -> Any:
if self.decoded_body:
return self._json_deserializer(self.decoded_body)
return None
@property
def headers(self) -> dict[str, str]:
return CaseInsensitiveDict(self.get("headers"))
@property
def multi_value_headers(self) -> dict[str, list[str]]:
return CaseInsensitiveDict(self.get("multiValueHeaders"))
@property
def query_string_parameters(self) -> dict[str, str]:
return CaseInsensitiveDict(self.get("queryStringParameters"))
@property
def multi_value_query_string_parameters(self) -> dict[str, list[str]]:
return CaseInsensitiveDict(self.get("multiValueQueryStringParameters"))
@property
def request_context(self) -> APIGatewayWebSocketEventRequestContext:
return APIGatewayWebSocketEventRequestContext(self["requestContext"])