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