@yuneta/gobj-js 7.25.8 → 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.
- package/README.md +17 -0
- package/dist/gobj-js.cjs.js +432 -60
- package/dist/gobj-js.cjs.js.map +1 -1
- package/dist/gobj-js.cjs.min.js +1210 -991
- package/dist/gobj-js.cjs.min.js.map +1 -1
- package/dist/gobj-js.es.js +429 -61
- package/dist/gobj-js.es.js.map +1 -1
- package/dist/gobj-js.es.min.js +1233 -1014
- package/dist/gobj-js.es.min.js.map +1 -1
- package/dist/gobj-js.iife.js +432 -60
- package/dist/gobj-js.iife.js.map +1 -1
- package/dist/gobj-js.iife.min.js +1251 -1032
- package/dist/gobj-js.iife.min.js.map +1 -1
- package/dist/gobj-js.umd.js +432 -60
- package/dist/gobj-js.umd.js.map +1 -1
- package/dist/gobj-js.umd.min.js +1240 -1021
- package/dist/gobj-js.umd.min.js.map +1 -1
- package/package.json +2 -2
package/dist/gobj-js.es.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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))
|
|
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))
|
|
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
|
-
|
|
2586
|
-
|
|
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,
|
|
2702
|
-
|
|
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
|
-
|
|
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,
|
|
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,
|
|
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
|
|
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)))
|
|
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
|
|
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 (
|
|
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
|
-
|
|
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))
|
|
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,6 +3056,8 @@ 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);
|
|
3059
|
+
let event_name = subs.renamed_event;
|
|
3060
|
+
if (empty_string(event_name)) event_name = event;
|
|
2956
3061
|
let topublish = 1;
|
|
2957
3062
|
if (publisher.gclass.gmt.mt_publication_filter) topublish = publisher.gclass.gmt.mt_publication_filter(publisher, event, kw, subscriber);
|
|
2958
3063
|
else if (json_size(__filter__) > 0) {
|
|
@@ -2976,11 +3081,11 @@ function gobj_publish_event(publisher, event, kw) {
|
|
|
2976
3081
|
if (__config__) {}
|
|
2977
3082
|
if (json_size(__global__) > 0) json_object_update(kw2publish, json_deep_copy(__global__));
|
|
2978
3083
|
if (tracea) {
|
|
2979
|
-
if (__trace_machine_format__ === 1) trace_machine(sprintf("🔝🔄 %s (%s) %s%s", event ? event : "",
|
|
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))
|
|
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);
|
|
2982
3087
|
}
|
|
2983
|
-
let ret_ = gobj_send_event(subscriber,
|
|
3088
|
+
let ret_ = gobj_send_event(subscriber, event_name, kw2publish, publisher);
|
|
2984
3089
|
if (ret_ < 0 && subs_flag & subs_flag_t.__own_event__) {
|
|
2985
3090
|
sent_count = -1;
|
|
2986
3091
|
break;
|
|
@@ -3004,8 +3109,9 @@ function gobj_command(gobj, command, kw, src) {
|
|
|
3004
3109
|
return -1;
|
|
3005
3110
|
}
|
|
3006
3111
|
if (is_commands_tracing(gobj) || is_machine_tracing(gobj, null) && !is_machine_not_tracing(src, null)) {
|
|
3007
|
-
|
|
3008
|
-
|
|
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);
|
|
3009
3115
|
}
|
|
3010
3116
|
if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
|
|
3011
3117
|
if (gobj.gclass.command_table) {
|
|
@@ -3221,6 +3327,268 @@ function trace_json(jn, msg) {
|
|
|
3221
3327
|
emit_log_callback("json", jn, current_timestamp());
|
|
3222
3328
|
}
|
|
3223
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
|
+
/************************************************************
|
|
3224
3592
|
* Duplicate an object (new references)
|
|
3225
3593
|
* using the modern structuredClone (Deep copy of a single object)
|
|
3226
3594
|
************************************************************/
|
|
@@ -3522,8 +3890,8 @@ function strstr(haystack, needle, bool) {
|
|
|
3522
3890
|
***************************************************************************/
|
|
3523
3891
|
function is_metadata_key(key) {
|
|
3524
3892
|
if (!is_string(key)) return false;
|
|
3525
|
-
let i;
|
|
3526
|
-
for (
|
|
3893
|
+
let i = 0;
|
|
3894
|
+
for (; i < key.length; i++) {
|
|
3527
3895
|
if (key[i] !== "_") break;
|
|
3528
3896
|
if (i > 2) break;
|
|
3529
3897
|
}
|
|
@@ -3534,8 +3902,8 @@ function is_metadata_key(key) {
|
|
|
3534
3902
|
***************************************************************************/
|
|
3535
3903
|
function is_private_key(key) {
|
|
3536
3904
|
if (!is_string(key)) return false;
|
|
3537
|
-
let i;
|
|
3538
|
-
for (
|
|
3905
|
+
let i = 0;
|
|
3906
|
+
for (; i < key.length; i++) {
|
|
3539
3907
|
if (key[i] !== "_") break;
|
|
3540
3908
|
if (i > 2) break;
|
|
3541
3909
|
}
|
|
@@ -3646,7 +4014,7 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
|
|
|
3646
4014
|
return v;
|
|
3647
4015
|
} else if (required) {
|
|
3648
4016
|
log_error(`path not found: '${path}'`);
|
|
3649
|
-
|
|
4017
|
+
trace_json_masked(kw);
|
|
3650
4018
|
}
|
|
3651
4019
|
return Boolean(default_value);
|
|
3652
4020
|
}
|
|
@@ -3660,11 +4028,11 @@ function kw_get_bool(gobj, kw, path, default_value, flag) {
|
|
|
3660
4028
|
} else if (wild && b === null) value = false;
|
|
3661
4029
|
else if (wild) {
|
|
3662
4030
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
|
|
3663
|
-
|
|
4031
|
+
trace_json_masked(kw);
|
|
3664
4032
|
return false;
|
|
3665
4033
|
} else {
|
|
3666
4034
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json boolean: '${path}'`);
|
|
3667
|
-
|
|
4035
|
+
trace_json_masked(kw);
|
|
3668
4036
|
return Boolean(default_value);
|
|
3669
4037
|
}
|
|
3670
4038
|
if (extract) kw_delete(gobj, kw, path);
|
|
@@ -3714,7 +4082,7 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
|
|
|
3714
4082
|
return v;
|
|
3715
4083
|
} else if (required) {
|
|
3716
4084
|
log_error(`path not found: '${path}'`);
|
|
3717
|
-
|
|
4085
|
+
trace_json_masked(kw);
|
|
3718
4086
|
}
|
|
3719
4087
|
return parseInt(default_value);
|
|
3720
4088
|
}
|
|
@@ -3722,14 +4090,14 @@ function kw_get_int(gobj, kw, path, default_value, flag) {
|
|
|
3722
4090
|
if (is_number(v)) value = Math.trunc(v);
|
|
3723
4091
|
else if (!wild) {
|
|
3724
4092
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json integer: '${path}'`);
|
|
3725
|
-
|
|
4093
|
+
trace_json_masked(kw);
|
|
3726
4094
|
return parseInt(default_value);
|
|
3727
4095
|
} else if (is_boolean(v)) value = v ? 1 : 0;
|
|
3728
4096
|
else if (is_string(v)) value = strtoll_base0(v);
|
|
3729
4097
|
else if (v === null) value = 0;
|
|
3730
4098
|
else {
|
|
3731
4099
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
|
|
3732
|
-
|
|
4100
|
+
trace_json_masked(kw);
|
|
3733
4101
|
return 0;
|
|
3734
4102
|
}
|
|
3735
4103
|
if (extract) kw_delete(gobj, kw, path);
|
|
@@ -3761,7 +4129,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
|
|
|
3761
4129
|
return v;
|
|
3762
4130
|
} else if (required) {
|
|
3763
4131
|
log_error(`path not found: '${path}'`);
|
|
3764
|
-
|
|
4132
|
+
trace_json_masked(kw);
|
|
3765
4133
|
}
|
|
3766
4134
|
return Number(default_value);
|
|
3767
4135
|
}
|
|
@@ -3769,7 +4137,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
|
|
|
3769
4137
|
if (is_number(v)) value = v;
|
|
3770
4138
|
else if (!wild) {
|
|
3771
4139
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json real: '${path}'`);
|
|
3772
|
-
|
|
4140
|
+
trace_json_masked(kw);
|
|
3773
4141
|
return Number(default_value);
|
|
3774
4142
|
} else if (is_boolean(v)) value = v ? 1 : 0;
|
|
3775
4143
|
else if (is_string(v)) {
|
|
@@ -3778,7 +4146,7 @@ function kw_get_real(gobj, kw, path, default_value, flag) {
|
|
|
3778
4146
|
} else if (v === null) value = 0;
|
|
3779
4147
|
else {
|
|
3780
4148
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a simple json element: '${path}'`);
|
|
3781
|
-
|
|
4149
|
+
trace_json_masked(kw);
|
|
3782
4150
|
return 0;
|
|
3783
4151
|
}
|
|
3784
4152
|
if (extract) kw_delete(gobj, kw, path);
|
|
@@ -3830,14 +4198,14 @@ function kw_get_str(gobj, kw, path, default_value, flag) {
|
|
|
3830
4198
|
return default_value;
|
|
3831
4199
|
} else if (required && !kw_path_holds_key(kw, path)) {
|
|
3832
4200
|
log_error(`path not found: '${path}'`);
|
|
3833
|
-
|
|
4201
|
+
trace_json_masked(kw);
|
|
3834
4202
|
}
|
|
3835
4203
|
return default_value;
|
|
3836
4204
|
}
|
|
3837
4205
|
if (!is_string(v)) {
|
|
3838
4206
|
if (v !== null) {
|
|
3839
4207
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json str: '${path}'`);
|
|
3840
|
-
|
|
4208
|
+
trace_json_masked(kw);
|
|
3841
4209
|
}
|
|
3842
4210
|
return default_value;
|
|
3843
4211
|
}
|
|
@@ -3860,7 +4228,7 @@ function kw_get_pointer(gobj, kw, path, default_value, flag) {
|
|
|
3860
4228
|
return v;
|
|
3861
4229
|
} else if (required) {
|
|
3862
4230
|
log_error(`path not found: '${path}'`);
|
|
3863
|
-
|
|
4231
|
+
trace_json_masked(kw);
|
|
3864
4232
|
}
|
|
3865
4233
|
return default_value;
|
|
3866
4234
|
}
|
|
@@ -3887,14 +4255,14 @@ function kw_get_dict(gobj, kw, path, default_value, flag) {
|
|
|
3887
4255
|
}
|
|
3888
4256
|
if (required) {
|
|
3889
4257
|
log_error(`path not found: '${path}'`);
|
|
3890
|
-
|
|
4258
|
+
trace_json_masked(kw);
|
|
3891
4259
|
}
|
|
3892
4260
|
return default_value;
|
|
3893
4261
|
}
|
|
3894
4262
|
if (!is_object(v)) {
|
|
3895
4263
|
if (required) {
|
|
3896
4264
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json dict: '${path}'`);
|
|
3897
|
-
|
|
4265
|
+
trace_json_masked(kw);
|
|
3898
4266
|
}
|
|
3899
4267
|
return default_value;
|
|
3900
4268
|
}
|
|
@@ -3917,7 +4285,7 @@ function kw_get_dict_value(gobj, kw, path, default_value, flag) {
|
|
|
3917
4285
|
return v;
|
|
3918
4286
|
} else if (required) {
|
|
3919
4287
|
log_error(`path not found: '${path}'`);
|
|
3920
|
-
|
|
4288
|
+
trace_json_masked(kw);
|
|
3921
4289
|
}
|
|
3922
4290
|
return default_value;
|
|
3923
4291
|
}
|
|
@@ -3945,14 +4313,14 @@ function kw_get_list(gobj, kw, path, default_value, flag) {
|
|
|
3945
4313
|
}
|
|
3946
4314
|
if (required) {
|
|
3947
4315
|
log_error(`path not found: '${path}'`);
|
|
3948
|
-
|
|
4316
|
+
trace_json_masked(kw);
|
|
3949
4317
|
}
|
|
3950
4318
|
return default_value;
|
|
3951
4319
|
}
|
|
3952
4320
|
if (!is_array(v)) {
|
|
3953
4321
|
if (required) {
|
|
3954
4322
|
log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}path MUST BE a json list: '${path}'`);
|
|
3955
|
-
|
|
4323
|
+
trace_json_masked(kw);
|
|
3956
4324
|
}
|
|
3957
4325
|
return default_value;
|
|
3958
4326
|
}
|
|
@@ -6814,7 +7182,7 @@ function trace_inter_event(gobj, prefix, iev) {
|
|
|
6814
7182
|
let hora = current_timestamp();
|
|
6815
7183
|
try {
|
|
6816
7184
|
log_debug("\n" + hora + " " + prefix + "\n");
|
|
6817
|
-
|
|
7185
|
+
trace_json_masked(iev);
|
|
6818
7186
|
} catch (e) {
|
|
6819
7187
|
log_debug("ERROR in trace_inter_event: " + e);
|
|
6820
7188
|
}
|
|
@@ -7322,6 +7690,6 @@ function register_c_ievent_cli() {
|
|
|
7322
7690
|
return create_gclass(GCLASS_NAME);
|
|
7323
7691
|
}
|
|
7324
7692
|
//#endregion
|
|
7325
|
-
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 };
|
|
7326
7694
|
|
|
7327
7695
|
//# sourceMappingURL=gobj-js.es.js.map
|