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