diff --git a/.ci/docker-compose-file/docker-compose-ldap.yaml b/.ci/docker-compose-file/docker-compose-ldap.yaml index f92df47a0..03627c763 100644 --- a/.ci/docker-compose-file/docker-compose-ldap.yaml +++ b/.ci/docker-compose-file/docker-compose-ldap.yaml @@ -6,8 +6,6 @@ services: build: context: ../.. dockerfile: .ci/docker-compose-file/openldap/Dockerfile - args: - LDAP_TAG: ${LDAP_TAG} image: openldap #ports: # - 389:389 diff --git a/.ci/docker-compose-file/openldap/Dockerfile b/.ci/docker-compose-file/openldap/Dockerfile index dd0114b64..9eba7b3a5 100644 --- a/.ci/docker-compose-file/openldap/Dockerfile +++ b/.ci/docker-compose-file/openldap/Dockerfile @@ -1,13 +1,4 @@ -FROM buildpack-deps:bookworm - -ARG LDAP_TAG=2.5.16 - -RUN apt-get update && apt-get install -y groff groff-base -RUN wget https://www.openldap.org/software/download/OpenLDAP/openldap-release/openldap-${LDAP_TAG}.tgz \ - && tar xvzf openldap-${LDAP_TAG}.tgz \ - && cd openldap-${LDAP_TAG} \ - && ./configure && make depend && make && make install \ - && cd .. && rm -rf openldap-${LDAP_TAG} +FROM docker.io/zmstone/openldap:2.5.16 COPY .ci/docker-compose-file/openldap/slapd.conf /usr/local/etc/openldap/slapd.conf COPY apps/emqx_ldap/test/data/emqx.io.ldif /usr/local/etc/openldap/schema/emqx.io.ldif diff --git a/.ci/docker-compose-file/openldap/slapd.conf b/.ci/docker-compose-file/openldap/slapd.conf index d6ba20caa..984cf3b4c 100644 --- a/.ci/docker-compose-file/openldap/slapd.conf +++ b/.ci/docker-compose-file/openldap/slapd.conf @@ -1,14 +1,13 @@ include /usr/local/etc/openldap/schema/core.schema include /usr/local/etc/openldap/schema/cosine.schema include /usr/local/etc/openldap/schema/inetorgperson.schema -include /usr/local/etc/openldap/schema/ppolicy.schema include /usr/local/etc/openldap/schema/emqx.schema TLSCACertificateFile /usr/local/etc/openldap/cacert.pem TLSCertificateFile /usr/local/etc/openldap/cert.pem TLSCertificateKeyFile /usr/local/etc/openldap/key.pem -database bdb +database mdb suffix "dc=emqx,dc=io" rootdn "cn=root,dc=emqx,dc=io" rootpw {SSHA}eoF7NhNrejVYYyGHqnt+MdKNBh4r1w3W diff --git a/.github/workflows/build_packages.yaml b/.github/workflows/build_packages.yaml index d482d2c0e..2292eb545 100644 --- a/.github/workflows/build_packages.yaml +++ b/.github/workflows/build_packages.yaml @@ -280,7 +280,7 @@ jobs: name: ${{ matrix.profile }} path: packages/${{ matrix.profile }} - name: install dos2unix - run: sudo apt-get update && sudo apt install -y dos2unix + run: sudo apt-get update -y && sudo apt install -y dos2unix - name: get packages run: | set -eu diff --git a/.github/workflows/run_emqx_app_tests.yaml b/.github/workflows/run_emqx_app_tests.yaml index 72fe2b0d5..e062cef2e 100644 --- a/.github/workflows/run_emqx_app_tests.yaml +++ b/.github/workflows/run_emqx_app_tests.yaml @@ -55,7 +55,7 @@ jobs: cd apps/emqx ./rebar3 xref ./rebar3 dialyzer - ./rebar3 eunit -v + ./rebar3 eunit -v --name 'eunit@127.0.0.1' ./rebar3 as standalone_test ct --name 'test@127.0.0.1' -v --readable=true ./rebar3 proper -d test/props - uses: actions/upload-artifact@v3 diff --git a/Makefile b/Makefile index e4470c5f5..42ae88e95 100644 --- a/Makefile +++ b/Makefile @@ -15,8 +15,8 @@ endif # Dashboard version # from https://github.com/emqx/emqx-dashboard5 -export EMQX_DASHBOARD_VERSION ?= v1.4.1 -export EMQX_EE_DASHBOARD_VERSION ?= e1.2.1 +export EMQX_DASHBOARD_VERSION ?= v1.5.0 +export EMQX_EE_DASHBOARD_VERSION ?= e1.3.0 # `:=` should be used here, otherwise the `$(shell ...)` will be executed every time when the variable is used # In make 4.4+, for backward-compatibility the value from the original environment is used. @@ -75,7 +75,7 @@ mix-deps-get: $(ELIXIR_COMMON_DEPS) .PHONY: eunit eunit: $(REBAR) merge-config - @ENABLE_COVER_COMPILE=1 $(REBAR) eunit -v -c --cover_export_name $(CT_COVER_EXPORT_PREFIX)-eunit + @ENABLE_COVER_COMPILE=1 $(REBAR) eunit --name eunit@127.0.0.1 -v -c --cover_export_name $(CT_COVER_EXPORT_PREFIX)-eunit .PHONY: proper proper: $(REBAR) diff --git a/apps/emqx/etc/ssl_dist.conf b/apps/emqx/etc/ssl_dist.conf index b4c16e2cc..82c523534 100644 --- a/apps/emqx/etc/ssl_dist.conf +++ b/apps/emqx/etc/ssl_dist.conf @@ -1,6 +1,6 @@ %% This additional config file is used when the config 'cluster.proto_dist' in emqx.conf is set to 'inet_tls'. %% Which means the EMQX nodes will connect to each other over TLS. -%% For more information about inter-broker security, see: https://docs.emqx.com/en/enterprise/v5.0/deploy/cluster/security.html +%% For more information about inter-broker security, see: https://docs.emqx.com/en/enterprise/v5.3/deploy/cluster/security.html %% For more information in technical details see: http://erlang.org/doc/apps/ssl/ssl_distribution.html diff --git a/apps/emqx/include/emqx_release.hrl b/apps/emqx/include/emqx_release.hrl index 9b6252efb..e77ff8656 100644 --- a/apps/emqx/include/emqx_release.hrl +++ b/apps/emqx/include/emqx_release.hrl @@ -32,10 +32,10 @@ %% `apps/emqx/src/bpapi/README.md' %% Opensource edition --define(EMQX_RELEASE_CE, "5.2.1"). +-define(EMQX_RELEASE_CE, "5.3.0"). %% Enterprise edition --define(EMQX_RELEASE_EE, "5.3.0-alpha.1"). +-define(EMQX_RELEASE_EE, "5.3.0"). %% The HTTP API version -define(EMQX_API_VERSION, "5.0"). diff --git a/apps/emqx/include/logger.hrl b/apps/emqx/include/logger.hrl index 9bff4b293..d803f67be 100644 --- a/apps/emqx/include/logger.hrl +++ b/apps/emqx/include/logger.hrl @@ -61,7 +61,7 @@ ) end). --define(AUDIT(_Level_, _Msg_, _Meta_), begin +-define(AUDIT(_Level_, _From_, _Meta_), begin case emqx_config:get([log, audit], #{enable => false}) of #{enable := false} -> ok; @@ -71,8 +71,8 @@ end). emqx_trace:log( _Level_, [{emqx_audit, fun(L, _) -> L end, undefined, undefined}], - {report, _Msg_}, - _Meta_ + _Msg = undefined, + _Meta_#{from => _From_} ); gt -> ok diff --git a/apps/emqx/rebar.config.script b/apps/emqx/rebar.config.script index 96d19b6d0..db54b6177 100644 --- a/apps/emqx/rebar.config.script +++ b/apps/emqx/rebar.config.script @@ -24,7 +24,7 @@ IsQuicSupp = fun() -> end, Bcrypt = {bcrypt, {git, "https://github.com/emqx/erlang-bcrypt.git", {tag, "0.6.0"}}}, -Quicer = {quicer, {git, "https://github.com/emqx/quic.git", {tag, "0.0.200"}}}. +Quicer = {quicer, {git, "https://github.com/emqx/quic.git", {tag, "0.0.201"}}}. Dialyzer = fun(Config) -> {dialyzer, OldDialyzerConfig} = lists:keyfind(dialyzer, 1, Config), diff --git a/apps/emqx/src/config/emqx_config_logger.erl b/apps/emqx/src/config/emqx_config_logger.erl index 070fa6f32..c675edb52 100644 --- a/apps/emqx/src/config/emqx_config_logger.erl +++ b/apps/emqx/src/config/emqx_config_logger.erl @@ -151,13 +151,22 @@ tr_file_handlers(Conf) -> lists:map(fun tr_file_handler/1, Handlers). tr_file_handler({HandlerName, SubConf}) -> + FilePath = conf_get("path", SubConf), + RotationCount = conf_get("rotation_count", SubConf), + RotationSize = conf_get("rotation_size", SubConf), + Type = + case RotationSize of + infinity -> halt; + _ -> wrap + end, + HandlerConf = log_handler_conf(SubConf), {handler, atom(HandlerName), logger_disk_log_h, #{ level => conf_get("level", SubConf), - config => (log_handler_conf(SubConf))#{ - type => wrap, - file => conf_get("path", SubConf), - max_no_files => conf_get("rotation_count", SubConf), - max_no_bytes => conf_get("rotation_size", SubConf) + config => HandlerConf#{ + type => Type, + file => FilePath, + max_no_files => RotationCount, + max_no_bytes => RotationSize }, formatter => log_formatter(HandlerName, SubConf), filters => log_filter(HandlerName, SubConf), @@ -216,38 +225,26 @@ log_formatter(HandlerName, Conf) -> end, SingleLine = conf_get("single_line", Conf), Depth = conf_get("max_depth", Conf), + Format = + case HandlerName of + ?AUDIT_HANDLER -> + json; + _ -> + conf_get("formatter", Conf) + end, do_formatter( - HandlerName, conf_get("formatter", Conf), CharsLimit, SingleLine, TimeOffSet, Depth + Format, CharsLimit, SingleLine, TimeOffSet, Depth ). %% helpers -do_formatter(?AUDIT_HANDLER, _, CharsLimit, SingleLine, TimeOffSet, Depth) -> - {emqx_logger_jsonfmt, #{ - template => [ - time, - " [", - level, - "] ", - %% http api - {method, [code, " ", method, " ", operate_id, " ", username, " "], []}, - %% cli - {cmd, [cmd, " "], []}, - msg, - "\n" - ], - chars_limit => CharsLimit, - single_line => SingleLine, - time_offset => TimeOffSet, - depth => Depth - }}; -do_formatter(_, json, CharsLimit, SingleLine, TimeOffSet, Depth) -> +do_formatter(json, CharsLimit, SingleLine, TimeOffSet, Depth) -> {emqx_logger_jsonfmt, #{ chars_limit => CharsLimit, single_line => SingleLine, time_offset => TimeOffSet, depth => Depth }}; -do_formatter(_, text, CharsLimit, SingleLine, TimeOffSet, Depth) -> +do_formatter(text, CharsLimit, SingleLine, TimeOffSet, Depth) -> {emqx_logger_textfmt, #{ template => [time, " [", level, "] ", msg, "\n"], chars_limit => CharsLimit, diff --git a/apps/emqx/src/emqx.app.src b/apps/emqx/src/emqx.app.src index dad9f6e11..f8a02db2e 100644 --- a/apps/emqx/src/emqx.app.src +++ b/apps/emqx/src/emqx.app.src @@ -2,7 +2,7 @@ {application, emqx, [ {id, "emqx"}, {description, "EMQX Core"}, - {vsn, "5.1.12"}, + {vsn, "5.1.13"}, {modules, []}, {registered, []}, {applications, [ diff --git a/apps/emqx/src/emqx_channel.erl b/apps/emqx/src/emqx_channel.erl index e3d65b8ea..4f6d5ac6f 100644 --- a/apps/emqx/src/emqx_channel.erl +++ b/apps/emqx/src/emqx_channel.erl @@ -2007,6 +2007,8 @@ trim_conninfo(ConnInfo) -> %% NOTE %% We remove the peercert because it duplicates what's stored in the socket, %% otherwise it wastes about 1KB per connection. + %% Retrieve with: esockd_transport:peercert(Socket). + %% Decode with APIs exported from esockd_peercert and esockd_ssl peercert ], ConnInfo diff --git a/apps/emqx/src/emqx_config_handler.erl b/apps/emqx/src/emqx_config_handler.erl index a189fc9e5..f38c5563a 100644 --- a/apps/emqx/src/emqx_config_handler.erl +++ b/apps/emqx/src/emqx_config_handler.erl @@ -678,7 +678,7 @@ return_change_result(ConfKeyPath, {{update, Req}, Opts}) -> case Req =/= ?TOMBSTONE_CONFIG_CHANGE_REQ of true -> #{ - config => emqx_config:get(ConfKeyPath), + config => emqx_config:get(ConfKeyPath, undefined), raw_config => return_rawconf(ConfKeyPath, Opts) }; false -> diff --git a/apps/emqx/src/emqx_listeners.erl b/apps/emqx/src/emqx_listeners.erl index 09a1bfc10..9abff250b 100644 --- a/apps/emqx/src/emqx_listeners.erl +++ b/apps/emqx/src/emqx_listeners.erl @@ -437,6 +437,10 @@ do_start_listener(quic, ListenerName, #{bind := Bind} = Opts) -> case maps:get(cacertfile, SSLOpts, undefined) of undefined -> []; + <<>> -> + []; + "" -> + []; CaCertFile -> [{cacertfile, emqx_schema:naive_env_interpolation(CaCertFile)}] end ++ diff --git a/apps/emqx/src/emqx_logger_jsonfmt.erl b/apps/emqx/src/emqx_logger_jsonfmt.erl index 8710032e6..5df4157f4 100644 --- a/apps/emqx/src/emqx_logger_jsonfmt.erl +++ b/apps/emqx/src/emqx_logger_jsonfmt.erl @@ -51,7 +51,8 @@ -type config() :: #{ depth => pos_integer() | unlimited, report_cb => logger:report_cb(), - single_line => boolean() + single_line => boolean(), + chars_limit => unlimited | pos_integer() }. -define(IS_STRING(String), (is_list(String) orelse is_binary(String))). @@ -64,19 +65,17 @@ best_effort_json(Input) -> best_effort_json(Input, [pretty, force_utf8]). best_effort_json(Input, Opts) -> - Config = #{depth => unlimited, single_line => true}, + Config = #{depth => unlimited, single_line => true, chars_limit => unlimited}, JsonReady = best_effort_json_obj(Input, Config), emqx_utils_json:encode(JsonReady, Opts). -spec format(logger:log_event(), config()) -> iodata(). -format(#{level := Level, msg := Msg, meta := Meta} = Event, Config0) when is_map(Config0) -> +format(#{level := Level, msg := Msg, meta := Meta}, Config0) when is_map(Config0) -> Config = add_default_config(Config0), - MsgBin = format(Msg, Meta#{level => Level}, Config), - logger_formatter:format(Event#{msg => {string, MsgBin}}, Config). + [format(Msg, Meta#{level => Level}, Config), "\n"]. -format(Msg, Meta0, Config) -> - Meta = maps:without([time, level], Meta0), - Data0 = +format(Msg, Meta, Config) -> + Data = try maybe_format_msg(Msg, Meta, Config) of Map when is_map(Map) -> maps:merge(Map, Meta); @@ -92,9 +91,10 @@ format(Msg, Meta0, Config) -> fmt_stacktrace => S } end, - Data = maps:without([report_cb], Data0), - emqx_utils_json:encode(json_obj(Data, Config)). + emqx_utils_json:encode(json_obj_root(Data, Config)). +maybe_format_msg(undefined, _Meta, _Config) -> + #{}; maybe_format_msg({report, Report} = Msg, #{report_cb := Cb} = Meta, Config) -> case is_map(Report) andalso Cb =:= ?DEFAULT_FORMATTER of true -> @@ -128,7 +128,7 @@ format_msg({report, Report}, #{report_cb := Fun} = Meta, Config) when is_functio end; format_msg({report, Report}, #{report_cb := Fun}, Config) when is_function(Fun, 2) -> %% a format callback function of arity 2 - case Fun(Report, maps:with([depth, single_line], Config)) of + case Fun(Report, maps:with([depth, single_line, chars_limit], Config)) of Chardata when ?IS_STRING(Chardata) -> try unicode:characters_to_binary(Chardata, utf8) @@ -152,11 +152,13 @@ format_msg({Fmt, Args}, _Meta, Config) -> do_format_msg(Format0, Args, #{ depth := Depth, - single_line := SingleLine + single_line := SingleLine, + chars_limit := Limit }) -> + Opts = chars_limit_to_opts(Limit), Format1 = io_lib:scan_format(Format0, Args), Format = reformat(Format1, Depth, SingleLine), - Text0 = io_lib:build_text(Format, []), + Text0 = io_lib:build_text(Format, Opts), Text = case SingleLine of true -> re:replace(Text0, ",?\r?\n\s*", ", ", [{return, list}, global, unicode]); @@ -164,6 +166,9 @@ do_format_msg(Format0, Args, #{ end, trim(unicode:characters_to_binary(Text, utf8)). +chars_limit_to_opts(unlimited) -> []; +chars_limit_to_opts(Limit) -> [{chars_limit, Limit}]. + %% Get rid of the leading spaces. %% leave alone the trailing spaces. trim(<<$\s, Rest/binary>>) -> trim(Rest); @@ -221,10 +226,6 @@ best_effort_json_obj(Map, Config) -> do_format_msg("~p", [Map], Config) end. -json([], _) -> - ""; -json(<<"">>, _) -> - "\"\""; json(A, _) when is_atom(A) -> atom_to_binary(A, utf8); json(I, _) when is_integer(I) -> I; json(F, _) when is_float(F) -> F; @@ -233,52 +234,76 @@ json(P, C) when is_port(P) -> json(port_to_list(P), C); json(F, C) when is_function(F) -> json(erlang:fun_to_list(F), C); json(B, Config) when is_binary(B) -> best_effort_unicode(B, Config); -json(L, Config) when is_list(L), is_integer(hd(L)) -> - best_effort_unicode(L, Config); json(M, Config) when is_list(M), is_tuple(hd(M)), tuple_size(hd(M)) =:= 2 -> best_effort_json_obj(M, Config); json(L, Config) when is_list(L) -> - [json(I, Config) || I <- L]; + case lists:all(fun erlang:is_binary/1, L) of + true -> + %% string array + L; + false -> + try unicode:characters_to_binary(L, utf8) of + B when is_binary(B) -> B; + _ -> [json(I, Config) || I <- L] + catch + _:_ -> + [json(I, Config) || I <- L] + end + end; json(Map, Config) when is_map(Map) -> best_effort_json_obj(Map, Config); json(Term, Config) -> do_format_msg("~p", [Term], Config). +json_obj_root(Data0, Config) -> + Time = maps:get(time, Data0, undefined), + Level = maps:get(level, Data0, undefined), + Msg1 = + case maps:get(msg, Data0, undefined) of + undefined -> + maps:get('$kind', Data0, undefined); + Msg0 -> + Msg0 + end, + Msg = + case Msg1 of + undefined -> + undefined; + _ -> + json(Msg1, Config) + end, + Mfal = emqx_utils:format_mfal(Data0), + Data = + maps:fold( + fun(K, V, D) -> + {K1, V1} = json_kv(K, V, Config), + [{K1, V1} | D] + end, + [], + maps:without( + [time, gl, file, report_cb, msg, '$kind', mfa, level, line, is_trace], Data0 + ) + ), + lists:filter( + fun({_, V}) -> V =/= undefined end, + [{time, Time}, {level, Level}, {msg, Msg}, {mfa, Mfal}] + ) ++ Data. + json_obj(Data, Config) -> maps:fold( fun(K, V, D) -> - json_kv(K, V, D, Config) + {K1, V1} = json_kv(K, V, Config), + maps:put(K1, V1, D) end, maps:new(), Data ). -json_kv(mfa, {M, F, A}, Data, _Config) -> - maps:put( - mfa, - << - (atom_to_binary(M, utf8))/binary, - $:, - (atom_to_binary(F, utf8))/binary, - $/, - (integer_to_binary(A))/binary - >>, - Data - ); -%% snabbkaffe -json_kv('$kind', Kind, Data, Config) -> - maps:put(msg, json(Kind, Config), Data); -json_kv(gl, _, Data, _Config) -> - %% drop gl because it's not interesting - Data; -json_kv(file, _, Data, _Config) -> - %% drop 'file' because we have mfa - Data; -json_kv(K0, V, Data, Config) -> +json_kv(K0, V, Config) -> K = json_key(K0), case is_map(V) of - true -> maps:put(json(K, Config), best_effort_json_obj(V, Config), Data); - false -> maps:put(json(K, Config), json(V, Config), Data) + true -> {K, best_effort_json_obj(V, Config)}; + false -> {K, json(V, Config)} end. json_key(A) when is_atom(A) -> json_key(atom_to_binary(A, utf8)); @@ -373,23 +398,83 @@ p_config() -> proper_types:shrink_list( [ {depth, p_limit()}, - {single_line, proper_types:boolean()} + {single_line, proper_types:boolean()}, + {chars_limit, p_limit()} ] ). +%% NOTE: pretty-printing format is asserted in the test +%% This affects the CLI output format, consult the team before changing +%% the format. best_effort_json_test() -> ?assertEqual( <<"{\n \n}">>, - emqx_logger_jsonfmt:best_effort_json([]) + best_effort_json([]) ), ?assertEqual( <<"{\n \"key\" : [\n \n ]\n}">>, - emqx_logger_jsonfmt:best_effort_json(#{key => []}) + best_effort_json(#{key => []}) ), ?assertEqual( <<"[\n {\n \"key\" : [\n \n ]\n }\n]">>, - emqx_logger_jsonfmt:best_effort_json([#{key => []}]) + best_effort_json([#{key => []}]) ), ok. +config() -> + #{ + chars_limit => unlimited, + depth => unlimited, + single_line => true + }. + +make_log(Report) -> + #{ + level => info, + msg => Report, + meta => #{time => 1111, report_cb => ?DEFAULT_FORMATTER} + }. + +ensure_json_output_test() -> + JSON = format(make_log({report, #{foo => bar}}), config()), + ?assert(is_map(emqx_utils_json:decode(JSON))), + ok. + +chars_limit_not_applied_on_raw_map_fields_test() -> + Limit = 32, + Len = 100, + LongStr = lists:duplicate(Len, $a), + Config0 = config(), + Config = Config0#{ + chars_limit => Limit + }, + JSON = format(make_log({report, #{foo => LongStr}}), Config), + #{<<"foo">> := LongStr1} = emqx_utils_json:decode(JSON), + ?assertEqual(Len, size(LongStr1)), + ok. + +chars_limit_applied_on_format_result_test() -> + Limit = 32, + Len = 100, + LongStr = lists:duplicate(Len, $a), + Config0 = config(), + Config = Config0#{ + chars_limit => Limit + }, + JSON = format(make_log({string, LongStr}), Config), + #{<<"msg">> := LongStr1} = emqx_utils_json:decode(JSON), + ?assertEqual(Limit, size(LongStr1)), + ok. + +string_array_test() -> + Array = #{<<"arr">> => [<<"a">>, <<"b">>]}, + Encoded = emqx_utils_json:encode(json(Array, config())), + ?assertEqual(Array, emqx_utils_json:decode(Encoded)). + +iolist_test() -> + Iolist = #{iolist => ["a", ["b"]]}, + Concat = #{<<"iolist">> => <<"ab">>}, + Encoded = emqx_utils_json:encode(json(Iolist, config())), + ?assertEqual(Concat, emqx_utils_json:decode(Encoded)). + -endif. diff --git a/apps/emqx/src/emqx_logger_textfmt.erl b/apps/emqx/src/emqx_logger_textfmt.erl index 3dce8a2ec..2e8718c37 100644 --- a/apps/emqx/src/emqx_logger_textfmt.erl +++ b/apps/emqx/src/emqx_logger_textfmt.erl @@ -56,8 +56,7 @@ enrich_report(ReportRaw, Meta) -> end, ClientId = maps:get(clientid, Meta, undefined), Peer = maps:get(peername, Meta, undefined), - MFA = maps:get(mfa, Meta, undefined), - Line = maps:get(line, Meta, undefined), + MFA = emqx_utils:format_mfal(Meta), Msg = maps:get(msg, ReportRaw, undefined), %% turn it into a list so that the order of the fields is determined lists:foldl( @@ -70,8 +69,7 @@ enrich_report(ReportRaw, Meta) -> {topic, try_format_unicode(Topic)}, {clientid, try_format_unicode(ClientId)}, {peername, Peer}, - {line, Line}, - {mfa, mfa(MFA)}, + {mfa, try_format_unicode(MFA)}, {msg, Msg} ] ). @@ -84,7 +82,7 @@ try_format_unicode(Char) -> case unicode:characters_to_list(Char) of {error, _, _} -> error; {incomplete, _, _} -> error; - Binary -> Binary + List1 -> List1 end catch _:_ -> @@ -95,8 +93,8 @@ try_format_unicode(Char) -> _ -> List end. -enrich_mfa({Fmt, Args}, #{mfa := Mfa, line := Line}) when is_list(Fmt) -> - {Fmt ++ " mfa: ~ts line: ~w", Args ++ [mfa(Mfa), Line]}; +enrich_mfa({Fmt, Args}, Data) when is_list(Fmt) -> + {Fmt ++ " mfa: ~ts", Args ++ [emqx_utils:format_mfal(Data)]}; enrich_mfa(Msg, _) -> Msg. @@ -113,6 +111,3 @@ enrich_topic({Fmt, Args}, #{topic := Topic}) when is_list(Fmt) -> {" topic: ~ts" ++ Fmt, [Topic | Args]}; enrich_topic(Msg, _) -> Msg. - -mfa(undefined) -> undefined; -mfa({M, F, A}) -> [atom_to_list(M), ":", atom_to_list(F), "/" ++ integer_to_list(A)]. diff --git a/apps/emqx/src/emqx_rpc.erl b/apps/emqx/src/emqx_rpc.erl index 86ec5937f..4675c3734 100644 --- a/apps/emqx/src/emqx_rpc.erl +++ b/apps/emqx/src/emqx_rpc.erl @@ -43,6 +43,10 @@ erpc_multicall/1 ]). +-ifdef(TEST). +-include_lib("eunit/include/eunit.hrl"). +-endif. + -compile( {inline, [ rpc_node/1, @@ -75,15 +79,15 @@ -spec call(node(), module(), atom(), list()) -> call_result(). call(Node, Mod, Fun, Args) -> - filter_result(gen_rpc:call(rpc_node(Node), Mod, Fun, Args)). + maybe_badrpc(gen_rpc:call(rpc_node(Node), Mod, Fun, Args)). -spec call(term(), node(), module(), atom(), list()) -> call_result(). call(Key, Node, Mod, Fun, Args) -> - filter_result(gen_rpc:call(rpc_node({Key, Node}), Mod, Fun, Args)). + maybe_badrpc(gen_rpc:call(rpc_node({Key, Node}), Mod, Fun, Args)). -spec call(term(), node(), module(), atom(), list(), timeout()) -> call_result(). call(Key, Node, Mod, Fun, Args, Timeout) -> - filter_result(gen_rpc:call(rpc_node({Key, Node}), Mod, Fun, Args, Timeout)). + maybe_badrpc(gen_rpc:call(rpc_node({Key, Node}), Mod, Fun, Args, Timeout)). -spec multicall([node()], module(), atom(), list()) -> multicall_result(). multicall(Nodes, Mod, Fun, Args) -> @@ -127,18 +131,15 @@ rpc_nodes([], Acc) -> rpc_nodes([Node | Nodes], Acc) -> rpc_nodes(Nodes, [rpc_node(Node) | Acc]). -filter_result({Error, Reason}) when - Error =:= badrpc; Error =:= badtcp --> +maybe_badrpc({Error, Reason}) when Error =:= badrpc; Error =:= badtcp -> {badrpc, Reason}; -filter_result(Delivery) -> +maybe_badrpc(Delivery) -> Delivery. max_client_num() -> emqx:get_config([rpc, tcp_client_num], ?DefaultClientNum). -spec unwrap_erpc(emqx_rpc:erpc(A) | [emqx_rpc:erpc(A)]) -> A | {error, _Err} | list(). - unwrap_erpc(Res) when is_list(Res) -> [unwrap_erpc(R) || R <- Res]; unwrap_erpc({ok, A}) -> @@ -151,3 +152,73 @@ unwrap_erpc({exit, Err}) -> {error, Err}; unwrap_erpc({error, {erpc, Err}}) -> {error, Err}. + +-ifdef(TEST). + +badrpc_call_test_() -> + application:ensure_all_started(gen_rpc), + Node = node(), + [ + {"throw", fun() -> + ?assertEqual(foo, call(Node, erlang, throw, [foo])) + end}, + {"error", fun() -> + ?assertMatch({badrpc, {'EXIT', {foo, _}}}, call(Node, erlang, error, [foo])) + end}, + {"exit", fun() -> + ?assertEqual({badrpc, {'EXIT', foo}}, call(Node, erlang, exit, [foo])) + end}, + {"timeout", fun() -> + ?assertEqual({badrpc, timeout}, call(key, Node, timer, sleep, [1000], 100)) + end}, + {"noconnection", fun() -> + %% mute crash report from gen_rpc + logger:set_primary_config(level, critical), + try + ?assertEqual( + {badrpc, nxdomain}, call(key, 'no@such.node', foo, bar, []) + ) + after + logger:set_primary_config(level, notice) + end + end} + ]. + +multicall_test() -> + application:ensure_all_started(gen_rpc), + logger:set_primary_config(level, critical), + BadNode = 'no@such.node', + ThisNode = node(), + Nodes = [ThisNode, BadNode], + Call4 = fun(M, F, A) -> multicall(Nodes, M, F, A) end, + Call5 = fun(Key, M, F, A) -> multicall(Key, Nodes, M, F, A) end, + try + ?assertMatch({[foo], [{BadNode, _}]}, Call4(erlang, throw, [foo])), + ?assertMatch({[], [{ThisNode, _}, {BadNode, _}]}, Call4(erlang, error, [foo])), + ?assertMatch({[], [{ThisNode, _}, {BadNode, _}]}, Call4(erlang, exit, [foo])), + ?assertMatch({[], [{ThisNode, _}, {BadNode, _}]}, Call5(key, foo, bar, [])) + after + logger:set_primary_config(level, notice) + end. + +unwrap_erpc_test_() -> + Nodes = [node()], + MultiC = fun(M, F, A) -> unwrap_erpc(erpc:multicall(Nodes, M, F, A, 100)) end, + [ + {"throw", fun() -> + ?assertEqual([{error, foo}], MultiC(erlang, throw, [foo])) + end}, + {"error", fun() -> + ?assertEqual([{error, foo}], MultiC(erlang, error, [foo])) + end}, + {"exit", fun() -> + ?assertEqual([{error, {exception, foo}}], MultiC(erlang, exit, [foo])) + end}, + {"noconnection", fun() -> + ?assertEqual( + [{error, noconnection}], unwrap_erpc(erpc:multicall(['no@such.node'], foo, bar, [])) + ) + end} + ]. + +-endif. diff --git a/apps/emqx/src/emqx_tls_certfile_gc.erl b/apps/emqx/src/emqx_tls_certfile_gc.erl index 9e2e98b7f..ccac02471 100644 --- a/apps/emqx/src/emqx_tls_certfile_gc.erl +++ b/apps/emqx/src/emqx_tls_certfile_gc.erl @@ -271,9 +271,12 @@ find_config_references(Root) -> is_file_reference(Stack) -> lists:any( fun(KP) -> lists:prefix(lists:reverse(KP), Stack) end, - emqx_tls_lib:ssl_file_conf_keypaths() + conf_keypaths() ). +conf_keypaths() -> + emqx_tls_lib:ssl_file_conf_keypaths(). + mk_fileref(AbsPath) -> case emqx_utils_fs:read_info(AbsPath) of {ok, Info} -> diff --git a/apps/emqx/src/emqx_tls_lib.erl b/apps/emqx/src/emqx_tls_lib.erl index 9113bd5e6..0b9bfe805 100644 --- a/apps/emqx/src/emqx_tls_lib.erl +++ b/apps/emqx/src/emqx_tls_lib.erl @@ -50,11 +50,17 @@ -define(IS_FALSE(Val), ((Val =:= false) orelse (Val =:= <<"false">>))). -define(SSL_FILE_OPT_PATHS, [ + %% common ssl options [<<"keyfile">>], [<<"certfile">>], [<<"cacertfile">>], - [<<"ocsp">>, <<"issuer_pem">>] + %% OCSP + [<<"ocsp">>, <<"issuer_pem">>], + %% SSO + [<<"sp_public_key">>], + [<<"sp_private_key">>] ]). + -define(SSL_FILE_OPT_PATHS_A, [ [keyfile], [certfile], diff --git a/apps/emqx/test/emqx_cth_suite.erl b/apps/emqx/test/emqx_cth_suite.erl index 24105b2b4..5cbca3243 100644 --- a/apps/emqx/test/emqx_cth_suite.erl +++ b/apps/emqx/test/emqx_cth_suite.erl @@ -52,7 +52,7 @@ %% (e.g. in `init_per_suite/1` / `init_per_group/2`), providing the appspecs %% and unique work dir for the testrun (e.g. `work_dir/1`). Save the result %% in a context. -%% 3. Call `emqx_cth_sutie:stop/1` to stop the applications after the testrun +%% 3. Call `emqx_cth_suite:stop/1` to stop the applications after the testrun %% finishes (e.g. in `end_per_suite/1` / `end_per_group/2`), providing the %% result from step 2. -module(emqx_cth_suite). @@ -245,6 +245,9 @@ spec_fmt(ffun, {_, X}) -> X. maybe_configure_app(_App, #{config := false}) -> ok; +maybe_configure_app(_App, AppConfig = #{schema_mod := SchemaModule}) when is_atom(SchemaModule) -> + #{config := Config} = AppConfig, + configure_app(SchemaModule, Config); maybe_configure_app(App, #{config := Config}) -> case app_schema(App) of {ok, SchemaModule} -> diff --git a/apps/emqx/test/emqx_static_checks_data/5.3.bpapi b/apps/emqx/test/emqx_static_checks_data/5.3.bpapi new file mode 100644 index 000000000..0f5f6b76d --- /dev/null +++ b/apps/emqx/test/emqx_static_checks_data/5.3.bpapi @@ -0,0 +1 @@ +#{api => #{{emqx_node_rebalance,2} => #{calls => [{{emqx_node_rebalance_proto_v2,purge_sessions,['Nodes','Count']},{emqx_eviction_agent,purge_sessions,['Count']}},{{emqx_node_rebalance_proto_v2,disable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,disable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v2,enable_rebalance_agent,['Nodes','OwnerPid','Kind']},{emqx_node_rebalance_agent,enable,['OwnerPid','Kind']}},{{emqx_node_rebalance_proto_v2,disconnected_session_counts,['Nodes']},{emqx_node_rebalance,disconnected_session_count,[]}},{{emqx_node_rebalance_proto_v2,disable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,disable,['OwnerPid']}},{{emqx_node_rebalance_proto_v2,enable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,enable,['OwnerPid']}},{{emqx_node_rebalance_proto_v2,session_counts,['Nodes']},{emqx_node_rebalance,session_count,[]}},{{emqx_node_rebalance_proto_v2,connection_counts,['Nodes']},{emqx_node_rebalance,connection_count,[]}},{{emqx_node_rebalance_proto_v2,evict_sessions,['Nodes','Count','RecipientNodes','ConnState']},{emqx_eviction_agent,evict_sessions,['Count','RecipientNodes','ConnState']}},{{emqx_node_rebalance_proto_v2,evict_connections,['Nodes','Count']},{emqx_eviction_agent,evict_connections,['Count']}},{{emqx_node_rebalance_proto_v2,available_nodes,['Nodes']},{emqx_node_rebalance,is_node_available,[]}}],casts => []},{emqx_node_rebalance_purge,1} => #{calls => [{{emqx_node_rebalance_purge_proto_v1,stop,['Nodes']},{emqx_node_rebalance_purge,stop,[]}},{{emqx_node_rebalance_purge_proto_v1,start,['Nodes','Opts']},{emqx_node_rebalance_purge,start,['Opts']}}],casts => []},{emqx_authn,1} => #{calls => [{{emqx_authn_proto_v1,lookup_from_all_nodes,['Nodes','ChainName','AuthenticatorID']},{emqx_authn_api,lookup_from_local_node,['ChainName','AuthenticatorID']}}],casts => []},{emqx_persistent_session_ds,1} => #{calls => [{{emqx_persistent_session_ds_proto_v1,close_all_iterators,['Nodes','DSSessionID']},{emqx_persistent_session_ds,do_ensure_all_iterators_closed,['DSSessionID']}},{{emqx_persistent_session_ds_proto_v1,close_iterator,['Nodes','IteratorID']},{emqx_persistent_session_ds,do_ensure_iterator_closed,['IteratorID']}},{{emqx_persistent_session_ds_proto_v1,open_iterator,['Nodes','TopicFilter','StartMS','IteratorID']},{emqx_persistent_session_ds,do_open_iterator,['TopicFilter','StartMS','IteratorID']}}],casts => []},{emqx_delayed,1} => #{calls => [{{emqx_delayed_proto_v1,delete_delayed_message,['Node','Id']},{emqx_delayed,delete_delayed_message,['Id']}},{{emqx_delayed_proto_v1,get_delayed_message,['Node','Id']},{emqx_delayed,get_delayed_message,['Id']}}],casts => []},{emqx_conf,2} => #{calls => [{{emqx_conf_proto_v2,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v2,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v2,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v2,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v2,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v2,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v2,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}},{{emqx_conf_proto_v2,sync_data_from_node,['Node']},{emqx_conf_app,sync_data_from_node,[]}}],casts => []},{emqx_license,1} => #{calls => [{{emqx_license_proto_v1,remote_connection_counts,['Nodes']},{emqx_license_resources,local_connection_count,[]}}],casts => []},{emqx_delayed,2} => #{calls => [{{emqx_delayed_proto_v2,clear_all,['Nodes']},{emqx_delayed,clear_all_local,[]}},{{emqx_delayed_proto_v2,delete_delayed_message,['Node','Id']},{emqx_delayed,delete_delayed_message,['Id']}},{{emqx_delayed_proto_v2,get_delayed_message,['Node','Id']},{emqx_delayed,get_delayed_message,['Id']}}],casts => []},{emqx_gateway_api_listeners,1} => #{calls => [{{emqx_gateway_api_listeners_proto_v1,listeners_cluster_status,['Nodes','Listeners']},{emqx_gateway_api_listeners,do_listeners_cluster_status,['Listeners']}}],casts => []},{emqx_node_rebalance,1} => #{calls => [{{emqx_node_rebalance_proto_v1,disconnected_session_counts,['Nodes']},{emqx_node_rebalance,disconnected_session_count,[]}},{{emqx_node_rebalance_proto_v1,disable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,disable,['OwnerPid']}},{{emqx_node_rebalance_proto_v1,enable_rebalance_agent,['Nodes','OwnerPid']},{emqx_node_rebalance_agent,enable,['OwnerPid']}},{{emqx_node_rebalance_proto_v1,session_counts,['Nodes']},{emqx_node_rebalance,session_count,[]}},{{emqx_node_rebalance_proto_v1,connection_counts,['Nodes']},{emqx_node_rebalance,connection_count,[]}},{{emqx_node_rebalance_proto_v1,evict_sessions,['Nodes','Count','RecipientNodes','ConnState']},{emqx_eviction_agent,evict_sessions,['Count','RecipientNodes','ConnState']}},{{emqx_node_rebalance_proto_v1,evict_connections,['Nodes','Count']},{emqx_eviction_agent,evict_connections,['Count']}},{{emqx_node_rebalance_proto_v1,available_nodes,['Nodes']},{emqx_node_rebalance,is_node_available,[]}}],casts => []},{emqx_mgmt_api_plugins,1} => #{calls => [{{emqx_mgmt_api_plugins_proto_v1,ensure_action,['Name','Action']},{emqx_mgmt_api_plugins,ensure_action,['Name','Action']}},{{emqx_mgmt_api_plugins_proto_v1,delete_package,['Name']},{emqx_mgmt_api_plugins,delete_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v1,describe_package,['Name']},{emqx_mgmt_api_plugins,describe_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v1,install_package,['Filename','Bin']},{emqx_mgmt_api_plugins,install_package,['Filename','Bin']}},{{emqx_mgmt_api_plugins_proto_v1,get_plugins,[]},{emqx_mgmt_api_plugins,get_plugins,[]}}],casts => []},{emqx_management,4} => #{calls => [{{emqx_management_proto_v4,kickout_clients,['Node','ClientIds']},{emqx_mgmt,do_kickout_clients,['ClientIds']}},{{emqx_management_proto_v4,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v4,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v4,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v4,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v4,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v4,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v4,broker_info,['Nodes']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v4,node_info,['Nodes']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v4,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_mgmt_trace,2} => #{calls => [{{emqx_mgmt_trace_proto_v2,read_trace_file,['Node','Name','Position','Limit']},{emqx_mgmt_api_trace,read_trace_file,['Name','Position','Limit']}},{{emqx_mgmt_trace_proto_v2,trace_file_detail,['Nodes','File']},{emqx_trace,trace_file_detail,['File']}},{{emqx_mgmt_trace_proto_v2,trace_file,['Nodes','File']},{emqx_trace,trace_file,['File']}},{{emqx_mgmt_trace_proto_v2,get_trace_size,['Nodes']},{emqx_mgmt_api_trace,get_trace_size,[]}}],casts => []},{emqx_node_rebalance_status,2} => #{calls => [{{emqx_node_rebalance_status_proto_v2,purge_status,['Nodes']},{emqx_node_rebalance_status,purge_status,[]}},{{emqx_node_rebalance_status_proto_v2,evacuation_status,['Nodes']},{emqx_node_rebalance_status,evacuation_status,[]}},{{emqx_node_rebalance_status_proto_v2,rebalance_status,['Nodes']},{emqx_node_rebalance_status,rebalance_status,[]}},{{emqx_node_rebalance_status_proto_v2,local_status,['Node']},{emqx_node_rebalance_status,local_status,[]}}],casts => []},{emqx_bridge,1} => #{calls => [{{emqx_bridge_proto_v1,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v1,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_mgmt_cluster,2} => #{calls => [{{emqx_mgmt_cluster_proto_v2,connected_replicants,['Nodes']},{emqx_mgmt_api_cluster,connected_replicants,[]}},{{emqx_mgmt_cluster_proto_v2,invite_node,['Node','Self']},{emqx_mgmt_api_cluster,join,['Self']}}],casts => []},{emqx_management,2} => #{calls => [{{emqx_management_proto_v2,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v2,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v2,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v2,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v2,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v2,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v2,broker_info,['Node']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v2,node_info,['Node']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v2,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx,1} => #{calls => [{{emqx_proto_v1,delete_all_deactivated_alarms,['Node']},{emqx_alarm,delete_all_deactivated_alarms,[]}},{{emqx_proto_v1,deactivate_alarm,['Node','Name']},{emqx_alarm,deactivate,['Name']}},{{emqx_proto_v1,clean_pem_cache,['Node']},{ssl_pem_cache,clear,[]}},{{emqx_proto_v1,clean_authz_cache,['Node']},{emqx_authz_cache,drain_cache,[]}},{{emqx_proto_v1,clean_authz_cache,['Node','ClientId']},{emqx_authz_cache,drain_cache,['ClientId']}},{{emqx_proto_v1,get_metrics,['Node']},{emqx_metrics,all,[]}},{{emqx_proto_v1,get_stats,['Node']},{emqx_stats,getstats,[]}},{{emqx_proto_v1,get_alarms,['Node','Type']},{emqx_alarm,get_alarms,['Type']}},{{emqx_proto_v1,is_running,['Node']},{emqx,is_running,[]}}],casts => []},{emqx_shared_sub,1} => #{calls => [{{emqx_shared_sub_proto_v1,dispatch_with_ack,['Pid','Group','Topic','Msg','Timeout']},{emqx_shared_sub,do_dispatch_with_ack,['Pid','Group','Topic','Msg']}}],casts => [{{emqx_shared_sub_proto_v1,send,['Node','Pid','Topic','Msg']},{erlang,send,['Pid','Msg']}}]},{emqx_eviction_agent,1} => #{calls => [{{emqx_eviction_agent_proto_v1,evict_session_channel,['Node','ClientId','ConnInfo','ClientInfo']},{emqx_eviction_agent,evict_session_channel,['ClientId','ConnInfo','ClientInfo']}}],casts => []},{emqx_mgmt_cluster,1} => #{calls => [{{emqx_mgmt_cluster_proto_v1,invite_node,['Node','Self']},{emqx_mgmt_api_cluster,join,['Self']}}],casts => []},{emqx_metrics,1} => #{calls => [{{emqx_metrics_proto_v1,get_metrics,['Nodes','HandlerName','MetricId','Timeout']},{emqx_metrics_worker,get_metrics,['HandlerName','MetricId']}}],casts => []},{emqx_topic_metrics,1} => #{calls => [{{emqx_topic_metrics_proto_v1,reset,['Nodes','Topic']},{emqx_topic_metrics,reset,['Topic']}},{{emqx_topic_metrics_proto_v1,reset,['Nodes']},{emqx_topic_metrics,reset,[]}},{{emqx_topic_metrics_proto_v1,metrics,['Nodes','Topic']},{emqx_topic_metrics,metrics,['Topic']}},{{emqx_topic_metrics_proto_v1,metrics,['Nodes']},{emqx_topic_metrics,metrics,[]}}],casts => []},{emqx_management,3} => #{calls => [{{emqx_management_proto_v3,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v3,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v3,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v3,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v3,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v3,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v3,broker_info,['Nodes']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v3,node_info,['Nodes']},{emqx_mgmt,node_info,[]}},{{emqx_management_proto_v3,unsubscribe_batch,['Node','ClientId','Topics']},{emqx_mgmt,do_unsubscribe_batch,['ClientId','Topics']}}],casts => []},{emqx_plugins,1} => #{calls => [{{emqx_plugins_proto_v1,get_tar,['Node','NameVsn','Timeout']},{emqx_plugins,get_tar,['NameVsn']}}],casts => []},{emqx_resource,1} => #{calls => [{{emqx_resource_proto_v1,reset_metrics,['ResId']},{emqx_resource,reset_metrics_local,['ResId']}},{{emqx_resource_proto_v1,remove,['ResId']},{emqx_resource,remove_local,['ResId']}},{{emqx_resource_proto_v1,recreate,['ResId','ResourceType','Config','Opts']},{emqx_resource,recreate_local,['ResId','ResourceType','Config','Opts']}},{{emqx_resource_proto_v1,create_dry_run,['ResourceType','Config']},{emqx_resource,create_dry_run_local,['ResourceType','Config']}},{{emqx_resource_proto_v1,create,['ResId','Group','ResourceType','Config','Opts']},{emqx_resource,create_local,['ResId','Group','ResourceType','Config','Opts']}}],casts => []},{emqx_conf,3} => #{calls => [{{emqx_conf_proto_v3,get_hocon_config,['Node','Key']},{emqx_conf_cli,get_config,['Key']}},{{emqx_conf_proto_v3,get_hocon_config,['Node']},{emqx_conf_cli,get_config,[]}},{{emqx_conf_proto_v3,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v3,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v3,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v3,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v3,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v3,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v3,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}},{{emqx_conf_proto_v3,sync_data_from_node,['Node']},{emqx_conf_app,sync_data_from_node,[]}}],casts => []},{emqx,2} => #{calls => [{{emqx_proto_v2,delete_all_deactivated_alarms,['Node']},{emqx_alarm,delete_all_deactivated_alarms,[]}},{{emqx_proto_v2,deactivate_alarm,['Node','Name']},{emqx_alarm,deactivate,['Name']}},{{emqx_proto_v2,clean_pem_cache,['Node']},{ssl_pem_cache,clear,[]}},{{emqx_proto_v2,clean_authz_cache,['Node']},{emqx_authz_cache,drain_cache,[]}},{{emqx_proto_v2,clean_authz_cache,['Node','ClientId']},{emqx_authz_cache,drain_cache,['ClientId']}},{{emqx_proto_v2,get_metrics,['Node']},{emqx_metrics,all,[]}},{{emqx_proto_v2,get_stats,['Node']},{emqx_stats,getstats,[]}},{{emqx_proto_v2,get_alarms,['Node','Type']},{emqx_alarm,get_alarms,['Type']}},{{emqx_proto_v2,are_running,['Nodes']},{emqx,is_running,[]}},{{emqx_proto_v2,is_running,['Node']},{emqx,is_running,[]}}],casts => []},{emqx_node_rebalance_status,1} => #{calls => [{{emqx_node_rebalance_status_proto_v1,evacuation_status,['Nodes']},{emqx_node_rebalance_status,evacuation_status,[]}},{{emqx_node_rebalance_status_proto_v1,rebalance_status,['Nodes']},{emqx_node_rebalance_status,rebalance_status,[]}},{{emqx_node_rebalance_status_proto_v1,local_status,['Node']},{emqx_node_rebalance_status,local_status,[]}}],casts => []},{emqx_gateway_http,1} => #{calls => [{{emqx_gateway_http_proto_v1,get_cluster_status,['Nodes','GwName']},{emqx_gateway_http,gateway_status,['GwName']}}],casts => []},{emqx_eviction_agent,2} => #{calls => [{{emqx_eviction_agent_proto_v2,all_channels_count,['Nodes','Timeout']},{emqx_eviction_agent,all_local_channels_count,[]}},{{emqx_eviction_agent_proto_v2,evict_session_channel,['Node','ClientId','ConnInfo','ClientInfo']},{emqx_eviction_agent,evict_session_channel,['ClientId','ConnInfo','ClientInfo']}}],casts => []},{emqx_conf,1} => #{calls => [{{emqx_conf_proto_v1,get_override_config_file,['Nodes']},{emqx_conf_app,get_override_config_file,[]}},{{emqx_conf_proto_v1,reset,['Node','KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,reset,['KeyPath','Opts']},{emqx,reset_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,remove_config,['Node','KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,remove_config,['KeyPath','Opts']},{emqx,remove_config,['KeyPath','Opts']}},{{emqx_conf_proto_v1,update,['Node','KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v1,update,['KeyPath','UpdateReq','Opts']},{emqx,update_config,['KeyPath','UpdateReq','Opts']}},{{emqx_conf_proto_v1,get_all,['KeyPath']},{emqx_conf,get_node_and_config,['KeyPath']}},{{emqx_conf_proto_v1,get_config,['Node','KeyPath','Default']},{emqx,get_config,['KeyPath','Default']}},{{emqx_conf_proto_v1,get_config,['Node','KeyPath']},{emqx,get_config,['KeyPath']}}],casts => []},{emqx_cm,1} => #{calls => [{{emqx_cm_proto_v1,kick_session,['Action','ClientId','ChanPid']},{emqx_cm,do_kick_session,['Action','ClientId','ChanPid']}},{{emqx_cm_proto_v1,takeover_session,['ClientId','ChanPid']},{emqx_cm,takeover_session,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chann_conn_mod,['ClientId','ChanPid']},{emqx_cm,do_get_chann_conn_mod,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chan_info,['ClientId','ChanPid']},{emqx_cm,do_get_chan_info,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,get_chan_stats,['ClientId','ChanPid']},{emqx_cm,do_get_chan_stats,['ClientId','ChanPid']}},{{emqx_cm_proto_v1,lookup_client,['Node','Key']},{emqx_cm,lookup_client,['Key']}},{{emqx_cm_proto_v1,kickout_client,['Node','ClientId']},{emqx_cm,kick_session,['ClientId']}}],casts => []},{emqx_management,1} => #{calls => [{{emqx_management_proto_v1,get_full_config,['Node']},{emqx_mgmt_api_configs,get_full_config,[]}},{{emqx_management_proto_v1,call_client,['Node','ClientId','Req']},{emqx_mgmt,do_call_client,['ClientId','Req']}},{{emqx_management_proto_v1,unsubscribe,['Node','ClientId','Topic']},{emqx_mgmt,do_unsubscribe,['ClientId','Topic']}},{{emqx_management_proto_v1,subscribe,['Node','ClientId','TopicTables']},{emqx_mgmt,do_subscribe,['ClientId','TopicTables']}},{{emqx_management_proto_v1,list_listeners,['Node']},{emqx_mgmt_api_listeners,do_list_listeners,[]}},{{emqx_management_proto_v1,list_subscriptions,['Node']},{emqx_mgmt,do_list_subscriptions,[]}},{{emqx_management_proto_v1,broker_info,['Node']},{emqx_mgmt,broker_info,[]}},{{emqx_management_proto_v1,node_info,['Node']},{emqx_mgmt,node_info,[]}}],casts => []},{emqx_slow_subs,1} => #{calls => [{{emqx_slow_subs_proto_v1,get_history,['Nodes']},{emqx_slow_subs_api,get_history,[]}},{{emqx_slow_subs_proto_v1,clear_history,['Nodes']},{emqx_slow_subs,clear_history,[]}}],casts => []},{emqx_ft_storage_fs_reader,1} => #{calls => [{{emqx_ft_storage_fs_reader_proto_v1,read,['Node','Pid','Bytes']},{emqx_ft_storage_fs_reader,read,['Pid','Bytes']}}],casts => []},{emqx_prometheus,1} => #{calls => [{{emqx_prometheus_proto_v1,stop,['Nodes']},{emqx_prometheus,do_stop,[]}},{{emqx_prometheus_proto_v1,start,['Nodes']},{emqx_prometheus,do_start,[]}}],casts => []},{emqx_cm,2} => #{calls => [{{emqx_cm_proto_v2,kick_session,['Action','ClientId','ChanPid']},{emqx_cm,do_kick_session,['Action','ClientId','ChanPid']}},{{emqx_cm_proto_v2,takeover_finish,['ConnMod','ChanPid']},{emqx_cm,takeover_finish,['ConnMod','ChanPid']}},{{emqx_cm_proto_v2,takeover_session,['ClientId','ChanPid']},{emqx_cm,takeover_session,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chann_conn_mod,['ClientId','ChanPid']},{emqx_cm,do_get_chann_conn_mod,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chan_info,['ClientId','ChanPid']},{emqx_cm,do_get_chan_info,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,get_chan_stats,['ClientId','ChanPid']},{emqx_cm,do_get_chan_stats,['ClientId','ChanPid']}},{{emqx_cm_proto_v2,lookup_client,['Node','Key']},{emqx_cm,lookup_client,['Key']}},{{emqx_cm_proto_v2,kickout_client,['Node','ClientId']},{emqx_cm,kick_session,['ClientId']}}],casts => []},{emqx_dashboard,1} => #{calls => [{{emqx_dashboard_proto_v1,current_rate,['Node']},{emqx_dashboard_monitor,current_rate,['Node']}},{{emqx_dashboard_proto_v1,do_sample,['Node','Latest']},{emqx_dashboard_monitor,do_sample,['Node','Latest']}}],casts => []},{emqx_mgmt_api_plugins,2} => #{calls => [{{emqx_mgmt_api_plugins_proto_v2,ensure_action,['Name','Action']},{emqx_mgmt_api_plugins,ensure_action,['Name','Action']}},{{emqx_mgmt_api_plugins_proto_v2,delete_package,['Name']},{emqx_mgmt_api_plugins,delete_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v2,describe_package,['Nodes','Name']},{emqx_mgmt_api_plugins,describe_package,['Name']}},{{emqx_mgmt_api_plugins_proto_v2,install_package,['Nodes','Filename','Bin']},{emqx_mgmt_api_plugins,install_package,['Filename','Bin']}},{{emqx_mgmt_api_plugins_proto_v2,get_plugins,['Nodes']},{emqx_mgmt_api_plugins,get_plugins,[]}}],casts => []},{emqx_authz,1} => #{calls => [{{emqx_authz_proto_v1,lookup_from_all_nodes,['Nodes','Type']},{emqx_authz_api_sources,lookup_from_local_node,['Type']}}],casts => []},{emqx_ft_storage_exporter_fs,1} => #{calls => [{{emqx_ft_storage_exporter_fs_proto_v1,read_export_file,['Node','Filepath','CallerPid']},{emqx_ft_storage_exporter_fs_proxy,read_export_file_local,['Filepath','CallerPid']}},{{emqx_ft_storage_exporter_fs_proto_v1,list_exports,['Nodes','Query']},{emqx_ft_storage_exporter_fs_proxy,list_exports_local,['Query']}}],casts => []},{emqx_node_rebalance_evacuation,1} => #{calls => [{{emqx_node_rebalance_evacuation_proto_v1,available_nodes,['Nodes']},{emqx_node_rebalance_evacuation,is_node_available,[]}}],casts => []},{emqx_node_rebalance_api,2} => #{calls => [{{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_stop,['Node']},{emqx_node_rebalance_purge,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_start,['Node','Opts']},{emqx_node_rebalance_purge,start,['Opts']}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_stop,['Node']},{emqx_node_rebalance,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_start,['Node','Opts']},{emqx_node_rebalance,start,['Opts']}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_stop,['Node']},{emqx_node_rebalance_evacuation,stop,[]}},{{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_start,['Node','Opts']},{emqx_node_rebalance_evacuation,start,['Opts']}}],casts => []},{emqx_retainer,1} => #{calls => [{{emqx_retainer_proto_v1,wait_dispatch_complete,['Nodes','Timeout']},{emqx_retainer_dispatcher,wait_dispatch_complete,['Timeout']}}],casts => []},{emqx_ft_storage_fs,1} => #{calls => [{{emqx_ft_storage_fs_proto_v1,list_assemblers,['Nodes','Transfer']},{emqx_ft_storage_fs_proxy,lookup_local_assembler,['Transfer']}},{{emqx_ft_storage_fs_proto_v1,pread,['Node','Transfer','Frag','Offset','Size']},{emqx_ft_storage_fs_proxy,pread_local,['Transfer','Frag','Offset','Size']}},{{emqx_ft_storage_fs_proto_v1,multilist,['Nodes','Transfer','What']},{emqx_ft_storage_fs_proxy,list_local,['Transfer','What']}}],casts => []},{emqx_node_rebalance_api,1} => #{calls => [{{emqx_node_rebalance_api_proto_v1,node_rebalance_stop,['Node']},{emqx_node_rebalance,stop,[]}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_start,['Node','Opts']},{emqx_node_rebalance,start,['Opts']}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_stop,['Node']},{emqx_node_rebalance_evacuation,stop,[]}},{{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_start,['Node','Opts']},{emqx_node_rebalance_evacuation,start,['Opts']}}],casts => []},{emqx_bridge,3} => #{calls => [{{emqx_bridge_proto_v3,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v3,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}},{{emqx_bridge_proto_v3,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_license,2} => #{calls => [{{emqx_license_proto_v2,remote_connection_counts,['Nodes']},{emqx_license_resources,local_connection_count,[]}}],casts => []},{emqx_rule_engine,1} => #{calls => [{{emqx_rule_engine_proto_v1,reset_metrics,['RuleId']},{emqx_rule_engine,reset_metrics_for_rule,['RuleId']}}],casts => []},{emqx_bridge,4} => #{calls => [{{emqx_bridge_proto_v4,get_metrics_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,get_metrics_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v4,list_bridges_on_nodes,['Nodes']},{emqx_bridge,list,[]}}],casts => []},{emqx_exhook,1} => #{calls => [{{emqx_exhook_proto_v1,server_hooks_metrics,['Nodes','Name']},{emqx_exhook_mgr,server_hooks_metrics,['Name']}},{{emqx_exhook_proto_v1,server_info,['Nodes','Name']},{emqx_exhook_mgr,server_info,['Name']}},{{emqx_exhook_proto_v1,all_servers_info,['Nodes']},{emqx_exhook_mgr,all_servers_info,[]}}],casts => []},{emqx_telemetry,1} => #{calls => [{{emqx_telemetry_proto_v1,get_cluster_uuid,['Node']},{emqx_telemetry,get_cluster_uuid,[]}},{{emqx_telemetry_proto_v1,get_node_uuid,['Node']},{emqx_telemetry,get_node_uuid,[]}}],casts => []},{emqx_broker,1} => #{calls => [{{emqx_broker_proto_v1,list_subscriptions_via_topic,['Node','Topic']},{emqx_broker,subscriptions_via_topic,['Topic']}},{{emqx_broker_proto_v1,list_client_subscriptions,['Node','ClientId']},{emqx_broker,subscriptions,['ClientId']}},{{emqx_broker_proto_v1,forward,['Node','Topic','Delivery']},{emqx_broker,dispatch,['Topic','Delivery']}}],casts => [{{emqx_broker_proto_v1,forward_async,['Node','Topic','Delivery']},{emqx_broker,dispatch,['Topic','Delivery']}}]},{emqx_retainer,2} => #{calls => [{{emqx_retainer_proto_v2,active_mnesia_indices,['Nodes']},{emqx_retainer_mnesia,active_indices,[]}},{{emqx_retainer_proto_v2,wait_dispatch_complete,['Nodes','Timeout']},{emqx_retainer_dispatcher,wait_dispatch_complete,['Timeout']}}],casts => []},{emqx_gateway_cm,1} => #{calls => [{{emqx_gateway_cm_proto_v1,cast,['GwName','ClientId','ChanPid','Req']},{emqx_gateway_cm,do_cast,['GwName','ClientId','ChanPid','Req']}},{{emqx_gateway_cm_proto_v1,call,['GwName','ClientId','ChanPid','Req']},{emqx_gateway_cm,do_call,['GwName','ClientId','ChanPid','Req']}},{{emqx_gateway_cm_proto_v1,call,['GwName','ClientId','ChanPid','Req','Timeout']},{emqx_gateway_cm,do_call,['GwName','ClientId','ChanPid','Req','Timeout']}},{{emqx_gateway_cm_proto_v1,takeover_session,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_takeover_session,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,get_chann_conn_mod,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chann_conn_mod,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,kick_session,['GwName','Action','ClientId','ChanPid']},{emqx_gateway_cm,do_kick_session,['GwName','Action','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,set_chan_stats,['GwName','ClientId','ChanPid','Stats']},{emqx_gateway_cm,do_set_chan_stats,['GwName','ClientId','ChanPid','Stats']}},{{emqx_gateway_cm_proto_v1,get_chan_stats,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chan_stats,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,set_chan_info,['GwName','ClientId','ChanPid','Infos']},{emqx_gateway_cm,do_set_chan_info,['GwName','ClientId','ChanPid','Infos']}},{{emqx_gateway_cm_proto_v1,get_chan_info,['GwName','ClientId','ChanPid']},{emqx_gateway_cm,do_get_chan_info,['GwName','ClientId','ChanPid']}},{{emqx_gateway_cm_proto_v1,lookup_by_clientid,['Nodes','GwName','ClientId']},{emqx_gateway_cm,do_lookup_by_clientid,['GwName','ClientId']}}],casts => []},{emqx_bridge,2} => #{calls => [{{emqx_bridge_proto_v2,lookup_from_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_api,lookup_from_local_node,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,stop_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,start_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,restart_bridges_to_all_nodes,['Nodes','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,stop_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,stop,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,start_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,start,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,restart_bridge_to_node,['Node','BridgeType','BridgeName']},{emqx_bridge_resource,restart,['BridgeType','BridgeName']}},{{emqx_bridge_proto_v2,list_bridges,['Node']},{emqx_bridge,list,[]}}],casts => []},{emqx_mgmt_trace,1} => #{calls => [{{emqx_mgmt_trace_proto_v1,read_trace_file,['Node','Name','Position','Limit']},{emqx_mgmt_api_trace,read_trace_file,['Name','Position','Limit']}},{{emqx_mgmt_trace_proto_v1,trace_file,['Nodes','File']},{emqx_trace,trace_file,['File']}},{{emqx_mgmt_trace_proto_v1,get_trace_size,['Nodes']},{emqx_mgmt_api_trace,get_trace_size,[]}}],casts => []}},release => "5.3",signatures => #{{emqx_broker,dispatch,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[no_subscribers,not_running],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,number,{int_rng,0,pos_inf},integer}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,[8,0],unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,[8,0],unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[any,any,any,any],{4,any}}]},{8,[{c,tuple,[any,any,any,any,any,any,any,any],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,[8,0],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx_conf_proto_v2,update,4} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_conf_proto_v1,remove_config,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_eviction_agent,all_local_channels_count,0} => {any,[]},{emqx_eviction_agent_proto_v2,all_channels_count,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},any]},{emqx_mgmt_api_trace,read_trace_file,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[eof],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}],{2,{c,atom,[eof],unknown}}},{c,tuple,[{c,atom,[error],unknown},{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,[{c,atom,[no_translation],unknown},{c,atom,[unicode],unknown},{c,atom,[latin1],unknown}],{3,{c,atom,[no_translation],unknown}}},none,none,none],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,[8,0],unknown},any,any]},{emqx_bridge_proto_v1,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_plugins,get_plugins,0} => {{c,tuple,[{c,atom,any,unknown},{c,list,[{c,map,{[],any,any},unknown},{c,nil,[],unknown}],unknown}],{2,any}},[]},{emqx_retainer_proto_v2,wait_dispatch_complete,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_node_rebalance_agent,disable,2} => {any,[any,any]},{emqx_conf_proto_v1,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v4,kickout_clients,2} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v2,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,tuple,[{c,binary,[8,0],unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[share],unknown},optional,{c,binary,[8,0],unknown}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}],unknown}]},{emqx_bridge_proto_v4,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[migrate_to],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_node_rebalance_evacuation,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_node_rebalance_agent,disable,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[already_disabled,invalid_coordinator],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,identifier,[pid],unknown}]},{emqx_mgmt_api_plugins,delete_package,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_delayed_proto_v2,get_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_persistent_session_ds,do_open_iterator,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,opaque,[{opaque,emqx_ds_storage_layer,iterator,0,{c,tuple,[{c,atom,[it],unknown},{c,tuple,[{c,atom,any,unknown},{c,binary,[8,0],unknown}],{2,any}},{c,number,{int_rng,0,1114111},integer},{c,tuple,[{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer}],{2,any}},{c,atom,any,unknown},any],{6,{c,atom,[it],unknown}}}}],unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,[{c,union,[{c,atom,['','#','+'],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,binary,[8,0],unknown}]},{emqx_conf_proto_v3,get_config,2} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_gateway_cm_proto_v1,get_chann_conn_mod,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_management_proto_v1,broker_info,1} => {any,[{c,atom,any,unknown}]},{emqx_plugins,get_tar,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,[8,0],unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_delayed_proto_v2,delete_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_metrics,all,0} => {{c,list,[{c,tuple,[any,{c,number,any,integer}],{2,any}},{c,nil,[],unknown}],unknown},[]},{emqx_bridge_proto_v4,get_metrics_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_management_proto_v3,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},any]},{emqx_bridge_proto_v2,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_configs,get_full_config,0} => {{c,map,{[],any,any},unknown},[]},{emqx_mgmt_api_plugins,install_package,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_retainer_dispatcher,wait_dispatch_complete,1} => {{c,atom,[ok],unknown},[any]},{emqx_slow_subs_api,get_history,0} => {{c,list,[{c,map,{[{{c,atom,[clientid],unknown},mandatory,any},{{c,atom,[last_update_time],unknown},mandatory,any},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[timespan],unknown},mandatory,any},{{c,atom,[topic],unknown},mandatory,any}],none,none},unknown},{c,nil,[],unknown}],unknown},[]},{emqx_mgmt_trace_proto_v2,read_trace_file,4} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_node_rebalance,connection_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_alarm,deactivate,1} => {any,[any]},{emqx_proto_v1,clean_pem_cache,1} => {any,[{c,atom,any,unknown}]},{emqx,reset_config,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,binary,[8,0],unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any]},{emqx_conf_proto_v1,reset,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_conf_proto_v1,update,4} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_conf_proto_v1,get_all,1} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_proto_v1,session_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_proto_v1,evict_connections,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_mgmt_api_plugins_proto_v2,install_package,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_gateway_cm,do_get_chan_info,3} => {{c,union,[{c,atom,[undefined],unknown},none,none,none,none,none,none,none,none,{c,map,{[{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}}],any,any},unknown}],unknown},[any,any,any]},{emqx_bridge_proto_v1,restart_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_authz_cache,drain_cache,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_telemetry_proto_v1,get_cluster_uuid,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,available_nodes,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_cm,do_get_chan_info,2} => {any,[any,any]},{emqx_exhook_mgr,all_servers_info,0} => {any,[]},{emqx,update_config,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,binary,[8,0],unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_mgmt_api_plugins,ensure_action,2} => {{c,atom,[ok],unknown},[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_conf_proto_v2,get_config,2} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_conf_proto_v3,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v1,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},any]},{emqx_node_rebalance_purge_proto_v1,stop,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_bridge_proto_v2,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt,broker_info,0} => {{c,map,{[{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[node_status],unknown},mandatory,{c,atom,[running],unknown}},{{c,atom,[otp_release],unknown},mandatory,{c,binary,[8,0],unknown}}],any,any},unknown},[]},{emqx_delayed,get_delayed_message,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[delayed_interval],unknown},mandatory,any},{{c,atom,[delayed_remaining],unknown},mandatory,{c,number,any,integer}},{{c,atom,[expected_at],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[from_clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[from_username],unknown},mandatory,any},{{c,atom,[msgid],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[node],unknown},mandatory,any},{{c,atom,[payload],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[publish_at],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[qos],unknown},mandatory,any},{{c,atom,[topic],unknown},mandatory,{c,binary,[8,0],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[any]},{emqx_rule_engine,reset_metrics_for_rule,1} => {{c,atom,[ok],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_proto_v1,is_running,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v4,start_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v1,lookup_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v1,disconnected_session_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v3,broker_info,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_cm,do_get_chan_stats,2} => {any,[any,any]},{emqx_node_rebalance_status_proto_v1,evacuation_status,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_gateway_api_listeners_proto_v1,listeners_cluster_status,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,list,[any,{c,nil,[],unknown}],unknown}]},{emqx_license_proto_v2,remote_connection_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_conf_proto_v2,get_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown},any]},{emqx_bridge_proto_v4,list_bridges_on_nodes,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_cm_proto_v2,takeover_session,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_node_rebalance_purge,stop,0} => {any,[]},{emqx_conf_proto_v3,reset,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_persistent_session_ds_proto_v1,close_all_iterators,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,binary,[8,0],unknown}]},{emqx_conf_proto_v2,remove_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v4,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,tuple,[{c,binary,[8,0],unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[share],unknown},optional,{c,binary,[8,0],unknown}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}],unknown}]},{emqx_gateway_cm,do_call,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_ft_storage_exporter_fs_proto_v1,read_export_file,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_dashboard_proto_v1,current_rate,1} => {any,[{c,atom,any,unknown}]},{erlang,send,2} => {any,[any,any]},{emqx_conf_cli,get_config,1} => {{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,list,[{c,number,{int_set,"_defknotuy"},integer},{c,nil,[],unknown}],nonempty}],{2,{c,atom,[error],unknown}}},none,none,{c,map,{[],any,any},unknown}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_agent,enable,2} => {any,[any,any]},{emqx_gateway_cm,do_kick_session,4} => {{c,atom,[ok],unknown},[{c,atom,any,unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_bridge,list,0} => {any,[]},{emqx_proto_v2,are_running,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_conf_proto_v1,update,3} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_conf_proto_v3,update,3} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_bridge_proto_v4,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_ft_storage_fs_proxy,lookup_local_assembler,1} => {any,[any]},{emqx_node_rebalance_proto_v2,evict_connections,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_persistent_session_ds_proto_v1,open_iterator,4} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,list,[{c,union,[{c,atom,['','#','+'],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,binary,[8,0],unknown}]},{emqx_cm_proto_v2,lookup_client,2} => {any,[{c,atom,any,unknown},{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_bridge_proto_v3,stop_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_agent,enable,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[already_enabled,eviction_agent_busy],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,identifier,[pid],unknown}]},{emqx_management_proto_v4,node_info,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_proto_v1,get_stats,1} => {any,[{c,atom,any,unknown}]},{emqx_exhook_mgr,server_info,1} => {any,[any]},{emqx_license_resources,local_connection_count,0} => {any,[]},{emqx_rule_engine_proto_v1,reset_metrics,1} => {any,[{c,binary,[8,0],unknown}]},{emqx_management_proto_v2,node_info,1} => {any,[{c,atom,any,unknown}]},{emqx_gateway_cm_proto_v1,call,5} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_bridge_proto_v4,lookup_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_cm_proto_v1,get_chan_stats,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_cm,takeover_session,2} => {{c,union,[{c,atom,[none,ok,undefined],unknown},none,none,none,{c,list,[{c,tuple,[{c,atom,any,unknown},any],{2,any}},{c,nil,[],unknown}],unknown},none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[expired],unknown},any],{2,{c,atom,[expired],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[none,none,none,none,{c,list,[{c,tuple,[any,any,any],{3,any}},{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],any,any},unknown}],unknown}],{2,{c,atom,[ok],unknown}}},{c,tuple,[{c,atom,[persistent],unknown},any],{2,{c,atom,[persistent],unknown}}}]},{3,[{c,tuple,[{c,atom,[living],unknown},{c,atom,any,unknown},any],{3,{c,atom,[living],unknown}}}]},{4,[{c,tuple,[{c,atom,[living],unknown},{c,atom,any,unknown},{c,identifier,[pid],unknown},any],{4,{c,atom,[living],unknown}}}]}],unknown},none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown},[any,any]},{emqx_topic_metrics,metrics,1} => {{c,union,[none,none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[topic_not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none,{c,map,{[{{c,atom,[create_time],unknown},mandatory,any},{{c,atom,[metrics],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[reset_time],unknown},optional,any},{{c,atom,[topic],unknown},mandatory,any}],none,none},unknown}],unknown},[any]},{emqx_node_rebalance_proto_v1,available_nodes,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_exhook_proto_v1,server_hooks_metrics,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},any]},{emqx_mgmt_trace_proto_v2,get_trace_size,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_telemetry,get_cluster_uuid,0} => {any,[]},{emqx_management_proto_v4,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_proto_v3,remove_config,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_conf_proto_v3,update,4} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance,session_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_conf_proto_v2,sync_data_from_node,1} => {any,[{c,atom,any,unknown}]},{emqx_proto_v2,delete_all_deactivated_alarms,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_app,sync_data_from_node,0} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,binary,[8,0],unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[]},{emqx_proto_v1,get_metrics,1} => {any,[{c,atom,any,unknown}]},{emqx_telemetry,get_node_uuid,0} => {any,[]},{emqx_resource,reset_metrics_local,1} => {{c,atom,[ok],unknown},[{c,binary,[8,0],unknown}]},{emqx_mgmt_trace_proto_v2,trace_file,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_api,get_metrics_from_local_node,2} => {{c,map,{[{{c,atom,[dropped],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.expired'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.other'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.queue_full'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_not_found'],unknown},mandatory,{c,number,any,integer}},{{c,atom,['dropped.resource_stopped'],unknown},mandatory,{c,number,any,integer}},{{c,atom,[failed],unknown},mandatory,{c,number,any,integer}},{{c,atom,[inflight],unknown},mandatory,any},{{c,atom,[late_reply],unknown},mandatory,{c,number,any,integer}},{{c,atom,[matched],unknown},mandatory,{c,number,any,integer}},{{c,atom,[queuing],unknown},mandatory,any},{{c,atom,[rate],unknown},mandatory,any},{{c,atom,[rate_last5m],unknown},mandatory,any},{{c,atom,[rate_max],unknown},mandatory,any},{{c,atom,[received],unknown},mandatory,{c,number,any,integer}},{{c,atom,[retried],unknown},mandatory,{c,number,any,integer}},{{c,atom,[success],unknown},mandatory,{c,number,any,integer}}],none,none},unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_eviction_agent,evict_sessions,3} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[any,{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},any]},{emqx_conf_proto_v3,reset,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_authz_proto_v1,lookup_from_all_nodes,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v1,connection_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_topic_metrics_proto_v1,reset,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,binary,[8,0],unknown}]},{emqx_resource_proto_v1,reset_metrics,1} => {any,[{c,binary,[8,0],unknown}]},{emqx_gateway_cm_proto_v1,get_chan_stats,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_cm,kick_session,1} => {{c,atom,[ok],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_management_proto_v3,node_info,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_proto_v1,deactivate_alarm,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_cm_proto_v2,get_chan_stats,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_cm_proto_v1,get_chann_conn_mod,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_node_rebalance_purge_proto_v1,start,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,map,{[{{c,atom,[purge_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}]},{emqx_management_proto_v2,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_broker,subscriptions_via_topic,1} => {{c,list,[any,{c,nil,[],unknown}],unknown},[any]},{emqx_mgmt,do_kickout_clients,1} => {{c,atom,[ok],unknown},[{c,list,[any,{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_proto_v1,evict_sessions,4} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,[connected,connecting,disconnected,idle,reauthenticating],unknown}]},{emqx_gateway_http,gateway_status,1} => {{c,map,{[{{c,atom,[current_connections],unknown},optional,any},{{c,atom,[max_connections],unknown},optional,{c,number,{int_set,[0]},integer}},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[status],unknown},mandatory,{c,atom,[running,stopped,unloaded],unknown}}],none,none},unknown},[{c,atom,any,unknown}]},{emqx_management_proto_v2,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v2,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,binary,[8,0],unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_proto_v2,connection_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v3,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,evict_sessions,4} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,[connected,connecting,disconnected,idle,reauthenticating],unknown}]},{emqx_conf_proto_v2,get_override_config_file,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_mgmt_api_plugins,describe_package,1} => {{c,tuple,[{c,atom,any,unknown},{c,list,[{c,map,{[],any,any},unknown},{c,nil,[],unknown}],unknown}],{2,any}},[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v3,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_conf_proto_v1,get_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown},any]},{emqx_alarm,get_alarms,1} => {any,[{c,atom,[activated,all,deactivated],unknown}]},{emqx_cm_proto_v1,kickout_client,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_bridge_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_cm,lookup_client,1} => {{c,list,[any,{c,nil,[],unknown}],unknown},[{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},any],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},any],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_broker,subscriptions,1} => {{c,list,[{c,tuple,[any,any],{2,any}},{c,nil,[],unknown}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,{c,identifier,[pid],unknown},none,none,none,none,none,none],unknown}]},{emqx_node_rebalance_proto_v2,disconnected_session_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_ft_storage_exporter_fs_proto_v1,list_exports,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,map,{[{{c,atom,[following],unknown},optional,any},{{c,atom,[limit],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[transfer],unknown},optional,{c,tuple,[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown}],{2,any}}}],none,none},unknown}]},{emqx_mgmt_cluster_proto_v2,connected_replicants,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_retainer_mnesia,active_indices,0} => {{c,tuple,[any,any],{2,any}},[]},{emqx_proto_v2,clean_authz_cache,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_proto_v2,deactivate_alarm,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_stats,getstats,0} => {{c,list,[{c,tuple,any,{any,any}},{c,nil,[],unknown}],unknown},[]},{emqx_topic_metrics,metrics,0} => {{c,list,[{c,map,{[{{c,atom,[create_time],unknown},mandatory,any},{{c,atom,[metrics],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[reset_time],unknown},optional,any},{{c,atom,[topic],unknown},mandatory,any}],none,none},unknown},{c,nil,[],unknown}],unknown},[]},{emqx_ft_storage_fs_reader_proto_v1,read,3} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_node_rebalance_status,local_status,0} => {{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[evacuation],unknown},any],{2,{c,atom,[evacuation],unknown}}},{c,tuple,[{c,atom,[purge],unknown},any],{2,{c,atom,[purge],unknown}}},{c,tuple,[{c,atom,[rebalance],unknown},{c,map,{[],{c,atom,[connection_eviction_rate,connection_goal,coordinator_node,disconnected_session_goal,recipients,session_eviction_rate,state,stats],unknown},any},unknown}],{2,{c,atom,[rebalance],unknown}}}]}],unknown},none,none,none],unknown},[]},{emqx_authz_cache,drain_cache,0} => {{c,atom,[ok],unknown},[]},{emqx_node_rebalance_status,evacuation_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[current_conns],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[current_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_conns],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[migrate_to],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[enabled],unknown}}},none,none,none],unknown}],{2,any}},[]},{emqx_resource,remove_local,1} => {{c,atom,[ok],unknown},[{c,binary,[8,0],unknown}]},{emqx_mgmt_cluster_proto_v1,invite_node,2} => {any,[{c,atom,any,unknown},{c,atom,any,unknown}]},{emqx_mgmt,do_list_subscriptions,0} => {none,[]},{emqx_delayed_proto_v1,delete_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_management_proto_v2,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},any]},{emqx_conf_proto_v2,get_all,1} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v4,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,binary,[8,0],unknown},{c,nil,[],unknown}],unknown}]},{emqx_authz_api_sources,lookup_from_local_node,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[not_found_resource],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,any}}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,tuple,[{c,atom,any,unknown},{c,atom,[connected,connecting,disconnected,stopped],unknown},{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[counters],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},optional,{c,map,{[],any,any},unknown}}],none,none},unknown}],{4,any}}],{2,{c,atom,[ok],unknown}}}]}],unknown},[any]},{emqx_node_rebalance_status_proto_v2,evacuation_status,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_evacuation_proto_v1,available_nodes,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_cm_proto_v1,lookup_client,2} => {any,[{c,atom,any,unknown},{c,tuple_set,[{2,[{c,tuple,[{c,atom,[clientid],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,{c,atom,[clientid],unknown}}},{c,tuple,[{c,atom,[username],unknown},{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,{c,atom,[username],unknown}}}]}],unknown}]},{emqx_management_proto_v4,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx,remove_config,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,atom,any,unknown},any},unknown}],unknown}},{{c,atom,[post_config_update],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[raw_config],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,{c,map,{[],{c,binary,[8,0],unknown},any},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_management_proto_v1,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_resource_proto_v1,remove,1} => {any,[{c,binary,[8,0],unknown}]},{emqx_node_rebalance_proto_v2,enable_rebalance_agent,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown}]},{emqx_shared_sub_proto_v1,send,4} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown},{c,binary,[8,0],unknown},any]},{emqx_cm_proto_v2,takeover_finish,2} => {any,[{c,atom,any,unknown},{c,identifier,[pid],unknown}]},{emqx_broker_proto_v1,list_client_subscriptions,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_authn_api,lookup_from_local_node,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[not_found_resource],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}],{2,any}}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,tuple,[{c,atom,any,unknown},{c,atom,[connected,connecting,disconnected,stopped],unknown},{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},{c,map,{[{{c,atom,[counters],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},optional,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},optional,{c,map,{[],any,any},unknown}}],none,none},unknown}],{4,any}}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_eviction_agent,evict_connections,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[any]},{emqx_management_proto_v1,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_api_cluster,join,1} => {any,[any]},{emqx_node_rebalance,disconnected_session_count,0} => {{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}},[]},{emqx_proto_v1,clean_authz_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_conf,get_node_and_config,1} => {{c,tuple,[{c,atom,any,unknown},any],{2,any}},[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_status_proto_v1,rebalance_status,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_gateway_cm,do_takeover_session,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_ft_storage_fs_proto_v1,list_assemblers,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,tuple,[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown}],{2,any}}]},{emqx_dashboard_monitor,do_sample,2} => {any,[{c,atom,any,unknown},any]},{emqx_persistent_session_ds,do_ensure_iterator_closed,1} => {{c,atom,[ok],unknown},[{c,binary,[8,0],unknown}]},{emqx_node_rebalance_status,rebalance_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[],any,any},unknown}],{2,{c,atom,[enabled],unknown}}},none,none,none],unknown}],{2,any}},[]},{emqx_mgmt_api_plugins_proto_v1,delete_package,1} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_gateway_cm,do_call,5} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any,any]},{emqx_mgmt_trace_proto_v1,read_trace_file,4} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_plugins_proto_v1,get_tar,3} => {any,[{c,atom,any,unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_authn_proto_v1,lookup_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_ft_storage_fs_proxy,list_local,2} => {any,[any,any]},{emqx_management_proto_v1,node_info,1} => {any,[{c,atom,any,unknown}]},{emqx_ft_storage_fs_proxy,pread_local,4} => {any,[any,any,any,any]},{emqx_resource_proto_v1,create_dry_run,2} => {any,[{c,atom,any,unknown},any]},{emqx_management_proto_v1,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_proto_v1,get_alarms,2} => {any,[{c,atom,any,unknown},{c,atom,[activated,all,deactivated],unknown}]},{emqx_ft_storage_fs_proto_v1,pread,5} => {any,[{c,atom,any,unknown},{c,tuple,[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown}],{2,any}},{c,map,{[{{c,atom,[fragment],unknown},mandatory,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[filemeta],unknown},{c,map,{[{{c,atom,[checksum],unknown},optional,{c,tuple,[{c,atom,any,unknown},{c,binary,[8,0],unknown}],{2,any}}},{{c,atom,[expire_at],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[name],unknown},mandatory,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown}},{{c,atom,[segments_ttl],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[user_data],unknown},optional,{c,union,[{c,atom,[false,null,true],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,[false,null,true],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,any,unknown},none,none,none,{c,map,{[],{c,binary,[8,0],unknown},any},unknown}],unknown},{c,nil,[],unknown}],unknown},{c,number,any,unknown},none,none,none,{c,map,{[],{c,binary,[8,0],unknown},{c,union,[{c,atom,[false,null,true],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,any,unknown},none,none,none,{c,map,{[],{c,binary,[8,0],unknown},any},unknown}],unknown}},unknown}],unknown}}],none,none},unknown}],{2,{c,atom,[filemeta],unknown}}},{c,tuple,[{c,atom,[segment],unknown},{c,map,{[{{c,atom,[offset],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[size],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[segment],unknown}}}]}],unknown}},{{c,atom,[path],unknown},mandatory,{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[size],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[timestamp],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown},{c,number,{int_rng,0,pos_inf},integer},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_topic_metrics,reset,0} => {any,[]},{emqx_resource_proto_v1,create,5} => {any,[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_proto_v4,restart_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_management_proto_v2,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_prometheus,do_stop,0} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found,restarting,running,simple_one_for_one],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[]},{emqx_conf_proto_v1,get_override_config_file,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_bridge_proto_v1,stop_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_prometheus,do_start,0} => {{c,atom,[ok],unknown},[]},{emqx_cm_proto_v1,get_chan_info,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_mgmt_trace_proto_v1,trace_file,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[abs_conn_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[abs_sess_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[nodes],unknown},optional,{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}},{{c,atom,[rel_conn_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[rel_sess_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_conf_proto_v3,get_override_config_file,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v3,unsubscribe_batch,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,binary,[8,0],unknown},{c,nil,[],unknown}],unknown}]},{emqx_exhook_proto_v1,all_servers_info,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_eviction_agent,purge_sessions,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[disabled],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[any]},{emqx_management_proto_v3,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_proto_v1,clean_authz_cache,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_mgmt,do_subscribe,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[subscribe],unknown},any],{2,{c,atom,[subscribe],unknown}}}]}],unknown},[any,any]},{emqx_mgmt_api_trace,get_trace_size,0} => {{c,map,{[],any,any},unknown},[]},{emqx_alarm,delete_all_deactivated_alarms,0} => {any,[]},{emqx_cm,takeover_finish,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[noproc,timeout,unexpected_exception],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},none,none,none],unknown},[{c,atom,any,unknown},{c,identifier,[pid],unknown}]},{emqx_management_proto_v3,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,tuple,[{c,binary,[8,0],unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[share],unknown},optional,{c,binary,[8,0],unknown}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}],unknown}]},{emqx_mgmt_api_plugins_proto_v1,get_plugins,0} => {any,[]},{emqx_metrics_proto_v1,get_metrics,4} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_mgmt_cluster_proto_v2,invite_node,2} => {any,[{c,atom,any,unknown},{c,atom,any,unknown}]},{emqx_shared_sub_proto_v1,dispatch_with_ack,5} => {any,[{c,identifier,[pid],unknown},{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,binary,[8,0],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,[8,0],unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,[8,0],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_node_rebalance,stop,0} => {any,[]},{emqx_gateway_cm_proto_v1,set_chan_stats,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},{c,list,[{c,tuple,[{c,atom,any,unknown},any],{2,any}},{c,nil,[],unknown}],unknown}]},{emqx_ft_storage_exporter_fs_proxy,read_export_file_local,2} => {any,[any,any]},{emqx_slow_subs_proto_v1,clear_history,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_bridge_proto_v3,start_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v4,restart_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_gateway_cm,do_set_chan_info,4} => {{c,atom,[false,true],unknown},[any,any,any,any]},{emqx_bridge_proto_v3,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,enable_rebalance_agent,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown},any]},{emqx_resource,create_local,5} => {{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[callback_mode],unknown},mandatory,{c,atom,[always_sync,async_if_possible],unknown}},{{c,atom,[config],unknown},mandatory,any},{{c,atom,[error],unknown},mandatory,any},{{c,atom,[id],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[query_mode],unknown},mandatory,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[state],unknown},mandatory,any},{{c,atom,[status],unknown},mandatory,{c,atom,[connected,connecting,disconnected,stopped],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}},[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_gateway_cm_proto_v1,takeover_session,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_resource_proto_v1,recreate,4} => {any,[{c,binary,[8,0],unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_proto_v3,list_bridges_on_nodes,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_exhook_proto_v1,server_info,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},any]},{emqx_bridge_proto_v2,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_slow_subs_proto_v1,get_history,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_mgmt_api_plugins_proto_v2,describe_package,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx,is_running,0} => {{c,atom,[false,true],unknown},[]},{emqx_cm_proto_v2,get_chann_conn_mod,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_resource,recreate_local,4} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found,updating_to_incorrect_resource_type],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[callback_mode],unknown},mandatory,{c,atom,[always_sync,async_if_possible],unknown}},{{c,atom,[config],unknown},mandatory,any},{{c,atom,[error],unknown},mandatory,any},{{c,atom,[id],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[query_mode],unknown},mandatory,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[state],unknown},mandatory,any},{{c,atom,[status],unknown},mandatory,{c,atom,[connected,connecting,disconnected,stopped],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,binary,[8,0],unknown},{c,atom,any,unknown},any,{c,map,{[{{c,atom,[auto_restart_interval],unknown},optional,{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[auto_retry_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[batch_size],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[batch_time],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[health_check_interval],unknown},optional,{c,number,any,integer}},{{c,atom,[health_check_timeout],unknown},optional,{c,number,any,integer}},{{c,atom,[inflight_window],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[max_buffer_bytes],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[query_mode],unknown},optional,{c,atom,[async,no_queries,simple_async,simple_sync,sync],unknown}},{{c,atom,[resume_interval],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[start_after_created],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[start_timeout],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_for_resource_ready],unknown},optional,{c,number,any,integer}},{{c,atom,[worker_pool_size],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_resource,stop,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v1,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_resource,start,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v2,delete_package,1} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_evacuation,stop,0} => {any,[]},{ssl_pem_cache,clear,0} => {any,[]},{emqx_node_rebalance_evacuation,is_node_available,0} => {{c,atom,any,unknown},[]},{emqx_conf_proto_v3,get_config,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown},any]},{emqx_conf_proto_v3,get_hocon_config,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_topic_metrics,reset,1} => {any,[any]},{emqx_gateway_cm,do_cast,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_ft_storage_fs_proto_v1,multilist,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,tuple,[{c,binary,[8,0],unknown},{c,binary,[8,0],unknown}],{2,any}},{c,atom,[fragment,result],unknown}]},{emqx_bridge_proto_v3,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_metrics_worker,get_metrics,2} => {{c,map,{[{{c,atom,[counters],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[gauges],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[rate],unknown},mandatory,{c,map,{[],any,any},unknown}},{{c,atom,[slides],unknown},mandatory,{c,map,{[],any,any},unknown}}],none,none},unknown},[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_management_proto_v4,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_cm_proto_v2,kickout_client,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_cm_proto_v1,takeover_session,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_gateway_http_proto_v1,get_cluster_status,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,any,unknown}]},{emqx_gateway_api_listeners,do_listeners_cluster_status,1} => {{c,map,{[],any,any},unknown},[{c,list,[any,{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance_purge,start,1} => {any,[{c,map,{[],any,any},unknown}]},{emqx_mgmt,do_unsubscribe_batch,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[unsubscribe],unknown},{c,list,[{c,tuple,[any,any],{2,any}},{c,nil,[],unknown}],unknown}],{2,{c,atom,[unsubscribe],unknown}}}]}],unknown},[any,any]},{emqx_node_rebalance_proto_v2,disable_rebalance_agent,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown},any]},{emqx_gateway_cm_proto_v1,get_chan_info,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_shared_sub,do_dispatch_with_ack,4} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,identifier,[pid,port],unknown},any,any,{c,tuple,[{c,atom,[message],unknown},{c,binary,[8,0],unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,[8,0],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}]},{emqx_mgmt,do_unsubscribe,2} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,atom,[channel_not_found],unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[unsubscribe],unknown},{c,list,[{c,tuple,[{c,binary,[8,0],unknown},{c,map,{[],any,any},unknown}],{2,any}},{c,nil,[],unknown}],nonempty}],{2,{c,atom,[unsubscribe],unknown}}}]}],unknown},[any,any]},{emqx_eviction_agent,evict_session_channel,3} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,{c,identifier,[pid],unknown},none,none,none,none,none,none],unknown}],{2,{c,atom,[ok],unknown}}}]},{3,[{c,tuple,[{c,atom,[ok],unknown},{c,union,[{c,atom,[undefined],unknown},none,none,{c,identifier,[pid],unknown},none,none,none,none,none,none],unknown},any],{3,{c,atom,[ok],unknown}}}]}],unknown},[any,{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[dn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_node_rebalance_status_proto_v1,local_status,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,list_bridges,1} => {any,[{c,atom,any,unknown}]},{emqx_cm,do_kick_session,3} => {{c,atom,[ok],unknown},[any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_gateway_cm,do_get_chan_stats,3} => {any,[any,any,any]},{emqx_delayed_proto_v1,get_delayed_message,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_node_rebalance_status_proto_v2,rebalance_status,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v4,broker_info,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_delayed_proto_v2,clear_all,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_proto_v2,get_alarms,2} => {any,[{c,atom,any,unknown},{c,atom,[activated,all,deactivated],unknown}]},{emqx_mgmt,do_call_client,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},any]},{emqx_slow_subs,clear_history,0} => {any,[]},{emqx_gateway_cm_proto_v1,cast,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_conf_proto_v1,reset,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_mgmt_trace_proto_v1,get_trace_size,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_gateway_cm_proto_v1,lookup_by_clientid,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}]},{emqx_management_proto_v1,subscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,list,[{c,tuple,[{c,binary,[8,0],unknown},{c,map,{[{{c,atom,[nl],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[qos],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[rap],unknown},mandatory,{c,number,{int_set,[0,1]},integer}},{{c,atom,[rh],unknown},mandatory,{c,number,{int_set,[0,1,2]},integer}},{{c,atom,[share],unknown},optional,{c,binary,[8,0],unknown}}],{c,atom,any,unknown},any},unknown}],{2,any}},{c,nil,[],unknown}],unknown}]},{emqx_telemetry_proto_v1,get_node_uuid,1} => {any,[{c,atom,any,unknown}]},{emqx_conf_proto_v2,remove_config,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_mgmt,node_info,0} => {{c,map,{[{{c,atom,[connections],unknown},mandatory,any},{{c,atom,[edition],unknown},mandatory,{c,binary,[0,80],unknown}},{{c,atom,[live_connections],unknown},mandatory,any},{{c,atom,[load1],unknown},optional,{c,number,any,float}},{{c,atom,[load15],unknown},optional,{c,number,any,float}},{{c,atom,[load5],unknown},optional,{c,number,any,float}},{{c,atom,[log_path],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[max_fds],unknown},mandatory,any},{{c,atom,[memory_total],unknown},mandatory,{c,number,any,unknown}},{{c,atom,[memory_used],unknown},mandatory,{c,number,any,integer}},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[node_status],unknown},mandatory,{c,atom,[running],unknown}},{{c,atom,[otp_release],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[process_available],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[process_used],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[role],unknown},mandatory,{c,atom,[core,replicant],unknown}},{{c,atom,[sys_path],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[uptime],unknown},mandatory,any},{{c,atom,[version],unknown},mandatory,{c,binary,[8,0],unknown}}],none,none},unknown},[]},{emqx_mgmt_api_plugins_proto_v2,ensure_action,2} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_bridge_proto_v3,start_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_status,purge_status,0} => {{c,tuple,[{c,atom,any,unknown},{c,union,[{c,atom,[disabled],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[enabled],unknown},{c,map,{[{{c,atom,[current_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[initial_sessions],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[purge_rate],unknown},mandatory,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}],{2,{c,atom,[enabled],unknown}}},none,none,none],unknown}],{2,any}},[]},{emqx_proto_v1,delete_all_deactivated_alarms,1} => {any,[{c,atom,any,unknown}]},{emqx_cm_proto_v2,get_chan_info,2} => {any,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_eviction_agent_proto_v1,evict_session_channel,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[dn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_conf_proto_v3,get_hocon_config,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,purge_sessions,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,pos_inf},integer}]},{emqx_management_proto_v2,broker_info,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v2,disable_rebalance_agent,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown}]},{emqx_trace,trace_file_detail,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,map,{[{{c,atom,[file],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[node],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[reason],unknown},mandatory,{c,atom,any,unknown}}],none,none},unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,map,{[{{c,atom,[mtime],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},{c,tuple,[{c,tuple,[any,any,any],{3,any}},{c,tuple,[any,any,any],{3,any}}],{2,any}},none,none,none],unknown}},{{c,atom,[node],unknown},mandatory,{c,binary,[8,0],unknown}},{{c,atom,[size],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}}],none,none},unknown}],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_delayed,clear_all_local,0} => {{c,atom,[ok],unknown},[]},{emqx_topic_metrics_proto_v1,reset,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_node_rebalance,is_node_available,0} => {{c,atom,any,unknown},[]},{emqx_conf_app,get_override_config_file,0} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[error],unknown},{c,map,{[{{c,atom,[msg],unknown},mandatory,any},{{c,atom,[node],unknown},mandatory,{c,atom,any,unknown}}],none,none},unknown}],{2,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[]},{emqx_node_rebalance_status_proto_v2,local_status,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_gateway_cm_proto_v1,set_chan_info,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},{c,map,{[],{c,atom,any,unknown},any},unknown}]},{emqx_bridge_proto_v4,stop_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_listeners,do_list_listeners,0} => {{c,map,{[],{c,binary,"( ",unknown},{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[{c,map,{[],any,any},unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},unknown},[]},{emqx_cm,do_get_chann_conn_mod,2} => {any,[any,any]},{emqx_broker_proto_v1,forward,3} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,[8,0],unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,[8,0],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx_resource,create_dry_run_local,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,atom,any,unknown},any]},{emqx_broker_proto_v1,forward_async,3} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown},{c,tuple,[{c,atom,[delivery],unknown},{c,identifier,[pid],unknown},{c,tuple,[{c,atom,[message],unknown},{c,binary,[8,0],unknown},any,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[],{c,atom,any,unknown},{c,atom,[false,true],unknown}},unknown},{c,map,{[{{c,atom,[allow_publish],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[peerhost],unknown},optional,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[properties],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[protocol],unknown},optional,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,binary,[8,0],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,number,any,integer},any],{10,{c,atom,[message],unknown}}}],{3,{c,atom,[delivery],unknown}}}]},{emqx_node_rebalance_api_proto_v1,node_rebalance_evacuation_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,lookup_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_stop,1} => {any,[{c,atom,any,unknown}]},{emqx_bridge_proto_v2,restart_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_proto_v2,is_running,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_status_proto_v2,purge_status,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_dashboard_proto_v1,do_sample,2} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,1,pos_inf},integer},none,none,none,none],unknown}]},{emqx_management_proto_v4,call_client,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},any]},{emqx_conf_proto_v1,get_config,2} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx,get_config,2} => {any,[any,any]},{emqx_node_rebalance_proto_v1,enable_rebalance_agent,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown}]},{emqx_conf_proto_v3,get_all,1} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],unknown}]},{emqx_management_proto_v2,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_purge_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[purge_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}}],none,none},unknown}]},{emqx_bridge_proto_v3,restart_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_persistent_session_ds,do_ensure_all_iterators_closed,1} => {{c,atom,[ok],unknown},[{c,binary,[8,0],unknown}]},{emqx_prometheus_proto_v1,start,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_conf_proto_v3,sync_data_from_node,1} => {any,[{c,atom,any,unknown}]},{emqx_management_proto_v1,list_subscriptions,1} => {any,[{c,atom,any,unknown}]},{emqx_dashboard_monitor,current_rate,1} => {{c,tuple_set,[{2,[{c,tuple,[{c,atom,[badrpc],unknown},any],{2,{c,atom,[badrpc],unknown}}},{c,tuple,[{c,atom,[ok],unknown},any],{2,{c,atom,[ok],unknown}}}]}],unknown},[{c,atom,any,unknown}]},{emqx_management_proto_v3,get_full_config,1} => {any,[{c,atom,any,unknown}]},{emqx_retainer_proto_v2,active_mnesia_indices,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_proto_v2,clean_pem_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_retainer_proto_v1,wait_dispatch_complete,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,[infinity],unknown},none,none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}]},{emqx_proto_v2,get_metrics,1} => {any,[{c,atom,any,unknown}]},{emqx_topic_metrics_proto_v1,metrics,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,binary,[8,0],unknown}]},{emqx_broker_proto_v1,list_subscriptions_via_topic,2} => {any,[{c,atom,any,unknown},{c,binary,[8,0],unknown}]},{emqx_cm_proto_v2,kick_session,3} => {any,[{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_management_proto_v3,list_listeners,1} => {any,[{c,atom,any,unknown}]},{emqx_node_rebalance_proto_v1,disable_rebalance_agent,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,identifier,[pid],unknown}]},{emqx_trace,trace_file,1} => {{c,tuple_set,[{3,[{c,tuple,[{c,atom,[error],unknown},{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},{c,atom,any,unknown}],{3,{c,atom,[error],unknown}}},{c,tuple,[{c,atom,[ok],unknown},{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},{c,binary,[8,0],unknown}],{3,{c,atom,[ok],unknown}}}]}],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v2,stop_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_gateway_cm_proto_v1,kick_session,4} => {any,[{c,atom,any,unknown},{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_ft_storage_exporter_fs_proxy,list_exports_local,1} => {any,[any]},{emqx_gateway_cm_proto_v1,call,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown},any]},{emqx_license_proto_v1,remote_connection_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx,get_config,1} => {any,[{c,list,[any,{c,nil,[],unknown}],unknown}]},{emqx_mgmt_api_plugins_proto_v1,describe_package,1} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_bridge_proto_v2,start_bridges_to_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v2,get_plugins,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_delayed,delete_delayed_message,1} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},{c,atom,[not_found],unknown}],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[any]},{emqx_bridge_proto_v1,stop_bridge_to_node,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_exhook_mgr,server_hooks_metrics,1} => {any,[any]},{emqx_bridge_proto_v3,lookup_from_all_nodes,3} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_prometheus_proto_v1,stop,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_bridge_resource,restart,2} => {{c,union,[{c,atom,[ok],unknown},none,none,none,none,none,{c,tuple,[{c,atom,[error],unknown},any],{2,{c,atom,[error],unknown}}},none,none,none],unknown},[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[any,{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},{c,number,{int_rng,0,255},integer},none,none,none,none],unknown},{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,nil,[],unknown},none,none,none,none,none],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_ft_storage_fs_reader,read,2} => {any,[{c,identifier,[pid],unknown},{c,number,{int_rng,1,pos_inf},integer}]},{emqx_conf_proto_v2,reset,2} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_node_rebalance_proto_v2,session_counts,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]},{emqx_cm_proto_v1,kick_session,3} => {any,[{c,atom,[discard,kick],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,identifier,[pid],unknown}]},{emqx_persistent_session_ds_proto_v1,close_iterator,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,binary,[8,0],unknown}]},{emqx_mgmt_api_plugins_proto_v1,install_package,2} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_proto_v2,clean_authz_cache,1} => {any,[{c,atom,any,unknown}]},{emqx_mgmt_api_cluster,connected_replicants,0} => {{c,list,[{c,tuple,[{c,atom,any,unknown},{c,atom,any,unknown},{c,identifier,[pid],unknown}],{3,any}},{c,nil,[],unknown}],unknown},[]},{emqx_conf_cli,get_config,0} => {{c,map,{[],any,any},unknown},[]},{emqx_gateway_cm,do_get_chann_conn_mod,3} => {any,[any,any,any]},{emqx_management_proto_v4,unsubscribe,3} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,binary,[8,0],unknown}]},{emqx_node_rebalance_api_proto_v2,node_rebalance_evacuation_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[migrate_to],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[server_reference],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_eviction_agent_proto_v2,evict_session_channel,4} => {any,[{c,atom,any,unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown},{c,map,{[{{c,atom,[clean_start],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[clientid],unknown},optional,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[conn_mod],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[conn_props],unknown},optional,{c,map,{[],{c,atom,any,unknown},any},unknown}},{{c,atom,[connected],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[connected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[disconnected_at],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[expiry_interval],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[keepalive],unknown},optional,{c,number,{int_rng,0,1114111},integer}},{{c,atom,[peercert],unknown},optional,{c,union,[{c,atom,[nossl,undefined],unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,none,none,{c,tuple,any,{any,any}},none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[peername],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[proto_name],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[proto_ver],unknown},optional,{c,union,[none,{c,binary,[8,0],unknown},none,none,none,{c,number,{int_rng,0,pos_inf},integer},none,none,none,none],unknown}},{{c,atom,[receive_maximum],unknown},optional,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[sockname],unknown},mandatory,{c,tuple,[{c,union,[{c,atom,[local,undefined,unspec],unknown},none,none,none,none,none,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown},none,none,none],unknown},any],{2,any}}},{{c,atom,[socktype],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[username],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}}],{c,atom,any,unknown},any},unknown},{c,map,{[{{c,atom,[anonymous],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[auth_result],unknown},optional,{c,atom,[bad_authentication_method,bad_clientid_or_password,bad_username_or_password,banned,client_identifier_not_valid,not_authorized,server_busy,server_unavailable,success],unknown}},{{c,atom,[clientid],unknown},mandatory,{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[cn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[dn],unknown},optional,{c,binary,[8,0],unknown}},{{c,atom,[is_bridge],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[is_superuser],unknown},mandatory,{c,atom,[false,true],unknown}},{{c,atom,[mountpoint],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[password],unknown},optional,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[peerhost],unknown},mandatory,{c,tuple_set,[{4,[{c,tuple,[{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer},{c,number,{int_rng,0,255},integer}],{4,any}}]},{8,[{c,tuple,[{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer},{c,number,{int_rng,0,1114111},integer}],{8,any}}]}],unknown}},{{c,atom,[protocol],unknown},mandatory,{c,atom,any,unknown}},{{c,atom,[sockport],unknown},mandatory,{c,number,{int_rng,0,pos_inf},integer}},{{c,atom,[username],unknown},mandatory,{c,union,[{c,atom,[undefined],unknown},{c,binary,[8,0],unknown},none,none,none,none,none,none,none,none],unknown}},{{c,atom,[ws_cookie],unknown},optional,{c,union,[{c,atom,[undefined],unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}},{{c,atom,[zone],unknown},mandatory,{c,atom,any,unknown}}],{c,atom,any,unknown},any},unknown}]},{emqx_conf_proto_v2,update,3} => {any,[{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},any,{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_mgmt_trace_proto_v2,trace_file_detail,2} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown},{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[any,{c,nil,[],unknown}],unknown},{c,number,{int_rng,0,1114111},integer},none,none,none,none],unknown},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown}]},{emqx_mgmt_api_plugins_proto_v1,ensure_action,2} => {any,[{c,union,[none,{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,atom,[restart,start,stop],unknown}]},{emqx_gateway_cm,do_set_chan_stats,4} => {{c,atom,[false,true],unknown},[any,any,any,any]},{emqx_node_rebalance_api_proto_v2,node_rebalance_start,2} => {any,[{c,atom,any,unknown},{c,map,{[{{c,atom,[abs_conn_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[abs_sess_threshold],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[conn_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[nodes],unknown},optional,{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}},{{c,atom,[rel_conn_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[rel_sess_threshold],unknown},optional,{c,number,any,unknown}},{{c,atom,[sess_evict_rate],unknown},optional,{c,number,{int_rng,1,pos_inf},integer}},{{c,atom,[wait_health_check],unknown},optional,{c,number,any,unknown}},{{c,atom,[wait_takeover],unknown},optional,{c,number,any,unknown}}],none,none},unknown}]},{emqx_conf_proto_v2,reset,3} => {any,[{c,atom,any,unknown},{c,list,[{c,union,[{c,atom,any,unknown},{c,binary,[8,0],unknown},none,none,{c,list,[{c,number,{int_rng,0,255},integer},{c,nil,[],unknown}],unknown},none,none,none,none,none],unknown},{c,nil,[],unknown}],nonempty},{c,map,{[{{c,atom,[override_to],unknown},optional,{c,atom,[cluster,local],unknown}},{{c,atom,[persistent],unknown},optional,{c,atom,[false,true],unknown}},{{c,atom,[rawconf_with_defaults],unknown},optional,{c,atom,[false,true],unknown}}],none,none},unknown}]},{emqx_gateway_cm,do_lookup_by_clientid,2} => {{c,list,[any,{c,nil,[],unknown}],unknown},[{c,union,[{c,atom,any,unknown},none,none,none,{c,list,[{c,number,{int_rng,0,1114111},integer},{c,nil,[],unknown}],unknown},{c,number,any,unknown},none,none,none,none],unknown},any]},{emqx_proto_v2,get_stats,1} => {any,[{c,atom,any,unknown}]},{emqx_topic_metrics_proto_v1,metrics,1} => {any,[{c,list,[{c,atom,any,unknown},{c,nil,[],unknown}],unknown}]}}}. diff --git a/apps/emqx/test/props/prop_emqx_rpc.erl b/apps/emqx/test/props/prop_emqx_rpc.erl deleted file mode 100644 index e544ae082..000000000 --- a/apps/emqx/test/props/prop_emqx_rpc.erl +++ /dev/null @@ -1,195 +0,0 @@ -%%-------------------------------------------------------------------- -%% Copyright (c) 2020-2023 EMQ Technologies Co., Ltd. All Rights Reserved. -%% -%% Licensed under the Apache License, Version 2.0 (the "License"); -%% you may not use this file except in compliance with the License. -%% You may obtain a copy of the License at -%% -%% http://www.apache.org/licenses/LICENSE-2.0 -%% -%% Unless required by applicable law or agreed to in writing, software -%% distributed under the License is distributed on an "AS IS" BASIS, -%% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -%% See the License for the specific language governing permissions and -%% limitations under the License. -%%-------------------------------------------------------------------- - --module(prop_emqx_rpc). - --include_lib("proper/include/proper.hrl"). --include_lib("eunit/include/eunit.hrl"). - --define(NODENAME, 'test@127.0.0.1'). - --define(ALL(Vars, Types, Exprs), - ?SETUP( - fun() -> - State = do_setup(), - fun() -> do_teardown(State) end - end, - ?FORALL(Vars, Types, Exprs) - ) -). - -%%-------------------------------------------------------------------- -%% Properties -%%-------------------------------------------------------------------- - -prop_node() -> - ?ALL( - Node0, - nodename(), - begin - Node = punch(Node0), - ?assert(emqx_rpc:cast(Node, erlang, system_time, [])), - case emqx_rpc:call(Node, erlang, system_time, []) of - {badrpc, _Reason} -> true; - Delivery when is_integer(Delivery) -> true; - _Other -> false - end - end - ). - -prop_node_with_key() -> - ?ALL( - {Node0, Key}, - nodename_with_key(), - begin - Node = punch(Node0), - ?assert(emqx_rpc:cast(Key, Node, erlang, system_time, [])), - case emqx_rpc:call(Key, Node, erlang, system_time, []) of - {badrpc, _Reason} -> true; - Delivery when is_integer(Delivery) -> true; - _Other -> false - end - end - ). - -prop_nodes() -> - ?ALL( - Nodes0, - nodesname(), - begin - Nodes = punch(Nodes0), - case emqx_rpc:multicall(Nodes, erlang, system_time, []) of - {RealResults, RealBadNodes} when - is_list(RealResults); - is_list(RealBadNodes) - -> - true; - _Other -> - false - end - end - ). - -prop_nodes_with_key() -> - ?ALL( - {Nodes0, Key}, - nodesname_with_key(), - begin - Nodes = punch(Nodes0), - case emqx_rpc:multicall(Key, Nodes, erlang, system_time, []) of - {RealResults, RealBadNodes} when - is_list(RealResults); - is_list(RealBadNodes) - -> - true; - _Other -> - false - end - end - ). - -%%-------------------------------------------------------------------- -%% Helper -%%-------------------------------------------------------------------- - -do_setup() -> - ensure_distributed_nodename(), - ok = logger:set_primary_config(#{level => warning}), - {ok, _Apps} = application:ensure_all_started(gen_rpc), - ok = application:set_env(gen_rpc, call_receive_timeout, 100), - ok = meck:new(gen_rpc, [passthrough, no_history]), - ok = meck:expect( - gen_rpc, - multicall, - fun(Nodes, Mod, Fun, Args) -> - gen_rpc:multicall(Nodes, Mod, Fun, Args, 100) - end - ). - -do_teardown(_) -> - ok = net_kernel:stop(), - ok = application:stop(gen_rpc), - ok = meck:unload(gen_rpc), - %% wait for tcp close - timer:sleep(2500). - -ensure_distributed_nodename() -> - case net_kernel:start([?NODENAME]) of - {ok, _} -> - ok; - {error, {already_started, _}} -> - net_kernel:stop(), - net_kernel:start([?NODENAME]); - {error, {{shutdown, {_, _, {'EXIT', nodistribution}}}, _}} -> - %% start epmd first - spawn_link(fun() -> os:cmd("epmd") end), - timer:sleep(100), - net_kernel:start([?NODENAME]) - end. - -%%-------------------------------------------------------------------- -%% Generator -%%-------------------------------------------------------------------- - -nodename() -> - ?LET( - {NodePrefix, HostName}, - {node_prefix(), hostname()}, - begin - Node = NodePrefix ++ "@" ++ HostName, - list_to_atom(Node) - end - ). - -nodename_with_key() -> - ?LET( - {NodePrefix, HostName, Key}, - {node_prefix(), hostname(), choose(0, 10)}, - begin - Node = NodePrefix ++ "@" ++ HostName, - {list_to_atom(Node), Key} - end - ). - -nodesname() -> - oneof([list(nodename()), [node()]]). - -nodesname_with_key() -> - oneof([{list(nodename()), choose(0, 10)}, {[node()], 1}]). - -node_prefix() -> - oneof(["emqxct", text_like()]). - -text_like() -> - ?SUCHTHAT(Text, list(range($a, $z)), (length(Text) =< 100 andalso length(Text) > 0)). - -hostname() -> - oneof(["127.0.0.1", "localhost"]). - -%%-------------------------------------------------------------------- -%% Utils -%%-------------------------------------------------------------------- - -%% After running the props, the `node()` () is only able to return an -%% incorrect node name - `nonode@nohost`, But we want a distributed nodename -%% So, just translate the `nonode@nohost` to ?NODENAME -punch(Nodes) when is_list(Nodes) -> - lists:map(fun punch/1, Nodes); -punch('nonode@nohost') -> - %% Equal to ?NODENAME - node(); -punch(GoodBoy) -> - GoodBoy. diff --git a/apps/emqx_bridge_kafka/src/emqx_bridge_kafka.app.src b/apps/emqx_bridge_kafka/src/emqx_bridge_kafka.app.src index ed7ecdbd0..88fa6b7bd 100644 --- a/apps/emqx_bridge_kafka/src/emqx_bridge_kafka.app.src +++ b/apps/emqx_bridge_kafka/src/emqx_bridge_kafka.app.src @@ -1,7 +1,7 @@ %% -*- mode: erlang -*- {application, emqx_bridge_kafka, [ {description, "EMQX Enterprise Kafka Bridge"}, - {vsn, "0.1.10"}, + {vsn, "0.1.11"}, {registered, [emqx_bridge_kafka_consumer_sup]}, {applications, [ kernel, diff --git a/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_tests.erl b/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_tests.erl index f476ded39..395761d48 100644 --- a/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_tests.erl +++ b/apps/emqx_bridge_kafka/test/emqx_bridge_kafka_tests.erl @@ -139,6 +139,7 @@ kafka_consumer_test() -> ok. message_key_dispatch_validations_test() -> + Name = myproducer, Conf0 = kafka_producer_new_hocon(), Conf1 = Conf0 ++ @@ -155,7 +156,7 @@ message_key_dispatch_validations_test() -> <<"message">> := #{<<"key">> := <<>>} } }, - emqx_utils_maps:deep_get([<<"bridges">>, <<"kafka">>, <<"myproducer">>], Conf) + emqx_utils_maps:deep_get([<<"bridges">>, <<"kafka">>, atom_to_binary(Name)], Conf) ), ?assertThrow( {_, [ @@ -166,8 +167,6 @@ message_key_dispatch_validations_test() -> ]}, check(Conf) ), - %% ensure atoms exist - _ = [myproducer], ?assertThrow( {_, [ #{ diff --git a/apps/emqx_bridge_pulsar/test/emqx_bridge_pulsar_tests.erl b/apps/emqx_bridge_pulsar/test/emqx_bridge_pulsar_tests.erl index 031767063..7169ea3d2 100644 --- a/apps/emqx_bridge_pulsar/test/emqx_bridge_pulsar_tests.erl +++ b/apps/emqx_bridge_pulsar/test/emqx_bridge_pulsar_tests.erl @@ -11,6 +11,7 @@ %%=========================================================================== pulsar_producer_validations_test() -> + Name = my_producer, Conf0 = pulsar_producer_hocon(), Conf1 = Conf0 ++ @@ -24,7 +25,7 @@ pulsar_producer_validations_test() -> <<"strategy">> := <<"key_dispatch">>, <<"message">> := #{<<"key">> := <<>>} }, - emqx_utils_maps:deep_get([<<"bridges">>, <<"pulsar_producer">>, <<"my_producer">>], Conf) + emqx_utils_maps:deep_get([<<"bridges">>, <<"pulsar_producer">>, atom_to_binary(Name)], Conf) ), ?assertThrow( {_, [ @@ -35,8 +36,6 @@ pulsar_producer_validations_test() -> ]}, check(Conf) ), - %% ensure atoms exist - _ = [my_producer], ?assertThrow( {_, [ #{ diff --git a/apps/emqx_conf/src/emqx_conf.app.src b/apps/emqx_conf/src/emqx_conf.app.src index 765c0b1c0..fda3e4759 100644 --- a/apps/emqx_conf/src/emqx_conf.app.src +++ b/apps/emqx_conf/src/emqx_conf.app.src @@ -1,6 +1,6 @@ {application, emqx_conf, [ {description, "EMQX configuration management"}, - {vsn, "0.1.29"}, + {vsn, "0.1.30"}, {registered, []}, {mod, {emqx_conf_app, []}}, {applications, [kernel, stdlib, emqx_ctl]}, diff --git a/apps/emqx_conf/src/emqx_conf_cli.erl b/apps/emqx_conf/src/emqx_conf_cli.erl index 109e88b4d..6cb53f8f3 100644 --- a/apps/emqx_conf/src/emqx_conf_cli.erl +++ b/apps/emqx_conf/src/emqx_conf_cli.erl @@ -108,7 +108,17 @@ admins(_) -> emqx_ctl:usage(usage_sync()). audit(Level, From, Log) -> - ?AUDIT(Level, From, Log#{time => logger:timestamp()}). + Log1 = redact(Log#{time => logger:timestamp()}), + ?AUDIT(Level, From, Log1). + +redact(Logs = #{cmd := admins, args := ["add", Username, _Password | Rest]}) -> + Logs#{args => ["add", Username, "******" | Rest]}; +redact(Logs = #{cmd := admins, args := ["passwd", Username, _Password]}) -> + Logs#{args => ["passwd", Username, "******"]}; +redact(Logs = #{cmd := license, args := ["update", _License]}) -> + Logs#{args => ["update", "******"]}; +redact(Logs) -> + Logs. usage_conf() -> [ diff --git a/apps/emqx_conf/src/emqx_conf_schema.erl b/apps/emqx_conf/src/emqx_conf_schema.erl index e87c3c898..e4fb06ef5 100644 --- a/apps/emqx_conf/src/emqx_conf_schema.erl +++ b/apps/emqx_conf/src/emqx_conf_schema.erl @@ -43,6 +43,9 @@ ]). -export([conf_get/2, conf_get/3, keys/2, filter/1]). +%% internal exports for `emqx_enterprise_schema' only. +-export([ensure_unicode_path/2, convert_rotation/2, log_handler_common_confs/2]). + %% Static apps which merge their configs into the merged emqx.conf %% The list can not be made a dynamic read at run-time as it is used %% by nodetool to generate app.