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