@yuneta/gobj-js 7.25.7 → 7.25.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -24,8 +24,8 @@ function vsprintf(fmt, argv) {
24
24
  return sprintf.apply(null, [fmt].concat(argv || []));
25
25
  }
26
26
  function sprintf_format(parse_tree, argv) {
27
- var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign;
28
- for (i = 0; i < tree_length; i++) if (typeof parse_tree[i] === "string") output += parse_tree[i];
27
+ var cursor = 1, tree_length = parse_tree.length, arg, output = "", i = 0, k, ph, pad, pad_character, pad_length, is_positive, sign;
28
+ for (; i < tree_length; i++) if (typeof parse_tree[i] === "string") output += parse_tree[i];
29
29
  else if (typeof parse_tree[i] === "object") {
30
30
  ph = parse_tree[i];
31
31
  if (ph.keys) {
@@ -1334,7 +1334,7 @@ function write_json_parameters(gobj, kw, jn_global) {
1334
1334
  let new_kw = kw;
1335
1335
  if (json2sdata(hs, new_kw, -1, gobj.gclass.gclass_flag & gclass_flag_t.gcflag_ignore_unknown_attrs ? 0 : print_attr_not_found, gobj) < 0) {
1336
1336
  log_error(`${gobj_short_name(gobj)} json2data() FAILED`);
1337
- trace_json(new_kw);
1337
+ trace_json_masked(new_kw);
1338
1338
  }
1339
1339
  }
1340
1340
  /************************************************************
@@ -2549,7 +2549,7 @@ function gobj_send_event(dst, event, kw, src) {
2549
2549
  else trace_machine(sprintf("🔃 mach(%s%s), st: %s, ev: %s, from(%s%s)", !dst.running ? "!!" : "", gobj_short_name(dst), state.state_name, event ? event : "", src && !src.running ? "!!" : "", gobj_short_name(src)));
2550
2550
  if (kw) {
2551
2551
  if (__trace_gobj_ev_kw__(dst)) {
2552
- if (json_object_size(kw)) trace_json(kw);
2552
+ if (json_object_size(kw)) trace_json_masked(kw);
2553
2553
  }
2554
2554
  }
2555
2555
  }
@@ -2569,7 +2569,7 @@ function gobj_send_event(dst, event, kw, src) {
2569
2569
  }
2570
2570
  if (kw) {
2571
2571
  if (__trace_gobj_ev_kw__(dst)) {
2572
- if (json_object_size(kw)) trace_json(kw);
2572
+ if (json_object_size(kw)) trace_json_masked(kw);
2573
2573
  }
2574
2574
  }
2575
2575
  }
@@ -2583,9 +2583,25 @@ function gobj_send_event(dst, event, kw, src) {
2583
2583
  return ret;
2584
2584
  }
2585
2585
  var subs_flag_t = Object.freeze({
2586
- __hard_subscription__: 1,
2587
- __own_event__: 2
2586
+ __rename_event_name__: 1,
2587
+ __hard_subscription__: 2,
2588
+ __own_event__: 4
2588
2589
  });
2590
+ /***************************************************************************
2591
+ * The event type of `event_name` in any registered gclass, null if none.
2592
+ * The C kernel's gobj_find_event_type(): any case, gclasses only.
2593
+ ***************************************************************************/
2594
+ function _find_event_type_in_gclasses(event_name) {
2595
+ let lower = String(event_name).toLowerCase();
2596
+ for (let gclass_name in _gclass_register) {
2597
+ let dl = _gclass_register[gclass_name].dl_events;
2598
+ for (let i = 0; i < dl.length; i++) {
2599
+ let event_type = dl[i];
2600
+ if (event_type.event_name && event_type.event_name.toLowerCase() === lower) return event_type;
2601
+ }
2602
+ }
2603
+ return null;
2604
+ }
2589
2605
  var subscription_desc = [
2590
2606
  SDATA(data_type_t.DTP_POINTER, "publisher", 0, null, "publisher gobj"),
2591
2607
  SDATA(data_type_t.DTP_POINTER, "subscriber", 0, null, "subscriber gobj"),
@@ -2618,6 +2634,21 @@ function _create_subscription(publisher, event, kw, subscriber) {
2618
2634
  if (json_size(__config__) > 0) {
2619
2635
  let kw_clone = json_deep_copy(__config__);
2620
2636
  json_object_set_new(subs, "__config__", kw_clone);
2637
+ let renamed_event = kw_get_str(publisher, kw_clone, "__rename_event_name__", "");
2638
+ if (!empty_string(renamed_event)) {
2639
+ let event_type = _find_event_type_in_gclasses(renamed_event);
2640
+ if (event_type) {
2641
+ json_object_set_new(subs, "renamed_event", event_type.event_name);
2642
+ delete kw_clone.__rename_event_name__;
2643
+ subs_flag |= subs_flag_t.__rename_event_name__;
2644
+ let kw_global = kw_get_dict(publisher, subs, "__global__", null);
2645
+ if (!is_object(kw_global)) {
2646
+ kw_global = {};
2647
+ json_object_set_new(subs, "__global__", kw_global);
2648
+ }
2649
+ kw_global.__original_event_name__ = event;
2650
+ } else log_error(`${gobj_short_name(publisher)}: EVENT NOT FOUND (__rename_event_name__: ${renamed_event})`);
2651
+ }
2621
2652
  if (kw_has_key(kw_clone, "__hard_subscription__")) {
2622
2653
  let hard_subscription = kw_get_bool(publisher, kw_clone, "__hard_subscription__", false);
2623
2654
  json_object_del(kw_clone, "__hard_subscription__");
@@ -2637,9 +2668,52 @@ function _create_subscription(publisher, event, kw, subscriber) {
2637
2668
  return subs;
2638
2669
  }
2639
2670
  /***************************************************************************
2671
+ * The kw to find the subscriptions a (un)subscription `kw` names: `kw` as
2672
+ * _create_subscription() stores it, as the C kernel's
2673
+ * _subscription_match_kw(). The three `__config__` keys the framework
2674
+ * reads (__hard_subscription__, __own_event__, __rename_event_name__)
2675
+ * become the subs_flag and are taken out of the stored `__config__`, and
2676
+ * a renamed event adds `__original_event_name__` to the stored
2677
+ * `__global__`: with `kw` as it came, the same kw matched no subscription,
2678
+ * a repeat of it was made twice (the subscriber got each event twice) and
2679
+ * its withdrawal found nothing. A known renamed event is returned in
2680
+ * `renamed_event`, which _match_subscription() compares: a plain and a
2681
+ * renamed subscription, or two renames of one event, are two. A rename
2682
+ * that no gclass declares stays in the stored `__config__`, and in this
2683
+ * one. Up to gobj-js 7.25.8 the kw was compared as it came, and
2684
+ * `__rename_event_name__` always stayed in the stored `__config__`: a
2685
+ * plain kw with the rest of that __config__ found no repeat (two
2686
+ * subscriptions where C has one).
2687
+ * Return {kw, renamed_event}; renamed_event is "" when kw does not rename.
2688
+ ***************************************************************************/
2689
+ function _subscription_match_kw(kw, event) {
2690
+ let __config__ = kw ? kw.__config__ : null;
2691
+ if (!is_object(__config__) || !kw_has_key(__config__, "__hard_subscription__") && !kw_has_key(__config__, "__own_event__") && !kw_has_key(__config__, "__rename_event_name__")) return {
2692
+ kw,
2693
+ renamed_event: ""
2694
+ };
2695
+ let kw_match = Object.assign({}, kw);
2696
+ let config_match = Object.assign({}, __config__);
2697
+ kw_match.__config__ = config_match;
2698
+ let renamed_event = "";
2699
+ let rename = config_match.__rename_event_name__;
2700
+ let event_type = typeof rename === "string" && !empty_string(rename) ? _find_event_type_in_gclasses(rename) : null;
2701
+ if (event_type) {
2702
+ renamed_event = event_type.event_name;
2703
+ delete config_match.__rename_event_name__;
2704
+ if (event && json_size(kw_match.__global__) > 0) kw_match.__global__ = Object.assign({}, kw_match.__global__, { __original_event_name__: event });
2705
+ }
2706
+ delete config_match.__hard_subscription__;
2707
+ delete config_match.__own_event__;
2708
+ return {
2709
+ kw: kw_match,
2710
+ renamed_event
2711
+ };
2712
+ }
2713
+ /***************************************************************************
2640
2714
  * Match subscription
2641
2715
  ***************************************************************************/
2642
- function _match_subscription(subs, publisher, event, kw, subscriber) {
2716
+ function _match_subscription(subs, publisher, event, renamed_event, kw, subscriber) {
2643
2717
  let __config__ = kw_get_dict(publisher, kw, "__config__", null);
2644
2718
  let __global__ = kw_get_dict(publisher, kw, "__global__", null);
2645
2719
  let __local__ = kw_get_dict(publisher, kw, "__local__", null);
@@ -2654,6 +2728,9 @@ function _match_subscription(subs, publisher, event, kw, subscriber) {
2654
2728
  if (event) {
2655
2729
  if (event !== kw_get_str(null, subs, "event", "")) match = false;
2656
2730
  }
2731
+ if (renamed_event) {
2732
+ if (renamed_event !== kw_get_str(null, subs, "renamed_event", "")) match = false;
2733
+ }
2657
2734
  if (json_size(__config__) > 0) {
2658
2735
  let kw_config = kw_get_dict(null, subs, "__config__", null);
2659
2736
  if (json_size(kw_config) > 0) {
@@ -2688,26 +2765,29 @@ function _match_subscription(subs, publisher, event, kw, subscriber) {
2688
2765
  * kw (__config__, __global__, __local__, __filter__),
2689
2766
  * subscriber
2690
2767
  ***************************************************************************/
2691
- function _find_subscriptions(dl_subs, publisher, event, kw, subscriber) {
2768
+ function _find_subscriptions(dl_subs, publisher, event, renamed_event, kw, subscriber) {
2692
2769
  let iter = [];
2693
2770
  for (let i = 0; i < dl_subs.length; i++) {
2694
2771
  let subs = dl_subs[i];
2695
- if (_match_subscription(subs, publisher, event, kw, subscriber)) json_array_append(iter, subs);
2772
+ if (_match_subscription(subs, publisher, event, renamed_event, kw, subscriber)) json_array_append(iter, subs);
2696
2773
  }
2697
2774
  return iter;
2698
2775
  }
2699
2776
  /***************************************************************************
2700
- * Find idx of subscription in dl_subs, -1 not found
2777
+ * Find idx of the subscription `subs` itself in dl_subs, -1 not found.
2778
+ * Up to gobj-js 7.25.8 it was the first entry whose fields matched `subs`:
2779
+ * a subscription already removed took a live one that matched it (a plain
2780
+ * one matches every other of its event and subscriber).
2701
2781
  ***************************************************************************/
2702
- function _get_subs_idx(dl_subs, publisher, event, kw, subscriber) {
2703
- for (let i = 0; i < dl_subs.length; i++) {
2704
- let subs = dl_subs[i];
2705
- if (_match_subscription(subs, publisher, event, kw, subscriber)) return i;
2706
- }
2707
- return -1;
2782
+ function _get_subs_idx(dl_subs, subs) {
2783
+ return dl_subs.indexOf(subs);
2708
2784
  }
2709
2785
  /***************************************************************************
2710
- * Delete subscription in publisher and subscriber
2786
+ * Delete subscription in publisher and subscriber.
2787
+ * Return 0 removed, -1 a hard one kept (only `force` removes it), 1 it
2788
+ * was not there any more: already removed, as a stale reference is, or by
2789
+ * the mt_subscription_deleted() of an earlier entry of the same list. The
2790
+ * caller says which is an error. As in C.
2711
2791
  ***************************************************************************/
2712
2792
  function _delete_subscription(gobj, subs, force, not_inform) {
2713
2793
  let publisher = kw_get_pointer(gobj, subs, "publisher", null, kw_flag_t.KW_REQUIRED);
@@ -2716,7 +2796,12 @@ function _delete_subscription(gobj, subs, force, not_inform) {
2716
2796
  if (kw_get_int(gobj, subs, "subs_flag", null, kw_flag_t.KW_REQUIRED) & subs_flag_t.__hard_subscription__ ? 1 : 0) {
2717
2797
  if (!force) return -1;
2718
2798
  }
2719
- if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2799
+ let tracea = __trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher);
2800
+ if (_get_subs_idx(publisher.dl_subscriptions, subs) < 0) {
2801
+ if (tracea) trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s', ALREADY REMOVED", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2802
+ return 1;
2803
+ }
2804
+ if (tracea) {
2720
2805
  trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s'", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2721
2806
  trace_json(subs);
2722
2807
  }
@@ -2725,13 +2810,13 @@ function _delete_subscription(gobj, subs, force, not_inform) {
2725
2810
  if (publisher.gclass.gmt.mt_subscription_deleted) publisher.gclass.gmt.mt_subscription_deleted(publisher, subs);
2726
2811
  }
2727
2812
  }
2728
- let idx = _get_subs_idx(publisher.dl_subscriptions, publisher, event, subs, subscriber);
2813
+ let idx = _get_subs_idx(publisher.dl_subscriptions, subs);
2729
2814
  if (idx >= 0) json_array_remove(publisher.dl_subscriptions, idx);
2730
2815
  else {
2731
2816
  log_error(`${gobj_short_name(gobj)}: subscription in publisher not found`);
2732
2817
  trace_json(subs);
2733
2818
  }
2734
- idx = _get_subs_idx(subscriber.dl_subscribings, publisher, event, subs, subscriber);
2819
+ idx = _get_subs_idx(subscriber.dl_subscribings, subs);
2735
2820
  if (idx >= 0) json_array_remove(subscriber.dl_subscribings, idx);
2736
2821
  else {
2737
2822
  log_error(`${gobj_short_name(gobj)}: subscription in subscriber not found`);
@@ -2774,7 +2859,17 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
2774
2859
  }
2775
2860
  }
2776
2861
  } else event = "";
2777
- let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2862
+ let match = _subscription_match_kw(kw, event);
2863
+ let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, match.renamed_event, match.kw, subscriber);
2864
+ let subs_hard = null;
2865
+ for (let i = 0; i < dl_subs.length; i++) if (kw_get_int(publisher, dl_subs[i], "subs_flag", 0, kw_flag_t.KW_REQUIRED) & subs_flag_t.__hard_subscription__) {
2866
+ subs_hard = dl_subs[i];
2867
+ break;
2868
+ }
2869
+ if (subs_hard) {
2870
+ log_warning(`${gobj_short_name(publisher)}: Hard subscription REPEATED, the one there is kept and returned (event: ${event}, subscriber: ${gobj_short_name(subscriber)})`);
2871
+ return subs_hard;
2872
+ }
2778
2873
  if (json_array_size(dl_subs) > 0) {
2779
2874
  log_error(`${gobj_short_name(publisher)}: ${json_array_size(dl_subs)} subscription(s) REPEATED, will be deleted and override`);
2780
2875
  trace_json(dl_subs, "subscription REPEATED");
@@ -2789,7 +2884,7 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
2789
2884
  json_array_append(subscriber.dl_subscribings, subs);
2790
2885
  if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2791
2886
  trace_machine(sprintf("💜💜👍 subscribing event '%s', publisher '%s', subscriber %s", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2792
- if (kw && (__trace_gobj_ev_kw__(subscriber) || __trace_gobj_ev_kw__(publisher))) trace_json(kw);
2887
+ if (kw && (__trace_gobj_ev_kw__(subscriber) || __trace_gobj_ev_kw__(publisher))) trace_json_masked(kw);
2793
2888
  }
2794
2889
  if (publisher.gclass.gmt.mt_subscription_added) {
2795
2890
  let result = publisher.gclass.gmt.mt_subscription_added(publisher, subs);
@@ -2831,16 +2926,22 @@ function gobj_unsubscribe_event(publisher, event, kw, subscriber) {
2831
2926
  }
2832
2927
  }
2833
2928
  } else event = "";
2834
- let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2929
+ let match = _subscription_match_kw(kw, event);
2930
+ let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, match.renamed_event, match.kw, subscriber);
2835
2931
  let deleted = 0;
2932
+ let kept_hard = 0;
2933
+ let already_removed = 0;
2836
2934
  for (let i = 0; i < dl_subs.length; i++) {
2837
2935
  let subs = dl_subs[i];
2838
- _delete_subscription(publisher, subs, false, false);
2839
- deleted++;
2936
+ let ret = _delete_subscription(publisher, subs, false, false);
2937
+ if (ret === 0) deleted++;
2938
+ else if (ret < 0) kept_hard++;
2939
+ else already_removed++;
2840
2940
  }
2841
- if (!deleted) {
2941
+ if (kept_hard) log_warning(`${gobj_short_name(publisher)}: Hard subscription not removed, only gobj_unsubscribe_list() with force removes it (event: ${event}, hard: ${kept_hard})`);
2942
+ else if (!deleted && !already_removed) {
2842
2943
  log_warning(`${gobj_short_name(publisher)}: No subscription found`);
2843
- trace_json(kw, "No subscription found");
2944
+ trace_json_masked(kw, "No subscription found");
2844
2945
  }
2845
2946
  return 0;
2846
2947
  }
@@ -2849,10 +2950,12 @@ function gobj_unsubscribe_event(publisher, event, kw, subscriber) {
2849
2950
  ***************************************************************************/
2850
2951
  function gobj_unsubscribe_list(gobj, dl_subs, force) {
2851
2952
  let dl = [...dl_subs];
2953
+ let already_removed = 0;
2852
2954
  for (let i = 0; i < dl.length; i++) {
2853
2955
  let subs = dl[i];
2854
- _delete_subscription(gobj, subs, force, false);
2956
+ if (_delete_subscription(gobj, subs, force, false) > 0) already_removed++;
2855
2957
  }
2958
+ if (already_removed) log_warning(`${gobj_short_name(gobj)}: Subscription(s) already removed, nothing to remove (count: ${already_removed})`);
2856
2959
  return 0;
2857
2960
  }
2858
2961
  /***************************************************************************
@@ -2864,7 +2967,7 @@ function gobj_unsubscribe_list(gobj, dl_subs, force) {
2864
2967
  ***************************************************************************/
2865
2968
  function gobj_find_subscriptions(publisher, event, kw, subscriber) {
2866
2969
  if (kw == null) kw = {};
2867
- return _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2970
+ return _find_subscriptions(publisher.dl_subscriptions, publisher, event, null, kw, subscriber);
2868
2971
  }
2869
2972
  /***************************************************************************
2870
2973
  *
@@ -2903,7 +3006,7 @@ function gobj_list_subscriptions(gobj2view) {
2903
3006
  * subscriber
2904
3007
  ***************************************************************************/
2905
3008
  function gobj_find_subscribings(subscriber, event, kw, publisher) {
2906
- return _find_subscriptions(subscriber.dl_subscribings, publisher, event, kw, subscriber);
3009
+ return _find_subscriptions(subscriber.dl_subscribings, publisher, event, null, kw, subscriber);
2907
3010
  }
2908
3011
  /***************************************************************************
2909
3012
  * Return the sum of returns of gobj_send_event
@@ -2929,7 +3032,7 @@ function gobj_publish_event(publisher, event, kw) {
2929
3032
  if (tracea) {
2930
3033
  if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔝 %s %s%s %s", event ? event : "", !publisher.running ? "!!" : "", gobj_short_name(publisher), publisher.current_state.state_name));
2931
3034
  else trace_machine(sprintf("🔝🔝 mach(%s%s^%s), st: %s, ev: %s%s%s", !publisher.running ? "!!" : "", gobj_gclass_name(publisher), gobj_name(publisher), publisher.current_state.state_name, "", event ? event : "", ""));
2932
- if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw)) trace_json(kw);
3035
+ if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw)) trace_json_masked(kw);
2933
3036
  }
2934
3037
  if (publisher.gclass.gmt.mt_publish_event) {
2935
3038
  let topublish = publisher.gclass.gmt.mt_publish_event(publisher, event, kw);
@@ -2954,11 +3057,12 @@ function gobj_publish_event(publisher, event, kw) {
2954
3057
  let __global__ = kw_get_dict(publisher, subs, "__global__", null, 0);
2955
3058
  let __local__ = kw_get_dict(publisher, subs, "__local__", null, 0);
2956
3059
  let __filter__ = kw_get_dict_value(publisher, subs, "__filter__", null, 0);
2957
- let kw2publish = kw;
3060
+ let event_name = subs.renamed_event;
3061
+ if (empty_string(event_name)) event_name = event;
2958
3062
  let topublish = 1;
2959
- if (publisher.gclass.gmt.mt_publication_filter) topublish = publisher.gclass.gmt.mt_publication_filter(publisher, event, kw2publish, subscriber);
3063
+ if (publisher.gclass.gmt.mt_publication_filter) topublish = publisher.gclass.gmt.mt_publication_filter(publisher, event, kw, subscriber);
2960
3064
  else if (json_size(__filter__) > 0) {
2961
- topublish = kw_match_simple(kw2publish, __filter__) ? 1 : 0;
3065
+ topublish = kw_match_simple(kw, __filter__) ? 1 : 0;
2962
3066
  if (tracea) {
2963
3067
  trace_machine(sprintf("💜💜🔄%s publishing with filter, event '%s', subscriber'%s', publisher %s", topublish ? "👍" : "👎", event ? event : "", gobj_short_name(subscriber), gobj_short_name(publisher)));
2964
3068
  trace_json(__filter__);
@@ -2972,15 +3076,17 @@ function gobj_publish_event(publisher, event, kw) {
2972
3076
  if (!gobj_has_event(subscriber, ev_.event_name, 0)) continue;
2973
3077
  }
2974
3078
  }
2975
- if (__local__) kw_pop(kw2publish, __local__);
3079
+ let kw2publish = kw;
3080
+ if (json_size(__local__) > 0 || json_size(__global__) > 0) kw2publish = Object.assign({}, kw);
3081
+ if (json_size(__local__) > 0) kw_pop(kw2publish, __local__);
2976
3082
  if (__config__) {}
2977
- if (__global__) json_object_update(kw2publish, __global__);
3083
+ if (json_size(__global__) > 0) json_object_update(kw2publish, json_deep_copy(__global__));
2978
3084
  if (tracea) {
2979
- if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔄 %s (%s) %s%s", event ? event : "", event ? event : "", !subscriber.running ? "!!" : "", gobj_short_name(subscriber)));
2980
- else trace_machine(sprintf("🔝🔄 mach(%s%s), st: %s, ev: %s, from(%s%s)", !subscriber.running ? "!!" : "", gobj_short_name(subscriber), gobj_current_state(subscriber), event ? event : "", publisher && !publisher.running ? "!!" : "", gobj_short_name(publisher)));
2981
- if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw2publish)) trace_json(kw2publish);
3085
+ if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔄 %s (%s) %s%s", event ? event : "", event_name ? event_name : "", !subscriber.running ? "!!" : "", gobj_short_name(subscriber)));
3086
+ else trace_machine(sprintf("🔝🔄 mach(%s%s), st: %s, ev: %s (%s), from(%s%s)", !subscriber.running ? "!!" : "", gobj_short_name(subscriber), gobj_current_state(subscriber), event ? event : "", event_name ? event_name : "", publisher && !publisher.running ? "!!" : "", gobj_short_name(publisher)));
3087
+ if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw2publish)) trace_json_masked(kw2publish);
2982
3088
  }
2983
- let ret_ = gobj_send_event(subscriber, event, kw2publish, publisher);
3089
+ let ret_ = gobj_send_event(subscriber, event_name, kw2publish, publisher);
2984
3090
  if (ret_ < 0 && subs_flag & subs_flag_t.__own_event__) {
2985
3091
  sent_count = -1;
2986
3092
  break;
@@ -3004,8 +3110,9 @@ function gobj_command(gobj, command, kw, src) {
3004
3110
  return -1;
3005
3111
  }
3006
3112
  if (is_commands_tracing(gobj) || is_machine_tracing(gobj, null) && !is_machine_not_tracing(src, null)) {
3007
- trace_machine(sprintf("🌀🌀 mach(%s%s), cmd: %s, src: %s", !gobj_is_running(gobj) ? "!!" : "", gobj_short_name(gobj), command, gobj_short_name(src)));
3008
- if (__trace_gobj_ev_kw__(gobj)) trace_json(kw);
3113
+ let command_shown = mask_secrets_inline(command);
3114
+ trace_machine(sprintf("🌀🌀 mach(%s%s), cmd: %s, src: %s", !gobj_is_running(gobj) ? "!!" : "", gobj_short_name(gobj), command_shown !== null ? command_shown : command, gobj_short_name(src)));
3115
+ if (__trace_gobj_ev_kw__(gobj)) trace_json_masked(kw);
3009
3116
  }
3010
3117
  if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
3011
3118
  if (gobj.gclass.command_table) {
@@ -3221,6 +3328,268 @@ function trace_json(jn, msg) {
3221
3328
  emit_log_callback("json", jn, current_timestamp());
3222
3329
  }
3223
3330
  /************************************************************
3331
+ * The names of the secrets (is_secret_name()). The same lists
3332
+ * as the C kernel's helpers.c: a name that holds one of these
3333
+ * (any case) is a secret.
3334
+ ************************************************************/
3335
+ var SECRET_NAME_PARTS = [
3336
+ "passw",
3337
+ "pwd",
3338
+ "passphrase",
3339
+ "secret",
3340
+ "token",
3341
+ "jwt",
3342
+ "bearer",
3343
+ "authorization",
3344
+ "cookie",
3345
+ "credential",
3346
+ "salt"
3347
+ ];
3348
+ var SECRET_NAME_JOINED = [
3349
+ "apikey",
3350
+ "sessionid",
3351
+ "sessionkey",
3352
+ "authdata"
3353
+ ];
3354
+ var NOT_SECRET_SEGMENTS = /* @__PURE__ */ new Set([
3355
+ "endpoint",
3356
+ "url",
3357
+ "uri",
3358
+ "domain",
3359
+ "path",
3360
+ "file",
3361
+ "public",
3362
+ "pub",
3363
+ "count",
3364
+ "counts",
3365
+ "type",
3366
+ "name",
3367
+ "len",
3368
+ "length",
3369
+ "size",
3370
+ "max",
3371
+ "min",
3372
+ "ttl",
3373
+ "timeout",
3374
+ "expiry",
3375
+ "expires",
3376
+ "mode"
3377
+ ]);
3378
+ /************************************************************
3379
+ * TRUE if `name` is the name of a secret: a password, a token,
3380
+ * a key... Any case. As the C kernel's is_secret_name().
3381
+ ************************************************************/
3382
+ function is_secret_name(name) {
3383
+ if (typeof name !== "string" || name.length < 3) return false;
3384
+ let lower = name.toLowerCase();
3385
+ let hit = false;
3386
+ for (const part of SECRET_NAME_PARTS) if (lower.indexOf(part) >= 0) {
3387
+ hit = true;
3388
+ break;
3389
+ }
3390
+ if (!hit) {
3391
+ let joined = lower.replace(/[_\-. \t]/g, "");
3392
+ for (const part of SECRET_NAME_JOINED) if (joined.indexOf(part) >= 0) {
3393
+ hit = true;
3394
+ break;
3395
+ }
3396
+ }
3397
+ if (!hit) hit = lower.indexOf("priv") >= 0 && lower.indexOf("key") >= 0;
3398
+ if (!hit) return false;
3399
+ for (const segment of lower.split(/[_\-. \t]/)) if (NOT_SECRET_SEGMENTS.has(segment)) return false;
3400
+ return true;
3401
+ }
3402
+ /************************************************************
3403
+ * Where an unquoted secret value that begins at `p` ends: at
3404
+ * the end, at the quote that closes an outer quoted value, or
3405
+ * before the next "word=" -- a plain word after a blank is still
3406
+ * part of it ("password=correct horse battery", "password=
3407
+ * hunter2"). As the C kernel's inline_secret_value_end().
3408
+ ************************************************************/
3409
+ function inline_secret_value_end(str, p, outer) {
3410
+ const blank = (c) => c === " " || c === " ";
3411
+ const closes_outer = (i) => outer && str[i] === outer && (i + 1 >= str.length || blank(str[i + 1]));
3412
+ let end = p;
3413
+ while (true) {
3414
+ while (end < str.length && !blank(str[end])) {
3415
+ if (closes_outer(end)) return end;
3416
+ end++;
3417
+ }
3418
+ if (end >= str.length) return end;
3419
+ let w = end;
3420
+ while (w < str.length && blank(str[w])) w++;
3421
+ if (w >= str.length || closes_outer(w)) return end;
3422
+ for (let e = w; e < str.length && !blank(str[e]) && !closes_outer(e); e++) if (str[e] === "=" && e > w) return end;
3423
+ end = w;
3424
+ }
3425
+ }
3426
+ /************************************************************
3427
+ * A text (a command line) with the value of every "name=value"
3428
+ * whose name is a secret's written as "********", quoted or not
3429
+ * (and the "value" of a write-attr whose attribute names a
3430
+ * secret). The rest as it is. Return null when there was nothing
3431
+ * to mask. As the C kernel's mask_secrets_inline().
3432
+ ************************************************************/
3433
+ var MASK_MAX_NAME = 128;
3434
+ var MASK_MAX_BYTES = 4194304;
3435
+ var MASK_TOO_LARGE = "<not shown: too large to mask>";
3436
+ function mask_secrets_inline(str) {
3437
+ if (typeof str !== "string" || str.indexOf("=") < 0) return null;
3438
+ if (str.length > MASK_MAX_BYTES) return MASK_TOO_LARGE;
3439
+ let value_is_secret = false;
3440
+ let re_attr = /(^|[ \t])attribute=["']?([^ \t"']*)/g;
3441
+ let m;
3442
+ while ((m = re_attr.exec(str)) !== null) if (is_secret_name(m[2].slice(-128))) value_is_secret = true;
3443
+ let parts = [];
3444
+ let copied = 0;
3445
+ let changed = false;
3446
+ let outer = "";
3447
+ let word = 0;
3448
+ let p = 0;
3449
+ const is_blank_or_end = (i) => i >= str.length || str[i] === " " || str[i] === " ";
3450
+ while (p < str.length) {
3451
+ let c = str[p];
3452
+ if (c === " " || c === " ") {
3453
+ p++;
3454
+ word = p;
3455
+ continue;
3456
+ }
3457
+ if (c === "\"" || c === "'") {
3458
+ if (!outer && (p === 0 || str[p - 1] === " " || str[p - 1] === " " || str[p - 1] === "=")) outer = c;
3459
+ else if (c === outer && is_blank_or_end(p + 1)) outer = "";
3460
+ }
3461
+ if (c !== "=") {
3462
+ p++;
3463
+ continue;
3464
+ }
3465
+ let name = str.substring(Math.max(word, p - MASK_MAX_NAME), p);
3466
+ word = p + 1;
3467
+ if (!(is_secret_name(name) || value_is_secret && name.toLowerCase() === "value")) {
3468
+ p++;
3469
+ continue;
3470
+ }
3471
+ p++;
3472
+ let quote = str[p] === "\"" || str[p] === "'" ? str[p] : "";
3473
+ let end;
3474
+ if (quote) {
3475
+ end = p + 1;
3476
+ while (end < str.length && str[end] !== quote) end++;
3477
+ if (str[end] === quote) end++;
3478
+ } else end = inline_secret_value_end(str, p, outer);
3479
+ if (end > p) {
3480
+ parts.push(str.substring(copied, p));
3481
+ parts.push("********");
3482
+ copied = end;
3483
+ changed = true;
3484
+ }
3485
+ p = end;
3486
+ word = p;
3487
+ }
3488
+ if (!changed) return null;
3489
+ parts.push(str.substring(copied));
3490
+ return parts.join("");
3491
+ }
3492
+ /************************************************************
3493
+ * A json as a log or a trace may show it: at any depth, the
3494
+ * value of a key with a secret's name is "********", whatever
3495
+ * its type (not an absent one, a null or an empty string); so is
3496
+ * the "value" of a dict whose "attribute" names a secret; and a
3497
+ * string is masked as mask_secrets_inline(). Return a masked
3498
+ * copy, or `jn` itself when there was nothing to mask. As the C
3499
+ * kernel's json_mask_secrets().
3500
+ *
3501
+ * Only JSON is walked: plain objects (their prototype is
3502
+ * Object.prototype or null) and arrays. Anything else -- a gobj,
3503
+ * a DOM node, a class instance, a typed array, a function -- is
3504
+ * passed as it is, never walked, as trace_json() always showed it
3505
+ * (a kw may carry a gobj: its parent and children make a cycle).
3506
+ * A plain object met twice is masked once, the same everywhere; a
3507
+ * cycle back to one is "<cycle>"; below MASK_MAX_DEPTH levels
3508
+ * (64, as in C) nothing is shown.
3509
+ * It never throws: a failure is the placeholder below.
3510
+ ************************************************************/
3511
+ var MASK_MAX_DEPTH = 64;
3512
+ var MASK_FAILED = "<not shown: the masking failed>";
3513
+ function is_plain_object(value) {
3514
+ if (value === null || typeof value !== "object") return false;
3515
+ let proto = Object.getPrototypeOf(value);
3516
+ return proto === Object.prototype || proto === null;
3517
+ }
3518
+ var MASK_IN_PROGRESS = Symbol("mask-in-progress");
3519
+ function _json_mask_secrets(jn, memo, depth, budget) {
3520
+ if (typeof jn === "string") {
3521
+ if (jn.length > budget.left) {
3522
+ budget.left = 0;
3523
+ return MASK_TOO_LARGE;
3524
+ }
3525
+ budget.left -= jn.length;
3526
+ let masked = mask_secrets_inline(jn);
3527
+ return masked !== null ? masked : jn;
3528
+ }
3529
+ let is_array = Array.isArray(jn);
3530
+ if (!is_array && !is_plain_object(jn)) return jn;
3531
+ if (budget.left <= 0) return MASK_TOO_LARGE;
3532
+ if (memo.has(jn)) {
3533
+ let seen = memo.get(jn);
3534
+ return seen === MASK_IN_PROGRESS ? "<cycle>" : seen;
3535
+ }
3536
+ if (depth >= MASK_MAX_DEPTH) return "<deeper not shown>";
3537
+ budget.left -= 1;
3538
+ memo.set(jn, MASK_IN_PROGRESS);
3539
+ let changed = false;
3540
+ let truncated = false;
3541
+ let result;
3542
+ if (is_array) {
3543
+ result = [];
3544
+ for (let i = 0; i < jn.length; i++) {
3545
+ if (budget.left <= 0) {
3546
+ truncated = true;
3547
+ break;
3548
+ }
3549
+ budget.left -= 1;
3550
+ let shown = _json_mask_secrets(jn[i], memo, depth + 1, budget);
3551
+ if (shown !== jn[i]) changed = true;
3552
+ result.push(shown);
3553
+ }
3554
+ if (truncated) result.push(MASK_TOO_LARGE);
3555
+ } else {
3556
+ result = Object.create(Object.getPrototypeOf(jn));
3557
+ let value_is_secret = typeof jn.attribute === "string" && is_secret_name(jn.attribute.slice(-128));
3558
+ for (const key in jn) {
3559
+ if (!Object.prototype.hasOwnProperty.call(jn, key)) continue;
3560
+ if (budget.left <= 0) {
3561
+ truncated = true;
3562
+ break;
3563
+ }
3564
+ budget.left -= 1 + key.length;
3565
+ let value = jn[key];
3566
+ let shown;
3567
+ if ((is_secret_name(key.slice(-128)) || value_is_secret && key === "value") && value !== void 0 && value !== null && value !== "") shown = "********";
3568
+ else shown = _json_mask_secrets(value, memo, depth + 1, budget);
3569
+ if (shown !== value) changed = true;
3570
+ result[key] = shown;
3571
+ }
3572
+ if (truncated) result["<more>"] = MASK_TOO_LARGE;
3573
+ }
3574
+ if (!changed && !truncated) result = jn;
3575
+ memo.set(jn, result);
3576
+ return result;
3577
+ }
3578
+ function json_mask_secrets(jn) {
3579
+ try {
3580
+ return _json_mask_secrets(jn, /* @__PURE__ */ new WeakMap(), 0, { left: MASK_MAX_BYTES });
3581
+ } catch (e) {
3582
+ return MASK_FAILED;
3583
+ }
3584
+ }
3585
+ /************************************************************
3586
+ * trace_json() of a json that can hold a credential: what
3587
+ * json_mask_secrets() masks is shown masked
3588
+ ************************************************************/
3589
+ function trace_json_masked(jn, msg) {
3590
+ trace_json(json_mask_secrets(jn), msg);
3591
+ }
3592
+ /************************************************************
3224
3593
  * Duplicate an object (new references)
3225
3594
  * using the modern structuredClone (Deep copy of a single object)
3226
3595
  ************************************************************/
@@ -3522,8 +3891,8 @@ function strstr(haystack, needle, bool) {
3522
3891
  ***************************************************************************/
3523
3892
  function is_metadata_key(key) {
3524
3893
  if (!is_string(key)) return false;
3525
- let i;
3526
- for (i = 0; i < key.length; i++) {
3894
+ let i = 0;
3895
+ for (; i < key.length; i++) {
3527
3896
  if (key[i] !== "_") break;
3528
3897
  if (i > 2) break;
3529
3898
  }
@@ -3534,8 +3903,8 @@ function is_metadata_key(key) {
3534
3903
  ***************************************************************************/
3535
3904
  function is_private_key(key) {
3536
3905
  if (!is_string(key)) return false;
3537
- let i;
3538
- for (i = 0; i < key.length; i++) {
3906
+ let i = 0;
3907
+ for (; i < key.length; i++) {
3539
3908
  if (key[i] !== "_") break;
3540
3909
  if (i > 2) break;
3541
3910
  }
@@ -3646,7 +4015,7 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3646
4015
  return v;
3647
4016
  } else if (required) {
3648
4017
  log_error(`path not found: '${path}'`);
3649
- trace_json(kw);
4018
+ trace_json_masked(kw);
3650
4019
  }
3651
4020
  return Boolean(default_value);
3652
4021
  }
@@ -3660,11 +4029,11 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3660
4029
  } else if (wild && b === null) value = false;
3661
4030
  else if (wild) {
3662
4031
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3663
- trace_json(kw);
4032
+ trace_json_masked(kw);
3664
4033
  return false;
3665
4034
  } else {
3666
4035
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json boolean: '${path}'`);
3667
- trace_json(kw);
4036
+ trace_json_masked(kw);
3668
4037
  return Boolean(default_value);
3669
4038
  }
3670
4039
  if (extract) kw_delete(gobj, kw, path);
@@ -3714,7 +4083,7 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
3714
4083
  return v;
3715
4084
  } else if (required) {
3716
4085
  log_error(`path not found: '${path}'`);
3717
- trace_json(kw);
4086
+ trace_json_masked(kw);
3718
4087
  }
3719
4088
  return parseInt(default_value);
3720
4089
  }
@@ -3722,14 +4091,14 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
3722
4091
  if (is_number(v)) value = Math.trunc(v);
3723
4092
  else if (!wild) {
3724
4093
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json integer: '${path}'`);
3725
- trace_json(kw);
4094
+ trace_json_masked(kw);
3726
4095
  return parseInt(default_value);
3727
4096
  } else if (is_boolean(v)) value = v ? 1 : 0;
3728
4097
  else if (is_string(v)) value = strtoll_base0(v);
3729
4098
  else if (v === null) value = 0;
3730
4099
  else {
3731
4100
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3732
- trace_json(kw);
4101
+ trace_json_masked(kw);
3733
4102
  return 0;
3734
4103
  }
3735
4104
  if (extract) kw_delete(gobj, kw, path);
@@ -3761,7 +4130,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3761
4130
  return v;
3762
4131
  } else if (required) {
3763
4132
  log_error(`path not found: '${path}'`);
3764
- trace_json(kw);
4133
+ trace_json_masked(kw);
3765
4134
  }
3766
4135
  return Number(default_value);
3767
4136
  }
@@ -3769,7 +4138,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3769
4138
  if (is_number(v)) value = v;
3770
4139
  else if (!wild) {
3771
4140
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json real: '${path}'`);
3772
- trace_json(kw);
4141
+ trace_json_masked(kw);
3773
4142
  return Number(default_value);
3774
4143
  } else if (is_boolean(v)) value = v ? 1 : 0;
3775
4144
  else if (is_string(v)) {
@@ -3778,7 +4147,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3778
4147
  } else if (v === null) value = 0;
3779
4148
  else {
3780
4149
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3781
- trace_json(kw);
4150
+ trace_json_masked(kw);
3782
4151
  return 0;
3783
4152
  }
3784
4153
  if (extract) kw_delete(gobj, kw, path);
@@ -3830,14 +4199,14 @@ function kw_get_str(gobj, kw, path, default_value, flag) {
3830
4199
  return default_value;
3831
4200
  } else if (required && !kw_path_holds_key(kw, path)) {
3832
4201
  log_error(`path not found: '${path}'`);
3833
- trace_json(kw);
4202
+ trace_json_masked(kw);
3834
4203
  }
3835
4204
  return default_value;
3836
4205
  }
3837
4206
  if (!is_string(v)) {
3838
4207
  if (v !== null) {
3839
4208
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json str: '${path}'`);
3840
- trace_json(kw);
4209
+ trace_json_masked(kw);
3841
4210
  }
3842
4211
  return default_value;
3843
4212
  }
@@ -3860,7 +4229,7 @@ function kw_get_pointer(gobj, kw, path, default_value, flag) {
3860
4229
  return v;
3861
4230
  } else if (required) {
3862
4231
  log_error(`path not found: '${path}'`);
3863
- trace_json(kw);
4232
+ trace_json_masked(kw);
3864
4233
  }
3865
4234
  return default_value;
3866
4235
  }
@@ -3887,14 +4256,14 @@ function kw_get_dict(gobj, kw, path, default_value, flag) {
3887
4256
  }
3888
4257
  if (required) {
3889
4258
  log_error(`path not found: '${path}'`);
3890
- trace_json(kw);
4259
+ trace_json_masked(kw);
3891
4260
  }
3892
4261
  return default_value;
3893
4262
  }
3894
4263
  if (!is_object(v)) {
3895
4264
  if (required) {
3896
4265
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json dict: '${path}'`);
3897
- trace_json(kw);
4266
+ trace_json_masked(kw);
3898
4267
  }
3899
4268
  return default_value;
3900
4269
  }
@@ -3917,7 +4286,7 @@ function kw_get_dict_value(gobj, kw, path, default_value, flag) {
3917
4286
  return v;
3918
4287
  } else if (required) {
3919
4288
  log_error(`path not found: '${path}'`);
3920
- trace_json(kw);
4289
+ trace_json_masked(kw);
3921
4290
  }
3922
4291
  return default_value;
3923
4292
  }
@@ -3945,14 +4314,14 @@ function kw_get_list(gobj, kw, path, default_value, flag) {
3945
4314
  }
3946
4315
  if (required) {
3947
4316
  log_error(`path not found: '${path}'`);
3948
- trace_json(kw);
4317
+ trace_json_masked(kw);
3949
4318
  }
3950
4319
  return default_value;
3951
4320
  }
3952
4321
  if (!is_array(v)) {
3953
4322
  if (required) {
3954
4323
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json list: '${path}'`);
3955
- trace_json(kw);
4324
+ trace_json_masked(kw);
3956
4325
  }
3957
4326
  return default_value;
3958
4327
  }
@@ -6707,7 +7076,8 @@ function mt_inject_event(gobj, event, kw, src) {
6707
7076
  window.console.error(`Not in session`);
6708
7077
  return -1;
6709
7078
  }
6710
- if (!kw) kw = {};
7079
+ kw = Object.assign({}, is_object(kw) ? kw : {});
7080
+ if (is_object(kw["__md_iev__"])) kw["__md_iev__"] = json_deep_copy(kw["__md_iev__"]);
6711
7081
  if (msg_iev_get_stack(gobj, kw, IEVENT_STACK_ID)) {} else {
6712
7082
  let jn_ievent_id = build_cli_ievent_request(gobj, gobj_name(src), kw_get_str(gobj, kw, "__service__", 0, 0));
6713
7083
  json_object_del(kw, "__service__");
@@ -6813,7 +7183,7 @@ function trace_inter_event(gobj, prefix, iev) {
6813
7183
  let hora = current_timestamp();
6814
7184
  try {
6815
7185
  log_debug("\n" + hora + " " + prefix + "\n");
6816
- trace_json(iev);
7186
+ trace_json_masked(iev);
6817
7187
  } catch (e) {
6818
7188
  log_debug("ERROR in trace_inter_event: " + e);
6819
7189
  }
@@ -7495,6 +7865,7 @@ exports.is_number = is_number;
7495
7865
  exports.is_object = is_object;
7496
7866
  exports.is_private_key = is_private_key;
7497
7867
  exports.is_pure_number = is_pure_number;
7868
+ exports.is_secret_name = is_secret_name;
7498
7869
  exports.is_string = is_string;
7499
7870
  exports.jdb_delete = jdb_delete;
7500
7871
  exports.jdb_get = jdb_get;
@@ -7510,6 +7881,7 @@ exports.json_array_remove = json_array_remove;
7510
7881
  exports.json_array_size = json_array_size;
7511
7882
  exports.json_deep_copy = json_deep_copy;
7512
7883
  exports.json_is_identical = json_is_identical;
7884
+ exports.json_mask_secrets = json_mask_secrets;
7513
7885
  exports.json_object_del = json_object_del;
7514
7886
  exports.json_object_get = json_object_get;
7515
7887
  exports.json_object_set = json_object_set;
@@ -7557,6 +7929,7 @@ exports.log_debug = log_debug;
7557
7929
  exports.log_error = log_error;
7558
7930
  exports.log_info = log_info;
7559
7931
  exports.log_warning = log_warning;
7932
+ exports.mask_secrets_inline = mask_secrets_inline;
7560
7933
  exports.msg_iev_get_msg_type = msg_iev_get_msg_type;
7561
7934
  exports.msg_iev_get_stack = msg_iev_get_stack;
7562
7935
  exports.msg_iev_push_stack = msg_iev_push_stack;
@@ -7590,6 +7963,7 @@ exports.strstr = strstr;
7590
7963
  exports.template_get_field_desc = template_get_field_desc;
7591
7964
  exports.timeTracker = timeTracker;
7592
7965
  exports.trace_json = trace_json;
7966
+ exports.trace_json_masked = trace_json_masked;
7593
7967
  exports.trace_level_t = trace_level_t;
7594
7968
  exports.trace_msg = trace_msg;
7595
7969
  exports.treedb_decoder_fkey = treedb_decoder_fkey;