@yuneta/gobj-js 7.26.3 → 7.26.5

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.
@@ -4004,6 +4004,12 @@ function set_own_key(obj, key, value) {
4004
4004
  * called gobj_short_name() on a null gobj ("gobj bad type"), and a
4005
4005
  * null middle segment threw a TypeError.
4006
4006
  ************************************************************/
4007
+ function list_segment_index(list, seg) {
4008
+ if (!/^[0-9]+$/.test(seg)) return -1;
4009
+ const idx = Number(seg);
4010
+ if (idx >= list.length) return -1;
4011
+ return idx;
4012
+ }
4007
4013
  function kw_find_path(gobj, kw, path, verbose) {
4008
4014
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
4009
4015
  const prefix = gobj ? `${gobj_short_name(gobj)}: ` : "";
@@ -4019,11 +4025,12 @@ function kw_find_path(gobj, kw, path, verbose) {
4019
4025
  let len = ss.length;
4020
4026
  for (let i = 0; i < len; i++) {
4021
4027
  if (is_array(kw)) {
4022
- if (!/^[0-9]+$/.test(ss[i])) {
4028
+ const idx = list_segment_index(kw, ss[i]);
4029
+ if (idx < 0) {
4023
4030
  if (verbose) log_error(`${prefix}path not found: '${path}'`);
4024
4031
  return;
4025
4032
  }
4026
- ss[i] = String(Number(ss[i]));
4033
+ ss[i] = String(idx);
4027
4034
  }
4028
4035
  if (is_prototype_segment(kw, ss[i])) {
4029
4036
  if (verbose) log_error(`${prefix}path not found: '${path}'`);
@@ -4058,8 +4065,14 @@ function strrchr_split(str, char) {
4058
4065
  function kw_delete(gobj, kw, path) {
4059
4066
  if (gobj && !is_gobj(gobj)) log_error(`GObj bad instanceof`);
4060
4067
  let [path_, k] = strrchr_split(path, "`");
4061
- if (!empty_string(k)) json_object_del(kw_find_path(gobj, kw, path_, true), k);
4062
- else json_object_del(kw, path);
4068
+ if (!empty_string(k)) {
4069
+ let v = kw_find_path(gobj, kw, path_, true);
4070
+ if (is_array(v)) {
4071
+ log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}kw_delete(): cannot delete an item of a list: '${path}'`);
4072
+ return -1;
4073
+ }
4074
+ json_object_del(v, k);
4075
+ } else json_object_del(kw, path);
4063
4076
  return 0;
4064
4077
  }
4065
4078
  /************************************************************
@@ -4415,6 +4428,14 @@ function kw_set_dict_value(gobj, kw, path, value) {
4415
4428
  let len = ss.length;
4416
4429
  for (let i = 0; i < len; i++) {
4417
4430
  let key = ss[i];
4431
+ if (is_array(kw)) {
4432
+ const idx = list_segment_index(kw, key);
4433
+ if (idx < 0) {
4434
+ log_error(`${gobj ? gobj_short_name(gobj) + ": " : ""}kw_set_dict_value(): segment '${key}' is not an index of its list: '${path}'`);
4435
+ return -1;
4436
+ }
4437
+ key = String(idx);
4438
+ }
4418
4439
  if (i === len - 1) set_own_key(kw, key, value);
4419
4440
  else {
4420
4441
  let seg = is_prototype_segment(kw, key) ? void 0 : kw[key];
@@ -6579,7 +6600,7 @@ function create_template_record(template, kw) {
6579
6600
  let default_value;
6580
6601
  if (is_object(col)) default_value = col.default;
6581
6602
  let value = kw_get_dict_value(null, kw, field, default_value);
6582
- new_record[field] = value;
6603
+ json_object_set(new_record, field, value);
6583
6604
  });
6584
6605
  return new_record;
6585
6606
  }
@@ -7301,13 +7322,13 @@ function setup_websocket(gobj) {
7301
7322
  websocket = new WebSocket(url);
7302
7323
  } catch (e) {
7303
7324
  log_error(`${gobj_short_name(gobj)}: Cannot open WebSocket to '${url}', Error: ${e.message}`);
7304
- gobj_post_event(gobj, "EV_ON_CLOSE", {
7325
+ if (gobj_post_event(gobj, "EV_ON_CLOSE", {
7305
7326
  url,
7306
7327
  ws_seq,
7307
7328
  code: 1006,
7308
7329
  reason: e.message,
7309
7330
  was_clean: false
7310
- }, gobj);
7331
+ }, gobj) < 0) set_timeout(gobj.priv.gobj_timer, next_retry(gobj));
7311
7332
  return null;
7312
7333
  }
7313
7334
  if (!websocket) {