@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.
@@ -23,8 +23,8 @@ function vsprintf(fmt, argv) {
23
23
  return sprintf.apply(null, [fmt].concat(argv || []));
24
24
  }
25
25
  function sprintf_format(parse_tree, argv) {
26
- var cursor = 1, tree_length = parse_tree.length, arg, output = "", i, k, ph, pad, pad_character, pad_length, is_positive, sign;
27
- for (i = 0; i < tree_length; i++) if (typeof parse_tree[i] === "string") output += parse_tree[i];
26
+ var cursor = 1, tree_length = parse_tree.length, arg, output = "", i = 0, k, ph, pad, pad_character, pad_length, is_positive, sign;
27
+ for (; i < tree_length; i++) if (typeof parse_tree[i] === "string") output += parse_tree[i];
28
28
  else if (typeof parse_tree[i] === "object") {
29
29
  ph = parse_tree[i];
30
30
  if (ph.keys) {
@@ -1333,7 +1333,7 @@ function write_json_parameters(gobj, kw, jn_global) {
1333
1333
  let new_kw = kw;
1334
1334
  if (json2sdata(hs, new_kw, -1, gobj.gclass.gclass_flag & gclass_flag_t.gcflag_ignore_unknown_attrs ? 0 : print_attr_not_found, gobj) < 0) {
1335
1335
  log_error(`${gobj_short_name(gobj)} json2data() FAILED`);
1336
- trace_json(new_kw);
1336
+ trace_json_masked(new_kw);
1337
1337
  }
1338
1338
  }
1339
1339
  /************************************************************
@@ -2548,7 +2548,7 @@ function gobj_send_event(dst, event, kw, src) {
2548
2548
  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)));
2549
2549
  if (kw) {
2550
2550
  if (__trace_gobj_ev_kw__(dst)) {
2551
- if (json_object_size(kw)) trace_json(kw);
2551
+ if (json_object_size(kw)) trace_json_masked(kw);
2552
2552
  }
2553
2553
  }
2554
2554
  }
@@ -2568,7 +2568,7 @@ function gobj_send_event(dst, event, kw, src) {
2568
2568
  }
2569
2569
  if (kw) {
2570
2570
  if (__trace_gobj_ev_kw__(dst)) {
2571
- if (json_object_size(kw)) trace_json(kw);
2571
+ if (json_object_size(kw)) trace_json_masked(kw);
2572
2572
  }
2573
2573
  }
2574
2574
  }
@@ -2582,9 +2582,25 @@ function gobj_send_event(dst, event, kw, src) {
2582
2582
  return ret;
2583
2583
  }
2584
2584
  var subs_flag_t = Object.freeze({
2585
- __hard_subscription__: 1,
2586
- __own_event__: 2
2585
+ __rename_event_name__: 1,
2586
+ __hard_subscription__: 2,
2587
+ __own_event__: 4
2587
2588
  });
2589
+ /***************************************************************************
2590
+ * The event type of `event_name` in any registered gclass, null if none.
2591
+ * The C kernel's gobj_find_event_type(): any case, gclasses only.
2592
+ ***************************************************************************/
2593
+ function _find_event_type_in_gclasses(event_name) {
2594
+ let lower = String(event_name).toLowerCase();
2595
+ for (let gclass_name in _gclass_register) {
2596
+ let dl = _gclass_register[gclass_name].dl_events;
2597
+ for (let i = 0; i < dl.length; i++) {
2598
+ let event_type = dl[i];
2599
+ if (event_type.event_name && event_type.event_name.toLowerCase() === lower) return event_type;
2600
+ }
2601
+ }
2602
+ return null;
2603
+ }
2588
2604
  var subscription_desc = [
2589
2605
  SDATA(data_type_t.DTP_POINTER, "publisher", 0, null, "publisher gobj"),
2590
2606
  SDATA(data_type_t.DTP_POINTER, "subscriber", 0, null, "subscriber gobj"),
@@ -2617,6 +2633,21 @@ function _create_subscription(publisher, event, kw, subscriber) {
2617
2633
  if (json_size(__config__) > 0) {
2618
2634
  let kw_clone = json_deep_copy(__config__);
2619
2635
  json_object_set_new(subs, "__config__", kw_clone);
2636
+ let renamed_event = kw_get_str(publisher, kw_clone, "__rename_event_name__", "");
2637
+ if (!empty_string(renamed_event)) {
2638
+ let event_type = _find_event_type_in_gclasses(renamed_event);
2639
+ if (event_type) {
2640
+ json_object_set_new(subs, "renamed_event", event_type.event_name);
2641
+ delete kw_clone.__rename_event_name__;
2642
+ subs_flag |= subs_flag_t.__rename_event_name__;
2643
+ let kw_global = kw_get_dict(publisher, subs, "__global__", null);
2644
+ if (!is_object(kw_global)) {
2645
+ kw_global = {};
2646
+ json_object_set_new(subs, "__global__", kw_global);
2647
+ }
2648
+ kw_global.__original_event_name__ = event;
2649
+ } else log_error(`${gobj_short_name(publisher)}: EVENT NOT FOUND (__rename_event_name__: ${renamed_event})`);
2650
+ }
2620
2651
  if (kw_has_key(kw_clone, "__hard_subscription__")) {
2621
2652
  let hard_subscription = kw_get_bool(publisher, kw_clone, "__hard_subscription__", false);
2622
2653
  json_object_del(kw_clone, "__hard_subscription__");
@@ -2636,9 +2667,52 @@ function _create_subscription(publisher, event, kw, subscriber) {
2636
2667
  return subs;
2637
2668
  }
2638
2669
  /***************************************************************************
2670
+ * The kw to find the subscriptions a (un)subscription `kw` names: `kw` as
2671
+ * _create_subscription() stores it, as the C kernel's
2672
+ * _subscription_match_kw(). The three `__config__` keys the framework
2673
+ * reads (__hard_subscription__, __own_event__, __rename_event_name__)
2674
+ * become the subs_flag and are taken out of the stored `__config__`, and
2675
+ * a renamed event adds `__original_event_name__` to the stored
2676
+ * `__global__`: with `kw` as it came, the same kw matched no subscription,
2677
+ * a repeat of it was made twice (the subscriber got each event twice) and
2678
+ * its withdrawal found nothing. A known renamed event is returned in
2679
+ * `renamed_event`, which _match_subscription() compares: a plain and a
2680
+ * renamed subscription, or two renames of one event, are two. A rename
2681
+ * that no gclass declares stays in the stored `__config__`, and in this
2682
+ * one. Up to gobj-js 7.25.8 the kw was compared as it came, and
2683
+ * `__rename_event_name__` always stayed in the stored `__config__`: a
2684
+ * plain kw with the rest of that __config__ found no repeat (two
2685
+ * subscriptions where C has one).
2686
+ * Return {kw, renamed_event}; renamed_event is "" when kw does not rename.
2687
+ ***************************************************************************/
2688
+ function _subscription_match_kw(kw, event) {
2689
+ let __config__ = kw ? kw.__config__ : null;
2690
+ if (!is_object(__config__) || !kw_has_key(__config__, "__hard_subscription__") && !kw_has_key(__config__, "__own_event__") && !kw_has_key(__config__, "__rename_event_name__")) return {
2691
+ kw,
2692
+ renamed_event: ""
2693
+ };
2694
+ let kw_match = Object.assign({}, kw);
2695
+ let config_match = Object.assign({}, __config__);
2696
+ kw_match.__config__ = config_match;
2697
+ let renamed_event = "";
2698
+ let rename = config_match.__rename_event_name__;
2699
+ let event_type = typeof rename === "string" && !empty_string(rename) ? _find_event_type_in_gclasses(rename) : null;
2700
+ if (event_type) {
2701
+ renamed_event = event_type.event_name;
2702
+ delete config_match.__rename_event_name__;
2703
+ if (event && json_size(kw_match.__global__) > 0) kw_match.__global__ = Object.assign({}, kw_match.__global__, { __original_event_name__: event });
2704
+ }
2705
+ delete config_match.__hard_subscription__;
2706
+ delete config_match.__own_event__;
2707
+ return {
2708
+ kw: kw_match,
2709
+ renamed_event
2710
+ };
2711
+ }
2712
+ /***************************************************************************
2639
2713
  * Match subscription
2640
2714
  ***************************************************************************/
2641
- function _match_subscription(subs, publisher, event, kw, subscriber) {
2715
+ function _match_subscription(subs, publisher, event, renamed_event, kw, subscriber) {
2642
2716
  let __config__ = kw_get_dict(publisher, kw, "__config__", null);
2643
2717
  let __global__ = kw_get_dict(publisher, kw, "__global__", null);
2644
2718
  let __local__ = kw_get_dict(publisher, kw, "__local__", null);
@@ -2653,6 +2727,9 @@ function _match_subscription(subs, publisher, event, kw, subscriber) {
2653
2727
  if (event) {
2654
2728
  if (event !== kw_get_str(null, subs, "event", "")) match = false;
2655
2729
  }
2730
+ if (renamed_event) {
2731
+ if (renamed_event !== kw_get_str(null, subs, "renamed_event", "")) match = false;
2732
+ }
2656
2733
  if (json_size(__config__) > 0) {
2657
2734
  let kw_config = kw_get_dict(null, subs, "__config__", null);
2658
2735
  if (json_size(kw_config) > 0) {
@@ -2687,26 +2764,29 @@ function _match_subscription(subs, publisher, event, kw, subscriber) {
2687
2764
  * kw (__config__, __global__, __local__, __filter__),
2688
2765
  * subscriber
2689
2766
  ***************************************************************************/
2690
- function _find_subscriptions(dl_subs, publisher, event, kw, subscriber) {
2767
+ function _find_subscriptions(dl_subs, publisher, event, renamed_event, kw, subscriber) {
2691
2768
  let iter = [];
2692
2769
  for (let i = 0; i < dl_subs.length; i++) {
2693
2770
  let subs = dl_subs[i];
2694
- if (_match_subscription(subs, publisher, event, kw, subscriber)) json_array_append(iter, subs);
2771
+ if (_match_subscription(subs, publisher, event, renamed_event, kw, subscriber)) json_array_append(iter, subs);
2695
2772
  }
2696
2773
  return iter;
2697
2774
  }
2698
2775
  /***************************************************************************
2699
- * Find idx of subscription in dl_subs, -1 not found
2776
+ * Find idx of the subscription `subs` itself in dl_subs, -1 not found.
2777
+ * Up to gobj-js 7.25.8 it was the first entry whose fields matched `subs`:
2778
+ * a subscription already removed took a live one that matched it (a plain
2779
+ * one matches every other of its event and subscriber).
2700
2780
  ***************************************************************************/
2701
- function _get_subs_idx(dl_subs, publisher, event, kw, subscriber) {
2702
- for (let i = 0; i < dl_subs.length; i++) {
2703
- let subs = dl_subs[i];
2704
- if (_match_subscription(subs, publisher, event, kw, subscriber)) return i;
2705
- }
2706
- return -1;
2781
+ function _get_subs_idx(dl_subs, subs) {
2782
+ return dl_subs.indexOf(subs);
2707
2783
  }
2708
2784
  /***************************************************************************
2709
- * Delete subscription in publisher and subscriber
2785
+ * Delete subscription in publisher and subscriber.
2786
+ * Return 0 removed, -1 a hard one kept (only `force` removes it), 1 it
2787
+ * was not there any more: already removed, as a stale reference is, or by
2788
+ * the mt_subscription_deleted() of an earlier entry of the same list. The
2789
+ * caller says which is an error. As in C.
2710
2790
  ***************************************************************************/
2711
2791
  function _delete_subscription(gobj, subs, force, not_inform) {
2712
2792
  let publisher = kw_get_pointer(gobj, subs, "publisher", null, kw_flag_t.KW_REQUIRED);
@@ -2715,7 +2795,12 @@ function _delete_subscription(gobj, subs, force, not_inform) {
2715
2795
  if (kw_get_int(gobj, subs, "subs_flag", null, kw_flag_t.KW_REQUIRED) & subs_flag_t.__hard_subscription__ ? 1 : 0) {
2716
2796
  if (!force) return -1;
2717
2797
  }
2718
- if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2798
+ let tracea = __trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher);
2799
+ if (_get_subs_idx(publisher.dl_subscriptions, subs) < 0) {
2800
+ if (tracea) trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s', ALREADY REMOVED", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2801
+ return 1;
2802
+ }
2803
+ if (tracea) {
2719
2804
  trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s'", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2720
2805
  trace_json(subs);
2721
2806
  }
@@ -2724,13 +2809,13 @@ function _delete_subscription(gobj, subs, force, not_inform) {
2724
2809
  if (publisher.gclass.gmt.mt_subscription_deleted) publisher.gclass.gmt.mt_subscription_deleted(publisher, subs);
2725
2810
  }
2726
2811
  }
2727
- let idx = _get_subs_idx(publisher.dl_subscriptions, publisher, event, subs, subscriber);
2812
+ let idx = _get_subs_idx(publisher.dl_subscriptions, subs);
2728
2813
  if (idx >= 0) json_array_remove(publisher.dl_subscriptions, idx);
2729
2814
  else {
2730
2815
  log_error(`${gobj_short_name(gobj)}: subscription in publisher not found`);
2731
2816
  trace_json(subs);
2732
2817
  }
2733
- idx = _get_subs_idx(subscriber.dl_subscribings, publisher, event, subs, subscriber);
2818
+ idx = _get_subs_idx(subscriber.dl_subscribings, subs);
2734
2819
  if (idx >= 0) json_array_remove(subscriber.dl_subscribings, idx);
2735
2820
  else {
2736
2821
  log_error(`${gobj_short_name(gobj)}: subscription in subscriber not found`);
@@ -2773,7 +2858,17 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
2773
2858
  }
2774
2859
  }
2775
2860
  } else event = "";
2776
- let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2861
+ let match = _subscription_match_kw(kw, event);
2862
+ let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, match.renamed_event, match.kw, subscriber);
2863
+ let subs_hard = null;
2864
+ 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__) {
2865
+ subs_hard = dl_subs[i];
2866
+ break;
2867
+ }
2868
+ if (subs_hard) {
2869
+ log_warning(`${gobj_short_name(publisher)}: Hard subscription REPEATED, the one there is kept and returned (event: ${event}, subscriber: ${gobj_short_name(subscriber)})`);
2870
+ return subs_hard;
2871
+ }
2777
2872
  if (json_array_size(dl_subs) > 0) {
2778
2873
  log_error(`${gobj_short_name(publisher)}: ${json_array_size(dl_subs)} subscription(s) REPEATED, will be deleted and override`);
2779
2874
  trace_json(dl_subs, "subscription REPEATED");
@@ -2788,7 +2883,7 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
2788
2883
  json_array_append(subscriber.dl_subscribings, subs);
2789
2884
  if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2790
2885
  trace_machine(sprintf("💜💜👍 subscribing event '%s', publisher '%s', subscriber %s", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2791
- if (kw && (__trace_gobj_ev_kw__(subscriber) || __trace_gobj_ev_kw__(publisher))) trace_json(kw);
2886
+ if (kw && (__trace_gobj_ev_kw__(subscriber) || __trace_gobj_ev_kw__(publisher))) trace_json_masked(kw);
2792
2887
  }
2793
2888
  if (publisher.gclass.gmt.mt_subscription_added) {
2794
2889
  let result = publisher.gclass.gmt.mt_subscription_added(publisher, subs);
@@ -2830,16 +2925,22 @@ function gobj_unsubscribe_event(publisher, event, kw, subscriber) {
2830
2925
  }
2831
2926
  }
2832
2927
  } else event = "";
2833
- let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2928
+ let match = _subscription_match_kw(kw, event);
2929
+ let dl_subs = _find_subscriptions(publisher.dl_subscriptions, publisher, event, match.renamed_event, match.kw, subscriber);
2834
2930
  let deleted = 0;
2931
+ let kept_hard = 0;
2932
+ let already_removed = 0;
2835
2933
  for (let i = 0; i < dl_subs.length; i++) {
2836
2934
  let subs = dl_subs[i];
2837
- _delete_subscription(publisher, subs, false, false);
2838
- deleted++;
2935
+ let ret = _delete_subscription(publisher, subs, false, false);
2936
+ if (ret === 0) deleted++;
2937
+ else if (ret < 0) kept_hard++;
2938
+ else already_removed++;
2839
2939
  }
2840
- if (!deleted) {
2940
+ 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})`);
2941
+ else if (!deleted && !already_removed) {
2841
2942
  log_warning(`${gobj_short_name(publisher)}: No subscription found`);
2842
- trace_json(kw, "No subscription found");
2943
+ trace_json_masked(kw, "No subscription found");
2843
2944
  }
2844
2945
  return 0;
2845
2946
  }
@@ -2848,10 +2949,12 @@ function gobj_unsubscribe_event(publisher, event, kw, subscriber) {
2848
2949
  ***************************************************************************/
2849
2950
  function gobj_unsubscribe_list(gobj, dl_subs, force) {
2850
2951
  let dl = [...dl_subs];
2952
+ let already_removed = 0;
2851
2953
  for (let i = 0; i < dl.length; i++) {
2852
2954
  let subs = dl[i];
2853
- _delete_subscription(gobj, subs, force, false);
2955
+ if (_delete_subscription(gobj, subs, force, false) > 0) already_removed++;
2854
2956
  }
2957
+ if (already_removed) log_warning(`${gobj_short_name(gobj)}: Subscription(s) already removed, nothing to remove (count: ${already_removed})`);
2855
2958
  return 0;
2856
2959
  }
2857
2960
  /***************************************************************************
@@ -2863,7 +2966,7 @@ function gobj_unsubscribe_list(gobj, dl_subs, force) {
2863
2966
  ***************************************************************************/
2864
2967
  function gobj_find_subscriptions(publisher, event, kw, subscriber) {
2865
2968
  if (kw == null) kw = {};
2866
- return _find_subscriptions(publisher.dl_subscriptions, publisher, event, kw, subscriber);
2969
+ return _find_subscriptions(publisher.dl_subscriptions, publisher, event, null, kw, subscriber);
2867
2970
  }
2868
2971
  /***************************************************************************
2869
2972
  *
@@ -2902,7 +3005,7 @@ function gobj_list_subscriptions(gobj2view) {
2902
3005
  * subscriber
2903
3006
  ***************************************************************************/
2904
3007
  function gobj_find_subscribings(subscriber, event, kw, publisher) {
2905
- return _find_subscriptions(subscriber.dl_subscribings, publisher, event, kw, subscriber);
3008
+ return _find_subscriptions(subscriber.dl_subscribings, publisher, event, null, kw, subscriber);
2906
3009
  }
2907
3010
  /***************************************************************************
2908
3011
  * Return the sum of returns of gobj_send_event
@@ -2928,7 +3031,7 @@ function gobj_publish_event(publisher, event, kw) {
2928
3031
  if (tracea) {
2929
3032
  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));
2930
3033
  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 : "", ""));
2931
- if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw)) trace_json(kw);
3034
+ if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw)) trace_json_masked(kw);
2932
3035
  }
2933
3036
  if (publisher.gclass.gmt.mt_publish_event) {
2934
3037
  let topublish = publisher.gclass.gmt.mt_publish_event(publisher, event, kw);
@@ -2953,11 +3056,12 @@ function gobj_publish_event(publisher, event, kw) {
2953
3056
  let __global__ = kw_get_dict(publisher, subs, "__global__", null, 0);
2954
3057
  let __local__ = kw_get_dict(publisher, subs, "__local__", null, 0);
2955
3058
  let __filter__ = kw_get_dict_value(publisher, subs, "__filter__", null, 0);
2956
- let kw2publish = kw;
3059
+ let event_name = subs.renamed_event;
3060
+ if (empty_string(event_name)) event_name = event;
2957
3061
  let topublish = 1;
2958
- if (publisher.gclass.gmt.mt_publication_filter) topublish = publisher.gclass.gmt.mt_publication_filter(publisher, event, kw2publish, subscriber);
3062
+ if (publisher.gclass.gmt.mt_publication_filter) topublish = publisher.gclass.gmt.mt_publication_filter(publisher, event, kw, subscriber);
2959
3063
  else if (json_size(__filter__) > 0) {
2960
- topublish = kw_match_simple(kw2publish, __filter__) ? 1 : 0;
3064
+ topublish = kw_match_simple(kw, __filter__) ? 1 : 0;
2961
3065
  if (tracea) {
2962
3066
  trace_machine(sprintf("💜💜🔄%s publishing with filter, event '%s', subscriber'%s', publisher %s", topublish ? "👍" : "👎", event ? event : "", gobj_short_name(subscriber), gobj_short_name(publisher)));
2963
3067
  trace_json(__filter__);
@@ -2971,15 +3075,17 @@ function gobj_publish_event(publisher, event, kw) {
2971
3075
  if (!gobj_has_event(subscriber, ev_.event_name, 0)) continue;
2972
3076
  }
2973
3077
  }
2974
- if (__local__) kw_pop(kw2publish, __local__);
3078
+ let kw2publish = kw;
3079
+ if (json_size(__local__) > 0 || json_size(__global__) > 0) kw2publish = Object.assign({}, kw);
3080
+ if (json_size(__local__) > 0) kw_pop(kw2publish, __local__);
2975
3081
  if (__config__) {}
2976
- if (__global__) json_object_update(kw2publish, __global__);
3082
+ if (json_size(__global__) > 0) json_object_update(kw2publish, json_deep_copy(__global__));
2977
3083
  if (tracea) {
2978
- if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔄 %s (%s) %s%s", event ? event : "", event ? event : "", !subscriber.running ? "!!" : "", gobj_short_name(subscriber)));
2979
- 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)));
2980
- if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw2publish)) trace_json(kw2publish);
3084
+ if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔄 %s (%s) %s%s", event ? event : "", event_name ? event_name : "", !subscriber.running ? "!!" : "", gobj_short_name(subscriber)));
3085
+ 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)));
3086
+ if (__trace_gobj_ev_kw__(publisher) && json_object_size(kw2publish)) trace_json_masked(kw2publish);
2981
3087
  }
2982
- let ret_ = gobj_send_event(subscriber, event, kw2publish, publisher);
3088
+ let ret_ = gobj_send_event(subscriber, event_name, kw2publish, publisher);
2983
3089
  if (ret_ < 0 && subs_flag & subs_flag_t.__own_event__) {
2984
3090
  sent_count = -1;
2985
3091
  break;
@@ -3003,8 +3109,9 @@ function gobj_command(gobj, command, kw, src) {
3003
3109
  return -1;
3004
3110
  }
3005
3111
  if (is_commands_tracing(gobj) || is_machine_tracing(gobj, null) && !is_machine_not_tracing(src, null)) {
3006
- trace_machine(sprintf("🌀🌀 mach(%s%s), cmd: %s, src: %s", !gobj_is_running(gobj) ? "!!" : "", gobj_short_name(gobj), command, gobj_short_name(src)));
3007
- if (__trace_gobj_ev_kw__(gobj)) trace_json(kw);
3112
+ let command_shown = mask_secrets_inline(command);
3113
+ 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)));
3114
+ if (__trace_gobj_ev_kw__(gobj)) trace_json_masked(kw);
3008
3115
  }
3009
3116
  if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
3010
3117
  if (gobj.gclass.command_table) {
@@ -3220,6 +3327,268 @@ function trace_json(jn, msg) {
3220
3327
  emit_log_callback("json", jn, current_timestamp());
3221
3328
  }
3222
3329
  /************************************************************
3330
+ * The names of the secrets (is_secret_name()). The same lists
3331
+ * as the C kernel's helpers.c: a name that holds one of these
3332
+ * (any case) is a secret.
3333
+ ************************************************************/
3334
+ var SECRET_NAME_PARTS = [
3335
+ "passw",
3336
+ "pwd",
3337
+ "passphrase",
3338
+ "secret",
3339
+ "token",
3340
+ "jwt",
3341
+ "bearer",
3342
+ "authorization",
3343
+ "cookie",
3344
+ "credential",
3345
+ "salt"
3346
+ ];
3347
+ var SECRET_NAME_JOINED = [
3348
+ "apikey",
3349
+ "sessionid",
3350
+ "sessionkey",
3351
+ "authdata"
3352
+ ];
3353
+ var NOT_SECRET_SEGMENTS = /* @__PURE__ */ new Set([
3354
+ "endpoint",
3355
+ "url",
3356
+ "uri",
3357
+ "domain",
3358
+ "path",
3359
+ "file",
3360
+ "public",
3361
+ "pub",
3362
+ "count",
3363
+ "counts",
3364
+ "type",
3365
+ "name",
3366
+ "len",
3367
+ "length",
3368
+ "size",
3369
+ "max",
3370
+ "min",
3371
+ "ttl",
3372
+ "timeout",
3373
+ "expiry",
3374
+ "expires",
3375
+ "mode"
3376
+ ]);
3377
+ /************************************************************
3378
+ * TRUE if `name` is the name of a secret: a password, a token,
3379
+ * a key... Any case. As the C kernel's is_secret_name().
3380
+ ************************************************************/
3381
+ function is_secret_name(name) {
3382
+ if (typeof name !== "string" || name.length < 3) return false;
3383
+ let lower = name.toLowerCase();
3384
+ let hit = false;
3385
+ for (const part of SECRET_NAME_PARTS) if (lower.indexOf(part) >= 0) {
3386
+ hit = true;
3387
+ break;
3388
+ }
3389
+ if (!hit) {
3390
+ let joined = lower.replace(/[_\-. \t]/g, "");
3391
+ for (const part of SECRET_NAME_JOINED) if (joined.indexOf(part) >= 0) {
3392
+ hit = true;
3393
+ break;
3394
+ }
3395
+ }
3396
+ if (!hit) hit = lower.indexOf("priv") >= 0 && lower.indexOf("key") >= 0;
3397
+ if (!hit) return false;
3398
+ for (const segment of lower.split(/[_\-. \t]/)) if (NOT_SECRET_SEGMENTS.has(segment)) return false;
3399
+ return true;
3400
+ }
3401
+ /************************************************************
3402
+ * Where an unquoted secret value that begins at `p` ends: at
3403
+ * the end, at the quote that closes an outer quoted value, or
3404
+ * before the next "word=" -- a plain word after a blank is still
3405
+ * part of it ("password=correct horse battery", "password=
3406
+ * hunter2"). As the C kernel's inline_secret_value_end().
3407
+ ************************************************************/
3408
+ function inline_secret_value_end(str, p, outer) {
3409
+ const blank = (c) => c === " " || c === " ";
3410
+ const closes_outer = (i) => outer && str[i] === outer && (i + 1 >= str.length || blank(str[i + 1]));
3411
+ let end = p;
3412
+ while (true) {
3413
+ while (end < str.length && !blank(str[end])) {
3414
+ if (closes_outer(end)) return end;
3415
+ end++;
3416
+ }
3417
+ if (end >= str.length) return end;
3418
+ let w = end;
3419
+ while (w < str.length && blank(str[w])) w++;
3420
+ if (w >= str.length || closes_outer(w)) return end;
3421
+ for (let e = w; e < str.length && !blank(str[e]) && !closes_outer(e); e++) if (str[e] === "=" && e > w) return end;
3422
+ end = w;
3423
+ }
3424
+ }
3425
+ /************************************************************
3426
+ * A text (a command line) with the value of every "name=value"
3427
+ * whose name is a secret's written as "********", quoted or not
3428
+ * (and the "value" of a write-attr whose attribute names a
3429
+ * secret). The rest as it is. Return null when there was nothing
3430
+ * to mask. As the C kernel's mask_secrets_inline().
3431
+ ************************************************************/
3432
+ var MASK_MAX_NAME = 128;
3433
+ var MASK_MAX_BYTES = 4194304;
3434
+ var MASK_TOO_LARGE = "<not shown: too large to mask>";
3435
+ function mask_secrets_inline(str) {
3436
+ if (typeof str !== "string" || str.indexOf("=") < 0) return null;
3437
+ if (str.length > MASK_MAX_BYTES) return MASK_TOO_LARGE;
3438
+ let value_is_secret = false;
3439
+ let re_attr = /(^|[ \t])attribute=["']?([^ \t"']*)/g;
3440
+ let m;
3441
+ while ((m = re_attr.exec(str)) !== null) if (is_secret_name(m[2].slice(-128))) value_is_secret = true;
3442
+ let parts = [];
3443
+ let copied = 0;
3444
+ let changed = false;
3445
+ let outer = "";
3446
+ let word = 0;
3447
+ let p = 0;
3448
+ const is_blank_or_end = (i) => i >= str.length || str[i] === " " || str[i] === " ";
3449
+ while (p < str.length) {
3450
+ let c = str[p];
3451
+ if (c === " " || c === " ") {
3452
+ p++;
3453
+ word = p;
3454
+ continue;
3455
+ }
3456
+ if (c === "\"" || c === "'") {
3457
+ if (!outer && (p === 0 || str[p - 1] === " " || str[p - 1] === " " || str[p - 1] === "=")) outer = c;
3458
+ else if (c === outer && is_blank_or_end(p + 1)) outer = "";
3459
+ }
3460
+ if (c !== "=") {
3461
+ p++;
3462
+ continue;
3463
+ }
3464
+ let name = str.substring(Math.max(word, p - MASK_MAX_NAME), p);
3465
+ word = p + 1;
3466
+ if (!(is_secret_name(name) || value_is_secret && name.toLowerCase() === "value")) {
3467
+ p++;
3468
+ continue;
3469
+ }
3470
+ p++;
3471
+ let quote = str[p] === "\"" || str[p] === "'" ? str[p] : "";
3472
+ let end;
3473
+ if (quote) {
3474
+ end = p + 1;
3475
+ while (end < str.length && str[end] !== quote) end++;
3476
+ if (str[end] === quote) end++;
3477
+ } else end = inline_secret_value_end(str, p, outer);
3478
+ if (end > p) {
3479
+ parts.push(str.substring(copied, p));
3480
+ parts.push("********");
3481
+ copied = end;
3482
+ changed = true;
3483
+ }
3484
+ p = end;
3485
+ word = p;
3486
+ }
3487
+ if (!changed) return null;
3488
+ parts.push(str.substring(copied));
3489
+ return parts.join("");
3490
+ }
3491
+ /************************************************************
3492
+ * A json as a log or a trace may show it: at any depth, the
3493
+ * value of a key with a secret's name is "********", whatever
3494
+ * its type (not an absent one, a null or an empty string); so is
3495
+ * the "value" of a dict whose "attribute" names a secret; and a
3496
+ * string is masked as mask_secrets_inline(). Return a masked
3497
+ * copy, or `jn` itself when there was nothing to mask. As the C
3498
+ * kernel's json_mask_secrets().
3499
+ *
3500
+ * Only JSON is walked: plain objects (their prototype is
3501
+ * Object.prototype or null) and arrays. Anything else -- a gobj,
3502
+ * a DOM node, a class instance, a typed array, a function -- is
3503
+ * passed as it is, never walked, as trace_json() always showed it
3504
+ * (a kw may carry a gobj: its parent and children make a cycle).
3505
+ * A plain object met twice is masked once, the same everywhere; a
3506
+ * cycle back to one is "<cycle>"; below MASK_MAX_DEPTH levels
3507
+ * (64, as in C) nothing is shown.
3508
+ * It never throws: a failure is the placeholder below.
3509
+ ************************************************************/
3510
+ var MASK_MAX_DEPTH = 64;
3511
+ var MASK_FAILED = "<not shown: the masking failed>";
3512
+ function is_plain_object(value) {
3513
+ if (value === null || typeof value !== "object") return false;
3514
+ let proto = Object.getPrototypeOf(value);
3515
+ return proto === Object.prototype || proto === null;
3516
+ }
3517
+ var MASK_IN_PROGRESS = Symbol("mask-in-progress");
3518
+ function _json_mask_secrets(jn, memo, depth, budget) {
3519
+ if (typeof jn === "string") {
3520
+ if (jn.length > budget.left) {
3521
+ budget.left = 0;
3522
+ return MASK_TOO_LARGE;
3523
+ }
3524
+ budget.left -= jn.length;
3525
+ let masked = mask_secrets_inline(jn);
3526
+ return masked !== null ? masked : jn;
3527
+ }
3528
+ let is_array = Array.isArray(jn);
3529
+ if (!is_array && !is_plain_object(jn)) return jn;
3530
+ if (budget.left <= 0) return MASK_TOO_LARGE;
3531
+ if (memo.has(jn)) {
3532
+ let seen = memo.get(jn);
3533
+ return seen === MASK_IN_PROGRESS ? "<cycle>" : seen;
3534
+ }
3535
+ if (depth >= MASK_MAX_DEPTH) return "<deeper not shown>";
3536
+ budget.left -= 1;
3537
+ memo.set(jn, MASK_IN_PROGRESS);
3538
+ let changed = false;
3539
+ let truncated = false;
3540
+ let result;
3541
+ if (is_array) {
3542
+ result = [];
3543
+ for (let i = 0; i < jn.length; i++) {
3544
+ if (budget.left <= 0) {
3545
+ truncated = true;
3546
+ break;
3547
+ }
3548
+ budget.left -= 1;
3549
+ let shown = _json_mask_secrets(jn[i], memo, depth + 1, budget);
3550
+ if (shown !== jn[i]) changed = true;
3551
+ result.push(shown);
3552
+ }
3553
+ if (truncated) result.push(MASK_TOO_LARGE);
3554
+ } else {
3555
+ result = Object.create(Object.getPrototypeOf(jn));
3556
+ let value_is_secret = typeof jn.attribute === "string" && is_secret_name(jn.attribute.slice(-128));
3557
+ for (const key in jn) {
3558
+ if (!Object.prototype.hasOwnProperty.call(jn, key)) continue;
3559
+ if (budget.left <= 0) {
3560
+ truncated = true;
3561
+ break;
3562
+ }
3563
+ budget.left -= 1 + key.length;
3564
+ let value = jn[key];
3565
+ let shown;
3566
+ if ((is_secret_name(key.slice(-128)) || value_is_secret && key === "value") && value !== void 0 && value !== null && value !== "") shown = "********";
3567
+ else shown = _json_mask_secrets(value, memo, depth + 1, budget);
3568
+ if (shown !== value) changed = true;
3569
+ result[key] = shown;
3570
+ }
3571
+ if (truncated) result["<more>"] = MASK_TOO_LARGE;
3572
+ }
3573
+ if (!changed && !truncated) result = jn;
3574
+ memo.set(jn, result);
3575
+ return result;
3576
+ }
3577
+ function json_mask_secrets(jn) {
3578
+ try {
3579
+ return _json_mask_secrets(jn, /* @__PURE__ */ new WeakMap(), 0, { left: MASK_MAX_BYTES });
3580
+ } catch (e) {
3581
+ return MASK_FAILED;
3582
+ }
3583
+ }
3584
+ /************************************************************
3585
+ * trace_json() of a json that can hold a credential: what
3586
+ * json_mask_secrets() masks is shown masked
3587
+ ************************************************************/
3588
+ function trace_json_masked(jn, msg) {
3589
+ trace_json(json_mask_secrets(jn), msg);
3590
+ }
3591
+ /************************************************************
3223
3592
  * Duplicate an object (new references)
3224
3593
  * using the modern structuredClone (Deep copy of a single object)
3225
3594
  ************************************************************/
@@ -3521,8 +3890,8 @@ function strstr(haystack, needle, bool) {
3521
3890
  ***************************************************************************/
3522
3891
  function is_metadata_key(key) {
3523
3892
  if (!is_string(key)) return false;
3524
- let i;
3525
- for (i = 0; i < key.length; i++) {
3893
+ let i = 0;
3894
+ for (; i < key.length; i++) {
3526
3895
  if (key[i] !== "_") break;
3527
3896
  if (i > 2) break;
3528
3897
  }
@@ -3533,8 +3902,8 @@ function is_metadata_key(key) {
3533
3902
  ***************************************************************************/
3534
3903
  function is_private_key(key) {
3535
3904
  if (!is_string(key)) return false;
3536
- let i;
3537
- for (i = 0; i < key.length; i++) {
3905
+ let i = 0;
3906
+ for (; i < key.length; i++) {
3538
3907
  if (key[i] !== "_") break;
3539
3908
  if (i > 2) break;
3540
3909
  }
@@ -3645,7 +4014,7 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3645
4014
  return v;
3646
4015
  } else if (required) {
3647
4016
  log_error(`path not found: '${path}'`);
3648
- trace_json(kw);
4017
+ trace_json_masked(kw);
3649
4018
  }
3650
4019
  return Boolean(default_value);
3651
4020
  }
@@ -3659,11 +4028,11 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
3659
4028
  } else if (wild && b === null) value = false;
3660
4029
  else if (wild) {
3661
4030
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3662
- trace_json(kw);
4031
+ trace_json_masked(kw);
3663
4032
  return false;
3664
4033
  } else {
3665
4034
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json boolean: '${path}'`);
3666
- trace_json(kw);
4035
+ trace_json_masked(kw);
3667
4036
  return Boolean(default_value);
3668
4037
  }
3669
4038
  if (extract) kw_delete(gobj, kw, path);
@@ -3713,7 +4082,7 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
3713
4082
  return v;
3714
4083
  } else if (required) {
3715
4084
  log_error(`path not found: '${path}'`);
3716
- trace_json(kw);
4085
+ trace_json_masked(kw);
3717
4086
  }
3718
4087
  return parseInt(default_value);
3719
4088
  }
@@ -3721,14 +4090,14 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
3721
4090
  if (is_number(v)) value = Math.trunc(v);
3722
4091
  else if (!wild) {
3723
4092
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json integer: '${path}'`);
3724
- trace_json(kw);
4093
+ trace_json_masked(kw);
3725
4094
  return parseInt(default_value);
3726
4095
  } else if (is_boolean(v)) value = v ? 1 : 0;
3727
4096
  else if (is_string(v)) value = strtoll_base0(v);
3728
4097
  else if (v === null) value = 0;
3729
4098
  else {
3730
4099
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3731
- trace_json(kw);
4100
+ trace_json_masked(kw);
3732
4101
  return 0;
3733
4102
  }
3734
4103
  if (extract) kw_delete(gobj, kw, path);
@@ -3760,7 +4129,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3760
4129
  return v;
3761
4130
  } else if (required) {
3762
4131
  log_error(`path not found: '${path}'`);
3763
- trace_json(kw);
4132
+ trace_json_masked(kw);
3764
4133
  }
3765
4134
  return Number(default_value);
3766
4135
  }
@@ -3768,7 +4137,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3768
4137
  if (is_number(v)) value = v;
3769
4138
  else if (!wild) {
3770
4139
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json real: '${path}'`);
3771
- trace_json(kw);
4140
+ trace_json_masked(kw);
3772
4141
  return Number(default_value);
3773
4142
  } else if (is_boolean(v)) value = v ? 1 : 0;
3774
4143
  else if (is_string(v)) {
@@ -3777,7 +4146,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
3777
4146
  } else if (v === null) value = 0;
3778
4147
  else {
3779
4148
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
3780
- trace_json(kw);
4149
+ trace_json_masked(kw);
3781
4150
  return 0;
3782
4151
  }
3783
4152
  if (extract) kw_delete(gobj, kw, path);
@@ -3829,14 +4198,14 @@ function kw_get_str(gobj, kw, path, default_value, flag) {
3829
4198
  return default_value;
3830
4199
  } else if (required && !kw_path_holds_key(kw, path)) {
3831
4200
  log_error(`path not found: '${path}'`);
3832
- trace_json(kw);
4201
+ trace_json_masked(kw);
3833
4202
  }
3834
4203
  return default_value;
3835
4204
  }
3836
4205
  if (!is_string(v)) {
3837
4206
  if (v !== null) {
3838
4207
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json str: '${path}'`);
3839
- trace_json(kw);
4208
+ trace_json_masked(kw);
3840
4209
  }
3841
4210
  return default_value;
3842
4211
  }
@@ -3859,7 +4228,7 @@ function kw_get_pointer(gobj, kw, path, default_value, flag) {
3859
4228
  return v;
3860
4229
  } else if (required) {
3861
4230
  log_error(`path not found: '${path}'`);
3862
- trace_json(kw);
4231
+ trace_json_masked(kw);
3863
4232
  }
3864
4233
  return default_value;
3865
4234
  }
@@ -3886,14 +4255,14 @@ function kw_get_dict(gobj, kw, path, default_value, flag) {
3886
4255
  }
3887
4256
  if (required) {
3888
4257
  log_error(`path not found: '${path}'`);
3889
- trace_json(kw);
4258
+ trace_json_masked(kw);
3890
4259
  }
3891
4260
  return default_value;
3892
4261
  }
3893
4262
  if (!is_object(v)) {
3894
4263
  if (required) {
3895
4264
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json dict: '${path}'`);
3896
- trace_json(kw);
4265
+ trace_json_masked(kw);
3897
4266
  }
3898
4267
  return default_value;
3899
4268
  }
@@ -3916,7 +4285,7 @@ function kw_get_dict_value(gobj, kw, path, default_value, flag) {
3916
4285
  return v;
3917
4286
  } else if (required) {
3918
4287
  log_error(`path not found: '${path}'`);
3919
- trace_json(kw);
4288
+ trace_json_masked(kw);
3920
4289
  }
3921
4290
  return default_value;
3922
4291
  }
@@ -3944,14 +4313,14 @@ function kw_get_list(gobj, kw, path, default_value, flag) {
3944
4313
  }
3945
4314
  if (required) {
3946
4315
  log_error(`path not found: '${path}'`);
3947
- trace_json(kw);
4316
+ trace_json_masked(kw);
3948
4317
  }
3949
4318
  return default_value;
3950
4319
  }
3951
4320
  if (!is_array(v)) {
3952
4321
  if (required) {
3953
4322
  log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json list: '${path}'`);
3954
- trace_json(kw);
4323
+ trace_json_masked(kw);
3955
4324
  }
3956
4325
  return default_value;
3957
4326
  }
@@ -6706,7 +7075,8 @@ function mt_inject_event(gobj, event, kw, src) {
6706
7075
  window.console.error(`Not in session`);
6707
7076
  return -1;
6708
7077
  }
6709
- if (!kw) kw = {};
7078
+ kw = Object.assign({}, is_object(kw) ? kw : {});
7079
+ if (is_object(kw["__md_iev__"])) kw["__md_iev__"] = json_deep_copy(kw["__md_iev__"]);
6710
7080
  if (msg_iev_get_stack(gobj, kw, IEVENT_STACK_ID)) {} else {
6711
7081
  let jn_ievent_id = build_cli_ievent_request(gobj, gobj_name(src), kw_get_str(gobj, kw, "__service__", 0, 0));
6712
7082
  json_object_del(kw, "__service__");
@@ -6812,7 +7182,7 @@ function trace_inter_event(gobj, prefix, iev) {
6812
7182
  let hora = current_timestamp();
6813
7183
  try {
6814
7184
  log_debug("\n" + hora + " " + prefix + "\n");
6815
- trace_json(iev);
7185
+ trace_json_masked(iev);
6816
7186
  } catch (e) {
6817
7187
  log_debug("ERROR in trace_inter_event: " + e);
6818
7188
  }
@@ -7320,6 +7690,6 @@ function register_c_ievent_cli() {
7320
7690
  return create_gclass(GCLASS_NAME);
7321
7691
  }
7322
7692
  //#endregion
7323
- export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
7693
+ export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_secret_name, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_mask_secrets, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, mask_secrets_inline, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_json_masked, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
7324
7694
 
7325
7695
  //# sourceMappingURL=gobj-js.es.js.map