Kaynağa Gözat

fix: byebye jsx

Stefan Strigler 2 yıl önce
ebeveyn
işleme
4f80690162

+ 0 - 1
apps/emqx/src/emqx.app.src

@@ -16,7 +16,6 @@
         cowboy,
         sasl,
         os_mon,
-        jiffy,
         lc,
         hocon
     ]},

+ 2 - 2
apps/emqx/src/emqx_logger_jsonfmt.erl

@@ -62,11 +62,11 @@
 %% The JSON object is pretty-printed.
 %% NOTE: do not use this function for logging.
 best_effort_json(Input) ->
-    best_effort_json(Input, [space, {indent, 4}]).
+    best_effort_json(Input, [pretty]).
 best_effort_json(Input, Opts) ->
     Config = #{depth => unlimited, single_line => true},
     JsonReady = best_effort_json_obj(Input, Config),
-    jsx:encode(JsonReady, Opts).
+    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) ->

+ 1 - 1
apps/emqx/test/emqx_common_test_helpers.erl

@@ -477,7 +477,7 @@ copy_certs(_, _) ->
 load_config(SchemaModule, Config, Opts) ->
     ConfigBin =
         case is_map(Config) of
-            true -> jsx:encode(Config);
+            true -> emqx_utils_json:encode(Config);
             false -> Config
         end,
     ok = emqx_config:delete_override_conf_files(),

+ 1 - 1
apps/emqx_authz/src/emqx_authz_http.erl

@@ -227,7 +227,7 @@ encode_path(Path) ->
     lists:flatten(["/" ++ Part || Part <- lists:map(fun uri_encode/1, Parts)]).
 
 serialize_body(<<"application/json">>, Body) ->
-    jsx:encode(Body);
+    emqx_utils_json:encode(Body);
 serialize_body(<<"application/x-www-form-urlencoded">>, Body) ->
     query_string(Body).
 

+ 2 - 2
apps/emqx_authz/test/emqx_authz_api_cache_SUITE.erl

@@ -67,12 +67,12 @@ t_clean_cahce(_) ->
     ok = emqtt:publish(C, <<"a/b/c">>, <<"{\"x\":1,\"y\":1}">>, 0),
 
     {ok, 200, Result3} = request(get, uri(["clients", "emqx0", "authorization", "cache"])),
-    ?assertEqual(2, length(emqx_utils_json:decode(Result3))),
+    ?assertEqual(2, maps:size(emqx_utils_json:decode(Result3))),
 
     request(delete, uri(["authorization", "cache"])),
 
     {ok, 200, Result4} = request(get, uri(["clients", "emqx0", "authorization", "cache"])),
-    ?assertEqual(0, length(emqx_utils_json:decode(Result4))),
+    ?assertEqual(0, maps:size(emqx_utils_json:decode(Result4))),
 
     ok.
 

+ 11 - 11
apps/emqx_authz/test/emqx_authz_api_mnesia_SUITE.erl

@@ -95,7 +95,7 @@ t_api(_) ->
             <<"page">> := 1,
             <<"hasnext">> := false
         }
-    } = jsx:decode(Request1),
+    } = emqx_utils_json:decode(Request1),
     ?assertEqual(3, length(Rules1)),
 
     {ok, 200, Request1_1} =
@@ -119,7 +119,7 @@ t_api(_) ->
                 <<"hasnext">> => false
             }
         },
-        jsx:decode(Request1_1)
+        emqx_utils_json:decode(Request1_1)
     ),
 
     {ok, 200, Request2} =
@@ -128,7 +128,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "users", "user1"]),
             []
         ),
-    #{<<"username">> := <<"user1">>, <<"rules">> := Rules1} = jsx:decode(Request2),
+    #{<<"username">> := <<"user1">>, <<"rules">> := Rules1} = emqx_utils_json:decode(Request2),
 
     {ok, 204, _} =
         request(
@@ -142,7 +142,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "users", "user1"]),
             []
         ),
-    #{<<"username">> := <<"user1">>, <<"rules">> := Rules2} = jsx:decode(Request3),
+    #{<<"username">> := <<"user1">>, <<"rules">> := Rules2} = emqx_utils_json:decode(Request3),
     ?assertEqual(0, length(Rules2)),
 
     {ok, 204, _} =
@@ -202,8 +202,8 @@ t_api(_) ->
         <<"data">> := [#{<<"clientid">> := <<"client1">>, <<"rules">> := Rules3}],
         <<"meta">> := #{<<"count">> := 1, <<"limit">> := 100, <<"page">> := 1}
     } =
-        jsx:decode(Request4),
-    #{<<"clientid">> := <<"client1">>, <<"rules">> := Rules3} = jsx:decode(Request5),
+        emqx_utils_json:decode(Request4),
+    #{<<"clientid">> := <<"client1">>, <<"rules">> := Rules3} = emqx_utils_json:decode(Request5),
     ?assertEqual(3, length(Rules3)),
 
     {ok, 204, _} =
@@ -218,7 +218,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "clients", "client1"]),
             []
         ),
-    #{<<"clientid">> := <<"client1">>, <<"rules">> := Rules4} = jsx:decode(Request6),
+    #{<<"clientid">> := <<"client1">>, <<"rules">> := Rules4} = emqx_utils_json:decode(Request6),
     ?assertEqual(0, length(Rules4)),
 
     {ok, 204, _} =
@@ -252,7 +252,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "all"]),
             []
         ),
-    #{<<"rules">> := Rules5} = jsx:decode(Request7),
+    #{<<"rules">> := Rules5} = emqx_utils_json:decode(Request7),
     ?assertEqual(3, length(Rules5)),
 
     {ok, 204, _} =
@@ -267,7 +267,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "all"]),
             []
         ),
-    #{<<"rules">> := Rules6} = jsx:decode(Request8),
+    #{<<"rules">> := Rules6} = emqx_utils_json:decode(Request8),
     ?assertEqual(0, length(Rules6)),
 
     {ok, 204, _} =
@@ -285,7 +285,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "users?page=2&limit=5"]),
             []
         ),
-    #{<<"data">> := Data1} = jsx:decode(Request9),
+    #{<<"data">> := Data1} = emqx_utils_json:decode(Request9),
     ?assertEqual(5, length(Data1)),
 
     {ok, 204, _} =
@@ -303,7 +303,7 @@ t_api(_) ->
             uri(["authorization", "sources", "built_in_database", "rules", "clients?limit=5"]),
             []
         ),
-    #{<<"data">> := Data2} = jsx:decode(Request10),
+    #{<<"data">> := Data2} = emqx_utils_json:decode(Request10),
     ?assertEqual(5, length(Data2)),
 
     {ok, 400, Msg1} =

+ 2 - 2
apps/emqx_authz/test/emqx_authz_api_settings_SUITE.erl

@@ -76,7 +76,7 @@ t_api(_) ->
 
     {ok, 200, Result1} = request(put, uri(["authorization", "settings"]), Settings1),
     {ok, 200, Result1} = request(get, uri(["authorization", "settings"]), []),
-    ?assertEqual(Settings1, jsx:decode(Result1)),
+    ?assertEqual(Settings1, emqx_utils_json:decode(Result1)),
 
     Settings2 = #{
         <<"no_match">> => <<"allow">>,
@@ -90,7 +90,7 @@ t_api(_) ->
 
     {ok, 200, Result2} = request(put, uri(["authorization", "settings"]), Settings2),
     {ok, 200, Result2} = request(get, uri(["authorization", "settings"]), []),
-    ?assertEqual(Settings2, jsx:decode(Result2)),
+    ?assertEqual(Settings2, emqx_utils_json:decode(Result2)),
 
     ok.
 

+ 12 - 12
apps/emqx_bridge/test/emqx_bridge_mqtt_SUITE.erl

@@ -201,7 +201,7 @@ t_mqtt_conn_bridge_ingress(_) ->
     #{
         <<"type">> := ?TYPE_MQTT,
         <<"name">> := ?BRIDGE_NAME_INGRESS
-    } = jsx:decode(Bridge),
+    } = emqx_utils_json:decode(Bridge),
 
     BridgeIDIngress = emqx_bridge_resource:bridge_id(?TYPE_MQTT, ?BRIDGE_NAME_INGRESS),
 
@@ -313,7 +313,7 @@ t_mqtt_conn_bridge_ingress_no_payload_template(_) ->
     emqx:publish(emqx_message:make(RemoteTopic, Payload)),
     %% we should receive a message on the local broker, with specified topic
     Msg = assert_mqtt_msg_received(LocalTopic),
-    ?assertMatch(#{<<"payload">> := Payload}, jsx:decode(Msg#message.payload)),
+    ?assertMatch(#{<<"payload">> := Payload}, emqx_utils_json:decode(Msg#message.payload)),
 
     %% verify the metrics of the bridge
     ?assertMetrics(
@@ -402,7 +402,7 @@ t_mqtt_conn_bridge_egress_no_payload_template(_) ->
     Msg = assert_mqtt_msg_received(RemoteTopic),
     %% the MapMsg is all fields outputed by Rule-Engine. it's a binary coded json here.
     ?assertMatch(<<ResourceID:(byte_size(ResourceID))/binary, _/binary>>, Msg#message.from),
-    ?assertMatch(#{<<"payload">> := Payload}, jsx:decode(Msg#message.payload)),
+    ?assertMatch(#{<<"payload">> := Payload}, emqx_utils_json:decode(Msg#message.payload)),
 
     %% verify the metrics of the bridge
     ?retry(
@@ -545,7 +545,7 @@ t_ingress_mqtt_bridge_with_rules(_) ->
             <<"sql">> => <<"SELECT * from \"$bridges/", BridgeIDIngress/binary, "\"">>
         }
     ),
-    #{<<"id">> := RuleId} = jsx:decode(Rule),
+    #{<<"id">> := RuleId} = emqx_utils_json:decode(Rule),
 
     %% we now test if the bridge works as expected
 
@@ -562,7 +562,7 @@ t_ingress_mqtt_bridge_with_rules(_) ->
     %% and also the rule should be matched, with matched + 1:
     {ok, 200, Rule1} = request(get, uri(["rules", RuleId]), []),
     {ok, 200, Metrics} = request(get, uri(["rules", RuleId, "metrics"]), []),
-    ?assertMatch(#{<<"id">> := RuleId}, jsx:decode(Rule1)),
+    ?assertMatch(#{<<"id">> := RuleId}, emqx_utils_json:decode(Rule1)),
     ?assertMatch(
         #{
             <<"metrics">> := #{
@@ -581,7 +581,7 @@ t_ingress_mqtt_bridge_with_rules(_) ->
                 <<"actions.failed.unknown">> := 0
             }
         },
-        jsx:decode(Metrics)
+        emqx_utils_json:decode(Metrics)
     ),
 
     %% we also check if the actions of the rule is triggered
@@ -630,7 +630,7 @@ t_egress_mqtt_bridge_with_rules(_) ->
             <<"sql">> => <<"SELECT * from \"t/1\"">>
         }
     ),
-    #{<<"id">> := RuleId} = jsx:decode(Rule),
+    #{<<"id">> := RuleId} = emqx_utils_json:decode(Rule),
 
     %% we now test if the bridge works as expected
     LocalTopic = <<?EGRESS_LOCAL_TOPIC, "/1">>,
@@ -653,7 +653,7 @@ t_egress_mqtt_bridge_with_rules(_) ->
     timer:sleep(100),
     emqx:publish(emqx_message:make(RuleTopic, Payload2)),
     {ok, 200, Rule1} = request(get, uri(["rules", RuleId]), []),
-    ?assertMatch(#{<<"id">> := RuleId, <<"name">> := _}, jsx:decode(Rule1)),
+    ?assertMatch(#{<<"id">> := RuleId, <<"name">> := _}, emqx_utils_json:decode(Rule1)),
     {ok, 200, Metrics} = request(get, uri(["rules", RuleId, "metrics"]), []),
     ?assertMatch(
         #{
@@ -673,7 +673,7 @@ t_egress_mqtt_bridge_with_rules(_) ->
                 <<"actions.failed.unknown">> := 0
             }
         },
-        jsx:decode(Metrics)
+        emqx_utils_json:decode(Metrics)
     ),
 
     %% we should receive a message on the "remote" broker, with specified topic
@@ -911,17 +911,17 @@ create_bridge(Config = #{<<"type">> := Type, <<"name">> := Name}) ->
             <<"type">> := Type,
             <<"name">> := Name
         },
-        jsx:decode(Bridge)
+        emqx_utils_json:decode(Bridge)
     ),
     emqx_bridge_resource:bridge_id(Type, Name).
 
 request_bridge(BridgeID) ->
     {ok, 200, Bridge} = request(get, uri(["bridges", BridgeID]), []),
-    jsx:decode(Bridge).
+    emqx_utils_json:decode(Bridge).
 
 request_bridge_metrics(BridgeID) ->
     {ok, 200, BridgeMetrics} = request(get, uri(["bridges", BridgeID, "metrics"]), []),
-    jsx:decode(BridgeMetrics).
+    emqx_utils_json:decode(BridgeMetrics).
 
 request(Method, Url, Body) ->
     request(<<"connector_admin">>, Method, Url, Body).

+ 3 - 3
apps/emqx_conf/src/emqx_conf.erl

@@ -166,7 +166,7 @@ gen_schema_json(Dir, I18nFile, SchemaModule, Lang) ->
     io:format(user, "===< Including fields from importance level: ~p~n", [IncludeImportance]),
     Opts = #{desc_file => I18nFile, lang => Lang, include_importance_up_from => IncludeImportance},
     JsonMap = hocon_schema_json:gen(SchemaModule, Opts),
-    IoData = jsx:encode(JsonMap, [space, {indent, 4}]),
+    IoData = emqx_utils_json:encode(JsonMap, [pretty, force_utf8]),
     ok = file:write_file(SchemaJsonFile, IoData).
 
 gen_api_schema_json(Dir, I18nFile, Lang) ->
@@ -268,13 +268,13 @@ do_gen_api_schema_json(File, SchemaMod, SchemaInfo) ->
         ApiSpec0
     ),
     Components = lists:foldl(fun(M, Acc) -> maps:merge(M, Acc) end, #{}, Components0),
-    IoData = jsx:encode(
+    IoData = emqx_utils_json:encode(
         #{
             info => SchemaInfo,
             paths => ApiSpec,
             components => #{schemas => Components}
         },
-        [space, {indent, 4}]
+        [pretty, force_utf8]
     ),
     file:write_file(File, IoData).
 

+ 1 - 1
apps/emqx_dashboard/test/emqx_dashboard_SUITE.erl

@@ -142,7 +142,7 @@ t_swagger_json(_Config) ->
     %% with auth
     Auth = auth_header_(<<"admin">>, <<"public_www1">>),
     {ok, 200, Body1} = request_api(get, Url, Auth),
-    ?assert(jsx:is_json(Body1)),
+    ?assert(emqx_utils_json:is_json(Body1)),
     %% without auth
     {ok, {{"HTTP/1.1", 200, "OK"}, _Headers, Body2}} =
         httpc:request(get, {Url, []}, [], [{body_format, binary}]),

+ 1 - 1
apps/emqx_dashboard/test/emqx_dashboard_api_test_helpers.erl

@@ -82,7 +82,7 @@ request(Username, Method, Url, Body) ->
             ->
                 {Url, [auth_header(Username)]};
             _ ->
-                {Url, [auth_header(Username)], "application/json", jsx:encode(Body)}
+                {Url, [auth_header(Username)], "application/json", emqx_utils_json:encode(Body)}
         end,
     ct:pal("Method: ~p, Request: ~p", [Method, Request]),
     case httpc:request(Method, Request, [], [{body_format, binary}]) of

+ 1 - 1
apps/emqx_gateway_lwm2m/src/emqx_lwm2m_message.erl

@@ -152,7 +152,7 @@ object_resource_id(BaseName) ->
 value(Value, ResourceId, ObjDefinition) ->
     case emqx_lwm2m_xml_object:get_resource_type(ResourceId, ObjDefinition) of
         "String" ->
-            % keep binary type since it is same as a string for jsx
+            % keep binary type since it is same as a string for emqx_utils_json
             Value;
         "Integer" ->
             Size = byte_size(Value) * 8,

+ 1 - 1
apps/emqx_management/test/emqx_mgmt_api_test_util.erl

@@ -157,7 +157,7 @@ api_path_without_base_path(Parts) ->
 %%
 %% Usage with RequestData:
 %% Payload = [{upload_type, <<"user_picture">>}],
-%% PayloadContent = jsx:encode(Payload),
+%% PayloadContent = emqx_utils_json:encode(Payload),
 %% RequestData = [
 %%     {<<"payload">>, PayloadContent}
 %% ]

+ 3 - 3
apps/emqx_modules/test/emqx_telemetry_api_SUITE.erl

@@ -113,7 +113,7 @@ t_status(_) ->
 
     ?assertEqual(
         #{<<"enable">> => false},
-        jsx:decode(Result0)
+        emqx_utils_json:decode(Result0)
     ),
 
     ?assertMatch(
@@ -139,7 +139,7 @@ t_status(_) ->
 
     ?assertEqual(
         #{<<"enable">> => true},
-        jsx:decode(Result1)
+        emqx_utils_json:decode(Result1)
     ),
 
     ?assertMatch(
@@ -180,7 +180,7 @@ t_data(_) ->
             <<"uuid">> := _,
             <<"vm_specs">> := _
         },
-        jsx:decode(Result)
+        emqx_utils_json:decode(Result)
     ),
 
     {ok, 200, _} =

+ 5 - 5
apps/emqx_modules/test/emqx_topic_metrics_api_SUITE.erl

@@ -74,7 +74,7 @@ t_mqtt_topic_metrics_collection(_) ->
 
     ?assertEqual(
         [],
-        jsx:decode(Result0)
+        emqx_utils_json:decode(Result0)
     ),
 
     {ok, 200, _} = request(
@@ -95,7 +95,7 @@ t_mqtt_topic_metrics_collection(_) ->
                 <<"metrics">> := #{}
             }
         ],
-        jsx:decode(Result1)
+        emqx_utils_json:decode(Result1)
     ),
 
     ?assertMatch(
@@ -150,7 +150,7 @@ t_mqtt_topic_metrics(_) ->
         uri(["mqtt", "topic_metrics"])
     ),
 
-    ?assertMatch([_], jsx:decode(Result0)),
+    ?assertMatch([_], emqx_utils_json:decode(Result0)),
 
     {ok, 200, Result1} = request(
         get,
@@ -162,7 +162,7 @@ t_mqtt_topic_metrics(_) ->
             <<"topic">> := <<"topic/1/2">>,
             <<"metrics">> := #{}
         },
-        jsx:decode(Result1)
+        emqx_utils_json:decode(Result1)
     ),
 
     ?assertMatch(
@@ -288,7 +288,7 @@ t_node_aggregation(_) ->
             <<"topic">> := <<"topic/1/2">>,
             <<"metrics">> := #{<<"messages.dropped.count">> := 3}
         },
-        jsx:decode(Result)
+        emqx_utils_json:decode(Result)
     ),
 
     meck:unload(emqx_topic_metrics_proto_v1).

+ 2 - 1
apps/emqx_utils/src/emqx_utils.app.src

@@ -14,7 +14,8 @@
     {registered, []},
     {applications, [
         kernel,
-        stdlib
+        stdlib,
+        jiffy
     ]},
     {env, []},
     {licenses, ["Apache-2.0"]},

+ 4 - 2
apps/emqx_utils/src/emqx_utils_json.erl

@@ -65,7 +65,7 @@ encode(Term) ->
 
 -spec encode(json_term(), encode_options()) -> json_text().
 encode(Term, Opts) ->
-    to_binary(emqx_utils_json:encode(to_ejson(Term), Opts)).
+    to_binary(jiffy:encode(to_ejson(Term), Opts)).
 
 -spec safe_encode(json_term()) ->
     {ok, json_text()} | {error, Reason :: term()}.
@@ -87,7 +87,7 @@ decode(Json) -> decode(Json, [return_maps]).
 
 -spec decode(json_text(), decode_options()) -> json_term().
 decode(Json, Opts) ->
-    from_ejson(emqx_utils_json:decode(Json, Opts)).
+    from_ejson(jiffy:decode(Json, Opts)).
 
 -spec safe_decode(json_text()) ->
     {ok, json_term()} | {error, Reason :: term()}.
@@ -125,6 +125,8 @@ to_ejson([{_, _} | _] = L) ->
     {[{K, to_ejson(V)} || {K, V} <- L]};
 to_ejson(L) when is_list(L) ->
     [to_ejson(E) || E <- L];
+to_ejson(M) when is_map(M) ->
+    maps:map(fun(_K, V) -> to_ejson(V) end, M);
 to_ejson(T) ->
     T.
 

+ 14 - 9
apps/emqx_utils/test/emqx_utils_json_SUITE.erl

@@ -84,10 +84,10 @@ t_decode_encode(_) ->
     1.25 = decode(encode(1.25)),
     [] = decode(encode([])),
     [true, 1] = decode(encode([true, 1])),
-    [{}] = decode(encode([{}])),
-    [{<<"foo">>, <<"bar">>}] = decode(encode([{foo, bar}])),
-    [{<<"foo">>, <<"bar">>}] = decode(encode([{<<"foo">>, <<"bar">>}])),
-    [[{<<"foo">>, <<"bar">>}]] = decode(encode([[{<<"foo">>, <<"bar">>}]])),
+    [{}] = decode(encode([{}]), []),
+    [{<<"foo">>, <<"bar">>}] = decode(encode([{foo, bar}]), []),
+    [{<<"foo">>, <<"bar">>}] = decode(encode([{<<"foo">>, <<"bar">>}]), []),
+    [[{<<"foo">>, <<"bar">>}]] = decode(encode([[{<<"foo">>, <<"bar">>}]]), []),
     [
         [
             {<<"foo">>, <<"bar">>},
@@ -101,7 +101,8 @@ t_decode_encode(_) ->
                 {<<"a">>, <<"b">>}
             ],
             [{<<"x">>, <<"y">>}]
-        ])
+        ]),
+        []
     ),
     #{<<"foo">> := <<"bar">>} = decode(encode(#{<<"foo">> => <<"bar">>}), [return_maps]),
     JsonText = <<"{\"bool\":true,\"int\":10,\"foo\":\"bar\"}">>,
@@ -110,8 +111,12 @@ t_decode_encode(_) ->
         <<"int">> => 10,
         <<"foo">> => <<"bar">>
     },
-    ?assertEqual(JsonText, encode({decode(JsonText)})),
-    ?assertEqual(JsonMaps, decode(JsonText, [return_maps])).
+    ?assertEqual(JsonText, encode({decode(JsonText, [])})),
+    ?assertEqual(JsonMaps, decode(JsonText, [return_maps])),
+    ?assertEqual(
+        #{<<"foo">> => #{<<"bar">> => <<"baz">>}},
+        decode(encode(#{<<"foo">> => [{<<"bar">>, <<"baz">>}]}))
+    ).
 
 t_safe_decode_encode(_) ->
     safe_encode_decode(null),
@@ -123,7 +128,7 @@ t_safe_decode_encode(_) ->
     1.25 = safe_encode_decode(1.25),
     [] = safe_encode_decode([]),
     [true, 1] = safe_encode_decode([true, 1]),
-    [{}] = decode(encode([{}])),
+    [{}] = decode(encode([{}]), []),
     [{<<"foo">>, <<"bar">>}] = safe_encode_decode([{foo, bar}]),
     [{<<"foo">>, <<"bar">>}] = safe_encode_decode([{<<"foo">>, <<"bar">>}]),
     [[{<<"foo">>, <<"bar">>}]] = safe_encode_decode([[{<<"foo">>, <<"bar">>}]]),
@@ -132,7 +137,7 @@ t_safe_decode_encode(_) ->
 
 safe_encode_decode(Term) ->
     {ok, Json} = emqx_utils_json:safe_encode(Term),
-    case emqx_utils_json:safe_decode(Json) of
+    case emqx_utils_json:safe_decode(Json, []) of
         {ok, {NTerm}} -> NTerm;
         {ok, NTerm} -> NTerm
     end.