388 lines
14 KiB
TypeScript
388 lines
14 KiB
TypeScript
/**
|
|
* @packageDocumentation
|
|
* @module mqtt5
|
|
*/
|
|
import * as mqtt5_packet from "./mqtt5_packet";
|
|
import { ICrtError } from "./error";
|
|
/**
|
|
* Mqtt behavior settings that are dynamically negotiated as part of the CONNECT/CONNACK exchange.
|
|
*
|
|
* While you can infer all of these values from a combination of
|
|
* 1. defaults as specified in the mqtt5 spec
|
|
* 1. your CONNECT settings
|
|
* 1. the CONNACK from the broker
|
|
*
|
|
* the client instead does the combining for you and emits a NegotiatedSettings object with final, authoritative values.
|
|
*
|
|
* Negotiated settings are communicated with every successful connection establishment.
|
|
*/
|
|
export interface NegotiatedSettings {
|
|
/**
|
|
* The maximum QoS allowed for publishes on this connection instance
|
|
*/
|
|
maximumQos: mqtt5_packet.QoS;
|
|
/**
|
|
* The amount of time in seconds the server will retain the MQTT session after a disconnect.
|
|
*/
|
|
sessionExpiryInterval: number;
|
|
/**
|
|
* The number of in-flight QoS 1 and QoS2 publications the server is willing to process concurrently.
|
|
*/
|
|
receiveMaximumFromServer: number;
|
|
/**
|
|
* The maximum packet size the server is willing to accept.
|
|
*/
|
|
maximumPacketSizeToServer: number;
|
|
/**
|
|
* the maximum allowed topic alias value on publishes sent from client to server
|
|
*/
|
|
topicAliasMaximumToServer: number;
|
|
/**
|
|
* the maximum allowed topic alias value on publishes sent from server to client
|
|
*/
|
|
topicAliasMaximumToClient: number;
|
|
/**
|
|
* The maximum amount of time in seconds between client packets. The client should use PINGREQs to ensure this
|
|
* limit is not breached. The server will disconnect the client for inactivity if no MQTT packet is received
|
|
* in a time interval equal to 1.5 x this value.
|
|
*/
|
|
serverKeepAlive: number;
|
|
/**
|
|
* Whether the server supports retained messages.
|
|
*/
|
|
retainAvailable: boolean;
|
|
/**
|
|
* Whether the server supports wildcard subscriptions.
|
|
*/
|
|
wildcardSubscriptionsAvailable: boolean;
|
|
/**
|
|
* Whether the server supports subscription identifiers
|
|
*/
|
|
subscriptionIdentifiersAvailable: boolean;
|
|
/**
|
|
* Whether the server supports shared subscriptions
|
|
*/
|
|
sharedSubscriptionsAvailable: boolean;
|
|
/**
|
|
* Whether the client has rejoined an existing session.
|
|
*/
|
|
rejoinedSession: boolean;
|
|
/**
|
|
* The final client id in use by the newly-established connection. This will be the configured client id if one
|
|
* was given in the configuration, otherwise, if no client id was specified, this will be the client id assigned
|
|
* by the server. Reconnection attempts will always use the auto-assigned client id, allowing for auto-assigned
|
|
* session resumption.
|
|
*/
|
|
clientId: string;
|
|
}
|
|
/**
|
|
* Controls how the MQTT5 client should behave with respect to MQTT sessions.
|
|
*/
|
|
export declare enum ClientSessionBehavior {
|
|
/** Maps to Clean */
|
|
Default = 0,
|
|
/**
|
|
* Always ask for a clean session when connecting
|
|
*/
|
|
Clean = 1,
|
|
/**
|
|
* Always attempt to rejoin an existing session after an initial connection success.
|
|
*
|
|
* Session rejoin requires an appropriate non-zero session expiry interval in the client's CONNECT options.
|
|
*/
|
|
RejoinPostSuccess = 2,
|
|
/**
|
|
* Always attempt to rejoin an existing session. Since the client does not yet support durable session persistence,
|
|
* this option is not guaranteed to be spec compliant because any unacknowledged qos1 publishes (which are
|
|
* part of the client session state) will not be present on the initial connection. Until we support
|
|
* durable session resumption, this option is technically spec-breaking, but useful.
|
|
*/
|
|
RejoinAlways = 3
|
|
}
|
|
/**
|
|
* Controls how the reconnect delay is modified in order to smooth out the distribution of reconnection attempt
|
|
* timepoints for a large set of reconnecting clients.
|
|
*
|
|
* See [Exponential Backoff and Jitter](https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/)
|
|
*/
|
|
export declare enum RetryJitterType {
|
|
/**
|
|
* Maps to Full
|
|
*/
|
|
Default = 0,
|
|
/**
|
|
* Do not perform any randomization on the reconnect delay:
|
|
* ```NextReconnectDelay = CurrentExponentialBackoffValue```
|
|
*/
|
|
None = 1,
|
|
/**
|
|
* Fully random between no delay and the current exponential backoff value.
|
|
* ```NextReconnectDelay = Random(0, CurrentExponentialBackoffValue)```
|
|
*/
|
|
Full = 2,
|
|
/**
|
|
* ```NextReconnectDelay = Min(MaxReconnectDelay, Random(MinReconnectDelay, 3 * CurrentReconnectDelay)```
|
|
*/
|
|
Decorrelated = 3
|
|
}
|
|
/**
|
|
* An enumeration that controls how the client applies topic aliasing to outbound publish packets.
|
|
*
|
|
* Topic alias behavior is described in https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901113
|
|
*/
|
|
export declare enum OutboundTopicAliasBehaviorType {
|
|
/**
|
|
* Maps to Disabled. This keeps the client from being broken (by default) if the broker
|
|
* topic aliasing implementation has a problem.
|
|
*/
|
|
Default = 0,
|
|
/**
|
|
* Outbound aliasing is the user's responsibility. Client will cache and use
|
|
* previously-established aliases if they fall within the negotiated limits of the connection.
|
|
*
|
|
* The user must still always submit a full topic in their publishes because disconnections disrupt
|
|
* topic alias mappings unpredictably. The client will properly use a requested alias when the most-recently-seen
|
|
* binding for a topic alias value matches the alias and topic in the publish packet.
|
|
*/
|
|
Manual = 1,
|
|
/**
|
|
* (Recommended) The client will use an LRU cache to drive alias usage.
|
|
*
|
|
* Manually setting a topic alias will be ignored (the LRU cache is authoritative)
|
|
*/
|
|
LRU = 2,
|
|
/**
|
|
* Completely disable outbound topic aliasing.
|
|
*/
|
|
Disabled = 3
|
|
}
|
|
/**
|
|
* An enumeration that controls whether or not the client allows the broker to send publishes that use topic
|
|
* aliasing.
|
|
*
|
|
* Topic alias behavior is described in https://docs.oasis-open.org/mqtt/mqtt/v5.0/os/mqtt-v5.0-os.html#_Toc3901113
|
|
*/
|
|
export declare enum InboundTopicAliasBehaviorType {
|
|
/**
|
|
* Maps to Disabled. This keeps the client from being broken (by default) if the broker
|
|
* topic aliasing implementation has a problem.
|
|
*/
|
|
Default = 0,
|
|
/**
|
|
* Allow the server to send PUBLISH packets to the client that use topic aliasing
|
|
*/
|
|
Enabled = 1,
|
|
/**
|
|
* Forbid the server from sending PUBLISH packets to the client that use topic aliasing
|
|
*/
|
|
Disabled = 2
|
|
}
|
|
/**
|
|
* Configuration for all client topic aliasing behavior.
|
|
*/
|
|
export interface TopicAliasingOptions {
|
|
/**
|
|
* Controls what kind of outbound topic aliasing behavior the client should attempt to use.
|
|
*
|
|
* If topic aliasing is not supported by the server, this setting has no effect and any attempts to directly
|
|
* manipulate the topic alias id in outbound publishes will be ignored.
|
|
*
|
|
* If left undefined, then outbound topic aliasing is disabled.
|
|
*/
|
|
outboundBehavior?: OutboundTopicAliasBehaviorType;
|
|
/**
|
|
* If outbound topic aliasing is set to LRU, this controls the maximum size of the cache. If outbound topic
|
|
* aliasing is set to LRU and this is zero or undefined, a sensible default is used (25). If outbound topic
|
|
* aliasing is not set to LRU, then this setting has no effect.
|
|
*
|
|
* The final size of the cache is determined by the minimum of this setting and the value of the
|
|
* topic_alias_maximum property of the received CONNACK. If the received CONNACK does not have an explicit
|
|
* positive value for that field, outbound topic aliasing is disabled for the duration of that connection.
|
|
*/
|
|
outboundCacheMaxSize?: number;
|
|
/**
|
|
* Controls whether or not the client allows the broker to use topic aliasing when sending publishes. Even if
|
|
* inbound topic aliasing is enabled, it is up to the server to choose whether or not to use it.
|
|
*
|
|
* If left undefined, then inbound topic aliasing is disabled.
|
|
*
|
|
* This field has no effect in the browser implementation.
|
|
*/
|
|
inboundBehavior?: InboundTopicAliasBehaviorType;
|
|
/**
|
|
* If inbound topic aliasing is enabled, this will control the size of the inbound alias cache. If inbound
|
|
* aliases are enabled and this is zero or undefined, then a sensible default will be used (25). If inbound
|
|
* aliases are disabled, this setting has no effect.
|
|
*
|
|
* Behaviorally, this value overrides anything present in the topic_alias_maximum field of
|
|
* the CONNECT packet options.
|
|
*
|
|
* This field has no effect in the browser implementation.
|
|
*/
|
|
inboundCacheMaxSize?: number;
|
|
}
|
|
/**
|
|
* Payload of the Stopped event for the MQTT5 client.
|
|
*/
|
|
export interface StoppedEvent {
|
|
}
|
|
/**
|
|
* Payload of the AttemptingConnect event for the MQTT5 client.
|
|
*/
|
|
export interface AttemptingConnectEvent {
|
|
}
|
|
/**
|
|
* Payload of the ConnectionSuccess event for the MQTT5 client.
|
|
*/
|
|
export interface ConnectionSuccessEvent {
|
|
/**
|
|
* CONNACK packet received from the server.
|
|
*/
|
|
connack: mqtt5_packet.ConnackPacket;
|
|
/**
|
|
* Final MQTT5 connection settings negotiated with the server.
|
|
*/
|
|
settings: NegotiatedSettings;
|
|
}
|
|
/**
|
|
* Payload of the ConnectionFailure event for the MQTT5 client.
|
|
*/
|
|
export interface ConnectionFailureEvent {
|
|
/**
|
|
* Description of why the connection attempt failed.
|
|
*/
|
|
error: ICrtError;
|
|
/**
|
|
* If the connection failure was indicated by the server's CONNACK response, the CONNACK packet received from
|
|
* the server.
|
|
*/
|
|
connack?: mqtt5_packet.ConnackPacket;
|
|
}
|
|
/**
|
|
* Payload of the Disconnection event for the MQTT5 client.
|
|
*/
|
|
export interface DisconnectionEvent {
|
|
/**
|
|
* Best-guess description of why the disconnection occurred.
|
|
*/
|
|
error: ICrtError;
|
|
/**
|
|
* If the disconnection event was due to a server-side DISCONNECT packet, the DISCONNECT packet received from
|
|
* the server.
|
|
*/
|
|
disconnect?: mqtt5_packet.DisconnectPacket;
|
|
}
|
|
/**
|
|
* Payload of the MessageReceived event for the MQTT5 client.
|
|
*/
|
|
export interface MessageReceivedEvent {
|
|
/**
|
|
* PUBLISH packet received from the server
|
|
*/
|
|
message: mqtt5_packet.PublishPacket;
|
|
}
|
|
/**
|
|
* Client Error event listener signature
|
|
*/
|
|
export type ErrorEventListener = (error: ICrtError) => void;
|
|
/**
|
|
* Client Stopped lifecycle event listener signature
|
|
*/
|
|
export type StoppedEventListener = (eventData: StoppedEvent) => void;
|
|
/**
|
|
* Client AttemptingConnect lifecycle event listener signature
|
|
*/
|
|
export type AttemptingConnectEventListener = (eventData: AttemptingConnectEvent) => void;
|
|
/**
|
|
* Client ConnectionSuccess lifecycle event listener signature
|
|
*/
|
|
export type ConnectionSuccessEventListener = (eventData: ConnectionSuccessEvent) => void;
|
|
/**
|
|
* Client ConnectionFailure lifecycle event listener signature
|
|
*/
|
|
export type ConnectionFailureEventListener = (eventData: ConnectionFailureEvent) => void;
|
|
/**
|
|
* Client Disconnection lifecycle event listener signature
|
|
*/
|
|
export type DisconnectionEventListener = (eventData: DisconnectionEvent) => void;
|
|
/**
|
|
* Message received event listener signature
|
|
*/
|
|
export type MessageReceivedEventListener = (eventData: MessageReceivedEvent) => void;
|
|
/**
|
|
* Polymorphic success result for publish actions:
|
|
*
|
|
* * QoS 0 - resolves to undefined
|
|
* * QoS 1 - resolves to a {@link PubackPacket}
|
|
* * QoS 2 - (not yet supported) would resolve to a Pubcomp or a Pubrec
|
|
*/
|
|
export type PublishCompletionResult = mqtt5_packet.PubackPacket | undefined;
|
|
/**
|
|
* Shared MQTT5 client interface across browser and node.
|
|
*
|
|
* Common event manipulation patterns have explicit functions separate from the EventListener interface because
|
|
* creating an abstract event listening interface in typescript eludes me.
|
|
*/
|
|
export interface IMqtt5Client {
|
|
/**
|
|
* Triggers cleanup of native resources associated with the MQTT5 client. Once this has been invoked, callbacks
|
|
* and events are not guaranteed to be received.
|
|
*
|
|
* On the browser, the implementation is an empty function.
|
|
*
|
|
* On Node, this must be called when finished with a client; otherwise, native resources will leak. It is not safe
|
|
* to invoke any further operations on the client after close() has been called.
|
|
*
|
|
* For a running client, safe and proper shutdown can be accomplished by
|
|
*
|
|
* ```ts
|
|
* const stopped = once(client, "stopped");
|
|
* client.stop();
|
|
* await stopped;
|
|
* client.close();
|
|
* ```
|
|
*
|
|
* This is an asynchronous operation.
|
|
*/
|
|
close(): void;
|
|
/**
|
|
* Notifies the MQTT5 client that you want it to maintain connectivity to the configured endpoint.
|
|
* The client will attempt to stay connected using the properties of the reconnect-related parameters
|
|
* in the mqtt5 client configuration.
|
|
*
|
|
* This is an asynchronous operation.
|
|
*/
|
|
start(): void;
|
|
/**
|
|
* Notifies the MQTT5 client that you want it to end connectivity to the configured endpoint, disconnecting any
|
|
* existing connection and halting reconnection attempts.
|
|
*
|
|
* This is an asynchronous operation. Once the process completes, no further events will be emitted until the client
|
|
* has {@link start} invoked.
|
|
*
|
|
* @param packet (optional) properties of a DISCONNECT packet to send as part of the shutdown process
|
|
*/
|
|
stop(packet?: mqtt5_packet.DisconnectPacket): void;
|
|
/**
|
|
* Subscribe to one or more topic filters by queuing a SUBSCRIBE packet to be sent to the server.
|
|
*
|
|
* @param packet SUBSCRIBE packet to send to the server
|
|
* @returns a promise that will be rejected with an error or resolved with the SUBACK response
|
|
*/
|
|
subscribe(packet: mqtt5_packet.SubscribePacket): Promise<mqtt5_packet.SubackPacket>;
|
|
/**
|
|
* Unsubscribe from one or more topic filters by queuing an UNSUBSCRIBE packet to be sent to the server.
|
|
*
|
|
* @param packet UNSUBSCRIBE packet to send to the server
|
|
* @returns a promise that will be rejected with an error or resolved with the UNSUBACK response
|
|
*/
|
|
unsubscribe(packet: mqtt5_packet.UnsubscribePacket): Promise<mqtt5_packet.UnsubackPacket>;
|
|
/**
|
|
* Send a message to subscribing clients by queuing a PUBLISH packet to be sent to the server.
|
|
*
|
|
* @param packet PUBLISH packet to send to the server
|
|
* @returns a promise that will be rejected with an error or resolved with the PUBACK response
|
|
*/
|
|
publish(packet: mqtt5_packet.PublishPacket): Promise<PublishCompletionResult>;
|
|
}
|