@webqit/port-plus 0.1.13 → 0.1.15
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 +102 -116
- package/dist/main.js +1 -1
- package/dist/main.js.map +3 -3
- package/package.json +3 -3
- package/src/BroadcastChannelPlus.js +12 -2
- package/src/MessageChannelPlus.js +2 -2
- package/src/MessageEventPlus.js +1 -2
- package/src/MessagePortPlus.js +88 -87
- package/src/StarPort.js +37 -24
- package/src/WebSocketPort.js +28 -12
package/README.md
CHANGED
|
@@ -343,17 +343,11 @@ This allows state to be treated as persistent and reactive across a messaging bo
|
|
|
343
343
|
|
|
344
344
|
## Lifecycles
|
|
345
345
|
|
|
346
|
-
Port+
|
|
347
|
-
|
|
348
|
-
The purpose of this lifecycle is to make *interaction readiness* explicit: to know when there is someone actively listening on the other end of a port, and when that condition begins and ends.
|
|
349
|
-
|
|
350
|
-
Native web messaging APIs do not expose this information consistently. WebSockets expose transport connectivity, but not as to whether the remote side is actually interacting with the connection. Message ports and broadcast channels expose no readiness signal at all.
|
|
351
|
-
|
|
352
|
-
Port+ addresses this by introducing an interaction-based lifecycle that applies uniformly across all port types.
|
|
346
|
+
This section covers important phases in the life of a Port+ instance. Understanding Port+ lifecycles is recommended for coordinating a Port+ messaging system.
|
|
353
347
|
|
|
354
348
|
### Lifecycle States
|
|
355
349
|
|
|
356
|
-
Every Port+ instance transitions through
|
|
350
|
+
Every Port+ instance transitions through different states in its lifetime:
|
|
357
351
|
|
|
358
352
|
- **`connecting`**: The port is being established or is waiting for a connection to be established.
|
|
359
353
|
- **`open`**: The port is ready for interaction.
|
|
@@ -377,80 +371,108 @@ await port.readyStateChange('close');
|
|
|
377
371
|
> [!TIP]
|
|
378
372
|
> The `readyState` property reflects the current state as a descriptive value (e.g. `'closed'`), while `readyStateChange()` listens for lifecycle transitions using event-style names (e.g. `'close'`).
|
|
379
373
|
|
|
380
|
-
### Ready
|
|
374
|
+
### Ready State by Default
|
|
381
375
|
|
|
382
|
-
|
|
376
|
+
Native web messaging APIs do not expose Ready State information consistently. While WebSockets expose transport-level Ready State (`connecting` -> `open` -> `closing` -> `closed`), MessagePorts and BroadcastChannels expose no readiness signal at all. Consequently, the default Ready State behaviour acorss port types is:
|
|
383
377
|
|
|
384
|
-
|
|
378
|
+
| Port Type | Ready State |
|
|
379
|
+
| --- | --- |
|
|
380
|
+
| **`WebSocket`** | `open` (when a connection is established) -> `messaging` (when the first message is sent) -> `close` (when the connection is closed) |
|
|
381
|
+
| **`MessagePort`** | `open` (immediately on instantiation) -> `messaging` (when the first message is sent) -> `close` (when the port is closed) |
|
|
382
|
+
| **`BroadcastChannel`** | `open` (immediately on instantiation) -> `messaging` (when the first message is sent) -> `close` (when the channel is closed) |
|
|
385
383
|
|
|
386
|
-
|
|
384
|
+
Here, only WebSockets can tell when the other side of the port is connected. For the others, the `open` state is really about the local end of the port itself, not about the remote end.
|
|
387
385
|
|
|
388
|
-
|
|
389
|
-
+ `postMessage()` – including, also, higher level APIs that may trigger it
|
|
386
|
+
Not knowing when the other side of the port is connected can be a limitation when multiple lifecycles need to be coordinated.
|
|
390
387
|
|
|
391
|
-
|
|
388
|
+
Port+ addresses this by introducing an explicit handshake phase that applies uniformly across all port types. You opt-in via `options.handshake`:
|
|
392
389
|
|
|
393
390
|
```js
|
|
394
391
|
// An example for a BroadcastChannel port
|
|
395
|
-
const port = new BroadcastChannel(channel, {
|
|
392
|
+
const port = new BroadcastChannel(channel, { handshake: 1 });
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
`options.handshake` is a number between `0` and `2`. When `0` – the default – no handshake takes place. When `1` or `2`, the port goes through the Port+ handshake phase.
|
|
396
|
+
|
|
397
|
+
### Ready-State by Handshake
|
|
398
|
+
|
|
399
|
+
Port+'s handshake model is designed to guarantee the readiness of the remote end of the port – rather than the readiness of the local end itself. In this mode, the port only transitions to the `open` state after each end of the port has ascertained that the other end is ready to interact – not just alive. Messages sent at this point are more likely to be read by "someone".
|
|
400
|
+
|
|
401
|
+
Either end begins the process by sending a "readinnes" signal and waits for it to be acknoledged. If the other end also acknoledges with "readinnes", both ends transitions to the `open` state. Otherwise, the originating end waits for an explicit "readinnes" signal from the other end. The transition to the `open` state happens when both ends have successfully exchanged "readinnes".
|
|
402
|
+
|
|
403
|
+
A Port+ instance self-signifies "readiness" on exactly one condition: **when `.start()` is called**. It says by that: "I'm ready to interact, not just alive". The `options.handshake` parameter, however, lets you say that either explicitly or implicitly:
|
|
404
|
+
|
|
405
|
+
+ When `1`, handshake begins on the first interaction with:
|
|
406
|
+
+ `addEventListener()` – including higher level APIs that may trigger it
|
|
407
|
+
+ `postMessage()` – including, also, higher level APIs that may trigger it
|
|
408
|
+
This behaviour is called Readinnes by Interaction.
|
|
409
|
+
+ When `2`, handshake begins on an explicit call to `start()`
|
|
396
410
|
|
|
397
|
-
|
|
411
|
+
```js
|
|
412
|
+
// An example for a BroadcastChannel port
|
|
413
|
+
const port = new BroadcastChannel(channel, { handshake: 1 });
|
|
414
|
+
|
|
415
|
+
port.addEventListener('message', handle); // Implicitly triggers start()
|
|
398
416
|
```
|
|
399
417
|
|
|
400
418
|
### Early Sends and Automatic Queuing
|
|
401
419
|
|
|
402
|
-
Ports may be configured to implicitly await the `open`
|
|
420
|
+
Ports may be configured to implicitly await the `open` Ready State before sending messages. In this mode, outbound messages are automatically queued until the port is `open`.
|
|
403
421
|
|
|
404
422
|
```js
|
|
405
423
|
// An example for a BroadcastChannel port
|
|
406
|
-
const port = new BroadcastChannel(channel, { postAwaitsOpen: true });
|
|
424
|
+
const port = new BroadcastChannel(channel, { handshake: 1, postAwaitsOpen: true });
|
|
425
|
+
|
|
426
|
+
port.postMessage('hello');
|
|
427
|
+
// Queued until port is open.
|
|
428
|
+
// But { handshake: 1 } also lets postMessage() trigger the handshake process.
|
|
429
|
+
// Port is open – and messages flush – when the other end says "ready". Until then, queued
|
|
407
430
|
|
|
408
|
-
port.postMessage('hello'); // queued
|
|
409
431
|
await port.readyStateChange('open');
|
|
410
432
|
// delivered by now
|
|
411
433
|
```
|
|
412
434
|
|
|
413
|
-
This allows application code to send messages
|
|
435
|
+
This allows application code to send messages with guaranteed coordination.
|
|
414
436
|
|
|
415
437
|
---
|
|
416
438
|
|
|
417
|
-
|
|
439
|
+
### Handshake by Port Type
|
|
418
440
|
|
|
419
|
-
Each Port+ transport participates in the
|
|
441
|
+
Each Port+ transport participates in the handshake model differently, while exposing the same observable states.
|
|
420
442
|
|
|
421
|
-
|
|
443
|
+
#### MessagePortPlus via MessageChannelPlus
|
|
422
444
|
|
|
423
|
-
|
|
445
|
+
MessagePorts follow a symmetric, point-to-point handshake.
|
|
424
446
|
|
|
425
|
-
|
|
447
|
+
The port transitions to the `open` state when:
|
|
426
448
|
|
|
427
|
-
1. `.start()` is triggered explicitly or by interaction
|
|
428
|
-
2.
|
|
449
|
+
1. `.start()` is triggered explicitly or by interaction – on both ends
|
|
450
|
+
2. peer acknowledgment is recieved
|
|
429
451
|
|
|
430
|
-
The port
|
|
452
|
+
The port closes via an explicit `.close()` call on either side. Closure on one end automatically triggers closure on the other – via a control message. Ready State transitions to `closed`.
|
|
431
453
|
|
|
432
|
-
|
|
454
|
+
#### BroadcastChannelPlus
|
|
433
455
|
|
|
434
|
-
|
|
456
|
+
BroadcastChannels form a many-to-many port topology and require additional coordination to make readiness meaningful.
|
|
435
457
|
|
|
436
458
|
Port+ supports two modes.
|
|
437
459
|
|
|
438
|
-
|
|
460
|
+
##### (a) Default (Peer Mode)
|
|
439
461
|
|
|
440
462
|
In default mode, each participant becomes `open` when:
|
|
441
463
|
|
|
442
464
|
1. `.start()` is triggered explicitly or by interaction
|
|
443
465
|
2. an acknowledgment is recieved from at least one peer in the shared channel
|
|
444
466
|
|
|
445
|
-
|
|
467
|
+
A participant closes via an explicit `.close()` call. Its Ready State transitions to `closed`.
|
|
446
468
|
|
|
447
|
-
|
|
469
|
+
##### (b) Client / Server Mode
|
|
448
470
|
|
|
449
|
-
While readiness is synchronized in the default mode – as with other port types –
|
|
471
|
+
While readiness is synchronized in the default mode – as with other port types – closure is not. A participant's closure has no effect on the others, by default.
|
|
450
472
|
|
|
451
|
-
To support use cases that require synchronized
|
|
473
|
+
To support use cases that require synchronized closure across participants, Port+ introduces an optional client/server operational model for BroadcastChannels.
|
|
452
474
|
|
|
453
|
-
The client/server model
|
|
475
|
+
The client/server model establishes explicit role semantics. Here, one participant is assigned a `server` role – the "control plane" – and the others are assigned a `client` role:
|
|
454
476
|
|
|
455
477
|
```js
|
|
456
478
|
const server = new BroadcastChannelPlus('room', {
|
|
@@ -469,69 +491,40 @@ const client2 = new BroadcastChannelPlus('room', {
|
|
|
469
491
|
Both server and clients can join the channel in any order, but the server:
|
|
470
492
|
|
|
471
493
|
+ maintains a reference to all connected clients
|
|
472
|
-
+ automatically
|
|
473
|
-
+ automatically closes when all clients leave
|
|
494
|
+
+ automatically triggers closure across all clients when closed
|
|
495
|
+
+ automatically closes when all clients leave – but if `options.autoClose` is enabled
|
|
474
496
|
|
|
475
497
|
By contrast, a client:
|
|
476
498
|
|
|
477
499
|
* closes alone when closed
|
|
478
500
|
|
|
479
|
-
This mode exists because BroadcastChannel’s native semantics do not provide coordinated teardown or authoritative control. Without it, participants cannot reliably know when a session has ended. Client/server mode enables explicit ownership, deterministic shutdown, and presence-aware coordination over a many-to-many
|
|
501
|
+
This mode exists because BroadcastChannel’s native semantics do not provide coordinated teardown or authoritative control. Without it, participants cannot reliably know when a session has ended. Client/server mode enables explicit ownership, deterministic shutdown, and presence-aware coordination over a many-to-many topology.
|
|
480
502
|
|
|
481
|
-
|
|
503
|
+
#### WebSocketPort
|
|
482
504
|
|
|
483
|
-
|
|
505
|
+
WebSockets have a native Ready State system inspectable via an instance's `.readyState` property.
|
|
484
506
|
|
|
485
|
-
Port+
|
|
486
|
-
|
|
487
|
-
+ Transport-driven lifecycle (default)
|
|
488
|
-
+ Interaction-driven lifecycle (opt-in)
|
|
489
|
-
|
|
490
|
-
By default, Port+ lets the WebSocket’s native lifecycle be the authoritative lifecycle.
|
|
507
|
+
By default, Port+ lets the WebSocket’s native Ready State be the authoritative Ready State.
|
|
491
508
|
|
|
492
509
|
In this mode:
|
|
493
510
|
|
|
494
|
-
* WebSocketPort's `open` and `closed` states are based on the WebSocket's native
|
|
495
|
-
* no handshake
|
|
511
|
+
* The WebSocketPort's `open` and `closed` states are based on the WebSocket's native `open` and `closed` states
|
|
512
|
+
* no handshake takes place
|
|
496
513
|
* readiness is assumed once the socket opens
|
|
497
514
|
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
To enable interaction-based readiness, WebSocketPort can opt out of native ready states. This is controlled by the `naturalOpen` flag:
|
|
515
|
+
On choosing the explicit handshake model via `options.handshake`, the `open` state is determined differently.
|
|
501
516
|
|
|
502
517
|
```js
|
|
503
|
-
const port = new WebSocketPort(ws, {
|
|
518
|
+
const port = new WebSocketPort(ws, { handshake: 1 });
|
|
504
519
|
```
|
|
505
520
|
|
|
506
521
|
In this mode, each side transitions to the `open` state when:
|
|
507
522
|
|
|
508
|
-
1. `.start()` is triggered explicitly or by interaction
|
|
509
|
-
2.
|
|
523
|
+
1. `.start()` is triggered explicitly or by interaction – on both ends
|
|
524
|
+
2. peer acknowledgment is recieved
|
|
510
525
|
|
|
511
526
|
This allows WebSocketPort to behave identically to MessagePortPlus and BroadcastChannelPlus with respect to readiness and cleanup.
|
|
512
527
|
|
|
513
|
-
### Lifecycle Inheritance
|
|
514
|
-
|
|
515
|
-
Ports created via `port.channel()` and ports exposed via `event.ports` inherit:
|
|
516
|
-
|
|
517
|
-
* `autoStart`
|
|
518
|
-
* `postAwaitsOpen`
|
|
519
|
-
|
|
520
|
-
from their parent port.
|
|
521
|
-
|
|
522
|
-
These ports follow a symmetric, point-to-point lifecycle. Closing either side closes the other.
|
|
523
|
-
|
|
524
|
-
### Practical Use
|
|
525
|
-
|
|
526
|
-
The lifecycle API enables:
|
|
527
|
-
|
|
528
|
-
* safe startup sequencing
|
|
529
|
-
* early message queuing without race conditions
|
|
530
|
-
* deterministic teardown and cleanup
|
|
531
|
-
* consistent readiness checks across transports
|
|
532
|
-
|
|
533
|
-
Port+ makes interaction readiness explicit, observable, and uniform across all messaging primitives.
|
|
534
|
-
|
|
535
528
|
---
|
|
536
529
|
|
|
537
530
|
## Composition and Topology
|
|
@@ -580,7 +573,9 @@ star.addEventListener('message', (e) => {
|
|
|
580
573
|
|
|
581
574
|
##### Outbound (Fan-Out)
|
|
582
575
|
|
|
583
|
-
A `.
|
|
576
|
+
A `.start()` call on the Star Port is a `.start()` call on all connected ports.
|
|
577
|
+
A `.close()` call on the Star Port is a `.close()` call on all connected ports.
|
|
578
|
+
A `.postMessage()` call on the Star Port is a `.postMessage()` call on all connected ports.
|
|
584
579
|
|
|
585
580
|
```js
|
|
586
581
|
star.postMessage(data);
|
|
@@ -590,9 +585,16 @@ This makes `StarPort` a true proxy: a single observable endpoint over many indep
|
|
|
590
585
|
|
|
591
586
|
#### Lifecycle Behavior
|
|
592
587
|
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
*
|
|
588
|
+
A Star Port automatically transitions to the `open` state by default. But when `options.handshake` is enabled, its Ready State is controlled by that of its child ports:
|
|
589
|
+
|
|
590
|
+
* transitions to the `open` state when at least a child port exists and has Ready State `open`
|
|
591
|
+
* transitions to the `closed` state when the last child closes or is removed – but if `options.autoClose` is enabled
|
|
592
|
+
|
|
593
|
+
Regardless of `options.handshake`:
|
|
594
|
+
|
|
595
|
+
+ Closed ports are removed automatically.
|
|
596
|
+
+ Child ports added after `.start()` are automatically started.
|
|
597
|
+
+ Attempting to add a child port after `.close()` fails with an error.
|
|
596
598
|
|
|
597
599
|
#### Typical Uses
|
|
598
600
|
|
|
@@ -604,7 +606,7 @@ This makes `StarPort` a true proxy: a single observable endpoint over many indep
|
|
|
604
606
|
|
|
605
607
|
A `RelayPort` is a **router** that forwards messages *between sibling ports*.
|
|
606
608
|
|
|
607
|
-
It is an extension of `StarPort` and inherits all of its properties, methods, and
|
|
609
|
+
It is an extension of `StarPort` and inherits all of its properties, methods, and lifecycle behavior.
|
|
608
610
|
|
|
609
611
|
```js
|
|
610
612
|
const relay = new RelayPort('room');
|
|
@@ -631,17 +633,11 @@ This creates peer-to-peer fan-out.
|
|
|
631
633
|
|
|
632
634
|
##### Outbound Broadcast
|
|
633
635
|
|
|
634
|
-
As with
|
|
635
|
-
|
|
636
|
-
```js
|
|
637
|
-
relay.postMessage(data);
|
|
638
|
-
```
|
|
639
|
-
|
|
640
|
-
`RelayPort` has identical outbound behavior to `StarPort`.
|
|
636
|
+
As with the Star Port, a `.postMessage()` call on the relay port is a `.postMessage()` call to all connected ports.
|
|
641
637
|
|
|
642
638
|
##### Join / Leave Signaling
|
|
643
639
|
|
|
644
|
-
When a port joins (via `relay.addPort()`) or leaves (via `relay.removePort()` or via port
|
|
640
|
+
When a port joins (via `relay.addPort()`) or leaves (via `relay.removePort()` or via port closure), a synthetic join/leave message is routed to peers.
|
|
645
641
|
|
|
646
642
|
This enables presence-aware systems (e.g. chat rooms).
|
|
647
643
|
|
|
@@ -823,7 +819,6 @@ port.addEventListener('message', (e) => {
|
|
|
823
819
|
Reply ports:
|
|
824
820
|
|
|
825
821
|
* form a symmetric 1:1 connection
|
|
826
|
-
* inherit lifecycle settings from their parent port
|
|
827
822
|
* close automatically when either side closes
|
|
828
823
|
|
|
829
824
|
Use reply ports when:
|
|
@@ -910,21 +905,21 @@ All Port+ implementations – `MessagePortPlus`, `BroadcastChannelPlus`, `WebSoc
|
|
|
910
905
|
|
|
911
906
|
```js
|
|
912
907
|
new MessageChannelPlus({
|
|
913
|
-
|
|
908
|
+
handshake?: number,
|
|
914
909
|
postAwaitsOpen?: boolean
|
|
915
910
|
});
|
|
916
911
|
```
|
|
917
912
|
|
|
918
913
|
| Option | Default | Description |
|
|
919
914
|
| ---------------- | ------- | ----------------------------------------------------- |
|
|
920
|
-
| `
|
|
915
|
+
| `handshake` | `0` | Conduct a handshake process to coordinate Ready State |
|
|
921
916
|
| `postAwaitsOpen` | `false` | Queue messages until the port is `open` |
|
|
922
917
|
|
|
923
918
|
#### `BroadcastChannelPlus`
|
|
924
919
|
|
|
925
920
|
```js
|
|
926
921
|
new BroadcastChannelPlus(name, {
|
|
927
|
-
|
|
922
|
+
handshake?: number,
|
|
928
923
|
postAwaitsOpen?: boolean,
|
|
929
924
|
clientServerMode?: 'server' | 'client' | null,
|
|
930
925
|
autoClose?: boolean
|
|
@@ -933,32 +928,30 @@ new BroadcastChannelPlus(name, {
|
|
|
933
928
|
|
|
934
929
|
| Option | Default | Description |
|
|
935
930
|
| ------------------ | ------- | --------------------------------------------- |
|
|
936
|
-
| `
|
|
931
|
+
| `handshake` | `0` | Conduct a handshake process to coordinate Ready State |
|
|
937
932
|
| `postAwaitsOpen` | `false` | Queue messages until readiness |
|
|
938
933
|
| `clientServerMode` | `null` | Can be one of `'server'`, `'client'` or `null` |
|
|
939
|
-
| `autoClose` | `
|
|
934
|
+
| `autoClose` | `false` | Auto-close server when all clients disconnect |
|
|
940
935
|
|
|
941
936
|
#### `WebSocketPort`
|
|
942
937
|
|
|
943
938
|
```js
|
|
944
939
|
new WebSocketPort(wsOrUrl, {
|
|
945
|
-
|
|
946
|
-
naturalOpen?: boolean,
|
|
940
|
+
handshake?: number,
|
|
947
941
|
postAwaitsOpen?: boolean
|
|
948
942
|
});
|
|
949
943
|
```
|
|
950
944
|
|
|
951
945
|
| Option | Default | Description |
|
|
952
946
|
| ---------------- | ------- | ------------------------------------ |
|
|
953
|
-
| `
|
|
954
|
-
| `naturalOpen` | `true` | Use WebSocket transport readiness instead of Port+ interaction-based ready state |
|
|
947
|
+
| `handshake` | `0` | Conduct a handshake process to coordinate Ready State |
|
|
955
948
|
| `postAwaitsOpen` | `false` | Queue messages until readiness |
|
|
956
949
|
|
|
957
950
|
#### `StarPort`
|
|
958
951
|
|
|
959
952
|
```js
|
|
960
953
|
new StarPort({
|
|
961
|
-
|
|
954
|
+
handshake?: number,
|
|
962
955
|
postAwaitsOpen?: boolean,
|
|
963
956
|
autoClose?: boolean
|
|
964
957
|
});
|
|
@@ -966,15 +959,15 @@ new StarPort({
|
|
|
966
959
|
|
|
967
960
|
| Option | Default | Description |
|
|
968
961
|
| ---------------- | ------- | ------------------------------------ |
|
|
969
|
-
| `
|
|
962
|
+
| `handshake` | `0` | Conduct a handshake process to coordinate Ready State |
|
|
970
963
|
| `postAwaitsOpen` | `false` | Queue messages until readiness |
|
|
971
|
-
| `autoClose` | `
|
|
964
|
+
| `autoClose` | `false` | Auto-close when all clients close or are removed |
|
|
972
965
|
|
|
973
966
|
#### `RelayPort`
|
|
974
967
|
|
|
975
968
|
```js
|
|
976
969
|
new RelayPort(channelSpec?, {
|
|
977
|
-
|
|
970
|
+
handshake?: number,
|
|
978
971
|
postAwaitsOpen?: boolean,
|
|
979
972
|
autoClose?: boolean
|
|
980
973
|
});
|
|
@@ -982,9 +975,9 @@ new RelayPort(channelSpec?, {
|
|
|
982
975
|
|
|
983
976
|
| Option | Default | Description |
|
|
984
977
|
| ---------------- | ------- | ------------------------------------ |
|
|
985
|
-
| `
|
|
978
|
+
| `handshake` | `0` | Conduct a handshake process to coordinate Ready State |
|
|
986
979
|
| `postAwaitsOpen` | `false` | Queue messages until readiness |
|
|
987
|
-
| `autoClose` | `
|
|
980
|
+
| `autoClose` | `false` | Auto-close when all clients close or are removed |
|
|
988
981
|
|
|
989
982
|
### Lifecycle API
|
|
990
983
|
|
|
@@ -997,7 +990,7 @@ new RelayPort(channelSpec?, {
|
|
|
997
990
|
|
|
998
991
|
Explicitly initiates the interaction handshake.
|
|
999
992
|
|
|
1000
|
-
* Required when `
|
|
993
|
+
* Required when `options.handshake` is `2`
|
|
1001
994
|
* Signals readiness to the remote side
|
|
1002
995
|
|
|
1003
996
|
#### `close(): void`
|
|
@@ -1091,13 +1084,6 @@ Creates a logical sub-port scoped to a message namespace.
|
|
|
1091
1084
|
* Tags outbound messages
|
|
1092
1085
|
* Shares lifecycle with the parent port
|
|
1093
1086
|
|
|
1094
|
-
Ports created via `port.channel()` (and ports exposed via `event.ports`) inherit:
|
|
1095
|
-
|
|
1096
|
-
* `autoStart`
|
|
1097
|
-
* `postAwaitsOpen`
|
|
1098
|
-
|
|
1099
|
-
from their parent port.
|
|
1100
|
-
|
|
1101
1087
|
#### `relay(config): () => void`
|
|
1102
1088
|
|
|
1103
1089
|
Establishes explicit routing between ports. `config` is:
|
|
@@ -1140,7 +1126,7 @@ All message events dispatched by Port+ ports.
|
|
|
1140
1126
|
| `data` | any | Message payload |
|
|
1141
1127
|
| `type` | string | Event type |
|
|
1142
1128
|
| `eventID` | string | Stable message identifier |
|
|
1143
|
-
| `ports` | `MessagePortPlus[]` | Reply ports.
|
|
1129
|
+
| `ports` | `MessagePortPlus[]` | Reply ports. |
|
|
1144
1130
|
| `live` | boolean | Indicates a live object payload |
|
|
1145
1131
|
| `relayedFrom` | `MessagePortPlus` | Originating port (if routed) |
|
|
1146
1132
|
|
package/dist/main.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
(()=>{var Ye=Object.defineProperty;var he=(r,e)=>{for(var t in e)Ye(r,t,{get:e[t],enumerable:!0})};var Ne={};he(Ne,{BroadcastChannelPlus:()=>pe,MessageChannelPlus:()=>me,MessageEventPlus:()=>M,MessagePortPlus:()=>O,Observer:()=>Ve,RelayPort:()=>de,StarPort:()=>X,WebSocketPort:()=>Q});function w(r){return!Array.isArray(r)&&typeof r=="object"&&r}function G(r){return typeof r}function T(r){return Array.isArray(r)}function K(r){return typeof r=="function"}function ge(r){return r===null||r===""}function z(r){return arguments.length&&(r===void 0||typeof r>"u")}function b(r){return Array.isArray(r)||typeof r=="object"&&r||K(r)}function ye(r){return ge(r)||z(r)||r===!1||r===0||b(r)&&!Object.keys(r).length}function L(r){return K(r)||r&&{}.toString.call(r)==="[object function]"}function se(r){return r instanceof String||typeof r=="string"&&r!==null}function _e(r){return!se(r)&&!z(r.length)}function F(r,...e){if(!r||!["object","function"].includes(typeof r))throw new Error("Argument #1 must be of type object");let t=r[Symbol.for("wq")];if(t||(t=new ie,Object.defineProperty(r,Symbol.for("wq"),{value:t,enumerable:!1,configurable:!1,writable:!1})),!e.length)return t;let n,o;for(;n=e.shift();)(o=t)&&!(t=t.get(n))&&(t=new ie,o.set(n,t));return t}var ie=class extends Map{};var M=class extends MessageEvent{#e;get originalTarget(){return this.#e}#t;get eventID(){return this.#t}#n;get data(){return this.#n}#o;get live(){return this.#o}#a;get bubbles(){return this.#a}#f;get forwarded(){return this.#f}#s;get honourDoneMutationFlags(){return this.#s}#r=[];get ports(){return this.#r}constructor(e,{originalTarget:t=null,type:n="message",eventID:o,live:s=!1,honourDoneMutationFlags:u=!1,bubbles:f=!1,forwarded:a=!1,ports:i=[]}={}){if(n&&typeof n!="string")throw new TypeError("Where specified, wqEventOptions.type must be a string");super(n),this.#n=e,this.#e=t,this.#t=o,this.#o=s,this.#a=f,this.#f=a,this.#s=u,this.#r=i;let l=this.#e&&D(this.#e)||{};if(this.#r.forEach(c=>O.upgradeInPlace(c,{autoStart:l.autoStart,postAwaitsOpen:l.postAwaitsOpen})),b(this.#n)&&this.#o){if(typeof o!="string")throw new TypeError("eventID must be a non-empty string");xe.call(t,this.#n,this.#t,{honourDoneMutationFlags:this.#s})}}#u=!1;get immediatePropagationStopped(){return this.#u}stopImmediatePropagation(){this.#u=!0,this.#i=!0,super.stopImmediatePropagation()}#i=!1;get propagationStopped(){return this.#i}stopPropagation(){this.#i=!0,super.stopPropagation()}#l=!1;get defaultPrevented(){return this.#l}preventDefault(){this.#l=!0,super.preventDefault()}respondWith(e,t=[]){for(let n of this.#r)n.postMessage(e,t);return!!this.#r.length}};var Le={};he(Le,{any:()=>_t,apply:()=>Ie,batch:()=>Ce,construct:()=>Ae,defineProperties:()=>vt,defineProperty:()=>te,deleteProperties:()=>Pt,deleteProperty:()=>re,get:()=>$,getOwnPropertyDescriptor:()=>fe,getOwnPropertyDescriptors:()=>xt,getPrototypeOf:()=>Ee,has:()=>ue,intercept:()=>bt,isExtensible:()=>Me,map:()=>wt,observe:()=>qe,ownKeys:()=>Se,path:()=>gt,preventExtensions:()=>je,reduce:()=>De,set:()=>V,setPrototypeOf:()=>Te,subtree:()=>yt});function k(r,e=!0){return T(r)?r:!e&&w(r)?[r]:r!==!1&&r!==0&&ye(r)?[]:_e(r)?Array.prototype.slice.call(r):w(r)?Object.values(r):[r]}var v=(r,...e)=>F(r,"observerAPI",...e),J=(r,e)=>r instanceof Promise?r.then(e):e(r),ae={};var B=class{constructor(e,t){this.registry=e,Object.assign(this,{...t,target:e.target}),this.params.signal&&this.params.signal.addEventListener("abort",()=>this.remove())}remove(){return this.removed=!0,this.registry.removeRegistration(this)}};var Y=class extends B{constructor(){super(...arguments),this.emit.currentRegistration=this,Object.defineProperty(this,"abortController",{value:new AbortController}),Object.defineProperty(this,"signal",{value:this.abortController.signal}),ae.setMaxListeners?.(0,this.signal)}remove(){this.abortController.abort(),super.remove()}fire(e){if(this.emit.recursionTarget&&!["inject","force-async","force-sync"].includes(this.params.recursions))return;let t=e,n=this.filter;if(n!==1/0&&(n=k(n,!1))&&(t=e.filter(s=>n.includes(s.key))),this.params.diff&&(t=t.filter(s=>s.type!=="set"||s.value!==s.oldValue)),!t.length)return;if(["inject","defer"].includes(this.params.recursions)){if(this.emit.recursionTarget){this.emit.recursionTarget.push(...t);return}this.emit.recursionTarget=this.params.recursions==="inject"?t:[]}let o=this.filter===1/0||Array.isArray(this.filter)?this.emit(t,this):this.emit(t[0],this);return J(o,s=>{let u=this.emit.recursionTarget;return delete this.emit.recursionTarget,this.params.recursions==="defer"&&u?.length?this.emit.currentRegistration.fire(u):s})}};var W=class{constructor(e){this.target=e,this.entries=[]}addRegistration(e){return this.entries.push(e),e}removeRegistration(e){this.entries=this.entries.filter(t=>t!==e)}static _getInstance(e,t,n=!0,o=this.__namespace){if(!b(t))throw new Error(`Subject must be of type object; "${G(t)}" given!`);let s=this;return o&&v(globalThis,"observerAPI","namespaces").has(e+"-"+o)&&(s=v(globalThis,"observerAPI","namespaces").get(e+"-"+o),e+="-"+o),!v(t,"registry").has(e)&&n&&v(t,"registry").set(e,new s(t)),v(t,"registry").get(e)}static _namespace(e,t,n=null){if(e+="-"+t,arguments.length===2)return v(globalThis,"observerAPI","namespaces").get(e);if(!(n.prototype instanceof this))throw new Error(`The implementation of the namespace ${this.name}.${t} must be a subclass of ${this.name}.`);v(globalThis,"observerAPI","namespaces").set(e,n),n.__namespace=t}};var P=class{constructor(e,t){if(this.target=e,!t.operation)throw new Error("Descriptor operation must be given in definition!");Object.assign(this,t)}};var N=class extends W{static getInstance(e,t=!0,n=null){return super._getInstance("listeners",...arguments)}static namespace(e,t=null){return super._namespace("listeners",...arguments)}constructor(e){super(e),this.batches=[]}addRegistration(e,t,n){return super.addRegistration(new Y(this,{filter:e,emit:t,params:n}))}emit(e,{eventsArePropertyDescriptors:t=!1,eventIsArrayMethodDescriptor:n=!1}={}){if(this.batches.length){let o=this.batches[0].params.arrayMethodName;this.batches[0].snapshots.push({events:[...e],arrayMethodName:o,eventsArePropertyDescriptors:t,eventIsArrayMethodDescriptor:n});return}this.$emit(this.entries,[{events:e,eventsArePropertyDescriptors:t,eventIsArrayMethodDescriptor:n}])}$emit(e,t){let n=0,o=0,s=0;for(let l of e)n+=1,l.params.withPropertyDescriptors&&(o+=1),l.params.withArrayMethodDescriptors&&(s+=1);let u=[],f=[],a=[],i=[];for(let l of t){let c=l.arrayMethodName,p=l.eventsArePropertyDescriptors,g=l.eventIsArrayMethodDescriptor;for(let m of l.events)if(c&&(m.operation=c),o&&(s&&u.push(m),g||s!==n&&f.push(m)),o!==n){let h=m;if(p){let{target:y,type:x,..._}=m;h=new P(y,{type:"set",..._}),Object.defineProperty(h,"value","get"in _.value?{get:()=>_.value.get()}:{value:_.value.value}),_.oldValue&&Object.defineProperty(h,"oldValue","get"in _.oldValue?{get:()=>_.oldValue.get()}:{value:_.oldValue.value})}s&&a.push(h),g||s!==n&&i.push(h)}}for(let l of e)l.params.withPropertyDescriptors?l.params.withArrayMethodDescriptors?u.length&&l.fire(u):f.length&&l.fire(f):l.params.withArrayMethodDescriptors?a.length&&l.fire(a):i.length&&l.fire(i)}batch(e,t={}){this.batches.unshift({entries:[...this.entries],snapshots:[],params:t});let n=e();return J(n,o=>{let s=this.batches.shift();return s.snapshots.length&&this.$emit(s.entries,s.snapshots),o})}};var Z=class extends B{exec(e,t,n){return this.running||!this.traps[e.operation]?t(...Array.prototype.slice.call(arguments,2)):(this.running=!0,this.traps[e.operation](e,n,(...o)=>(this.running=!1,t(...o))))}};var R=class extends W{static getInstance(e,t=!0,n=null){return super._getInstance("traps",...arguments)}static namespace(e,t=null){return super._namespace("traps",...arguments)}addRegistration(e){return super.addRegistration(new Z(this,e))}emit(e,t=null){let n=this;return function o(s,...u){let f=n.entries[s];return f?f.exec(e,(...a)=>o(s+1,...a),...u):t?t(e,...u):u[0]}(0)}};var Oe={};he(Oe,{accessorize:()=>dt,proxy:()=>ve,unaccessorize:()=>ht,unproxy:()=>ee});var Be=Symbol("wqOriginal");function dt(r,e,t={}){r=Pe(r);let n=v(r,"accessorizedProps");function o(a){let i,l=r;do i=Object.getOwnPropertyDescriptor(l,a);while(!i&&(l=Object.getPrototypeOf(l)));return i?{proto:l,descriptor:i}:{descriptor:{value:void 0,configurable:!0,enumerable:!0,writable:!0}}}function s(a){if(n.has(a+""))return!0;let i=o(a);i.getValue=function(p=!1){return p?this.descriptor:this.descriptor.get?this.descriptor.get():this.descriptor.value},i.setValue=function(p,g=!1){if(this.dirty=!0,g){this.descriptor=p;return}return this.descriptor.set?this.descriptor.set(p)!==!1:(this.descriptor.value=p,!0)},i.intact=function(){let p=Object.getOwnPropertyDescriptor(r,a);return p?.get===c.get&&p?.set===c.set&&n.get(a+"")===this},i.restore=function(){return this.intact()?(this.proto&&this.proto!==r||!this.proto&&!this.dirty?delete r[a]:Object.defineProperty(r,a,this.descriptor),n.delete(a+""),!0):!1},n.set(isNaN(a)?a:parseInt(a),i);let{enumerable:l=!0}=i.descriptor,c={enumerable:l,configurable:!0};("value"in i.descriptor||i.descriptor.set)&&(c.set=function(p){return V(this,a,p,t)}),("value"in i.descriptor||i.descriptor.get)&&(c.get=function(){return $(this,a,t)});try{return Object.defineProperty(r,a,c),!0}catch{return n.delete(a+""),!1}}let f=(Array.isArray(e)?e:e===void 0?Object.keys(r):[e]).map(s);return e===void 0||Array.isArray(e)?f:f[0]}function ht(r,e,t={}){r=Pe(r);let n=v(r,"accessorizedProps");function o(f){return n.has(f+"")?n.get(f+"").restore():!0}let u=(Array.isArray(e)?e:e===void 0?Object.keys(r):[e]).map(o);return e===void 0||Array.isArray(e)?u:u[0]}function ve(r,e={},t=void 0){let n=Pe(r);if(typeof e.membrane=="boolean")throw new Error("The params.membrane parameter cannot be of type boolean.");if(e.membrane&&v(n,"membraneRef").has(e.membrane))return v(n,"membraneRef").get(e.membrane);let o={apply:(f,a,i)=>Ie(f,a,i,void 0,e),construct:(f,a,i=null)=>Ae(f,a,i,e),defineProperty:(f,a,i)=>te(f,a,i,e),deleteProperty:(f,a)=>re(f,a,e),get:(f,a,i=null)=>{if(a===Be)return n;let l={...e,receiver:i},c=$(f,a,l);return Array.isArray(f)&&typeof c=="function"&&!/^class\s?/.test(Function.prototype.toString.call(c))?ve(c,{...e,arrayMethodName:a,membrane:i},t):e.chainable&&b(c)&&a!=="prototype"&&!(typeof c=="function"&&/^class\s?|\{\s\[native\scode\]\s\}$/.test(Function.prototype.toString.call(c)))?ve(c,e,t):c},getOwnPropertyDescriptor:(f,a)=>fe(f,a,e),getPrototypeOf:f=>Ee(f,e),has:(f,a)=>ue(f,a,e),isExtensible:f=>Me(f,e),ownKeys:f=>Se(f,e),preventExtensions:f=>je(f,e),set:(f,a,i,l=null)=>V(f,a,i,{...e,receiver:l}),setPrototypeOf:(f,a)=>Te(f,a,e)},s=t?.(o)||o,u=new Proxy(n,s);return e.membrane&&v(n,"membraneRef").set(e.membrane,u),u}function ee(r){return r&&r[Be]||r}function Pe(r){if(!r||!b(r))throw new Error("Target must be of type object!");return ee(r)}var ne=class extends Array{};function gt(...r){return new ne(...r)}var U=class extends Array{};function yt(){return new U}function _t(){return 1/0}function De(r,e,t,n=s=>s,o={}){let s=e instanceof U;if(!(!s&&!e?.length))return function u(f,a,i,l){let c=l||a[i.level]instanceof U,p=c?1/0:a[i.level],g=c?!1:i.level===a.length-1;return f instanceof P&&f.operation!=="get"?i={...i,probe:"always"}:i.probe!=="always"&&(i={...i,probe:!g}),t(f,p,(m,...h)=>{let y=d=>{d instanceof P&&(d.path="key"in d?[d.key]:[],f instanceof P&&(d.path="key"in d?f.path.concat(d.key):f.path.slice(0),Object.defineProperty(d,"context",{get:()=>f,configurable:!0})))},x=h[0]||{},_=d=>{if(d instanceof P&&"argumentsList"in d)return;let I=q(d,!1);return J(I,S=>(d instanceof P?d.value=S:d=S,u(d,a,{...i,...x,keyInParent:d.key,level:i.level+1},c)))};if(oe(p)&&Array.isArray(m)){if(m.forEach(y),g)return n(m,...h);c&&m[0]instanceof P&&(m[0].operation!=="get"||o.asGet)&&n(m,...h);for(let d of m)_(d);return}return y(m),g?n(m,...h):_(m)},i)}(r,e.slice(0),{...o,level:0},s)}function qe(r,e,t,n={}){let o=q(r,!n.level);if(L(arguments[1])&&([,t,n={}]=arguments,e=1/0),!L(t))throw new Error(`Handler must be a function; "${G(t)}" given!`);if(e instanceof ne||e instanceof U)return De(o,e,qe,t,n);if(n={...n,descripted:!0},delete n.live,!b(o))return n.probe&&$(o,e,t,n)||void 0;let s=We(o,e,t,n);return n.probe?$(o,e,s,n):s()}function bt(r,e,t={}){let n=q(r);return w(e)||([,,,t={}]=arguments,e={[arguments[1]]:arguments[2]}),R.getInstance(n,!0,t.namespace).addRegistration({traps:e,params:t})}function fe(r,e,t=o=>o,n={}){return j(r,"getOwnPropertyDescriptor",{key:e},t,n)}function xt(r,e,t=o=>o,n={}){return j(r,"getOwnPropertyDescriptors",{key:e},t,n)}function Ee(r,e=n=>n,t={}){return j(r,"getPrototypeOf",{},e,t)}function Me(r,e=n=>n,t={}){return j(r,"isExtensible",{},e,t)}function Se(r,e=n=>n,t={}){return j(r,"ownKeys",{},e,t)}function ue(r,e,t=o=>o,n={}){return j(r,"has",{key:e},t,n)}function $(r,e,t=o=>o,n={}){let o,s=q(r,!n.level);return w(t)?[n,t]=[t,u=>u]:n.live&&(o=!0),e instanceof ne||e instanceof U?De(s,e,$,t,{...n,asGet:!0}):Ot(s,e,u=>{let f=[...u];return function a(i,l,c){if(!l.length)return c(i);let p=l.shift();if(!["string","number","symbol"].includes(typeof p))throw new Error(`Property name/key ${p} invalid.`);function g(y,x=void 0){let _=S=>(y.value=S,a([...i,n.live||n.descripted?y:S],l,c));if(arguments.length>1)return _(x);if(!b(s))return _(s?.[y.key]);let d=v(s,"accessorizedProps",!1),I=d&&d.get(y.key);if(I&&I.intact())return _(I.getValue(n.withPropertyDescriptors));if(n.withPropertyDescriptors){let S=Object.getOwnPropertyDescriptor(s,y.key);return _(S)}return _(Reflect.get(s,y.key))}let m=new P(s,{type:"get",key:p,value:void 0,operation:"get",related:f});if(!b(s))return g(m);let h=R.getInstance(s,!1,n.namespace);return h?h.emit(m,g):g(m)}([],u.slice(0),a=>{let i=oe(e)?a:a[0];return o&&b(s)?We(s,e,t,n,r.key)(i):t(i)})},n)}function Ce(r,e,t={}){let n=q(r);return N.getInstance(n,!0,t.namespace).batch(e,t)}function wt(r,e,t={}){e=q(e),r=q(r);let n=(t.only||[]).slice(0),o=(t.except||[]).slice(0),s=Object.keys(t.spread?[...r]:r).map(i=>isNaN(i)?i:parseInt(i)),u=n.length?n.filter(i=>s.includes(i)):s.filter(i=>!o.includes(i)),f=i=>!Array.isArray(e)||isNaN(i)?i:i-o.filter(l=>l<i).length,a=i=>{let l=fe(r,i,t);"value"in l&&l.writable&&l.enumerable&&l.configurable?V(e,f(i),l.value,t):(l.enumerable||t.onlyEnumerable===!1)&&te(e,i,{...l,configurable:!0},t)};return Ce(e,()=>{u.forEach(a)}),qe(r,i=>{i.filter(l=>n.length?n.includes(l.key):!o.includes(l.key)).forEach(l=>{if(l.type==="delete")return re(e,f(l.key),t);if(l.type==="def"){(l.value.enumerable||t.onlyEnumerable===!1)&&te(e,f(l.key),{...l.value,configurable:!0},t);return}a(l.key)})},{...t,withPropertyDescriptors:!0})}function V(r,e,t,n=u=>u,o={},s=!1){let u=q(r),f=[[e,t]];w(e)&&([,,n=i=>i,o={},s=!1]=arguments,f=Object.entries(e)),w(n)&&([s,o,n]=[typeof o=="boolean"?o:s,n,i=>i]);let a=f.map(([i])=>i);return function i(l,c,p){if(!c.length)return p(l);let[g,m]=c.shift();function h(x,_=void 0){let d=Xe=>(x.status=Xe,i(l.concat(x),c,p));if(arguments.length>1)return d(x,_);let I=v(u,"accessorizedProps",!1),S=I&&I.get(x.key);return x.type==="def"?(S&&!S.restore()&&d(!1),Object.defineProperty(u,x.key,x.value),d(!0)):S&&S.intact()?d(S.setValue(x.value)):d(Reflect.set(u,x.key,x.value))}function y(x,_){if(o.diff&&m===_)return i(l,c,p);let d=new P(u,{type:s?"def":"set",key:g,value:m,isUpdate:x,oldValue:_,related:[...a],operation:s?"defineProperty":"set",detail:o.detail}),I=R.getInstance(u,!1,o.namespace);return I?I.emit(d,h):h(d)}return ue(u,g,x=>{if(!x)return y(x);if(g==="length"&&Array.isArray(u)&&v(u).has("$length"))return y(!0,v(u).get("$length"));let _={...o,withPropertyDescriptors:s};return $(u,g,d=>y(x,d),_)},o)}([],f.slice(0),i=>{let l=N.getInstance(u,!1,o.namespace);return l&&l.emit(i,{eventsArePropertyDescriptors:!!s}),n(oe(e)?i.map(c=>c.status):i[0]?.status)})}function te(r,e,t,n=s=>s,o={}){return V(r,e,t,n,o,!0)}function vt(r,e,t=o=>o,n={}){return V(r,e,t,n,!0)}function re(r,e,t=o=>o,n={}){let o=q(r);w(t)&&([n,t]=[t,f=>f]);let s=k(e,!1),u=[...s];return function f(a,i,l){if(!i.length)return l(a);let c=i.shift();function p(m,h=void 0){let y=d=>(m.status=d,f(a.concat(m),i,l));if(arguments.length>1)return y(m,h);let x=v(o,"accessorizedProps",!1),_=x&&x.get(m.key);return _&&!_.restore()&&y(!1),y(Reflect.deleteProperty(o,m.key))}function g(m){let h=new P(o,{type:"delete",key:c,oldValue:m,related:[...u],operation:"deleteProperty",detail:n.detail}),y=R.getInstance(o,!1,n.namespace);return y?y.emit(h,p):p(h)}return $(o,c,g,n)}([],s.slice(0),f=>{let a=N.getInstance(o,!1,n.namespace);return a&&a.emit(f),t(oe(e)?f.map(i=>i.status):f[0].status)})}function Pt(r,e,t=o=>o,n={}){return re(...arguments)}function Ae(r,e,t=null,n=s=>s,o={}){return j(r,"construct",arguments.length>2?{argumentsList:e,newTarget:t}:{argumentsList:e},n,o)}function Ie(r,e,t,n=s=>s,o={}){let s=ee(e),u;if(Array.isArray(e)){if(o.arrayMethodName){let f=new P(s,{operation:o.arrayMethodName,argumentsList:t});N.getInstance(s,!1,o.namespace)?.emit([f],{eventIsArrayMethodDescriptor:!0})}v(s).set("$length",s.length),u=Ce(s,()=>j(r,"apply",{thisArgument:e,argumentsList:t},n,o),o),v(s).delete("$length")}else u=j(r,"apply",{thisArgument:s,argumentsList:t},n,o);return u}function Te(r,e,t=o=>o,n={}){return j(r,"setPrototypeOf",{proto:e},t,n)}function je(r,e=n=>n,t={}){return j(r,"preventExtensions",{},e,t)}function We(r,e,t,n={}){let o=new AbortController;ae.setMaxListeners?.(0,o.signal),n.signal&&n.signal.addEventListener("abort",()=>o.abort());let s={...n,signal:o.signal},u=N.getInstance(r,!0,s.namespace),f=new Map;return function a(i=[],l=null){let c,p,g;if(oe(e)){if(l){g=!0,p=l;for(let m of i)f.get(m.key)?.remove(),f.delete(m.key)}else p=u.addRegistration(e,a,s);c={signal:p.signal,childRegistrations:f}}else l?.remove(),p=u.addRegistration(e,a,s),c={signal:p.signal};if(s.childRegistrations&&s.keyInParent&&s.childRegistrations.set(s.keyInParent,p),arguments.length){let m=t(i,c);if(arguments.length>1)return m}return o}}function j(r,e,t={},n=s=>s,o={}){r=q(r),w(n)&&([o,n]=[n,a=>a]);function s(a,i){return arguments.length>1?n(i):n((Reflect[e]||Object[e])(r,...Object.values(t)))}let u=new P(r,{operation:e,...t}),f=R.getInstance(r,!1,o.namespace);return f?f.emit(u,s):s(u)}function oe(r){return r===1/0||Array.isArray(r)}function q(r,e=!0,t=!0){if((!r||!b(r))&&e)throw new Error(`Object must be of type object or array! "${G(r)}" given.`);return r instanceof P&&(r.type==="def"&&t?r=typeof r.value.get=="function"?r.value.get():r.value.value:r=r.value),r&&ee(r)}function Ot(r,e,t,n={}){return e===1/0?n.level&&!b(r)?t([]):t(Object.entries(Object.getOwnPropertyDescriptors(r)).filter(([,o])=>o.writable!==!1&&!o.get&&!o.set).map(([o])=>o)):t(k(e,!1))}var A={...Le,...Oe},Ve=A;var Q=class extends le(EventTarget){#e;#t;constructor(e,{autoStart:t=!0,naturalOpen:n=!0,postAwaitsOpen:o=!1}={}){if(super(),this.#e=typeof e=="string"?new WebSocket(e):e,E(this).set("options",{autoStart:t,naturalOpen:n,postAwaitsOpen:o}),this.constructor.upgradeEvents(this.#e,this),n&&t&&this.#e.readyState===WebSocket.OPEN&&this.start(),this.#t=new Promise(u=>{this.#e.readyState===WebSocket.OPEN?u():this.#e.addEventListener("open",u)}),this.#e.readyState===WebSocket.CLOSED)try{this.close()}catch{}}static _hydrateMessage(e,t){try{let n;if(typeof t.data=="string"&&w(n=JSON.parse(t.data))&&n[".wq"])return Object.defineProperty(t,"data",{value:n,configurable:!0}),super._hydrateMessage(e,t)}catch{}return t}__postMessage(e,t){this.#t.then(()=>{this.#e.send(JSON.stringify(e),t)})}};var Ue=(r,...e)=>F(r,"port+",...e),E=(r,...e)=>F(r,"port+","meta",...e),D=r=>F(r,"port+","meta").get("options")||{},He=["addEventListener","addRequestListener","postMessage","postRequest","dispatchEvent","relay","start","readyStateChange","removeEventListener","close"],Ge=["options","readyState","onmessage","onmessageerror"],O=class extends Ke(EventTarget){constructor(e={}){super(),Ue(this,"meta").set("options",e)}static[Symbol.hasInstance](e){return Function.prototype[Symbol.hasInstance].call(this,e)?!0:He.every(t=>typeof e[t]=="function")||Ge.every(t=>t in e)}};function Ke(r){return class extends r{static upgradeInPlace(e,t={}){if(e instanceof O)return e;let n=this.prototype;for(let s of He.concat("_autoStart")){let u=e[s],f=n[s];u&&Object.defineProperty(e,`_${s}`,{value:u.bind(e),configurable:!0}),Object.defineProperty(e,s,{value:f.bind(e),configurable:!0})}for(let s of Ge){let u=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e),s),f=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(n),s);u&&Object.defineProperty(e,`_${s}`,{...u,configurable:!0}),Object.defineProperty(e,s,{...f,configurable:!0})}return Ue(e,"meta").set("options",t),this.upgradeEvents(e),e}static upgradeEvents(e,t=null){t||(t=e);let n=E(e);if(n.get("events+"))return;let o=E(t),s=D(t),u=H.call(t),f=C.call(t);e instanceof BroadcastChannel&&(s.clientServerMode==="server"?o.set("clients",new Set):s.clientServerMode==="client"&&o.set("client_id",`client-${(0|Math.random()*9e6).toString(36)}`));let a=c=>{if(c instanceof M)return;if(e===t&&c.stopImmediatePropagation?.(),c=this._hydrateMessage?.(t,c)||c,c.data.ping==="connect"&&typeof c.data?.[".wq"]?.eventID=="string"&&(!(e instanceof WebSocket)||!s.naturalOpen)){let h=!0;e instanceof BroadcastChannel&&(s.clientServerMode==="server"&&typeof c.data.id=="string"?(o.get("clients").add(c.data.id),h="server"):c.data.id==="server"&&o.has("client_id")&&(h=o.get("client_id"))),c.ports?.forEach(y=>y.postMessage(h)),o.set("remote.start.called",!0),t.start();return}if(c.data.ping==="disconnect"&&typeof c.data?.[".wq"]?.eventID=="string"){let h=()=>{o.set("remote.close.called",!0),t.close()};e instanceof BroadcastChannel?s.clientServerMode==="server"&&typeof c.data.id=="string"?(o.get("clients").delete(c.data.id),!o.get("clients").size&&s.autoClose&&!f.close.state&&h()):s.clientServerMode==="client"&&c.data.id==="server"&&h():e instanceof MessagePort&&h();return}let p=c.data,g={};typeof c.data?.[".wq"]?.eventID=="string"&&({message:p,".wq":g}=c.data);let m=new M(p,{originalTarget:e,...g,ports:c.ports});t.dispatchEvent(m)},i=c=>{e instanceof WebSocket&&s.naturalOpen&&!(c instanceof M)&&(o.set("remote.start.called",!0),t.start())},l=c=>{(e instanceof WebSocket||e instanceof MessagePort)&&!(c instanceof M)&&(o.set("remote.close.called",!0),t.close())};n.set("internal_call",!0),e.addEventListener("message",a),e.addEventListener("error",a),e.addEventListener("open",i),e.addEventListener("close",l),n.delete("internal_call"),n.set("events+",!0),u.add(()=>{e.removeEventListener("message",a),e.removeEventListener("error",a),e.removeEventListener("open",i),e.removeEventListener("close",l),n.set("events+",!1)})}get options(){return{...D(this)}}get onmessageerror(){return typeof super.onmessageerror<"u"?super.onmessageerror:typeof this._onmessageerror<"u"?this._onmessageerror:null}set onmessageerror(e){if(typeof super.onmessageerror<"u"){super.onmessageerror=e;return}if(e!==null&&typeof e!="function")throw new TypeError("onmessageerror must be a function");if(Object.getOwnPropertyDescriptor(this,"_onmessageerror")?.set){this._onmessageerror=e;return}this._onmessageerror&&this.removeEventListener("messageerror",this._onmessageerror),this.addEventListener("messageerror",e),this._onmessageerror=e}get onmessage(){return typeof super.onmessage<"u"?super.onmessage:typeof this._onmessage<"u"?this._onmessage:null}set onmessage(e){if(this._autoStart(),typeof super.onmessage<"u"){super.onmessage=e;return}if(e!==null&&typeof e!="function")throw new TypeError("onmessage must be a function");if(Object.getOwnPropertyDescriptor(this,"_onmessage")?.set){this._onmessage=e;return}this._onmessage&&this.removeEventListener("message",this._onmessage),this.addEventListener("message",e),this._onmessage=e}addEventListener(...e){return this._autoStart(),H.call(this).add(()=>{this._removeEventListener?this._removeEventListener(...e):super.removeEventListener(...e)}),this._addEventListener?this._addEventListener(...e):super.addEventListener(...e)}dispatchEvent(e){let t=this._dispatchEvent?this._dispatchEvent(e):super.dispatchEvent(e);return e instanceof M&&Et.call(this,e),t}postMessage(e,t={}){this._autoStart();let n=C.call(this);n.messaging.state=!0,n.messaging.resolve(this);let o,{portOptions:s,wqOptions:{relayedFrom:u,...f}}=ce.call(this,e,t);(f.type!=="message"||f.live||f.bubbles||s.transfer?.length&&(this instanceof BroadcastChannel||this instanceof Q))&&(e={message:e,".wq":f}),t=s,o=u;let a=()=>{this._postMessage?this._postMessage(e,t,o):super.postMessage(e,t)};D(this).postAwaitsOpen?n.open.promise.then(a):a()}addRequestListener(e,t,n={}){let o=async s=>{let u=await t(s);for(let f of s.ports)f.postMessage(u)};this.addEventListener(e,o,n)}postRequest(e,t,n={}){let o;w(t)&&(n={once:!0,...t},o=new Promise(l=>{t=l}));let s=new MessageChannel;this.constructor.upgradeEvents(s.port1),s.port1.start();let{signal:u=null,once:f=!1,transfer:a=[],...i}=n;return s.port1.addEventListener("message",l=>t(l),{signal:u,once:f}),u?.addEventListener("abort",()=>{s.port1.close(),s.port2.close()}),this.postMessage(e,{...i,transfer:[s.port2].concat(a)}),o}relay({to:e,from:t,types:n="*",channel:o=null,resolveMessage:s=null,bidirectional:u=!1}={}){if(e&&t)throw new Error('Only one of "to" and "from" may be specified');if(t?e=this:t=this,e===t)throw new Error("Source and target ports cannot be the same");if(!(t instanceof O)||!(e instanceof O))throw new Error("Both source and target ports must be instance of MessagePortPlus.");if(typeof n!="function"&&!(n=[].concat(n)).length)throw new Error("Event types must be specified.");if(typeof o=="string")o={from:o};else if(w(o)){if(Object.keys(o).filter(l=>!["from","to"].includes(l)).length)throw new Error('Channel must be a string or an object of "from"/"to" members')}else if(o)throw new Error("Invalid channel parameter");let f=Je.call(t),a={targetPort:e,types:n,channel:o,resolveMessage:s};f.add(a);let i;return u&&(i=e.relay({to:t,types:n,channel:o&&{to:o.from,from:o.to},resolveMessage:s,bidirectional:!1})),()=>{f.delete(a),i?.()}}channel(e,t=null){let n=new MessageChannel;return O.upgradeInPlace(n.port1,{autoStart:this.options.autoStart,postAwaitsOpen:this.options.postAwaitsOpen}),O.upgradeInPlace(n.port2,{autoStart:this.options.autoStart,postAwaitsOpen:this.options.postAwaitsOpen}),H.call(this).add(this.relay({channel:e,to:n.port1,bidirectional:!0,resolveMessage:t})),n.port1.start(),this.readyStateChange("close").then(()=>{n.port1.close()}),n.port2}projectMutations({from:e,to:t,...n}){if(!e||!t||typeof e=="string"&&typeof t=="string"||b(e)&&b(t))throw new Error('Invalid "from"/"to" parameters');if(typeof e=="string"){if(!b(t))throw new Error('Invalid "to" parameter. Object/array expected');return xe.call(this,t,e,n)}if(typeof t=="string"){if(!b(e))throw new Error('Invalid "from" parameter. Object/array expected');return Qe.call(this,e,t,n)}throw new Error('Invalid "from"/"to" parameters')}get readyState(){let e=C.call(this);return e.close.state?"closed":e.open.state?"open":"connecting"}readyStateChange(e){if(!["open","messaging","close"].includes(e))throw new Error(`Invalid readyState query "${e}"`);return C.call(this)[e].promise}_autoStart(){let e=E(this),t=D(this);!e.get("internal_call")&&t.autoStart&&this.start()}start(){let e=C.call(this);if(e.open.state)return;let t,n=()=>{if(e.open.state)return;e.open.state=!0,e.open.resolve(this);let i=new M(null,{type:"open"});this._dispatchEvent?this._dispatchEvent(i):super.dispatchEvent(i),t?.port1.close(),t?.port2.close()},o=E(this),s=D(this);if(o.get("remote.start.called")){n();return}if(o.get("start.called"))return;o.set("start.called",!0),this._start?this._start():super.start?.(),t=new MessageChannel,t.port1.onmessage=i=>{this instanceof BroadcastChannel&&s.clientServerMode==="server"&&typeof i.data=="string"&&o.get("clients").add(i.data),n()};let{wqOptions:u}=ce.call(this),f=s.clientServerMode==="server"?"server":s.clientServerMode==="client"?o.get("client_id"):null,a={".wq":u,ping:"connect",id:f};this._postMessage?this._postMessage(a,{transfer:[t.port2]}):super.postMessage(a,{transfer:[t.port2]})}close(...e){let t=C.call(this);if(t.close.state)return;t.close.state=!0;let n=E(this),o=D(this);if(!n.get("remote.close.called")&&(this instanceof BroadcastChannel||this instanceof MessagePort)){let{wqOptions:u}=ce.call(this),f=o.clientServerMode==="server"?"server":o.clientServerMode==="client"?n.get("client_id"):null,a={".wq":u,ping:"disconnect",id:f};this._postMessage?this._postMessage(a):super.postMessage(a)}this._close?this._close(...e):super.close(...e),t.close.resolve(this);let s=new M(null,{type:"close"});this._dispatchEvent?this._dispatchEvent(s):super.dispatchEvent(s),Mt.call(this)}}}function le(r){return class extends Ke(r){static _hydrateMessage(e,t){if(typeof t.data?.[".wq"]?.numPorts!="number"||typeof t.data[".wq"].eventID!="string")return t;let n=H.call(e),o=t.data[".wq"].numPorts;Object.defineProperty(t,"ports",{value:[],configurable:!0});for(let s=0;s<o;s++){let u=e.channel(`${t.data[".wq"].eventID}:${s}`);t.ports.push(u)}return t}_postMessage(e,t={}){let{transfer:n=[],...o}=t;if(typeof e?.[".wq"]?.eventID=="string"){let s=H.call(this),u=n.filter(a=>a instanceof MessagePort),f=u.length;for(let a=0;a<f;a++)O.upgradeInPlace(u[a]),s.add(this.relay({channel:`${e[".wq"].eventID}:${a}`,to:u[a],bidirectional:!0})),u[a].start(),u[a].readyStateChange("close").then(()=>{let{wqOptions:i}=ce.call(this),l={".wq":i,ping:"disconnect"};this.postMessage(l,{type:`${e[".wq"].eventID}:${a}:message`})});e[".wq"].numPorts=f}return this.__postMessage(e,o)}}}function Et(r){if(r.propagationStopped)return;let e=E(this);e.get("parentNode")instanceof EventTarget&&(r.bubbles||e.get("parentNode")?.findPort?.(n=>n===this)&&r instanceof M)&&e.get("parentNode").dispatchEvent(r);let t=Je.call(this);if(t.size&&r instanceof M){let{type:n,eventID:o,data:s,live:u,bubbles:f,ports:a}=r,i=new WeakSet;for(let{targetPort:l,types:c,channel:p,resolveMessage:g}of t){if(i.has(l))continue;let m=n;p.from&&([,m]=new RegExp(`^${p.from.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}:([^:]+)$`).exec(n)||[],!m)||!(typeof c=="function"?c(m,this,l,p):[].concat(c).find(y=>y===m||y==="*"))||(i.add(l),l.postMessage(g?g(s,this,l,p):s,{transfer:a,type:p.to?`${p.to}:${m}`:m,eventID:o,bubbles:f,live:u,forwarded:!0,relayedFrom:this}))}}}function H(){let r=E(this);return r.has("garbage_collection")||r.set("garbage_collection",new Set),r.get("garbage_collection")}function Je(){let r=E(this);return r.has("downstream_registry")||r.set("downstream_registry",new Set),r.get("downstream_registry")}function C(){let r=E(this);if(!r.has("readystate_registry")){let e=t=>(t.promise=new Promise((n,o)=>(t.resolve=n,t.reject=o)),t);r.set("readystate_registry",{open:e({}),messaging:e({}),close:e({})})}return r.get("readystate_registry")}function Mt(){let r=E(this);for(let e of r.get("garbage_collection")||[])e instanceof AbortController?e.abort():typeof e=="function"&&e();r.get("garbage_collection")?.clear(),r.get("downstream_registry")?.clear()}function ce(r=void 0,e={}){if(Array.isArray(e))e={transfer:e};else if(!e||typeof e!="object")throw new TypeError("transferOrOptions must be an array or an object");let{type:t="message",eventID:n=null,live:o=!1,observing:s=!1,bubbles:u=!1,forwarded:f=!1,relayedFrom:a=null,signal:i=null,withArrayMethodDescriptors:l=!1,honourDoneMutationFlags:c=!1,...p}=e;return n||(n=`${t}-${(0|Math.random()*9e6).toString(36)}`),!s&&!f&&b(r)&&o&&!t?.endsWith(".mutate")&&(Qe.call(this,r,n,{signal:i,withArrayMethodDescriptors:l,honourDoneMutationFlags:c}),s=!0),{portOptions:p,wqOptions:{type:t,eventID:n,live:o,observing:s,honourDoneMutationFlags:c,bubbles:u,forwarded:f,relayedFrom:a}}}function Qe(r,e,{signal:t,withArrayMethodDescriptors:n=!0,honourDoneMutationFlags:o=!1}={}){if(!b(r))throw new TypeError("data must be a plain object and not a stream");if(typeof e!="string")throw new TypeError("eventID must be a non-empty string");let s=a=>{let i;n&&Array.isArray(a[0].target)&&!a[0].argumentsList&&!["set","defineProperty","deleteProperty"].includes(a[0].operation)||(this.postMessage(a.map(l=>(i=!i&&o&&l.detail?.done,{...l,target:void 0})),{type:`${e}.mutate`}),i&&u.abort())},u=A.observe(r,A.subtree(),s,{signal:t,withArrayMethodDescriptors:n});return H.call(this).add(u),u}function xe(r,e,{signal:t,honourDoneMutationFlags:n=!1}={}){if(!b(r))throw new TypeError("data must be a plain object and not a stream");if(typeof e!="string")throw new TypeError("eventID must be a non-empty string");let o=f=>{if(!f.data?.length)return;let a;A.batch(r,()=>{for(let i of f.data){if(a=!a&&n&&i.detail?.done,i.argumentsList){let l=i.path.length?A.get(r,A.path(...i.path)):r;A.proxy(l)[i.operation](...i.argumentsList);continue}if(i.key!=="length"||["set","defineProperty","deleteProperty"].includes(i.operation)){let l=i.path.length===1?r:A.get(r,A.path(...i.path.slice(0,-1)));i.type==="delete"?A.deleteProperty(l,i.key):A.set(l,i.key,i.value)}}}),a&&s()};this.addEventListener(`${e}.mutate`,o,{signal:t});let s=()=>this.removeEventListener(`${e}.mutate`,o);return H.call(this).add(s),s}var pe=class extends le(BroadcastChannel){constructor(e,{autoStart:t=!0,postAwaitsOpen:n=!1,clientServerMode:o=null,autoClose:s=!0}={}){super(e);let u=E(this);if(o&&!["server","client"].includes(o))throw new Error('clientServerMode must be "server" or "client"');u.set("options",{autoStart:t,postAwaitsOpen:n,clientServerMode:o,autoClose:s}),this.constructor.upgradeEvents(this)}__postMessage(e,t){BroadcastChannel.prototype.postMessage.call(this,e)}};var me=class extends MessageChannel{constructor({autoStart:e=!0,postAwaitsOpen:t=!1}={}){super(),[this.port1,this.port2].forEach((n,o)=>{O.upgradeInPlace(n,{autoStart:e,postAwaitsOpen:t})})}};var X=class extends O{#e=new Set;get length(){return this.#e.size}[Symbol.iterator](){return this.#e[Symbol.iterator]()}constructor({autoStart:e=!0,postAwaitsOpen:t=!1,autoClose:n=!0}={}){super({autoStart:e,postAwaitsOpen:t,autoClose:n})}addPort(e,{enableBubbling:t=!0}={}){if(!(e instanceof O))throw new TypeError("Port must be a WQMessagePort instance.");if(C.call(this).close.state){let u=this.constructor.name;throw new Error(`Cannot add port to ${u}. ${u} is closed.`)}if(this.#e.has(e))return;this.#e.add(e);let o=E(e);if(t){if(o.get("parentNode"))throw new TypeError("Incoming port already has a parent node.");o.set("parentNode",this)}e.readyStateChange("open").then(()=>this.start()),e.readyStateChange("close").then(s);let s=()=>{this.#e.has(e)&&(this.#e.delete(e),t&&o.get("parentNode")===this&&o.set("parentNode",null),this.#e.size===0&&D(this).autoClose&&this.close())};return s}findPort(e){for(let t of this.#e)if(e(t))return t}_postMessage(e,t,n){for(let o of this.#e)o!==n&&o.postMessage(e,t)}_autoStart(){}start(){let e=C.call(this);if(e.open.state)return;e.open.state=!0,e.open.resolve(this);let t=new MessageEventPlus(null,{type:"open"});super.dispatchEvent(t)}close(...e){let t=C.call(this);if(t.close.state)return;t.close.state=!0;for(let o of this.#e)o.close?.(...e);t.close.resolve(this);let n=new MessageEventPlus(null,{type:"close"});super.dispatchEvent(n)}};var de=class extends X{#e;get channelSpec(){return this.#e}constructor(e=null,t={}){if(super(t),typeof e=="string")e={from:e,to:e};else if(w(e)){if(Object.keys(e).filter(n=>!["from","to"].includes(n)).length)throw new Error('Channel must be a string or an object of "from"/"to" members')}else if(e)throw new Error("Invalid channel parameter");this.#e=e}addPort(e,{resolveMessage:t=null,...n}={}){let o=(l,...c)=>t?t(l,...c):l,s=super.addPort(e,n),u=e.relay({channel:this.#e,to:this,bidirectional:!1,resolveMessage:o}),f=this.#e.from&&`${this.#e.from}:message`||"message";this.postMessage(o({event:"joins"},e,this),{type:f,relayedFrom:e});let a=()=>{this.postMessage(o({event:"leaves"},e,this),{type:f,relayedFrom:e})},i=()=>{a(),u(),s()};return e.readyStateChange("close").then(i),i}};globalThis.webqit||(globalThis.webqit={});Object.assign(globalThis.webqit,Ne);})();
|
|
1
|
+
(()=>{var Ye=Object.defineProperty;var de=(r,e)=>{for(var t in e)Ye(r,t,{get:e[t],enumerable:!0})};var Re={};de(Re,{BroadcastChannelPlus:()=>pe,MessageChannelPlus:()=>me,MessageEventPlus:()=>j,MessagePortPlus:()=>O,Observer:()=>We,RelayPort:()=>he,StarPort:()=>X,WebSocketPort:()=>Q});function x(r){return!Array.isArray(r)&&typeof r=="object"&&r}function G(r){return typeof r}function I(r){return Array.isArray(r)}function K(r){return typeof r=="function"}function ge(r){return r===null||r===""}function z(r){return arguments.length&&(r===void 0||typeof r>"u")}function y(r){return Array.isArray(r)||typeof r=="object"&&r||K(r)}function ye(r){return ge(r)||z(r)||r===!1||r===0||y(r)&&!Object.keys(r).length}function C(r){return K(r)||r&&{}.toString.call(r)==="[object function]"}function se(r){return r instanceof String||typeof r=="string"&&r!==null}function _e(r){return!se(r)&&!z(r.length)}function $(r,...e){if(!r||!["object","function"].includes(typeof r))throw new Error("Argument #1 must be of type object");let t=r[Symbol.for("wq")];if(t||(t=new ie,Object.defineProperty(r,Symbol.for("wq"),{value:t,enumerable:!1,configurable:!1,writable:!1})),!e.length)return t;let n,o;for(;n=e.shift();)(o=t)&&!(t=t.get(n))&&(t=new ie,o.set(n,t));return t}var ie=class extends Map{};var j=class extends MessageEvent{#e;get originalTarget(){return this.#e}#t;get eventID(){return this.#t}#r;get data(){return this.#r}#o;get live(){return this.#o}#a;get bubbles(){return this.#a}#f;get forwarded(){return this.#f}#s;get honourDoneMutationFlags(){return this.#s}#n=[];get ports(){return this.#n}constructor(e,{originalTarget:t=null,type:n="message",eventID:o,live:s=!1,honourDoneMutationFlags:u=!1,bubbles:f=!1,forwarded:a=!1,ports:i=[]}={}){if(n&&typeof n!="string")throw new TypeError("Where specified, wqEventOptions.type must be a string");if(super(n),this.#r=e,this.#e=t,this.#t=o,this.#o=s,this.#a=f,this.#f=a,this.#s=u,this.#n=i,this.#n.forEach(l=>O.upgradeInPlace(l)),y(this.#r)&&this.#o){if(typeof o!="string")throw new TypeError("eventID must be a non-empty string");we.call(t,this.#r,this.#t,{honourDoneMutationFlags:this.#s})}}#u=!1;get immediatePropagationStopped(){return this.#u}stopImmediatePropagation(){this.#u=!0,this.#i=!0,super.stopImmediatePropagation()}#i=!1;get propagationStopped(){return this.#i}stopPropagation(){this.#i=!0,super.stopPropagation()}#l=!1;get defaultPrevented(){return this.#l}preventDefault(){this.#l=!0,super.preventDefault()}respondWith(e,t=[]){for(let n of this.#n)n.postMessage(e,t);return!!this.#n.length}};var Le={};de(Le,{any:()=>_t,apply:()=>Ie,batch:()=>Ce,construct:()=>Te,defineProperties:()=>vt,defineProperty:()=>te,deleteProperties:()=>Pt,deleteProperty:()=>re,get:()=>N,getOwnPropertyDescriptor:()=>fe,getOwnPropertyDescriptors:()=>wt,getPrototypeOf:()=>Ee,has:()=>ue,intercept:()=>bt,isExtensible:()=>Me,map:()=>xt,observe:()=>qe,ownKeys:()=>Se,path:()=>gt,preventExtensions:()=>je,reduce:()=>De,set:()=>W,setPrototypeOf:()=>Ae,subtree:()=>yt});function F(r,e=!0){return I(r)?r:!e&&x(r)?[r]:r!==!1&&r!==0&&ye(r)?[]:_e(r)?Array.prototype.slice.call(r):x(r)?Object.values(r):[r]}var v=(r,...e)=>$(r,"observerAPI",...e),J=(r,e)=>r instanceof Promise?r.then(e):e(r),ae={};var B=class{constructor(e,t){this.registry=e,Object.assign(this,{...t,target:e.target}),this.params.signal&&this.params.signal.addEventListener("abort",()=>this.remove())}remove(){return this.removed=!0,this.registry.removeRegistration(this)}};var Y=class extends B{constructor(){super(...arguments),this.emit.currentRegistration=this,Object.defineProperty(this,"abortController",{value:new AbortController}),Object.defineProperty(this,"signal",{value:this.abortController.signal}),ae.setMaxListeners?.(0,this.signal)}remove(){this.abortController.abort(),super.remove()}fire(e){if(this.emit.recursionTarget&&!["inject","force-async","force-sync"].includes(this.params.recursions))return;let t=e,n=this.filter;if(n!==1/0&&(n=F(n,!1))&&(t=e.filter(s=>n.includes(s.key))),this.params.diff&&(t=t.filter(s=>s.type!=="set"||s.value!==s.oldValue)),!t.length)return;if(["inject","defer"].includes(this.params.recursions)){if(this.emit.recursionTarget){this.emit.recursionTarget.push(...t);return}this.emit.recursionTarget=this.params.recursions==="inject"?t:[]}let o=this.filter===1/0||Array.isArray(this.filter)?this.emit(t,this):this.emit(t[0],this);return J(o,s=>{let u=this.emit.recursionTarget;return delete this.emit.recursionTarget,this.params.recursions==="defer"&&u?.length?this.emit.currentRegistration.fire(u):s})}};var V=class{constructor(e){this.target=e,this.entries=[]}addRegistration(e){return this.entries.push(e),e}removeRegistration(e){this.entries=this.entries.filter(t=>t!==e)}static _getInstance(e,t,n=!0,o=this.__namespace){if(!y(t))throw new Error(`Subject must be of type object; "${G(t)}" given!`);let s=this;return o&&v(globalThis,"observerAPI","namespaces").has(e+"-"+o)&&(s=v(globalThis,"observerAPI","namespaces").get(e+"-"+o),e+="-"+o),!v(t,"registry").has(e)&&n&&v(t,"registry").set(e,new s(t)),v(t,"registry").get(e)}static _namespace(e,t,n=null){if(e+="-"+t,arguments.length===2)return v(globalThis,"observerAPI","namespaces").get(e);if(!(n.prototype instanceof this))throw new Error(`The implementation of the namespace ${this.name}.${t} must be a subclass of ${this.name}.`);v(globalThis,"observerAPI","namespaces").set(e,n),n.__namespace=t}};var P=class{constructor(e,t){if(this.target=e,!t.operation)throw new Error("Descriptor operation must be given in definition!");Object.assign(this,t)}get[Symbol.toStringTag](){return"Descriptor"}static[Symbol.hasInstance](e){return e?.[Symbol.toStringTag]==="Descriptor"&&e.operation}};var L=class extends V{static getInstance(e,t=!0,n=null){return super._getInstance("listeners",...arguments)}static namespace(e,t=null){return super._namespace("listeners",...arguments)}constructor(e){super(e),this.batches=[]}addRegistration(e,t,n){return super.addRegistration(new Y(this,{filter:e,emit:t,params:n}))}emit(e,{eventsArePropertyDescriptors:t=!1,eventIsArrayMethodDescriptor:n=!1}={}){if(this.batches.length){let o=this.batches[0].params.arrayMethodName;this.batches[0].snapshots.push({events:[...e],arrayMethodName:o,eventsArePropertyDescriptors:t,eventIsArrayMethodDescriptor:n});return}this.$emit(this.entries,[{events:e,eventsArePropertyDescriptors:t,eventIsArrayMethodDescriptor:n}])}$emit(e,t){let n=0,o=0,s=0;for(let l of e)n+=1,l.params.withPropertyDescriptors&&(o+=1),l.params.withArrayMethodDescriptors&&(s+=1);let u=[],f=[],a=[],i=[];for(let l of t){let c=l.arrayMethodName,m=l.eventsArePropertyDescriptors,d=l.eventIsArrayMethodDescriptor;for(let p of l.events)if(c&&(p.operation=c),o&&(s&&u.push(p),d||s!==n&&f.push(p)),o!==n){let b=p;if(m){let{target:_,type:w,...g}=p;b=new P(_,{type:"set",...g}),Object.defineProperty(b,"value","get"in g.value?{get:()=>g.value.get()}:{value:g.value.value}),g.oldValue&&Object.defineProperty(b,"oldValue","get"in g.oldValue?{get:()=>g.oldValue.get()}:{value:g.oldValue.value})}s&&a.push(b),d||s!==n&&i.push(b)}}for(let l of e)l.params.withPropertyDescriptors?l.params.withArrayMethodDescriptors?u.length&&l.fire(u):f.length&&l.fire(f):l.params.withArrayMethodDescriptors?a.length&&l.fire(a):i.length&&l.fire(i)}batch(e,t={}){this.batches.unshift({entries:[...this.entries],snapshots:[],params:t});let n=e();return J(n,o=>{let s=this.batches.shift();return s.snapshots.length&&this.$emit(s.entries,s.snapshots),o})}};var Z=class extends B{exec(e,t,n){return this.running||!this.traps[e.operation]?t(...Array.prototype.slice.call(arguments,2)):(this.running=!0,this.traps[e.operation](e,n,(...o)=>(this.running=!1,t(...o))))}};var R=class extends V{static getInstance(e,t=!0,n=null){return super._getInstance("traps",...arguments)}static namespace(e,t=null){return super._namespace("traps",...arguments)}addRegistration(e){return super.addRegistration(new Z(this,e))}emit(e,t=null){let n=this;return function o(s,...u){let f=n.entries[s];return f?f.exec(e,(...a)=>o(s+1,...a),...u):t?t(e,...u):u[0]}(0)}};var Oe={};de(Oe,{accessorize:()=>ht,proxy:()=>ve,unaccessorize:()=>dt,unproxy:()=>ee});var Be=Symbol("wqOriginal");function ht(r,e,t={}){r=Pe(r);let n=v(r,"accessorizedProps");function o(a){let i,l=r;do i=Object.getOwnPropertyDescriptor(l,a);while(!i&&(l=Object.getPrototypeOf(l)));return i?{proto:l,descriptor:i}:{descriptor:{value:void 0,configurable:!0,enumerable:!0,writable:!0}}}function s(a){if(n.has(a+""))return!0;let i=o(a);i.getValue=function(m=!1){return m?this.descriptor:this.descriptor.get?this.descriptor.get():this.descriptor.value},i.setValue=function(m,d=!1){if(this.dirty=!0,d){this.descriptor=m;return}return this.descriptor.set?this.descriptor.set(m)!==!1:(this.descriptor.value=m,!0)},i.intact=function(){let m=Object.getOwnPropertyDescriptor(r,a);return m?.get===c.get&&m?.set===c.set&&n.get(a+"")===this},i.restore=function(){return this.intact()?(this.proto&&this.proto!==r||!this.proto&&!this.dirty?delete r[a]:Object.defineProperty(r,a,this.descriptor),n.delete(a+""),!0):!1},n.set(isNaN(a)?a:parseInt(a),i);let{enumerable:l=!0}=i.descriptor,c={enumerable:l,configurable:!0};("value"in i.descriptor||i.descriptor.set)&&(c.set=function(m){return W(this,a,m,t)}),("value"in i.descriptor||i.descriptor.get)&&(c.get=function(){return N(this,a,t)});try{return Object.defineProperty(r,a,c),!0}catch{return n.delete(a+""),!1}}let f=(Array.isArray(e)?e:e===void 0?Object.keys(r):[e]).map(s);return e===void 0||Array.isArray(e)?f:f[0]}function dt(r,e,t={}){r=Pe(r);let n=v(r,"accessorizedProps");function o(f){return n.has(f+"")?n.get(f+"").restore():!0}let u=(Array.isArray(e)?e:e===void 0?Object.keys(r):[e]).map(o);return e===void 0||Array.isArray(e)?u:u[0]}function ve(r,e={},t=void 0){let n=Pe(r);if(typeof e.membrane=="boolean")throw new Error("The params.membrane parameter cannot be of type boolean.");if(e.membrane&&v(n,"membraneRef").has(e.membrane))return v(n,"membraneRef").get(e.membrane);let o={apply:(f,a,i)=>Ie(f,a,i,void 0,e),construct:(f,a,i=null)=>Te(f,a,i,e),defineProperty:(f,a,i)=>te(f,a,i,e),deleteProperty:(f,a)=>re(f,a,e),get:(f,a,i=null)=>{if(a===Be)return n;let l={...e,receiver:i},c=N(f,a,l);return Array.isArray(f)&&typeof c=="function"&&!/^class\s?/.test(Function.prototype.toString.call(c))?ve(c,{...e,arrayMethodName:a,membrane:i},t):e.chainable&&y(c)&&a!=="prototype"&&!(typeof c=="function"&&/^class\s?|\{\s\[native\scode\]\s\}$/.test(Function.prototype.toString.call(c)))?ve(c,e,t):c},getOwnPropertyDescriptor:(f,a)=>fe(f,a,e),getPrototypeOf:f=>Ee(f,e),has:(f,a)=>ue(f,a,e),isExtensible:f=>Me(f,e),ownKeys:f=>Se(f,e),preventExtensions:f=>je(f,e),set:(f,a,i,l=null)=>W(f,a,i,{...e,receiver:l}),setPrototypeOf:(f,a)=>Ae(f,a,e)},s=t?.(o)||o,u=new Proxy(n,s);return e.membrane&&v(n,"membraneRef").set(e.membrane,u),u}function ee(r){return r&&r[Be]||r}function Pe(r){if(!r||!y(r))throw new Error("Target must be of type object!");return ee(r)}var ne=class extends Array{get[Symbol.toStringTag](){return"Path"}static[Symbol.hasInstance](e){return Array.isArray(e)&&e[Symbol.toStringTag]==="Path"}};function gt(...r){return new ne(...r)}var U=class extends Array{get[Symbol.toStringTag](){return"Subtree"}static[Symbol.hasInstance](e){return Array.isArray(e)&&e[Symbol.toStringTag]==="Subtree"}};function yt(){return new U}function _t(){return 1/0}function De(r,e,t,n=s=>s,o={}){let s=e instanceof U;if(!(!s&&!e?.length))return function u(f,a,i,l){let c=l||a[i.level]instanceof U,m=c?1/0:a[i.level],d=c?!1:i.level===a.length-1;return f instanceof P&&f.operation!=="get"?i={...i,probe:"always"}:i.probe!=="always"&&(i={...i,probe:!d}),t(f,m,(p,...b)=>{let _=h=>{h instanceof P&&(h.path="key"in h?[h.key]:[],f instanceof P&&(h.path="key"in h?f.path.concat(h.key):f.path.slice(0),Object.defineProperty(h,"context",{get:()=>f,configurable:!0})))},w=b[0]||{},g=h=>{if(h instanceof P&&"argumentsList"in h)return;let T=D(h,!1);return J(T,M=>(h instanceof P?h.value=M:h=M,u(h,a,{...i,...w,keyInParent:h.key,level:i.level+1},c)))};if(oe(m)&&Array.isArray(p)){if(p.forEach(_),d)return n(p,...b);c&&p[0]instanceof P&&(p[0].operation!=="get"||o.asGet)&&n(p,...b);for(let h of p)g(h);return}return _(p),d?n(p,...b):g(p)},i)}(r,e.slice(0),{...o,level:0},s)}function qe(r,e,t,n={}){let o=D(r,!n.level);if(C(arguments[1])&&([,t,n={}]=arguments,e=1/0),!C(t))throw new Error(`Handler must be a function; "${G(t)}" given!`);if(e instanceof ne||e instanceof U)return De(o,e,qe,t,n);if(n={...n,descripted:!0},delete n.live,!y(o))return n.probe&&N(o,e,t,n)||void 0;let s=Ve(o,e,t,n);return n.probe?N(o,e,s,n):s()}function bt(r,e,t={}){let n=D(r);return x(e)||([,,,t={}]=arguments,e={[arguments[1]]:arguments[2]}),R.getInstance(n,!0,t.namespace).addRegistration({traps:e,params:t})}function fe(r,e,t=o=>o,n={}){return A(r,"getOwnPropertyDescriptor",{key:e},t,n)}function wt(r,e,t=o=>o,n={}){return A(r,"getOwnPropertyDescriptors",{key:e},t,n)}function Ee(r,e=n=>n,t={}){return A(r,"getPrototypeOf",{},e,t)}function Me(r,e=n=>n,t={}){return A(r,"isExtensible",{},e,t)}function Se(r,e=n=>n,t={}){return A(r,"ownKeys",{},e,t)}function ue(r,e,t=o=>o,n={}){return A(r,"has",{key:e},t,n)}function N(r,e,t=o=>o,n={}){let o,s=D(r,!n.level);return x(t)?[n,t]=[t,u=>u]:n.live&&(o=!0),e instanceof ne||e instanceof U?De(s,e,N,t,{...n,asGet:!0}):Ot(s,e,u=>{let f=[...u];return function a(i,l,c){if(!l.length)return c(i);let m=l.shift();if(!["string","number","symbol"].includes(typeof m))throw new Error(`Property name/key ${m} invalid.`);function d(_,w=void 0){let g=M=>(_.value=M,a([...i,n.live||n.descripted?_:M],l,c));if(arguments.length>1)return g(w);if(!y(s))return g(s?.[_.key]);let h=v(s,"accessorizedProps",!1),T=h&&h.get(_.key);if(T&&T.intact())return g(T.getValue(n.withPropertyDescriptors));if(n.withPropertyDescriptors){let M=Object.getOwnPropertyDescriptor(s,_.key);return g(M)}return g(Reflect.get(s,_.key))}let p=new P(s,{type:"get",key:m,value:void 0,operation:"get",related:f});if(!y(s))return d(p);let b=R.getInstance(s,!1,n.namespace);return b?b.emit(p,d):d(p)}([],u.slice(0),a=>{let i=oe(e)?a:a[0];return o&&y(s)?Ve(s,e,t,n,r.key)(i):t(i)})},n)}function Ce(r,e,t={}){let n=D(r);return L.getInstance(n,!0,t.namespace).batch(e,t)}function xt(r,e,t={}){e=D(e),r=D(r);let n=(t.only||[]).slice(0),o=(t.except||[]).slice(0),s=Object.keys(t.spread?[...r]:r).map(i=>isNaN(i)?i:parseInt(i)),u=n.length?n.filter(i=>s.includes(i)):s.filter(i=>!o.includes(i)),f=i=>!Array.isArray(e)||isNaN(i)?i:i-o.filter(l=>l<i).length,a=i=>{let l=fe(r,i,t);"value"in l&&l.writable&&l.enumerable&&l.configurable?W(e,f(i),l.value,t):(l.enumerable||t.onlyEnumerable===!1)&&te(e,i,{...l,configurable:!0},t)};return Ce(e,()=>{u.forEach(a)}),qe(r,i=>{i.filter(l=>n.length?n.includes(l.key):!o.includes(l.key)).forEach(l=>{if(l.type==="delete")return re(e,f(l.key),t);if(l.type==="def"){(l.value.enumerable||t.onlyEnumerable===!1)&&te(e,f(l.key),{...l.value,configurable:!0},t);return}a(l.key)})},{...t,withPropertyDescriptors:!0})}function W(r,e,t,n=u=>u,o={},s=!1){let u=D(r),f=[[e,t]];x(e)&&([,,n=i=>i,o={},s=!1]=arguments,f=Object.entries(e)),x(n)&&([s,o,n]=[typeof o=="boolean"?o:s,n,i=>i]);let a=f.map(([i])=>i);return function i(l,c,m){if(!c.length)return m(l);let[d,p]=c.shift();function b(w,g=void 0){let h=Xe=>(w.status=Xe,i(l.concat(w),c,m));if(arguments.length>1)return h(w,g);let T=v(u,"accessorizedProps",!1),M=T&&T.get(w.key);return w.type==="def"?(M&&!M.restore()&&h(!1),Object.defineProperty(u,w.key,w.value),h(!0)):M&&M.intact()?h(M.setValue(w.value)):h(Reflect.set(u,w.key,w.value))}function _(w,g){if(o.diff&&p===g)return i(l,c,m);let h=new P(u,{type:s?"def":"set",key:d,value:p,isUpdate:w,oldValue:g,related:[...a],operation:s?"defineProperty":"set",detail:o.detail}),T=R.getInstance(u,!1,o.namespace);return T?T.emit(h,b):b(h)}return ue(u,d,w=>{if(!w)return _(w);if(d==="length"&&Array.isArray(u)&&v(u).has("$length"))return _(!0,v(u).get("$length"));let g={...o,withPropertyDescriptors:s};return N(u,d,h=>_(w,h),g)},o)}([],f.slice(0),i=>{let l=L.getInstance(u,!1,o.namespace);return l&&l.emit(i,{eventsArePropertyDescriptors:!!s}),n(oe(e)?i.map(c=>c.status):i[0]?.status)})}function te(r,e,t,n=s=>s,o={}){return W(r,e,t,n,o,!0)}function vt(r,e,t=o=>o,n={}){return W(r,e,t,n,!0)}function re(r,e,t=o=>o,n={}){let o=D(r);x(t)&&([n,t]=[t,f=>f]);let s=F(e,!1),u=[...s];return function f(a,i,l){if(!i.length)return l(a);let c=i.shift();function m(p,b=void 0){let _=h=>(p.status=h,f(a.concat(p),i,l));if(arguments.length>1)return _(p,b);let w=v(o,"accessorizedProps",!1),g=w&&w.get(p.key);return g&&!g.restore()&&_(!1),_(Reflect.deleteProperty(o,p.key))}function d(p){let b=new P(o,{type:"delete",key:c,oldValue:p,related:[...u],operation:"deleteProperty",detail:n.detail}),_=R.getInstance(o,!1,n.namespace);return _?_.emit(b,m):m(b)}return N(o,c,d,n)}([],s.slice(0),f=>{let a=L.getInstance(o,!1,n.namespace);return a&&a.emit(f),t(oe(e)?f.map(i=>i.status):f[0].status)})}function Pt(r,e,t=o=>o,n={}){return re(...arguments)}function Te(r,e,t=null,n=s=>s,o={}){return A(r,"construct",arguments.length>2?{argumentsList:e,newTarget:t}:{argumentsList:e},n,o)}function Ie(r,e,t,n=s=>s,o={}){let s=ee(e),u;if(Array.isArray(e)){if(o.arrayMethodName){let f=new P(s,{operation:o.arrayMethodName,argumentsList:t});L.getInstance(s,!1,o.namespace)?.emit([f],{eventIsArrayMethodDescriptor:!0})}v(s).set("$length",s.length),u=Ce(s,()=>A(r,"apply",{thisArgument:e,argumentsList:t},n,o),o),v(s).delete("$length")}else u=A(r,"apply",{thisArgument:s,argumentsList:t},n,o);return u}function Ae(r,e,t=o=>o,n={}){return A(r,"setPrototypeOf",{proto:e},t,n)}function je(r,e=n=>n,t={}){return A(r,"preventExtensions",{},e,t)}function Ve(r,e,t,n={}){let o=new AbortController;ae.setMaxListeners?.(0,o.signal),n.signal&&n.signal.addEventListener("abort",()=>o.abort());let s={...n,signal:o.signal},u=L.getInstance(r,!0,s.namespace),f=new Map;return function a(i=[],l=null){let c,m,d;if(oe(e)){if(l){d=!0,m=l;for(let p of i)f.get(p.key)?.remove(),f.delete(p.key)}else m=u.addRegistration(e,a,s);c={signal:m.signal,childRegistrations:f}}else l?.remove(),m=u.addRegistration(e,a,s),c={signal:m.signal};if(s.childRegistrations&&s.keyInParent&&s.childRegistrations.set(s.keyInParent,m),arguments.length){let p=t(i,c);if(arguments.length>1)return p}return o}}function A(r,e,t={},n=s=>s,o={}){r=D(r),x(n)&&([o,n]=[n,a=>a]);function s(a,i){return arguments.length>1?n(i):n((Reflect[e]||Object[e])(r,...Object.values(t)))}let u=new P(r,{operation:e,...t}),f=R.getInstance(r,!1,o.namespace);return f?f.emit(u,s):s(u)}function oe(r){return r===1/0||Array.isArray(r)}function D(r,e=!0,t=!0){if((!r||!y(r))&&e)throw new Error(`Object must be of type object or array! "${G(r)}" given.`);return r instanceof P&&(r.type==="def"&&t?r=typeof r.value.get=="function"?r.value.get():r.value.value:r=r.value),r&&ee(r)}function Ot(r,e,t,n={}){return e===1/0?n.level&&!y(r)?t([]):t(Object.entries(Object.getOwnPropertyDescriptors(r)).filter(([,o])=>o.writable!==!1&&!o.get&&!o.set).map(([o])=>o)):t(F(e,!1))}var S={...Le,...Oe},We=S;var Q=class extends le(EventTarget){#e;#t;constructor(e,{handshake:t=0,postAwaitsOpen:n=!1}={}){if(super(),typeof t!="number")throw new Error("handshake must be a number");if(t<0||t>2)throw new Error("handshake must be between 0 and 2");if(E(this).set("options",{handshake:t,postAwaitsOpen:n}),this.#e=typeof e=="string"?new WebSocket(e):e,this.constructor.upgradeEvents(this.#e,this),this.#t=new Promise(s=>{this.#e.readyState===WebSocket.OPEN?s():this.#e.addEventListener("open",()=>s(),{once:!0})}),t===0&&this.#t.then(()=>this.start()),this.#e.readyState===WebSocket.CLOSED)try{this.close()}catch{}else this.#e.addEventListener("close",()=>{try{this.close()}catch{}},{once:!0})}static _hydrateMessage(e,t){try{let n;if(typeof t.data=="string"&&x(n=JSON.parse(t.data))&&n[".wq"])return Object.defineProperty(t,"data",{value:n,configurable:!0}),super._hydrateMessage(e,t)}catch{}return t}__postMessage(e,t){this.#t.then(()=>{this.#e.send(JSON.stringify(e),t)})}_close(){this.#e.close()}};var Ue=(r,...e)=>$(r,"port+",...e),E=(r,...e)=>$(r,"port+","meta",...e),k=r=>$(r,"port+","meta").get("options")||{},He=["addEventListener","addRequestListener","postMessage","postRequest","dispatchEvent","relay","start","readyStateChange","removeEventListener","close"],Ge=["options","readyState","onmessage","onmessageerror"],O=class extends Ke(EventTarget){constructor({handshake:e=0,postAwaitsOpen:t=!1,...n}={}){if(typeof e!="number")throw new Error("handshake must be a number");if(e<0||e>2)throw new Error("handshake must be between 0 and 2");super(),Ue(this,"meta").set("options",{handshake:e,postAwaitsOpen:t,...n})}static[Symbol.hasInstance](e){return Function.prototype[Symbol.hasInstance].call(this,e)?!0:He.every(t=>typeof e[t]=="function")||Ge.every(t=>t in e)}};function Ke(r){return class extends r{static upgradeInPlace(e,{handshake:t=0,postAwaitsOpen:n=!1}={}){if(e instanceof O)return e;if(typeof t!="number")throw new Error("handshake must be a number");if(t<0||t>2)throw new Error("handshake must be between 0 and 2");let o=this.prototype;for(let u of He.concat("_autoStart")){let f=e[u],a=o[u];f&&Object.defineProperty(e,`_${u}`,{value:f.bind(e),configurable:!0}),Object.defineProperty(e,u,{value:a.bind(e),configurable:!0})}for(let u of Ge){let f=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(e),u),a=Object.getOwnPropertyDescriptor(Object.getPrototypeOf(o),u);f&&Object.defineProperty(e,`_${u}`,{...f,configurable:!0}),Object.defineProperty(e,u,{...a,configurable:!0})}return Ue(e,"meta").set("options",{handshake:t,postAwaitsOpen:n}),this.upgradeEvents(e),t===0&&e.start(),e}static upgradeEvents(e,t=null){t||(t=e);let n=E(e);if(n.get("events+"))return;let o=E(t),s=k(t),u=H.call(t),f=q.call(t);e instanceof BroadcastChannel&&(s.clientServerMode==="server"?o.set("clients",new Set):s.clientServerMode==="client"&&o.set("client_id",`client-${(0|Math.random()*9e6).toString(36)}`));let a=i=>{if(i instanceof j)return;if(e===t&&i.stopImmediatePropagation?.(),i=this._hydrateMessage?.(t,i)||i,i.data.ping==="connect"&&typeof i.data?.[".wq"]?.eventID=="string"&&(!(e instanceof WebSocket)||s.handshake)){let d=s.handshake===0||o.get("start.called"),p={isOpen:d};e instanceof BroadcastChannel&&(s.clientServerMode==="server"&&typeof i.data.id=="string"?(o.get("clients").add(i.data.id),p.id="server"):i.data.id==="server"&&o.has("client_id")&&(p.id=o.get("client_id"))),i.ports?.forEach(b=>b.postMessage(p)),d&&(o.set("remote.open.called",!0),t.start());return}if(i.data.ping==="disconnect"&&typeof i.data?.[".wq"]?.eventID=="string"){let d=()=>{o.set("remote.close.called",!0),t.close()};e instanceof BroadcastChannel?s.clientServerMode==="server"&&typeof i.data.id=="string"?(o.get("clients").delete(i.data.id),!o.get("clients").size&&s.autoClose&&!f.close.state&&d()):s.clientServerMode==="client"&&i.data.id==="server"&&d():e instanceof MessagePort&&d();return}let l=i.data,c={};typeof i.data?.[".wq"]?.eventID=="string"&&({message:l,".wq":c}=i.data);let m=new j(l,{originalTarget:e,...c,ports:i.ports});t.dispatchEvent(m)};n.set("internal_call",!0),e.addEventListener("message",a),e.addEventListener("error",a),n.delete("internal_call"),u.add(()=>{e.removeEventListener("message",a),e.removeEventListener("error",a),n.set("events+",!1)}),n.set("events+",!0)}get options(){return{...k(this)}}get onmessageerror(){return typeof super.onmessageerror<"u"?super.onmessageerror:typeof this._onmessageerror<"u"?this._onmessageerror:null}set onmessageerror(e){if(typeof super.onmessageerror<"u"){super.onmessageerror=e;return}if(e!==null&&typeof e!="function")throw new TypeError("onmessageerror must be a function");if(Object.getOwnPropertyDescriptor(this,"_onmessageerror")?.set){this._onmessageerror=e;return}this._onmessageerror&&this.removeEventListener("messageerror",this._onmessageerror),this.addEventListener("messageerror",e),this._onmessageerror=e}get onmessage(){return typeof super.onmessage<"u"?super.onmessage:typeof this._onmessage<"u"?this._onmessage:null}set onmessage(e){if(typeof super.onmessage<"u"){super.onmessage=e,this._autoStart();return}if(e!==null&&typeof e!="function")throw new TypeError("onmessage must be a function");if(Object.getOwnPropertyDescriptor(this,"_onmessage")?.set){this._onmessage=e,this._autoStart();return}this._onmessage&&this.removeEventListener("message",this._onmessage),this.addEventListener("message",e),this._onmessage=e,this._autoStart()}addEventListener(...e){H.call(this).add(()=>{this._removeEventListener?this._removeEventListener(...e):super.removeEventListener(...e)});let n=this._addEventListener?this._addEventListener(...e):super.addEventListener(...e);return this._autoStart(),n}dispatchEvent(e){let t=this._dispatchEvent?this._dispatchEvent(e):super.dispatchEvent(e);return e instanceof j&&Et.call(this,e),t}postMessage(e,t={}){this._autoStart();let n=q.call(this);n.messaging.state=!0,n.messaging.resolve(this);let o,{portOptions:s,wqOptions:{relayedFrom:u,...f}}=ce.call(this,e,t);(f.type!=="message"||f.live||f.bubbles||s.transfer?.length&&(this instanceof BroadcastChannel||this instanceof Q))&&(e={message:e,".wq":f}),t=s,o=u;let a=()=>{this._postMessage?this._postMessage(e,t,o):super.postMessage(e,t)};k(this).postAwaitsOpen?n.open.promise.then(a):a()}addRequestListener(e,t,n={}){let o=async s=>{let u=await t(s);for(let f of s.ports)f.postMessage(u)};this.addEventListener(e,o,n)}postRequest(e,t,n={}){let o;x(t)&&(n={once:!0,...t},o=new Promise(l=>{t=l}));let s=new MessageChannel;this.constructor.upgradeEvents(s.port1),s.port1.start();let{signal:u=null,once:f=!1,transfer:a=[],...i}=n;return s.port1.addEventListener("message",l=>t(l),{signal:u,once:f}),u?.addEventListener("abort",()=>{s.port1.close(),s.port2.close()}),this.postMessage(e,{...i,transfer:[s.port2].concat(a)}),o}relay({to:e,from:t,types:n="*",channel:o=null,resolveMessage:s=null,bidirectional:u=!1}={}){if(e&&t)throw new Error('Only one of "to" and "from" may be specified');if(t?e=this:t=this,e===t)throw new Error("Source and target ports cannot be the same");if(!(t instanceof O)||!(e instanceof O))throw new Error("Both source and target ports must be instance of MessagePortPlus.");if(typeof n!="function"&&!(n=[].concat(n)).length)throw new Error("Event types must be specified.");if(typeof o=="string")o={from:o};else if(x(o)){if(Object.keys(o).filter(l=>!["from","to"].includes(l)).length)throw new Error('Channel must be a string or an object of "from"/"to" members')}else if(o)throw new Error("Invalid channel parameter");let f=Je.call(t),a={targetPort:e,types:n,channel:o,resolveMessage:s};f.add(a);let i;return u&&(i=e.relay({to:t,types:n,channel:o&&{to:o.from,from:o.to},resolveMessage:s,bidirectional:!1})),()=>{f.delete(a),i?.()}}channel(e,t=null,{handshake:n=0,postAwaitsOpen:o=!1}={}){let s=new MessageChannel;return O.upgradeInPlace(s.port1,{handshake:n,postAwaitsOpen:o}),O.upgradeInPlace(s.port2,{handshake:n,postAwaitsOpen:o}),H.call(this).add(this.relay({channel:e,to:s.port2,bidirectional:!0,resolveMessage:t})),s.port2.start(),this.readyStateChange("close").then(()=>{s.port2.close()}),s.port1}projectMutations({from:e,to:t,...n}){if(!e||!t||typeof e=="string"&&typeof t=="string"||y(e)&&y(t))throw new Error('Invalid "from"/"to" parameters');if(typeof e=="string"){if(!y(t))throw new Error('Invalid "to" parameter. Object/array expected');return we.call(this,t,e,n)}if(typeof t=="string"){if(!y(e))throw new Error('Invalid "from" parameter. Object/array expected');return Qe.call(this,e,t,n)}throw new Error('Invalid "from"/"to" parameters')}get readyState(){let e=q.call(this);return e.close.state?"closed":e.open.state?"open":"connecting"}readyStateChange(e){if(!["open","messaging","close"].includes(e))throw new Error(`Invalid readyState query "${e}"`);return q.call(this)[e].promise}_autoStart(){let e=E(this),t=k(this);!e.get("internal_call")&&t.handshake===1&&this.start()}start(){let e=q.call(this);if(e.open.state)return;let t=E(this),n=k(this),o=i=>{i&&(e.open.state=!0,e.open.resolve(this));let l=t.get("handshake_channel");setTimeout(()=>{l?.port1.close(),l?.port2.close(),t.delete("handshake_channel")},100)};if(t.get("remote.open.called")){o(!0);return}if(t.get("start.called"))return;if(t.set("start.called",!0),this._start?this._start():super.start?.(),n.handshake===0){o(!0);return}let s=new MessageChannel;t.set("handshake_channel",s),s.port1.onmessage=i=>{this instanceof BroadcastChannel&&n.clientServerMode==="server"&&typeof i.data?.id=="string"&&t.get("clients").add(i.data.id),i.data?.isOpen,o(!0)};let{wqOptions:u}=ce.call(this),f=n.clientServerMode==="server"?"server":n.clientServerMode==="client"?t.get("client_id"):null,a={".wq":u,ping:"connect",id:f};this._postMessage?this._postMessage(a,{transfer:[s.port2]}):super.postMessage(a,{transfer:[s.port2]})}close(...e){let t=q.call(this);if(t.close.state)return;t.close.state=!0;let n=E(this),o=k(this);if(o.handshake>0&&!n.get("remote.close.called")&&(this instanceof BroadcastChannel||this instanceof MessagePort)){let{wqOptions:s}=ce.call(this),u=o.clientServerMode==="server"?"server":o.clientServerMode==="client"?n.get("client_id"):null,f={".wq":s,ping:"disconnect",id:u};this._postMessage?this._postMessage(f):super.postMessage(f)}this._close?this._close(...e):super.close(...e),t.close.resolve(this),Mt.call(this)}}}function le(r){return class extends Ke(r){static _hydrateMessage(e,t){if(typeof t.data?.[".wq"]?.numPorts!="number"||typeof t.data[".wq"].eventID!="string")return t;let n=H.call(e),o=t.data[".wq"].numPorts;Object.defineProperty(t,"ports",{value:[],configurable:!0});for(let s=0;s<o;s++){let u=e.channel(`${t.data[".wq"].eventID}:${s}`);t.ports.push(u)}return t}_postMessage(e,t={}){let{transfer:n=[],...o}=t;if(typeof e?.[".wq"]?.eventID=="string"){let s=H.call(this),u=n.filter(a=>a instanceof MessagePort),f=u.length;for(let a=0;a<f;a++)O.upgradeInPlace(u[a]),s.add(this.relay({channel:`${e[".wq"].eventID}:${a}`,to:u[a],bidirectional:!0})),u[a].start(),u[a].readyStateChange("close").then(()=>{let{wqOptions:i}=ce.call(this),l={".wq":i,ping:"disconnect"};this.postMessage(l,{type:`${e[".wq"].eventID}:${a}:message`})});e[".wq"].numPorts=f}return this.__postMessage(e,o)}}}function Et(r){if(r.propagationStopped)return;let e=E(this);e.get("parentNode")instanceof EventTarget&&(r.bubbles||e.get("parentNode")?.findPort?.(n=>n===this)&&r instanceof j)&&e.get("parentNode").dispatchEvent(r);let t=Je.call(this);if(t.size&&r instanceof j){let{type:n,eventID:o,data:s,live:u,bubbles:f,ports:a}=r,i=new WeakSet;for(let{targetPort:l,types:c,channel:m,resolveMessage:d}of t){if(i.has(l))continue;let p=n;m.from&&([,p]=new RegExp(`^${m.from.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}:([^:]+)$`).exec(n)||[],!p)||!(typeof c=="function"?c(p,this,l,m):[].concat(c).find(_=>_===p||_==="*"))||(i.add(l),l.postMessage(d?d(s,this,l,m):s,{transfer:a,type:m.to?`${m.to}:${p}`:p,eventID:o,bubbles:f,live:u,forwarded:!0,relayedFrom:this}))}}}function H(){let r=E(this);return r.has("garbage_collection")||r.set("garbage_collection",new Set),r.get("garbage_collection")}function Je(){let r=E(this);return r.has("downstream_registry")||r.set("downstream_registry",new Set),r.get("downstream_registry")}function q(){let r=E(this);if(!r.has("readystate_registry")){let e=t=>(t.promise=new Promise((n,o)=>(t.resolve=n,t.reject=o)),t);r.set("readystate_registry",{open:e({}),messaging:e({}),close:e({})})}return r.get("readystate_registry")}function Mt(){let r=E(this);for(let e of r.get("garbage_collection")||[])e instanceof AbortController?e.abort():typeof e=="function"&&e();r.get("garbage_collection")?.clear(),r.get("downstream_registry")?.clear()}function ce(r=void 0,e={}){if(Array.isArray(e))e={transfer:e};else if(!e||typeof e!="object")throw new TypeError("transferOrOptions must be an array or an object");let{type:t="message",eventID:n=null,live:o=!1,observing:s=!1,bubbles:u=!1,forwarded:f=!1,relayedFrom:a=null,signal:i=null,withArrayMethodDescriptors:l=!1,honourDoneMutationFlags:c=!1,...m}=e;return n||(n=`${t}-${(0|Math.random()*9e6).toString(36)}`),!s&&!f&&y(r)&&o&&!t?.endsWith(".mutate")&&(Qe.call(this,r,n,{signal:i,withArrayMethodDescriptors:l,honourDoneMutationFlags:c}),s=!0),{portOptions:m,wqOptions:{type:t,eventID:n,live:o,observing:s,honourDoneMutationFlags:c,bubbles:u,forwarded:f,relayedFrom:a}}}function Qe(r,e,{signal:t,withArrayMethodDescriptors:n=!0,honourDoneMutationFlags:o=!1}={}){if(!y(r))throw new TypeError("data must be a plain object and not a stream");if(typeof e!="string")throw new TypeError("eventID must be a non-empty string");let s=a=>{let i;n&&Array.isArray(a[0].target)&&!a[0].argumentsList&&!["set","defineProperty","deleteProperty"].includes(a[0].operation)||(this.postMessage(a.map(l=>(i=!i&&o&&l.detail?.done,{...l,target:void 0})),{type:`${e}.mutate`}),i&&u.abort())},u=S.observe(r,S.subtree(),s,{signal:t,withArrayMethodDescriptors:n});return H.call(this).add(u),u}function we(r,e,{signal:t,honourDoneMutationFlags:n=!1}={}){if(!y(r))throw new TypeError("data must be a plain object and not a stream");if(typeof e!="string")throw new TypeError("eventID must be a non-empty string");let o=f=>{if(!f.data?.length)return;let a;S.batch(r,()=>{for(let i of f.data){if(a=!a&&n&&i.detail?.done,i.argumentsList){let l=i.path.length?S.get(r,S.path(...i.path)):r;S.proxy(l)[i.operation](...i.argumentsList);continue}if(i.key!=="length"||["set","defineProperty","deleteProperty"].includes(i.operation)){let l=i.path.length===1?r:S.get(r,S.path(...i.path.slice(0,-1)));i.type==="delete"?S.deleteProperty(l,i.key):S.set(l,i.key,i.value)}}}),a&&s()};this.addEventListener(`${e}.mutate`,o,{signal:t});let s=()=>this.removeEventListener(`${e}.mutate`,o);return H.call(this).add(s),s}var pe=class extends le(BroadcastChannel){constructor(e,{handshake:t=0,postAwaitsOpen:n=!1,clientServerMode:o=null,autoClose:s=!1}={}){super(e);let u=E(this);if(typeof t!="number")throw new Error("handshake must be a number");if(t<0||t>2)throw new Error("handshake must be between 0 and 2");if(o&&!["server","client"].includes(o))throw new Error('clientServerMode must be "server" or "client"');u.set("options",{handshake:t,postAwaitsOpen:n,clientServerMode:o,autoClose:s}),this.constructor.upgradeEvents(this),t===0&&this.start()}__postMessage(e,t){BroadcastChannel.prototype.postMessage.call(this,e)}};var me=class extends MessageChannel{constructor({handshake:e=0,postAwaitsOpen:t=!1}={}){super(),[this.port1,this.port2].forEach((n,o)=>{O.upgradeInPlace(n,{handshake:e,postAwaitsOpen:t})})}};var X=class extends O{#e=new Set;#t=!1;#r=!1;get length(){return this.#e.size}[Symbol.iterator](){return this.#e[Symbol.iterator]()}constructor({handshake:e=0,postAwaitsOpen:t=!1,autoClose:n=!1}={}){super({handshake:e,postAwaitsOpen:t,autoClose:n}),e===0&&this.start()}addPort(e,{enableBubbling:t=!0}={}){if(!(e instanceof O))throw new TypeError("Port must be a WQMessagePort instance.");let n=q.call(this);if(this.#r||n.close.state){let u=this.constructor.name;throw new Error(`Cannot add port to ${u}. ${u} is closed.`)}if(this.#e.has(e))return;this.#e.add(e);let o=E(e);if(t){if(o.get("parentNode"))throw new TypeError("Incoming port already has a parent node.");o.set("parentNode",this)}this.options.handshake&&(e.readyStateChange("open").then(()=>{n.open.state=!0,n.open.resolve(this)}),e.readyStateChange("close").then(()=>s())),(this.#t||n.open.state)&&e.start();let s=()=>{this.#e.has(e)&&(this.#e.delete(e),t&&o.get("parentNode")===this&&o.set("parentNode",null),this.#e.size===0&&k(this).autoClose&&(n.close.state=!0,n.close.resolve(this)))};return s}findPort(e){for(let t of this.#e)if(e(t))return t}_postMessage(e,t,n){for(let o of this.#e)o!==n&&o.postMessage(e,t)}start(){if(!this.#t){this.#t=!0;for(let e of this.#e)e.start();if(!this.options.handshake){let e=q.call(this);e.open.state=!0,e.open.resolve(this)}}}close(...e){if(!this.#r){this.#r=!0;for(let t of this.#e)t.close(...e);if(!this.options.handshake){let t=q.call(this);t.close.state=!0,t.close.resolve(this)}}}};var he=class extends X{#e;get channelSpec(){return this.#e}constructor(e=null,t={}){if(super(t),typeof e=="string")e={from:e,to:e};else if(x(e)){if(Object.keys(e).filter(n=>!["from","to"].includes(n)).length)throw new Error('Channel must be a string or an object of "from"/"to" members')}else if(e)throw new Error("Invalid channel parameter");this.#e=e}addPort(e,{resolveMessage:t=null,...n}={}){let o=(l,...c)=>t?t(l,...c):l,s=super.addPort(e,n),u=e.relay({channel:this.#e,to:this,bidirectional:!1,resolveMessage:o}),f=this.#e.from&&`${this.#e.from}:message`||"message";this.postMessage(o({event:"joins"},e,this),{type:f,relayedFrom:e});let a=()=>{this.postMessage(o({event:"leaves"},e,this),{type:f,relayedFrom:e})},i=()=>{a(),u(),s()};return e.readyStateChange("close").then(i),i}};globalThis.webqit||(globalThis.webqit={});Object.assign(globalThis.webqit,Re);})();
|
|
2
2
|
//# sourceMappingURL=main.js.map
|