@yuneta/gobj-js 7.9.11 → 7.12.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/dist/gobj-js.cjs.js +231 -141
- package/dist/gobj-js.cjs.js.map +1 -1
- package/dist/gobj-js.cjs.min.js +999 -975
- package/dist/gobj-js.cjs.min.js.map +1 -1
- package/dist/gobj-js.es.js +230 -142
- package/dist/gobj-js.es.js.map +1 -1
- package/dist/gobj-js.es.min.js +1045 -1020
- package/dist/gobj-js.es.min.js.map +1 -1
- package/dist/gobj-js.iife.js +231 -141
- package/dist/gobj-js.iife.js.map +1 -1
- package/dist/gobj-js.iife.min.js +997 -973
- package/dist/gobj-js.iife.min.js.map +1 -1
- package/dist/gobj-js.umd.js +231 -141
- package/dist/gobj-js.umd.js.map +1 -1
- package/dist/gobj-js.umd.min.js +996 -972
- package/dist/gobj-js.umd.min.js.map +1 -1
- package/package.json +4 -4
package/dist/gobj-js.cjs.js
CHANGED
|
@@ -87,9 +87,7 @@ function sprintf_format(parse_tree, argv) {
|
|
|
87
87
|
case "x":
|
|
88
88
|
arg = (parseInt(arg, 10) >>> 0).toString(16);
|
|
89
89
|
break;
|
|
90
|
-
case "X":
|
|
91
|
-
arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase();
|
|
92
|
-
break;
|
|
90
|
+
case "X": arg = (parseInt(arg, 10) >>> 0).toString(16).toUpperCase();
|
|
93
91
|
}
|
|
94
92
|
if (re.json.test(ph.type)) output += arg;
|
|
95
93
|
else {
|
|
@@ -777,9 +775,7 @@ function set_default(gobj, sdata, it) {
|
|
|
777
775
|
}
|
|
778
776
|
else jn_value = svalue;
|
|
779
777
|
break;
|
|
780
|
-
case data_type_t.DTP_POINTER:
|
|
781
|
-
jn_value = svalue;
|
|
782
|
-
break;
|
|
778
|
+
case data_type_t.DTP_POINTER: jn_value = svalue;
|
|
783
779
|
}
|
|
784
780
|
if (jn_value === void 0) {
|
|
785
781
|
log_error(`default_value WRONG, it: ${it.name}, value: ${it.default_value}`);
|
|
@@ -849,9 +845,7 @@ function json2item(gobj, sdata, it, jn_value_) {
|
|
|
849
845
|
return -1;
|
|
850
846
|
}
|
|
851
847
|
break;
|
|
852
|
-
case data_type_t.DTP_POINTER:
|
|
853
|
-
jn_value2 = jn_value_;
|
|
854
|
-
break;
|
|
848
|
+
case data_type_t.DTP_POINTER: jn_value2 = jn_value_;
|
|
855
849
|
}
|
|
856
850
|
if (jn_value2 === void 0) log_error(`${gobj_short_name(gobj)}: attr undefined: ${it.name}`);
|
|
857
851
|
sdata[it.name] = jn_value2;
|
|
@@ -1130,6 +1124,7 @@ function gclass_find_by_name(gclass_name, verbose) {
|
|
|
1130
1124
|
} catch (e) {}
|
|
1131
1125
|
if (!gclass) {
|
|
1132
1126
|
if (verbose) log_error(`gclass not found: ${gclass_name}`);
|
|
1127
|
+
return null;
|
|
1133
1128
|
}
|
|
1134
1129
|
return gclass;
|
|
1135
1130
|
}
|
|
@@ -1154,8 +1149,8 @@ function gobj_default_service() {
|
|
|
1154
1149
|
function gobj_find_service(service_name, verbose) {
|
|
1155
1150
|
service_name = service_name.toLowerCase();
|
|
1156
1151
|
let service_gobj = __jn_services__[service_name];
|
|
1157
|
-
if (!service_gobj
|
|
1158
|
-
log_error(`gobj service not found: ${service_name}`);
|
|
1152
|
+
if (!service_gobj) {
|
|
1153
|
+
if (verbose) log_error(`gobj service not found: ${service_name}`);
|
|
1159
1154
|
return null;
|
|
1160
1155
|
}
|
|
1161
1156
|
return service_gobj;
|
|
@@ -1415,6 +1410,7 @@ function gobj_destroy(gobj) {
|
|
|
1415
1410
|
gobj_stop(gobj);
|
|
1416
1411
|
}
|
|
1417
1412
|
gobj.obflag |= obflag_t.obflag_destroying;
|
|
1413
|
+
purge_posted_events(gobj);
|
|
1418
1414
|
let trace_creation = __trace_gobj_create_delete__(gobj);
|
|
1419
1415
|
if (trace_creation) trace_machine(sprintf("💔💔⏩ destroying: %s", gobj_full_name(gobj)));
|
|
1420
1416
|
let parent = gobj_parent(gobj);
|
|
@@ -1570,12 +1566,14 @@ function gobj_play(gobj) {
|
|
|
1570
1566
|
log_error(`${gobj_short_name(gobj)}: GObj DISABLED`);
|
|
1571
1567
|
return -1;
|
|
1572
1568
|
}
|
|
1573
|
-
if (!gobj_is_running(gobj))
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1569
|
+
if (!gobj_is_running(gobj)) {
|
|
1570
|
+
if (!(gobj.gclass.gclass_flag & gclass_flag_t.gcflag_required_start_to_play)) {
|
|
1571
|
+
log_warning(`${gobj_short_name(gobj)}: GObj playing without previous start`);
|
|
1572
|
+
gobj_start(gobj);
|
|
1573
|
+
} else {
|
|
1574
|
+
log_error(`${gobj_short_name(gobj)}: Cannot play, start not done`);
|
|
1575
|
+
return -1;
|
|
1576
|
+
}
|
|
1579
1577
|
}
|
|
1580
1578
|
if (__trace_gobj_start_stop__(gobj)) trace_machine(sprintf("⏯ ⏯ play: %s", gobj_full_name(gobj)));
|
|
1581
1579
|
gobj.playing = true;
|
|
@@ -2354,13 +2352,97 @@ function gobj_has_output_event(gobj, event, event_flag) {
|
|
|
2354
2352
|
return true;
|
|
2355
2353
|
}
|
|
2356
2354
|
/************************************************************
|
|
2357
|
-
*
|
|
2355
|
+
* Posted events: gobj_send_event(), but on the next turn
|
|
2356
|
+
*
|
|
2357
|
+
* Same contract as the C side (see gobj.h). It exists to get out of the
|
|
2358
|
+
* stack you are standing on: gobj_publish_event() dispatches synchronously,
|
|
2359
|
+
* so a subscriber action runs inside the publisher's own stack, and
|
|
2360
|
+
* destroying that publisher there dismantles what is still iterating.
|
|
2361
|
+
*
|
|
2362
|
+
* The queue is drained with setTimeout(0) and NOT with queueMicrotask():
|
|
2363
|
+
* a microtask runs before the browser can paint or handle an input, so a
|
|
2364
|
+
* chain of posted events would hold the page exactly the way it used to
|
|
2365
|
+
* hold the event loop in C. A macrotask gives the browser its turn between
|
|
2366
|
+
* one event and the next.
|
|
2367
|
+
*
|
|
2368
|
+
* Delivery is a SNAPSHOT: the events queued when the drain begins are the
|
|
2369
|
+
* ones delivered in it, and whatever an action posts while it runs waits
|
|
2370
|
+
* for the following turn.
|
|
2358
2371
|
************************************************************/
|
|
2359
|
-
|
|
2360
|
-
|
|
2361
|
-
|
|
2362
|
-
|
|
2363
|
-
|
|
2372
|
+
var MAX_POSTED_EVENTS = 1e4;
|
|
2373
|
+
var __dl_posted_events__ = [];
|
|
2374
|
+
var __posted_events_scheduled__ = false;
|
|
2375
|
+
function gobj_post_event(dst, event, kw, src) {
|
|
2376
|
+
if (!dst || !(dst instanceof GObj)) {
|
|
2377
|
+
log_error(`gobj_post_event(): gobj dst NULL, event ${event}`);
|
|
2378
|
+
return -1;
|
|
2379
|
+
}
|
|
2380
|
+
if (dst.obflag & (obflag_t.obflag_destroyed | obflag_t.obflag_destroying)) {
|
|
2381
|
+
log_error(`gobj_post_event(): gobj dst DESTROYING, event ${event}`);
|
|
2382
|
+
return -1;
|
|
2383
|
+
}
|
|
2384
|
+
if (empty_string(event)) {
|
|
2385
|
+
log_error(`gobj_post_event(): event EMPTY`);
|
|
2386
|
+
return -1;
|
|
2387
|
+
}
|
|
2388
|
+
if (!gobj_has_event(dst, event, 0)) {
|
|
2389
|
+
log_error(`gobj_post_event(): event NOT DEFINED in gclass ${gobj_gclass_name(dst)}, event ${event}`);
|
|
2390
|
+
return -1;
|
|
2391
|
+
}
|
|
2392
|
+
if (__dl_posted_events__.length >= MAX_POSTED_EVENTS) {
|
|
2393
|
+
log_error(`gobj_post_event(): too many posted events, this is NOT a work queue, event ${event}, pending ${__dl_posted_events__.length}`);
|
|
2394
|
+
return -1;
|
|
2395
|
+
}
|
|
2396
|
+
__dl_posted_events__.push({
|
|
2397
|
+
dst,
|
|
2398
|
+
event,
|
|
2399
|
+
kw,
|
|
2400
|
+
src
|
|
2401
|
+
});
|
|
2402
|
+
if (is_machine_tracing(dst, event) && !is_machine_not_tracing(src, event)) trace_machine(sprintf("📬 posted(%s%s), ev: %s, pending: %d", !dst.running ? "!!" : "", gobj_short_name(dst), event, __dl_posted_events__.length));
|
|
2403
|
+
if (!__posted_events_scheduled__) {
|
|
2404
|
+
__posted_events_scheduled__ = true;
|
|
2405
|
+
setTimeout(gobj_deliver_posted_events, 0);
|
|
2406
|
+
}
|
|
2407
|
+
return 0;
|
|
2408
|
+
}
|
|
2409
|
+
/************************************************************
|
|
2410
|
+
* How many posted events wait for delivery
|
|
2411
|
+
************************************************************/
|
|
2412
|
+
function gobj_posted_events_size() {
|
|
2413
|
+
return __dl_posted_events__.length;
|
|
2414
|
+
}
|
|
2415
|
+
/************************************************************
|
|
2416
|
+
* Deliver the posted events. One turn, one snapshot.
|
|
2417
|
+
************************************************************/
|
|
2418
|
+
function gobj_deliver_posted_events() {
|
|
2419
|
+
__posted_events_scheduled__ = false;
|
|
2420
|
+
let snapshot = __dl_posted_events__;
|
|
2421
|
+
__dl_posted_events__ = [];
|
|
2422
|
+
let delivered = 0;
|
|
2423
|
+
for (let msg of snapshot) {
|
|
2424
|
+
if (msg.dst.obflag & (obflag_t.obflag_destroyed | obflag_t.obflag_destroying)) continue;
|
|
2425
|
+
gobj_send_event(msg.dst, msg.event, msg.kw, msg.src);
|
|
2426
|
+
delivered++;
|
|
2427
|
+
}
|
|
2428
|
+
if (__dl_posted_events__.length > 0 && !__posted_events_scheduled__) {
|
|
2429
|
+
__posted_events_scheduled__ = true;
|
|
2430
|
+
setTimeout(gobj_deliver_posted_events, 0);
|
|
2431
|
+
}
|
|
2432
|
+
return delivered;
|
|
2433
|
+
}
|
|
2434
|
+
/************************************************************
|
|
2435
|
+
* Take a gobj out of the queue of posted events.
|
|
2436
|
+
*
|
|
2437
|
+
* Called from gobj_destroy(), and the two halves are not the same thing:
|
|
2438
|
+
* as DESTINATION the entry is dropped, as SOURCE only the pointer is
|
|
2439
|
+
* cleared -- the destination still wants its event, and it arrives with
|
|
2440
|
+
* src null, which every action already has to accept.
|
|
2441
|
+
************************************************************/
|
|
2442
|
+
function purge_posted_events(gobj) {
|
|
2443
|
+
if (__dl_posted_events__.length === 0) return;
|
|
2444
|
+
for (let msg of __dl_posted_events__) if (msg.src === gobj) msg.src = null;
|
|
2445
|
+
__dl_posted_events__ = __dl_posted_events__.filter((msg) => msg.dst !== gobj);
|
|
2364
2446
|
}
|
|
2365
2447
|
/************************************************************
|
|
2366
2448
|
* send_event
|
|
@@ -2596,7 +2678,7 @@ function gobj_subscribe_event(publisher, event, kw, subscriber) {
|
|
|
2596
2678
|
log_error(`subscriber NULL: ev ${event}`);
|
|
2597
2679
|
return 0;
|
|
2598
2680
|
}
|
|
2599
|
-
const IGNORED_KEYS = new Set([
|
|
2681
|
+
const IGNORED_KEYS = /* @__PURE__ */ new Set([
|
|
2600
2682
|
"__config__",
|
|
2601
2683
|
"__global__",
|
|
2602
2684
|
"__local__",
|
|
@@ -2652,7 +2734,7 @@ function gobj_unsubscribe_event(publisher, event, kw, subscriber) {
|
|
|
2652
2734
|
log_error(`subscriber NULL: ev ${event}`);
|
|
2653
2735
|
return 0;
|
|
2654
2736
|
}
|
|
2655
|
-
const IGNORED_KEYS = new Set([
|
|
2737
|
+
const IGNORED_KEYS = /* @__PURE__ */ new Set([
|
|
2656
2738
|
"__config__",
|
|
2657
2739
|
"__global__",
|
|
2658
2740
|
"__local__",
|
|
@@ -2846,9 +2928,10 @@ function gobj_command(gobj, command, kw, src) {
|
|
|
2846
2928
|
if (tracea > 1) trace_json(kw);
|
|
2847
2929
|
}
|
|
2848
2930
|
if (gobj.gclass.gmt.mt_command_parser) return gobj.gclass.gmt.mt_command_parser(gobj, command, kw, src);
|
|
2849
|
-
if (gobj.gclass.command_table)
|
|
2850
|
-
|
|
2851
|
-
|
|
2931
|
+
if (gobj.gclass.command_table) {
|
|
2932
|
+
if (__global_command_parser_fn__) return __global_command_parser_fn__(gobj, command, kw, src);
|
|
2933
|
+
else return build_command_response(gobj, -1, sprintf("%s: global command parser not available", gobj_short_name(gobj)), 0, 0);
|
|
2934
|
+
} else return build_command_response(gobj, -1, sprintf("%s: command table not available", gobj_short_name(gobj)), 0, 0);
|
|
2852
2935
|
}
|
|
2853
2936
|
/************************************************************
|
|
2854
2937
|
* Exec gobj stats. Return a webix
|
|
@@ -2955,22 +3038,26 @@ function format_log(format) {
|
|
|
2955
3038
|
function log_error(format) {
|
|
2956
3039
|
let msg = format_log(format);
|
|
2957
3040
|
let hora = current_timestamp();
|
|
2958
|
-
if (f_error)
|
|
2959
|
-
if (
|
|
2960
|
-
|
|
2961
|
-
|
|
2962
|
-
|
|
3041
|
+
if (f_error) {
|
|
3042
|
+
if (f_error === _console.error) {
|
|
3043
|
+
if (__console_output_enabled__) f_error("%c" + hora + " ERROR: " + String(msg), "color:red");
|
|
3044
|
+
} else {
|
|
3045
|
+
if (__console_output_enabled__) _console.error("%c" + hora + " ERROR: " + String(msg), "color:red");
|
|
3046
|
+
f_error(`${hora} ERROR: ${String(msg)}`);
|
|
3047
|
+
}
|
|
2963
3048
|
}
|
|
2964
3049
|
emit_log_callback("error", msg, hora);
|
|
2965
3050
|
}
|
|
2966
3051
|
function log_warning(format) {
|
|
2967
3052
|
let msg = format_log(format);
|
|
2968
3053
|
let hora = current_timestamp();
|
|
2969
|
-
if (f_warning)
|
|
2970
|
-
if (
|
|
2971
|
-
|
|
2972
|
-
|
|
2973
|
-
|
|
3054
|
+
if (f_warning) {
|
|
3055
|
+
if (f_warning === _console.warn) {
|
|
3056
|
+
if (__console_output_enabled__) f_warning("%c" + hora + " WARNING: " + String(msg), "color:yellow");
|
|
3057
|
+
} else {
|
|
3058
|
+
if (__console_output_enabled__) _console.warn("%c" + hora + " WARNING: " + String(msg), "color:yellow");
|
|
3059
|
+
f_warning(`${hora} WARNING: ${String(msg)}`);
|
|
3060
|
+
}
|
|
2974
3061
|
}
|
|
2975
3062
|
emit_log_callback("warning", msg, hora);
|
|
2976
3063
|
}
|
|
@@ -4006,10 +4093,12 @@ function list2options(list, field_id, field_value) {
|
|
|
4006
4093
|
vv["id"] = field_id;
|
|
4007
4094
|
vv["value"] = v[field_id];
|
|
4008
4095
|
} else {
|
|
4009
|
-
if (!kw_has_key(v, field_value))
|
|
4010
|
-
|
|
4011
|
-
|
|
4012
|
-
|
|
4096
|
+
if (!kw_has_key(v, field_value)) {
|
|
4097
|
+
if (json_size(v) > 0) field_value = Object.keys(v)[0];
|
|
4098
|
+
else {
|
|
4099
|
+
log_error("list2options(): object without field value: " + field_value);
|
|
4100
|
+
continue;
|
|
4101
|
+
}
|
|
4013
4102
|
}
|
|
4014
4103
|
vv["id"] = v[field_id];
|
|
4015
4104
|
vv["value"] = v[field_value];
|
|
@@ -4325,13 +4414,15 @@ function jdb_update(jdb, topic_name, path, kw) {
|
|
|
4325
4414
|
if (is_object(v)) v = kw_get_dict_value(null, v, jdb.hook, [], 1);
|
|
4326
4415
|
v = _jdb_get(v, null, id, false);
|
|
4327
4416
|
}
|
|
4328
|
-
if (ids.length === 0 && v)
|
|
4329
|
-
|
|
4330
|
-
|
|
4331
|
-
|
|
4332
|
-
|
|
4333
|
-
|
|
4334
|
-
|
|
4417
|
+
if (ids.length === 0 && v) {
|
|
4418
|
+
if (is_array(v)) v.push(kw);
|
|
4419
|
+
else if (v["id"] === kw["id"]) Object.assign(v, kw);
|
|
4420
|
+
else {
|
|
4421
|
+
let v_ = kw_get_dict_value(null, v, jdb.hook, [], 1);
|
|
4422
|
+
let v__ = _jdb_get(v_, jdb.hook, kw["id"], false);
|
|
4423
|
+
if (v__) Object.assign(v__, kw);
|
|
4424
|
+
else v_.push(kw);
|
|
4425
|
+
}
|
|
4335
4426
|
}
|
|
4336
4427
|
return topic;
|
|
4337
4428
|
}
|
|
@@ -4357,13 +4448,15 @@ function jdb_delete(jdb, topic_name, path, kw) {
|
|
|
4357
4448
|
if (is_object(v)) v = kw_get_dict_value(null, v, jdb.hook, null, 0);
|
|
4358
4449
|
v = _jdb_get(v, null, id, false);
|
|
4359
4450
|
}
|
|
4360
|
-
if (ids.length === 0 && v)
|
|
4361
|
-
|
|
4362
|
-
|
|
4363
|
-
|
|
4364
|
-
|
|
4365
|
-
|
|
4366
|
-
|
|
4451
|
+
if (ids.length === 0 && v) {
|
|
4452
|
+
if (is_array(v)) {
|
|
4453
|
+
let idx = id_index_in_obj_list(v, kw["id"]);
|
|
4454
|
+
if (idx >= 0) v.splice(idx, 1);
|
|
4455
|
+
} else {
|
|
4456
|
+
let v_ = kw_get_dict_value(null, v, jdb.hook, null, 0);
|
|
4457
|
+
let idx = id_index_in_obj_list(v_, kw["id"]);
|
|
4458
|
+
if (idx >= 0) v_.splice(idx, 1);
|
|
4459
|
+
}
|
|
4367
4460
|
}
|
|
4368
4461
|
return topic;
|
|
4369
4462
|
}
|
|
@@ -5090,41 +5183,42 @@ function treedb_hook_data_size(value) {
|
|
|
5090
5183
|
* }
|
|
5091
5184
|
************************************************************/
|
|
5092
5185
|
function treedb_decoder_fkey(col, fkey) {
|
|
5093
|
-
if (is_string(fkey))
|
|
5094
|
-
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5099
|
-
|
|
5100
|
-
|
|
5101
|
-
|
|
5102
|
-
|
|
5103
|
-
|
|
5104
|
-
|
|
5105
|
-
|
|
5106
|
-
|
|
5107
|
-
|
|
5108
|
-
|
|
5109
|
-
|
|
5110
|
-
|
|
5111
|
-
|
|
5112
|
-
|
|
5113
|
-
|
|
5114
|
-
|
|
5115
|
-
|
|
5116
|
-
|
|
5117
|
-
|
|
5118
|
-
|
|
5119
|
-
|
|
5186
|
+
if (is_string(fkey)) {
|
|
5187
|
+
if (fkey.indexOf("^") === -1) {
|
|
5188
|
+
let fkey_desc = col.fkey;
|
|
5189
|
+
if (json_object_size(fkey_desc) !== 1) {
|
|
5190
|
+
log_error("bad fkey 1");
|
|
5191
|
+
log_error(col);
|
|
5192
|
+
log_error(fkey);
|
|
5193
|
+
return null;
|
|
5194
|
+
}
|
|
5195
|
+
let topic_name;
|
|
5196
|
+
let hook_name;
|
|
5197
|
+
for (const k of Object.keys(fkey_desc)) {
|
|
5198
|
+
topic_name = k;
|
|
5199
|
+
hook_name = fkey_desc[k];
|
|
5200
|
+
break;
|
|
5201
|
+
}
|
|
5202
|
+
return {
|
|
5203
|
+
topic_name,
|
|
5204
|
+
id: fkey,
|
|
5205
|
+
hook_name
|
|
5206
|
+
};
|
|
5207
|
+
} else {
|
|
5208
|
+
let tt = fkey.split("^");
|
|
5209
|
+
if (tt.length !== 3) {
|
|
5210
|
+
log_error("bad fkey 2");
|
|
5211
|
+
log_error(col);
|
|
5212
|
+
log_error(fkey);
|
|
5213
|
+
return null;
|
|
5214
|
+
}
|
|
5215
|
+
return {
|
|
5216
|
+
topic_name: tt[0],
|
|
5217
|
+
id: tt[1],
|
|
5218
|
+
hook_name: tt[2]
|
|
5219
|
+
};
|
|
5120
5220
|
}
|
|
5121
|
-
|
|
5122
|
-
topic_name: tt[0],
|
|
5123
|
-
id: tt[1],
|
|
5124
|
-
hook_name: tt[2]
|
|
5125
|
-
};
|
|
5126
|
-
}
|
|
5127
|
-
else if (is_object(fkey)) return {
|
|
5221
|
+
} else if (is_object(fkey)) return {
|
|
5128
5222
|
topic_name: fkey.topic_name,
|
|
5129
5223
|
id: fkey.id,
|
|
5130
5224
|
hook_name: fkey.hook_name
|
|
@@ -5166,38 +5260,39 @@ function treedb_encoder_fkey(col, fkey) {
|
|
|
5166
5260
|
* }
|
|
5167
5261
|
********************************************/
|
|
5168
5262
|
function treedb_decoder_hook(col, hook) {
|
|
5169
|
-
if (is_string(hook))
|
|
5170
|
-
|
|
5171
|
-
|
|
5172
|
-
|
|
5173
|
-
|
|
5174
|
-
|
|
5175
|
-
|
|
5176
|
-
|
|
5177
|
-
|
|
5178
|
-
|
|
5179
|
-
|
|
5180
|
-
|
|
5181
|
-
|
|
5182
|
-
|
|
5183
|
-
|
|
5184
|
-
|
|
5185
|
-
|
|
5186
|
-
|
|
5187
|
-
|
|
5188
|
-
|
|
5189
|
-
|
|
5190
|
-
|
|
5191
|
-
|
|
5192
|
-
|
|
5193
|
-
|
|
5263
|
+
if (is_string(hook)) {
|
|
5264
|
+
if (hook.indexOf("^") === -1) {
|
|
5265
|
+
let hook_desc = col.hook;
|
|
5266
|
+
if (json_object_size(hook_desc) !== 1) {
|
|
5267
|
+
log_error("bad hook 1");
|
|
5268
|
+
log_error(col);
|
|
5269
|
+
log_error(hook);
|
|
5270
|
+
return null;
|
|
5271
|
+
}
|
|
5272
|
+
let topic_name;
|
|
5273
|
+
for (let k of Object.keys(hook_desc)) {
|
|
5274
|
+
topic_name = k;
|
|
5275
|
+
hook_desc[k];
|
|
5276
|
+
break;
|
|
5277
|
+
}
|
|
5278
|
+
return {
|
|
5279
|
+
topic_name,
|
|
5280
|
+
id: hook
|
|
5281
|
+
};
|
|
5282
|
+
} else {
|
|
5283
|
+
let tt = hook.split("^");
|
|
5284
|
+
if (tt.length !== 2) {
|
|
5285
|
+
log_error("bad hook 2");
|
|
5286
|
+
log_error(col);
|
|
5287
|
+
log_error(hook);
|
|
5288
|
+
return null;
|
|
5289
|
+
}
|
|
5290
|
+
return {
|
|
5291
|
+
topic_name: tt[0],
|
|
5292
|
+
id: tt[1]
|
|
5293
|
+
};
|
|
5194
5294
|
}
|
|
5195
|
-
|
|
5196
|
-
topic_name: tt[0],
|
|
5197
|
-
id: tt[1]
|
|
5198
|
-
};
|
|
5199
|
-
}
|
|
5200
|
-
else if (is_object(hook)) return {
|
|
5295
|
+
} else if (is_object(hook)) return {
|
|
5201
5296
|
topic_name: hook.topic_name,
|
|
5202
5297
|
id: hook.id
|
|
5203
5298
|
};
|
|
@@ -5303,9 +5398,7 @@ function treedb_get_field_desc(col) {
|
|
|
5303
5398
|
case "template":
|
|
5304
5399
|
field_desc.enum_list = col.template;
|
|
5305
5400
|
break;
|
|
5306
|
-
case "table":
|
|
5307
|
-
field_desc.enum_list = col.table;
|
|
5308
|
-
break;
|
|
5401
|
+
case "table": field_desc.enum_list = col.table;
|
|
5309
5402
|
}
|
|
5310
5403
|
field_desc.type = f;
|
|
5311
5404
|
} else if (str_in_list(treedb_field_attributes, f)) switch (f) {
|
|
@@ -5318,9 +5411,7 @@ function treedb_get_field_desc(col) {
|
|
|
5318
5411
|
case "required":
|
|
5319
5412
|
field_desc.is_required = true;
|
|
5320
5413
|
break;
|
|
5321
|
-
case "hidden":
|
|
5322
|
-
field_desc.is_hidden = true;
|
|
5323
|
-
break;
|
|
5414
|
+
case "hidden": field_desc.is_hidden = true;
|
|
5324
5415
|
}
|
|
5325
5416
|
}
|
|
5326
5417
|
return field_desc;
|
|
@@ -5357,9 +5448,7 @@ function template_get_field_desc(key, value) {
|
|
|
5357
5448
|
case "required":
|
|
5358
5449
|
field_desc.is_required = true;
|
|
5359
5450
|
break;
|
|
5360
|
-
case "hidden":
|
|
5361
|
-
field_desc.is_hidden = true;
|
|
5362
|
-
break;
|
|
5451
|
+
case "hidden": field_desc.is_hidden = true;
|
|
5363
5452
|
}
|
|
5364
5453
|
}
|
|
5365
5454
|
if (!field_desc.real_type) field_desc.real_type = "string";
|
|
@@ -5383,7 +5472,8 @@ function create_template_record(template, kw) {
|
|
|
5383
5472
|
Object.entries(template).forEach(([field, col]) => {
|
|
5384
5473
|
let default_value;
|
|
5385
5474
|
if (is_object(col)) default_value = col.default;
|
|
5386
|
-
|
|
5475
|
+
let value = kw_get_dict_value(null, kw, field, default_value);
|
|
5476
|
+
new_record[field] = value;
|
|
5387
5477
|
});
|
|
5388
5478
|
return new_record;
|
|
5389
5479
|
}
|
|
@@ -5464,7 +5554,6 @@ function mt_writing$2(gobj, path) {
|
|
|
5464
5554
|
if (priv.msec > 0) {
|
|
5465
5555
|
if (!gobj_is_running(gobj)) gobj_start(gobj);
|
|
5466
5556
|
} else if (gobj_is_running(gobj)) gobj_stop(gobj);
|
|
5467
|
-
break;
|
|
5468
5557
|
}
|
|
5469
5558
|
}
|
|
5470
5559
|
/***************************************************************
|
|
@@ -5823,9 +5912,7 @@ function mt_writing(gobj, path) {
|
|
|
5823
5912
|
case "remote_yuno_role":
|
|
5824
5913
|
priv.remote_yuno_role = gobj_read_str_attr(gobj, "remote_yuno_role");
|
|
5825
5914
|
break;
|
|
5826
|
-
case "remote_yuno_service":
|
|
5827
|
-
priv.remote_yuno_service = gobj_read_str_attr(gobj, "remote_yuno_service");
|
|
5828
|
-
break;
|
|
5915
|
+
case "remote_yuno_service": priv.remote_yuno_service = gobj_read_str_attr(gobj, "remote_yuno_service");
|
|
5829
5916
|
}
|
|
5830
5917
|
}
|
|
5831
5918
|
/***************************************************************
|
|
@@ -6367,12 +6454,13 @@ function ac_on_message(gobj, event, kw, src) {
|
|
|
6367
6454
|
return 0;
|
|
6368
6455
|
}
|
|
6369
6456
|
let gobj_service = gobj_find_service(iev_dst_service, true);
|
|
6370
|
-
if (gobj_service)
|
|
6371
|
-
|
|
6372
|
-
|
|
6373
|
-
|
|
6374
|
-
|
|
6375
|
-
|
|
6457
|
+
if (gobj_service) {
|
|
6458
|
+
if (gobj_has_event(gobj_service, iev_event, event_flag_t.EVF_PUBLIC_EVENT)) gobj_send_event(gobj_service, iev_event, iev_kw, gobj);
|
|
6459
|
+
else {
|
|
6460
|
+
log_error(`${gobj_short_name(gobj)}: Service found but no event or not public, service '${gobj_short_name(gobj_service)}', ev '${iev_event}'`);
|
|
6461
|
+
return -1;
|
|
6462
|
+
}
|
|
6463
|
+
} else if (gobj_is_pure_child(gobj)) gobj_send_event(gobj_parent(gobj), iev_event, iev_kw, gobj);
|
|
6376
6464
|
else gobj_publish_event(gobj, iev_event, iev_kw);
|
|
6377
6465
|
return 0;
|
|
6378
6466
|
}
|
|
@@ -6577,6 +6665,7 @@ exports.gobj_create_volatil = gobj_create_volatil;
|
|
|
6577
6665
|
exports.gobj_create_yuno = gobj_create_yuno;
|
|
6578
6666
|
exports.gobj_current_state = gobj_current_state;
|
|
6579
6667
|
exports.gobj_default_service = gobj_default_service;
|
|
6668
|
+
exports.gobj_deliver_posted_events = gobj_deliver_posted_events;
|
|
6580
6669
|
exports.gobj_destroy = gobj_destroy;
|
|
6581
6670
|
exports.gobj_find_child = gobj_find_child;
|
|
6582
6671
|
exports.gobj_find_gobj = gobj_find_gobj;
|
|
@@ -6608,6 +6697,7 @@ exports.gobj_parent = gobj_parent;
|
|
|
6608
6697
|
exports.gobj_pause = gobj_pause;
|
|
6609
6698
|
exports.gobj_play = gobj_play;
|
|
6610
6699
|
exports.gobj_post_event = gobj_post_event;
|
|
6700
|
+
exports.gobj_posted_events_size = gobj_posted_events_size;
|
|
6611
6701
|
exports.gobj_publish_event = gobj_publish_event;
|
|
6612
6702
|
exports.gobj_read_attr = gobj_read_attr;
|
|
6613
6703
|
exports.gobj_read_attrs = gobj_read_attrs;
|