@webqit/port-plus 0.1.9 → 0.1.11

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/package.json CHANGED
@@ -14,7 +14,7 @@
14
14
  ],
15
15
  "homepage": "https://port-plus.netlify.app/",
16
16
  "icon": "https://webqit.io/icon.svg",
17
- "version": "0.1.9",
17
+ "version": "0.1.11",
18
18
  "license": "MIT",
19
19
  "repository": {
20
20
  "type": "git",
@@ -54,7 +54,7 @@ export function MessagePortPlusMixin(superClass) {
54
54
 
55
55
  const proto = this.prototype;
56
56
 
57
- for (const prop of portPlusMethods) {
57
+ for (const prop of portPlusMethods.concat('_autoStart')) {
58
58
  const original = port[prop];
59
59
  const plus = proto[prop];
60
60
 
@@ -283,12 +283,7 @@ export function MessagePortPlusMixin(superClass) {
283
283
 
284
284
  set onmessage(v) {
285
285
  // Auto-start?
286
- const portPlusMeta = _meta(this);
287
- const options = _options(this);
288
- if (!portPlusMeta.get('internal_call')
289
- && options.autoStart) {
290
- this.start();
291
- }
286
+ this._autoStart();
292
287
 
293
288
  if (typeof super.onmessage !== 'undefined') {
294
289
  super.onmessage = v;
@@ -311,12 +306,7 @@ export function MessagePortPlusMixin(superClass) {
311
306
 
312
307
  addEventListener(...args) {
313
308
  // Auto-start?
314
- const portPlusMeta = _meta(this);
315
- const options = _options(this);
316
- if (!portPlusMeta.get('internal_call')
317
- && options.autoStart) {
318
- this.start();
319
- }
309
+ this._autoStart();
320
310
 
321
311
  // Add to registry
322
312
  const garbageCollection = getGarbageCollection.call(this);
@@ -345,12 +335,7 @@ export function MessagePortPlusMixin(superClass) {
345
335
 
346
336
  postMessage(message, transferOrOptions = {}) {
347
337
  // Auto-start?
348
- const portPlusMeta = _meta(this);
349
- const options = _options(this);
350
- if (!portPlusMeta.get('internal_call')
351
- && options.autoStart) {
352
- this.start();
353
- }
338
+ this._autoStart();
354
339
 
355
340
  // Update readyState
356
341
  const readyStateInternals = getReadyStateInternals.call(this);
@@ -377,6 +362,7 @@ export function MessagePortPlusMixin(superClass) {
377
362
  };
378
363
 
379
364
  // If client-server mode, wait for open ready state
365
+ const options = _options(this);
380
366
  if (options.postAwaitsOpen) readyStateInternals.open.promise.then(post);
381
367
  else post();
382
368
  }
@@ -519,6 +505,15 @@ export function MessagePortPlusMixin(superClass) {
519
505
  return readyStateInternals[query].promise;
520
506
  }
521
507
 
508
+ _autoStart() {
509
+ const portPlusMeta = _meta(this);
510
+ const options = _options(this);
511
+ if (!portPlusMeta.get('internal_call')
512
+ && options.autoStart) {
513
+ this.start();
514
+ }
515
+ }
516
+
522
517
  start() {
523
518
  const readyStateInternals = getReadyStateInternals.call(this);
524
519
  if (readyStateInternals.open.state) return;
package/src/RelayPort.js CHANGED
@@ -6,8 +6,8 @@ export class RelayPort extends StarPort {
6
6
  #channelSpec;
7
7
  get channelSpec() { return this.#channelSpec; }
8
8
 
9
- constructor(channel = null) {
10
- super();
9
+ constructor(channel = null, options = {}) {
10
+ super(options);
11
11
  if (typeof channel === 'string') {
12
12
  channel = { from: channel, to: channel };
13
13
  } else if (_isObject(channel)) {
@@ -20,14 +20,14 @@ export class RelayPort extends StarPort {
20
20
  this.#channelSpec = channel;
21
21
  }
22
22
 
23
- addPort(portPlus, { resolveMessage = null } = {}) {
23
+ addPort(portPlus, { resolveMessage = null, ...options } = {}) {
24
24
  const $resolveMessage = (data, ...args) => {
25
25
  if (resolveMessage) return resolveMessage(data, ...args);
26
26
  return data;
27
27
  };
28
28
 
29
29
  // Add port and forward its messages back to this relay instance
30
- const unadd = super.addPort(portPlus, { enableBubbling: false });
30
+ const unadd = super.addPort(portPlus, options);
31
31
  const unforward = portPlus.relay({ channel: this.#channelSpec, to: this, bidirectional: false/* IMPORTANT */, resolveMessage: $resolveMessage });
32
32
 
33
33
  const messageType_ping = this.#channelSpec.from
package/src/StarPort.js CHANGED
@@ -1,4 +1,9 @@
1
- import { MessagePortPlus, _meta, _options } from './MessagePortPlus.js';
1
+ import {
2
+ MessagePortPlus,
3
+ _meta,
4
+ _options,
5
+ getReadyStateInternals,
6
+ } from './MessagePortPlus.js';
2
7
 
3
8
  export class StarPort extends MessagePortPlus {
4
9
 
@@ -8,8 +13,8 @@ export class StarPort extends MessagePortPlus {
8
13
 
9
14
  [Symbol.iterator]() { return this.#ports[Symbol.iterator](); }
10
15
 
11
- constructor({ autoClose = true } = {}) {
12
- super({ autoStart: false, postAwaitsOpen: true, autoClose });
16
+ constructor({ autoStart = true, postAwaitsOpen = false, autoClose = true } = {}) {
17
+ super({ autoStart, postAwaitsOpen, autoClose });
13
18
  }
14
19
 
15
20
  addPort(portPlus, { enableBubbling = true } = {}) {
@@ -17,6 +22,13 @@ export class StarPort extends MessagePortPlus {
17
22
  throw new TypeError('Port must be a WQMessagePort instance.');
18
23
  }
19
24
 
25
+ const readyStateInternals = getReadyStateInternals.call(this);
26
+
27
+ if (readyStateInternals.close.state) {
28
+ const starPortName = this.constructor.name;
29
+ throw new Error(`Cannot add port to ${starPortName}. ${starPortName} is closed.`);
30
+ }
31
+
20
32
  if (this.#ports.has(portPlus)) return;
21
33
  this.#ports.add(portPlus); // @ORDER: 1
22
34
 
@@ -34,7 +46,7 @@ export class StarPort extends MessagePortPlus {
34
46
 
35
47
  const cleanup = () => {
36
48
  if (!this.#ports.has(portPlus)) return;
37
-
49
+
38
50
  this.#ports.delete(portPlus);
39
51
 
40
52
  if (enableBubbling
@@ -66,9 +78,27 @@ export class StarPort extends MessagePortPlus {
66
78
  }
67
79
  }
68
80
 
81
+ _autoStart() {} // Must be present to do nothing
82
+
83
+ start() {
84
+ const readyStateInternals = getReadyStateInternals.call(this);
85
+
86
+ if (readyStateInternals.open.state) return;
87
+ readyStateInternals.open.state = true;
88
+
89
+ readyStateInternals.open.resolve(this);
90
+ }
91
+
69
92
  close(...args) {
93
+ const readyStateInternals = getReadyStateInternals.call(this);
94
+
95
+ if (readyStateInternals.close.state) return;
96
+ readyStateInternals.close.state = true;
97
+
70
98
  for (const portPlus of this.#ports) {
71
99
  portPlus.close?.(...args);
72
100
  }
101
+
102
+ readyStateInternals.close.resolve(this);
73
103
  }
74
104
  }
@@ -53,3 +53,6 @@ p.port2.close();
53
53
 
54
54
  await new Promise((r) => setTimeout(r, 3000));
55
55
  m.port2.close();
56
+
57
+ const e = new BroadcastChannelPlus('test');
58
+ console.log('________________', e.readyState)