@yuneta/gobj-js 7.16.6 → 7.22.0

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.
@@ -193,7 +193,7 @@ function build_stats_response(gobj, result, comment, schema, data) {
193
193
  *
194
194
  * Licence: MIT (http://www.opensource.org/licenses/mit-license)
195
195
  * Copyright (c) 2014,2024 Niyamaka.
196
- * Copyright (c) 2025, ArtGins.
196
+ * Copyright (c) 2025-2026, ArtGins.
197
197
  *********************************************************************************/
198
198
  /**************************************************************************
199
199
  * Constants
@@ -428,6 +428,7 @@ var trace_level_t = Object.freeze({
428
428
  TRACE_URING_TIME: 536870912,
429
429
  TRACE_COMMANDS: 1073741824
430
430
  });
431
+ var TRACE_USER_LEVEL = 65535;
431
432
  var TRACE_GLOBAL_LEVEL1 = 268369920;
432
433
  var s_global_trace_level = [
433
434
  [
@@ -509,17 +510,28 @@ var s_global_trace_level = [
509
510
  var __global_trace_level__ = 0;
510
511
  var __global_trace_no_level__ = 0;
511
512
  var __deep_trace__ = 0;
512
- function level2bit(level) {
513
+ function level2bit(level, s_user_trace_level) {
513
514
  for (const [name, bit] of s_global_trace_level) if (name === level) return bit;
515
+ if (Array.isArray(s_user_trace_level)) {
516
+ for (let i = 0; i < s_user_trace_level.length && i < 16; i++) if (s_user_trace_level[i] && s_user_trace_level[i][0] === level) return 1 << i;
517
+ }
514
518
  return 0;
515
519
  }
516
- function trace_bitmask(level, who) {
517
- if (empty_string(level)) return TRACE_GLOBAL_LEVEL1;
520
+ function bit2level(bitmask, s_user_trace_level) {
521
+ let levels = [];
522
+ for (const [name, bit] of s_global_trace_level) if (bitmask & bit) levels.push(name);
523
+ if (Array.isArray(s_user_trace_level)) {
524
+ for (let i = 0; i < s_user_trace_level.length && i < 16; i++) if (s_user_trace_level[i] && bitmask & 1 << i) levels.push(s_user_trace_level[i][0]);
525
+ }
526
+ return levels;
527
+ }
528
+ function trace_bitmask(level, who, s_user_trace_level) {
529
+ if (empty_string(level)) return s_user_trace_level === void 0 ? TRACE_GLOBAL_LEVEL1 : TRACE_USER_LEVEL;
518
530
  if (/^[0-9]+$/.test(String(level))) {
519
531
  const n = Number(level);
520
532
  if (n) return n;
521
533
  }
522
- const bit = level2bit(String(level));
534
+ const bit = level2bit(String(level), s_user_trace_level);
523
535
  if (!bit) {
524
536
  log_error(`${who}: trace level NOT FOUND: ${level}`);
525
537
  return 0;
@@ -548,32 +560,30 @@ function gobj_trace_no_level(gobj) {
548
560
  }
549
561
  return bitmask;
550
562
  }
551
- function legacy_yuno_trace_bits() {
552
- if (!__yuno__ || !__yuno__.jn_attrs) return 0;
553
- let bits = 0;
554
- if (gobj_has_attr(__yuno__, "tracing")) {
555
- const tracing = Number(gobj_read_attr(__yuno__, "tracing")) || 0;
556
- if (tracing >= 1) bits |= trace_level_t.TRACE_MACHINE;
557
- if (tracing >= 2) bits |= trace_level_t.TRACE_EV_KW;
558
- }
559
- if (gobj_has_attr(__yuno__, "trace_timer") && gobj_read_attr(__yuno__, "trace_timer")) bits |= trace_level_t.TRACE_TIMER;
560
- if (gobj_has_attr(__yuno__, "trace_creation") && gobj_read_attr(__yuno__, "trace_creation")) bits |= trace_level_t.TRACE_CREATE_DELETE;
561
- if (gobj_has_attr(__yuno__, "trace_start_stop") && gobj_read_attr(__yuno__, "trace_start_stop")) bits |= trace_level_t.TRACE_START_STOP;
562
- return bits;
563
- }
564
563
  function __trace_gobj_create_delete__(gobj) {
565
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_CREATE_DELETE;
564
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_CREATE_DELETE;
565
+ }
566
+ function __trace_gobj_subscriptions__(gobj) {
567
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_SUBSCRIPTIONS;
566
568
  }
567
569
  function __trace_gobj_start_stop__(gobj) {
568
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_START_STOP;
570
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_START_STOP;
569
571
  }
570
572
  function __trace_gobj_ev_kw__(gobj) {
571
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_EV_KW;
573
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_EV_KW;
572
574
  }
573
575
  function __trace_gobj_states__(gobj) {
574
576
  return gobj_trace_level(gobj) & trace_level_t.TRACE_STATES;
575
577
  }
576
578
  /************************************************************
579
+ * Must trace a command? — the C kernel's is_commands_tracing()
580
+ ************************************************************/
581
+ function is_commands_tracing(gobj) {
582
+ if (__deep_trace__ > 1) return true;
583
+ if (!gobj) return false;
584
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_COMMANDS ? true : false;
585
+ }
586
+ /************************************************************
577
587
  * Must trace? — the C kernel's is_machine_tracing(), including
578
588
  * the two event-specific levels: `timer` and `timer_periodic`
579
589
  * light up only for their own event.
@@ -581,7 +591,7 @@ function __trace_gobj_states__(gobj) {
581
591
  function is_machine_tracing(gobj, event) {
582
592
  if (__deep_trace__ > 1) return true;
583
593
  if (!gobj) return false;
584
- const level = gobj_trace_level(gobj) | legacy_yuno_trace_bits();
594
+ const level = gobj_trace_level(gobj);
585
595
  return level & trace_level_t.TRACE_MACHINE || level & trace_level_t.TRACE_TIMER_PERIODIC && event === "EV_TIMEOUT_PERIODIC" || level & trace_level_t.TRACE_TIMER && event === "EV_TIMEOUT" ? true : false;
586
596
  }
587
597
  /************************************************************
@@ -614,6 +624,49 @@ function gobj_set_global_no_trace(level, set) {
614
624
  function gobj_global_trace_level() {
615
625
  return __global_trace_level__;
616
626
  }
627
+ function gobj_global_trace_no_level() {
628
+ return __global_trace_no_level__;
629
+ }
630
+ function gobj_set_global_trace2(bitmask, set) {
631
+ if (set) __global_trace_level__ = (__global_trace_level__ | bitmask) >>> 0;
632
+ else __global_trace_level__ = (__global_trace_level__ & ~bitmask) >>> 0;
633
+ return 0;
634
+ }
635
+ function gobj_set_global_no_trace2(bitmask, set) {
636
+ if (set) __global_trace_no_level__ = (__global_trace_no_level__ | bitmask) >>> 0;
637
+ else __global_trace_no_level__ = (__global_trace_no_level__ & ~bitmask) >>> 0;
638
+ return 0;
639
+ }
640
+ function gobj_get_global_trace_level() {
641
+ return bit2level(__global_trace_level__, null);
642
+ }
643
+ function gobj_get_global_trace_no_level() {
644
+ return bit2level(__global_trace_no_level__, null);
645
+ }
646
+ function gobj_get_gclass_trace_level(gclass) {
647
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
648
+ if (!gclass_) {
649
+ log_error(`gobj_get_gclass_trace_level: gclass NOT FOUND: ${gclass}`);
650
+ return [];
651
+ }
652
+ return bit2level(gclass_.trace_level | __global_trace_level__, gclass_.s_user_trace_level);
653
+ }
654
+ function gobj_get_gclass_trace_level2(gclass) {
655
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
656
+ if (!gclass_) {
657
+ log_error(`gobj_get_gclass_trace_level2: gclass NOT FOUND: ${gclass}`);
658
+ return [];
659
+ }
660
+ return bit2level(gclass_.trace_level, gclass_.s_user_trace_level);
661
+ }
662
+ function gobj_get_gclass_trace_no_level(gclass) {
663
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
664
+ if (!gclass_) {
665
+ log_error(`gobj_get_gclass_trace_no_level: gclass NOT FOUND: ${gclass}`);
666
+ return [];
667
+ }
668
+ return bit2level(gclass_.no_trace_level, gclass_.s_user_trace_level);
669
+ }
617
670
  function gobj_set_deep_trace(value) {
618
671
  __deep_trace__ = Number(value) || 0;
619
672
  return 0;
@@ -624,7 +677,7 @@ function gobj_set_gclass_trace(gclass, level, set) {
624
677
  log_error(`gobj_set_gclass_trace: gclass NOT FOUND: ${gclass}`);
625
678
  return -1;
626
679
  }
627
- const bitmask = trace_bitmask(level, "gobj_set_gclass_trace");
680
+ const bitmask = level === null ? 4294967295 : trace_bitmask(level, "gobj_set_gclass_trace", gclass_.s_user_trace_level || null);
628
681
  if (!bitmask) return -1;
629
682
  if (set) gclass_.trace_level |= bitmask;
630
683
  else gclass_.trace_level &= ~bitmask;
@@ -635,7 +688,7 @@ function gobj_set_gobj_trace(gobj, level, set) {
635
688
  log_error(`gobj_set_gobj_trace: gobj NULL`);
636
689
  return -1;
637
690
  }
638
- const bitmask = trace_bitmask(level, "gobj_set_gobj_trace");
691
+ const bitmask = trace_bitmask(level, "gobj_set_gobj_trace", gobj.gclass && gobj.gclass.s_user_trace_level || null);
639
692
  if (!bitmask) return -1;
640
693
  if (set) gobj.trace_level |= bitmask;
641
694
  else gobj.trace_level &= ~bitmask;
@@ -647,7 +700,7 @@ function gobj_set_gclass_no_trace(gclass, level, set) {
647
700
  log_error(`gobj_set_gclass_no_trace: gclass NOT FOUND: ${gclass}`);
648
701
  return -1;
649
702
  }
650
- const bitmask = trace_bitmask(level, "gobj_set_gclass_no_trace");
703
+ const bitmask = level === null ? 4294967295 : trace_bitmask(level, "gobj_set_gclass_no_trace", gclass_.s_user_trace_level || null);
651
704
  if (!bitmask) return -1;
652
705
  if (set) gclass_.no_trace_level |= bitmask;
653
706
  else gclass_.no_trace_level &= ~bitmask;
@@ -658,7 +711,7 @@ function gobj_set_gobj_no_trace(gobj, level, set) {
658
711
  log_error(`gobj_set_gobj_no_trace: gobj NULL`);
659
712
  return -1;
660
713
  }
661
- const bitmask = trace_bitmask(level, "gobj_set_gobj_no_trace");
714
+ const bitmask = trace_bitmask(level, "gobj_set_gobj_no_trace", gobj.gclass && gobj.gclass.s_user_trace_level || null);
662
715
  if (!bitmask) return -1;
663
716
  if (set) gobj.no_trace_level |= bitmask;
664
717
  else gobj.no_trace_level &= ~bitmask;
@@ -2662,7 +2715,7 @@ function _delete_subscription(gobj, subs, force, not_inform) {
2662
2715
  if (kw_get_int(gobj, subs, "subs_flag", null, kw_flag_t.KW_REQUIRED) & subs_flag_t.__hard_subscription__ ? 1 : 0) {
2663
2716
  if (!force) return -1;
2664
2717
  }
2665
- if (__yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions")) {
2718
+ if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2666
2719
  trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s'", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2667
2720
  trace_json(subs);
2668
2721
  }
@@ -2733,7 +2786,7 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
2733
2786
  }
2734
2787
  json_array_append(publisher.dl_subscriptions, subs);
2735
2788
  json_array_append(subscriber.dl_subscribings, subs);
2736
- if (__yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions")) {
2789
+ if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2737
2790
  trace_machine(sprintf("💜💜👍 subscribing event '%s', publisher '%s', subscriber %s", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2738
2791
  if (kw) trace_json(kw);
2739
2792
  }
@@ -2871,7 +2924,7 @@ function gobj_publish_event(publisher, event, kw) {
2871
2924
  return -1;
2872
2925
  }
2873
2926
  }
2874
- let tracea = __yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions");
2927
+ let tracea = (__trace_gobj_subscriptions__(publisher) || is_machine_tracing(publisher, event)) && !is_machine_not_tracing(publisher, event);
2875
2928
  if (tracea) {
2876
2929
  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));
2877
2930
  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 : "", ""));
@@ -2949,10 +3002,9 @@ function gobj_command(gobj, command, kw, src) {
2949
3002
  log_error("gobj NULL or DESTROYED");
2950
3003
  return -1;
2951
3004
  }
2952
- let tracea = __yuno__ && gobj_read_integer_attr(__yuno__, "tracing");
2953
- if (tracea) {
3005
+ if (is_commands_tracing(gobj) || is_machine_tracing(gobj, null) && !is_machine_not_tracing(src, null)) {
2954
3006
  trace_machine(sprintf("🌀🌀 mach(%s%s), cmd: %s, src: %s", !gobj_is_running(gobj) ? "!!" : "", gobj_short_name(gobj), command, gobj_short_name(src)));
2955
- if (tracea > 1) trace_json(kw);
3007
+ if (__trace_gobj_ev_kw__(gobj)) trace_json(kw);
2956
3008
  }
2957
3009
  if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
2958
3010
  if (gobj.gclass.command_table) {
@@ -4020,10 +4072,18 @@ Being `kw` a:
4020
4072
  - list of strings [s,...]
4021
4073
  - list of dicts [{},...]
4022
4074
  - dict of dicts {id:{},...}
4023
- return a **NEW** list of incref (clone) kw filtering the rows by `jn_filter` (where),
4024
- and matching the ids.
4025
- If match_fn is 0 then kw_match_simple is used.
4026
- NOTE Using JSON_INCREF/JSON_DECREF HACK
4075
+ return a NEW list holding the rows that match `ids` and the
4076
+ `jn_filter` (where). If match_fn is 0 then kw_match_simple is used.
4077
+
4078
+ WARNING the LIST is new; its elements are THE SAME objects, not
4079
+ copies. The C twin increfs each one and says "clone", which this
4080
+ comment repeated for years: javascript has no refcount, so a write
4081
+ through a collected row writes into `kw`. Copy what you mean to
4082
+ modify.
4083
+
4084
+ Returns null -- not an empty list -- for a `kw` that is neither a
4085
+ list nor a dict, so a caller that reads `.length` off the answer
4086
+ must check it first (kwid_find_one_record does).
4027
4087
  *************************************************************/
4028
4088
  function kwid_collect(gobj, kw, ids, jn_filter, match_fn) {
4029
4089
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -4052,12 +4112,17 @@ function kwid_collect(gobj, kw, ids, jn_filter, match_fn) {
4052
4112
  }
4053
4113
  /*************************************************************
4054
4114
  Utility for databases.
4055
- Return a new dict from a "dict of records" or "list of records"
4056
- WARNING the "id" of a dict's record is hardcorded to their key.
4115
+ Return a dict from a "dict of records" or "list of records".
4116
+ WARNING the "id" of a dict's record is hardcoded to its key.
4057
4117
  Convention:
4058
- - all arrays are list of records (dicts) with "id" field as primary key
4118
+ - all arrays are lists of records (dicts) with "id" as primary key
4059
4119
  - delimiter is '`' and '.'
4060
4120
  If path is empty then use kw
4121
+
4122
+ WARNING "new" is the C twin's word, where it means a new REFERENCE:
4123
+ handed a dict, both return THAT dict and not a copy of it. Only the
4124
+ list case builds something new, and even then the records inside it
4125
+ are the same objects.
4061
4126
  *************************************************************/
4062
4127
  function kwid_new_dict(gobj, kw, path) {
4063
4128
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
@@ -4066,20 +4131,59 @@ function kwid_new_dict(gobj, kw, path) {
4066
4131
  if (is_object(kw)) new_dict = kw;
4067
4132
  else if (is_array(kw)) for (let i = 0; i < kw.length; i++) {
4068
4133
  let kv = kw[i];
4069
- let id = kw_get_str(gobj, kv, "id", "", 0);
4134
+ let id = kw_get_str(gobj, kv, "id", "", kw_flag_t.KW_REQUIRED);
4070
4135
  if (!empty_string(id)) new_dict[id] = kv;
4071
4136
  }
4072
4137
  else log_error(`${gobj_short_name(gobj)} kwid_new_dict: data type unknown`);
4073
4138
  return new_dict;
4074
4139
  }
4075
4140
  /*************************************************************
4141
+ Utility for databases.
4142
+ Return a list from a "dict of records" or "list of records".
4143
+ The NORMALIZING function of this family: whatever shape the data
4144
+ arrives in, what comes back is the shape a table indexed and
4145
+ sorted by `id` wants.
4146
+ Convention:
4147
+ - all arrays are lists of records (dicts) with "id" as primary key
4148
+ - delimiter is '`' and '.'
4149
+ If path is empty then use kw
4150
+
4151
+ WARNING handed a DICT it writes each record's key into the record
4152
+ as its `id`, OVERWRITING one that differs -- in the source records,
4153
+ which it does not copy. That is the C twin's behaviour
4154
+ (`json_object_set_new(v, "id", ...)` in kwid.c) and it is the point:
4155
+ a dict keyed by id whose records disagree with their own key is
4156
+ exactly what this is for. Handed a LIST it returns that same list,
4157
+ untouched, as C returns a new reference to it.
4158
+ *************************************************************/
4159
+ function kwid_new_list(gobj, kw, path) {
4160
+ if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
4161
+ if (!empty_string(path)) kw = kw_find_path(gobj, kw, path);
4162
+ if (is_array(kw)) return kw;
4163
+ if (is_object(kw)) {
4164
+ let new_list = [];
4165
+ for (let id of Object.keys(kw)) {
4166
+ let record = kw[id];
4167
+ if (!is_object(record)) {
4168
+ log_error(`${gobj_short_name(gobj)} kwid_new_list: not a record: '${id}'`);
4169
+ continue;
4170
+ }
4171
+ record["id"] = id;
4172
+ new_list.push(record);
4173
+ }
4174
+ return new_list;
4175
+ }
4176
+ log_error(`${gobj_short_name(gobj)} kwid_new_list: wrong type for list`);
4177
+ return [];
4178
+ }
4179
+ /*************************************************************
4076
4180
  * Utility for databases. See kwid_collect parameters
4077
4181
  *************************************************************/
4078
4182
  function kwid_find_one_record(gobj, kw, ids, jn_filter, match_fn) {
4079
4183
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
4080
4184
  let list = kwid_collect(gobj, kw, ids, jn_filter, match_fn);
4081
- if (list.length > 0) return list[0];
4082
- else return null;
4185
+ if (!list || list.length === 0) return null;
4186
+ return list[0];
4083
4187
  }
4084
4188
  /*************************************************************
4085
4189
  Utility for databases.
@@ -5984,7 +6088,7 @@ function clear_timeout(gobj) {
5984
6088
  *
5985
6089
  * The default yuno in js
5986
6090
  *
5987
- * Copyright (c) 2025, ArtGins.
6091
+ * Copyright (c) 2025-2026, ArtGins.
5988
6092
  * All Rights Reserved. ****************************************************************************/
5989
6093
  /***************************************************************
5990
6094
  * Constants
@@ -6007,15 +6111,9 @@ var attrs_table$1 = [
6007
6111
  SDATA(data_type_t.DTP_STRING, "yuno_version", 0, "", "Yuno version (APP_VERSION)"),
6008
6112
  SDATA(data_type_t.DTP_STRING, "yuneta_version", 0, YUNETA_VERSION, "Yuneta version"),
6009
6113
  SDATA(data_type_t.DTP_LIST, "required_services", 0, "[]", "Required services"),
6010
- SDATA(data_type_t.DTP_INTEGER, "tracing", 0, 0, "Tracing level"),
6011
- SDATA(data_type_t.DTP_BOOLEAN, "trace_timer", 0, 0, "Trace timers"),
6012
- SDATA(data_type_t.DTP_BOOLEAN, "trace_inter_event", 0, 0, "Trace traffic"),
6013
- SDATA(data_type_t.DTP_POINTER, "trace_ievent_callback", 0, null, "Trace traffic callback"),
6014
- SDATA(data_type_t.DTP_BOOLEAN, "trace_creation", 0, 0, "Trace creation"),
6015
- SDATA(data_type_t.DTP_BOOLEAN, "trace_start_stop", 0, 0, "Trace start/stop"),
6016
- SDATA(data_type_t.DTP_BOOLEAN, "trace_subscriptions", 0, 0, "Trace subscription"),
6017
- SDATA(data_type_t.DTP_BOOLEAN, "trace_i18n", 0, 0, "Trace i18n"),
6018
- SDATA(data_type_t.DTP_BOOLEAN, "no_poll", 0, 0, "no poll"),
6114
+ SDATA(data_type_t.DTP_DICT, "trace_levels", sdata_flag_t.SDF_PERSIST, "{}", "Trace levels"),
6115
+ SDATA(data_type_t.DTP_DICT, "no_trace_levels", sdata_flag_t.SDF_PERSIST, "{}", "No trace levels"),
6116
+ SDATA(data_type_t.DTP_POINTER, "trace_ievent_callback", 0, null, "Where the traffic trace goes (C_IEVENT_CLI levels ievents/ievents2); console when null"),
6019
6117
  SDATA(data_type_t.DTP_BOOLEAN, "developer", 0, false, "Developer mode enabled"),
6020
6118
  SDATA(data_type_t.DTP_INTEGER, "periodic_timeout", 0, "1000", "Timeout periodic, in miliseconds."),
6021
6119
  SDATA_END()
@@ -6034,6 +6132,8 @@ function mt_create$1(gobj) {
6034
6132
  gobj_write_str_attr(gobj, "node_uuid", node_uuid());
6035
6133
  gobj.priv.gobj_timer = gobj_create_pure_child(gobj_name(gobj), "C_TIMER", {}, gobj);
6036
6134
  priv.periodic_timeout = gobj_read_attr(gobj, "periodic_timeout");
6135
+ set_user_gclass_traces(gobj);
6136
+ set_user_gclass_no_traces(gobj);
6037
6137
  }
6038
6138
  /***************************************************************
6039
6139
  * Framework Method: Writing
@@ -6078,8 +6178,135 @@ function mt_destroy$1(gobj) {}
6078
6178
  * Local Methods
6079
6179
  ***************************/
6080
6180
  /***************************************************************
6181
+ * Restore the trace levels the user persisted.
6081
6182
  *
6183
+ * A saved scope REPLACES what is in force: main() sets its defaults
6184
+ * (gobj_set_global_no_trace("timer_periodic"), a gclass it wants quiet)
6185
+ * before the yuno is created, and a default the user turned off must
6186
+ * stay off. A scope is saved whole, empty included (save_global_trace());
6187
+ * a scope never saved keeps main()'s. The C kernel's C_YUNO does the same.
6188
+ ***************************************************************/
6189
+ function set_user_gclass_traces(gobj) {
6190
+ let jn_trace_levels = gobj_read_attr(gobj, "trace_levels");
6191
+ if (!is_object(jn_trace_levels)) return 0;
6192
+ let jn_global = jn_trace_levels["__global_trace__"];
6193
+ if (is_array(jn_global)) {
6194
+ gobj_set_global_trace2(4294967295, false);
6195
+ for (let level of jn_global) gobj_set_global_trace(level, true);
6196
+ }
6197
+ for (const [name, jn_levels] of Object.entries(jn_trace_levels)) {
6198
+ let gclass = gclass_find_by_name(name);
6199
+ if (!gclass) continue;
6200
+ if (!is_array(jn_levels)) {
6201
+ log_error(`${gobj_name(gobj)}: trace_levels of ${name} MUST be a list`);
6202
+ continue;
6203
+ }
6204
+ gobj_set_gclass_trace(gclass, null, false);
6205
+ for (let level of jn_levels) gobj_set_gclass_trace(gclass, level, true);
6206
+ }
6207
+ return 0;
6208
+ }
6209
+ /***************************************************************
6210
+ * Restore the no-trace levels, see set_user_gclass_traces()
6211
+ ***************************************************************/
6212
+ function set_user_gclass_no_traces(gobj) {
6213
+ let jn_no_trace_levels = gobj_read_attr(gobj, "no_trace_levels");
6214
+ if (!is_object(jn_no_trace_levels)) return 0;
6215
+ let jn_global = jn_no_trace_levels["__global_no_trace__"];
6216
+ if (is_array(jn_global)) {
6217
+ gobj_set_global_no_trace2(4294967295, false);
6218
+ for (let level of jn_global) gobj_set_global_no_trace(level, true);
6219
+ }
6220
+ for (const [name, jn_levels] of Object.entries(jn_no_trace_levels)) {
6221
+ let gclass = gclass_find_by_name(name);
6222
+ if (!gclass) continue;
6223
+ if (!is_array(jn_levels)) {
6224
+ log_error(`${gobj_name(gobj)}: no_trace_levels of ${name} MUST be a list`);
6225
+ continue;
6226
+ }
6227
+ gobj_set_gclass_no_trace(gclass, null, false);
6228
+ for (let level of jn_levels) gobj_set_gclass_no_trace(gclass, level, true);
6229
+ }
6230
+ return 0;
6231
+ }
6232
+ /***************************************************************
6233
+ * Save a scope WHOLE, from the levels in force (see
6234
+ * set_user_gclass_traces()): a saved scope replaces main()'s, so it
6235
+ * has to carry everything that must be in force.
6236
+ ***************************************************************/
6237
+ function save_trace_scope(gobj, attr, scope, levels) {
6238
+ let jn_levels = gobj_read_attr(gobj, attr);
6239
+ if (!is_object(jn_levels)) jn_levels = {};
6240
+ jn_levels[scope] = levels;
6241
+ gobj_write_attr(gobj, attr, jn_levels);
6242
+ return gobj_save_persistent_attrs(gobj, attr);
6243
+ }
6244
+ /***************************************************************
6245
+ * "set" as the C command reads it: TRUE / set / 1, FALSE / reset / 0
6082
6246
  ***************************************************************/
6247
+ function parse_set(value) {
6248
+ if (value === true || value === false) return value;
6249
+ let v = String(value === void 0 || value === null ? "" : value).toLowerCase();
6250
+ if (v === "true" || v === "set") return true;
6251
+ if (v === "false" || v === "reset") return false;
6252
+ if (v === "" || isNaN(Number(v))) return null;
6253
+ return Number(v) ? true : false;
6254
+ }
6255
+ function yuno_prefix() {
6256
+ return `${gobj_yuno_role()}^${gobj_yuno_name()}`;
6257
+ }
6258
+ /***************************
6259
+ * Commands
6260
+ ***************************/
6261
+ /***************************************************************
6262
+ * The trace commands of the C kernel's C_YUNO, same names and same
6263
+ * parameters (`level`, `set`, `gclass_name` / `gclass`). Setting a
6264
+ * level saves its scope.
6265
+ ***************************************************************/
6266
+ function mt_command_parser(gobj, command, kw, src) {
6267
+ kw = kw || {};
6268
+ switch (command) {
6269
+ case "get-global-trace": return build_command_response(gobj, 0, null, null, gobj_get_global_trace_level());
6270
+ case "get-global-no-trace": return build_command_response(gobj, 0, null, null, gobj_get_global_trace_no_level());
6271
+ case "set-global-trace":
6272
+ case "set-global-no-trace": {
6273
+ let no = command === "set-global-no-trace";
6274
+ let level = kw.level;
6275
+ let set = parse_set(kw.set);
6276
+ if (!level) return build_command_response(gobj, -1, `${yuno_prefix()}: what level?`, null, null);
6277
+ if (set === null) return build_command_response(gobj, -1, `${yuno_prefix()}: bitmask set or re-set?`, null, null);
6278
+ if ((no ? gobj_set_global_no_trace(level, set) : gobj_set_global_trace(level, set)) < 0) return build_command_response(gobj, -1, `${yuno_prefix()}: global trace level not found: ${level}`, null, null);
6279
+ if (no) {
6280
+ save_trace_scope(gobj, "no_trace_levels", "__global_no_trace__", gobj_get_global_trace_no_level());
6281
+ return build_command_response(gobj, 0, null, null, gobj_get_global_trace_no_level());
6282
+ }
6283
+ save_trace_scope(gobj, "trace_levels", "__global_trace__", gobj_get_global_trace_level());
6284
+ return build_command_response(gobj, 0, null, null, gobj_get_global_trace_level());
6285
+ }
6286
+ case "get-gclass-trace":
6287
+ case "get-gclass-no-trace":
6288
+ case "set-gclass-trace":
6289
+ case "set-gclass-no-trace": {
6290
+ let no = command.indexOf("no-trace") >= 0;
6291
+ let gclass_name = kw.gclass_name || kw.gclass || "";
6292
+ let gclass = gclass_find_by_name(gclass_name);
6293
+ if (!gclass) return build_command_response(gobj, -1, `${yuno_prefix()}: what gclass is '${gclass_name}'?`, null, null);
6294
+ if (command.indexOf("get-") === 0) return build_command_response(gobj, 0, null, null, no ? gobj_get_gclass_trace_no_level(gclass) : gobj_get_gclass_trace_level(gclass));
6295
+ let level = kw.level;
6296
+ let set = parse_set(kw.set);
6297
+ if (!level) return build_command_response(gobj, -1, `${yuno_prefix()}: what level?`, null, null);
6298
+ if (set === null) return build_command_response(gobj, -1, `${yuno_prefix()}: bitmask set or re-set?`, null, null);
6299
+ if ((no ? gobj_set_gclass_no_trace(gclass, level, set) : gobj_set_gclass_trace(gclass, level, set)) < 0) return build_command_response(gobj, -1, `${yuno_prefix()}: trace level of ${gclass_name} not found: ${level}`, null, null);
6300
+ if (no) {
6301
+ save_trace_scope(gobj, "no_trace_levels", gclass_name, gobj_get_gclass_trace_no_level(gclass));
6302
+ return build_command_response(gobj, 0, null, null, gobj_get_gclass_trace_no_level(gclass));
6303
+ }
6304
+ save_trace_scope(gobj, "trace_levels", gclass_name, gobj_get_gclass_trace_level2(gclass));
6305
+ return build_command_response(gobj, 0, null, null, gobj_get_gclass_trace_level(gclass));
6306
+ }
6307
+ default: return build_command_response(gobj, -1, `${yuno_prefix()}: command not available: ${command}`, null, null);
6308
+ }
6309
+ }
6083
6310
  /***************************
6084
6311
  * Actions
6085
6312
  ***************************/
@@ -6100,7 +6327,8 @@ var gmt$1 = {
6100
6327
  mt_stop: mt_stop$1,
6101
6328
  mt_destroy: mt_destroy$1,
6102
6329
  mt_play,
6103
- mt_pause
6330
+ mt_pause,
6331
+ mt_command_parser
6104
6332
  };
6105
6333
  /***************************************************************
6106
6334
  * Create the GClass
@@ -6136,7 +6364,7 @@ function register_c_yuno() {
6136
6364
  *
6137
6365
  * Licence: MIT (http://www.opensource.org/licenses/mit-license)
6138
6366
  * Copyright (c) 2014,2024 Niyamaka.
6139
- * Copyright (c) 2025, ArtGins.
6367
+ * Copyright (c) 2025-2026, ArtGins.
6140
6368
  **************************************************************************/
6141
6369
  /***************************************************************
6142
6370
  * Constants
@@ -6166,6 +6394,14 @@ var attrs_table = [
6166
6394
  SDATA(data_type_t.DTP_POINTER, "subscriber", 0, 0, "subscriber of output-events. If null then subscriber is the parent"),
6167
6395
  SDATA_END()
6168
6396
  ];
6397
+ var s_user_trace_level = [
6398
+ ["ievents", "Trace inter-events with metadata of kw"],
6399
+ ["ievents2", "Trace inter-events with full kw"],
6400
+ ["identity-card", "Trace identity_card messages"]
6401
+ ];
6402
+ function is_traffic_tracing(gobj) {
6403
+ return gobj_trace_level(gobj) & 3 ? true : false;
6404
+ }
6169
6405
  var PRIVATE_DATA = {
6170
6406
  url: null,
6171
6407
  remote_yuno_name: null,
@@ -6428,7 +6664,7 @@ function iev_create(event, kw) {
6428
6664
  function send_iev(gobj, iev) {
6429
6665
  let priv = gobj.priv;
6430
6666
  let msg = JSON.stringify(iev);
6431
- if (gobj_read_bool_attr(gobj_yuno(), "trace_inter_event")) {
6667
+ if (is_traffic_tracing(gobj)) {
6432
6668
  let url = gobj_read_str_attr(gobj, "url");
6433
6669
  let prefix = gobj_name(gobj_yuno()) + " ==> " + url;
6434
6670
  let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
@@ -6722,7 +6958,7 @@ function ac_identity_card_ack(gobj, event, kw, src) {
6722
6958
  function ac_on_message(gobj, event, kw, src) {
6723
6959
  let url = gobj.priv.url;
6724
6960
  let iev_msg = iev_create_from_json(gobj, kw.data);
6725
- if (gobj_read_bool_attr(gobj_yuno(), "trace_inter_event")) {
6961
+ if (is_traffic_tracing(gobj)) {
6726
6962
  let prefix = gobj_name(gobj_yuno()) + " <== " + url;
6727
6963
  let size = kw.data.length;
6728
6964
  let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
@@ -6895,7 +7131,7 @@ function create_gclass(gclass_name) {
6895
7131
  ["EV_ON_OPEN_ERROR", event_flag_t.EVF_OUTPUT_EVENT | event_flag_t.EVF_NO_WARN_SUBS],
6896
7132
  ["EV_TIMEOUT", 0],
6897
7133
  [null, 0]
6898
- ], states, gmt, 0, attrs_table, PRIVATE_DATA, 0, 0, 0, gclass_flag_t.gcflag_no_check_output_events);
7134
+ ], states, gmt, 0, attrs_table, PRIVATE_DATA, 0, 0, s_user_trace_level, gclass_flag_t.gcflag_no_check_output_events);
6899
7135
  if (!__gclass__) return -1;
6900
7136
  return 0;
6901
7137
  }
@@ -6906,6 +7142,6 @@ function register_c_ievent_cli() {
6906
7142
  return create_gclass(GCLASS_NAME);
6907
7143
  }
6908
7144
  //#endregion
6909
- 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_global_trace_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_trace, 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, 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 };
7145
+ 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 };
6910
7146
 
6911
7147
  //# sourceMappingURL=gobj-js.es.js.map