@yuneta/gobj-js 7.26.25 → 7.26.27
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/README.md +65 -11
- package/dist/gobj-js.cjs.js +277 -77
- package/dist/gobj-js.cjs.js.map +1 -1
- package/dist/gobj-js.cjs.min.js +1685 -1563
- package/dist/gobj-js.cjs.min.js.map +1 -1
- package/dist/gobj-js.es.js +277 -78
- package/dist/gobj-js.es.js.map +1 -1
- package/dist/gobj-js.es.min.js +1716 -1594
- package/dist/gobj-js.es.min.js.map +1 -1
- package/dist/gobj-js.iife.js +277 -77
- package/dist/gobj-js.iife.js.map +1 -1
- package/dist/gobj-js.iife.min.js +1685 -1563
- package/dist/gobj-js.iife.min.js.map +1 -1
- package/dist/gobj-js.umd.js +277 -77
- package/dist/gobj-js.umd.js.map +1 -1
- package/dist/gobj-js.umd.min.js +1685 -1563
- package/dist/gobj-js.umd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/gobj-js.es.js
CHANGED
|
@@ -978,11 +978,14 @@ function value_has_shape(type, value) {
|
|
|
978
978
|
if (DTP_IS_NUMBER(type)) return typeof value === "number" || typeof value === "boolean";
|
|
979
979
|
return true;
|
|
980
980
|
}
|
|
981
|
+
function is_int64_number(value) {
|
|
982
|
+
return value >= -0x8000000000000000 && value < 0x8000000000000000;
|
|
983
|
+
}
|
|
981
984
|
function shape_of_value(value) {
|
|
982
985
|
if (is_array(value)) return "an array";
|
|
983
986
|
if (is_object(value)) return "an object";
|
|
984
987
|
if (is_string(value)) return REFUSED_TEXT;
|
|
985
|
-
if (typeof value === "number") return Number.isInteger(value) &&
|
|
988
|
+
if (typeof value === "number") return Number.isInteger(value) && is_int64_number(value) ? "an integer" : "a real";
|
|
986
989
|
if (typeof value === "boolean") return "a boolean";
|
|
987
990
|
return "null";
|
|
988
991
|
}
|
|
@@ -1003,7 +1006,7 @@ function number_as_type(type, value) {
|
|
|
1003
1006
|
value: value ? 1 : 0,
|
|
1004
1007
|
refused: null
|
|
1005
1008
|
};
|
|
1006
|
-
if (!(value
|
|
1009
|
+
if (!is_int64_number(value)) return {
|
|
1007
1010
|
value: void 0,
|
|
1008
1011
|
refused: "a number out of its range"
|
|
1009
1012
|
};
|
|
@@ -1068,8 +1071,13 @@ function text2parameter(type, s, from_kw) {
|
|
|
1068
1071
|
value: n !== 0n,
|
|
1069
1072
|
refused: null
|
|
1070
1073
|
};
|
|
1074
|
+
const v = Number(n);
|
|
1075
|
+
if (!is_int64_number(v)) return {
|
|
1076
|
+
value: void 0,
|
|
1077
|
+
refused: "a number out of its range"
|
|
1078
|
+
};
|
|
1071
1079
|
return {
|
|
1072
|
-
value:
|
|
1080
|
+
value: v,
|
|
1073
1081
|
refused: null
|
|
1074
1082
|
};
|
|
1075
1083
|
}
|
|
@@ -1128,6 +1136,16 @@ function command_parameter_from_text(type, text) {
|
|
|
1128
1136
|
* undefined, or an empty text given to a number).
|
|
1129
1137
|
***************************************************************************/
|
|
1130
1138
|
function command_parameter_from_json(type, value) {
|
|
1139
|
+
try {
|
|
1140
|
+
return parameter_from_json(type, value);
|
|
1141
|
+
} catch (e) {
|
|
1142
|
+
return {
|
|
1143
|
+
value: void 0,
|
|
1144
|
+
refused: NO_JSON_TEXT
|
|
1145
|
+
};
|
|
1146
|
+
}
|
|
1147
|
+
}
|
|
1148
|
+
function parameter_from_json(type, value) {
|
|
1131
1149
|
if (value === void 0 || value === null) {
|
|
1132
1150
|
if (DTP_IS_JSON(type) && value === null) return {
|
|
1133
1151
|
value: null,
|
|
@@ -1186,31 +1204,63 @@ var TYPES_READ = [
|
|
|
1186
1204
|
data_type_t.DTP_LIST,
|
|
1187
1205
|
data_type_t.DTP_DICT
|
|
1188
1206
|
];
|
|
1189
|
-
|
|
1190
|
-
|
|
1191
|
-
|
|
1192
|
-
|
|
1193
|
-
|
|
1194
|
-
|
|
1195
|
-
|
|
1196
|
-
|
|
1197
|
-
|
|
1207
|
+
function is_plain_object$1(v) {
|
|
1208
|
+
const proto = Object.getPrototypeOf(v);
|
|
1209
|
+
if (proto === Object.prototype || proto === null) return true;
|
|
1210
|
+
if (Object.getPrototypeOf(proto) !== null || !Object.prototype.hasOwnProperty.call(proto, "constructor")) return false;
|
|
1211
|
+
const ctor = proto.constructor;
|
|
1212
|
+
return typeof ctor === "function" && ctor.name === "Object";
|
|
1213
|
+
}
|
|
1214
|
+
function json_scalar_or_container(v) {
|
|
1215
|
+
switch (typeof v) {
|
|
1216
|
+
case "string":
|
|
1217
|
+
case "boolean": return true;
|
|
1218
|
+
case "number": return Number.isFinite(v);
|
|
1219
|
+
case "object": return v === null ? true : null;
|
|
1220
|
+
default: return false;
|
|
1221
|
+
}
|
|
1222
|
+
}
|
|
1223
|
+
function is_json_node(value) {
|
|
1224
|
+
const top = json_scalar_or_container(value);
|
|
1225
|
+
if (top !== null) return top;
|
|
1226
|
+
const values = [value];
|
|
1227
|
+
const levels = [1];
|
|
1228
|
+
while (values.length) {
|
|
1229
|
+
const v = values.pop();
|
|
1230
|
+
const level = levels.pop() + 1;
|
|
1231
|
+
let children;
|
|
1232
|
+
if (Array.isArray(v)) {
|
|
1233
|
+
if (typeof v.toJSON === "function") return false;
|
|
1234
|
+
children = v;
|
|
1235
|
+
} else {
|
|
1236
|
+
if (!is_plain_object$1(v) || typeof v.toJSON === "function") return false;
|
|
1237
|
+
children = [];
|
|
1238
|
+
for (const key of Object.keys(v)) {
|
|
1239
|
+
const x = v[key];
|
|
1240
|
+
if (x === void 0 || typeof x === "function" || typeof x === "symbol") continue;
|
|
1241
|
+
children.push(x);
|
|
1242
|
+
}
|
|
1198
1243
|
}
|
|
1199
|
-
if (
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1244
|
+
if (children.length > 0 && level > JSON_MAX_DEPTH) return false;
|
|
1245
|
+
for (let i = 0; i < children.length; i++) {
|
|
1246
|
+
const x = children[i];
|
|
1247
|
+
const r = json_scalar_or_container(x);
|
|
1248
|
+
if (r === false) return false;
|
|
1249
|
+
if (r === null) {
|
|
1250
|
+
values.push(x);
|
|
1251
|
+
levels.push(level);
|
|
1252
|
+
}
|
|
1206
1253
|
}
|
|
1207
|
-
on_path.add(v);
|
|
1208
|
-
stack.push(v, LEAVE_NODE);
|
|
1209
|
-
if (array) for (let i = 0; i < v.length; i++) stack.push(v[i]);
|
|
1210
|
-
else for (const key of Object.keys(v)) stack.push(v[key]);
|
|
1211
1254
|
}
|
|
1212
1255
|
return true;
|
|
1213
1256
|
}
|
|
1257
|
+
function is_json_value(value) {
|
|
1258
|
+
try {
|
|
1259
|
+
return is_json_node(value);
|
|
1260
|
+
} catch (e) {
|
|
1261
|
+
return false;
|
|
1262
|
+
}
|
|
1263
|
+
}
|
|
1214
1264
|
var NO_JSON_TEXT = "a value with no json text";
|
|
1215
1265
|
function json_text_of(value) {
|
|
1216
1266
|
if (!is_json_value(value)) return;
|
|
@@ -2341,11 +2391,13 @@ function rc_walk_by_list(iter_, walk_type, cb_walking, user_data, user_data2) {
|
|
|
2341
2391
|
let child;
|
|
2342
2392
|
if (walk_type & walk_type_t.WALK_LAST2FIRST) for (let i = iter.length; i > 0; i--) {
|
|
2343
2393
|
child = iter[i - 1];
|
|
2394
|
+
if (gobj_is_destroying(child)) continue;
|
|
2344
2395
|
let ret = walk_ret(cb_walking(child, user_data, user_data2));
|
|
2345
2396
|
if (ret < 0) return ret;
|
|
2346
2397
|
}
|
|
2347
2398
|
else for (let i = 0; i < iter.length; i++) {
|
|
2348
2399
|
child = iter[i];
|
|
2400
|
+
if (gobj_is_destroying(child)) continue;
|
|
2349
2401
|
let ret = walk_ret(cb_walking(child, user_data, user_data2));
|
|
2350
2402
|
if (ret < 0) return ret;
|
|
2351
2403
|
}
|
|
@@ -2360,18 +2412,21 @@ function rc_walk_by_list(iter_, walk_type, cb_walking, user_data, user_data2) {
|
|
|
2360
2412
|
* or
|
|
2361
2413
|
* WALK_LAST2FIRST
|
|
2362
2414
|
***************************************************************/
|
|
2363
|
-
function rc_walk_by_level(
|
|
2415
|
+
function rc_walk_by_level(iter_, walk_type, cb_walking, user_data, user_data2) {
|
|
2416
|
+
let iter = [...iter_];
|
|
2364
2417
|
let ret = rc_walk_by_list(iter, walk_type, cb_walking, user_data, user_data2);
|
|
2365
2418
|
if (ret < 0) return ret;
|
|
2366
2419
|
let child;
|
|
2367
2420
|
if (walk_type & walk_type_t.WALK_LAST2FIRST) for (let i = iter.length; i > 0; i--) {
|
|
2368
2421
|
child = iter[i - 1];
|
|
2369
|
-
|
|
2422
|
+
if (gobj_is_destroying(child)) continue;
|
|
2423
|
+
ret = rc_walk_by_level(child.dl_children, walk_type, cb_walking, user_data, user_data2);
|
|
2370
2424
|
if (ret < 0) return ret;
|
|
2371
2425
|
}
|
|
2372
2426
|
else for (let i = 0; i < iter.length; i++) {
|
|
2373
2427
|
child = iter[i];
|
|
2374
|
-
|
|
2428
|
+
if (gobj_is_destroying(child)) continue;
|
|
2429
|
+
ret = rc_walk_by_level(child.dl_children, walk_type, cb_walking, user_data, user_data2);
|
|
2375
2430
|
if (ret < 0) return ret;
|
|
2376
2431
|
}
|
|
2377
2432
|
return ret;
|
|
@@ -2391,23 +2446,27 @@ function rc_walk_by_level(iter, walk_type, cb_walking, user_data, user_data2) {
|
|
|
2391
2446
|
* or
|
|
2392
2447
|
* WALK_LAST2FIRST
|
|
2393
2448
|
***************************************************************/
|
|
2394
|
-
function rc_walk_by_tree(
|
|
2395
|
-
if (walk_type & walk_type_t.WALK_BYLEVEL) return rc_walk_by_level(
|
|
2449
|
+
function rc_walk_by_tree(iter_, walk_type, cb_walking, user_data, user_data2) {
|
|
2450
|
+
if (walk_type & walk_type_t.WALK_BYLEVEL) return rc_walk_by_level(iter_, walk_type, cb_walking, user_data, user_data2);
|
|
2451
|
+
let iter = [...iter_];
|
|
2396
2452
|
let ret;
|
|
2397
2453
|
let child;
|
|
2398
2454
|
if (walk_type & walk_type_t.WALK_BOTTOM2TOP) for (let i = iter.length; i > 0; i--) {
|
|
2399
2455
|
child = iter[i - 1];
|
|
2400
|
-
|
|
2456
|
+
if (gobj_is_destroying(child)) continue;
|
|
2457
|
+
ret = rc_walk_by_tree(child.dl_children, walk_type, cb_walking, user_data, user_data2);
|
|
2401
2458
|
if (ret < 0) return ret;
|
|
2459
|
+
if (gobj_is_destroying(child)) continue;
|
|
2402
2460
|
ret = walk_ret(cb_walking(child, user_data, user_data2));
|
|
2403
2461
|
if (ret < 0) return ret;
|
|
2404
2462
|
}
|
|
2405
2463
|
else for (let i = 0; i < iter.length; i++) {
|
|
2406
2464
|
child = iter[i];
|
|
2465
|
+
if (gobj_is_destroying(child)) continue;
|
|
2407
2466
|
ret = walk_ret(cb_walking(child, user_data, user_data2));
|
|
2408
2467
|
if (ret < 0) return ret;
|
|
2409
|
-
else if (ret === 0) {
|
|
2410
|
-
ret = rc_walk_by_tree(
|
|
2468
|
+
else if (ret === 0 && !gobj_is_destroying(child)) {
|
|
2469
|
+
ret = rc_walk_by_tree(child.dl_children, walk_type, cb_walking, user_data, user_data2);
|
|
2411
2470
|
if (ret < 0) return ret;
|
|
2412
2471
|
}
|
|
2413
2472
|
}
|
|
@@ -4724,6 +4783,7 @@ function mark_inline_rules_of_now(str, marks) {
|
|
|
4724
4783
|
mark_labels(str, marks);
|
|
4725
4784
|
}
|
|
4726
4785
|
var MASK_MAX_DECODINGS = 2;
|
|
4786
|
+
var VIEW_CHUNK = 8192;
|
|
4727
4787
|
function encoded_ascii_at(str, p) {
|
|
4728
4788
|
if (p + 3 > str.length || str.charCodeAt(p) !== 37) return -1;
|
|
4729
4789
|
const hi = hex_digit_value(str.charCodeAt(p + 1));
|
|
@@ -4734,28 +4794,30 @@ function encoded_ascii_at(str, p) {
|
|
|
4734
4794
|
}
|
|
4735
4795
|
function mark_decoded_view(str, marks, decodings) {
|
|
4736
4796
|
if (decodings >= MASK_MAX_DECODINGS) return;
|
|
4737
|
-
|
|
4738
|
-
|
|
4739
|
-
|
|
4740
|
-
|
|
4741
|
-
|
|
4797
|
+
let first = str.indexOf("%");
|
|
4798
|
+
while (first >= 0 && encoded_ascii_at(str, first) < 0) first = str.indexOf("%", first + 1);
|
|
4799
|
+
if (first < 0) return;
|
|
4800
|
+
const codes = new Uint16Array(str.length - first);
|
|
4801
|
+
let n = 0;
|
|
4802
|
+
for (let p = first; p < str.length; p++) {
|
|
4803
|
+
const code = str.charCodeAt(p);
|
|
4804
|
+
const c = code === 37 ? encoded_ascii_at(str, p) : -1;
|
|
4742
4805
|
if (c >= 0) {
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
|
|
4746
|
-
|
|
4747
|
-
|
|
4748
|
-
|
|
4749
|
-
|
|
4750
|
-
const view = pieces.join("");
|
|
4806
|
+
codes[n++] = c;
|
|
4807
|
+
p += 2;
|
|
4808
|
+
} else codes[n++] = code;
|
|
4809
|
+
}
|
|
4810
|
+
const chunks = [str.substring(0, first)];
|
|
4811
|
+
for (let k = 0; k < n; k += VIEW_CHUNK) chunks.push(String.fromCharCode.apply(null, codes.subarray(k, Math.min(n, k + VIEW_CHUNK))));
|
|
4812
|
+
const view = chunks.join("");
|
|
4751
4813
|
const view_marks = new Uint8Array(view.length);
|
|
4752
4814
|
mark_inline_rules_of_now(view, view_marks);
|
|
4753
4815
|
mark_decoded_view(view, view_marks, decodings + 1);
|
|
4754
4816
|
let q = 0;
|
|
4755
4817
|
for (let i = 0; i < view.length; i++) {
|
|
4756
|
-
const
|
|
4757
|
-
if (view_marks[i]) mark_range(marks, q, q +
|
|
4758
|
-
q +=
|
|
4818
|
+
const n_from = encoded_ascii_at(str, q) >= 0 ? 3 : 1;
|
|
4819
|
+
if (view_marks[i]) mark_range(marks, q, q + n_from);
|
|
4820
|
+
q += n_from;
|
|
4759
4821
|
}
|
|
4760
4822
|
}
|
|
4761
4823
|
function mark_inline_secrets(str, marks) {
|
|
@@ -5989,21 +6051,88 @@ function kw_clone_by_not_keys(gobj, kw, keys, verbose) {
|
|
|
5989
6051
|
return kw_clone;
|
|
5990
6052
|
}
|
|
5991
6053
|
/********************************************
|
|
6054
|
+
* The browser's localStorage, or null when there is none (outside a
|
|
6055
|
+
* browser).
|
|
6056
|
+
*
|
|
6057
|
+
* With the site's data blocked (Chrome with cookies blocked, a sandboxed
|
|
6058
|
+
* iframe), READING the window.localStorage property already throws a
|
|
6059
|
+
* SecurityError, not only its getItem(): every app reads its locale at
|
|
6060
|
+
* start, so the app did not start. Such a store is answered as one whose
|
|
6061
|
+
* every call throws that error, so each helper fails as it fails for any
|
|
6062
|
+
* store that refuses it: a read gives the default, a write -1.
|
|
6063
|
+
********************************************/
|
|
6064
|
+
function local_store() {
|
|
6065
|
+
if (typeof window === "undefined") return null;
|
|
6066
|
+
let store;
|
|
6067
|
+
try {
|
|
6068
|
+
store = window.localStorage;
|
|
6069
|
+
} catch (e) {
|
|
6070
|
+
const refuse = () => {
|
|
6071
|
+
throw e;
|
|
6072
|
+
};
|
|
6073
|
+
return {
|
|
6074
|
+
getItem: refuse,
|
|
6075
|
+
setItem: refuse,
|
|
6076
|
+
removeItem: refuse
|
|
6077
|
+
};
|
|
6078
|
+
}
|
|
6079
|
+
return store || null;
|
|
6080
|
+
}
|
|
6081
|
+
/********************************************
|
|
6082
|
+
* A failure of the store that would repeat on every read is warned
|
|
6083
|
+
* once per key, until a read of the key goes well again.
|
|
6084
|
+
********************************************/
|
|
6085
|
+
var local_storage_warned = /* @__PURE__ */ new Set();
|
|
6086
|
+
function warn_local_storage_once(key, msg) {
|
|
6087
|
+
if (local_storage_warned.has(key)) return;
|
|
6088
|
+
local_storage_warned.add(key);
|
|
6089
|
+
log_warning(msg);
|
|
6090
|
+
}
|
|
6091
|
+
/********************************************
|
|
5992
6092
|
* Get a local attribute
|
|
6093
|
+
*
|
|
6094
|
+
* The json the entry holds, or `default_value` when there is none
|
|
6095
|
+
* (written there too with `create`). A json null is no value, as
|
|
6096
|
+
* json_absent() in C: the default. An entry that is not json (a
|
|
6097
|
+
* corrupt or foreign write) is a WARNING and is REMOVED, so the
|
|
6098
|
+
* next read finds no entry: it used to console.warn on every read,
|
|
6099
|
+
* for ever; a new corrupt entry is a new WARNING. Its text is never
|
|
6100
|
+
* shown (JSON.parse() quotes it in its error, and an entry can hold a
|
|
6101
|
+
* token). A store that cannot be read (blocked) is warned once per
|
|
6102
|
+
* key, and the default is NOT written there. Outside a browser: the
|
|
6103
|
+
* default.
|
|
5993
6104
|
********************************************/
|
|
5994
6105
|
function kw_get_local_storage_value(key, default_value, create = false) {
|
|
5995
|
-
|
|
6106
|
+
const store = local_store();
|
|
6107
|
+
if (!store) return default_value;
|
|
6108
|
+
const where = `kw_get_local_storage_value(): localStorage key "${key}"`;
|
|
6109
|
+
let text;
|
|
5996
6110
|
try {
|
|
5997
|
-
|
|
5998
|
-
if (value === null) {
|
|
5999
|
-
if (create) kw_set_local_storage_value(key, default_value);
|
|
6000
|
-
return default_value;
|
|
6001
|
-
}
|
|
6002
|
-
return JSON.parse(value);
|
|
6111
|
+
text = store.getItem(key);
|
|
6003
6112
|
} catch (e) {
|
|
6004
|
-
|
|
6113
|
+
warn_local_storage_once(key, `${where} cannot be read (storage blocked?): the default is used`);
|
|
6005
6114
|
return default_value;
|
|
6006
6115
|
}
|
|
6116
|
+
let value = null;
|
|
6117
|
+
if (text !== null) try {
|
|
6118
|
+
value = JSON.parse(text);
|
|
6119
|
+
} catch (e) {
|
|
6120
|
+
value = null;
|
|
6121
|
+
try {
|
|
6122
|
+
store.removeItem(key);
|
|
6123
|
+
log_warning(`${where} does not hold json: removed, the default is used`);
|
|
6124
|
+
local_storage_warned.delete(key);
|
|
6125
|
+
} catch (e2) {
|
|
6126
|
+
warn_local_storage_once(key, `${where} does not hold json and cannot be removed: the default is used`);
|
|
6127
|
+
}
|
|
6128
|
+
text = void 0;
|
|
6129
|
+
}
|
|
6130
|
+
if (text !== void 0) local_storage_warned.delete(key);
|
|
6131
|
+
if (value === null) {
|
|
6132
|
+
if (create) kw_set_local_storage_value(key, default_value);
|
|
6133
|
+
return default_value;
|
|
6134
|
+
}
|
|
6135
|
+
return value;
|
|
6007
6136
|
}
|
|
6008
6137
|
/********************************************
|
|
6009
6138
|
* Save a local attribute
|
|
@@ -6014,15 +6143,26 @@ function kw_get_local_storage_value(key, default_value, create = false) {
|
|
|
6014
6143
|
* reported success on a store that had rejected the write: a full or blocked
|
|
6015
6144
|
* localStorage (quota, private mode) silently discarded the change while the
|
|
6016
6145
|
* UI showed it as saved.
|
|
6146
|
+
*
|
|
6147
|
+
* A value with no json text is refused with an ERROR, as a typed writer
|
|
6148
|
+
* refuses it (json_text_of()): a function was stored as the text
|
|
6149
|
+
* "undefined", and a NaN, a Date or a Map as a text that reads back as
|
|
6150
|
+
* another value. Checked in Node.js too, where there is no store.
|
|
6017
6151
|
********************************************/
|
|
6018
6152
|
function kw_set_local_storage_value(key, value) {
|
|
6019
|
-
if (
|
|
6020
|
-
|
|
6021
|
-
log_error(`kw_set_local_storage_value(): invalid key or value: key=${key}`);
|
|
6153
|
+
if (!key) {
|
|
6154
|
+
log_error(`kw_set_local_storage_value(): invalid key: key=${key}`);
|
|
6022
6155
|
return -1;
|
|
6023
6156
|
}
|
|
6157
|
+
const text = json_text_of(value);
|
|
6158
|
+
if (text === void 0) {
|
|
6159
|
+
log_error(`kw_set_local_storage_value(): cannot save "${key}": a value with no json text`);
|
|
6160
|
+
return -1;
|
|
6161
|
+
}
|
|
6162
|
+
const store = local_store();
|
|
6163
|
+
if (!store) return 0;
|
|
6024
6164
|
try {
|
|
6025
|
-
|
|
6165
|
+
store.setItem(key, text);
|
|
6026
6166
|
return 0;
|
|
6027
6167
|
} catch (e) {
|
|
6028
6168
|
log_error(`kw_set_local_storage_value(): cannot save "${key}" (storage full or blocked?): ${e && e.message ? e.message : e}`);
|
|
@@ -6033,15 +6173,16 @@ function kw_set_local_storage_value(key, value) {
|
|
|
6033
6173
|
* Remove local attribute
|
|
6034
6174
|
********************************************/
|
|
6035
6175
|
function kw_remove_local_storage_value(key) {
|
|
6036
|
-
|
|
6176
|
+
const store = local_store();
|
|
6177
|
+
if (!store) return;
|
|
6037
6178
|
if (!key) {
|
|
6038
|
-
|
|
6179
|
+
log_error(`kw_remove_local_storage_value(): invalid key: key=${key}`);
|
|
6039
6180
|
return;
|
|
6040
6181
|
}
|
|
6041
6182
|
try {
|
|
6042
|
-
|
|
6183
|
+
store.removeItem(key);
|
|
6043
6184
|
} catch (e) {
|
|
6044
|
-
|
|
6185
|
+
log_warning(`kw_remove_local_storage_value(): cannot remove "${key}" (storage blocked?): ${e && e.message ? e.message : e}`);
|
|
6045
6186
|
}
|
|
6046
6187
|
}
|
|
6047
6188
|
/*************************************************************
|
|
@@ -7234,11 +7375,21 @@ function index_in_list(list, elm) {
|
|
|
7234
7375
|
************************************************************/
|
|
7235
7376
|
function node_uuid() {
|
|
7236
7377
|
let uuid = "";
|
|
7237
|
-
|
|
7238
|
-
|
|
7378
|
+
const store = local_store();
|
|
7379
|
+
if (store) {
|
|
7380
|
+
try {
|
|
7381
|
+
uuid = store.getItem("host_uuid");
|
|
7382
|
+
} catch (e) {
|
|
7383
|
+
uuid = null;
|
|
7384
|
+
warn_local_storage_once("host_uuid", "node_uuid(): localStorage cannot be read (storage blocked?): a uuid of this page only");
|
|
7385
|
+
}
|
|
7239
7386
|
if (!uuid && window.crypto?.randomUUID) {
|
|
7240
7387
|
uuid = window.crypto.randomUUID();
|
|
7241
|
-
|
|
7388
|
+
try {
|
|
7389
|
+
store.setItem("host_uuid", uuid);
|
|
7390
|
+
} catch (e) {
|
|
7391
|
+
warn_local_storage_once("host_uuid", "node_uuid(): localStorage cannot be written (storage full or blocked?): a uuid of this page only");
|
|
7392
|
+
}
|
|
7242
7393
|
}
|
|
7243
7394
|
} else if (typeof globalThis !== "undefined" && globalThis.crypto?.randomUUID) uuid = globalThis.crypto.randomUUID();
|
|
7244
7395
|
else uuid = "00000000-0000-0000-0000-000000000000";
|
|
@@ -8527,7 +8678,7 @@ var attrs_table = [
|
|
|
8527
8678
|
SDATA(data_type_t.DTP_STRING, "cert_pem", sdata_flag_t.SDF_PERSIST, "", "SSL server certification, PEM str format"),
|
|
8528
8679
|
SDATA(data_type_t.DTP_JSON, "extra_info", sdata_flag_t.SDF_RD, "{}", "dict data set by user, added to the identity card msg."),
|
|
8529
8680
|
SDATA(data_type_t.DTP_LIST, "required_services", sdata_flag_t.SDF_RD, "[]", "Services this LINK requires (identity card). Empty = the yuno's `required_services`, as before. A yuno with several links to DIFFERENT backends must set it per link: the yuno-wide list is the union, so every backend is told the service names of all the others."),
|
|
8530
|
-
SDATA(data_type_t.DTP_INTEGER, "timeout_retry", sdata_flag_t.SDF_RD, "5000", "First reconnect delay (ms). It BACKS OFF from here, doubling up to timeout_retry_max, and resets when a session is reached"),
|
|
8681
|
+
SDATA(data_type_t.DTP_INTEGER, "timeout_retry", sdata_flag_t.SDF_RD, "5000", "First reconnect delay (ms), at least 1000. It BACKS OFF from here, doubling up to timeout_retry_max, and resets when a session is reached"),
|
|
8531
8682
|
SDATA(data_type_t.DTP_INTEGER, "timeout_retry_max", sdata_flag_t.SDF_RD, "60000", "Cap of the reconnect backoff (ms). Set it equal to timeout_retry for the old fixed-interval behaviour"),
|
|
8532
8683
|
SDATA(data_type_t.DTP_INTEGER, "timeout_idack", sdata_flag_t.SDF_RD, "5000", "timeout waiting idAck"),
|
|
8533
8684
|
SDATA(data_type_t.DTP_POINTER, "subscriber", 0, 0, "subscriber of output-events. If null then subscriber is the parent"),
|
|
@@ -8551,7 +8702,9 @@ var PRIVATE_DATA = {
|
|
|
8551
8702
|
websocket: null,
|
|
8552
8703
|
inside_on_open: false,
|
|
8553
8704
|
retry_ms: 0,
|
|
8554
|
-
retry_ms_before_session: 0
|
|
8705
|
+
retry_ms_before_session: 0,
|
|
8706
|
+
session_since: 0,
|
|
8707
|
+
retry_floor_warned: false
|
|
8555
8708
|
};
|
|
8556
8709
|
var __gclass__ = null;
|
|
8557
8710
|
/******************************
|
|
@@ -8810,15 +8963,22 @@ function close_websocket(gobj, code = 1e3, reason = "") {
|
|
|
8810
8963
|
* protocol error, throws there), so it is 4002 -- and the server
|
|
8811
8964
|
* echoes it, so EV_ON_CLOSE carries it.
|
|
8812
8965
|
*
|
|
8813
|
-
* And a session the server broke was not a session reached:
|
|
8814
|
-
* backoff the ack reset is put back, or a server that breaks every
|
|
8966
|
+
* And a session the server broke at once was not a session reached:
|
|
8967
|
+
* the backoff the ack reset is put back, or a server that breaks every
|
|
8815
8968
|
* session is reconnected at the first delay for ever, with an
|
|
8816
|
-
* EV_ON_OPEN and an EV_ON_CLOSE in the app per round.
|
|
8969
|
+
* EV_ON_OPEN and an EV_ON_CLOSE in the app per round. A session that
|
|
8970
|
+
* outlived the longest delay of the backoff (`timeout_retry_max`) was
|
|
8971
|
+
* served: its fault starts the backoff over, as a clean end does, or
|
|
8972
|
+
* one foreign message hours later is waited for with a delay escalated
|
|
8973
|
+
* by failures long gone.
|
|
8817
8974
|
***************************************************************/
|
|
8818
8975
|
var CLOSE_PEER_FAULT = 4002;
|
|
8819
8976
|
function close_for_peer_fault(gobj, reason) {
|
|
8820
8977
|
let priv = gobj.priv;
|
|
8821
|
-
if (gobj_current_state(gobj) === "ST_SESSION")
|
|
8978
|
+
if (gobj_current_state(gobj) === "ST_SESSION") {
|
|
8979
|
+
if (performance.now() - priv.session_since < retry_bounds(gobj).max) priv.retry_ms = priv.retry_ms_before_session;
|
|
8980
|
+
priv.retry_ms_before_session = 0;
|
|
8981
|
+
}
|
|
8822
8982
|
close_websocket(gobj, CLOSE_PEER_FAULT, reason);
|
|
8823
8983
|
}
|
|
8824
8984
|
/***************************************************************
|
|
@@ -9088,6 +9248,32 @@ function ac_on_close(gobj, event, kw, src) {
|
|
|
9088
9248
|
return 0;
|
|
9089
9249
|
}
|
|
9090
9250
|
/***************************************************************
|
|
9251
|
+
* The first delay of the backoff and its cap.
|
|
9252
|
+
*
|
|
9253
|
+
* A first delay below RETRY_FLOOR_MS is raised to it, with a WARNING
|
|
9254
|
+
* once: `timeout_retry` 0 never left 0 (0 doubled is 0), so a server
|
|
9255
|
+
* that closed before the ack was reconnected in a loop with no wait,
|
|
9256
|
+
* hundreds of connections a second.
|
|
9257
|
+
***************************************************************/
|
|
9258
|
+
var RETRY_FLOOR_MS = 1e3;
|
|
9259
|
+
function retry_bounds(gobj) {
|
|
9260
|
+
let priv = gobj.priv;
|
|
9261
|
+
let base = gobj_read_integer_attr(gobj, "timeout_retry");
|
|
9262
|
+
let max = gobj_read_integer_attr(gobj, "timeout_retry_max");
|
|
9263
|
+
if (!(base >= RETRY_FLOOR_MS)) {
|
|
9264
|
+
if (!priv.retry_floor_warned) {
|
|
9265
|
+
priv.retry_floor_warned = true;
|
|
9266
|
+
log_warning(`${gobj_short_name(gobj)}: timeout_retry ${base} ms is below ${RETRY_FLOOR_MS} ms: ${RETRY_FLOOR_MS} ms is used`);
|
|
9267
|
+
}
|
|
9268
|
+
base = RETRY_FLOOR_MS;
|
|
9269
|
+
}
|
|
9270
|
+
if (!(max >= base)) max = base;
|
|
9271
|
+
return {
|
|
9272
|
+
base,
|
|
9273
|
+
max
|
|
9274
|
+
};
|
|
9275
|
+
}
|
|
9276
|
+
/***************************************************************
|
|
9091
9277
|
* How long to wait before the next reconnect attempt.
|
|
9092
9278
|
*
|
|
9093
9279
|
* The delay used to be a constant (`timeout_retry`, 5s), for ever. A
|
|
@@ -9108,9 +9294,7 @@ function ac_on_close(gobj, event, kw, src) {
|
|
|
9108
9294
|
***************************************************************/
|
|
9109
9295
|
function next_retry(gobj) {
|
|
9110
9296
|
let priv = gobj.priv;
|
|
9111
|
-
|
|
9112
|
-
let max = gobj_read_integer_attr(gobj, "timeout_retry_max");
|
|
9113
|
-
if (max < base) max = base;
|
|
9297
|
+
const { base, max } = retry_bounds(gobj);
|
|
9114
9298
|
priv.retry_ms = priv.retry_ms ? Math.min(priv.retry_ms * 2, max) : base;
|
|
9115
9299
|
let jitter = priv.retry_ms * .2;
|
|
9116
9300
|
let ms = priv.retry_ms - jitter + Math.random() * 2 * jitter;
|
|
@@ -9156,6 +9340,7 @@ function ac_identity_card_ack(gobj, event, kw, src) {
|
|
|
9156
9340
|
priv.inside_on_open = true;
|
|
9157
9341
|
priv.retry_ms_before_session = priv.retry_ms;
|
|
9158
9342
|
priv.retry_ms = 0;
|
|
9343
|
+
priv.session_since = performance.now();
|
|
9159
9344
|
if (!priv.inform_on_close) {
|
|
9160
9345
|
priv.inform_on_close = true;
|
|
9161
9346
|
gobj_publish_event(gobj, "EV_ON_OPEN", {
|
|
@@ -9253,16 +9438,30 @@ function ac_on_message(gobj, event, kw, src) {
|
|
|
9253
9438
|
return 0;
|
|
9254
9439
|
}
|
|
9255
9440
|
/***************************************************************************
|
|
9441
|
+
* The server asking this client for stats or a command. The C client
|
|
9442
|
+
* serves them (gobj_stats() / gobj_command() of the service named, and
|
|
9443
|
+
* an answer); a browser client does not run what its server asks, so it
|
|
9444
|
+
* is refused: a WARNING naming what was asked, masked (a command line
|
|
9445
|
+
* can carry a secret), and nothing else -- the protocol allows the ask,
|
|
9446
|
+
* so the session goes on. Up to 7.26.25 it was dropped without a trace.
|
|
9447
|
+
***************************************************************************/
|
|
9448
|
+
function refuse_asked_by_server(gobj, event, kw, key) {
|
|
9449
|
+
const asked = kw && typeof kw[key] === "string" ? kw[key] : "";
|
|
9450
|
+
const service = kw && typeof kw.service === "string" ? kw.service : "";
|
|
9451
|
+
log_warning(`${gobj_short_name(gobj)}: ${event} not served by this client, DROPPED: ${key.replace(/_/g, "")} '${peer_text_shown(asked, PEER_NAME_SHOWN)}', service '${peer_text_shown(service, PEER_NAME_SHOWN)}'`);
|
|
9452
|
+
return -1;
|
|
9453
|
+
}
|
|
9454
|
+
/***************************************************************************
|
|
9256
9455
|
* remote asking for stats
|
|
9257
9456
|
***************************************************************************/
|
|
9258
9457
|
function ac_mt_stats(gobj, event, kw, src) {
|
|
9259
|
-
return
|
|
9458
|
+
return refuse_asked_by_server(gobj, event, kw, "__stats__");
|
|
9260
9459
|
}
|
|
9261
9460
|
/***************************************************************************
|
|
9262
9461
|
* remote asking for command
|
|
9263
9462
|
***************************************************************************/
|
|
9264
9463
|
function ac_mt_command(gobj, event, kw, src) {
|
|
9265
|
-
return
|
|
9464
|
+
return refuse_asked_by_server(gobj, event, kw, "__command__");
|
|
9266
9465
|
}
|
|
9267
9466
|
/***************************
|
|
9268
9467
|
* FSM
|
|
@@ -9388,6 +9587,6 @@ function register_c_ievent_cli() {
|
|
|
9388
9587
|
return create_gclass(GCLASS_NAME);
|
|
9389
9588
|
}
|
|
9390
9589
|
//#endregion
|
|
9391
|
-
export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parameter_from_json, command_parameter_from_text, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_event_type, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, html_markup, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_html_markup, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_secret_name, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_mask_secrets, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, mask_secrets_inline, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_strings_are_text, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strings_are_text, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_json_masked, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
|
|
9590
|
+
export { GObj, SDATA, SDATAAUTHZ, SDATACM, SDATACM2, SDATADF, SDATAPM, SDATAPM0, SDATA_END, SDataDesc, YUNETA_VERSION, __yuno__, build_command_response, build_path, build_stats_response, clean_name, clear_timeout, cmp_two_simple_json, command_parameter_from_json, command_parameter_from_text, command_parser, createElement2, createOneHtml, create_json_record, create_template_record, current_timestamp, data_type_t, db_list_persistent_attrs, db_load_persistent_attrs, db_remove_persistent_attrs, db_save_persistent_attrs, debounce, delete_from_list, duplicate_objects, empty_json, empty_string, escapeHtml, event_flag_t, flat2json, flat_apply, flat_diff, flat_key_join, flat_key_split, gclass_add_ev_action, gclass_add_event_type, gclass_add_state, gclass_check_fsm, gclass_create, gclass_event_type, gclass_find_by_name, gclass_flag_t, gclass_unregister, getPositionRelativeToBody, get_function_name, get_now, gobj_bottom_gobj, gobj_change_parent, gobj_change_state, gobj_command, gobj_create, gobj_create2, gobj_create_default_service, gobj_create_pure_child, gobj_create_service, gobj_create_volatil, gobj_create_yuno, gobj_current_state, gobj_default_service, gobj_deliver_posted_events, gobj_destroy, gobj_find_child, gobj_find_event_type, gobj_find_gobj, gobj_find_service, gobj_find_subscribings, gobj_find_subscriptions, gobj_flag_t, gobj_full_name, gobj_gclass_name, gobj_get_gclass_trace_level, gobj_get_gclass_trace_level2, gobj_get_gclass_trace_no_level, gobj_get_global_trace_level, gobj_get_global_trace_no_level, gobj_global_trace_level, gobj_global_trace_no_level, gobj_has_attr, gobj_has_event, gobj_has_output_event, gobj_hsdata, gobj_is_destroying, gobj_is_playing, gobj_is_pure_child, gobj_is_running, gobj_is_service, gobj_is_volatil, gobj_list_persistent_attrs, gobj_list_subscriptions, gobj_load_persistent_attrs, gobj_match_children, gobj_match_children_tree, gobj_match_gobj, gobj_name, gobj_parent, gobj_pause, gobj_play, gobj_post_event, gobj_posted_events_size, gobj_publish_event, gobj_read_attr, gobj_read_attrs, gobj_read_bool_attr, gobj_read_integer_attr, gobj_read_pointer_attr, gobj_read_str_attr, gobj_remove_persistent_attrs, gobj_repr_global_trace_levels, gobj_reset_volatil_attrs, gobj_save_persistent_attrs, gobj_search_path, gobj_send_event, gobj_services, gobj_set_bottom_gobj, gobj_set_deep_trace, gobj_set_gclass_no_trace, gobj_set_gclass_trace, gobj_set_global_no_trace, gobj_set_global_no_trace2, gobj_set_global_trace, gobj_set_global_trace2, gobj_set_gobj_no_trace, gobj_set_gobj_trace, gobj_set_trace_machine_format, gobj_short_name, gobj_start, gobj_start_children, gobj_start_tree, gobj_start_up, gobj_stats, gobj_stop, gobj_stop_children, gobj_stop_tree, gobj_subscribe_event, gobj_trace_level, gobj_trace_machine_format, gobj_trace_no_level, gobj_unsubscribe_event, gobj_unsubscribe_list, gobj_walk_gobj_children, gobj_walk_gobj_children_tree, gobj_write_attr, gobj_write_attrs, gobj_write_bool_attr, gobj_write_integer_attr, gobj_write_str_attr, gobj_yuno, gobj_yuno_id, gobj_yuno_name, gobj_yuno_role, html_markup, id_index_in_obj_list, index_in_list, is_array, is_boolean, is_date, is_function, is_gobj, is_html_markup, is_metadata_key, is_null, is_number, is_object, is_private_key, is_pure_number, is_secret_name, is_string, jdb_delete, jdb_get, jdb_get_by_idx, jdb_get_topic, jdb_init, jdb_update, json2flat, json_array_append, json_array_append_new, json_array_extend, json_array_remove, json_array_size, json_deep_copy, json_is_identical, json_mask_secrets, json_object_del, json_object_get, json_object_set, json_object_set_new, json_object_size, json_object_update, json_object_update_existing, json_object_update_missing, json_size, json_text_of, jwt2json, jwtDecode, kw_clone_by_keys, kw_clone_by_not_keys, kw_collect, kw_delete, kw_find_json_in_list, kw_find_path, kw_flag_t, kw_get_bool, kw_get_dict, kw_get_dict_value, kw_get_int, kw_get_list, kw_get_local_storage_value, kw_get_pointer, kw_get_real, kw_get_str, kw_has_key, kw_match_simple, kw_pop, kw_remove_local_storage_value, kw_select, kw_set_dict_value, kw_set_local_storage_value, kw_set_subdict_value, kwid_collect, kwid_find_one_record, kwid_get_ids, kwid_match_id, kwid_new_dict, kwid_new_list, list2options, load_json_file, log_debug, log_error, log_info, log_warning, mask_secrets_inline, msg_iev_get_msg_type, msg_iev_get_stack, msg_iev_push_stack, msg_iev_read_key, msg_iev_set_msg_type, msg_iev_write_key, node_uuid, parseBoolean, parseSVG, refresh_language, register_c_ievent_cli, register_c_timer, register_c_yuno, safeSrc, sdata_flag_t, send_http_json_post, set_console_log_enabled, set_console_log_filter, set_log_callback, set_remote_log_functions, set_strings_are_text, set_timeout, set_timeout_periodic, sprintf, stats_parser, str_in_list, strcasecmp, strcmp, strings_are_text, strncmp, strs_in_list, strstr, template_get_field_desc, timeTracker, trace_json, trace_json_masked, trace_level_t, trace_msg, treedb_decoder_fkey, treedb_decoder_hook, treedb_encoder_fkey, treedb_get_field_desc, treedb_hook_data_size, vsprintf, walk_type_t };
|
|
9392
9591
|
|
|
9393
9592
|
//# sourceMappingURL=gobj-js.es.js.map
|