_site/cover/msc_mm_common.COVER.html

1 %% Copyright (c) 2023 Peter Morgan <peter.james.morgan@gmail.com>
2 %%
3 %% Licensed under the Apache License, Version 2.0 (the "License");
4 %% you may not use this file except in compliance with the License.
5 %% You may obtain a copy of the License at
6 %%
7 %% http://www.apache.org/licenses/LICENSE-2.0
8 %%
9 %% Unless required by applicable law or agreed to in writing, software
10 %% distributed under the License is distributed on an "AS IS" BASIS,
11 %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 %% See the License for the specific language governing permissions and
13 %% limitations under the License.
14
15 %% @doc Internal events that are common for all middlemen.
16
17 -module(msc_mm_common).
18
19
20 -export([callback_mode/0]).
21 -export([handle_event/4]).
22 -import(msc_statem, [nei/1]).
23 -include_lib("kernel/include/logger.hrl").
24
25
26 callback_mode() ->
27
:-(
handle_event_function.
28
29
30 handle_event(internal,
31 {send = Command, #{packet := #{} = Packet} = Decoded},
32 _,
33 #{requests := Requests,
34 encoder := Encoder,
35 socket := Socket} = Data) ->
36 13 Encoded = Encoder(Decoded),
37 13 ?LOG_DEBUG(#{decoded => Decoded, encoded => Encoded}),
38 13 {keep_state,
39 Data#{requests := msc_socket:send(
40 #{server_ref => Socket,
41 label => {?MODULE, Command},
42 message => Encoded,
43 requests => Requests})},
44 nei({telemetry,
45 Command,
46 maps:merge(
47 #{count => 1},
48 maps:with([action], Packet))})};
49
50 handle_event(internal,
51 {send = Command, Decoded},
52 _,
53 #{requests := Requests,
54 encoder := Encoder,
55 socket := Socket} = Data) ->
56 1 Encoded = Encoder(Decoded),
57 1 ?LOG_DEBUG(#{decoded => Decoded, encoded => Encoded}),
58 1 {keep_state,
59 Data#{requests := msc_socket:send(
60 #{server_ref => Socket,
61 label => {?MODULE, Command},
62 message => Encoded,
63 requests => Requests})}};
64
65 handle_event(internal,
66 upgrade = Command,
67 _,
68 #{requests := Requests,
69 socket := Socket} = Data) ->
70 2 {keep_state,
71 Data#{requests := msc_socket:upgrade(
72 #{server_ref => Socket,
73 label => {?MODULE, Command},
74 requests => Requests})},
75 nei({telemetry, Command, #{count => 1}})};
76
77 handle_event(internal, {response, #{label := {?MODULE, _}, reply := ok}}, _, _) ->
78 14 keep_state_and_data;
79
80 handle_event(internal, {response, #{label := msc_socket, reply := ok}}, _, _) ->
81 2 keep_state_and_data;
82
83 handle_event(info, Msg, _, #{requests := Existing} = Data) ->
84 18 case gen_statem:check_response(Msg, Existing, true) of
85 {{reply, Reply}, Label, Updated} ->
86 18 {keep_state,
87 Data#{requests := Updated},
88 [nei({telemetry,
89 reqids_size,
90 #{value => gen_statem:reqids_size(Updated)}}),
91 nei({response, #{label => Label, reply => Reply}})]};
92
93 {{error, {Reason, _}}, _, UpdatedRequests} ->
94
:-(
{stop, Reason, Data#{requests := UpdatedRequests}}
95 end;
96
97 handle_event({call, From},
98 {recv = Command,
99 <<Length:24/little, _:8, _:Length/bytes>> = Encoded},
100 _,
101 #{decoder := Decoder}) ->
102 22 ?LOG_DEBUG(#{encoded => Encoded}),
103
104 22 case Decoder(Encoded) of
105 {<<>>,
106 #{packet := #{action := log_event,
107 header := #{event_type := Action}}} = Decoded} ->
108
:-(
?LOG_DEBUG(#{decoded => Decoded}),
109
:-(
{keep_state_and_data,
110 [{reply, From, ok},
111 nei({telemetry,
112 Command,
113 #{count => 1, action => Action}}),
114 nei({Command, Decoded})]};
115
116 {<<>>, #{packet := Packet} = Decoded} ->
117 22 ?LOG_DEBUG(#{decoded => Decoded}),
118 22 {keep_state_and_data,
119 [{reply, From, ok},
120 nei({telemetry,
121 Command,
122 maps:merge(
123 #{count => 1},
124 maps:with([action], Packet))}),
125 nei({Command, Decoded})]};
126
127 nomatch ->
128
:-(
?LOG_WARNING(#{nomatch => Encoded}),
129
:-(
{keep_state_and_data,
130 [{reply, From, ok},
131 nei({telemetry, Command, #{error => 1}})]}
132 end;
133
134 handle_event(internal,
135 {telemetry, EventName, Measurements},
136 _,
137 _) ->
138 55 {keep_state_and_data,
139 nei({telemetry, EventName, Measurements, #{}})};
140
141 handle_event(internal,
142 {telemetry, EventName, Measurements, Metadata},
143 _,
144 _) when is_atom(EventName) ->
145 55 {keep_state_and_data,
146 nei({telemetry, [EventName], Measurements, Metadata})};
147
148 handle_event(internal,
149 {telemetry, EventName, Measurements, Metadata},
150 _,
151 Data) ->
152 55 ok = telemetry:execute([msc, mm] ++ EventName,
153 Measurements,
154 maps:merge(
155 maps:with([operator, client_flags], Data),
156 Metadata)),
157 55 keep_state_and_data.
Line Hits Source