@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.
- package/README.md +21 -3
- package/dist/gobj-js.cjs.js +302 -57
- package/dist/gobj-js.cjs.js.map +1 -1
- package/dist/gobj-js.cjs.min.js +1269 -1154
- package/dist/gobj-js.cjs.min.js.map +1 -1
- package/dist/gobj-js.es.js +294 -58
- package/dist/gobj-js.es.js.map +1 -1
- package/dist/gobj-js.es.min.js +1231 -1120
- package/dist/gobj-js.es.min.js.map +1 -1
- package/dist/gobj-js.iife.js +302 -57
- package/dist/gobj-js.iife.js.map +1 -1
- package/dist/gobj-js.iife.min.js +1658 -1543
- package/dist/gobj-js.iife.min.js.map +1 -1
- package/dist/gobj-js.umd.js +302 -57
- package/dist/gobj-js.umd.js.map +1 -1
- package/dist/gobj-js.umd.min.js +1656 -1541
- package/dist/gobj-js.umd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/gobj-js.iife.js
CHANGED
|
@@ -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
|
|
519
|
-
|
|
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
|
|
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
|
|
572
|
+
return gobj_trace_level(gobj) & trace_level_t.TRACE_START_STOP;
|
|
571
573
|
}
|
|
572
574
|
function __trace_gobj_ev_kw__(gobj) {
|
|
573
|
-
return
|
|
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)
|
|
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 (
|
|
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 (
|
|
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 =
|
|
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
|
-
|
|
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 (
|
|
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) {
|
|
@@ -4022,10 +4074,18 @@ var gobjJs = (function(exports) {
|
|
|
4022
4074
|
- list of strings [s,...]
|
|
4023
4075
|
- list of dicts [{},...]
|
|
4024
4076
|
- dict of dicts {id:{},...}
|
|
4025
|
-
return a
|
|
4026
|
-
|
|
4027
|
-
|
|
4028
|
-
|
|
4077
|
+
return a NEW list holding the rows that match `ids` and the
|
|
4078
|
+
`jn_filter` (where). If match_fn is 0 then kw_match_simple is used.
|
|
4079
|
+
|
|
4080
|
+
WARNING the LIST is new; its elements are THE SAME objects, not
|
|
4081
|
+
copies. The C twin increfs each one and says "clone", which this
|
|
4082
|
+
comment repeated for years: javascript has no refcount, so a write
|
|
4083
|
+
through a collected row writes into `kw`. Copy what you mean to
|
|
4084
|
+
modify.
|
|
4085
|
+
|
|
4086
|
+
Returns null -- not an empty list -- for a `kw` that is neither a
|
|
4087
|
+
list nor a dict, so a caller that reads `.length` off the answer
|
|
4088
|
+
must check it first (kwid_find_one_record does).
|
|
4029
4089
|
*************************************************************/
|
|
4030
4090
|
function kwid_collect(gobj, kw, ids, jn_filter, match_fn) {
|
|
4031
4091
|
if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
|
|
@@ -4054,12 +4114,17 @@ var gobjJs = (function(exports) {
|
|
|
4054
4114
|
}
|
|
4055
4115
|
/*************************************************************
|
|
4056
4116
|
Utility for databases.
|
|
4057
|
-
Return a
|
|
4058
|
-
WARNING the "id" of a dict's record is
|
|
4117
|
+
Return a dict from a "dict of records" or "list of records".
|
|
4118
|
+
WARNING the "id" of a dict's record is hardcoded to its key.
|
|
4059
4119
|
Convention:
|
|
4060
|
-
- all arrays are
|
|
4120
|
+
- all arrays are lists of records (dicts) with "id" as primary key
|
|
4061
4121
|
- delimiter is '`' and '.'
|
|
4062
4122
|
If path is empty then use kw
|
|
4123
|
+
|
|
4124
|
+
WARNING "new" is the C twin's word, where it means a new REFERENCE:
|
|
4125
|
+
handed a dict, both return THAT dict and not a copy of it. Only the
|
|
4126
|
+
list case builds something new, and even then the records inside it
|
|
4127
|
+
are the same objects.
|
|
4063
4128
|
*************************************************************/
|
|
4064
4129
|
function kwid_new_dict(gobj, kw, path) {
|
|
4065
4130
|
if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
|
|
@@ -4068,20 +4133,59 @@ var gobjJs = (function(exports) {
|
|
|
4068
4133
|
if (is_object(kw)) new_dict = kw;
|
|
4069
4134
|
else if (is_array(kw)) for (let i = 0; i < kw.length; i++) {
|
|
4070
4135
|
let kv = kw[i];
|
|
4071
|
-
let id = kw_get_str(gobj, kv, "id", "",
|
|
4136
|
+
let id = kw_get_str(gobj, kv, "id", "", kw_flag_t.KW_REQUIRED);
|
|
4072
4137
|
if (!empty_string(id)) new_dict[id] = kv;
|
|
4073
4138
|
}
|
|
4074
4139
|
else log_error(`${gobj_short_name(gobj)} kwid_new_dict: data type unknown`);
|
|
4075
4140
|
return new_dict;
|
|
4076
4141
|
}
|
|
4077
4142
|
/*************************************************************
|
|
4143
|
+
Utility for databases.
|
|
4144
|
+
Return a list from a "dict of records" or "list of records".
|
|
4145
|
+
The NORMALIZING function of this family: whatever shape the data
|
|
4146
|
+
arrives in, what comes back is the shape a table indexed and
|
|
4147
|
+
sorted by `id` wants.
|
|
4148
|
+
Convention:
|
|
4149
|
+
- all arrays are lists of records (dicts) with "id" as primary key
|
|
4150
|
+
- delimiter is '`' and '.'
|
|
4151
|
+
If path is empty then use kw
|
|
4152
|
+
|
|
4153
|
+
WARNING handed a DICT it writes each record's key into the record
|
|
4154
|
+
as its `id`, OVERWRITING one that differs -- in the source records,
|
|
4155
|
+
which it does not copy. That is the C twin's behaviour
|
|
4156
|
+
(`json_object_set_new(v, "id", ...)` in kwid.c) and it is the point:
|
|
4157
|
+
a dict keyed by id whose records disagree with their own key is
|
|
4158
|
+
exactly what this is for. Handed a LIST it returns that same list,
|
|
4159
|
+
untouched, as C returns a new reference to it.
|
|
4160
|
+
*************************************************************/
|
|
4161
|
+
function kwid_new_list(gobj, kw, path) {
|
|
4162
|
+
if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
|
|
4163
|
+
if (!empty_string(path)) kw = kw_find_path(gobj, kw, path);
|
|
4164
|
+
if (is_array(kw)) return kw;
|
|
4165
|
+
if (is_object(kw)) {
|
|
4166
|
+
let new_list = [];
|
|
4167
|
+
for (let id of Object.keys(kw)) {
|
|
4168
|
+
let record = kw[id];
|
|
4169
|
+
if (!is_object(record)) {
|
|
4170
|
+
log_error(`${gobj_short_name(gobj)} kwid_new_list: not a record: '${id}'`);
|
|
4171
|
+
continue;
|
|
4172
|
+
}
|
|
4173
|
+
record["id"] = id;
|
|
4174
|
+
new_list.push(record);
|
|
4175
|
+
}
|
|
4176
|
+
return new_list;
|
|
4177
|
+
}
|
|
4178
|
+
log_error(`${gobj_short_name(gobj)} kwid_new_list: wrong type for list`);
|
|
4179
|
+
return [];
|
|
4180
|
+
}
|
|
4181
|
+
/*************************************************************
|
|
4078
4182
|
* Utility for databases. See kwid_collect parameters
|
|
4079
4183
|
*************************************************************/
|
|
4080
4184
|
function kwid_find_one_record(gobj, kw, ids, jn_filter, match_fn) {
|
|
4081
4185
|
if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
|
|
4082
4186
|
let list = kwid_collect(gobj, kw, ids, jn_filter, match_fn);
|
|
4083
|
-
if (list.length
|
|
4084
|
-
|
|
4187
|
+
if (!list || list.length === 0) return null;
|
|
4188
|
+
return list[0];
|
|
4085
4189
|
}
|
|
4086
4190
|
/*************************************************************
|
|
4087
4191
|
Utility for databases.
|
|
@@ -5986,7 +6090,7 @@ var gobjJs = (function(exports) {
|
|
|
5986
6090
|
*
|
|
5987
6091
|
* The default yuno in js
|
|
5988
6092
|
*
|
|
5989
|
-
* Copyright (c) 2025, ArtGins.
|
|
6093
|
+
* Copyright (c) 2025-2026, ArtGins.
|
|
5990
6094
|
* All Rights Reserved. ****************************************************************************/
|
|
5991
6095
|
/***************************************************************
|
|
5992
6096
|
* Constants
|
|
@@ -6009,15 +6113,9 @@ var gobjJs = (function(exports) {
|
|
|
6009
6113
|
SDATA(data_type_t.DTP_STRING, "yuno_version", 0, "", "Yuno version (APP_VERSION)"),
|
|
6010
6114
|
SDATA(data_type_t.DTP_STRING, "yuneta_version", 0, YUNETA_VERSION, "Yuneta version"),
|
|
6011
6115
|
SDATA(data_type_t.DTP_LIST, "required_services", 0, "[]", "Required services"),
|
|
6012
|
-
SDATA(data_type_t.
|
|
6013
|
-
SDATA(data_type_t.
|
|
6014
|
-
SDATA(data_type_t.
|
|
6015
|
-
SDATA(data_type_t.DTP_POINTER, "trace_ievent_callback", 0, null, "Trace traffic callback"),
|
|
6016
|
-
SDATA(data_type_t.DTP_BOOLEAN, "trace_creation", 0, 0, "Trace creation"),
|
|
6017
|
-
SDATA(data_type_t.DTP_BOOLEAN, "trace_start_stop", 0, 0, "Trace start/stop"),
|
|
6018
|
-
SDATA(data_type_t.DTP_BOOLEAN, "trace_subscriptions", 0, 0, "Trace subscription"),
|
|
6019
|
-
SDATA(data_type_t.DTP_BOOLEAN, "trace_i18n", 0, 0, "Trace i18n"),
|
|
6020
|
-
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"),
|
|
6021
6119
|
SDATA(data_type_t.DTP_BOOLEAN, "developer", 0, false, "Developer mode enabled"),
|
|
6022
6120
|
SDATA(data_type_t.DTP_INTEGER, "periodic_timeout", 0, "1000", "Timeout periodic, in miliseconds."),
|
|
6023
6121
|
SDATA_END()
|
|
@@ -6036,6 +6134,8 @@ var gobjJs = (function(exports) {
|
|
|
6036
6134
|
gobj_write_str_attr(gobj, "node_uuid", node_uuid());
|
|
6037
6135
|
gobj.priv.gobj_timer = gobj_create_pure_child(gobj_name(gobj), "C_TIMER", {}, gobj);
|
|
6038
6136
|
priv.periodic_timeout = gobj_read_attr(gobj, "periodic_timeout");
|
|
6137
|
+
set_user_gclass_traces(gobj);
|
|
6138
|
+
set_user_gclass_no_traces(gobj);
|
|
6039
6139
|
}
|
|
6040
6140
|
/***************************************************************
|
|
6041
6141
|
* Framework Method: Writing
|
|
@@ -6080,8 +6180,135 @@ var gobjJs = (function(exports) {
|
|
|
6080
6180
|
* Local Methods
|
|
6081
6181
|
***************************/
|
|
6082
6182
|
/***************************************************************
|
|
6183
|
+
* Restore the trace levels the user persisted.
|
|
6083
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.
|
|
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
|
|
6084
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
|
+
}
|
|
6085
6312
|
/***************************
|
|
6086
6313
|
* Actions
|
|
6087
6314
|
***************************/
|
|
@@ -6102,7 +6329,8 @@ var gobjJs = (function(exports) {
|
|
|
6102
6329
|
mt_stop: mt_stop$1,
|
|
6103
6330
|
mt_destroy: mt_destroy$1,
|
|
6104
6331
|
mt_play,
|
|
6105
|
-
mt_pause
|
|
6332
|
+
mt_pause,
|
|
6333
|
+
mt_command_parser
|
|
6106
6334
|
};
|
|
6107
6335
|
/***************************************************************
|
|
6108
6336
|
* Create the GClass
|
|
@@ -6138,7 +6366,7 @@ var gobjJs = (function(exports) {
|
|
|
6138
6366
|
*
|
|
6139
6367
|
* Licence: MIT (http://www.opensource.org/licenses/mit-license)
|
|
6140
6368
|
* Copyright (c) 2014,2024 Niyamaka.
|
|
6141
|
-
* Copyright (c) 2025, ArtGins.
|
|
6369
|
+
* Copyright (c) 2025-2026, ArtGins.
|
|
6142
6370
|
**************************************************************************/
|
|
6143
6371
|
/***************************************************************
|
|
6144
6372
|
* Constants
|
|
@@ -6168,6 +6396,14 @@ var gobjJs = (function(exports) {
|
|
|
6168
6396
|
SDATA(data_type_t.DTP_POINTER, "subscriber", 0, 0, "subscriber of output-events. If null then subscriber is the parent"),
|
|
6169
6397
|
SDATA_END()
|
|
6170
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
|
+
}
|
|
6171
6407
|
var PRIVATE_DATA = {
|
|
6172
6408
|
url: null,
|
|
6173
6409
|
remote_yuno_name: null,
|
|
@@ -6430,7 +6666,7 @@ var gobjJs = (function(exports) {
|
|
|
6430
6666
|
function send_iev(gobj, iev) {
|
|
6431
6667
|
let priv = gobj.priv;
|
|
6432
6668
|
let msg = JSON.stringify(iev);
|
|
6433
|
-
if (
|
|
6669
|
+
if (is_traffic_tracing(gobj)) {
|
|
6434
6670
|
let url = gobj_read_str_attr(gobj, "url");
|
|
6435
6671
|
let prefix = gobj_name(gobj_yuno()) + " ==> " + url;
|
|
6436
6672
|
let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
|
|
@@ -6724,7 +6960,7 @@ var gobjJs = (function(exports) {
|
|
|
6724
6960
|
function ac_on_message(gobj, event, kw, src) {
|
|
6725
6961
|
let url = gobj.priv.url;
|
|
6726
6962
|
let iev_msg = iev_create_from_json(gobj, kw.data);
|
|
6727
|
-
if (
|
|
6963
|
+
if (is_traffic_tracing(gobj)) {
|
|
6728
6964
|
let prefix = gobj_name(gobj_yuno()) + " <== " + url;
|
|
6729
6965
|
let size = kw.data.length;
|
|
6730
6966
|
let trace_ievent_callback = gobj_read_attr(gobj_yuno(), "trace_ievent_callback");
|
|
@@ -6897,7 +7133,7 @@ var gobjJs = (function(exports) {
|
|
|
6897
7133
|
["EV_ON_OPEN_ERROR", event_flag_t.EVF_OUTPUT_EVENT | event_flag_t.EVF_NO_WARN_SUBS],
|
|
6898
7134
|
["EV_TIMEOUT", 0],
|
|
6899
7135
|
[null, 0]
|
|
6900
|
-
], 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);
|
|
6901
7137
|
if (!__gclass__) return -1;
|
|
6902
7138
|
return 0;
|
|
6903
7139
|
}
|
|
@@ -6989,7 +7225,13 @@ var gobjJs = (function(exports) {
|
|
|
6989
7225
|
exports.gobj_flag_t = gobj_flag_t;
|
|
6990
7226
|
exports.gobj_full_name = gobj_full_name;
|
|
6991
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;
|
|
6992
7233
|
exports.gobj_global_trace_level = gobj_global_trace_level;
|
|
7234
|
+
exports.gobj_global_trace_no_level = gobj_global_trace_no_level;
|
|
6993
7235
|
exports.gobj_has_attr = gobj_has_attr;
|
|
6994
7236
|
exports.gobj_has_event = gobj_has_event;
|
|
6995
7237
|
exports.gobj_has_output_event = gobj_has_output_event;
|
|
@@ -7031,7 +7273,9 @@ var gobjJs = (function(exports) {
|
|
|
7031
7273
|
exports.gobj_set_gclass_no_trace = gobj_set_gclass_no_trace;
|
|
7032
7274
|
exports.gobj_set_gclass_trace = gobj_set_gclass_trace;
|
|
7033
7275
|
exports.gobj_set_global_no_trace = gobj_set_global_no_trace;
|
|
7276
|
+
exports.gobj_set_global_no_trace2 = gobj_set_global_no_trace2;
|
|
7034
7277
|
exports.gobj_set_global_trace = gobj_set_global_trace;
|
|
7278
|
+
exports.gobj_set_global_trace2 = gobj_set_global_trace2;
|
|
7035
7279
|
exports.gobj_set_gobj_no_trace = gobj_set_gobj_no_trace;
|
|
7036
7280
|
exports.gobj_set_gobj_trace = gobj_set_gobj_trace;
|
|
7037
7281
|
exports.gobj_set_trace_machine_format = gobj_set_trace_machine_format;
|
|
@@ -7129,6 +7373,7 @@ var gobjJs = (function(exports) {
|
|
|
7129
7373
|
exports.kwid_get_ids = kwid_get_ids;
|
|
7130
7374
|
exports.kwid_match_id = kwid_match_id;
|
|
7131
7375
|
exports.kwid_new_dict = kwid_new_dict;
|
|
7376
|
+
exports.kwid_new_list = kwid_new_list;
|
|
7132
7377
|
exports.list2options = list2options;
|
|
7133
7378
|
exports.load_json_file = load_json_file;
|
|
7134
7379
|
exports.log_debug = log_debug;
|