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.
- package/README.md +2 -1
- package/dist/docs/functions/faces.push.init.html +5 -5
- package/dist/docs/index.html +1 -0
- package/dist/window/faces-development.js +146 -154
- package/dist/window/faces-development.js.map +1 -1
- package/dist/window/faces.js +1 -1
- package/dist/window/faces.js.map +1 -1
- package/dist/window/jsf-development.js +146 -154
- package/dist/window/jsf-development.js.map +1 -1
- package/dist/window/jsf.js +1 -1
- package/dist/window/jsf.js.map +1 -1
- package/package.json +1 -1
- package/src/main/typescript/api/_api.ts +4 -4
- package/src/main/typescript/impl/PushImpl.ts +118 -87
- package/src/main/typescript/impl/util/ExtDomQuery.ts +0 -4
- package/src/main/typescript/impl/util/FileUtils.ts +3 -3
- package/src/main/typescript/impl/util/HiddenInputBuilder.ts +34 -34
- package/src/main/typescript/impl/util/Lang.ts +12 -15
- package/src/main/typescript/impl/util/XhrQueueController.ts +7 -1
- package/src/main/typescript/impl/xhrCore/ResponseDataResolver.ts +0 -38
- package/src/main/typescript/test/api/JsfPushShimTest.spec.ts +61 -2
- package/src/main/typescript/test/impl/AssertionsTest.spec.ts +167 -0
- package/src/main/typescript/test/impl/FileUtilsTest.spec.ts +125 -0
- package/src/main/typescript/test/impl/ResponseDataResolverTest.spec.ts +61 -0
- package/src/main/typescript/test/impl/util/ExtDomQueryTest.spec.ts +60 -1
- package/src/main/typescript/test/impl/util/ExtLangTest.spec.ts +104 -0
- package/src/main/typescript/test/impl/util/HiddenInputBuilderTest.spec.ts +73 -0
- package/src/main/typescript/test/queue/AsynchronousQueueTest.spec.ts +143 -2
- 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">
|
|
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">
|
|
5
|
-
</div></li><li><span><span class="tsd-kind-parameter">onmessage</span>: <span class="tsd-signature-type">
|
|
6
|
-
</div></li><li><span><span class="tsd-kind-parameter">onerror</span>: <span class="tsd-signature-type">
|
|
7
|
-
</div></li><li><span><span class="tsd-kind-parameter">onclose</span>: <span class="tsd-signature-type">
|
|
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>
|
package/dist/docs/index.html
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
6322
|
+
onmessage(event) {
|
|
6335
6323
|
var _a, _b, _c;
|
|
6336
6324
|
let message = JSON.parse(event.data);
|
|
6337
|
-
|
|
6338
|
-
|
|
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
|
-
|
|
6351
|
+
clientIds.splice(i, 1);
|
|
6361
6352
|
}
|
|
6362
6353
|
}
|
|
6363
|
-
if (
|
|
6354
|
+
if (clientIds.length === 0) {
|
|
6364
6355
|
// tag disappeared
|
|
6365
6356
|
this.close();
|
|
6366
6357
|
}
|
|
6367
6358
|
}
|
|
6368
6359
|
onclose(event) {
|
|
6369
|
-
|
|
6370
|
-
|
|
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
|
|
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
|
-
||
|
|
6376
|
-
// 1008 = Policy Violation
|
|
6377
|
-
|
|
6378
|
-
|
|
6379
|
-
|
|
6380
|
-
|
|
6381
|
-
|
|
6382
|
-
|
|
6383
|
-
|
|
6384
|
-
|
|
6385
|
-
|
|
6386
|
-
|
|
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
|
-
|
|
6394
|
-
|
|
6395
|
-
|
|
6396
|
-
|
|
6397
|
-
|
|
6398
|
-
|
|
6399
|
-
|
|
6400
|
-
|
|
6401
|
-
|
|
6402
|
-
|
|
6403
|
-
|
|
6404
|
-
|
|
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
|
-
|
|
6408
|
-
|
|
6429
|
+
catch (e) {
|
|
6430
|
+
//Ignore
|
|
6409
6431
|
}
|
|
6410
6432
|
}
|
|
6411
|
-
|
|
6412
|
-
|
|
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
|
-
|
|
6423
|
-
if (this.
|
|
6424
|
-
|
|
6425
|
-
|
|
6426
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
|
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(
|
|
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.
|
|
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
|
|
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 =
|
|
7663
|
-
|
|
7664
|
-
|
|
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
|
-
|
|
7743
|
+
const nameSpace = "impl/util/Lang/";
|
|
7720
7744
|
function getLanguage() {
|
|
7721
7745
|
//TODO global config override
|
|
7722
|
-
var _a, _b;
|
|
7723
|
-
|
|
7724
|
-
|
|
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
|
-
|
|
7848
|
-
|
|
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
|
-
|
|
7855
|
-
|
|
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(
|
|
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
|
/***/ },
|