aws-crt
Version:
NodeJS/browser bindings to the aws-c-* libraries
243 lines (202 loc) • 7.79 kB
text/typescript
/*
* Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
* SPDX-License-Identifier: Apache-2.0.
*/
import {ICrtError} from "./error";
/**
* @packageDocumentation
* @module mqtt_request_response
*/
export type RequestPayload = ArrayBuffer;
export type ResponsePayload = ArrayBuffer;
export type StreamingPayload = ArrayBuffer;
/**
* The type of change to the state of a streaming operation subscription
*/
export enum SubscriptionStatusEventType {
/**
* The streaming operation is successfully subscribed to its topic (filter)
*/
SubscriptionEstablished = 0,
/**
* The streaming operation has temporarily lost its subscription to its topic (filter)
*/
SubscriptionLost = 1,
/**
* The streaming operation has entered a terminal state where it has given up trying to subscribe
* to its topic (filter). This is always due to user error (bad topic filter or IoT Core permission policy).
*/
SubscriptionHalted = 2,
}
/**
* An event that describes a change in subscription status for a streaming operation.
*/
export interface SubscriptionStatusEvent {
/**
* The type of status change represented by the event
*/
type: SubscriptionStatusEventType,
/**
* Describes an underlying reason for the event. Only set for SubscriptionLost and SubscriptionHalted.
*/
error?: ICrtError,
}
/**
* An event that describes an incoming message on a streaming operation.
*/
export interface IncomingPublishEvent {
/**
* MQTT Topic that the response was received on.
*/
topic: string
/**
* The payload of the incoming message.
*/
payload: StreamingPayload
}
/**
* Signature for a handler that listens to subscription status events.
*/
export type SubscriptionStatusListener = (eventData: SubscriptionStatusEvent) => void;
/**
* Signature for a handler that listens to incoming publish events.
*/
export type IncomingPublishListener = (eventData: IncomingPublishEvent) => void;
/**
* Encapsulates a response to an AWS IoT Core MQTT-based service request
*/
export interface Response {
/**
* Payload of the response that correlates to a submitted request.
*/
payload: ResponsePayload,
/**
* MQTT Topic that the response was received on. Different topics map to different types within the
* service model, so we need this value in order to know what to deserialize the payload into.
*/
topic: string
}
/**
* A response path is a pair of values - MQTT topic and a JSON path - that describe how a response to
* an MQTT-based request may arrive. For a given request type, there may be multiple response paths and each
* one is associated with a separate JSON schema for the response body.
*/
export interface ResponsePath {
/**
* MQTT topic that a response may arrive on.
*/
topic: string,
/**
* JSON path for finding correlation tokens within payloads that arrive on this path's topic.
*/
correlationTokenJsonPath?: string
}
/**
* Configuration options for an MQTT-based request-response operation.
*/
export interface RequestResponseOperationOptions {
/**
* Set of topic filters that should be subscribed to in order to cover all possible response paths. Sometimes
* using wildcards can cut down on the subscriptions needed; other times that isn't valid.
*/
subscriptionTopicFilters : Array<string>,
/**
* Set of all possible response paths associated with this request type.
*/
responsePaths: Array<ResponsePath>,
/**
* Topic to publish the request to once response subscriptions have been established.
*/
publishTopic: string,
/**
* Payload to publish to 'publishTopic' in order to initiate the request
*/
payload: RequestPayload,
/**
* Correlation token embedded in the request that must be found in a response message. This can be null
* to support certain services which don't use correlation tokens. In that case, the client
* only allows one token-less request at a time.
*/
correlationToken?: string
}
/**
* Configuration options for an MQTT-based streaming operation.
*/
export interface StreamingOperationOptions {
/**
* Topic filter that the streaming operation should listen on
*/
subscriptionTopicFilter: string,
}
/**
* Shared interface for an AWS MQTT service streaming operation. A streaming operation listens to messages on
* a particular topic, deserializes them using a service model, and emits the modeled data as Javascript events.
*/
export interface IStreamingOperation {
/**
* Triggers the streaming operation to start listening to the configured stream of events. It is an error
* to open a streaming operation more than once. You cannot re-open a closed streaming operation.
*/
open() : void;
/**
* Stops a streaming operation from listening to the configured stream of events. It is an error to attempt to
* use the stream for anything further after calling close().
*/
close(): void;
}
/**
* MQTT-based request-response client configuration options
*/
export interface RequestResponseClientOptions {
/**
* Maximum number of subscriptions that the client will concurrently use for request-response operations
*/
maxRequestResponseSubscriptions: number,
/**
* Maximum number of subscriptions that the client will concurrently use for streaming operations
*/
maxStreamingSubscriptions: number,
/**
* Duration, in seconds, that a request-response operation will wait for completion before giving up
*/
operationTimeoutInSeconds?: number,
}
/**
* Shared interface for MQTT-based request-response clients tuned for AWS MQTT services.
*
* Supports streaming operations (listen to a stream of modeled events from an MQTT topic) and request-response
* operations (performs the subscribes, publish, and incoming publish correlation and error checking needed to
* perform simple request-response operations over MQTT).
*/
export interface IRequestResponseClient {
/**
* Shuts down the request-response client. Closing a client will fail all incomplete requests and close all
* outstanding streaming operations.
*
* It is not valid to invoke any further operations on the client after close() has been called.
*/
close(): void;
/**
* Creates a new streaming operation from a set of configuration options. A streaming operation provides a
* mechanism for listening to a specific event stream from an AWS MQTT-based service.
*
* @param streamOptions configuration options for the streaming operation
*
* browser/node implementers are covariant by returning an implementation of IStreamingOperation. This split
* is necessary because event listening (which streaming operations need) cannot be modeled on an interface.
*/
createStream(streamOptions: StreamingOperationOptions) : IStreamingOperation;
/**
* Submits a request to the request-response client.
*
* @param requestOptions description of the request to perform
*
* Returns a promise that resolves to a response to the request or an error describing how the request attempt
* failed.
*
* A "successful" request-response execution flow is defined as "the service sent a response payload that
* correlates with the request payload." Upon deserialization (which is the responsibility of the service model
* client, one layer up), such a payload may actually indicate a failure.
*/
submitRequest(requestOptions: RequestResponseOperationOptions): Promise<Response>;
}