diff --git a/package.json b/package.json index b7b4283..78d67c4 100644 --- a/package.json +++ b/package.json @@ -29,8 +29,7 @@ }, "devDependencies": { "@ampproject/rollup-plugin-closure-compiler": "^0.9.0", - "jsdoc": "3.5.5", - "tsd-jsdoc": "^2.3.1", + "jsdoc": "^3.6.3", "magic-string": "^0.25.3", "minimist": "^1.2.0", "requirejs": "^2.3.6", @@ -38,7 +37,9 @@ "rollup-plugin-alias": "^1.5.2", "rollup-plugin-node-resolve": "^5.2.0", "rollup-plugin-replace": "^2.2.0", - "rollup-plugin-virtual": "^1.0.1" + "rollup-plugin-virtual": "^1.0.1", + "taffydb": "^2.7.3", + "tsd-jsdoc": "^2.3.1" }, "scripts": { "build": "node tools/build --config tools/build.config.js" diff --git a/source/LightstreamerClient.js b/source/LightstreamerClient.js index 6f898dd..283d35b 100644 --- a/source/LightstreamerClient.js +++ b/source/LightstreamerClient.js @@ -1088,11 +1088,11 @@ END_NODE_JSDOC_EXCLUDE * Operation method that registers the MPN device on the server's MPN Module.
* By registering an MPN device, the client enables MPN functionalities such as {@link LightstreamerClient#subscribeMpn}. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An {@link MpnDevice} can be registered at any time. The registration will be notified through a {@link MpnDeviceListener#onRegistered} event. + *

Lifecycle: An {@link MpnDevice} can be registered at any time. The registration will be notified through a {@link MpnDeviceListener#onRegistered} event.

* * @param device An {@link MpnDevice} instance, carrying all the information about the MPN device. * @throws IllegalArgumentException if the specified device is null. @@ -1126,15 +1126,15 @@ END_NODE_JSDOC_EXCLUDE * the same subscriptions have been activated before or not. In fact, since MPN subscriptions are persistent, if they are activated every time the app starts and * the coalescing flag is not set, every activation is a new MPN subscription, leading to multiple push notifications for the same event. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An MpnSubscription can be given to the LightstreamerClient once an MpnDevice registration has been requested. The MpnSubscription + *

Lifecycle: An MpnSubscription can be given to the LightstreamerClient once an MpnDevice registration has been requested. The MpnSubscription * immediately enters the "active" state.
* Once "active", an MpnSubscription instance cannot be provided again to an LightstreamerClient unless it is first removed from the "active" state through * a call to {@link #unsubscribeMpn}.
- * A successful subscription to the server will be notified through an {@link MpnSubscriptionListener#onSubscription} event. + * A successful subscription to the server will be notified through an {@link MpnSubscriptionListener#onSubscription} event.

* * @param subscription An MpnSubscription object, carrying all the information to route real-time data via push notifications. * @param coalescing A flag that specifies if the MPN subscription must coalesce with any pre-existing MPN subscription with the same Adapter Set, Data Adapter, @@ -1177,12 +1177,12 @@ END_NODE_JSDOC_EXCLUDE * Operation method that unsubscribes an MpnSubscription from the server's MPN Module.
* This operation removes the MpnSubscription from the list of "active" subscriptions. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An MpnSubscription can be unsubscribed from at any time. Once done the MpnSubscription immediately exits the "active" state.
- * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event. + *

Lifecycle: An MpnSubscription can be unsubscribed from at any time. Once done the MpnSubscription immediately exits the "active" state.
+ * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event.

* * @param subscription An "active" MpnSubscription object. * @throws IllegalStateException if the given MPN subscription is not active. @@ -1208,12 +1208,12 @@ END_NODE_JSDOC_EXCLUDE * By specifying a status filter it is possible to unsubscribe multiple MPN subscriptions at once. E.g. by passing TRIGGERED it is possible * to unsubscribe all triggered MPN subscriptions. This operation removes the involved MPN subscriptions from the list of "active" subscriptions. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle Multiple unsubscription can be requested at any time. Once done the involved MPN subscriptions immediately exit the "active" state.
- * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event to all involved MPN subscriptions. + *

Lifecycle: Multiple unsubscription can be requested at any time. Once done the involved MPN subscriptions immediately exit the "active" state.
+ * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event to all involved MPN subscriptions.

* * @param filter A status name to be used to select the MPN subscriptions to unsubscribe. If null all existing MPN subscriptions * are unsubscribed. Possible filter values are: * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the status of the subscription. * @@ -375,10 +375,10 @@ export default /*@__PURE__*/(function() { /** * The server-side timestamp of the subscription status. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument status_timestamp on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument status_timestamp on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @return {Number} The server-side timestamp of the subscription status, expressed as a Java time. * @@ -394,11 +394,11 @@ export default /*@__PURE__*/(function() { * Any call to this method will override any "Item List" or "Item Group" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String[]} items an array of items to be subscribed to through the server. * @throws IllegalArgumentException if any of the item names in the "Item List" @@ -419,8 +419,8 @@ export default /*@__PURE__*/(function() { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * items are always expressed with an "Item Group"", even if originally the MPN subscription used an "Item List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * with an "Item List". + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * with an "Item List".

* @return {String[]} the "Item List" to be subscribed to through the server. * @@ -439,11 +439,11 @@ export default /*@__PURE__*/(function() { * Any call to this method will override any "Item List" or "Item Group" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} groupName A String to be expanded into an item list by the * Metadata Adapter. @@ -460,8 +460,8 @@ export default /*@__PURE__*/(function() { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * items are always expressed with an "Item Group"", even if originally the MPN subscription used an "Item List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using an "Item Group" + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using an "Item Group"

* * @return {String} the "Item Group" to be subscribed to through the server. * @@ -480,11 +480,11 @@ export default /*@__PURE__*/(function() { * Any call to this method will override any "Field List" or "Field Schema" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String[]} fields an array of fields to be subscribed to through the server. * @throws IllegalArgumentException if any of the field names in the list @@ -503,8 +503,8 @@ export default /*@__PURE__*/(function() { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * fields are always expressed with a "Field Schema"", even if originally the MPN subscription used a "Field List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using a "Field List". + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using a "Field List".

* * @return {String[]} the "Field List" to be subscribed to through the server. * @@ -523,11 +523,11 @@ export default /*@__PURE__*/(function() { * Any call to this method will override any "Field List" or "Field Schema" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} schemaName A String to be expanded into a field list by the * Metadata Adapter. @@ -545,8 +545,8 @@ export default /*@__PURE__*/(function() { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * fields are always expressed with a "Field Schema"", even if originally the MPN subscription used a "Field List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using a "Field Schema" + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using a "Field Schema"

* * @return {String} the "Field Schema" to be subscribed to through the server. @@ -572,14 +572,14 @@ export default /*@__PURE__*/(function() { * items of the set in a single MpnSubscription. Multiple MpnSubscriptions * have to be defined. * - * @default The default Data Adapter for the Adapter Set, - * configured as "DEFAULT" on the Server. + *

Default value: The default Data Adapter for the Adapter Set, + * configured as "DEFAULT" on the Server.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument adapter on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument adapter on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} dataAdapter the name of the Data Adapter. A null value * is equivalent to the "DEFAULT" name. @@ -597,7 +597,7 @@ export default /*@__PURE__*/(function() { * Inquiry method that can be used to read the name of the Data Adapter specified for this * MpnSubscription through {@link MpnSubscription#setDataAdapter}. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the name of the Data Adapter; returns null if no name has been configured, * so that the "DEFAULT" Adapter Set is used. @@ -614,16 +614,16 @@ export default /*@__PURE__*/(function() { * despite of bandwidth or frequency limits.
* Note that the Server may pose an upper limit on the size of its internal buffers. * - * @default null, meaning to lean on the Server default based on the subscription + *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This means that the buffer size will be 1 for MERGE * subscriptions and "unlimited" for DISTINCT subscriptions. See - * the "General Concepts" document for further details. + * the "General Concepts" document for further details.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument requested_buffer_size on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument requested_buffer_size on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param size An integer number, representing the length of the internal queuing buffers * to be used in the Server. If the string "unlimited" is supplied, then no buffer @@ -662,7 +662,7 @@ export default /*@__PURE__*/(function() { * {@link MpnSubscription#setRequestedBufferSize}, to be requested to the Server for * this MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {Number|String} An integer number, representing the buffer size to be requested to the server, * or the string "unlimited", or null. @@ -684,21 +684,21 @@ export default /*@__PURE__*/(function() { * server side and this request can only be issued in order to further * reduce the frequency, not to rise it beyond these limits. * - * @general_edition_note A further global frequency limit could also be imposed by the Server, + *

Edition Note: A further global frequency limit could also be imposed by the Server, * depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard). + * Monitoring Dashboard (by default, available at /dashboard).

* - * @default null, meaning to lean on the Server default based on the subscription + *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This consists, for all modes, in not applying any frequency * limit to the subscription (the same as "unlimited"); see the "General Concepts" - * document for further details. + * document for further details.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument requested_max_frequency on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument requested_max_frequency on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param freq A decimal number, representing the maximum update frequency (expressed in updates * per second) for each item in the Subscription; for instance, with a setting @@ -742,7 +742,7 @@ export default /*@__PURE__*/(function() { * through {@link MpnSubscription#setRequestedMaxFrequency}, to be requested to the * Server for this MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {Number|String} A decimal number, representing the max frequency to be requested to the server * (expressed in updates per second), or the string "unlimited", or null. @@ -761,7 +761,7 @@ export default /*@__PURE__*/(function() { * Inquiry method that can be used to read the mode specified for this * MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the MpnSubscription mode specified in the constructor. */ @@ -780,7 +780,7 @@ export default /*@__PURE__*/(function() { * Two MpnSubscription objects with the same subscription ID always represent the same server-side MPN subscription. It is the client's duty to keep the status * and properties of these objects up to date and aligned. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the MPN subscription ID. */ diff --git a/source/Subscription.js b/source/Subscription.js index 816a79f..e99cd58 100644 --- a/source/Subscription.js +++ b/source/Subscription.js @@ -918,11 +918,11 @@ export default /*@__PURE__*/(function() { * requests may be refused if any frequency limit is posed on the server * side for some item. * - *

Edition Note: A further global frequency limit could also + *

Edition Note: A further global frequency limit could also * be imposed by the Server, depending on Edition and License Type; this specific limit also applies to RAW mode * and to unfiltered dispatching. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This consists, for all modes, in not applying any frequency @@ -1795,11 +1795,10 @@ export default /*@__PURE__*/(function() { addSubTable: function(_item,_key) { var st = new Subscription(this.subMode); st.makeSubTable(this); - - this.subTables.insert(st,_item,_key); - + try { st.setItems([_key]); + this.subTables.insert(st,_item,_key); } catch(e) { this.dispatchEvent("onCommandSecondLevelSubscriptionError", [14, INVALID_SECOND_LEVEL_KEY, _key]); return; diff --git a/source/beans/ConnectionDetails.js b/source/beans/ConnectionDetails.js index f3894b6..02be854 100644 --- a/source/beans/ConnectionDetails.js +++ b/source/beans/ConnectionDetails.js @@ -122,10 +122,10 @@ END_NODE_JSDOC_EXCLUDE * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: HTTPS is an optional + *

Edition Note: HTTPS is an optional * feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* START_NODE_JSDOC_EXCLUDE *

Default value: the address of the server @@ -346,10 +346,10 @@ END_NODE_JSDOC_EXCLUDE * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

@@ -385,10 +385,10 @@ END_NODE_JSDOC_EXCLUDE * when a Server cluster is in place and particular configurations for the * load balancer are used. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

diff --git a/source/beans/ConnectionOptions.js b/source/beans/ConnectionOptions.js index 7807afe..0244513 100644 --- a/source/beans/ConnectionOptions.js +++ b/source/beans/ConnectionOptions.js @@ -401,10 +401,10 @@ END_NODE_JSDOC_EXCLUDE * Lightstreamer Server. A limit on bandwidth may already be posed by the Metadata Adapter, but the client can * furtherly restrict this limit. The limit applies to the bytes received in each streaming or polling connection. * - *

Edition Note: Bandwidth Control is + *

Edition Note: Bandwidth Control is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: "unlimited".

* @@ -999,10 +999,10 @@ END_NODE_JSDOC_EXCLUDE * environment, if the Server address specified is actually a local address * to a specific Server instance in the cluster. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -1123,10 +1123,10 @@ END_WEB_JSDOC_EXCLUDE * viceversa it should be set to true if such elements are not set on * the target server(s) configuration. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -1551,7 +1551,8 @@ END_NODE_JSDOC_EXCLUDE }, /** - * @private (used by LightstreamerClient) + * (used by LightstreamerClient) + * @private */ installRemoteAdapterStatusObserver: function(metadataErrorCode, dataAdapterName, statusItemName, reconnectMaxDelay) { this.remoteAdapterStatusObserver = { diff --git a/source/control/Tutor.js b/source/control/Tutor.js index 40dd851..8bcfd78 100644 --- a/source/control/Tutor.js +++ b/source/control/Tutor.js @@ -3,6 +3,7 @@ import Executor from "../../src-tool/Executor"; var MIN_TIMEOUT = 4000; var Tutor = function(connOptions,currentTimeout) { + this.discarded = false; this.connOptions = connOptions; this.timeoutMs = this.getFixedTimeout ? this.getFixedTimeout() : (currentTimeout ? currentTimeout*2 : MIN_TIMEOUT); }; @@ -19,9 +20,13 @@ import Executor from "../../src-tool/Executor"; }, /*private*/ onTimeout: function() { - if (!this.verifySuccess()) { + if (!(this.discarded || this.verifySuccess())) { this.doRecovery(); } + }, + + discard: function() { + this.discarded = true; } /*abstract function verifySuccess()*/ diff --git a/source/engine/PushPageCollectionHandler.js b/source/engine/PushPageCollectionHandler.js index 1c998fc..885edcd 100644 --- a/source/engine/PushPageCollectionHandler.js +++ b/source/engine/PushPageCollectionHandler.js @@ -318,6 +318,7 @@ import SubscriptionChangeTutor from "../control/SubscriptionChangeTutor"; var tutor = new UnsubscribeTutor(this.options,tableNum,this,effort,currentTimeout); var deleteBody = this.subscriptions[tableNum].deleteBody; + deleteBody['LS_reqId'] = Utils.nextRequestId(); this.engine.sessionHandler.sendUnsubscription(tableNum,deleteBody,this,effort >= 2,tutor); }, diff --git a/source/engine/Session.js b/source/engine/Session.js index 2036d62..b6529b8 100644 --- a/source/engine/Session.js +++ b/source/engine/Session.js @@ -518,6 +518,7 @@ import Environment from "../../src-tool/Environment"; }, /*public*/ closeSession: function(closeReason,alreadyClosedOnServer,noRecoveryScheduled) { + sessionLogger.logInfo("Closing session",this,closeReason); if (this.phase != _OFF && this.phase != CREATING && this.phase != SLEEP) { this.handler.onObsoleteControlLink(this.getPushServerAddress()); @@ -531,16 +532,7 @@ import Environment from "../../src-tool/Environment"; this.connectionBean.simpleSetter("serverSocketName",null); this.connectionBean.simpleSetter("serverInstanceAddress",null); - this.resetTimers(); - - sessionLogger.logInfo("Closing session",this,closeReason); - - } else if (this.recoveryBean.isRecovery()) { - /* - * This branch is run when the recovery fails. - * We need to make some clean up so that the next session creation - * is executed in a clean environment. - */ + } else { this.handlerPhase = this.handler.onSessionClose(this.handlerPhase,noRecoveryScheduled); } @@ -649,7 +641,8 @@ import Environment from "../../src-tool/Environment"; } else if (this.phase == CREATED || this.phase == BINDING || this.phase == _STALLED || this.phase == SLEEP) { if (this.slowRequired || this.switchRequired) { - this.handler.createMachine(this.handlerPhase,tCause+".switch",this.switchForced); + sessionLogger.logDebug("Timeout: switch transport"); + this.handler.createMachine(this.handlerPhase,tCause+".switch",this.switchForced); } else if (!this.isPolling || this.forced) { if (this.preparingRecovery) { /* @@ -670,8 +663,19 @@ import Environment from "../../src-tool/Environment"; } } else { /* - * Branch reserved for polling (I suppose...) + * Branch reserved for polling. + * + * NOTE + * In the past, when an error occurred during polling, the new session was created not in polling + * but in streaming (probably because polling was seen as sub-optimal transport). + * With the introduction of the recovery, we are faced with 3 options: + * 1) recovering the session in polling + * 2) recovering the session in streaming + * 3) creating a new session in streaming. + * The second option is probably the best one, but, since the client falls-back rarely to polling, + * in order to ease the implementation, I have decided to follow the third path. */ + sessionLogger.logDebug(this.preparingRecovery ? "Timeout: switch transport from polling (ignore recovery)" : "Timeout: switch transport from polling"); this.handler.createMachine(this.handlerPhase,tCause,false); } @@ -1392,14 +1396,21 @@ import Environment from "../../src-tool/Environment"; } else if (errorCode == 11) { // error 11 is managed as CONERR 21 this.onFatalError(21, errorMsg); - } else if (listenerCallback != null) { - // since there is a listener, don't fall-back to fatal error case + } else if (listenerCallback != null && errorCode != 65 /*65 is a fatal error*/) { + /* + * since there is a listener (because it is a REQERR message), + * don't fall-back to fatal error case + */ try { listenerCallback(); } catch (e) { this.handler.onFatalError(e); } } else { + /* + * fall-back case handles fatal errors, i.e. ERROR messages: + * close current session, don't create a new session, notify client listeners + */ this.onFatalError(errorCode, errorMsg); } }, @@ -1558,7 +1569,17 @@ import Environment from "../../src-tool/Environment"; //this is used to retry force_bind requests in case they fail to reach the server var tutor = new ForceRebindTutor(rebindCause,this,this.push_phase,this.policyBean); - this.controlHandler.addRequest(this.sessionId, _data, ControlRequest.FORCE_REBIND, tutor); + var requestListener = { + onREQOK: function(LS_window) { + // nothing to do: expecting CONS + }, + + onREQERR: function(LS_window, phase, errorCode, errorMsg) { + tutor.discard(); + sessionLogger.logError("force_rebind request caused the error: " + errorCode + " " + errorMsg + " - The error will be silently ignored."); + } + }; + this.controlHandler.addRequest(this.sessionId, _data, ControlRequest.FORCE_REBIND, tutor, null, requestListener); }, @@ -1572,7 +1593,16 @@ import Environment from "../../src-tool/Environment"; var _data = RequestsHelper.getDestroyParams(this.sessionId,reason); - this.forwardDestroyRequestToTransport(this.sessionId, _data, ControlRequest.DESTROY,null,this.getPushServerAddress()); + var requestListener = { + onREQOK: function(LS_window) { + // nothing to do + }, + + onREQERR: function(LS_window, phase, errorCode, errorMsg) { + sessionLogger.logError("destroy request caused the error: " + errorCode + " " + errorMsg + " - The error will be silently ignored."); + } + }; + this.forwardDestroyRequestToTransport(this.sessionId, _data, ControlRequest.DESTROY,null,this.getPushServerAddress(),requestListener); }, changeBandwidth: function() { @@ -1588,7 +1618,16 @@ import Environment from "../../src-tool/Environment"; } var query = RequestsHelper.getConstraintParams(this.policyBean); - this.controlHandler.addRequest(null, query, ControlRequest.CONSTRAINT, null); + var requestListener = { + onREQOK: function(LS_window) { + // nothing to do: expecting CONS + }, + + onREQERR: function(LS_window, phase, errorCode, errorMsg) { + sessionLogger.logError("constrain request " + printObj(query) + " caused the error: ", errorCode, errorMsg); + } + }; + this.controlHandler.addRequest(null, query, ControlRequest.CONSTRAINT, null, null, requestListener); }, onServerName: function(name) { @@ -1607,7 +1646,7 @@ import Environment from "../../src-tool/Environment"; * when the session is closing, WebSocket can delivery the request synchronously * while HTTP has to delivery the request asynchronously. */ - forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost) { + forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost, requestListener) { throw new Error("abstract method"); }, @@ -1643,6 +1682,15 @@ import Environment from "../../src-tool/Environment"; return this.policyBean.currentRetryDelay; } }; + + function printObj(obj) { + var s = "{"; + for (var p in obj) { + s += p + "=" + obj[p] + " "; + } + s += "}"; + return s; + } export default Session; diff --git a/source/engine/SessionHTTP.js b/source/engine/SessionHTTP.js index 1c2df7a..8d4eedc 100644 --- a/source/engine/SessionHTTP.js +++ b/source/engine/SessionHTTP.js @@ -394,8 +394,8 @@ import XSXHRConnection from "../net/XSXHRConnection"; }, /**@override*/ - forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost) { - this.controlHandler.addRequest(sessionId, request, type, related, retryingOrHost); + forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost, requestListener) { + this.controlHandler.addRequest(sessionId, request, type, related, retryingOrHost, requestListener); } }; diff --git a/source/engine/SessionHandler.js b/source/engine/SessionHandler.js index 24bb402..8d64ce5 100644 --- a/source/engine/SessionHandler.js +++ b/source/engine/SessionHandler.js @@ -949,11 +949,31 @@ import Assertions from "../utils/Assertions"; }, /*public*/ sendUnsubscription: function(tableNum,delBody,ppHandler,retrying,tutor) { - this.controlHandler.addRequest(tableNum,delBody,ControlRequest.REMOVE, tutor, retrying); + var requestListener = { + onREQOK: function(LS_window) { + // nothing to do: expecting UNSUB + }, + + onREQERR: function(LS_window, phase, errorCode, errorMsg) { + tutor.discard(); + sessionLogger.logError("unsubscription request " + printObj(delBody) + " caused the error: ", errorCode, errorMsg); + } + }; + this.controlHandler.addRequest(tableNum,delBody,ControlRequest.REMOVE, tutor, retrying, requestListener); }, /*public*/ sendSubscriptionChange: function(tableNum,changeBody,tutor) { - this.controlHandler.addRequest(tableNum,changeBody,ControlRequest.CHANGE_SUB,tutor); + var requestListener = { + onREQOK: function(LS_window) { + // nothing to do: expecting CONF + }, + + onREQERR: function(LS_window, phase, errorCode, errorMsg) { + tutor.discard(); + sessionLogger.logError("configuration request [" + printObj(changeBody) + "] caused the error: " + errorCode + " " + errorMsg); + } + }; + this.controlHandler.addRequest(tableNum,changeBody,ControlRequest.CHANGE_SUB,tutor,null,requestListener); }, //not exactly part of this group, but close enough @@ -1079,6 +1099,15 @@ import Assertions from "../utils/Assertions"; } }; + + function printObj(obj) { + var s = "{"; + for (var p in obj) { + s += p + "=" + obj[p] + " "; + } + s += "}"; + return s; + } SessionHandler.prototype["unloadEvent"] = SessionHandler.prototype.unloadEvent; diff --git a/source/engine/SessionWS.js b/source/engine/SessionWS.js index 1650fe5..c169a54 100644 --- a/source/engine/SessionWS.js +++ b/source/engine/SessionWS.js @@ -361,8 +361,8 @@ import Utils from "../Utils"; }, /**@override*/ - forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost) { - this.controlHandler.addSyncRequest(sessionId, request, type, related, retryingOrHost); + forwardDestroyRequestToTransport: function(sessionId, request, type, related, retryingOrHost, requestListener) { + this.controlHandler.addSyncRequest(sessionId, request, type, related, retryingOrHost, requestListener); } }; diff --git a/source/pushpage/MessageProxy.js b/source/pushpage/MessageProxy.js index b09293b..7bb04d1 100644 --- a/source/pushpage/MessageProxy.js +++ b/source/pushpage/MessageProxy.js @@ -166,8 +166,11 @@ import Assertions from "../utils/Assertions"; /*public*/ messageError: function(listenerProg,_code,msg) { var listener = this.getListener(listenerProg); - - this.fireEvent("onError",listener,[this.getOriginalMessage(listenerProg)]); + if (_code != 32 && _code != 33) { + /* errors 32 and 33 must not be notified to the user + * because they are due to late responses of the server */ + this.fireEvent("onError",listener,[this.getOriginalMessage(listenerProg)]); + } this.clean(listenerProg); }, diff --git a/source/pushpage/NewEngineHandler.js b/source/pushpage/NewEngineHandler.js index 96f2d1e..92fd93f 100644 --- a/source/pushpage/NewEngineHandler.js +++ b/source/pushpage/NewEngineHandler.js @@ -72,13 +72,13 @@ import Executor from "../../src-tool/Executor"; }, onSessionEnd: function(ph) { + this.sessionPhase = ph; if (this.sessionAlive) { this.sessionEnd(ph); } }, sessionEnd: function(ph) { - this.sessionPhase = ph; this.sessionAlive = false; this.client.sessionEnd(); }, diff --git a/src-tool/Executor.js b/src-tool/Executor.js index a3609e5..5a60082 100644 --- a/src-tool/Executor.js +++ b/src-tool/Executor.js @@ -61,7 +61,16 @@ export default /*@__PURE__*/(function() { // on recent browsers we send a post message and trigger the doTick when we receive such message if (Environment.isBrowserDocument() && typeof postMessage != "undefined") { generateTickExecution = function() { - window.postMessage("Lightstreamer.run",origin); + try { + window.postMessage("Lightstreamer.run",origin); + } catch (e) { + // sometimes on IE postMessage fails mysteriously but, if repeated, works + try { + window.postMessage("Lightstreamer.run",origin); + } catch (e) { + // await next tick (at most 50ms on foreground page and 1s in background pages) + } + } }; var postMessageHandler = function(event){ diff --git a/tools/dist-node/package.json b/tools/dist-node/package.json index 97cb7da..eaed36e 100644 --- a/tools/dist-node/package.json +++ b/tools/dist-node/package.json @@ -1,6 +1,6 @@ { "name": "lightstreamer-client-node", - "version": "8.0.0", + "version": "8.0.2", "description": "This package includes the resources needed to write a Lightstreamer client.", "license": "Apache-2.0", "keywords": [ diff --git a/tools/dist-node/types.d.ts b/tools/dist-node/types.d.ts index fbf6dd5..80e6522 100644 --- a/tools/dist-node/types.d.ts +++ b/tools/dist-node/types.d.ts @@ -142,10 +142,10 @@ export class ConnectionDetails { * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: HTTPS is an optional + *

Edition Note: HTTPS is an optional * feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* * @@ -311,10 +311,10 @@ export class ConnectionDetails { * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

@@ -343,10 +343,10 @@ export class ConnectionDetails { * when a Server cluster is in place and particular configurations for the * load balancer are used. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

@@ -553,10 +553,10 @@ export class ConnectionOptions { * Lightstreamer Server. A limit on bandwidth may already be posed by the Metadata Adapter, but the client can * furtherly restrict this limit. The limit applies to the bytes received in each streaming or polling connection. * - *

Edition Note: Bandwidth Control is + *

Edition Note: Bandwidth Control is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: "unlimited".

* @@ -1023,10 +1023,10 @@ export class ConnectionOptions { * environment, if the Server address specified is actually a local address * to a specific Server instance in the cluster. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -1120,10 +1120,10 @@ export class ConnectionOptions { * viceversa it should be set to true if such elements are not set on * the target server(s) configuration. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -3491,11 +3491,11 @@ export class Subscription { * requests may be refused if any frequency limit is posed on the server * side for some item. * - *

Edition Note: A further global frequency limit could also + *

Edition Note: A further global frequency limit could also * be imposed by the Server, depending on Edition and License Type; this specific limit also applies to RAW mode * and to unfiltered dispatching. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This consists, for all modes, in not applying any frequency diff --git a/tools/dist/package.json b/tools/dist/package.json index d7f12b4..da79c2d 100644 --- a/tools/dist/package.json +++ b/tools/dist/package.json @@ -1,6 +1,6 @@ { "name": "lightstreamer-client-web", - "version": "8.0.0", + "version": "8.0.2", "description": "This package includes the resources needed to write a Lightstreamer client.", "license": "Apache-2.0", "keywords": [ diff --git a/tools/dist/types.d.ts b/tools/dist/types.d.ts index 9b484f9..d300292 100644 --- a/tools/dist/types.d.ts +++ b/tools/dist/types.d.ts @@ -2097,10 +2097,10 @@ export class ConnectionDetails { * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: HTTPS is an optional + *

Edition Note: HTTPS is an optional * feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: the address of the server @@ -2285,10 +2285,10 @@ export class ConnectionDetails { * internally converted to match the related WebSocket protocol * (i.e. http becomes ws while https becomes wss). * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

@@ -2321,10 +2321,10 @@ export class ConnectionDetails { * when a Server cluster is in place and particular configurations for the * load balancer are used. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Lifecycle: The method gives a meaningful answer only when * a session is currently active.

@@ -2552,10 +2552,10 @@ export class ConnectionOptions { * Lightstreamer Server. A limit on bandwidth may already be posed by the Metadata Adapter, but the client can * furtherly restrict this limit. The limit applies to the bytes received in each streaming or polling connection. * - *

Edition Note: Bandwidth Control is + *

Edition Note: Bandwidth Control is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: "unlimited".

* @@ -3061,10 +3061,10 @@ export class ConnectionOptions { * environment, if the Server address specified is actually a local address * to a specific Server instance in the cluster. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -3161,10 +3161,10 @@ export class ConnectionOptions { * viceversa it should be set to true if such elements are not set on * the target server(s) configuration. * - *

Edition Note: Server Clustering is + *

Edition Note: Server Clustering is * an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: false.

* @@ -5679,11 +5679,11 @@ export class LightstreamerClient { * Operation method that registers the MPN device on the server's MPN Module.
* By registering an MPN device, the client enables MPN functionalities such as {@link LightstreamerClient#subscribeMpn}. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An {@link MpnDevice} can be registered at any time. The registration will be notified through a {@link MpnDeviceListener#onRegistered} event. + *

Lifecycle: An {@link MpnDevice} can be registered at any time. The registration will be notified through a {@link MpnDeviceListener#onRegistered} event.

* * @param device An {@link MpnDevice} instance, carrying all the information about the MPN device. * @throws IllegalArgumentException if the specified device is null. @@ -5704,15 +5704,15 @@ export class LightstreamerClient { * the same subscriptions have been activated before or not. In fact, since MPN subscriptions are persistent, if they are activated every time the app starts and * the coalescing flag is not set, every activation is a new MPN subscription, leading to multiple push notifications for the same event. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An MpnSubscription can be given to the LightstreamerClient once an MpnDevice registration has been requested. The MpnSubscription + *

Lifecycle: An MpnSubscription can be given to the LightstreamerClient once an MpnDevice registration has been requested. The MpnSubscription * immediately enters the "active" state.
* Once "active", an MpnSubscription instance cannot be provided again to an LightstreamerClient unless it is first removed from the "active" state through * a call to {@link #unsubscribeMpn}.
- * A successful subscription to the server will be notified through an {@link MpnSubscriptionListener#onSubscription} event. + * A successful subscription to the server will be notified through an {@link MpnSubscriptionListener#onSubscription} event.

* * @param subscription An MpnSubscription object, carrying all the information to route real-time data via push notifications. * @param coalescing A flag that specifies if the MPN subscription must coalesce with any pre-existing MPN subscription with the same Adapter Set, Data Adapter, @@ -5730,12 +5730,12 @@ export class LightstreamerClient { * Operation method that unsubscribes an MpnSubscription from the server's MPN Module.
* This operation removes the MpnSubscription from the list of "active" subscriptions. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle An MpnSubscription can be unsubscribed from at any time. Once done the MpnSubscription immediately exits the "active" state.
- * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event. + *

Lifecycle: An MpnSubscription can be unsubscribed from at any time. Once done the MpnSubscription immediately exits the "active" state.
+ * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event.

* * @param subscription An "active" MpnSubscription object. * @throws IllegalStateException if the given MPN subscription is not active. @@ -5750,12 +5750,12 @@ export class LightstreamerClient { * By specifying a status filter it is possible to unsubscribe multiple MPN subscriptions at once. E.g. by passing TRIGGERED it is possible * to unsubscribe all triggered MPN subscriptions. This operation removes the involved MPN subscriptions from the list of "active" subscriptions. * - * @general_edition_note MPN is an optional feature, available depending on Edition and License Type. + *

Edition Note: MPN is an optional feature, available depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the Monitoring Dashboard (by default, - * available at /dashboard). + * available at /dashboard).

* - * @lifecycle Multiple unsubscription can be requested at any time. Once done the involved MPN subscriptions immediately exit the "active" state.
- * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event to all involved MPN subscriptions. + *

Lifecycle: Multiple unsubscription can be requested at any time. Once done the involved MPN subscriptions immediately exit the "active" state.
+ * The unsubscription will be notified through an {@link MpnSubscriptionListener#onUnsubscription} event to all involved MPN subscriptions.

* * @param filter A status name to be used to select the MPN subscriptions to unsubscribe. If null all existing MPN subscriptions * are unsubscribed. Possible filter values are: * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the status of the subscription. * @@ -6820,10 +6820,10 @@ export class MpnSubscription { /** * The server-side timestamp of the subscription status. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument status_timestamp on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument status_timestamp on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @return {Number} The server-side timestamp of the subscription status, expressed as a Java time. * @@ -6836,11 +6836,11 @@ export class MpnSubscription { * Any call to this method will override any "Item List" or "Item Group" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String[]} items an array of items to be subscribed to through the server. * @throws IllegalArgumentException if any of the item names in the "Item List" @@ -6856,8 +6856,8 @@ export class MpnSubscription { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * items are always expressed with an "Item Group"", even if originally the MPN subscription used an "Item List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * with an "Item List". + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * with an "Item List".

* @return {String[]} the "Item List" to be subscribed to through the server. * @@ -6870,11 +6870,11 @@ export class MpnSubscription { * Any call to this method will override any "Item List" or "Item Group" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument group on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} groupName A String to be expanded into an item list by the * Metadata Adapter. @@ -6887,8 +6887,8 @@ export class MpnSubscription { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * items are always expressed with an "Item Group"", even if originally the MPN subscription used an "Item List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using an "Item Group" + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using an "Item Group"

* * @return {String} the "Item Group" to be subscribed to through the server. * @@ -6901,11 +6901,11 @@ export class MpnSubscription { * Any call to this method will override any "Field List" or "Field Schema" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String[]} fields an array of fields to be subscribed to through the server. * @throws IllegalArgumentException if any of the field names in the list @@ -6919,8 +6919,8 @@ export class MpnSubscription { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * fields are always expressed with a "Field Schema"", even if originally the MPN subscription used a "Field List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using a "Field List". + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using a "Field List".

* * @return {String[]} the "Field List" to be subscribed to through the server. * @@ -6933,11 +6933,11 @@ export class MpnSubscription { * Any call to this method will override any "Field List" or "Field Schema" * previously specified. * - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument schema on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} schemaName A String to be expanded into a field list by the * Metadata Adapter. @@ -6951,8 +6951,8 @@ export class MpnSubscription { * Note: if the MpnSubscription has been created by the client, such as when obtained through {@link LightstreamerClient#getMpnSubscriptions}, * fields are always expressed with a "Field Schema"", even if originally the MPN subscription used a "Field List". * - * @lifecycle This method can only be called if the MpnSubscription has been initialized - * using a "Field Schema" + *

Lifecycle: This method can only be called if the MpnSubscription has been initialized + * using a "Field Schema"

* * @return {String} the "Field Schema" to be subscribed to through the server. @@ -6972,14 +6972,14 @@ export class MpnSubscription { * items of the set in a single MpnSubscription. Multiple MpnSubscriptions * have to be defined. * - * @default The default Data Adapter for the Adapter Set, - * configured as "DEFAULT" on the Server. + *

Default value: The default Data Adapter for the Adapter Set, + * configured as "DEFAULT" on the Server.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument adapter on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument adapter on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param {String} dataAdapter the name of the Data Adapter. A null value * is equivalent to the "DEFAULT" name. @@ -6993,7 +6993,7 @@ export class MpnSubscription { * Inquiry method that can be used to read the name of the Data Adapter specified for this * MpnSubscription through {@link MpnSubscription#setDataAdapter}. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the name of the Data Adapter; returns null if no name has been configured, * so that the "DEFAULT" Adapter Set is used. @@ -7007,16 +7007,16 @@ export class MpnSubscription { * despite of bandwidth or frequency limits.
* Note that the Server may pose an upper limit on the size of its internal buffers. * - * @default null, meaning to lean on the Server default based on the subscription + *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This means that the buffer size will be 1 for MERGE * subscriptions and "unlimited" for DISTINCT subscriptions. See - * the "General Concepts" document for further details. + * the "General Concepts" document for further details.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument requested_buffer_size on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument requested_buffer_size on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param size An integer number, representing the length of the internal queuing buffers * to be used in the Server. If the string "unlimited" is supplied, then no buffer @@ -7036,7 +7036,7 @@ export class MpnSubscription { * {@link MpnSubscription#setRequestedBufferSize}, to be requested to the Server for * this MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {Number|String} An integer number, representing the buffer size to be requested to the server, * or the string "unlimited", or null. @@ -7049,21 +7049,21 @@ export class MpnSubscription { * server side and this request can only be issued in order to further * reduce the frequency, not to rise it beyond these limits. * - * @general_edition_note A further global frequency limit could also be imposed by the Server, + *

Edition Note: A further global frequency limit could also be imposed by the Server, * depending on Edition and License Type. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard). + * Monitoring Dashboard (by default, available at /dashboard).

* - * @default null, meaning to lean on the Server default based on the subscription + *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This consists, for all modes, in not applying any frequency * limit to the subscription (the same as "unlimited"); see the "General Concepts" - * document for further details. + * document for further details.

* - * @lifecycle This method can only be called while the MpnSubscription - * instance is in its "inactive" state. + *

Lifecycle: This method can only be called while the MpnSubscription + * instance is in its "inactive" state.

* - * @notification A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} - * with argument requested_max_frequency on any {@link MpnSubscriptionListener} listening to the related MpnSubscription. + *

Notification: A change to this setting will be notified through a call to {@link MpnSubscriptionListener#onPropertyChanged} + * with argument requested_max_frequency on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.

* * @param freq A decimal number, representing the maximum update frequency (expressed in updates * per second) for each item in the Subscription; for instance, with a setting @@ -7083,7 +7083,7 @@ export class MpnSubscription { * through {@link MpnSubscription#setRequestedMaxFrequency}, to be requested to the * Server for this MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {Number|String} A decimal number, representing the max frequency to be requested to the server * (expressed in updates per second), or the string "unlimited", or null. @@ -7093,7 +7093,7 @@ export class MpnSubscription { * Inquiry method that can be used to read the mode specified for this * MpnSubscription. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the MpnSubscription mode specified in the constructor. */ @@ -7109,7 +7109,7 @@ export class MpnSubscription { * Two MpnSubscription objects with the same subscription ID always represent the same server-side MPN subscription. It is the client's duty to keep the status * and properties of these objects up to date and aligned. * - * @lifecycle This method can be called at any time. + *

Lifecycle: This method can be called at any time.

* * @return {String} the MPN subscription ID. */ @@ -9358,11 +9358,11 @@ export class Subscription { * requests may be refused if any frequency limit is posed on the server * side for some item. * - *

Edition Note: A further global frequency limit could also + *

Edition Note: A further global frequency limit could also * be imposed by the Server, depending on Edition and License Type; this specific limit also applies to RAW mode * and to unfiltered dispatching. * To know what features are enabled by your license, please see the License tab of the - * Monitoring Dashboard (by default, available at /dashboard).

+ * Monitoring Dashboard (by default, available at /dashboard).

* *

Default value: null, meaning to lean on the Server default based on the subscription * mode. This consists, for all modes, in not applying any frequency