@yuneta/gobj-js 7.26.23 → 7.26.24

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.
@@ -867,6 +867,75 @@ var gobjJs = (function(exports) {
867
867
  var INT64_MIN = -(2n ** 63n);
868
868
  var INT64_MAX = 2n ** 63n - 1n;
869
869
  var REFUSED_TEXT = "a text that does not read as one";
870
+ var JSON_NUMBER_TOKEN = /-?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?/y;
871
+ function is_surrogate_pair(high, low) {
872
+ return high >= 55296 && high <= 56319 && low >= 56320 && low <= 57343;
873
+ }
874
+ function json_text_refused_by_c(s) {
875
+ const n = s.length;
876
+ let i = 0;
877
+ while (i < n) {
878
+ const c = s.charCodeAt(i);
879
+ if (c === 34) {
880
+ i++;
881
+ while (i < n) {
882
+ const d = s.charCodeAt(i);
883
+ if (d === 34) {
884
+ i++;
885
+ break;
886
+ }
887
+ if (d === 92 && s[i + 1] === "u") {
888
+ const u = parseInt(s.substring(i + 2, i + 6), 16);
889
+ if (u === 0) return true;
890
+ if (u >= 55296 && u <= 57343) {
891
+ if (!is_surrogate_pair(u, s[i + 6] === "\\" && s[i + 7] === "u" ? parseInt(s.substring(i + 8, i + 12), 16) : -1)) return true;
892
+ i += 12;
893
+ continue;
894
+ }
895
+ i += 6;
896
+ continue;
897
+ }
898
+ if (d === 92) {
899
+ i += 2;
900
+ continue;
901
+ }
902
+ if (d >= 55296 && d <= 57343) {
903
+ if (!is_surrogate_pair(d, s.charCodeAt(i + 1))) return true;
904
+ i += 2;
905
+ continue;
906
+ }
907
+ i++;
908
+ }
909
+ continue;
910
+ }
911
+ if (c === 45 || c >= 48 && c <= 57) {
912
+ JSON_NUMBER_TOKEN.lastIndex = i;
913
+ const m = JSON_NUMBER_TOKEN.exec(s);
914
+ if (!m) return true;
915
+ const token = m[0];
916
+ if (/[.eE]/.test(token)) {
917
+ if (!Number.isFinite(Number(token))) return true;
918
+ } else {
919
+ const big = BigInt(token);
920
+ if (big < INT64_MIN || big > INT64_MAX) return true;
921
+ }
922
+ i += token.length;
923
+ continue;
924
+ }
925
+ i++;
926
+ }
927
+ return false;
928
+ }
929
+ function parse_json_text_as_c(s) {
930
+ let jn;
931
+ try {
932
+ jn = JSON.parse(s);
933
+ } catch (e) {
934
+ return;
935
+ }
936
+ if (json_text_refused_by_c(s)) return;
937
+ return jn;
938
+ }
870
939
  function value_has_shape(type, value) {
871
940
  if (DTP_IS_STRING(type)) return is_string(value);
872
941
  if (DTP_IS_DICT(type)) return is_object(value);
@@ -970,16 +1039,8 @@ var gobjJs = (function(exports) {
970
1039
  };
971
1040
  }
972
1041
  if (DTP_IS_DICT(type) || DTP_IS_LIST(type)) {
973
- let jn;
974
- try {
975
- jn = JSON.parse(s);
976
- } catch (e) {
977
- return {
978
- value: void 0,
979
- refused: REFUSED_TEXT
980
- };
981
- }
982
- if (!value_has_shape(type, jn)) return {
1042
+ const jn = parse_json_text_as_c(s);
1043
+ if (jn === void 0 || !value_has_shape(type, jn)) return {
983
1044
  value: void 0,
984
1045
  refused: REFUSED_TEXT
985
1046
  };
@@ -988,12 +1049,12 @@ var gobjJs = (function(exports) {
988
1049
  refused: null
989
1050
  };
990
1051
  }
991
- if (DTP_IS_JSON(type)) try {
992
- return {
993
- value: JSON.parse(s),
1052
+ if (DTP_IS_JSON(type)) {
1053
+ const jn = parse_json_text_as_c(s);
1054
+ if (jn !== void 0) return {
1055
+ value: jn,
994
1056
  refused: null
995
1057
  };
996
- } catch (e) {
997
1058
  const t = s.replace(/^[ \t]+/, "");
998
1059
  if (t.startsWith("{") || t.startsWith("[") || t.startsWith("\"")) return {
999
1060
  value: void 0,
@@ -1086,8 +1147,18 @@ var gobjJs = (function(exports) {
1086
1147
  data_type_t.DTP_LIST,
1087
1148
  data_type_t.DTP_DICT
1088
1149
  ];
1150
+ var NO_JSON_TEXT = "a value with no json text";
1151
+ function json_text_of(value) {
1152
+ try {
1153
+ const s = JSON.stringify(value);
1154
+ return is_string(s) ? s : void 0;
1155
+ } catch (e) {
1156
+ return;
1157
+ }
1158
+ }
1089
1159
  function log_attr_value_refused(gobj, it, value, refused) {
1090
1160
  const types = {
1161
+ [data_type_t.DTP_STRING]: "a string",
1091
1162
  [data_type_t.DTP_BOOLEAN]: "a boolean",
1092
1163
  [data_type_t.DTP_INTEGER]: "an integer",
1093
1164
  [data_type_t.DTP_REAL]: "a real",
@@ -1097,7 +1168,8 @@ var gobjJs = (function(exports) {
1097
1168
  let shown;
1098
1169
  if (it.flag & sdata_flag_t.SDF_SECRET) shown = "********";
1099
1170
  else {
1100
- shown = is_string(value) ? value : String(JSON.stringify(value === void 0 ? null : value));
1171
+ shown = is_string(value) ? value : json_text_of(value === void 0 ? null : value);
1172
+ if (shown === void 0) shown = `<${NO_JSON_TEXT}>`;
1101
1173
  const masked = mask_secrets_inline(shown);
1102
1174
  if (masked !== null) shown = masked;
1103
1175
  if (shown.length > ATTR_VALUE_SHOWN) {
@@ -1119,8 +1191,11 @@ var gobjJs = (function(exports) {
1119
1191
  if (jn_value_ === null || jn_value_ === void 0) jn_value2 = "";
1120
1192
  else if (is_string(jn_value_)) jn_value2 = String(jn_value_);
1121
1193
  else {
1122
- let s = JSON.stringify(jn_value_);
1123
- if (s) jn_value2 = String(s);
1194
+ jn_value2 = json_text_of(jn_value_);
1195
+ if (jn_value2 === void 0) {
1196
+ log_attr_value_refused(gobj, it, jn_value_, NO_JSON_TEXT);
1197
+ return -1;
1198
+ }
1124
1199
  }
1125
1200
  break;
1126
1201
  case data_type_t.DTP_BOOLEAN:
@@ -2568,15 +2643,20 @@ var gobjJs = (function(exports) {
2568
2643
  * The value a typed writer writes, read as ITS type by the grammar of
2569
2644
  * json2item() (a C writer takes its C type: a string is never read as a
2570
2645
  * number there). Return {value} or {refused} (logged): the attr keeps its
2571
- * value. A string writer never refuses: null and undefined are "", any
2572
- * other json its text, as a DTP_STRING attr reads them.
2646
+ * value. A string writer takes null and undefined as "", any other json
2647
+ * as its text, as a DTP_STRING attr reads them; it refuses only a value
2648
+ * with no json text (circular, a BigInt).
2573
2649
  ***************************************************************************/
2574
2650
  function typed_writer_value(gobj, name, type, value) {
2651
+ let r;
2575
2652
  if (DTP_IS_STRING(type)) {
2576
2653
  if (value === null || value === void 0) return { value: "" };
2577
- return { value: is_string(value) ? value : String(JSON.stringify(value)) };
2578
- }
2579
- const r = command_parameter_from_json(type, value);
2654
+ if (is_string(value)) return { value };
2655
+ r = {
2656
+ value: json_text_of(value),
2657
+ refused: NO_JSON_TEXT
2658
+ };
2659
+ } else r = command_parameter_from_json(type, value);
2580
2660
  if (r.value === void 0) {
2581
2661
  let holder = gobj;
2582
2662
  while (holder && !gobj_has_attr(holder, name)) holder = holder.bottom_gobj;
@@ -3021,9 +3101,9 @@ var gobjJs = (function(exports) {
3021
3101
  }
3022
3102
  }
3023
3103
  const frame = push_dispatch_frame(dst, event, frame_kind_t.FRAME_ACTION);
3024
- if (event_action.next_state) gobj_change_state(dst, event_action.next_state);
3025
3104
  let ret = -1;
3026
3105
  try {
3106
+ if (event_action.next_state) gobj_change_state(dst, event_action.next_state);
3027
3107
  if (event_action.action) ret = event_action.action(dst, event, kw, src);
3028
3108
  } catch (e) {
3029
3109
  __inside__--;
@@ -3047,18 +3127,23 @@ var gobjJs = (function(exports) {
3047
3127
  __own_event__: 4
3048
3128
  });
3049
3129
  /***************************************************************************
3050
- * The event type of `event_name` in any registered gclass, null if none.
3051
- * The C kernel's gobj_find_event_type(): any case, gclasses only.
3130
+ * The event type of `event_name` in any registered gclass whose flags
3131
+ * hold one of `event_flag` (0: any), null if none. The C kernel's
3132
+ * gobj_find_event_type(): any case, gclasses only. With `verbose` a miss
3133
+ * is logged, with the name as it was given: never verbose for a name
3134
+ * that came from a peer.
3052
3135
  ***************************************************************************/
3053
- function _find_event_type_in_gclasses(event_name) {
3136
+ function gobj_find_event_type(event_name, event_flag, verbose) {
3054
3137
  let lower = String(event_name).toLowerCase();
3055
3138
  for (let gclass_name in _gclass_register) {
3056
3139
  let dl = _gclass_register[gclass_name].dl_events;
3057
3140
  for (let i = 0; i < dl.length; i++) {
3058
3141
  let event_type = dl[i];
3142
+ if (event_flag && !(event_type.event_flag & event_flag)) continue;
3059
3143
  if (event_type.event_name && event_type.event_name.toLowerCase() === lower) return event_type;
3060
3144
  }
3061
3145
  }
3146
+ if (verbose) log_error(`EVENT NOT FOUND: ${event_name}`);
3062
3147
  return null;
3063
3148
  }
3064
3149
  var subscription_desc = [
@@ -3095,7 +3180,7 @@ var gobjJs = (function(exports) {
3095
3180
  json_object_set_new(subs, "__config__", kw_clone);
3096
3181
  let renamed_event = kw_get_str(publisher, kw_clone, "__rename_event_name__", "");
3097
3182
  if (!empty_string(renamed_event)) {
3098
- let event_type = _find_event_type_in_gclasses(renamed_event);
3183
+ let event_type = gobj_find_event_type(renamed_event, 0, false);
3099
3184
  if (event_type) {
3100
3185
  json_object_set_new(subs, "renamed_event", event_type.event_name);
3101
3186
  delete kw_clone.__rename_event_name__;
@@ -3156,7 +3241,7 @@ var gobjJs = (function(exports) {
3156
3241
  kw_match.__config__ = config_match;
3157
3242
  let renamed_event = "";
3158
3243
  let rename = config_match.__rename_event_name__;
3159
- let event_type = typeof rename === "string" && !empty_string(rename) ? _find_event_type_in_gclasses(rename) : null;
3244
+ let event_type = typeof rename === "string" && !empty_string(rename) ? gobj_find_event_type(rename, 0, false) : null;
3160
3245
  if (event_type) {
3161
3246
  renamed_event = event_type.event_name;
3162
3247
  delete config_match.__rename_event_name__;
@@ -4320,12 +4405,13 @@ var gobjJs = (function(exports) {
4320
4405
  const name_from = word;
4321
4406
  word = p + 1;
4322
4407
  const secret = is_secret_name_tail(str, name_from, p, names);
4323
- if (secret && names === NAMES_NOW && !is_secret_name_tail(str, name_from, p, NAMES_7_26_9)) not_7_26_9 = true;
4408
+ if (secret && names === NAMES_NOW && !not_7_26_9 && !is_secret_name_tail(str, name_from, p, NAMES_7_26_9)) not_7_26_9 = true;
4324
4409
  if (!(secret || value_is_secret && p - name_from === 5 && ascii_case_equal(str, name_from, "value"))) {
4325
- if (judged && query_name_from(str, p) === name_from) judged[p] = 1;
4410
+ if (judged && query_name_from(str, p) === name_from) judged[p] = JUDGED_NOT_SECRET;
4326
4411
  p++;
4327
4412
  continue;
4328
4413
  }
4414
+ if (judged && secret && query_name_from(str, p) === name_from) judged[p] = JUDGED_SECRET;
4329
4415
  p++;
4330
4416
  let end;
4331
4417
  const quote = p < str.length && (str[p] === "\"" || str[p] === "'") ? str[p] : "";
@@ -4388,23 +4474,99 @@ var gobjJs = (function(exports) {
4388
4474
  while (n > 0 && eq - n < MASK_MAX_NAME && is_name_char_code(str.charCodeAt(n - 1))) n--;
4389
4475
  return n;
4390
4476
  }
4477
+ var JUDGED_NOT_SECRET = 1;
4478
+ var JUDGED_SECRET = 2;
4479
+ function hex_digit_value(code) {
4480
+ if (code >= 48 && code <= 57) return code - 48;
4481
+ if (code >= 97 && code <= 102) return code - 87;
4482
+ if (code >= 65 && code <= 70) return code - 55;
4483
+ return -1;
4484
+ }
4485
+ function is_written_name_bracket_code(code) {
4486
+ return code === 91 || code === 93 || code === 39 || code === 34;
4487
+ }
4488
+ function is_written_name_code(code) {
4489
+ return is_name_char_code(code) || code === 37 || is_written_name_bracket_code(code);
4490
+ }
4491
+ function written_name_is_secret(str, eq) {
4492
+ let n = eq;
4493
+ let plain = -1;
4494
+ while (n > 0 && eq - n < MASK_MAX_NAME && is_written_name_code(str.charCodeAt(n - 1))) {
4495
+ n--;
4496
+ if (plain < 0 && !is_name_char_code(str.charCodeAt(n))) plain = n + 1;
4497
+ }
4498
+ if (plain < 0) return false;
4499
+ const to = str.charCodeAt(plain - 1) === 37 ? eq : plain - 1;
4500
+ let encoded = false;
4501
+ for (let s = n; s < to && !encoded; s++) encoded = str.charCodeAt(s) === 37;
4502
+ let name = str;
4503
+ let from = n;
4504
+ let end = to;
4505
+ if (encoded) {
4506
+ name = "";
4507
+ for (let s = n; s < to; s++) {
4508
+ const hi = str.charCodeAt(s) === 37 && to - s > 2 ? hex_digit_value(str.charCodeAt(s + 1)) : -1;
4509
+ const lo = hi >= 0 ? hex_digit_value(str.charCodeAt(s + 2)) : -1;
4510
+ if (lo >= 0) {
4511
+ name += String.fromCharCode(hi * 16 + lo);
4512
+ s += 2;
4513
+ } else name += str[s];
4514
+ }
4515
+ from = 0;
4516
+ end = name.length;
4517
+ }
4518
+ let seg = from;
4519
+ for (let i = from; i <= end; i++) {
4520
+ if (i < end && !is_written_name_bracket_code(name.charCodeAt(i))) continue;
4521
+ if (i - seg >= 3 && secret_name_check(name, seg, i, true, true)) return true;
4522
+ seg = i + 1;
4523
+ }
4524
+ return false;
4525
+ }
4526
+ function mark_query_value(str, eq, marks) {
4527
+ const v = eq + 1;
4528
+ if (v < str.length && (str[v] === "\"" || str[v] === "'")) return mark_run(str, v + 1, QUOTE_STOPS[str[v]], marks);
4529
+ mark_scheme_value(str, v, PARAM_VALUE_STOPS, marks);
4530
+ return mark_run(str, v, PARAM_VALUE_STOPS, marks);
4531
+ }
4532
+ var WRITTEN_NAME_MARKS = /[[\]%'"]/;
4391
4533
  function mark_query_params(str, marks, judged) {
4392
4534
  let frontier = 0;
4393
- for (let p = 1; p < str.length; p++) {
4394
- if (p < frontier) {
4395
- p = frontier - 1;
4396
- continue;
4397
- }
4398
- if (str.charCodeAt(p) !== 61) continue;
4399
- if (judged[p]) continue;
4400
- const n = query_name_from(str, p);
4401
- if (n === p || !secret_name_check(str, n, p, true, true)) continue;
4402
- const v = p + 1;
4403
- if (v < str.length && (str[v] === "\"" || str[v] === "'")) frontier = mark_run(str, v + 1, QUOTE_STOPS[str[v]], marks);
4404
- else {
4405
- mark_scheme_value(str, v, PARAM_VALUE_STOPS, marks);
4406
- frontier = mark_run(str, v, PARAM_VALUE_STOPS, marks);
4535
+ let frontier_written = WRITTEN_NAME_MARKS.test(str) ? 0 : str.length;
4536
+ let p = str.indexOf("=", 1);
4537
+ while (p > 0) {
4538
+ if (p >= frontier) {
4539
+ let secret = judged[p] === JUDGED_SECRET;
4540
+ if (!judged[p]) {
4541
+ const n = query_name_from(str, p);
4542
+ secret = n < p && secret_name_check(str, n, p, true, true);
4543
+ }
4544
+ if (secret) frontier = mark_query_value(str, p, marks);
4545
+ }
4546
+ if (p >= frontier_written && written_name_is_secret(str, p)) frontier_written = mark_query_value(str, p, marks);
4547
+ p = str.indexOf("=", p + 1);
4548
+ }
4549
+ }
4550
+ var URL_AUTHORITY_STOPS = stop_table("/?#\"'<> ");
4551
+ function mark_url_passwords(str, marks) {
4552
+ let p = str.indexOf("://", 1);
4553
+ while (p > 0) {
4554
+ let next = p + 1;
4555
+ if (is_ascii_alnum_code(str.charCodeAt(p - 1))) {
4556
+ let colon = -1;
4557
+ let at = -1;
4558
+ let e = p + 3;
4559
+ while (e < str.length) {
4560
+ const code = str.charCodeAt(e);
4561
+ if (code < 128 && URL_AUTHORITY_STOPS[code]) break;
4562
+ if (code === 64) at = e;
4563
+ else if (code === 58 && colon < 0) colon = e;
4564
+ e++;
4565
+ }
4566
+ if (colon >= 0 && at > colon) mark_range(marks, colon + 1, at);
4567
+ next = e - 1;
4407
4568
  }
4569
+ p = str.indexOf("://", next);
4408
4570
  }
4409
4571
  }
4410
4572
  function mark_shapes(str, marks) {
@@ -4465,6 +4627,7 @@ var gobjJs = (function(exports) {
4465
4627
  if (mark_params(str, value_is_secret, READ_NOW, marks, judged) || value_is_secret !== value_is_secret_7_26_9) mark_params(str, value_is_secret_7_26_9, READ_AS_7_26_9, marks, null);
4466
4628
  if (has_shape_js_7_26_20(str)) mark_params(str, value_is_secret, READ_AS_GOBJ_JS_7_26_20, marks, null);
4467
4629
  mark_query_params(str, marks, judged);
4630
+ mark_url_passwords(str, marks);
4468
4631
  mark_shapes(str, marks);
4469
4632
  mark_labels(str, marks);
4470
4633
  }
@@ -8503,7 +8666,7 @@ var gobjJs = (function(exports) {
8503
8666
  * show its first characters). As the C kernel shows the name of an
8504
8667
  * event that is not public (mask_secrets_inline_capped()).
8505
8668
  ***************************************************************/
8506
- var PEER_NAME_SHOWN = 64;
8669
+ var PEER_NAME_SHOWN = 128;
8507
8670
  var PEER_FRAME_SHOWN = 256;
8508
8671
  function peer_text_shown(text, max) {
8509
8672
  let s = String(text);
@@ -8726,7 +8889,8 @@ var gobjJs = (function(exports) {
8726
8889
  let url = kw.url;
8727
8890
  if (kw.ws_seq !== void 0 && kw.ws_seq !== priv.ws_seq) return 0;
8728
8891
  set_remote_log_functions();
8729
- if (is_traffic_tracing(gobj)) trace_msg(`${gobj_short_name(gobj)}: WebSocket closed ${url} (Code: ${kw.code}, Reason: "${peer_text_shown(kw.reason, PEER_FRAME_SHOWN)}", Clean: ${kw.was_clean})`);
8892
+ const reason_shown = peer_text_shown(kw.reason === void 0 ? "" : kw.reason, PEER_FRAME_SHOWN);
8893
+ if (is_traffic_tracing(gobj)) trace_msg(`${gobj_short_name(gobj)}: WebSocket closed ${url} (Code: ${kw.code}, Reason: "${reason_shown}", Clean: ${kw.was_clean})`);
8730
8894
  if (priv.websocket) {
8731
8895
  priv.websocket.onopen = null;
8732
8896
  priv.websocket.onmessage = null;
@@ -8736,21 +8900,25 @@ var gobjJs = (function(exports) {
8736
8900
  }
8737
8901
  if (priv.inform_on_close) {
8738
8902
  priv.inform_on_close = false;
8903
+ if ((!kw.was_clean || kw.code !== 1e3 && kw.code !== 1001) && gobj_is_running(gobj)) log_warning(`${gobj_short_name(gobj)}: session closed ${url} (Code: ${kw.code}, Reason: "${reason_shown}", Clean: ${kw.was_clean})`);
8739
8904
  gobj_publish_event(gobj, "EV_ON_CLOSE", {
8740
8905
  url,
8741
8906
  remote_yuno_name: priv.remote_yuno_name,
8742
8907
  remote_yuno_role: priv.remote_yuno_role,
8743
- remote_yuno_service: priv.remote_yuno_service
8908
+ remote_yuno_service: priv.remote_yuno_service,
8909
+ code: kw.code,
8910
+ reason: reason_shown,
8911
+ was_clean: kw.was_clean
8744
8912
  });
8745
8913
  } else if (!gobj_is_running(gobj)) {} else {
8746
- log_warning(`${gobj_short_name(gobj)}: EV_ON_OPEN_ERROR cannot open ${url} (Code: ${kw.code}, Reason: "${peer_text_shown(kw.reason, PEER_FRAME_SHOWN)}", Clean: ${kw.was_clean})`);
8914
+ log_warning(`${gobj_short_name(gobj)}: EV_ON_OPEN_ERROR cannot open ${url} (Code: ${kw.code}, Reason: "${reason_shown}", Clean: ${kw.was_clean})`);
8747
8915
  gobj_publish_event(gobj, "EV_ON_OPEN_ERROR", {
8748
8916
  url,
8749
8917
  remote_yuno_name: priv.remote_yuno_name,
8750
8918
  remote_yuno_role: priv.remote_yuno_role,
8751
8919
  remote_yuno_service: priv.remote_yuno_service,
8752
8920
  code: kw.code,
8753
- reason: kw.reason,
8921
+ reason: reason_shown,
8754
8922
  was_clean: kw.was_clean
8755
8923
  });
8756
8924
  }
@@ -8859,9 +9027,9 @@ var gobjJs = (function(exports) {
8859
9027
  let iev_event = iev_msg.event;
8860
9028
  let iev_kw = iev_msg.kw;
8861
9029
  if (gobj_current_state(gobj) !== "ST_SESSION") {
8862
- if (gobj_has_event(gobj, iev_event, event_flag_t.EVF_PUBLIC_EVENT)) {
8863
- if (!(gobj_send_event(gobj, iev_event, iev_kw, gobj) < 0)) return 0;
8864
- } else log_error(`${gobj_short_name(gobj)}: event UNKNOWN in not-session state ${peer_text_shown(iev_event, PEER_NAME_SHOWN)}`);
9030
+ if (String(iev_event).toLowerCase() === "ev_identity_card_ack") {
9031
+ if (!(gobj_send_event(gobj, "EV_IDENTITY_CARD_ACK", iev_kw, gobj) < 0)) return 0;
9032
+ } else log_warning(`${gobj_short_name(gobj)}: event UNKNOWN in not-session state ${peer_text_shown(iev_event, PEER_NAME_SHOWN)}`);
8865
9033
  close_websocket(gobj);
8866
9034
  return -1;
8867
9035
  }
@@ -8869,9 +9037,16 @@ var gobjJs = (function(exports) {
8869
9037
  let msg_type = msg_iev_get_msg_type(gobj, iev_kw);
8870
9038
  let event_id = msg_iev_get_stack(gobj, iev_kw, IEVENT_STACK_ID);
8871
9039
  let iev_dst_role = kw_get_str(gobj, event_id, "dst_role", "");
8872
- if (iev_dst_role.toLowerCase() !== gobj_yuno_role().toLowerCase()) {
8873
- log_error(`"It's not my role, dst_role: ${peer_text_shown(iev_dst_role, PEER_NAME_SHOWN)}, my_role: ${gobj_yuno_role()}`);
8874
- return 0;
9040
+ if (!empty_string(iev_dst_role) && iev_dst_role.toLowerCase() !== String(gobj_yuno_role()).toLowerCase()) {
9041
+ log_warning(`${gobj_short_name(gobj)}: It's not my role, dst_role: ${peer_text_shown(iev_dst_role, PEER_NAME_SHOWN)}, my_role: ${gobj_yuno_role()}, event: ${peer_text_shown(iev_event, PEER_NAME_SHOWN)}`);
9042
+ close_websocket(gobj);
9043
+ return -1;
9044
+ }
9045
+ let iev_dst_yuno = kw_get_str(gobj, event_id, "dst_yuno", "");
9046
+ if (!empty_string(iev_dst_yuno) && iev_dst_yuno.toLowerCase() !== String(gobj_yuno_name()).toLowerCase()) {
9047
+ log_warning(`${gobj_short_name(gobj)}: It's not my name, dst_yuno: ${peer_text_shown(iev_dst_yuno, PEER_NAME_SHOWN)}, my_name: ${gobj_yuno_name()}, event: ${peer_text_shown(iev_event, PEER_NAME_SHOWN)}`);
9048
+ close_websocket(gobj);
9049
+ return -1;
8875
9050
  }
8876
9051
  let iev_dst_service = kw_get_str(gobj, event_id, "dst_service", "");
8877
9052
  if (msg_type === "__subscribing__") {
@@ -8893,13 +9068,18 @@ var gobjJs = (function(exports) {
8893
9068
  return 0;
8894
9069
  }
8895
9070
  if (!gobj_has_event(gobj_service, iev_event, event_flag_t.EVF_PUBLIC_EVENT)) {
8896
- log_error(`${gobj_short_name(gobj)}: Service found but no event or not public, service '${gobj_short_name(gobj_service)}', ev '${peer_text_shown(iev_event, PEER_NAME_SHOWN)}'`);
9071
+ log_warning(`${gobj_short_name(gobj)}: Service found but no event or not public, DROPPED: service '${gobj_short_name(gobj_service)}', ev '${peer_text_shown(iev_event, PEER_NAME_SHOWN)}'`);
8897
9072
  return -1;
8898
9073
  }
8899
9074
  gobj_send_event(gobj_service, iev_event, iev_kw, gobj);
8900
9075
  return 0;
8901
9076
  }
8902
- gobj_publish_event(gobj, iev_event, iev_kw);
9077
+ let event_type = gobj_find_event_type(iev_event, 0, false);
9078
+ if (!event_type) {
9079
+ log_warning(`${gobj_short_name(gobj)}: event that no gclass declares, DROPPED: ev '${peer_text_shown(iev_event, PEER_NAME_SHOWN)}'`);
9080
+ return -1;
9081
+ }
9082
+ gobj_publish_event(gobj, event_type.event_name, iev_kw);
8903
9083
  return 0;
8904
9084
  }
8905
9085
  /***************************************************************************
@@ -9114,6 +9294,7 @@ var gobjJs = (function(exports) {
9114
9294
  exports.gobj_deliver_posted_events = gobj_deliver_posted_events;
9115
9295
  exports.gobj_destroy = gobj_destroy;
9116
9296
  exports.gobj_find_child = gobj_find_child;
9297
+ exports.gobj_find_event_type = gobj_find_event_type;
9117
9298
  exports.gobj_find_gobj = gobj_find_gobj;
9118
9299
  exports.gobj_find_service = gobj_find_service;
9119
9300
  exports.gobj_find_subscribings = gobj_find_subscribings;