@yuneta/gobj-js 7.21.0 → 7.22.1

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.
@@ -195,7 +195,7 @@ var gobjJs = (function(exports) {
195
195
  *
196
196
  * Licence: MIT (http://www.opensource.org/licenses/mit-license)
197
197
  * Copyright (c) 2014,2024 Niyamaka.
198
- * Copyright (c) 2025, ArtGins.
198
+ * Copyright (c) 2025-2026, ArtGins.
199
199
  *********************************************************************************/
200
200
  /**************************************************************************
201
201
  * Constants
@@ -430,6 +430,7 @@ var gobjJs = (function(exports) {
430
430
  TRACE_URING_TIME: 536870912,
431
431
  TRACE_COMMANDS: 1073741824
432
432
  });
433
+ var TRACE_USER_LEVEL = 65535;
433
434
  var TRACE_GLOBAL_LEVEL1 = 268369920;
434
435
  var s_global_trace_level = [
435
436
  [
@@ -511,17 +512,28 @@ var gobjJs = (function(exports) {
511
512
  var __global_trace_level__ = 0;
512
513
  var __global_trace_no_level__ = 0;
513
514
  var __deep_trace__ = 0;
514
- function level2bit(level) {
515
+ function level2bit(level, s_user_trace_level) {
515
516
  for (const [name, bit] of s_global_trace_level) if (name === level) return bit;
517
+ if (Array.isArray(s_user_trace_level)) {
518
+ 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;
519
+ }
516
520
  return 0;
517
521
  }
518
- function trace_bitmask(level, who) {
519
- if (empty_string(level)) return TRACE_GLOBAL_LEVEL1;
522
+ function bit2level(bitmask, s_user_trace_level) {
523
+ let levels = [];
524
+ for (const [name, bit] of s_global_trace_level) if (bitmask & bit) levels.push(name);
525
+ if (Array.isArray(s_user_trace_level)) {
526
+ 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]);
527
+ }
528
+ return levels;
529
+ }
530
+ function trace_bitmask(level, who, s_user_trace_level) {
531
+ if (empty_string(level)) return s_user_trace_level === void 0 ? TRACE_GLOBAL_LEVEL1 : TRACE_USER_LEVEL;
520
532
  if (/^[0-9]+$/.test(String(level))) {
521
533
  const n = Number(level);
522
534
  if (n) return n;
523
535
  }
524
- const bit = level2bit(String(level));
536
+ const bit = level2bit(String(level), s_user_trace_level);
525
537
  if (!bit) {
526
538
  log_error(`${who}: trace level NOT FOUND: ${level}`);
527
539
  return 0;
@@ -550,32 +562,30 @@ var gobjJs = (function(exports) {
550
562
  }
551
563
  return bitmask;
552
564
  }
553
- function legacy_yuno_trace_bits() {
554
- if (!__yuno__ || !__yuno__.jn_attrs) return 0;
555
- let bits = 0;
556
- if (gobj_has_attr(__yuno__, "tracing")) {
557
- const tracing = Number(gobj_read_attr(__yuno__, "tracing")) || 0;
558
- if (tracing >= 1) bits |= trace_level_t.TRACE_MACHINE;
559
- if (tracing >= 2) bits |= trace_level_t.TRACE_EV_KW;
560
- }
561
- if (gobj_has_attr(__yuno__, "trace_timer") && gobj_read_attr(__yuno__, "trace_timer")) bits |= trace_level_t.TRACE_TIMER;
562
- if (gobj_has_attr(__yuno__, "trace_creation") && gobj_read_attr(__yuno__, "trace_creation")) bits |= trace_level_t.TRACE_CREATE_DELETE;
563
- if (gobj_has_attr(__yuno__, "trace_start_stop") && gobj_read_attr(__yuno__, "trace_start_stop")) bits |= trace_level_t.TRACE_START_STOP;
564
- return bits;
565
- }
566
565
  function __trace_gobj_create_delete__(gobj) {
567
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_CREATE_DELETE;
566
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_CREATE_DELETE;
567
+ }
568
+ function __trace_gobj_subscriptions__(gobj) {
569
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_SUBSCRIPTIONS;
568
570
  }
569
571
  function __trace_gobj_start_stop__(gobj) {
570
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_START_STOP;
572
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_START_STOP;
571
573
  }
572
574
  function __trace_gobj_ev_kw__(gobj) {
573
- return (gobj_trace_level(gobj) | legacy_yuno_trace_bits()) & trace_level_t.TRACE_EV_KW;
575
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_EV_KW;
574
576
  }
575
577
  function __trace_gobj_states__(gobj) {
576
578
  return gobj_trace_level(gobj) & trace_level_t.TRACE_STATES;
577
579
  }
578
580
  /************************************************************
581
+ * Must trace a command? — the C kernel's is_commands_tracing()
582
+ ************************************************************/
583
+ function is_commands_tracing(gobj) {
584
+ if (__deep_trace__ > 1) return true;
585
+ if (!gobj) return false;
586
+ return gobj_trace_level(gobj) & trace_level_t.TRACE_COMMANDS ? true : false;
587
+ }
588
+ /************************************************************
579
589
  * Must trace? — the C kernel's is_machine_tracing(), including
580
590
  * the two event-specific levels: `timer` and `timer_periodic`
581
591
  * light up only for their own event.
@@ -583,7 +593,7 @@ var gobjJs = (function(exports) {
583
593
  function is_machine_tracing(gobj, event) {
584
594
  if (__deep_trace__ > 1) return true;
585
595
  if (!gobj) return false;
586
- const level = gobj_trace_level(gobj) | legacy_yuno_trace_bits();
596
+ const level = gobj_trace_level(gobj);
587
597
  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;
588
598
  }
589
599
  /************************************************************
@@ -616,6 +626,49 @@ var gobjJs = (function(exports) {
616
626
  function gobj_global_trace_level() {
617
627
  return __global_trace_level__;
618
628
  }
629
+ function gobj_global_trace_no_level() {
630
+ return __global_trace_no_level__;
631
+ }
632
+ function gobj_set_global_trace2(bitmask, set) {
633
+ if (set) __global_trace_level__ = (__global_trace_level__ | bitmask) >>> 0;
634
+ else __global_trace_level__ = (__global_trace_level__ & ~bitmask) >>> 0;
635
+ return 0;
636
+ }
637
+ function gobj_set_global_no_trace2(bitmask, set) {
638
+ if (set) __global_trace_no_level__ = (__global_trace_no_level__ | bitmask) >>> 0;
639
+ else __global_trace_no_level__ = (__global_trace_no_level__ & ~bitmask) >>> 0;
640
+ return 0;
641
+ }
642
+ function gobj_get_global_trace_level() {
643
+ return bit2level(__global_trace_level__, null);
644
+ }
645
+ function gobj_get_global_trace_no_level() {
646
+ return bit2level(__global_trace_no_level__, null);
647
+ }
648
+ function gobj_get_gclass_trace_level(gclass) {
649
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
650
+ if (!gclass_) {
651
+ log_error(`gobj_get_gclass_trace_level: gclass NOT FOUND: ${gclass}`);
652
+ return [];
653
+ }
654
+ return bit2level(gclass_.trace_level | __global_trace_level__, gclass_.s_user_trace_level);
655
+ }
656
+ function gobj_get_gclass_trace_level2(gclass) {
657
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
658
+ if (!gclass_) {
659
+ log_error(`gobj_get_gclass_trace_level2: gclass NOT FOUND: ${gclass}`);
660
+ return [];
661
+ }
662
+ return bit2level(gclass_.trace_level, gclass_.s_user_trace_level);
663
+ }
664
+ function gobj_get_gclass_trace_no_level(gclass) {
665
+ const gclass_ = is_string(gclass) ? gclass_find_by_name(gclass) : gclass;
666
+ if (!gclass_) {
667
+ log_error(`gobj_get_gclass_trace_no_level: gclass NOT FOUND: ${gclass}`);
668
+ return [];
669
+ }
670
+ return bit2level(gclass_.no_trace_level, gclass_.s_user_trace_level);
671
+ }
619
672
  function gobj_set_deep_trace(value) {
620
673
  __deep_trace__ = Number(value) || 0;
621
674
  return 0;
@@ -626,7 +679,7 @@ var gobjJs = (function(exports) {
626
679
  log_error(`gobj_set_gclass_trace: gclass NOT FOUND: ${gclass}`);
627
680
  return -1;
628
681
  }
629
- const bitmask = trace_bitmask(level, "gobj_set_gclass_trace");
682
+ const bitmask = level === null ? 4294967295 : trace_bitmask(level, "gobj_set_gclass_trace", gclass_.s_user_trace_level || null);
630
683
  if (!bitmask) return -1;
631
684
  if (set) gclass_.trace_level |= bitmask;
632
685
  else gclass_.trace_level &= ~bitmask;
@@ -637,7 +690,7 @@ var gobjJs = (function(exports) {
637
690
  log_error(`gobj_set_gobj_trace: gobj NULL`);
638
691
  return -1;
639
692
  }
640
- const bitmask = trace_bitmask(level, "gobj_set_gobj_trace");
693
+ const bitmask = trace_bitmask(level, "gobj_set_gobj_trace", gobj.gclass && gobj.gclass.s_user_trace_level || null);
641
694
  if (!bitmask) return -1;
642
695
  if (set) gobj.trace_level |= bitmask;
643
696
  else gobj.trace_level &= ~bitmask;
@@ -649,7 +702,7 @@ var gobjJs = (function(exports) {
649
702
  log_error(`gobj_set_gclass_no_trace: gclass NOT FOUND: ${gclass}`);
650
703
  return -1;
651
704
  }
652
- const bitmask = trace_bitmask(level, "gobj_set_gclass_no_trace");
705
+ const bitmask = level === null ? 4294967295 : trace_bitmask(level, "gobj_set_gclass_no_trace", gclass_.s_user_trace_level || null);
653
706
  if (!bitmask) return -1;
654
707
  if (set) gclass_.no_trace_level |= bitmask;
655
708
  else gclass_.no_trace_level &= ~bitmask;
@@ -660,7 +713,7 @@ var gobjJs = (function(exports) {
660
713
  log_error(`gobj_set_gobj_no_trace: gobj NULL`);
661
714
  return -1;
662
715
  }
663
- const bitmask = trace_bitmask(level, "gobj_set_gobj_no_trace");
716
+ const bitmask = trace_bitmask(level, "gobj_set_gobj_no_trace", gobj.gclass && gobj.gclass.s_user_trace_level || null);
664
717
  if (!bitmask) return -1;
665
718
  if (set) gobj.no_trace_level |= bitmask;
666
719
  else gobj.no_trace_level &= ~bitmask;
@@ -2664,7 +2717,7 @@ var gobjJs = (function(exports) {
2664
2717
  if (kw_get_int(gobj, subs, "subs_flag", null, kw_flag_t.KW_REQUIRED) & subs_flag_t.__hard_subscription__ ? 1 : 0) {
2665
2718
  if (!force) return -1;
2666
2719
  }
2667
- if (__yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions")) {
2720
+ if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2668
2721
  trace_machine(sprintf("💜💜👎 unsubscribing event '%s': publisher %s, subscriber'%s'", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2669
2722
  trace_json(subs);
2670
2723
  }
@@ -2735,7 +2788,7 @@ var gobjJs = (function(exports) {
2735
2788
  }
2736
2789
  json_array_append(publisher.dl_subscriptions, subs);
2737
2790
  json_array_append(subscriber.dl_subscribings, subs);
2738
- if (__yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions")) {
2791
+ if (__trace_gobj_subscriptions__(subscriber) || __trace_gobj_subscriptions__(publisher)) {
2739
2792
  trace_machine(sprintf("💜💜👍 subscribing event '%s', publisher '%s', subscriber %s", event ? event : "", gobj_short_name(publisher), gobj_short_name(subscriber)));
2740
2793
  if (kw) trace_json(kw);
2741
2794
  }
@@ -2873,7 +2926,7 @@ var gobjJs = (function(exports) {
2873
2926
  return -1;
2874
2927
  }
2875
2928
  }
2876
- let tracea = __yuno__ && gobj_read_bool_attr(__yuno__, "trace_subscriptions");
2929
+ let tracea = (__trace_gobj_subscriptions__(publisher) || is_machine_tracing(publisher, event)) && !is_machine_not_tracing(publisher, event);
2877
2930
  if (tracea) {
2878
2931
  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));
2879
2932
  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 : "", ""));
@@ -2951,10 +3004,9 @@ var gobjJs = (function(exports) {
2951
3004
  log_error("gobj NULL or DESTROYED");
2952
3005
  return -1;
2953
3006
  }
2954
- let tracea = __yuno__ && gobj_read_integer_attr(__yuno__, "tracing");
2955
- if (tracea) {
3007
+ if (is_commands_tracing(gobj) || is_machine_tracing(gobj, null) && !is_machine_not_tracing(src, null)) {
2956
3008
  trace_machine(sprintf("🌀🌀 mach(%s%s), cmd: %s, src: %s", !gobj_is_running(gobj) ? "!!" : "", gobj_short_name(gobj), command, gobj_short_name(src)));
2957
- if (tracea > 1) trace_json(kw);
3009
+ if (__trace_gobj_ev_kw__(gobj)) trace_json(kw);
2958
3010
  }
2959
3011
  if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
2960
3012
  if (gobj.gclass.command_table) {
@@ -5052,12 +5104,13 @@ var gobjJs = (function(exports) {
5052
5104
  * Get the current timestamp in ISO 8601 format with milliseconds and time zone.
5053
5105
  * Example Output: "2024-02-24T14:05:30.123+0200"
5054
5106
  ************************************************************/
5055
- function current_timestamp() {
5056
- const now = /* @__PURE__ */ new Date();
5057
- const timestamp = now.toISOString().slice(0, 19);
5058
- const milliseconds = String(now.getMilliseconds()).padStart(3, "0");
5107
+ function current_timestamp(now) {
5108
+ now = now || /* @__PURE__ */ new Date();
5109
+ const pad = (n, w) => String(n).padStart(w, "0");
5110
+ const timestamp = `${now.getFullYear()}-${pad(now.getMonth() + 1, 2)}-${pad(now.getDate(), 2)}T${pad(now.getHours(), 2)}:${pad(now.getMinutes(), 2)}:${pad(now.getSeconds(), 2)}`;
5111
+ const milliseconds = pad(now.getMilliseconds(), 3);
5059
5112
  const offsetMinutes = now.getTimezoneOffset();
5060
- return `${timestamp}.${milliseconds}${`${offsetMinutes > 0 ? "-" : "+"}${String(Math.abs(offsetMinutes) / 60).padStart(2, "0")}${String(Math.abs(offsetMinutes) % 60).padStart(2, "0")}`}`;
5113
+ return `${timestamp}.${milliseconds}${offsetMinutes > 0 ? "-" : "+"}${pad(Math.floor(Math.abs(offsetMinutes) / 60), 2)}${pad(Math.abs(offsetMinutes) % 60, 2)}`;
5061
5114
  }
5062
5115
  /********************************************
5063
5116
  * Return UTC time of right now
@@ -6038,7 +6091,7 @@ var gobjJs = (function(exports) {
6038
6091
  *
6039
6092
  * The default yuno in js
6040
6093
  *
6041
- * Copyright (c) 2025, ArtGins.
6094
+ * Copyright (c) 2025-2026, ArtGins.
6042
6095
  * All Rights Reserved. ****************************************************************************/
6043
6096
  /***************************************************************
6044
6097
  * Constants
@@ -6061,15 +6114,9 @@ var gobjJs = (function(exports) {
6061
6114
  SDATA(data_type_t.DTP_STRING, "yuno_version", 0, "", "Yuno version (APP_VERSION)"),
6062
6115
  SDATA(data_type_t.DTP_STRING, "yuneta_version", 0, YUNETA_VERSION, "Yuneta version"),
6063
6116
  SDATA(data_type_t.DTP_LIST, "required_services", 0, "[]", "Required services"),
6064
- SDATA(data_type_t.DTP_INTEGER, "tracing", 0, 0, "Tracing level"),
6065
- SDATA(data_type_t.DTP_BOOLEAN, "trace_timer", 0, 0, "Trace timers"),
6066
- SDATA(data_type_t.DTP_BOOLEAN, "trace_inter_event", 0, 0, "Trace traffic"),
6067
- SDATA(data_type_t.DTP_POINTER, "trace_ievent_callback", 0, null, "Trace traffic callback"),
6068
- SDATA(data_type_t.DTP_BOOLEAN, "trace_creation", 0, 0, "Trace creation"),
6069
- SDATA(data_type_t.DTP_BOOLEAN, "trace_start_stop", 0, 0, "Trace start/stop"),
6070
- SDATA(data_type_t.DTP_BOOLEAN, "trace_subscriptions", 0, 0, "Trace subscription"),
6071
- SDATA(data_type_t.DTP_BOOLEAN, "trace_i18n", 0, 0, "Trace i18n"),
6072
- SDATA(data_type_t.DTP_BOOLEAN, "no_poll", 0, 0, "no poll"),
6117
+ SDATA(data_type_t.DTP_DICT, "trace_levels", sdata_flag_t.SDF_PERSIST, "{}", "Trace levels"),
6118
+ SDATA(data_type_t.DTP_DICT, "no_trace_levels", sdata_flag_t.SDF_PERSIST, "{}", "No trace levels"),
6119
+ 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"),
6073
6120
  SDATA(data_type_t.DTP_BOOLEAN, "developer", 0, false, "Developer mode enabled"),
6074
6121
  SDATA(data_type_t.DTP_INTEGER, "periodic_timeout", 0, "1000", "Timeout periodic, in miliseconds."),
6075
6122
  SDATA_END()
@@ -6088,6 +6135,8 @@ var gobjJs = (function(exports) {
6088
6135
  gobj_write_str_attr(gobj, "node_uuid", node_uuid());
6089
6136
  gobj.priv.gobj_timer = gobj_create_pure_child(gobj_name(gobj), "C_TIMER", {}, gobj);
6090
6137
  priv.periodic_timeout = gobj_read_attr(gobj, "periodic_timeout");
6138
+ set_user_gclass_traces(gobj);
6139
+ set_user_gclass_no_traces(gobj);
6091
6140
  }
6092
6141
  /***************************************************************
6093
6142
  * Framework Method: Writing
@@ -6132,8 +6181,135 @@ var gobjJs = (function(exports) {
6132
6181
  * Local Methods
6133
6182
  ***************************/
6134
6183
  /***************************************************************
6184
+ * Restore the trace levels the user persisted.
6135
6185
  *
6186
+ * A saved scope REPLACES what is in force: main() sets its defaults
6187
+ * (gobj_set_global_no_trace("timer_periodic"), a gclass it wants quiet)
6188
+ * before the yuno is created, and a default the user turned off must
6189
+ * stay off. A scope is saved whole, empty included (save_global_trace());
6190
+ * a scope never saved keeps main()'s. The C kernel's C_YUNO does the same.
6136
6191
  ***************************************************************/
6192
+ function set_user_gclass_traces(gobj) {
6193
+ let jn_trace_levels = gobj_read_attr(gobj, "trace_levels");
6194
+ if (!is_object(jn_trace_levels)) return 0;
6195
+ let jn_global = jn_trace_levels["__global_trace__"];
6196
+ if (is_array(jn_global)) {
6197
+ gobj_set_global_trace2(4294967295, false);
6198
+ for (let level of jn_global) gobj_set_global_trace(level, true);
6199
+ }
6200
+ for (const [name, jn_levels] of Object.entries(jn_trace_levels)) {
6201
+ let gclass = gclass_find_by_name(name);
6202
+ if (!gclass) continue;
6203
+ if (!is_array(jn_levels)) {
6204
+ log_error(`${gobj_name(gobj)}: trace_levels of ${name} MUST be a list`);
6205
+ continue;
6206
+ }
6207
+ gobj_set_gclass_trace(gclass, null, false);
6208
+ for (let level of jn_levels) gobj_set_gclass_trace(gclass, level, true);
6209
+ }
6210
+ return 0;
6211
+ }
6212
+ /***************************************************************
6213
+ * Restore the no-trace levels, see set_user_gclass_traces()
6214
+ ***************************************************************/
6215
+ function set_user_gclass_no_traces(gobj) {
6216
+ let jn_no_trace_levels = gobj_read_attr(gobj, "no_trace_levels");
6217
+ if (!is_object(jn_no_trace_levels)) return 0;
6218
+ let jn_global = jn_no_trace_levels["__global_no_trace__"];
6219
+ if (is_array(jn_global)) {
6220
+ gobj_set_global_no_trace2(4294967295, false);
6221
+ for (let level of jn_global) gobj_set_global_no_trace(level, true);
6222
+ }
6223
+ for (const [name, jn_levels] of Object.entries(jn_no_trace_levels)) {
6224
+ let gclass = gclass_find_by_name(name);
6225
+ if (!gclass) continue;
6226
+ if (!is_array(jn_levels)) {
6227
+ log_error(`${gobj_name(gobj)}: no_trace_levels of ${name} MUST be a list`);
6228
+ continue;
6229
+ }
6230
+ gobj_set_gclass_no_trace(gclass, null, false);
6231
+ for (let level of jn_levels) gobj_set_gclass_no_trace(gclass, level, true);
6232
+ }
6233
+ return 0;
6234
+ }
6235
+ /***************************************************************
6236
+ * Save a scope WHOLE, from the levels in force (see
6237
+ * set_user_gclass_traces()): a saved scope replaces main()'s, so it
6238
+ * has to carry everything that must be in force.
6239
+ ***************************************************************/
6240
+ function save_trace_scope(gobj, attr, scope, levels) {
6241
+ let jn_levels = gobj_read_attr(gobj, attr);
6242
+ if (!is_object(jn_levels)) jn_levels = {};
6243
+ jn_levels[scope] = levels;
6244
+ gobj_write_attr(gobj, attr, jn_levels);
6245
+ return gobj_save_persistent_attrs(gobj, attr);
6246
+ }
6247
+ /***************************************************************
6248
+ * "set" as the C command reads it: TRUE / set / 1, FALSE / reset / 0
6249
+ ***************************************************************/
6250
+ function parse_set(value) {
6251
+ if (value === true || value === false) return value;
6252
+ let v = String(value === void 0 || value === null ? "" : value).toLowerCase();
6253
+ if (v === "true" || v === "set") return true;
6254
+ if (v === "false" || v === "reset") return false;
6255
+ if (v === "" || isNaN(Number(v))) return null;
6256
+ return Number(v) ? true : false;
6257
+ }
6258
+ function yuno_prefix() {
6259
+ return `${gobj_yuno_role()}^${gobj_yuno_name()}`;
6260
+ }
6261
+ /***************************
6262
+ * Commands
6263
+ ***************************/
6264
+ /***************************************************************
6265
+ * The trace commands of the C kernel's C_YUNO, same names and same
6266
+ * parameters (`level`, `set`, `gclass_name` / `gclass`). Setting a
6267
+ * level saves its scope.
6268
+ ***************************************************************/
6269
+ function mt_command_parser(gobj, command, kw, src) {
6270
+ kw = kw || {};
6271
+ switch (command) {
6272
+ case "get-global-trace": return build_command_response(gobj, 0, null, null, gobj_get_global_trace_level());
6273
+ case "get-global-no-trace": return build_command_response(gobj, 0, null, null, gobj_get_global_trace_no_level());
6274
+ case "set-global-trace":
6275
+ case "set-global-no-trace": {
6276
+ let no = command === "set-global-no-trace";
6277
+ let level = kw.level;
6278
+ let set = parse_set(kw.set);
6279
+ if (!level) return build_command_response(gobj, -1, `${yuno_prefix()}: what level?`, null, null);
6280
+ if (set === null) return build_command_response(gobj, -1, `${yuno_prefix()}: bitmask set or re-set?`, null, null);
6281
+ 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);
6282
+ if (no) {
6283
+ save_trace_scope(gobj, "no_trace_levels", "__global_no_trace__", gobj_get_global_trace_no_level());
6284
+ return build_command_response(gobj, 0, null, null, gobj_get_global_trace_no_level());
6285
+ }
6286
+ save_trace_scope(gobj, "trace_levels", "__global_trace__", gobj_get_global_trace_level());
6287
+ return build_command_response(gobj, 0, null, null, gobj_get_global_trace_level());
6288
+ }
6289
+ case "get-gclass-trace":
6290
+ case "get-gclass-no-trace":
6291
+ case "set-gclass-trace":
6292
+ case "set-gclass-no-trace": {
6293
+ let no = command.indexOf("no-trace") >= 0;
6294
+ let gclass_name = kw.gclass_name || kw.gclass || "";
6295
+ let gclass = gclass_find_by_name(gclass_name);
6296
+ if (!gclass) return build_command_response(gobj, -1, `${yuno_prefix()}: what gclass is '${gclass_name}'?`, null, null);
6297
+ 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));
6298
+ let level = kw.level;
6299
+ let set = parse_set(kw.set);
6300
+ if (!level) return build_command_response(gobj, -1, `${yuno_prefix()}: what level?`, null, null);
6301
+ if (set === null) return build_command_response(gobj, -1, `${yuno_prefix()}: bitmask set or re-set?`, null, null);
6302
+ 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);
6303
+ if (no) {
6304
+ save_trace_scope(gobj, "no_trace_levels", gclass_name, gobj_get_gclass_trace_no_level(gclass));
6305
+ return build_command_response(gobj, 0, null, null, gobj_get_gclass_trace_no_level(gclass));
6306
+ }
6307
+ save_trace_scope(gobj, "trace_levels", gclass_name, gobj_get_gclass_trace_level2(gclass));
6308
+ return build_command_response(gobj, 0, null, null, gobj_get_gclass_trace_level(gclass));
6309
+ }
6310
+ default: return build_command_response(gobj, -1, `${yuno_prefix()}: command not available: ${command}`, null, null);
6311
+ }
6312
+ }
6137
6313
  /***************************
6138
6314
  * Actions
6139
6315
  ***************************/
@@ -6154,7 +6330,8 @@ var gobjJs = (function(exports) {
6154
6330
  mt_stop: mt_stop$1,
6155
6331
  mt_destroy: mt_destroy$1,
6156
6332
  mt_play,
6157
- mt_pause
6333
+ mt_pause,
6334
+ mt_command_parser
6158
6335
  };
6159
6336
  /***************************************************************
6160
6337
  * Create the GClass
@@ -6190,7 +6367,7 @@ var gobjJs = (function(exports) {
6190
6367
  *
6191
6368
  * Licence: MIT (http://www.opensource.org/licenses/mit-license)
6192
6369
  * Copyright (c) 2014,2024 Niyamaka.
6193
- * Copyright (c) 2025, ArtGins.
6370
+ * Copyright (c) 2025-2026, ArtGins.
6194
6371
  **************************************************************************/
6195
6372
  /***************************************************************
6196
6373
  * Constants
@@ -6220,6 +6397,14 @@ var gobjJs = (function(exports) {
6220
6397
  SDATA(data_type_t.DTP_POINTER, "subscriber", 0, 0, "subscriber of output-events. If null then subscriber is the parent"),
6221
6398
  SDATA_END()
6222
6399
  ];
6400
+ var s_user_trace_level = [
6401
+ ["ievents", "Trace inter-events with metadata of kw"],
6402
+ ["ievents2", "Trace inter-events with full kw"],
6403
+ ["identity-card", "Trace identity_card messages"]
6404
+ ];
6405
+ function is_traffic_tracing(gobj) {
6406
+ return gobj_trace_level(gobj) & 3 ? true : false;
6407
+ }
6223
6408
  var PRIVATE_DATA = {
6224
6409
  url: null,
6225
6410
  remote_yuno_name: null,
@@ -6482,7 +6667,7 @@ var gobjJs = (function(exports) {
6482
6667
  function send_iev(gobj, iev) {
6483
6668
  let priv = gobj.priv;
6484
6669
  let msg = JSON.stringify(iev);
6485
- if (gobj_read_bool_attr(gobj_yuno(), "trace_inter_event")) {
6670
+ if (is_traffic_tracing(gobj)) {
6486
6671
  let url = gobj_read_str_attr(gobj, "url");
6487
6672
  let prefix = gobj_name(gobj_yuno()) + " ==> " + url;
6488
6673
  let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
@@ -6776,7 +6961,7 @@ var gobjJs = (function(exports) {
6776
6961
  function ac_on_message(gobj, event, kw, src) {
6777
6962
  let url = gobj.priv.url;
6778
6963
  let iev_msg = iev_create_from_json(gobj, kw.data);
6779
- if (gobj_read_bool_attr(gobj_yuno(), "trace_inter_event")) {
6964
+ if (is_traffic_tracing(gobj)) {
6780
6965
  let prefix = gobj_name(gobj_yuno()) + " <== " + url;
6781
6966
  let size = kw.data.length;
6782
6967
  let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
@@ -6949,7 +7134,7 @@ var gobjJs = (function(exports) {
6949
7134
  ["EV_ON_OPEN_ERROR", event_flag_t.EVF_OUTPUT_EVENT | event_flag_t.EVF_NO_WARN_SUBS],
6950
7135
  ["EV_TIMEOUT", 0],
6951
7136
  [null, 0]
6952
- ], states, gmt, 0, attrs_table, PRIVATE_DATA, 0, 0, 0, gclass_flag_t.gcflag_no_check_output_events);
7137
+ ], states, gmt, 0, attrs_table, PRIVATE_DATA, 0, 0, s_user_trace_level, gclass_flag_t.gcflag_no_check_output_events);
6953
7138
  if (!__gclass__) return -1;
6954
7139
  return 0;
6955
7140
  }
@@ -7041,7 +7226,13 @@ var gobjJs = (function(exports) {
7041
7226
  exports.gobj_flag_t = gobj_flag_t;
7042
7227
  exports.gobj_full_name = gobj_full_name;
7043
7228
  exports.gobj_gclass_name = gobj_gclass_name;
7229
+ exports.gobj_get_gclass_trace_level = gobj_get_gclass_trace_level;
7230
+ exports.gobj_get_gclass_trace_level2 = gobj_get_gclass_trace_level2;
7231
+ exports.gobj_get_gclass_trace_no_level = gobj_get_gclass_trace_no_level;
7232
+ exports.gobj_get_global_trace_level = gobj_get_global_trace_level;
7233
+ exports.gobj_get_global_trace_no_level = gobj_get_global_trace_no_level;
7044
7234
  exports.gobj_global_trace_level = gobj_global_trace_level;
7235
+ exports.gobj_global_trace_no_level = gobj_global_trace_no_level;
7045
7236
  exports.gobj_has_attr = gobj_has_attr;
7046
7237
  exports.gobj_has_event = gobj_has_event;
7047
7238
  exports.gobj_has_output_event = gobj_has_output_event;
@@ -7083,7 +7274,9 @@ var gobjJs = (function(exports) {
7083
7274
  exports.gobj_set_gclass_no_trace = gobj_set_gclass_no_trace;
7084
7275
  exports.gobj_set_gclass_trace = gobj_set_gclass_trace;
7085
7276
  exports.gobj_set_global_no_trace = gobj_set_global_no_trace;
7277
+ exports.gobj_set_global_no_trace2 = gobj_set_global_no_trace2;
7086
7278
  exports.gobj_set_global_trace = gobj_set_global_trace;
7279
+ exports.gobj_set_global_trace2 = gobj_set_global_trace2;
7087
7280
  exports.gobj_set_gobj_no_trace = gobj_set_gobj_no_trace;
7088
7281
  exports.gobj_set_gobj_trace = gobj_set_gobj_trace;
7089
7282
  exports.gobj_set_trace_machine_format = gobj_set_trace_machine_format;