jsf.js_next_gen 4.1.0-beta.11 → 4.1.0-beta.12

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.
Files changed (29) hide show
  1. package/README.md +2 -1
  2. package/dist/docs/functions/faces.push.init.html +5 -5
  3. package/dist/docs/index.html +1 -0
  4. package/dist/window/faces-development.js +146 -154
  5. package/dist/window/faces-development.js.map +1 -1
  6. package/dist/window/faces.js +1 -1
  7. package/dist/window/faces.js.map +1 -1
  8. package/dist/window/jsf-development.js +146 -154
  9. package/dist/window/jsf-development.js.map +1 -1
  10. package/dist/window/jsf.js +1 -1
  11. package/dist/window/jsf.js.map +1 -1
  12. package/package.json +1 -1
  13. package/src/main/typescript/api/_api.ts +4 -4
  14. package/src/main/typescript/impl/PushImpl.ts +118 -87
  15. package/src/main/typescript/impl/util/ExtDomQuery.ts +0 -4
  16. package/src/main/typescript/impl/util/FileUtils.ts +3 -3
  17. package/src/main/typescript/impl/util/HiddenInputBuilder.ts +34 -34
  18. package/src/main/typescript/impl/util/Lang.ts +12 -15
  19. package/src/main/typescript/impl/util/XhrQueueController.ts +7 -1
  20. package/src/main/typescript/impl/xhrCore/ResponseDataResolver.ts +0 -38
  21. package/src/main/typescript/test/api/JsfPushShimTest.spec.ts +61 -2
  22. package/src/main/typescript/test/impl/AssertionsTest.spec.ts +167 -0
  23. package/src/main/typescript/test/impl/FileUtilsTest.spec.ts +125 -0
  24. package/src/main/typescript/test/impl/ResponseDataResolverTest.spec.ts +61 -0
  25. package/src/main/typescript/test/impl/util/ExtDomQueryTest.spec.ts +60 -1
  26. package/src/main/typescript/test/impl/util/ExtLangTest.spec.ts +104 -0
  27. package/src/main/typescript/test/impl/util/HiddenInputBuilderTest.spec.ts +73 -0
  28. package/src/main/typescript/test/queue/AsynchronousQueueTest.spec.ts +143 -2
  29. package/src/main/typescript/test/xhrCore/WebsocketTest.spec.ts +18 -0
package/README.md CHANGED
@@ -250,4 +250,5 @@ faces.ajax.request(document.getElementById("cmd_eval"), null,
250
250
  * Added tests that reconnect attempts reset after a successful reconnect.
251
251
  * Added tests that max reconnect exhaustion calls `onclose`.
252
252
  * Added tests that close code `1008` is terminal and does not reconnect.
253
- * Added tests that explicit `open()` after a terminal close fires `onopen` again as a fresh connection.
253
+ * Added tests that explicit `open()` after a terminal close fires `onopen` again as a fresh connection.
254
+ * JSF 2.3 jsf.push.init compatibility test added
@@ -1,10 +1,10 @@
1
- <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>init | jsf.js_next_gen</title><meta name="description" content="Documentation for jsf.js_next_gen"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">jsf.js_next_gen</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../modules/faces.html">faces</a></li><li><a href="../modules/faces.push.html">push</a></li><li><a href="" aria-current="page">init</a></li></ul><h1>Function init</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="init"><span class="tsd-kind-call-signature">init</span><span class="tsd-signature-symbol">(</span><br/>    <span class="tsd-kind-parameter">socketClientId</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">url</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">channel</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onopen</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Function</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onmessage</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Function</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onerror</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Function</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onclose</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Function</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">behaviors</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">autoConnect</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">,</span><br/><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span><a href="#init" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">socketClientId</span>: <span class="tsd-signature-type">string</span></span><div class="tsd-comment tsd-typography"><p>the sockets client identifier</p>
1
+ <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>init | jsf.js_next_gen</title><meta name="description" content="Documentation for jsf.js_next_gen"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">jsf.js_next_gen</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="../modules/faces.html">faces</a></li><li><a href="../modules/faces.push.html">push</a></li><li><a href="" aria-current="page">init</a></li></ul><h1>Function init</h1></div><section class="tsd-panel"><ul class="tsd-signatures"><li class=""><div class="tsd-signature tsd-anchor-link" id="init"><span class="tsd-kind-call-signature">init</span><span class="tsd-signature-symbol">(</span><br/>    <span class="tsd-kind-parameter">socketClientId</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">url</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">channel</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onopen</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">OpenCallback</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onmessage</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">MessageCallback</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onerror</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">ErrorCallback</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">onclose</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">CloseCallback</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">behaviors</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">,</span><br/>    <span class="tsd-kind-parameter">autoConnect</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span><span class="tsd-signature-symbol">,</span><br/><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">void</span><a href="#init" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></div><div class="tsd-description"><div class="tsd-parameters"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameter-list"><li><span><span class="tsd-kind-parameter">socketClientId</span>: <span class="tsd-signature-type">string</span></span><div class="tsd-comment tsd-typography"><p>the sockets client identifier</p>
2
2
  </div></li><li><span><span class="tsd-kind-parameter">url</span>: <span class="tsd-signature-type">string</span></span><div class="tsd-comment tsd-typography"><p>the uri to reach the socket</p>
3
3
  </div></li><li><span><span class="tsd-kind-parameter">channel</span>: <span class="tsd-signature-type">string</span></span><div class="tsd-comment tsd-typography"><p>the channel name/id</p>
4
- </div></li><li><span><span class="tsd-kind-parameter">onopen</span>: <span class="tsd-signature-type">Function</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when the web socket is opened.</p>
5
- </div></li><li><span><span class="tsd-kind-parameter">onmessage</span>: <span class="tsd-signature-type">Function</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when a message is received.</p>
6
- </div></li><li><span><span class="tsd-kind-parameter">onerror</span>: <span class="tsd-signature-type">Function</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when an error occurs.</p>
7
- </div></li><li><span><span class="tsd-kind-parameter">onclose</span>: <span class="tsd-signature-type">Function</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when the web socket is closed.</p>
4
+ </div></li><li><span><span class="tsd-kind-parameter">onopen</span>: <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">OpenCallback</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when the web socket is opened.</p>
5
+ </div></li><li><span><span class="tsd-kind-parameter">onmessage</span>: <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">MessageCallback</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when a message is received.</p>
6
+ </div></li><li><span><span class="tsd-kind-parameter">onerror</span>: <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">ErrorCallback</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when an error occurs.</p>
7
+ </div></li><li><span><span class="tsd-kind-parameter">onclose</span>: <span class="tsd-signature-type">string</span> <span class="tsd-signature-symbol">|</span> <span class="tsd-signature-type">CloseCallback</span></span><div class="tsd-comment tsd-typography"><p>The function to be invoked when the web socket is closed.</p>
8
8
  </div></li><li><span><span class="tsd-kind-parameter">behaviors</span>: <span class="tsd-signature-type">any</span></span><div class="tsd-comment tsd-typography"><p>functions which are invoked whenever a message is received</p>
9
9
  </div></li><li><span><span class="tsd-kind-parameter">autoConnect</span>: <span class="tsd-signature-type">boolean</span></span><div class="tsd-comment tsd-typography"><p>Whether or not to automatically open the socket. Defaults to <code>false</code>.</p>
10
10
  </div></li></ul></div><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></div></li></ul></section></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">jsf.js_next_gen</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -216,6 +216,7 @@ and adjusts the references in the resource according to the request patterns.</p
216
216
  <li>Added tests that max reconnect exhaustion calls <code>onclose</code>.</li>
217
217
  <li>Added tests that close code <code>1008</code> is terminal and does not reconnect.</li>
218
218
  <li>Added tests that explicit <code>open()</code> after a terminal close fires <code>onopen</code> again as a fresh connection.</li>
219
+ <li>JSF 2.3 jsf.push.init compatibility test added</li>
219
220
  </ul>
220
221
  </li>
221
222
  </ul>
@@ -6297,30 +6297,18 @@ var PushImpl;
6297
6297
  this.channelToken = channelToken;
6298
6298
  this.url = url;
6299
6299
  this.channel = channel;
6300
+ this.socket = null;
6300
6301
  this.reconnectAttempts = 0;
6301
- // Tracks whether the socket has ever successfully opened. Set permanently on first
6302
- // onopen so that onclose can distinguish "first attempt failure" (terminal, no reconnect,
6303
- // no onerror) from "broken connection after first success" (reconnect + onerror).
6304
6302
  this.hasEverConnected = false;
6305
6303
  this.hasNotifiedInitialOpenAttempt = false;
6306
6304
  }
6307
6305
  open() {
6308
- var _a, _b;
6309
- if (this.socket && this.socket.readyState == 1) {
6306
+ if (this.socket && this.socket.readyState === 1) {
6310
6307
  return;
6311
6308
  }
6312
6309
  this.socket = new WebSocket(this.url);
6313
6310
  this.bindCallbacks();
6314
- if (!this.reconnectAttempts && !this.hasNotifiedInitialOpenAttempt) {
6315
- this.hasNotifiedInitialOpenAttempt = true;
6316
- let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6317
- if (!clientIds)
6318
- return; // socket was torn down (reset()) while timer was pending
6319
- for (let i = clientIds.length - 1; i >= 0; i--) {
6320
- let socketClientId = clientIds[i];
6321
- (_b = (_a = PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onopen']) === null || _b === void 0 ? void 0 : _b.call(_a, this.channel);
6322
- }
6323
- }
6311
+ this.notifyInitialOpenAttempt();
6324
6312
  }
6325
6313
  // noinspection JSUnusedLocalSymbols
6326
6314
  onopen(event) {
@@ -6331,11 +6319,14 @@ var PushImpl;
6331
6319
  // Native WebSocket error events do not expose the close reason code.
6332
6320
  // Faces onerror is fired from onclose only when a reconnect is attempted.
6333
6321
  }
6334
- onmmessage(event) {
6322
+ onmessage(event) {
6335
6323
  var _a, _b, _c;
6336
6324
  let message = JSON.parse(event.data);
6337
- for (let i = PushImpl.clientIdsByTokens[this.channelToken].length - 1; i >= 0; i--) {
6338
- let socketClientId = PushImpl.clientIdsByTokens[this.channelToken][i];
6325
+ let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6326
+ if (!clientIds)
6327
+ return; // socket was torn down (reset()) while message was pending
6328
+ for (let i = clientIds.length - 1; i >= 0; i--) {
6329
+ let socketClientId = clientIds[i];
6339
6330
  if (document.getElementById(socketClientId)) {
6340
6331
  try {
6341
6332
  (_b = (_a = PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onmessage']) === null || _b === void 0 ? void 0 : _b.call(_a, message, this.channel, event);
@@ -6357,81 +6348,113 @@ var PushImpl;
6357
6348
  }
6358
6349
  }
6359
6350
  else {
6360
- PushImpl.clientIdsByTokens[this.channelToken].splice(i, 1);
6351
+ clientIds.splice(i, 1);
6361
6352
  }
6362
6353
  }
6363
- if (PushImpl.clientIdsByTokens[this.channelToken].length == 0) {
6354
+ if (clientIds.length === 0) {
6364
6355
  // tag disappeared
6365
6356
  this.close();
6366
6357
  }
6367
6358
  }
6368
6359
  onclose(event) {
6369
- var _a, _b, _c, _d;
6370
- if (!this.socket
6360
+ if (this.isTerminalClose(event)) {
6361
+ this.notifyClose(event);
6362
+ this.resetConnectionState();
6363
+ return;
6364
+ }
6365
+ if (!this.notifyErrorAndPruneMissingComponents(event))
6366
+ return;
6367
+ if (this.closeIfChannelHasNoComponents())
6368
+ return;
6369
+ this.scheduleReconnect();
6370
+ }
6371
+ ;
6372
+ close() {
6373
+ if (this.socket) {
6374
+ let s = this.socket;
6375
+ this.socket = null;
6376
+ s.close();
6377
+ }
6378
+ }
6379
+ notifyInitialOpenAttempt() {
6380
+ var _a, _b;
6381
+ if (this.reconnectAttempts || this.hasNotifiedInitialOpenAttempt)
6382
+ return;
6383
+ this.hasNotifiedInitialOpenAttempt = true;
6384
+ let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6385
+ if (!clientIds)
6386
+ return; // socket was torn down (reset()) while timer was pending
6387
+ for (let i = clientIds.length - 1; i >= 0; i--) {
6388
+ let socketClientId = clientIds[i];
6389
+ (_b = (_a = PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onopen']) === null || _b === void 0 ? void 0 : _b.call(_a, this.channel);
6390
+ }
6391
+ }
6392
+ isTerminalClose(event) {
6393
+ return !this.socket
6371
6394
  // Spec: no reconnect when the very first connection attempt fails.
6372
- // onerror must also not be invoked in this case only onclose.
6395
+ // onerror must also not be invoked in this case, only onclose.
6373
6396
  || !this.hasEverConnected
6374
6397
  // Spec: code 1000 (normal closure) is always terminal, regardless of reason.
6375
- || (event.code == 1000)
6376
- // 1008 = Policy Violation: server rejected the connection due to an authorization
6377
- // or security check (e.g. CSRF token mismatch, session not matching the channel).
6378
- // Reconnecting is pointless — the same rejection will recur until credentials change.
6379
- || (event.code == 1008)
6380
- || (this.reconnectAttempts >= _core_Const__WEBPACK_IMPORTED_MODULE_0__.MAX_RECONNECT_ATTEMPTS)) {
6381
- let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6382
- if (!clientIds)
6383
- return; // already torn down (reset() called while socket was open)
6384
- for (let i = clientIds.length - 1; i >= 0; i--) {
6385
- let socketClientId = clientIds[i];
6386
- (_b = (_a = PushImpl.components === null || PushImpl.components === void 0 ? void 0 : PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onclose']) === null || _b === void 0 ? void 0 : _b.call(_a, event === null || event === void 0 ? void 0 : event.code, this === null || this === void 0 ? void 0 : this.channel, event);
6387
- }
6388
- // Reset so a subsequent explicit open() starts as a fresh first connection.
6389
- this.reconnectAttempts = 0;
6390
- this.hasEverConnected = false;
6391
- this.hasNotifiedInitialOpenAttempt = false;
6398
+ || event.code === 1000
6399
+ // 1008 = Policy Violation. Reconnecting would hit the same rejection again.
6400
+ || event.code === 1008
6401
+ || this.reconnectAttempts >= _core_Const__WEBPACK_IMPORTED_MODULE_0__.MAX_RECONNECT_ATTEMPTS;
6402
+ }
6403
+ notifyClose(event) {
6404
+ var _a, _b;
6405
+ let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6406
+ if (!clientIds)
6407
+ return; // already torn down (reset() called while socket was open)
6408
+ for (let i = clientIds.length - 1; i >= 0; i--) {
6409
+ let socketClientId = clientIds[i];
6410
+ (_b = (_a = PushImpl.components === null || PushImpl.components === void 0 ? void 0 : PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onclose']) === null || _b === void 0 ? void 0 : _b.call(_a, event === null || event === void 0 ? void 0 : event.code, this === null || this === void 0 ? void 0 : this.channel, event);
6392
6411
  }
6393
- else {
6394
- let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6395
- if (!clientIds)
6396
- return; // already torn down (reset() called while socket was open)
6397
- for (let i = clientIds.length - 1; i >= 0; i--) {
6398
- let socketClientId = clientIds[i];
6399
- if (document.getElementById(socketClientId)) {
6400
- try {
6401
- (_d = (_c = PushImpl.components === null || PushImpl.components === void 0 ? void 0 : PushImpl.components[socketClientId]) === null || _c === void 0 ? void 0 : _c['onerror']) === null || _d === void 0 ? void 0 : _d.call(_c, event === null || event === void 0 ? void 0 : event.code, this === null || this === void 0 ? void 0 : this.channel, event);
6402
- }
6403
- catch (e) {
6404
- //Ignore
6405
- }
6412
+ }
6413
+ resetConnectionState() {
6414
+ this.reconnectAttempts = 0;
6415
+ this.hasEverConnected = false;
6416
+ this.hasNotifiedInitialOpenAttempt = false;
6417
+ }
6418
+ notifyErrorAndPruneMissingComponents(event) {
6419
+ var _a, _b;
6420
+ let clientIds = PushImpl.clientIdsByTokens[this.channelToken];
6421
+ if (!clientIds)
6422
+ return false; // already torn down (reset() called while socket was open)
6423
+ for (let i = clientIds.length - 1; i >= 0; i--) {
6424
+ let socketClientId = clientIds[i];
6425
+ if (document.getElementById(socketClientId)) {
6426
+ try {
6427
+ (_b = (_a = PushImpl.components === null || PushImpl.components === void 0 ? void 0 : PushImpl.components[socketClientId]) === null || _a === void 0 ? void 0 : _a['onerror']) === null || _b === void 0 ? void 0 : _b.call(_a, event === null || event === void 0 ? void 0 : event.code, this === null || this === void 0 ? void 0 : this.channel, event);
6406
6428
  }
6407
- else {
6408
- clientIds.splice(i, 1);
6429
+ catch (e) {
6430
+ //Ignore
6409
6431
  }
6410
6432
  }
6411
- if (clientIds.length == 0) {
6412
- // tag disappeared
6413
- this.close();
6414
- return;
6433
+ else {
6434
+ clientIds.splice(i, 1);
6415
6435
  }
6416
- const reconnectAttempt = ++this.reconnectAttempts;
6417
- this.socket = null;
6418
- setTimeout(() => this.open(), _core_Const__WEBPACK_IMPORTED_MODULE_0__.RECONNECT_INTERVAL * reconnectAttempt);
6419
6436
  }
6437
+ return true;
6420
6438
  }
6421
- ;
6422
- close() {
6423
- if (this.socket) {
6424
- let s = this.socket;
6425
- this.socket = null;
6426
- s.close();
6427
- }
6439
+ closeIfChannelHasNoComponents() {
6440
+ var _a;
6441
+ if (((_a = PushImpl.clientIdsByTokens[this.channelToken]) === null || _a === void 0 ? void 0 : _a.length) !== 0)
6442
+ return false;
6443
+ // tag disappeared
6444
+ this.close();
6445
+ return true;
6446
+ }
6447
+ scheduleReconnect() {
6448
+ const reconnectAttempt = ++this.reconnectAttempts;
6449
+ this.socket = null;
6450
+ setTimeout(() => this.open(), _core_Const__WEBPACK_IMPORTED_MODULE_0__.RECONNECT_INTERVAL * reconnectAttempt);
6428
6451
  }
6429
6452
  /**
6430
6453
  * bind the callbacks to the socket callbacks
6431
6454
  */
6432
6455
  bindCallbacks() {
6433
6456
  this.socket.onopen = (event) => this.onopen(event);
6434
- this.socket.onmessage = (event) => this.onmmessage(event);
6457
+ this.socket.onmessage = (event) => this.onmessage(event);
6435
6458
  this.socket.onclose = (event) => this.onclose(event);
6436
6459
  this.socket.onerror = (event) => this.onerror(event);
6437
6460
  }
@@ -6466,9 +6489,12 @@ var PushImpl;
6466
6489
  throw new Error("Unknown channelToken: " + channelToken);
6467
6490
  }
6468
6491
  }
6469
- function resolveFunction(fn = () => {
6470
- }) {
6471
- return ((typeof fn !== "function") && (fn = mona_dish__WEBPACK_IMPORTED_MODULE_1__.DQ.global()[fn]), fn);
6492
+ function resolveFunction(fn) {
6493
+ if (typeof fn === "function")
6494
+ return fn;
6495
+ if (typeof fn === "string" && typeof mona_dish__WEBPACK_IMPORTED_MODULE_1__.DQ.global()[fn] === "function")
6496
+ return mona_dish__WEBPACK_IMPORTED_MODULE_1__.DQ.global()[fn];
6497
+ return (() => { });
6472
6498
  }
6473
6499
  })(PushImpl || (PushImpl = {}));
6474
6500
 
@@ -7308,9 +7334,6 @@ class ExtDomQuery extends mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ {
7308
7334
  return decodeURIComponent(result[1]);
7309
7335
  })) === null || _a === void 0 ? void 0 : _a[0]);
7310
7336
  }
7311
- globalEval(code, nonce) {
7312
- return new ExtDomQuery(super.globalEval(code, nonce !== null && nonce !== void 0 ? nonce : this.nonce.value));
7313
- }
7314
7337
  // called from base class runScripts, do not delete
7315
7338
  // noinspection JSUnusedGlobalSymbols
7316
7339
  globalEvalSticky(code, nonce) {
@@ -7528,12 +7551,12 @@ function decodeEncodedValues(encoded) {
7528
7551
  const splitKeyValuePair = (_line) => {
7529
7552
  let line = decodeURIComponent(_line);
7530
7553
  let index = line.indexOf("=");
7531
- if (index == -1) {
7554
+ if (index === -1) {
7532
7555
  return [line];
7533
7556
  }
7534
7557
  return [line.substring(0, index), line.substring(index + 1)];
7535
7558
  };
7536
- let requestParamEntries = encoded.split(/&/gi);
7559
+ let requestParamEntries = encoded.split("&");
7537
7560
  return requestParamEntries.filter(filterBlanks).map(splitKeyValuePair);
7538
7561
  }
7539
7562
  /**
@@ -7623,9 +7646,8 @@ __webpack_require__.r(__webpack_exports__);
7623
7646
  */
7624
7647
  class HiddenInputBuilder {
7625
7648
  constructor(selector) {
7626
- this.selector = selector;
7627
7649
  this.namedViewRoot = false;
7628
- const isViewState = selector.indexOf((0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(_core_Const__WEBPACK_IMPORTED_MODULE_1__.P_VIEWSTATE)) != -1;
7650
+ const isViewState = selector.includes((0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(_core_Const__WEBPACK_IMPORTED_MODULE_1__.P_VIEWSTATE));
7629
7651
  this.name = isViewState ? _core_Const__WEBPACK_IMPORTED_MODULE_1__.P_VIEWSTATE : _core_Const__WEBPACK_IMPORTED_MODULE_1__.P_CLIENT_WINDOW;
7630
7652
  this.template = isViewState ? _core_Const__WEBPACK_IMPORTED_MODULE_1__.HTML_VIEWSTATE : _core_Const__WEBPACK_IMPORTED_MODULE_1__.HTML_CLIENT_WINDOW;
7631
7653
  }
@@ -7642,37 +7664,39 @@ class HiddenInputBuilder {
7642
7664
  return this;
7643
7665
  }
7644
7666
  build() {
7645
- var _a, _b, _c;
7646
- const SEP = (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$faces)().separatorchar;
7647
- let existingStates = (0,mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ$)(`[name*='${(0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name)}']`);
7648
- let cnt = existingStates.asArray.map(state => {
7649
- let ident = state.id.orElse("0").value;
7650
- ident = ident.substring(ident.lastIndexOf(SEP) + 1);
7651
- return parseInt(ident);
7652
- })
7653
- .filter(item => {
7654
- return !isNaN(item);
7655
- })
7656
- .reduce((item1, item2) => {
7657
- return Math.max(item1, item2);
7658
- }, 0); //we start with 1 (see cnt++)
7659
- //the maximum new ident is the current max + 1
7660
- cnt++;
7667
+ var _a;
7661
7668
  const newElement = mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ.fromMarkup((0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.template));
7662
- newElement.id.value = (((_a = this.namingContainerId) === null || _a === void 0 ? void 0 : _a.length) ?
7663
- [this.namingContainerId, (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name), cnt] :
7664
- [(0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name), cnt]).join(SEP);
7665
- //name must be prefixed with the naming container id as well according to the jsdocs
7666
- if (this.namedViewRoot) {
7667
- newElement.name.value = ((_b = this.namingContainerId) === null || _b === void 0 ? void 0 : _b.length) ?
7668
- [this.namingContainerId, (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name)].join(SEP) : (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name);
7669
- }
7670
- else {
7671
- newElement.name.value = (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name);
7672
- }
7673
- (_c = this === null || this === void 0 ? void 0 : this.parent) === null || _c === void 0 ? void 0 : _c.append(newElement);
7669
+ newElement.id.value = this.buildId();
7670
+ newElement.name.value = this.buildName();
7671
+ (_a = this.parent) === null || _a === void 0 ? void 0 : _a.append(newElement);
7674
7672
  return newElement;
7675
7673
  }
7674
+ buildId() {
7675
+ var _a;
7676
+ const separator = (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$faces)().separatorchar;
7677
+ const parts = ((_a = this.namingContainerId) === null || _a === void 0 ? void 0 : _a.length) ?
7678
+ [this.namingContainerId, (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name), this.nextIndex()] :
7679
+ [(0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name), this.nextIndex()];
7680
+ return parts.join(separator);
7681
+ }
7682
+ buildName() {
7683
+ var _a;
7684
+ if (!this.namedViewRoot) {
7685
+ return (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name);
7686
+ }
7687
+ return ((_a = this.namingContainerId) === null || _a === void 0 ? void 0 : _a.length) ?
7688
+ [this.namingContainerId, (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name)].join((0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$faces)().separatorchar) :
7689
+ (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name);
7690
+ }
7691
+ nextIndex() {
7692
+ const separator = (0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$faces)().separatorchar;
7693
+ return (0,mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ$)(`[name*='${(0,_core_Const__WEBPACK_IMPORTED_MODULE_1__.$nsp)(this.name)}']`).asArray
7694
+ .map(state => state.id.orElse("0").value)
7695
+ .map(id => id.substring(id.lastIndexOf(separator) + 1))
7696
+ .map(idSuffix => parseInt(idSuffix))
7697
+ .filter(idSuffix => !isNaN(idSuffix))
7698
+ .reduce((max, idSuffix) => Math.max(max, idSuffix), 0) + 1;
7699
+ }
7676
7700
  }
7677
7701
 
7678
7702
 
@@ -7716,13 +7740,12 @@ __webpack_require__.r(__webpack_exports__);
7716
7740
  var ExtLang;
7717
7741
  (function (ExtLang) {
7718
7742
  let installedLocale;
7719
- let nameSpace = "impl/util/Lang/";
7743
+ const nameSpace = "impl/util/Lang/";
7720
7744
  function getLanguage() {
7721
7745
  //TODO global config override
7722
- var _a, _b;
7723
- let language = (_b = (_a = navigator.languages) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : navigator === null || navigator === void 0 ? void 0 : navigator.language;
7724
- language = language.split("-")[0];
7725
- return language;
7746
+ var _a, _b, _c;
7747
+ const language = (_c = (_b = (_a = navigator.languages) === null || _a === void 0 ? void 0 : _a[0]) !== null && _b !== void 0 ? _b : navigator === null || navigator === void 0 ? void 0 : navigator.language) !== null && _c !== void 0 ? _c : "en";
7748
+ return language.split("-")[0];
7726
7749
  }
7727
7750
  ExtLang.getLanguage = getLanguage;
7728
7751
  //should be in lang, but for now here to avoid recursive imports, not sure if typescript still has a problem with those
@@ -7844,15 +7867,15 @@ var ExtLang;
7844
7867
  * @param event
7845
7868
  */
7846
7869
  function getForm(elem, event) {
7847
- let queryElem = new mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ(elem);
7848
- let eventTarget = (event) ? new mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ((0,_xhrCore_RequestDataResolver__WEBPACK_IMPORTED_MODULE_3__.getEventTarget)(event)) : mona_dish__WEBPACK_IMPORTED_MODULE_0__.DomQuery.absent;
7870
+ const queryElem = new mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ(elem);
7871
+ const eventTarget = (event) ? new mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ((0,_xhrCore_RequestDataResolver__WEBPACK_IMPORTED_MODULE_3__.getEventTarget)(event)) : mona_dish__WEBPACK_IMPORTED_MODULE_0__.DomQuery.absent;
7849
7872
  if (queryElem.isTag(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM)) {
7850
7873
  return queryElem;
7851
7874
  }
7852
7875
  //html 5 for handling
7853
7876
  if (queryElem.attr(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM).isPresent()) {
7854
- let formId = queryElem.attr(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM).value;
7855
- let foundForm = mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ.byId(formId, true);
7877
+ const formId = queryElem.attr(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM).value;
7878
+ const foundForm = mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ.byId(formId, true);
7856
7879
  if (foundForm.isPresent()) {
7857
7880
  return foundForm;
7858
7881
  }
@@ -7977,6 +8000,7 @@ class XhrQueueController {
7977
8000
  constructor() {
7978
8001
  this.queue = [];
7979
8002
  this.taskRunning = false;
8003
+ this.debounceKey = `xhrQueue_${XhrQueueController.instanceCount++}`;
7980
8004
  }
7981
8005
  /**
7982
8006
  * executes or enqueues an element
@@ -7985,7 +8009,7 @@ class XhrQueueController {
7985
8009
  * until the debounce window for the timeout is closed.
7986
8010
  */
7987
8011
  enqueue(runnable, timeOut = 0) {
7988
- debounce("xhrQueue", () => {
8012
+ debounce(this.debounceKey, () => {
7989
8013
  const requestHandler = this.enrichRunnable(runnable);
7990
8014
  if (!this.taskRunning) {
7991
8015
  this.signalTaskRunning();
@@ -8053,6 +8077,9 @@ class XhrQueueController {
8053
8077
  this.taskRunning = !this.isEmpty;
8054
8078
  }
8055
8079
  }
8080
+ // Each instance needs its own debounce key: a shared key would cause enqueues
8081
+ // on separate instances to cancel each other's debounce window.
8082
+ XhrQueueController.instanceCount = 0;
8056
8083
 
8057
8084
 
8058
8085
  /***/ },
@@ -8633,9 +8660,7 @@ var Response;
8633
8660
  __webpack_require__.r(__webpack_exports__);
8634
8661
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
8635
8662
  /* harmony export */ resolveContexts: () => (/* binding */ resolveContexts),
8636
- /* harmony export */ resolveResponseXML: () => (/* binding */ resolveResponseXML),
8637
- /* harmony export */ resolveSourceElement: () => (/* binding */ resolveSourceElement),
8638
- /* harmony export */ resolveSourceForm: () => (/* binding */ resolveSourceForm)
8663
+ /* harmony export */ resolveResponseXML: () => (/* binding */ resolveResponseXML)
8639
8664
  /* harmony export */ });
8640
8665
  /* harmony import */ var mona_dish__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! mona-dish */ "./node_modules/mona-dish/src/main/typescript/index_core.ts");
8641
8666
  /* harmony import */ var _util_Assertions__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(/*! ../util/Assertions */ "./src/main/typescript/impl/util/Assertions.ts");
@@ -8660,7 +8685,6 @@ __webpack_require__.r(__webpack_exports__);
8660
8685
 
8661
8686
 
8662
8687
 
8663
-
8664
8688
  /**
8665
8689
  * Resolver functions for various aspects of the response data
8666
8690
  *
@@ -8706,38 +8730,6 @@ function resolveContexts(context) {
8706
8730
  internalContext.assign(_core_Const__WEBPACK_IMPORTED_MODULE_2__.UPDATE_ELEMS).value = [];
8707
8731
  return { externalContext, internalContext };
8708
8732
  }
8709
- /**
8710
- * fetches the source element out of our contexts
8711
- *
8712
- * @param context the external context which should host the source id
8713
- * @param internalContext internal pass-through fall back
8714
- *
8715
- */
8716
- function resolveSourceElement(context, internalContext) {
8717
- let elemId = resolveSourceElementId(context, internalContext);
8718
- return mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ.byId(elemId.value, true);
8719
- }
8720
- /**
8721
- * fetches the source form if it still exists
8722
- * also embedded forms and parent forms are taken into consideration
8723
- * as fallbacks
8724
- *
8725
- * @param internalContext
8726
- * @param elem
8727
- */
8728
- function resolveSourceForm(internalContext, elem) {
8729
- let sourceFormId = internalContext.getIf(_core_Const__WEBPACK_IMPORTED_MODULE_2__.CTX_PARAM_SRC_FRM_ID);
8730
- let sourceForm = new mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ(sourceFormId.isPresent() ? document.forms[sourceFormId.value] : null);
8731
- sourceForm = sourceForm.orElseLazy(() => elem.firstParent(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM))
8732
- .orElseLazy(() => elem.querySelectorAll(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM))
8733
- .orElseLazy(() => mona_dish__WEBPACK_IMPORTED_MODULE_0__.DQ.querySelectorAll(_core_Const__WEBPACK_IMPORTED_MODULE_2__.HTML_TAG_FORM));
8734
- return sourceForm;
8735
- }
8736
- function resolveSourceElementId(context, internalContext) {
8737
- //?internal context?? used to be external one
8738
- return internalContext.getIf(_core_Const__WEBPACK_IMPORTED_MODULE_2__.CTX_PARAM_SRC_CTL_ID)
8739
- .orElseLazy(() => context.getIf(_core_Const__WEBPACK_IMPORTED_MODULE_2__.SOURCE, "id").value);
8740
- }
8741
8733
 
8742
8734
 
8743
8735
  /***/ },