import * as mediaconnect from "@distilled.cloud/aws/mediaconnect";
import * as Provider from "../../Provider.ts";
import { Resource } from "../../Resource.ts";
import type { Providers } from "../Providers.ts";
declare const FlowOutputNameMissing_base: new = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => import("effect/Cause").YieldableError & {
readonly _tag: "FlowOutputNameMissing";
} & Readonly;
/**
* Every flow output managed by alchemy must carry a `Name` so the reconciler
* can converge outputs by identity across updates.
*/
export declare class FlowOutputNameMissing extends FlowOutputNameMissing_base<{
message: string;
}> {
}
export interface FlowProps {
/**
* Name of the flow. If omitted, a deterministic physical name is generated
* from the app, stage and logical ID. Changing the name replaces the flow
* (MediaConnect has no rename operation).
*/
flowName?: string;
/**
* Availability Zone the flow is created in. Must be within the current
* region. Changing the Availability Zone replaces the flow.
* @default MediaConnect picks an Availability Zone
*/
availabilityZone?: string;
/**
* The source the flow ingests. Raw distilled `SetSourceRequest` shape —
* e.g. `{ Protocol: "rtp", WhitelistCidr: "10.0.0.0/8", IngestPort: 5000 }`.
* Mutable source settings (protocol, whitelist CIDR, ingest port, bitrate,
* latency, stream id, sender address/port, description) are updated in
* place via UpdateFlowSource.
*/
source: mediaconnect.SetSourceRequest;
/**
* Outputs of the flow (up to 50). Each output MUST have a `Name` — the
* reconciler converges outputs by name: missing outputs are added, extra
* non-entitlement outputs are removed, and changed settings (destination,
* port, protocol, CIDR allow list, latency, description) are updated in
* place.
* @default no outputs
*/
outputs?: mediaconnect.AddOutputRequest[];
/**
* User-defined tags for the flow.
*/
tags?: Record;
}
export interface Flow extends Resource<"AWS.MediaConnect.Flow", FlowProps, {
/** Name of the flow. */
flowName: string;
/** ARN of the flow. */
flowArn: string;
/** Current status — a freshly created flow is `STANDBY` (not billing for transport). */
status: string;
/** Availability Zone the flow runs in. */
availabilityZone: string;
/** Flow description, if any. */
description: string | undefined;
/** IP address the flow egresses media from. */
egressIp: string | undefined;
/** ARN of the flow's source. */
sourceArn: string | undefined;
/** IP address the flow listens on for incoming content. */
sourceIngestIp: string | undefined;
/** Port the flow listens on for incoming content. */
sourceIngestPort: number | undefined;
/** The flow's outputs (name, ARN, destination endpoint). */
outputs: {
name: string;
outputArn: string;
destination: string | undefined;
port: number | undefined;
listenerAddress: string | undefined;
}[];
/** Observed tags on the flow. */
tags: Record;
}, never, Providers> {
}
/**
* An AWS Elemental MediaConnect flow — a reliable live-video transport
* between a source and one or more outputs.
*
* Creating a flow leaves it in `STANDBY`; a flow only ingests/egresses media
* (and bills for transport) once started with the StartFlow API. Flows bill
* hourly while ACTIVE, so alchemy never starts a flow implicitly.
* ### Creating a Flow
* **Example:** RTP Flow with a CIDR-Whitelisted Source
* ```typescript
* const flow = yield* Flow("Broadcast", {
* source: {
* Name: "primary",
* Protocol: "rtp",
* WhitelistCidr: "10.24.34.0/23",
* IngestPort: 5000,
* },
* });
* ```
*
* ### Outputs
* **Example:** Flow with an RTP Output
* ```typescript
* const flow = yield* Flow("Distribution", {
* source: {
* Name: "primary",
* Protocol: "rtp",
* WhitelistCidr: "10.24.34.0/23",
* IngestPort: 5000,
* },
* outputs: [
* {
* Name: "affiliate-east",
* Protocol: "rtp",
* Destination: "198.51.100.11",
* Port: 5010,
* },
* ],
* });
* ```
*
* ### Tags
* **Example:** Tagged Flow
* ```typescript
* const flow = yield* Flow("Broadcast", {
* source: { Protocol: "rtp", WhitelistCidr: "10.0.0.0/8", IngestPort: 5000 },
* tags: { team: "live-video" },
* });
* ```
*
* @resource
*/
export declare const Flow: import("../../Resource.ts").ResourceClass;
export declare const FlowProvider: () => import("effect/Layer").Layer, never, import("@distilled.cloud/aws/Credentials").Credentials | import("effect/unstable/http/HttpClient").HttpClient | import("../../Stack.ts").Stack | import("../../Stage.ts").Stage>;
export {};
//# sourceMappingURL=Flow.d.ts.map