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 * thecoalescing
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.
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.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.
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.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.
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 The collection is available once an MpnDevice registration has been requested, but reflects the actual server's collection only - * after an {@link MpnDeviceListener#onSubscriptionsUpdated} event has been notified. + *Lifecycle: The collection is available once an MpnDevice registration has been requested, but reflects the actual server's collection only + * after an {@link MpnDeviceListener#onSubscriptionsUpdated} event has been notified.
* * @param {String} filter An MPN subscription status name to be used to select the MPN subscriptions to return. If null all existing MPN subscriptions * are returned. Possible filter values are: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).
* * @param {String} subscriptionId The subscription ID to search for. * @return {MpnSubscription} the MpnSubscription with the specified ID, or null if not found. @@ -1341,6 +1341,7 @@ END_NODE_JSDOC_EXCLUDE * Enable WS if disabled. */ LightstreamerClient["__restoreWs"] = WebSocketConnection.restoreClass; + LightstreamerClient["__disableWs"] = WebSocketConnection.disableClass; /* * TEST-ONLY METHOD. diff --git a/source/MpnDevice.js b/source/MpnDevice.js index 26861c9..1e9abf1 100644 --- a/source/MpnDevice.js +++ b/source/MpnDevice.js @@ -112,7 +112,7 @@ export default /*@__PURE__*/(function() { /** * The platform identifier of this MPN device. It equalsGoogle
or Apple
and is used by the server as part of the device identification.
*
- * @lifecycle This method can be called at any time.
+ * Lifecycle: This method can be called at any time.
* * @return {String} the MPN device platform. */ @@ -123,7 +123,7 @@ export default /*@__PURE__*/(function() { /** * The application ID of this MPN device. It is used by the server as part of the device identification. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device application ID. */ @@ -135,7 +135,7 @@ export default /*@__PURE__*/(function() { * The device token of this MPN device. It is passed during creation and * is used by the server as part of the device identification. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device token. */ @@ -148,7 +148,7 @@ export default /*@__PURE__*/(function() { * localStorage during creation and is used by the server to restore MPN subscriptions associated with this previous token. May be null if * no MPN device has been registered yet on the application. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the previous MPN device token, or null if no MPN device has been registered yet. */ @@ -160,7 +160,7 @@ export default /*@__PURE__*/(function() { * Checks whether the MPN device object is currently registered on the server or not.Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MPN device object is currently registered on the server. * @@ -175,7 +175,7 @@ export default /*@__PURE__*/(function() { * An MPN device may be suspended if errors occur during push notification delivery.Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MPN device object is currently suspended on the server. * @@ -195,7 +195,7 @@ export default /*@__PURE__*/(function() { * {@link MpnDevice#isRegistered} and {@link MpnDevice#isSuspended} are both true. *Lifecycle: This method can be called at any time.
* * @return {String} the status of the device. * @@ -209,7 +209,7 @@ export default /*@__PURE__*/(function() { /** * The server-side timestamp of the device status. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {Number} The server-side timestamp of the device status. * @@ -226,7 +226,7 @@ export default /*@__PURE__*/(function() { * Note: a device token change, if the previous device token was correctly stored on localStorage, does not cause the device ID to change: the * server moves previous MPN subscriptions from the previous token to the new one and the device ID remains unaltered. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device ID. */ diff --git a/source/MpnSubscription.js b/source/MpnSubscription.js index a38fcf5..cc8c2d5 100644 --- a/source/MpnSubscription.js +++ b/source/MpnSubscription.js @@ -228,10 +228,10 @@ export default /*@__PURE__*/(function() { * named arguments are always mapped to its corresponding indexed argument, even if originally the notification format used a named argument.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 argumentnotification_format
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 notification_format
on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.
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 argumenttrigger
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 trigger
on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.
Lifecycle: This method can be called at any time.
* * @return {boolean}true if the MpnSubscription is currently "active", false otherwise. * @@ -315,7 +315,7 @@ export default /*@__PURE__*/(function() { * {@link LightstreamerClient#unsubscribeMpn} or {@link LightstreamerClient#unsubscribeMpnSubscriptions} calls, and server sent * unsubscription events. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MpnSubscription has been successfully subscribed on the server, false otherwise. * @@ -334,7 +334,7 @@ export default /*@__PURE__*/(function() { * {@link LightstreamerClient#subscribeMpn} call on a copy of it, deleted with {@link LightstreamerClient#unsubscribeMpn} or * {@link LightstreamerClient#unsubscribeMpnSubscriptions} calls, and server sent subscription events. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MpnSubscription's trigger expression has been evaluated to true at least once, false otherwise. * @@ -360,7 +360,7 @@ export default /*@__PURE__*/(function() { * the trigger expression has been evaluated to true at least once. In this status {@link MpnSubscription#isActive}, {@link MpnSubscription#isSubscribed} and {@link MpnSubscription#isTriggered} are all true. *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 argumentstatus_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.
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 argumentgroup
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.
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 argumentgroup
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.
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 argumentschema
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.
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 argumentschema
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.
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 argumentadapter
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.
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.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 argumentrequested_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.
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 argumentrequested_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.
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
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).
Default value: false.
* @@ -5679,11 +5679,11 @@ export class LightstreamerClient { * Operation method that registers the MPN device on the server's MPN Module.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 * thecoalescing
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.
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.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.
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.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.
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 The collection is available once an MpnDevice registration has been requested, but reflects the actual server's collection only - * after an {@link MpnDeviceListener#onSubscriptionsUpdated} event has been notified. + *Lifecycle: The collection is available once an MpnDevice registration has been requested, but reflects the actual server's collection only + * after an {@link MpnDeviceListener#onSubscriptionsUpdated} event has been notified.
* * @param {String} filter An MPN subscription status name to be used to select the MPN subscriptions to return. If null all existing MPN subscriptions * are returned. Possible filter values are: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).
* * @param {String} subscriptionId The subscription ID to search for. * @return {MpnSubscription} the MpnSubscription with the specified ID, or null if not found. @@ -6397,7 +6397,7 @@ export class MpnDevice { /** * The platform identifier of this MPN device. It equalsGoogle
or Apple
and is used by the server as part of the device identification.
*
- * @lifecycle This method can be called at any time.
+ * Lifecycle: This method can be called at any time.
* * @return {String} the MPN device platform. */ @@ -6405,7 +6405,7 @@ export class MpnDevice { /** * The application ID of this MPN device. It is used by the server as part of the device identification. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device application ID. */ @@ -6414,7 +6414,7 @@ export class MpnDevice { * The device token of this MPN device. It is passed during creation and * is used by the server as part of the device identification. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device token. */ @@ -6424,7 +6424,7 @@ export class MpnDevice { * localStorage during creation and is used by the server to restore MPN subscriptions associated with this previous token. May be null if * no MPN device has been registered yet on the application. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the previous MPN device token, or null if no MPN device has been registered yet. */ @@ -6433,7 +6433,7 @@ export class MpnDevice { * Checks whether the MPN device object is currently registered on the server or not.Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MPN device object is currently registered on the server. * @@ -6445,7 +6445,7 @@ export class MpnDevice { * An MPN device may be suspended if errors occur during push notification delivery.Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MPN device object is currently suspended on the server. * @@ -6462,7 +6462,7 @@ export class MpnDevice { * {@link MpnDevice#isRegistered} and {@link MpnDevice#isSuspended} are both true. *Lifecycle: This method can be called at any time.
* * @return {String} the status of the device. * @@ -6473,7 +6473,7 @@ export class MpnDevice { /** * The server-side timestamp of the device status. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {Number} The server-side timestamp of the device status. * @@ -6487,7 +6487,7 @@ export class MpnDevice { * Note: a device token change, if the previous device token was correctly stored on localStorage, does not cause the device ID to change: the * server moves previous MPN subscriptions from the previous token to the new one and the device ID remains unaltered. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {String} the MPN device ID. */ @@ -6696,10 +6696,10 @@ export class MpnSubscription { * named arguments are always mapped to its corresponding indexed argument, even if originally the notification format used a named argument.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 argumentnotification_format
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 notification_format
on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.
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 argumenttrigger
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 trigger
on any {@link MpnSubscriptionListener} listening to the related MpnSubscription.
Lifecycle: This method can be called at any time.
* * @return {boolean}true if the MpnSubscription is currently "active", false otherwise. * @@ -6769,7 +6769,7 @@ export class MpnSubscription { * {@link LightstreamerClient#unsubscribeMpn} or {@link LightstreamerClient#unsubscribeMpnSubscriptions} calls, and server sent * unsubscription events. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MpnSubscription has been successfully subscribed on the server, false otherwise. * @@ -6785,7 +6785,7 @@ export class MpnSubscription { * {@link LightstreamerClient#subscribeMpn} call on a copy of it, deleted with {@link LightstreamerClient#unsubscribeMpn} or * {@link LightstreamerClient#unsubscribeMpnSubscriptions} calls, and server sent subscription events. * - * @lifecycle This method can be called at any time. + *Lifecycle: This method can be called at any time.
* * @return {boolean} true if the MpnSubscription's trigger expression has been evaluated to true at least once, false otherwise. * @@ -6808,7 +6808,7 @@ export class MpnSubscription { * the trigger expression has been evaluated to true at least once. In this status {@link MpnSubscription#isActive}, {@link MpnSubscription#isSubscribed} and {@link MpnSubscription#isTriggered} are all true. *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 argumentstatus_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.
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 argumentgroup
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.
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 argumentgroup
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.
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 argumentschema
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.
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 argumentschema
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.
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 argumentadapter
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.
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.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 argumentrequested_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.
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 argumentrequested_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.
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).
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