@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.
@@ -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 && verbose) {
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)) if (!(gobj.gclass.gclass_flag & gclass_flag_t.gcflag_required_start_to_play)) {
1574
- log_warning(`${gobj_short_name(gobj)}: GObj playing without previous start`);
1575
- gobj_start(gobj);
1576
- } else {
1577
- log_error(`${gobj_short_name(gobj)}: Cannot play, start not done`);
1578
- return -1;
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
- * post_event, by now only in js
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
- function gobj_post_event(gobj, event, kw, src) {
2360
- setTimeout(() => {
2361
- if (gobj_is_destroying(gobj)) return;
2362
- gobj_send_event(gobj, event, kw, src);
2363
- }, 10);
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) if (__global_command_parser_fn__) return __global_command_parser_fn__(gobj, command, kw, src);
2850
- else return build_command_response(gobj, -1, sprintf("%s: global command parser not available", gobj_short_name(gobj)), 0, 0);
2851
- else return build_command_response(gobj, -1, sprintf("%s: command table not available", gobj_short_name(gobj)), 0, 0);
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) if (f_error === _console.error) {
2959
- if (__console_output_enabled__) f_error("%c" + hora + " ERROR: " + String(msg), "color:red");
2960
- } else {
2961
- if (__console_output_enabled__) _console.error("%c" + hora + " ERROR: " + String(msg), "color:red");
2962
- f_error(`${hora} ERROR: ${String(msg)}`);
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) if (f_warning === _console.warn) {
2970
- if (__console_output_enabled__) f_warning("%c" + hora + " WARNING: " + String(msg), "color:yellow");
2971
- } else {
2972
- if (__console_output_enabled__) _console.warn("%c" + hora + " WARNING: " + String(msg), "color:yellow");
2973
- f_warning(`${hora} WARNING: ${String(msg)}`);
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)) if (json_size(v) > 0) field_value = Object.keys(v)[0];
4010
- else {
4011
- log_error("list2options(): object without field value: " + field_value);
4012
- continue;
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) if (is_array(v)) v.push(kw);
4329
- else if (v["id"] === kw["id"]) Object.assign(v, kw);
4330
- else {
4331
- let v_ = kw_get_dict_value(null, v, jdb.hook, [], 1);
4332
- let v__ = _jdb_get(v_, jdb.hook, kw["id"], false);
4333
- if (v__) Object.assign(v__, kw);
4334
- else v_.push(kw);
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) if (is_array(v)) {
4361
- let idx = id_index_in_obj_list(v, kw["id"]);
4362
- if (idx >= 0) v.splice(idx, 1);
4363
- } else {
4364
- let v_ = kw_get_dict_value(null, v, jdb.hook, null, 0);
4365
- let idx = id_index_in_obj_list(v_, kw["id"]);
4366
- if (idx >= 0) v_.splice(idx, 1);
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)) if (fkey.indexOf("^") === -1) {
5094
- let fkey_desc = col.fkey;
5095
- if (json_object_size(fkey_desc) !== 1) {
5096
- log_error("bad fkey 1");
5097
- log_error(col);
5098
- log_error(fkey);
5099
- return null;
5100
- }
5101
- let topic_name;
5102
- let hook_name;
5103
- for (const k of Object.keys(fkey_desc)) {
5104
- topic_name = k;
5105
- hook_name = fkey_desc[k];
5106
- break;
5107
- }
5108
- return {
5109
- topic_name,
5110
- id: fkey,
5111
- hook_name
5112
- };
5113
- } else {
5114
- let tt = fkey.split("^");
5115
- if (tt.length !== 3) {
5116
- log_error("bad fkey 2");
5117
- log_error(col);
5118
- log_error(fkey);
5119
- return null;
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
- return {
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)) if (hook.indexOf("^") === -1) {
5170
- let hook_desc = col.hook;
5171
- if (json_object_size(hook_desc) !== 1) {
5172
- log_error("bad hook 1");
5173
- log_error(col);
5174
- log_error(hook);
5175
- return null;
5176
- }
5177
- let topic_name;
5178
- for (let k of Object.keys(hook_desc)) {
5179
- topic_name = k;
5180
- hook_desc[k];
5181
- break;
5182
- }
5183
- return {
5184
- topic_name,
5185
- id: hook
5186
- };
5187
- } else {
5188
- let tt = hook.split("^");
5189
- if (tt.length !== 2) {
5190
- log_error("bad hook 2");
5191
- log_error(col);
5192
- log_error(hook);
5193
- return null;
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
- return {
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
- new_record[field] = kw_get_dict_value(null, kw, field, default_value);
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) if (gobj_has_event(gobj_service, iev_event, event_flag_t.EVF_PUBLIC_EVENT)) gobj_send_event(gobj_service, iev_event, iev_kw, gobj);
6371
- else {
6372
- log_error(`${gobj_short_name(gobj)}: Service found but no event or not public, service '${gobj_short_name(gobj_service)}', ev '${iev_event}'`);
6373
- return -1;
6374
- }
6375
- else if (gobj_is_pure_child(gobj)) gobj_send_event(gobj_parent(gobj), iev_event, iev_kw, gobj);
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;