@@ -29,8 +29,8 @@ defmodule RealtimeWeb.RealtimeChannel do
29
29
@ confirm_token_ms_interval :timer . minutes ( 5 )
30
30
31
31
@ impl true
32
- def join ( "realtime:" , _params , _socket ) do
33
- Logging . log_error_message ( :error , "TopicNameRequired" , "You must provide a topic name" )
32
+ def join ( "realtime:" , _params , socket ) do
33
+ Logging . log_error_message ( :error , "TopicNameRequired" , "You must provide a topic name" , socket )
34
34
end
35
35
36
36
def join ( "realtime:" <> sub_topic = topic , params , socket ) do
@@ -54,9 +54,9 @@ defmodule RealtimeWeb.RealtimeChannel do
54
54
55
55
with :ok <- SignalHandler . shutdown_in_progress? ( ) ,
56
56
:ok <- only_private? ( tenant_id , socket ) ,
57
- :ok <- limit_joins ( socket . assigns ) ,
57
+ :ok <- limit_joins ( socket ) ,
58
58
:ok <- limit_channels ( socket ) ,
59
- :ok <- limit_max_users ( socket . assigns ) ,
59
+ :ok <- limit_max_users ( socket ) ,
60
60
:ok <- start_db_rate_counter ( tenant_id ) ,
61
61
{ :ok , claims , confirm_token_ref , access_token , _ } <- confirm_token ( socket ) ,
62
62
{ :ok , db_conn } <- Connect . lookup_or_start_connection ( tenant_id ) ,
@@ -113,109 +113,84 @@ defmodule RealtimeWeb.RealtimeChannel do
113
113
{ :ok , state , assign ( socket , assigns ) }
114
114
else
115
115
{ :error , :expired_token , msg } ->
116
- Logging . log_error_with_token_metadata ( "InvalidJWTToken" , msg , socket . assigns . access_token )
116
+ Logging . log_error_with_token_metadata ( "InvalidJWTToken" , msg , socket )
117
117
118
118
{ :error , :missing_claims } ->
119
119
msg = "Fields `role` and `exp` are required in JWT"
120
- Logging . log_error_with_token_metadata ( "InvalidJWTToken" , msg , socket . assigns . access_token )
120
+ Logging . log_error_with_token_metadata ( "InvalidJWTToken" , msg , socket )
121
121
122
122
{ :error , :unauthorized , msg } ->
123
- Logging . log_error_message ( :error , "Unauthorized" , msg )
123
+ Logging . log_error_message ( :error , "Unauthorized" , msg , socket )
124
124
125
125
{ :error , :too_many_channels } ->
126
126
msg = "Too many channels"
127
- Logging . log_error_message ( :error , "ChannelRateLimitReached" , msg )
127
+ Logging . log_error_message ( :error , "ChannelRateLimitReached" , msg , socket )
128
128
129
129
{ :error , :too_many_connections } ->
130
130
msg = "Too many connected users"
131
- Logging . log_error_message ( :error , "ConnectionRateLimitReached" , msg )
131
+ Logging . log_error_message ( :error , "ConnectionRateLimitReached" , msg , socket )
132
132
133
133
{ :error , :too_many_joins } ->
134
134
msg = "Too many joins per second"
135
- Logging . log_error_message ( :error , "ClientJoinRateLimitReached" , msg )
135
+ Logging . log_error_message ( :error , "ClientJoinRateLimitReached" , msg , socket )
136
136
137
137
{ :error , :increase_connection_pool } ->
138
138
msg = "Please increase your connection pool size"
139
- Logging . log_error_message ( :error , "IncreaseConnectionPool" , msg )
139
+ Logging . log_error_message ( :error , "IncreaseConnectionPool" , msg , socket )
140
140
141
141
{ :error , :tenant_db_too_many_connections } ->
142
142
msg = "Database can't accept more connections, Realtime won't connect"
143
- Logging . log_error_message ( :error , "DatabaseLackOfConnections" , msg )
143
+ Logging . log_error_message ( :error , "DatabaseLackOfConnections" , msg , socket )
144
144
145
145
{ :error , :unable_to_set_policies , error } ->
146
- Logging . log_error_message ( :error , "UnableToSetPolicies" , error )
146
+ Logging . log_error_message ( :error , "UnableToSetPolicies" , error , socket )
147
147
{ :error , % { reason: "Realtime was unable to connect to the project database" } }
148
148
149
149
{ :error , :tenant_database_unavailable } ->
150
150
Logging . log_error_message (
151
151
:error ,
152
152
"UnableToConnectToProject" ,
153
- "Realtime was unable to connect to the project database"
153
+ "Realtime was unable to connect to the project database" ,
154
+ socket
154
155
)
155
156
156
157
{ :error , :rpc_error , :timeout } ->
157
- Logging . log_error_message ( :error , "TimeoutOnRpcCall" , "Node request timeout" )
158
+ Logging . log_error_message ( :error , "TimeoutOnRpcCall" , "Node request timeout" , socket )
158
159
159
160
{ :error , :rpc_error , reason } ->
160
- Logging . log_error_message ( :error , "ErrorOnRpcCall" , "RPC call error: " <> inspect ( reason ) )
161
+ Logging . log_error_message ( :error , "ErrorOnRpcCall" , "RPC call error: " <> inspect ( reason ) , socket )
161
162
162
163
{ :error , :initializing } ->
163
- Logging . log_error_message (
164
- :error ,
165
- "InitializingProjectConnection" ,
166
- "Realtime is initializing the project connection"
167
- )
164
+ msg = "Realtime is initializing the project connection"
165
+ Logging . log_error_message ( :error , "InitializingProjectConnection" , msg , socket )
168
166
169
167
{ :error , :tenant_database_connection_initializing } ->
170
- Logging . log_error_message (
171
- :error ,
172
- "InitializingProjectConnection" ,
173
- "Connecting to the project database"
174
- )
168
+ msg = "Connecting to the project database"
169
+ Logging . log_error_message ( :error , "InitializingProjectConnection" , msg , socket )
175
170
176
171
{ :error , :token_malformed , msg } ->
177
- Logging . log_error_message ( :error , "MalformedJWT" , msg )
172
+ Logging . log_error_message ( :error , "MalformedJWT" , msg , socket )
178
173
179
174
{ :error , invalid_exp } when is_integer ( invalid_exp ) and invalid_exp <= 0 ->
180
- Logging . log_error_with_token_metadata (
181
- "InvalidJWTToken" ,
182
- "Token expiration time is invalid" ,
183
- socket . assigns . access_token
184
- )
175
+ Logging . log_error_with_token_metadata ( "InvalidJWTToken" , "Token expiration time is invalid" , socket )
185
176
186
177
{ :error , :private_only } ->
187
- Logging . log_error_message (
188
- :error ,
189
- "PrivateOnly" ,
190
- "This project only allows private channels"
191
- )
178
+ Logging . log_error_message ( :error , "PrivateOnly" , "This project only allows private channels" , socket )
192
179
193
180
{ :error , :tenant_not_found } ->
194
- Logging . log_error_message (
195
- :error ,
196
- "TenantNotFound" ,
197
- "Tenant with the given ID does not exist"
198
- )
181
+ Logging . log_error_message ( :error , "TenantNotFound" , "Tenant with the given ID does not exist" , socket )
199
182
200
183
{ :error , :tenant_suspended } ->
201
- Logging . log_error_message (
202
- :error ,
203
- "RealtimeDisabledForTenant" ,
204
- "Realtime disabled for this tenant"
205
- )
184
+ Logging . log_error_message ( :error , "RealtimeDisabledForTenant" , "Realtime disabled for this tenant" , socket )
206
185
207
186
{ :error , :signature_error } ->
208
- Logging . log_error_message ( :error , "JwtSignatureError" , "Failed to validate JWT signature" )
187
+ Logging . log_error_message ( :error , "JwtSignatureError" , "Failed to validate JWT signature" , socket )
209
188
210
189
{ :error , :shutdown_in_progress } ->
211
- Logging . log_error_message (
212
- :error ,
213
- "RealtimeRestarting" ,
214
- "Realtime is restarting, please standby"
215
- )
190
+ Logging . log_error_message ( :error , "RealtimeRestarting" , "Realtime is restarting, please standby" , socket )
216
191
217
192
{ :error , error } ->
218
- Logging . log_error_message ( :error , "UnknownErrorOnChannel" , error )
193
+ Logging . log_error_message ( :error , "UnknownErrorOnChannel" , error , socket )
219
194
{ :error , % { reason: "Unknown Error on Channel" } }
220
195
end
221
196
end
@@ -227,7 +202,7 @@ defmodule RealtimeWeb.RealtimeChannel do
227
202
)
228
203
when avg > max do
229
204
message = "Too many messages per second"
230
-
205
+ Logging . log_error_message ( :warning , "MessagePerSecondRateLimitReached" , message , socket )
231
206
shutdown_response ( socket , message )
232
207
end
233
208
@@ -379,6 +354,7 @@ defmodule RealtimeWeb.RealtimeChannel do
379
354
def handle_in ( _ , _ , % { assigns: % { rate_counter: % { avg: avg } , limits: % { max_events_per_second: max } } } = socket )
380
355
when avg > max do
381
356
message = "Too many messages per second"
357
+ Logging . log_error_message ( :error , "MessagePerSecondRateLimitReached" , message , socket )
382
358
383
359
shutdown_response ( socket , message )
384
360
end
@@ -478,7 +454,7 @@ defmodule RealtimeWeb.RealtimeChannel do
478
454
wait
479
455
end
480
456
481
- def limit_joins ( % { tenant: tenant , limits: limits } ) do
457
+ def limit_joins ( % { assigns: % { tenant: tenant , limits: limits } } = socket ) do
482
458
id = Tenants . joins_per_second_key ( tenant )
483
459
GenCounter . new ( id )
484
460
@@ -501,7 +477,7 @@ defmodule RealtimeWeb.RealtimeChannel do
501
477
{ :error , :too_many_joins }
502
478
503
479
error ->
504
- Logging . log_error_message ( :error , "UnknownErrorOnCounter" , error )
480
+ Logging . log_error_message ( :error , "UnknownErrorOnCounter" , error , socket )
505
481
{ :error , error }
506
482
end
507
483
end
@@ -517,7 +493,7 @@ defmodule RealtimeWeb.RealtimeChannel do
517
493
end
518
494
end
519
495
520
- defp limit_max_users ( % { limits: % { max_concurrent_users: max_conn_users } , tenant: tenant } ) do
496
+ defp limit_max_users ( % { assigns: % { limits: % { max_concurrent_users: max_conn_users } , tenant: tenant } } ) do
521
497
conns = Realtime.UsersCounter . tenant_users ( tenant )
522
498
523
499
if conns < max_conn_users ,
@@ -645,10 +621,9 @@ defmodule RealtimeWeb.RealtimeChannel do
645
621
end
646
622
647
623
defp shutdown_response ( socket , message ) when is_binary ( message ) do
648
- % { assigns: % { channel_name: channel_name , access_token: access_token } } = socket
649
- metadata = log_metadata ( access_token )
624
+ % { assigns: % { channel_name: channel_name } } = socket
650
625
push_system_message ( "system" , socket , "error" , message , channel_name )
651
- log_warning ( "ChannelShutdown" , message , metadata )
626
+ Logging . log_warning_with_token_metadata ( "ChannelShutdown" , message , socket )
652
627
{ :stop , :normal , socket }
653
628
end
654
629
@@ -820,17 +795,4 @@ defmodule RealtimeWeb.RealtimeChannel do
820
795
do: { :error , :private_only } ,
821
796
else: :ok
822
797
end
823
-
824
- defp log_metadata ( access_token ) do
825
- access_token
826
- |> Joken . peek_claims ( )
827
- |> then ( fn
828
- { :ok , claims } -> Map . get ( claims , "sub" )
829
- _ -> nil
830
- end )
831
- |> then ( fn
832
- nil -> [ ]
833
- sub -> [ sub: sub ]
834
- end )
835
- end
836
798
end
0 commit comments