import type PopupTemplate from "../PopupTemplate.js";
import type Extent from "../geometry/Extent.js";
import type SpatialReference from "../geometry/SpatialReference.js";
import type Layer from "./Layer.js";
import type Field from "./support/Field.js";
import type FieldsIndex from "./support/FieldsIndex.js";
import type LabelClass from "./support/LabelClass.js";
import type PurgeOptions from "./support/PurgeOptions.js";
import type StreamConnection from "./support/StreamConnection.js";
import type PortalItem from "../portal/PortalItem.js";
import type ElevationInfo from "../symbols/support/ElevationInfo.js";
import type { ClonableMixin } from "../core/Clonable.js";
import type { MultiOriginJSONSupportMixin } from "../core/MultiOriginJSONSupport.js";
import type { FieldDomainOptions, LayerSaveAsOptions, LayerSaveOptions } from "./types.js";
import type { BlendLayer, BlendLayerProperties } from "./mixins/BlendLayer.js";
import type { CustomParametersMixin, CustomParametersMixinProperties } from "./mixins/CustomParametersMixin.js";
import type { DisplayFilteredLayer, DisplayFilteredLayerProperties } from "./mixins/DisplayFilteredLayer.js";
import type { FeatureEffectLayer, FeatureEffectLayerProperties } from "./mixins/FeatureEffectLayer.js";
import type { FeatureReductionLayer, FeatureReductionLayerProperties } from "./mixins/FeatureReductionLayer.js";
import type { OperationalLayer, OperationalLayerProperties } from "./mixins/OperationalLayer.js";
import type { PortalLayer, PortalLayerProperties } from "./mixins/PortalLayer.js";
import type { RefreshableLayer, RefreshableLayerProperties } from "./mixins/RefreshableLayer.js";
import type { ScaleRangeLayer, ScaleRangeLayerProperties } from "./mixins/ScaleRangeLayer.js";
import type { TemporalLayer, TemporalLayerProperties } from "./mixins/TemporalLayer.js";
import type { TrackableLayer, TrackableLayerProperties } from "./mixins/TrackableLayer.js";
import type { Message } from "./support/StreamConnection.js";
import type { DomainUnion } from "./support/types.js";
import type { PortalItemProperties } from "../portal/PortalItem.js";
import type { RendererUnion } from "../renderers/types.js";
import type { CreatePopupTemplateOptions } from "../support/popupUtils.js";
import type { ElevationInfoProperties } from "../symbols/support/ElevationInfo.js";
import type { FieldProperties } from "./support/Field.js";
import type { ExtentProperties } from "../geometry/Extent.js";
import type { LabelClassProperties } from "./support/LabelClass.js";
import type { PopupTemplateProperties } from "../PopupTemplate.js";
import type { PurgeOptionsProperties } from "./support/PurgeOptions.js";
import type { HeatmapRendererProperties } from "../renderers/HeatmapRenderer.js";
import type { PieChartRendererProperties } from "../renderers/PieChartRenderer.js";
import type { DictionaryRendererProperties } from "../renderers/DictionaryRenderer.js";
import type { DotDensityRendererProperties } from "../renderers/DotDensityRenderer.js";
import type { UniqueValueRendererProperties } from "../renderers/UniqueValueRenderer.js";
import type { ClassBreaksRendererProperties } from "../renderers/ClassBreaksRenderer.js";
import type { SimpleRendererProperties } from "../renderers/SimpleRenderer.js";
import type { SpatialReferenceProperties } from "../geometry/SpatialReference.js";
import type { LayerProperties } from "./Layer.js";

export interface StreamLayerProperties extends LayerProperties, CustomParametersMixinProperties, PortalLayerProperties, OperationalLayerProperties, RefreshableLayerProperties, ScaleRangeLayerProperties, TrackableLayerProperties, TemporalLayerProperties, BlendLayerProperties, FeatureEffectLayerProperties, FeatureReductionLayerProperties, DisplayFilteredLayerProperties, Partial<Pick<StreamLayer, "copyright" | "definitionExpression" | "displayField" | "geometryType" | "labelsVisible" | "legendEnabled" | "maxReconnectionAttempts" | "maxReconnectionInterval" | "objectIdField" | "popupEnabled" | "screenSizePerspectiveEnabled" | "sourceJSON" | "updateInterval" | "url" | "webSocketUrl">> {
  /**
   * Specifies how features are placed on the vertical axis (z). This property may only be used
   * in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). See the [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/)
   * for an example of how this property may be used.
   *
   * > [!WARNING]
   * >
   * > If the elevation info is not specified, the effective elevation depends on the context and could vary per graphic.
   */
  elevationInfo?: ElevationInfoProperties | null;
  /**
   * An array of fields in the layer.
   * Certain characters are not supported in field names. See [field naming guidelines](https://support.esri.com/en-us/knowledge-base/what-characters-should-not-be-used-in-arcgis-for-field--000005588)
   * for details.
   *
   * @since 4.15
   * @example
   * // define each field's schema
   * let fields = [
   *  new Field({
   *    "name": "ObjectID",
   *    "alias": "ObjectID",
   *    "type": "oid"
   *  }), new Field({
   *    "name": "description",
   *    "alias": "Description",
   *    "type": "string"
   *  }), new Field ({
   *    "name": "title",
   *    "alias": "Title",
   *    "type": "string"
   *  })
   * ];
   */
  fields?: FieldProperties[];
  /**
   * An [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) object used to filter features. Only features that intersect the
   * extent object are displayed in the view. For example, the `geometryDefinition` can be set to a city boundary extent
   * to display features only intersect this extent.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > To filter client-side stream layers or stream layers pointing to custom web sockets, use the [StreamLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#filter) or
   * > [StreamLayerView.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#featureEffect) property.
   * > The [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#definitionExpression) and [geometryDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryDefinition) properties are only meant to be used with stream layers
   * > that point to geoevent or velocity steam services.
   *
   * @example
   * // Get the current extent of the map view and expand the extent by factor of 0.9
   * // Then apply this extent to stream layer's geometryDefinition.
   * // Only features that intersect this extent will be displayed on the view.
   * let extent = mapView.extent.clone().expand(0.9);
   * streamLayer.geometryDefinition = extent;
   */
  geometryDefinition?: ExtentProperties | null;
  /**
   * The label definition for this layer, specified as an array of
   * [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/). Use this property to specify
   * labeling properties for the layer such as label expression, placement, and size.
   *
   * Multiple Label classes with different `where` clauses can be used to define several
   * labels with varying styles on the same feature. Likewise, multiple label classes
   * may be used to label different types of features (for example blue labels
   * for boats and green labels for trucks).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > 3D [SceneViews](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) only support displaying one [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/) per feature.
   *
   * @see [Sample: Flat vs. volumetric 3D symbol layers](https://developers.arcgis.com/javascript/latest/sample-code/symbols-points-3d/)
   * @see [Sample: Add multiple label classes to a layer](https://developers.arcgis.com/javascript/latest/sample-code/labels-multiple-classes/)
   * @see [Sample: Multi-line labels](https://developers.arcgis.com/javascript/latest/sample-code/labels-multiline/)
   * @example
   * const boatLabelClass = new LabelClass({
   *   labelExpressionInfo: { expression: "$feature.NAME" },
   *   symbol: {
   *     type: "label-3d",  // autocasts as new LabelSymbol3D()
   *     symbolLayers: [{
   *       type: "text",  // autocasts as new TextSymbol3DLayer()
   *       material: { color: [ 49,163,84 ] },
   *       size: 12  // points
   *     }]
   *   }
   * });
   *
   * streamLayer.labelingInfo = [ boatLabelClass ];
   */
  labelingInfo?: LabelClassProperties[] | null;
  /**
   * The popup template for the layer. When set on the layer, the `popupTemplate`
   * allows users to access attributes and display their values in the
   * view's Popup when a feature is selected
   * using text and/or charts. See the [PopupTemplate sample](https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/)
   * for an example of how [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) interacts with a
   * [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/).
   *
   * A default popup template is automatically used if no `popupTemplate` has been defined when
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled)
   * is set to `true`.
   *
   * @see [createPopupTemplate()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createPopupTemplate)
   * @see [SceneView.popup](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#popup)
   * @see [View2D.popup](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#popup)
   */
  popupTemplate?: PopupTemplateProperties | null;
  /**
   * Options for purging stale features. The purge options controls how much data is removed from
   * [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/) and how often.
   * Choosing the right purge rule for your stream layer is critical for maximizing functionality and performance.
   * Cannot be changed after the layer has been loaded.
   *
   * @example
   * // show last 5 known locations of per flight
   * // but only show 100,000 locations overall
   * streamLayer = new StreamLayer({
   *   url: url,
   *   purgeOptions: {
   *     displayCount: 100000,
   *     maxObservations: 5
   *   }
   * });
   */
  purgeOptions?: PurgeOptionsProperties;
  /**
   * The renderer assigned to the layer. The renderer defines how to
   * visualize each feature in the layer. Depending on the renderer type,
   * features may be visualized with the same symbol, or with varying symbols
   * based on the values of provided attribute fields or functions. If not specified,
   * a default renderer will be generated based on the geometry type.
   *
   * @see [Styles and data visualization](https://developers.arcgis.com/javascript/latest/visualization/)
   */
  renderer?: (((SimpleRendererProperties & { type: "simple" }) | (ClassBreaksRendererProperties & { type: "class-breaks" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (DotDensityRendererProperties & { type: "dot-density" }) | (DictionaryRendererProperties & { type: "dictionary" }) | (PieChartRendererProperties & { type: "pie-chart" })) | (HeatmapRendererProperties & { type: "heatmap" })) | null;
  /**
   * The spatial reference of the layer. When creating the layer from a
   * [url](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#url), the spatial reference is read from the service.
   *
   * When creating a StreamLayer from client-side features, this property is
   * inferred from the geometries of the features provided in the [sendMessageToClient()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#sendMessageToClient)
   * method.
   */
  spatialReference?: SpatialReferenceProperties;
}

/**
 * * [Overview](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#overview)
 * * [Creating a StreamLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#creating-a-streamlayer)
 * * [Track-aware StreamLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#track-aware)
 * * [The purge rules](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#purge-rules)
 * * [Additional information](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#additional-info)
 *
 * <span id="overview"></span>
 * ### Overview
 *
 * StreamLayer connects to a [stream service](https://enterprise.arcgis.com/en/geoevent) or
 * a [custom WebSocket service](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#streamlayer-from-websocket),
 * displaying the observation streams associated with a set of [tracked objects](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#track-aware)
 * in real-time. Observations can include changes to location, attributes, or both. Stream layers can contain point, polyline, or polygon features.
 *
 * When a stream layer is added to a map, users are able to see real-time updates pushed out by the server.
 * Unlike [feature layers](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/) where you make explicit calls to the service to get updates,
 * stream layers actively listen to the stream of data broadcast by the stream service. Stream layers update their display accordingly,
 * refreshing dynamically in response to this broadcast of data. This means that you cannot work with or view any features that were
 * streamed prior to the beginning of your subscription.
 *
 * <span id="creating-a-streamlayer"></span>
 * ### Creating a StreamLayer
 *
 * StreamLayers may be created in one of three ways: from a [service URL](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#url), a stand alone web socket by setting
 * [webSocketUrl](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#webSocketUrl), or from client-side features.
 *
 * #### Reference a service URL
 *
 * StreamLayer can consume a [stream service](https://enterprise.arcgis.com/en/server/latest/publish-services/windows/stream-services.htm) published by
 * [The ArcGIS GeoEvent Extension for Server](https://enterprise.arcgis.com/en/geoevent/latest/get-started/what-is-arcgis-geoevent-server.htm).
 * To create a StreamLayer instance from a service, you must set the [url](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#url) property of the layer to point to
 * the REST endpoint of a stream service. For a layer to be visible in a view, it must be added to the [Map](https://developers.arcgis.com/javascript/latest/references/core/Map/)
 * referenced by the view. See [Map.add()](https://developers.arcgis.com/javascript/latest/references/core/Map/#add) for information about adding layers to a map.
 *
 * ```js
 * // Construct Stream Layer
 * streamLayer = new StreamLayer({
 *   url: "https://geoeventsample1.esri.com:6443/arcgis/rest/services/LABus/StreamServer",
 *   purgeOptions: {
 *     displayCount: 10000
 *   },
 *   maxReconnectionAttempts: 100,
 *   maxReconnectionInterval: 10,
 *   renderer: renderer
 * }
 * map.add(streamLayer);
 * ```
 *
 * #### Reference a custom stream service
 * <span id="streamlayer-from-websocket"></span>
 *
 * StreamLayer can consume a custom stream service by setting its [webSocketUrl](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#webSocketUrl) property to point to the websocket of a custom service.
 * Since the StreamLayer requires a schema, several properties need to be set when creating a layer from a custom stream service.
 * The geometry type of the features must be set using the [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryType) property since only one geometry type is allowed per layer.
 * An [objectId field](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#objectIdField) and [TimeInfo.trackIdField](https://developers.arcgis.com/javascript/latest/references/core/layers/support/TimeInfo/#trackIdField) must be set along with an
 * array of [field](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#fields) objects, providing the schema of each field. The [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#spatialReference) of the custom stream service must
 * match the view's [View.spatialReference](https://developers.arcgis.com/javascript/latest/references/core/views/View/#spatialReference).  Check out [this repo](https://github.com/mmgeorge/node-stream-service)
 * for more information on how to create custom stream services.
 *
 * Starting at version 4.26, you can use the [sendMessageToSocket()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#sendMessageToSocket) method to send messages to the server over the web socket.
 *
 * ```js
 * const layer = new StreamLayer({
 *   popupTemplate: {
 *     content: "OBJECTID={OBJECTID}, TRACKID={TRACKID}",
 *   },
 *   webSocketUrl: "ws://localhost:8000",
 *   fields: [
 *     {
 *       name: "OBJECTID",
 *       alias: "ObjectId",
 *       type: "oid",
 *     },
 *     {
 *       name: "TRACKID",
 *       alias: "TrackId",
 *       type: "long",
 *     }
 *   ],
 *   timeInfo: {
 *     trackIdField: "TRACKID"
 *   },
 *   geometryType: "point"
 *   maxReconnectionAttempts: 100,
 *   maxReconnectionInterval: 10,
 *   renderer: renderer
 * });
 * map.add(layer);
 * ```
 *
 * #### Add an array of client-side features
 * <span id="clientside-streamlayer"></span>
 *
 * Starting at version 4.26, client-side features may also be used to create a StreamLayer. Since the StreamLayer requires a schema, several
 * properties need to be set when creating a layer purely on the client-side.
 *
 * The following are the properties must be set when creating a client-side StreamLayer.
 * If any of the required parameters are missing at the time of the layer loading, the API will throw an error.
 *
 * * The geometry type of the features must be indicated (since only one geometry type is allowed per layer) using
 * the [geometryType](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryType) property.
 * * StreamLayer requires an [objectId field](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#objectIdField). This must be indicated along with an
 * array of [field](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#fields) objects, providing the schema of each field. Each field schema in the fields array should match the feature attributes
 * being added to the layer to ensure data accuracy.
 * * The StreamLayer also requires the [TimeInfo.trackIdField](https://developers.arcgis.com/javascript/latest/references/core/layers/support/TimeInfo/#trackIdField)
 * to be set in the layer's [timeInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#timeInfo) property and the field must exist in the fields array.
 *
 * Geometries of features added to the StreamLayer must be in the spatial reference of the view, because the layer's [spatialReference](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#spatialReference)
 * is always set to the spatial reference of the view. To avoid overhead, the stream layer does not do any additional processing or reprojecting on features
 * as they arrive.
 *
 * To filter client-side stream layers, use the [StreamLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#filter) or
 * [StreamLayerView.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#featureEffect) property.
 * The [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#definitionExpression) and [geometryDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryDefinition) properties are only meant to be used with stream layers
 * that point to geoevent or velocity steam services.
 *
 * The following code snippet shows how to initialize a client-side StreamLayer.
 *
 * ```js
 * // create a client-side streamlayer by setting its required properties
 * // and additional desired properties. Do not set url or websocketUrl.
 * const layer = new StreamLayer({
 *   objectIdField: "OBJECTID",
 *   fields: [
 *     {
 *       name: "OBJECTID", // required
 *       alias: "ObjectId",
 *       type: "oid",
 *     },
 *     {
 *       name: "TRACKID",
 *       alias: "TrackId",
 *       type: "long",
 *     },
 *     {
 *       name: "STATUS",
 *       alias: "STATUS",
 *       type: "string",
 *     }
 *   ],
 *   timeInfo: {
 *     trackIdField: "TRACKID" // required
 *   },
 *   geometryType: "point", // required
 *   updateInterval: 100,
 *   popupTemplate: {
 *     title: "{status}",
 *     content: "{TRACKID}, {this}"
 *   },
 *   renderer: {
 *     type: "simple",
 *     symbol: {
 *       type: "simple-marker",
 *       size: "10px",
 *       color: [255, 0, 0, .4],
 *     }
 *   }
 * });
 * ```
 *
 * To start streaming features to a client-side StreamLayer, call the [sendMessageToClient()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#sendMessageToClient) method with `features` message.
 * The `sendMessageToClient` method sends client-side only messages to the StreamLayer. The following code snippet demonstrates how to start streaming
 * features to the client-side stream layer.
 *
 * ```js
 * // call the sendMessageToClient method every 100 milliseconds with
 * // "features" message to keep moving positions of features.
 * setInterval(() => {
 *   lastY += 500;
 *
 *   // send "features" message to the client to update
 *   // positions of features on the map.
 *   layer.sendMessageToClient({
 *     type: "features",
 *     features: [
 *       {
 *         attributes: {
 *           TRACKID: 1,
 *           OBJECTID: objectIdCounter++,
 *           STATUS: "red"
 *         },
 *         geometry: {
 *           x: lastX,
 *           y: lastY,
 *         }
 *       },
 *       {
 *         attributes: {
 *           TRACKID: 2,
 *           OBJECTID: objectIdCounter++,
 *           STATUS: "green"
 *         },
 *         geometry: {
 *           x: lastX + 100000,
 *           y: lastY + 100000,
 *         }
 *       },
 *        {
 *         attributes: {
 *           TRACKID: 3,
 *           OBJECTID: objectIdCounter++,
 *           STATUS: "blue"
 *         },
 *         geometry: {
 *           x: lastX - 100000,
 *           y: lastY - 100000,
 *         }
 *       }
 *     ]
 *   })
 * }, 100);
 * ```
 *
 * <span id="track-aware"></span>
 * ### Track-aware StreamLayer
 *
 * A track-aware stream layer is one where the streaming features that correspond to a single object in the real world are linked together by a common attribute
 * called a [trackId field](https://developers.arcgis.com/javascript/latest/references/core/layers/support/TimeInfo/#trackIdField). For example, a stream layer representing airplanes may use a `trackId` field
 * to group together all observations of a single plane to distinguish them from the observations of a nearby plane. When a stream layer is track aware, you specify
 * the [expiration of objects](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#purgeOptions) by track rather than by the total number of observations in the view.
 *
 * <span id="purge-rules"></span>
 * ### Purge rules
 *
 * The number of features coming from a real-time feed can overload the browser and make the browser unresponsive.
 * To limit the amount of memory consumed, real-time data must occasionally be removed, or purged from the memory.
 * Use the [purgeOptions](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#purgeOptions) in the layer constructor to define rules that specify how to remove data
 * when new messages are received and the layer is refreshed. Choosing the right purge rule for your stream layer is critical
 * for maximizing functionality and performance.
 *
 * <span id="additional-info"></span>
 * ###  Additional information
 *
 * The API down throttles the update rate on the client when a stream service pushes updates faster than the client can handle.
 * This will prevent fast updating stream services from overloading the browser. You can listen to the
 * [StreamLayerView.@update-rate](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#event-update-rate) event on the
 * [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/) to check the websocket and client update rates.
 *
 * The [maxReconnectionAttempts](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#maxReconnectionAttempts) and [maxReconnectionInterval](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#maxReconnectionInterval)
 * properties can be used to specify how many times you attempt to reconnect and how long to wait between attempts when the layer
 * loses its connection to the stream service.
 *
 * @since 4.0
 * @see [Sample - Add StreamLayer to your Map](https://developers.arcgis.com/javascript/latest/sample-code/layers-streamlayer/)
 * @see [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/)
 */
export default class StreamLayer extends StreamLayerSuperclass {
  /**
   * @example
   * let streamLayer = new StreamLayer({
   *   url: "https://geoeventsample3.esri.com:6080/arcgis/rest/services/SeattleBus/StreamServer",
   *   purgeOptions: {
   *     displayCount: 1000
   *   }
   * });
   */
  constructor(properties?: StreamLayerProperties);
  /**
   * Copyright information for the layer.
   *
   * @since 4.15
   */
  accessor copyright: string | null | undefined;
  /**
   * The SQL where clause used to filter features based on their attributes. Only the features that satisfy the definition
   * expression are displayed in the [View](https://developers.arcgis.com/javascript/latest/references/core/views/View/). Setting a definition expression is useful
   * when the dataset is large and you don't want to bring all features to the client for analysis.
   * Definition expressions may be set when a layer is constructed prior to it loading in the view or
   * after it has been added to the map. If the definition expression is set after the layer has been added to the map,
   * the view will automatically refresh itself to display the features that satisfy the new definition expression.
   *
   * > **Notes**
   * >
   * > To filter client-side stream layers or stream layers pointing to custom web sockets, use the [StreamLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#filter) or
   * > [StreamLayerView.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#featureEffect) property.
   * > The [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#definitionExpression) and [geometryDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryDefinition) properties are only meant to be used with stream layers
   * > that point to geoevent or velocity steam services.
   *
   * @example
   * // Set a definition expression in a constructor to only display features that
   * // "region = 'central'". Also only keep the latest 10 features per track id.
   * const streamLayer = new StreamLayer({
   *   url: svcUrl,
   *   definitionExpression: "region = 'central'",
   *   purgeOptions: {
   *     displayCount: 10000,
   *     maxObservations: 10
   *   }
   * });
   * @example
   * // Set the definition expression directly on layer instance to
   * // only display buses going on route 70.
   * streamLayer.definitionExpression = "route_id = '70'";
   */
  accessor definitionExpression: string | null | undefined;
  /**
   * The name of the layer's primary display field.
   * The value of this property matches the name of one of the fields of the layer.
   *
   * @since 4.15
   */
  accessor displayField: string | null | undefined;
  /**
   * Specifies how features are placed on the vertical axis (z). This property may only be used
   * in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/). See the [ElevationInfo sample](https://developers.arcgis.com/javascript/latest/sample-code/scene-elevationinfo/)
   * for an example of how this property may be used.
   *
   * > [!WARNING]
   * >
   * > If the elevation info is not specified, the effective elevation depends on the context and could vary per graphic.
   */
  get elevationInfo(): ElevationInfo | null | undefined;
  set elevationInfo(value: ElevationInfoProperties | null | undefined);
  /**
   * An array of fields in the layer.
   * Certain characters are not supported in field names. See [field naming guidelines](https://support.esri.com/en-us/knowledge-base/what-characters-should-not-be-used-in-arcgis-for-field--000005588)
   * for details.
   *
   * @since 4.15
   * @example
   * // define each field's schema
   * let fields = [
   *  new Field({
   *    "name": "ObjectID",
   *    "alias": "ObjectID",
   *    "type": "oid"
   *  }), new Field({
   *    "name": "description",
   *    "alias": "Description",
   *    "type": "string"
   *  }), new Field ({
   *    "name": "title",
   *    "alias": "Title",
   *    "type": "string"
   *  })
   * ];
   */
  get fields(): Field[];
  set fields(value: FieldProperties[]);
  /**
   * A convenient property that can be used to make case-insensitive lookups for a field by name.
   * It can also provide a list of the [date fields](https://developers.arcgis.com/javascript/latest/references/core/layers/support/FieldsIndex/#dateFields) in a layer.
   *
   * @since 4.12
   * @example
   * // lookup a field by name. name is case-insensitive
   * const field = layer.fieldsIndex.get("SoMeFiEld");
   *
   * if (field) {
   *   console.log(field.name); // SomeField
   * }
   */
  get fieldsIndex(): FieldsIndex<Field>;
  /**
   * An [Extent](https://developers.arcgis.com/javascript/latest/references/core/geometry/Extent/) object used to filter features. Only features that intersect the
   * extent object are displayed in the view. For example, the `geometryDefinition` can be set to a city boundary extent
   * to display features only intersect this extent.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > To filter client-side stream layers or stream layers pointing to custom web sockets, use the [StreamLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#filter) or
   * > [StreamLayerView.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#featureEffect) property.
   * > The [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#definitionExpression) and [geometryDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryDefinition) properties are only meant to be used with stream layers
   * > that point to geoevent or velocity steam services.
   *
   * @example
   * // Get the current extent of the map view and expand the extent by factor of 0.9
   * // Then apply this extent to stream layer's geometryDefinition.
   * // Only features that intersect this extent will be displayed on the view.
   * let extent = mapView.extent.clone().expand(0.9);
   * streamLayer.geometryDefinition = extent;
   */
  get geometryDefinition(): Extent | null | undefined;
  set geometryDefinition(value: ExtentProperties | null | undefined);
  /** The geometry type of features in the layer. All features must be of the same type. */
  accessor geometryType: "point" | "polygon" | "polyline" | "multipoint" | null | undefined;
  /**
   * The label definition for this layer, specified as an array of
   * [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/). Use this property to specify
   * labeling properties for the layer such as label expression, placement, and size.
   *
   * Multiple Label classes with different `where` clauses can be used to define several
   * labels with varying styles on the same feature. Likewise, multiple label classes
   * may be used to label different types of features (for example blue labels
   * for boats and green labels for trucks).
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > 3D [SceneViews](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/) only support displaying one [LabelClass](https://developers.arcgis.com/javascript/latest/references/core/layers/support/LabelClass/) per feature.
   *
   * @see [Sample: Flat vs. volumetric 3D symbol layers](https://developers.arcgis.com/javascript/latest/sample-code/symbols-points-3d/)
   * @see [Sample: Add multiple label classes to a layer](https://developers.arcgis.com/javascript/latest/sample-code/labels-multiple-classes/)
   * @see [Sample: Multi-line labels](https://developers.arcgis.com/javascript/latest/sample-code/labels-multiline/)
   * @example
   * const boatLabelClass = new LabelClass({
   *   labelExpressionInfo: { expression: "$feature.NAME" },
   *   symbol: {
   *     type: "label-3d",  // autocasts as new LabelSymbol3D()
   *     symbolLayers: [{
   *       type: "text",  // autocasts as new TextSymbol3DLayer()
   *       material: { color: [ 49,163,84 ] },
   *       size: 12  // points
   *     }]
   *   }
   * });
   *
   * streamLayer.labelingInfo = [ boatLabelClass ];
   */
  get labelingInfo(): LabelClass[] | null | undefined;
  set labelingInfo(value: LabelClassProperties[] | null | undefined);
  /**
   * Indicates whether to display labels for this layer. If `true`, labels will
   * appear as defined in the [labelingInfo](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#labelingInfo) property.
   *
   * @default true
   */
  accessor labelsVisible: boolean;
  /**
   * Indicates whether the layer will be included in the legend.
   *
   * @default true
   */
  accessor legendEnabled: boolean;
  /**
   * The maximum number of attempts to reconnect. If the value is 0, the client will always continue to try to reconnect. The [maxReconnectionAttempts](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#maxReconnectionAttempts) set on the layer is returned when [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters) is called.
   *
   * @default 0
   * @since 4.17
   */
  accessor maxReconnectionAttempts: number;
  /**
   * The maximum time to wait in seconds between attempts to reconnect. The [maxReconnectionInterval](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#maxReconnectionInterval) set on the layer is returned when the [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters) is called.
   *
   * @default 20
   * @since 4.17
   */
  accessor maxReconnectionInterval: number;
  /**
   * The name of an `oid` [field](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#fields) containing
   * a unique value or identifier for each feature in the layer.
   *
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#fields)
   */
  accessor objectIdField: string;
  /**
   * Indicates whether to display popups when features in the layer are clicked.
   * The layer needs to have a [popupTemplate](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#popupTemplate) to define what
   * information should be displayed in the popup. Alternatively, a default popup template may be automatically used if
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled) is set to `true`.
   *
   * @default true
   * @see [createPopupTemplate()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createPopupTemplate)
   * @see [SceneView.popup](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#popup)
   * @see [View2D.popup](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#popup)
   */
  accessor popupEnabled: boolean;
  /**
   * The popup template for the layer. When set on the layer, the `popupTemplate`
   * allows users to access attributes and display their values in the
   * view's Popup when a feature is selected
   * using text and/or charts. See the [PopupTemplate sample](https://developers.arcgis.com/javascript/latest/sample-code/intro-popuptemplate/)
   * for an example of how [PopupTemplate](https://developers.arcgis.com/javascript/latest/references/core/PopupTemplate/) interacts with a
   * [FeatureLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/FeatureLayer/).
   *
   * A default popup template is automatically used if no `popupTemplate` has been defined when
   * [Popup.defaultPopupTemplateEnabled](https://developers.arcgis.com/javascript/latest/references/core/widgets/Popup/#defaultPopupTemplateEnabled)
   * is set to `true`.
   *
   * @see [createPopupTemplate()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createPopupTemplate)
   * @see [SceneView.popup](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/#popup)
   * @see [View2D.popup](https://developers.arcgis.com/javascript/latest/references/core/views/View2D/#popup)
   */
  get popupTemplate(): PopupTemplate | null | undefined;
  set popupTemplate(value: PopupTemplateProperties | null | undefined);
  /**
   * Options for purging stale features. The purge options controls how much data is removed from
   * [StreamLayerView](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/) and how often.
   * Choosing the right purge rule for your stream layer is critical for maximizing functionality and performance.
   * Cannot be changed after the layer has been loaded.
   *
   * @example
   * // show last 5 known locations of per flight
   * // but only show 100,000 locations overall
   * streamLayer = new StreamLayer({
   *   url: url,
   *   purgeOptions: {
   *     displayCount: 100000,
   *     maxObservations: 5
   *   }
   * });
   */
  get purgeOptions(): PurgeOptions;
  set purgeOptions(value: PurgeOptionsProperties);
  /**
   * The renderer assigned to the layer. The renderer defines how to
   * visualize each feature in the layer. Depending on the renderer type,
   * features may be visualized with the same symbol, or with varying symbols
   * based on the values of provided attribute fields or functions. If not specified,
   * a default renderer will be generated based on the geometry type.
   *
   * @see [Styles and data visualization](https://developers.arcgis.com/javascript/latest/visualization/)
   */
  get renderer(): RendererUnion | null | undefined;
  set renderer(value: (((SimpleRendererProperties & { type: "simple" }) | (ClassBreaksRendererProperties & { type: "class-breaks" }) | (UniqueValueRendererProperties & { type: "unique-value" }) | (DotDensityRendererProperties & { type: "dot-density" }) | (DictionaryRendererProperties & { type: "dictionary" }) | (PieChartRendererProperties & { type: "pie-chart" })) | (HeatmapRendererProperties & { type: "heatmap" })) | null | undefined);
  /**
   * Apply perspective scaling to screen-size symbols in a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   * When `true`, screen sized objects such as [icons](https://developers.arcgis.com/javascript/latest/references/core/symbols/IconSymbol3DLayer/),
   * [labels](https://developers.arcgis.com/javascript/latest/references/core/symbols/LabelSymbol3D/) or [callouts](https://developers.arcgis.com/javascript/latest/references/core/symbols/callouts/Callout3D/) integrate
   * better in the 3D scene by applying a certain perspective projection to the
   * sizing of features. This only applies when using a [SceneView](https://developers.arcgis.com/javascript/latest/references/core/views/SceneView/).
   *
   * `layer.screenSizePerspectiveEnabled = true`
   *
   * ![screen-size-perspective](https://developers.arcgis.com/javascript/latest/assets/references/core/symbols/symbols-screenSize-perspective.png)
   *
   * `layer.screenSizePerspectiveEnabled = false`
   *
   * ![no-screen-size-perspective](https://developers.arcgis.com/javascript/latest/assets/references/core/symbols/symbols-no-screenSize-perspective.png)
   *
   * > [!WARNING]
   * >
   * > **Known Limitations**
   * >
   * > Screen size perspective is currently not optimized for situations where the camera is very near the ground, or for scenes
   * > with visual elements located far from the ground surface. In these cases it may be better to turn off screen size perspective.
   * > As screen size perspective changes the size based on distance to the camera, it should be set to false when using
   * > [size visual variables](https://developers.arcgis.com/javascript/latest/references/core/renderers/visualVariables/SizeVariable/).
   *
   * @default true
   * @since 4.4
   * @see [Sample: Point styles for cities](https://developers.arcgis.com/javascript/latest/sample-code/visualization-point-styles/)
   */
  accessor screenSizePerspectiveEnabled: boolean;
  /**
   * The [stream service's metadata JSON](https://developers.arcgis.com/rest/services-reference/stream-service.htm)
   * exposed by the ArcGIS REST API. While most commonly used properties
   * are exposed on the StreamLayer class directly, this property gives access to all information returned
   * by the stream service. This property is useful if working in an application built using an older version of the API
   * which requires access to stream service properties from a more recent version.
   *
   * @since 4.13
   */
  accessor sourceJSON: any;
  /**
   * The spatial reference of the layer. When creating the layer from a
   * [url](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#url), the spatial reference is read from the service.
   *
   * When creating a StreamLayer from client-side features, this property is
   * inferred from the geometries of the features provided in the [sendMessageToClient()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#sendMessageToClient)
   * method.
   */
  get spatialReference(): SpatialReference;
  set spatialReference(value: SpatialReferenceProperties);
  /** For [StreamLayer](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/) the type is `stream`. */
  get type(): "stream";
  /**
   * The minimum rate (ms) at which to poll for updates over the websocket connection. Increasing
   * the `updateInterval` reduces the speed at which feature updates are applied.
   *
   * @default 300
   * @since 4.18
   */
  accessor updateInterval: number;
  /**
   * The URL of the stream service. This is set in the `url` parameter of the [constructor](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#StreamLayerProperties).
   *
   * @example
   * let layer = new StreamLayer({
   *  url: "https://geoeventsample3.esri.com:6443/arcgis/rest/services/SeattleBus/StreamServer"
   * });
   */
  accessor url: string;
  /**
   * The URL of a websocket connection. Can be used instead of [url](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#url) to specify a standalone WebSocket connection.
   * See the section on [StreamLayer from a custom stream service](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#streamlayer-from-websocket)
   * for more information.
   *
   * > [!WARNING]
   * >
   * > **Notes**
   * >
   * > To filter stream layers pointing to custom web sockets, use the [StreamLayerView.filter](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#filter) or
   * > [StreamLayerView.featureEffect](https://developers.arcgis.com/javascript/latest/references/core/views/layers/StreamLayerView/#featureEffect) property.
   * > The [definitionExpression](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#definitionExpression) and [geometryDefinition](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#geometryDefinition) properties are only meant to be used with stream layers
   * > that point to geoevent or velocity steam services.
   *
   * @since 4.17
   * @see [StreamLayer from a custom stream service](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#streamlayer-from-websocket)
   * @see [Creating a custom stream service](https://github.com/mmgeorge/node-stream-service)
   */
  accessor webSocketUrl: string | null | undefined;
  /**
   * Establishes a connection to a web socket that satisfy the specified connection parameters. The layer's configuration is used to establish the connection if the `connectionParameters` is not specified.
   * Call the [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters) method to get the connection parameters that match the layer's configuration.
   *
   * @param parameters - Specifies the connection parameters. If no parameters are specified, the connection will use the layer's configuration.
   * @returns When resolved, an instance of [StreamConnection](https://developers.arcgis.com/javascript/latest/references/core/layers/support/StreamConnection/) is returned.
   * @since 4.25
   * @see [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters)
   * @example
   * // get layer's connection configurations
   * const parameters = layer.createConnectionParameters();
   *
   * // set the spatial reference of the service geometries
   * parameters.spatialReference = new SpatialReference({
   *   wkid: 2154
   * });
   *
   * const connection = await layer.connect(parameters);
   *
   * // listen to date-received event once the connection is established
   * // create a graphic from the JSON object returned and add them to view
   * connection.on("data-received", (feature) => {
   *   const graphic = Graphic.fromJSON(feature);
   *   graphic.symbol = myPointSymbol;
   *   view.graphics.push(graphic);
   * });
   *
   * // close the connection when it is not needed anymore
   * connection.destroy();
   */
  connect(parameters?: ConnectionParameters): Promise<StreamConnection>;
  /**
   * Creates a [ConnectionParameters](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#ConnectionParameters) object that can be used to establish a connection to a web socket that
   * satisfies the layer's configuration.
   *
   * @returns The connection parameters representing the layer's current configuration.
   * @since 4.25
   * @see [connect()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#connect)
   */
  createConnectionParameters(): ConnectionParameters;
  /**
   * Creates a popup template for the layer, populated with all the fields of the layer.
   *
   * @param options - Options for creating the popup template.
   * @returns The popup template, or `null` if the layer does not
   * have any fields.
   * @since 4.11
   */
  createPopupTemplate(options?: CreatePopupTemplateOptions): PopupTemplate | null | undefined;
  /**
   * Returns the [Field](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Field/) instance for a field name (case-insensitive).
   *
   * @param fieldName - Name of the field.
   * @returns the matching field or `undefined`
   * @since 4.15
   * @see [fields](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#fields)
   */
  getField(fieldName: string): Field | null | undefined;
  /**
   * Returns the [Domain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/Domain/) associated with the given field name. The domain can be either a
   * [CodedValueDomain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/CodedValueDomain/) or [RangeDomain](https://developers.arcgis.com/javascript/latest/references/core/layers/support/RangeDomain/).
   *
   * @param fieldName - Name of the field.
   * @param options - An object specifying additional options. See the
   *                      object specification table below for the required properties of this object.
   * @returns The Domain object associated with the given field name for the given feature.
   * @since 4.15
   */
  getFieldDomain(fieldName: string, options?: FieldDomainOptions): DomainUnion | null | undefined;
  /**
   * Saves the layer to its existing portal item in the [Portal](https://developers.arcgis.com/javascript/latest/references/core/portal/Portal/)
   * authenticated within the user's current session. If the layer is not saved to a
   * [PortalItem](https://developers.arcgis.com/javascript/latest/references/core/portal/PortalItem/), then you should use [saveAs()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#saveAs).
   *
   * @param options - Various options for saving the layer.
   * @returns When resolved, returns the portal item to which the layer is saved.
   * @since 4.28
   * @example const portalItem = await layer.save();
   */
  save(options?: LayerSaveOptions): Promise<PortalItem>;
  /**
   * Saves the layer to a new portal item in the [Portal](https://developers.arcgis.com/javascript/latest/references/core/portal/Portal/) authenticated within the user's current session.
   *
   * @param portalItem - The portal item to which the layer will be saved.
   * @param options - Various options for saving the layer.
   * @returns When resolved, returns the portal item to which the layer is saved.
   * @since 4.28
   * @example
   * const portalItem = new PortalItem();
   * await layer.saveAs(portalItem);
   */
  saveAs(portalItem: PortalItemProperties, options?: LayerSaveAsOptions): Promise<PortalItem>;
  /**
   * Sends client-side only messages. For instance, it can be used to add and remove features on the client-side.
   * The features must be in the spatial reference of the view when adding features to the layer.
   * To avoid overhead, the stream layer does not do any additional processing or reprojecting of features as they arrive.
   *
   * The following are predefined client-side only messages that can be sent to the layer.
   *
   * Message type | Message explanation |
   * -------------|---------------------|
   * [FeatureMessage](https://developers.arcgis.com/javascript/latest/references/core/layers/support/StreamConnection/#FeatureMessage) | Adds features from features array to a stream layer on client. Features are [esri Feature json object](https://developers.arcgis.com/documentation/common-data-types/feature-object.htm).|
   * [DeleteMessage](https://developers.arcgis.com/javascript/latest/references/core/layers/support/StreamConnection/#DeleteMessage) | Deletes specified features from a stream layer on the client. |
   * [ClearMessage](https://developers.arcgis.com/javascript/latest/references/core/layers/support/StreamConnection/#ClearMessage) | Clears/deletes all features (that are available at the time of message arriving) from a stream layer on the client. |
   *
   * @param message - The message object to send to the client.
   * @since 4.26
   * @see [Add an array of client-side features](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#clientside-streamlayer)
   * @example
   * // add a single feature to a client-side StreamLayer
   * layer.sendMessageToClient({
   *   type: "features",
   *   features: [
   *     {
   *       attributes: {
   *         trackId: 1,
   *         OBJECTID: objectIdCounter++,
   *         status: "red"
   *       },
   *       geometry: {
   *         x: lastX,
   *         y: lastY,
   *       }
   *     }
   *   ]
   * });
   * @example
   * // delete features by trackId
   * const result = await layerView.queryFeatures(query);
   * const trackIds = result.features.map(feature => feature.attributes[layer.timeInfo.trackIdField])
   * layer.sendMessageToClient({
   *   type: "delete",
   *   trackIds
   * });
   * @example
   * // delete features that are visible within the view
   * const objectIds = await layerView.queryObjectIds({ geometry: view.extent.clone().expand(.25) });
   * layer.sendMessageToClient({
   *   type: "delete",
   *   objectIds
   * });
   *
   * // clear all features that are visible on the layer at
   * // the time of message being received
   * layer.sendMessageToClient({
   *   type: "clear"
   * });
   */
  sendMessageToClient(message: Message): void;
  /**
   * Sends a message over the websocket to the server. For instance, it can be used to add or remove features from a stream layer pointing to a
   * [custom websocket](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#streamlayer-from-websocket).
   *
   * @param message - The message object to be sent from the client to the server over the web socket.
   * @since 4.26
   * @see [Reference a custom stream service](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#streamlayer-from-websocket)
   * @example
   * // the snippet shows the API message that it sends to the socket when the
   * // StreamLayer.geometryDefinition and StreamLayer.definitionExpression change
   *  message = {
   *    filter: {
   *     where: "Status = 'green'",
   *     geometry: JSON.stringify(view.extent.clone().expand(0.8)),
   *     outFields: ["*"]
   *    }
   * };
   * layer.sendMessageToSocket(message);
   */
  sendMessageToSocket(message: Object): void;
}
declare const StreamLayerSuperclass: typeof Layer & typeof ClonableMixin & typeof CustomParametersMixin & typeof MultiOriginJSONSupportMixin & typeof PortalLayer & typeof OperationalLayer & typeof RefreshableLayer & typeof ScaleRangeLayer & typeof TrackableLayer & typeof TemporalLayer & typeof BlendLayer & typeof FeatureEffectLayer & typeof FeatureReductionLayer & typeof DisplayFilteredLayer

/**
 * The connection parameters that can be used to establish a connection to a web socket when the [connect()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#connect) method is called.
 * Call the [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters) method to get the connection parameters that match the layer's configuration.
 *
 * @since 4.25
 * @see [createConnectionParameters()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#createConnectionParameters)
 * @see [connect()](https://developers.arcgis.com/javascript/latest/references/core/layers/StreamLayer/#connect)
 */
export type ConnectionParameters = Partial<Pick<StreamLayer, "spatialReference" | "geometryDefinition" | "definitionExpression" | "maxReconnectionAttempts" | "maxReconnectionInterval" | "customParameters">>;