@yuneta/gobj-js 7.9.10 → 7.10.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.
- package/dist/gobj-js.cjs.js +94 -10
- package/dist/gobj-js.cjs.js.map +1 -1
- package/dist/gobj-js.cjs.min.js +985 -966
- package/dist/gobj-js.cjs.min.js.map +1 -1
- package/dist/gobj-js.es.js +93 -11
- package/dist/gobj-js.es.js.map +1 -1
- package/dist/gobj-js.es.min.js +1036 -1016
- package/dist/gobj-js.es.min.js.map +1 -1
- package/dist/gobj-js.iife.js +94 -10
- package/dist/gobj-js.iife.js.map +1 -1
- package/dist/gobj-js.iife.min.js +988 -969
- package/dist/gobj-js.iife.min.js.map +1 -1
- package/dist/gobj-js.umd.js +94 -10
- package/dist/gobj-js.umd.js.map +1 -1
- package/dist/gobj-js.umd.min.js +987 -968
- package/dist/gobj-js.umd.min.js.map +1 -1
- package/package.json +1 -1
package/dist/gobj-js.umd.js
CHANGED
|
@@ -1418,6 +1418,7 @@
|
|
|
1418
1418
|
gobj_stop(gobj);
|
|
1419
1419
|
}
|
|
1420
1420
|
gobj.obflag |= obflag_t.obflag_destroying;
|
|
1421
|
+
purge_posted_events(gobj);
|
|
1421
1422
|
let trace_creation = __trace_gobj_create_delete__(gobj);
|
|
1422
1423
|
if (trace_creation) trace_machine(sprintf("💔💔⏩ destroying: %s", gobj_full_name(gobj)));
|
|
1423
1424
|
let parent = gobj_parent(gobj);
|
|
@@ -2357,13 +2358,97 @@
|
|
|
2357
2358
|
return true;
|
|
2358
2359
|
}
|
|
2359
2360
|
/************************************************************
|
|
2360
|
-
*
|
|
2361
|
+
* Posted events: gobj_send_event(), but on the next turn
|
|
2362
|
+
*
|
|
2363
|
+
* Same contract as the C side (see gobj.h). It exists to get out of the
|
|
2364
|
+
* stack you are standing on: gobj_publish_event() dispatches synchronously,
|
|
2365
|
+
* so a subscriber action runs inside the publisher's own stack, and
|
|
2366
|
+
* destroying that publisher there dismantles what is still iterating.
|
|
2367
|
+
*
|
|
2368
|
+
* The queue is drained with setTimeout(0) and NOT with queueMicrotask():
|
|
2369
|
+
* a microtask runs before the browser can paint or handle an input, so a
|
|
2370
|
+
* chain of posted events would hold the page exactly the way it used to
|
|
2371
|
+
* hold the event loop in C. A macrotask gives the browser its turn between
|
|
2372
|
+
* one event and the next.
|
|
2373
|
+
*
|
|
2374
|
+
* Delivery is a SNAPSHOT: the events queued when the drain begins are the
|
|
2375
|
+
* ones delivered in it, and whatever an action posts while it runs waits
|
|
2376
|
+
* for the following turn.
|
|
2361
2377
|
************************************************************/
|
|
2362
|
-
|
|
2363
|
-
|
|
2364
|
-
|
|
2365
|
-
|
|
2366
|
-
|
|
2378
|
+
var MAX_POSTED_EVENTS = 1e4;
|
|
2379
|
+
var __dl_posted_events__ = [];
|
|
2380
|
+
var __posted_events_scheduled__ = false;
|
|
2381
|
+
function gobj_post_event(dst, event, kw, src) {
|
|
2382
|
+
if (!dst || !(dst instanceof GObj)) {
|
|
2383
|
+
log_error(`gobj_post_event(): gobj dst NULL, event ${event}`);
|
|
2384
|
+
return -1;
|
|
2385
|
+
}
|
|
2386
|
+
if (dst.obflag & (obflag_t.obflag_destroyed | obflag_t.obflag_destroying)) {
|
|
2387
|
+
log_error(`gobj_post_event(): gobj dst DESTROYING, event ${event}`);
|
|
2388
|
+
return -1;
|
|
2389
|
+
}
|
|
2390
|
+
if (empty_string(event)) {
|
|
2391
|
+
log_error(`gobj_post_event(): event EMPTY`);
|
|
2392
|
+
return -1;
|
|
2393
|
+
}
|
|
2394
|
+
if (!gobj_has_event(dst, event, 0)) {
|
|
2395
|
+
log_error(`gobj_post_event(): event NOT DEFINED in gclass ${gobj_gclass_name(dst)}, event ${event}`);
|
|
2396
|
+
return -1;
|
|
2397
|
+
}
|
|
2398
|
+
if (__dl_posted_events__.length >= MAX_POSTED_EVENTS) {
|
|
2399
|
+
log_error(`gobj_post_event(): too many posted events, this is NOT a work queue, event ${event}, pending ${__dl_posted_events__.length}`);
|
|
2400
|
+
return -1;
|
|
2401
|
+
}
|
|
2402
|
+
__dl_posted_events__.push({
|
|
2403
|
+
dst,
|
|
2404
|
+
event,
|
|
2405
|
+
kw,
|
|
2406
|
+
src
|
|
2407
|
+
});
|
|
2408
|
+
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));
|
|
2409
|
+
if (!__posted_events_scheduled__) {
|
|
2410
|
+
__posted_events_scheduled__ = true;
|
|
2411
|
+
setTimeout(gobj_deliver_posted_events, 0);
|
|
2412
|
+
}
|
|
2413
|
+
return 0;
|
|
2414
|
+
}
|
|
2415
|
+
/************************************************************
|
|
2416
|
+
* How many posted events wait for delivery
|
|
2417
|
+
************************************************************/
|
|
2418
|
+
function gobj_posted_events_size() {
|
|
2419
|
+
return __dl_posted_events__.length;
|
|
2420
|
+
}
|
|
2421
|
+
/************************************************************
|
|
2422
|
+
* Deliver the posted events. One turn, one snapshot.
|
|
2423
|
+
************************************************************/
|
|
2424
|
+
function gobj_deliver_posted_events() {
|
|
2425
|
+
__posted_events_scheduled__ = false;
|
|
2426
|
+
let snapshot = __dl_posted_events__;
|
|
2427
|
+
__dl_posted_events__ = [];
|
|
2428
|
+
let delivered = 0;
|
|
2429
|
+
for (let msg of snapshot) {
|
|
2430
|
+
if (msg.dst.obflag & (obflag_t.obflag_destroyed | obflag_t.obflag_destroying)) continue;
|
|
2431
|
+
gobj_send_event(msg.dst, msg.event, msg.kw, msg.src);
|
|
2432
|
+
delivered++;
|
|
2433
|
+
}
|
|
2434
|
+
if (__dl_posted_events__.length > 0 && !__posted_events_scheduled__) {
|
|
2435
|
+
__posted_events_scheduled__ = true;
|
|
2436
|
+
setTimeout(gobj_deliver_posted_events, 0);
|
|
2437
|
+
}
|
|
2438
|
+
return delivered;
|
|
2439
|
+
}
|
|
2440
|
+
/************************************************************
|
|
2441
|
+
* Take a gobj out of the queue of posted events.
|
|
2442
|
+
*
|
|
2443
|
+
* Called from gobj_destroy(), and the two halves are not the same thing:
|
|
2444
|
+
* as DESTINATION the entry is dropped, as SOURCE only the pointer is
|
|
2445
|
+
* cleared -- the destination still wants its event, and it arrives with
|
|
2446
|
+
* src null, which every action already has to accept.
|
|
2447
|
+
************************************************************/
|
|
2448
|
+
function purge_posted_events(gobj) {
|
|
2449
|
+
if (__dl_posted_events__.length === 0) return;
|
|
2450
|
+
for (let msg of __dl_posted_events__) if (msg.src === gobj) msg.src = null;
|
|
2451
|
+
__dl_posted_events__ = __dl_posted_events__.filter((msg) => msg.dst !== gobj);
|
|
2367
2452
|
}
|
|
2368
2453
|
/************************************************************
|
|
2369
2454
|
* send_event
|
|
@@ -5657,7 +5742,6 @@
|
|
|
5657
5742
|
* Framework Method: Start
|
|
5658
5743
|
***************************************************************/
|
|
5659
5744
|
function mt_start$1(gobj) {
|
|
5660
|
-
gobj_start(gobj.priv.gobj_timer);
|
|
5661
5745
|
set_timeout_periodic(gobj.priv.gobj_timer, gobj.priv.periodic_timeout);
|
|
5662
5746
|
return 0;
|
|
5663
5747
|
}
|
|
@@ -5665,7 +5749,7 @@
|
|
|
5665
5749
|
* Framework Method: Stop
|
|
5666
5750
|
***************************************************************/
|
|
5667
5751
|
function mt_stop$1(gobj) {
|
|
5668
|
-
|
|
5752
|
+
clear_timeout(gobj.priv.gobj_timer);
|
|
5669
5753
|
gobj_stop_children(gobj);
|
|
5670
5754
|
return 0;
|
|
5671
5755
|
}
|
|
@@ -5837,7 +5921,6 @@
|
|
|
5837
5921
|
***************************************************************/
|
|
5838
5922
|
function mt_start(gobj) {
|
|
5839
5923
|
let priv = gobj.priv;
|
|
5840
|
-
gobj_start(priv.gobj_timer);
|
|
5841
5924
|
priv.retry_ms = 0;
|
|
5842
5925
|
priv.websocket = setup_websocket(gobj);
|
|
5843
5926
|
return 0;
|
|
@@ -5848,7 +5931,6 @@
|
|
|
5848
5931
|
function mt_stop(gobj) {
|
|
5849
5932
|
let priv = gobj.priv;
|
|
5850
5933
|
clear_timeout(priv.gobj_timer);
|
|
5851
|
-
gobj_stop(priv.gobj_timer);
|
|
5852
5934
|
if (priv.websocket) close_websocket(gobj);
|
|
5853
5935
|
return 0;
|
|
5854
5936
|
}
|
|
@@ -6583,6 +6665,7 @@
|
|
|
6583
6665
|
exports.gobj_create_yuno = gobj_create_yuno;
|
|
6584
6666
|
exports.gobj_current_state = gobj_current_state;
|
|
6585
6667
|
exports.gobj_default_service = gobj_default_service;
|
|
6668
|
+
exports.gobj_deliver_posted_events = gobj_deliver_posted_events;
|
|
6586
6669
|
exports.gobj_destroy = gobj_destroy;
|
|
6587
6670
|
exports.gobj_find_child = gobj_find_child;
|
|
6588
6671
|
exports.gobj_find_gobj = gobj_find_gobj;
|
|
@@ -6614,6 +6697,7 @@
|
|
|
6614
6697
|
exports.gobj_pause = gobj_pause;
|
|
6615
6698
|
exports.gobj_play = gobj_play;
|
|
6616
6699
|
exports.gobj_post_event = gobj_post_event;
|
|
6700
|
+
exports.gobj_posted_events_size = gobj_posted_events_size;
|
|
6617
6701
|
exports.gobj_publish_event = gobj_publish_event;
|
|
6618
6702
|
exports.gobj_read_attr = gobj_read_attr;
|
|
6619
6703
|
exports.gobj_read_attrs = gobj_read_attrs;
|