Current section

Files

Jump to
aws_erlang src aws_transcribe_streaming.erl
Raw

src/aws_transcribe_streaming.erl

%% WARNING: DO NOT EDIT, AUTO-GENERATED CODE!
%% See https://github.com/aws-beam/aws-codegen for more details.
%% @doc Amazon Transcribe streaming offers four main types of real-time
%% transcription:
%% Standard, Medical,
%% Call Analytics,
%% and Health Scribe.
%%
%% Standard transcriptions are the most common option. Refer
%% to for details.
%%
%% Medical transcriptions are tailored to medical professionals
%% and incorporate medical terms. A common use case for this service is
%% transcribing doctor-patient
%% dialogue in real time, so doctors can focus on their patient instead of
%% taking notes. Refer to
%% for details.
%%
%% Call Analytics transcriptions are designed for use with call
%% center audio on two different channels; if you're looking for insight
%% into customer service calls, use this
%% option. Refer to for details.
%%
%% HealthScribe transcriptions are designed to
%% automatically create clinical notes from patient-clinician conversations
%% using generative AI.
%% Refer to [here] for details.
-module(aws_transcribe_streaming).
-export([get_medical_scribe_stream/2,
get_medical_scribe_stream/4,
get_medical_scribe_stream/5,
start_call_analytics_stream_transcription/2,
start_call_analytics_stream_transcription/3,
start_medical_scribe_stream/2,
start_medical_scribe_stream/3,
start_medical_stream_transcription/2,
start_medical_stream_transcription/3,
start_stream_transcription/2,
start_stream_transcription/3]).
-include_lib("hackney/include/hackney_lib.hrl").
%% Example:
%% issue_detected() :: #{
%% <<"CharacterOffsets">> => character_offsets()
%% }
-type issue_detected() :: #{binary() => any()}.
%% Example:
%% start_medical_stream_transcription_request() :: #{
%% <<"AudioStream">> := list(),
%% <<"ContentIdentificationType">> => list(any()),
%% <<"EnableChannelIdentification">> => boolean(),
%% <<"LanguageCode">> := list(any()),
%% <<"MediaEncoding">> := list(any()),
%% <<"MediaSampleRateHertz">> := integer(),
%% <<"NumberOfChannels">> => integer(),
%% <<"SessionId">> => string(),
%% <<"ShowSpeakerLabel">> => boolean(),
%% <<"Specialty">> := list(any()),
%% <<"Type">> := list(any()),
%% <<"VocabularyName">> => string()
%% }
-type start_medical_stream_transcription_request() :: #{binary() => any()}.
%% Example:
%% medical_scribe_encryption_settings() :: #{
%% <<"KmsEncryptionContext">> => map(),
%% <<"KmsKeyId">> => string()
%% }
-type medical_scribe_encryption_settings() :: #{binary() => any()}.
%% Example:
%% start_medical_scribe_stream_response() :: #{
%% <<"LanguageCode">> => list(any()),
%% <<"MediaEncoding">> => list(any()),
%% <<"MediaSampleRateHertz">> => integer(),
%% <<"RequestId">> => string(),
%% <<"ResultStream">> => list(),
%% <<"SessionId">> => string()
%% }
-type start_medical_scribe_stream_response() :: #{binary() => any()}.
%% Example:
%% internal_failure_exception() :: #{
%% <<"Message">> => string()
%% }
-type internal_failure_exception() :: #{binary() => any()}.
%% Example:
%% points_of_interest() :: #{
%% <<"TimestampRanges">> => list(timestamp_range())
%% }
-type points_of_interest() :: #{binary() => any()}.
%% Example:
%% medical_scribe_stream_details() :: #{
%% <<"ChannelDefinitions">> => list(medical_scribe_channel_definition()),
%% <<"EncryptionSettings">> => medical_scribe_encryption_settings(),
%% <<"LanguageCode">> => list(any()),
%% <<"MediaEncoding">> => list(any()),
%% <<"MediaSampleRateHertz">> => integer(),
%% <<"MedicalScribeContextProvided">> => boolean(),
%% <<"PostStreamAnalyticsResult">> => medical_scribe_post_stream_analytics_result(),
%% <<"PostStreamAnalyticsSettings">> => medical_scribe_post_stream_analytics_settings(),
%% <<"ResourceAccessRoleArn">> => string(),
%% <<"SessionId">> => string(),
%% <<"StreamCreatedAt">> => non_neg_integer(),
%% <<"StreamEndedAt">> => non_neg_integer(),
%% <<"StreamStatus">> => list(any()),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyName">> => string()
%% }
-type medical_scribe_stream_details() :: #{binary() => any()}.
%% Example:
%% medical_scribe_audio_event() :: #{
%% <<"AudioChunk">> => binary()
%% }
-type medical_scribe_audio_event() :: #{binary() => any()}.
%% Example:
%% medical_scribe_post_stream_analytics_settings() :: #{
%% <<"ClinicalNoteGenerationSettings">> => clinical_note_generation_settings()
%% }
-type medical_scribe_post_stream_analytics_settings() :: #{binary() => any()}.
%% Example:
%% entity() :: #{
%% <<"Category">> => string(),
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndTime">> => float(),
%% <<"StartTime">> => float(),
%% <<"Type">> => string()
%% }
-type entity() :: #{binary() => any()}.
%% Example:
%% character_offsets() :: #{
%% <<"Begin">> => integer(),
%% <<"End">> => integer()
%% }
-type character_offsets() :: #{binary() => any()}.
%% Example:
%% audio_event() :: #{
%% <<"AudioChunk">> => binary()
%% }
-type audio_event() :: #{binary() => any()}.
%% Example:
%% clinical_note_generation_settings() :: #{
%% <<"NoteTemplate">> => list(any()),
%% <<"OutputBucketName">> => string()
%% }
-type clinical_note_generation_settings() :: #{binary() => any()}.
%% Example:
%% medical_alternative() :: #{
%% <<"Entities">> => list(medical_entity()),
%% <<"Items">> => list(medical_item()),
%% <<"Transcript">> => string()
%% }
-type medical_alternative() :: #{binary() => any()}.
%% Example:
%% call_analytics_language_with_score() :: #{
%% <<"LanguageCode">> => list(any()),
%% <<"Score">> => float()
%% }
-type call_analytics_language_with_score() :: #{binary() => any()}.
%% Example:
%% category_event() :: #{
%% <<"MatchedCategories">> => list(string()),
%% <<"MatchedDetails">> => map()
%% }
-type category_event() :: #{binary() => any()}.
%% Example:
%% medical_scribe_post_stream_analytics_result() :: #{
%% <<"ClinicalNoteGenerationResult">> => clinical_note_generation_result()
%% }
-type medical_scribe_post_stream_analytics_result() :: #{binary() => any()}.
%% Example:
%% medical_scribe_configuration_event() :: #{
%% <<"ChannelDefinitions">> => list(medical_scribe_channel_definition()),
%% <<"EncryptionSettings">> => medical_scribe_encryption_settings(),
%% <<"MedicalScribeContext">> => medical_scribe_context(),
%% <<"PostStreamAnalyticsSettings">> => medical_scribe_post_stream_analytics_settings(),
%% <<"ResourceAccessRoleArn">> => string(),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyName">> => string()
%% }
-type medical_scribe_configuration_event() :: #{binary() => any()}.
%% Example:
%% language_with_score() :: #{
%% <<"LanguageCode">> => list(any()),
%% <<"Score">> => float()
%% }
-type language_with_score() :: #{binary() => any()}.
%% Example:
%% transcript() :: #{
%% <<"Results">> => list(result())
%% }
-type transcript() :: #{binary() => any()}.
%% Example:
%% medical_scribe_transcript_event() :: #{
%% <<"TranscriptSegment">> => medical_scribe_transcript_segment()
%% }
-type medical_scribe_transcript_event() :: #{binary() => any()}.
%% Example:
%% medical_entity() :: #{
%% <<"Category">> => string(),
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndTime">> => float(),
%% <<"StartTime">> => float()
%% }
-type medical_entity() :: #{binary() => any()}.
%% Example:
%% medical_transcript() :: #{
%% <<"Results">> => list(medical_result())
%% }
-type medical_transcript() :: #{binary() => any()}.
%% Example:
%% get_medical_scribe_stream_response() :: #{
%% <<"MedicalScribeStreamDetails">> => medical_scribe_stream_details()
%% }
-type get_medical_scribe_stream_response() :: #{binary() => any()}.
%% Example:
%% start_call_analytics_stream_transcription_response() :: #{
%% <<"CallAnalyticsTranscriptResultStream">> => list(),
%% <<"ContentIdentificationType">> => list(any()),
%% <<"ContentRedactionType">> => list(any()),
%% <<"EnablePartialResultsStabilization">> => boolean(),
%% <<"IdentifyLanguage">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageModelName">> => string(),
%% <<"LanguageOptions">> => string(),
%% <<"MediaEncoding">> => list(any()),
%% <<"MediaSampleRateHertz">> => integer(),
%% <<"PartialResultsStability">> => list(any()),
%% <<"PiiEntityTypes">> => string(),
%% <<"PreferredLanguage">> => list(any()),
%% <<"RequestId">> => string(),
%% <<"SessionId">> => string(),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyFilterNames">> => string(),
%% <<"VocabularyName">> => string(),
%% <<"VocabularyNames">> => string()
%% }
-type start_call_analytics_stream_transcription_response() :: #{binary() => any()}.
%% Example:
%% item() :: #{
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndTime">> => float(),
%% <<"Speaker">> => string(),
%% <<"Stable">> => boolean(),
%% <<"StartTime">> => float(),
%% <<"Type">> => list(any()),
%% <<"VocabularyFilterMatch">> => boolean()
%% }
-type item() :: #{binary() => any()}.
%% Example:
%% conflict_exception() :: #{
%% <<"Message">> => string()
%% }
-type conflict_exception() :: #{binary() => any()}.
%% Example:
%% start_medical_stream_transcription_response() :: #{
%% <<"ContentIdentificationType">> => list(any()),
%% <<"EnableChannelIdentification">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"MediaEncoding">> => list(any()),
%% <<"MediaSampleRateHertz">> => integer(),
%% <<"NumberOfChannels">> => integer(),
%% <<"RequestId">> => string(),
%% <<"SessionId">> => string(),
%% <<"ShowSpeakerLabel">> => boolean(),
%% <<"Specialty">> => list(any()),
%% <<"TranscriptResultStream">> => list(),
%% <<"Type">> => list(any()),
%% <<"VocabularyName">> => string()
%% }
-type start_medical_stream_transcription_response() :: #{binary() => any()}.
%% Example:
%% resource_not_found_exception() :: #{
%% <<"Message">> => string()
%% }
-type resource_not_found_exception() :: #{binary() => any()}.
%% Example:
%% call_analytics_item() :: #{
%% <<"BeginOffsetMillis">> => float(),
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndOffsetMillis">> => float(),
%% <<"Stable">> => boolean(),
%% <<"Type">> => list(any()),
%% <<"VocabularyFilterMatch">> => boolean()
%% }
-type call_analytics_item() :: #{binary() => any()}.
%% Example:
%% channel_definition() :: #{
%% <<"ChannelId">> => integer(),
%% <<"ParticipantRole">> => list(any())
%% }
-type channel_definition() :: #{binary() => any()}.
%% Example:
%% result() :: #{
%% <<"Alternatives">> => list(alternative()),
%% <<"ChannelId">> => string(),
%% <<"EndTime">> => float(),
%% <<"IsPartial">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageIdentification">> => list(language_with_score()),
%% <<"ResultId">> => string(),
%% <<"StartTime">> => float()
%% }
-type result() :: #{binary() => any()}.
%% Example:
%% post_call_analytics_settings() :: #{
%% <<"ContentRedactionOutput">> => list(any()),
%% <<"DataAccessRoleArn">> => string(),
%% <<"OutputEncryptionKMSKeyId">> => string(),
%% <<"OutputLocation">> => string()
%% }
-type post_call_analytics_settings() :: #{binary() => any()}.
%% Example:
%% call_analytics_entity() :: #{
%% <<"BeginOffsetMillis">> => float(),
%% <<"Category">> => string(),
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndOffsetMillis">> => float(),
%% <<"Type">> => string()
%% }
-type call_analytics_entity() :: #{binary() => any()}.
%% Example:
%% service_unavailable_exception() :: #{
%% <<"Message">> => string()
%% }
-type service_unavailable_exception() :: #{binary() => any()}.
%% Example:
%% start_stream_transcription_response() :: #{
%% <<"ContentIdentificationType">> => list(any()),
%% <<"ContentRedactionType">> => list(any()),
%% <<"EnableChannelIdentification">> => boolean(),
%% <<"EnablePartialResultsStabilization">> => boolean(),
%% <<"IdentifyLanguage">> => boolean(),
%% <<"IdentifyMultipleLanguages">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageModelName">> => string(),
%% <<"LanguageOptions">> => string(),
%% <<"MediaEncoding">> => list(any()),
%% <<"MediaSampleRateHertz">> => integer(),
%% <<"NumberOfChannels">> => integer(),
%% <<"PartialResultsStability">> => list(any()),
%% <<"PiiEntityTypes">> => string(),
%% <<"PreferredLanguage">> => list(any()),
%% <<"RequestId">> => string(),
%% <<"SessionId">> => string(),
%% <<"SessionResumeWindow">> => integer(),
%% <<"ShowSpeakerLabel">> => boolean(),
%% <<"TranscriptResultStream">> => list(),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyFilterNames">> => string(),
%% <<"VocabularyName">> => string(),
%% <<"VocabularyNames">> => string()
%% }
-type start_stream_transcription_response() :: #{binary() => any()}.
%% Example:
%% medical_scribe_patient_context() :: #{
%% <<"Pronouns">> => list(any())
%% }
-type medical_scribe_patient_context() :: #{binary() => any()}.
%% Example:
%% medical_transcript_event() :: #{
%% <<"Transcript">> => medical_transcript()
%% }
-type medical_transcript_event() :: #{binary() => any()}.
%% Example:
%% start_stream_transcription_request() :: #{
%% <<"AudioStream">> := list(),
%% <<"ContentIdentificationType">> => list(any()),
%% <<"ContentRedactionType">> => list(any()),
%% <<"EnableChannelIdentification">> => boolean(),
%% <<"EnablePartialResultsStabilization">> => boolean(),
%% <<"IdentifyLanguage">> => boolean(),
%% <<"IdentifyMultipleLanguages">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageModelName">> => string(),
%% <<"LanguageOptions">> => string(),
%% <<"MediaEncoding">> := list(any()),
%% <<"MediaSampleRateHertz">> := integer(),
%% <<"NumberOfChannels">> => integer(),
%% <<"PartialResultsStability">> => list(any()),
%% <<"PiiEntityTypes">> => string(),
%% <<"PreferredLanguage">> => list(any()),
%% <<"SessionId">> => string(),
%% <<"SessionResumeWindow">> => integer(),
%% <<"ShowSpeakerLabel">> => boolean(),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyFilterNames">> => string(),
%% <<"VocabularyName">> => string(),
%% <<"VocabularyNames">> => string()
%% }
-type start_stream_transcription_request() :: #{binary() => any()}.
%% Example:
%% medical_result() :: #{
%% <<"Alternatives">> => list(medical_alternative()),
%% <<"ChannelId">> => string(),
%% <<"EndTime">> => float(),
%% <<"IsPartial">> => boolean(),
%% <<"ResultId">> => string(),
%% <<"StartTime">> => float()
%% }
-type medical_result() :: #{binary() => any()}.
%% Example:
%% start_call_analytics_stream_transcription_request() :: #{
%% <<"AudioStream">> := list(),
%% <<"ContentIdentificationType">> => list(any()),
%% <<"ContentRedactionType">> => list(any()),
%% <<"EnablePartialResultsStabilization">> => boolean(),
%% <<"IdentifyLanguage">> => boolean(),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageModelName">> => string(),
%% <<"LanguageOptions">> => string(),
%% <<"MediaEncoding">> := list(any()),
%% <<"MediaSampleRateHertz">> := integer(),
%% <<"PartialResultsStability">> => list(any()),
%% <<"PiiEntityTypes">> => string(),
%% <<"PreferredLanguage">> => list(any()),
%% <<"SessionId">> => string(),
%% <<"VocabularyFilterMethod">> => list(any()),
%% <<"VocabularyFilterName">> => string(),
%% <<"VocabularyFilterNames">> => string(),
%% <<"VocabularyName">> => string(),
%% <<"VocabularyNames">> => string()
%% }
-type start_call_analytics_stream_transcription_request() :: #{binary() => any()}.
%% Example:
%% timestamp_range() :: #{
%% <<"BeginOffsetMillis">> => float(),
%% <<"EndOffsetMillis">> => float()
%% }
-type timestamp_range() :: #{binary() => any()}.
%% Example:
%% configuration_event() :: #{
%% <<"ChannelDefinitions">> => list(channel_definition()),
%% <<"PostCallAnalyticsSettings">> => post_call_analytics_settings()
%% }
-type configuration_event() :: #{binary() => any()}.
%% Example:
%% start_medical_scribe_stream_request() :: #{
%% <<"InputStream">> := list(),
%% <<"LanguageCode">> := list(any()),
%% <<"MediaEncoding">> := list(any()),
%% <<"MediaSampleRateHertz">> := integer(),
%% <<"SessionId">> => string()
%% }
-type start_medical_scribe_stream_request() :: #{binary() => any()}.
%% Example:
%% get_medical_scribe_stream_request() :: #{}
-type get_medical_scribe_stream_request() :: #{}.
%% Example:
%% utterance_event() :: #{
%% <<"BeginOffsetMillis">> => float(),
%% <<"EndOffsetMillis">> => float(),
%% <<"Entities">> => list(call_analytics_entity()),
%% <<"IsPartial">> => boolean(),
%% <<"IssuesDetected">> => list(issue_detected()),
%% <<"Items">> => list(call_analytics_item()),
%% <<"LanguageCode">> => list(any()),
%% <<"LanguageIdentification">> => list(call_analytics_language_with_score()),
%% <<"ParticipantRole">> => list(any()),
%% <<"Sentiment">> => list(any()),
%% <<"Transcript">> => string(),
%% <<"UtteranceId">> => string()
%% }
-type utterance_event() :: #{binary() => any()}.
%% Example:
%% medical_scribe_transcript_item() :: #{
%% <<"BeginAudioTime">> => float(),
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndAudioTime">> => float(),
%% <<"Type">> => list(any()),
%% <<"VocabularyFilterMatch">> => boolean()
%% }
-type medical_scribe_transcript_item() :: #{binary() => any()}.
%% Example:
%% limit_exceeded_exception() :: #{
%% <<"Message">> => string()
%% }
-type limit_exceeded_exception() :: #{binary() => any()}.
%% Example:
%% medical_scribe_session_control_event() :: #{
%% <<"Type">> => list(any())
%% }
-type medical_scribe_session_control_event() :: #{binary() => any()}.
%% Example:
%% bad_request_exception() :: #{
%% <<"Message">> => string()
%% }
-type bad_request_exception() :: #{binary() => any()}.
%% Example:
%% medical_scribe_transcript_segment() :: #{
%% <<"BeginAudioTime">> => float(),
%% <<"ChannelId">> => string(),
%% <<"Content">> => string(),
%% <<"EndAudioTime">> => float(),
%% <<"IsPartial">> => boolean(),
%% <<"Items">> => list(medical_scribe_transcript_item()),
%% <<"SegmentId">> => string()
%% }
-type medical_scribe_transcript_segment() :: #{binary() => any()}.
%% Example:
%% medical_scribe_context() :: #{
%% <<"PatientContext">> => medical_scribe_patient_context()
%% }
-type medical_scribe_context() :: #{binary() => any()}.
%% Example:
%% medical_item() :: #{
%% <<"Confidence">> => float(),
%% <<"Content">> => string(),
%% <<"EndTime">> => float(),
%% <<"Speaker">> => string(),
%% <<"StartTime">> => float(),
%% <<"Type">> => list(any())
%% }
-type medical_item() :: #{binary() => any()}.
%% Example:
%% medical_scribe_channel_definition() :: #{
%% <<"ChannelId">> => integer(),
%% <<"ParticipantRole">> => list(any())
%% }
-type medical_scribe_channel_definition() :: #{binary() => any()}.
%% Example:
%% transcript_event() :: #{
%% <<"Transcript">> => transcript()
%% }
-type transcript_event() :: #{binary() => any()}.
%% Example:
%% clinical_note_generation_result() :: #{
%% <<"ClinicalNoteOutputLocation">> => string(),
%% <<"FailureReason">> => string(),
%% <<"Status">> => list(any()),
%% <<"TranscriptOutputLocation">> => string()
%% }
-type clinical_note_generation_result() :: #{binary() => any()}.
%% Example:
%% alternative() :: #{
%% <<"Entities">> => list(entity()),
%% <<"Items">> => list(item()),
%% <<"Transcript">> => string()
%% }
-type alternative() :: #{binary() => any()}.
-type get_medical_scribe_stream_errors() ::
bad_request_exception() |
limit_exceeded_exception() |
resource_not_found_exception() |
internal_failure_exception().
-type start_call_analytics_stream_transcription_errors() ::
bad_request_exception() |
limit_exceeded_exception() |
service_unavailable_exception() |
conflict_exception() |
internal_failure_exception().
-type start_medical_scribe_stream_errors() ::
bad_request_exception() |
limit_exceeded_exception() |
service_unavailable_exception() |
conflict_exception() |
internal_failure_exception().
-type start_medical_stream_transcription_errors() ::
bad_request_exception() |
limit_exceeded_exception() |
service_unavailable_exception() |
conflict_exception() |
internal_failure_exception().
-type start_stream_transcription_errors() ::
bad_request_exception() |
limit_exceeded_exception() |
service_unavailable_exception() |
conflict_exception() |
internal_failure_exception().
%%====================================================================
%% API
%%====================================================================
%% @doc Provides details about the specified Amazon Web Services HealthScribe
%% streaming session.
%%
%% To view the status of the streaming session, check the `StreamStatus'
%% field in the response. To get the
%% details of post-stream analytics, including its status, check the
%% `PostStreamAnalyticsResult' field in the response.
-spec get_medical_scribe_stream(aws_client:aws_client(), binary() | list()) ->
{ok, get_medical_scribe_stream_response(), tuple()} |
{error, any()} |
{error, get_medical_scribe_stream_errors(), tuple()}.
get_medical_scribe_stream(Client, SessionId)
when is_map(Client) ->
get_medical_scribe_stream(Client, SessionId, #{}, #{}).
-spec get_medical_scribe_stream(aws_client:aws_client(), binary() | list(), map(), map()) ->
{ok, get_medical_scribe_stream_response(), tuple()} |
{error, any()} |
{error, get_medical_scribe_stream_errors(), tuple()}.
get_medical_scribe_stream(Client, SessionId, QueryMap, HeadersMap)
when is_map(Client), is_map(QueryMap), is_map(HeadersMap) ->
get_medical_scribe_stream(Client, SessionId, QueryMap, HeadersMap, []).
-spec get_medical_scribe_stream(aws_client:aws_client(), binary() | list(), map(), map(), proplists:proplist()) ->
{ok, get_medical_scribe_stream_response(), tuple()} |
{error, any()} |
{error, get_medical_scribe_stream_errors(), tuple()}.
get_medical_scribe_stream(Client, SessionId, QueryMap, HeadersMap, Options0)
when is_map(Client), is_map(QueryMap), is_map(HeadersMap), is_list(Options0) ->
Path = ["/medical-scribe-stream/", aws_util:encode_uri(SessionId), ""],
SuccessStatusCode = 200,
{SendBodyAsBinary, Options1} = proplists_take(send_body_as_binary, Options0, false),
{ReceiveBodyAsBinary, Options2} = proplists_take(receive_body_as_binary, Options1, false),
Options = [{send_body_as_binary, SendBodyAsBinary},
{receive_body_as_binary, ReceiveBodyAsBinary}
| Options2],
Headers = [],
Query_ = [],
request(Client, get, Path, Query_, Headers, undefined, Options, SuccessStatusCode).
%% @doc Starts a bidirectional HTTP/2 or WebSocket stream where audio is
%% streamed to
%% Amazon Transcribe and the transcription results are streamed to your
%% application.
%%
%% Use this operation
%% for Call Analytics:
%% https://docs.aws.amazon.com/transcribe/latest/dg/call-analytics.html
%% transcriptions.
%%
%% The following parameters are required:
%%
%% `language-code' or `identify-language'
%%
%% `media-encoding'
%%
%% `sample-rate'
%%
%% For more information on streaming with Amazon Transcribe, see Transcribing
%% streaming audio:
%% https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html.
-spec start_call_analytics_stream_transcription(aws_client:aws_client(), start_call_analytics_stream_transcription_request()) ->
{ok, start_call_analytics_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_call_analytics_stream_transcription_errors(), tuple()}.
start_call_analytics_stream_transcription(Client, Input) ->
start_call_analytics_stream_transcription(Client, Input, []).
-spec start_call_analytics_stream_transcription(aws_client:aws_client(), start_call_analytics_stream_transcription_request(), proplists:proplist()) ->
{ok, start_call_analytics_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_call_analytics_stream_transcription_errors(), tuple()}.
start_call_analytics_stream_transcription(Client, Input0, Options0) ->
Method = post,
Path = ["/call-analytics-stream-transcription"],
SuccessStatusCode = 200,
{SendBodyAsBinary, Options1} = proplists_take(send_body_as_binary, Options0, false),
{ReceiveBodyAsBinary, Options2} = proplists_take(receive_body_as_binary, Options1, false),
Options = [{send_body_as_binary, SendBodyAsBinary},
{receive_body_as_binary, ReceiveBodyAsBinary},
{append_sha256_content_hash, false}
| Options2],
HeadersMapping = [
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-content-redaction-type">>, <<"ContentRedactionType">>},
{<<"x-amzn-transcribe-enable-partial-results-stabilization">>, <<"EnablePartialResultsStabilization">>},
{<<"x-amzn-transcribe-identify-language">>, <<"IdentifyLanguage">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-language-model-name">>, <<"LanguageModelName">>},
{<<"x-amzn-transcribe-language-options">>, <<"LanguageOptions">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-partial-results-stability">>, <<"PartialResultsStability">>},
{<<"x-amzn-transcribe-pii-entity-types">>, <<"PiiEntityTypes">>},
{<<"x-amzn-transcribe-preferred-language">>, <<"PreferredLanguage">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-vocabulary-filter-method">>, <<"VocabularyFilterMethod">>},
{<<"x-amzn-transcribe-vocabulary-filter-name">>, <<"VocabularyFilterName">>},
{<<"x-amzn-transcribe-vocabulary-filter-names">>, <<"VocabularyFilterNames">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>},
{<<"x-amzn-transcribe-vocabulary-names">>, <<"VocabularyNames">>}
],
{Headers, Input1} = aws_request:build_headers(HeadersMapping, Input0),
CustomHeaders = [],
Input2 = Input1,
Query_ = [],
Input = Input2,
case request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode) of
{ok, Body0, {_, ResponseHeaders, _} = Response} ->
ResponseHeadersParams =
[
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-content-redaction-type">>, <<"ContentRedactionType">>},
{<<"x-amzn-transcribe-enable-partial-results-stabilization">>, <<"EnablePartialResultsStabilization">>},
{<<"x-amzn-transcribe-identify-language">>, <<"IdentifyLanguage">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-language-model-name">>, <<"LanguageModelName">>},
{<<"x-amzn-transcribe-language-options">>, <<"LanguageOptions">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-partial-results-stability">>, <<"PartialResultsStability">>},
{<<"x-amzn-transcribe-pii-entity-types">>, <<"PiiEntityTypes">>},
{<<"x-amzn-transcribe-preferred-language">>, <<"PreferredLanguage">>},
{<<"x-amzn-request-id">>, <<"RequestId">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-vocabulary-filter-method">>, <<"VocabularyFilterMethod">>},
{<<"x-amzn-transcribe-vocabulary-filter-name">>, <<"VocabularyFilterName">>},
{<<"x-amzn-transcribe-vocabulary-filter-names">>, <<"VocabularyFilterNames">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>},
{<<"x-amzn-transcribe-vocabulary-names">>, <<"VocabularyNames">>}
],
FoldFun = fun({Name_, Key_}, Acc_) ->
case lists:keyfind(Name_, 1, ResponseHeaders) of
false -> Acc_;
{_, Value_} -> Acc_#{Key_ => Value_}
end
end,
Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams),
{ok, Body, Response};
Result ->
Result
end.
%% @doc Starts a bidirectional HTTP/2 stream, where audio is streamed to
%% Amazon Web Services HealthScribe
%% and the transcription results are streamed to your application.
%%
%% When you start a stream, you first specify the stream configuration in a
%% `MedicalScribeConfigurationEvent'.
%% This event includes channel definitions, encryption settings, medical
%% scribe context, and post-stream analytics settings, such as the output
%% configuration for aggregated transcript and clinical note generation.
%% These are additional
%% streaming session configurations beyond those provided in your initial
%% start request headers. Whether you are starting a new session or resuming
%% an existing session,
%% your first event must be a `MedicalScribeConfigurationEvent'.
%%
%% After you send a `MedicalScribeConfigurationEvent', you start
%% `AudioEvents' and Amazon Web Services HealthScribe
%% responds with real-time transcription results. When you are finished, to
%% start processing the results with the post-stream analytics, send a
%% `MedicalScribeSessionControlEvent' with a `Type' of
%% `END_OF_SESSION' and Amazon Web Services HealthScribe starts the
%% analytics.
%%
%% You can pause or resume streaming.
%% To pause streaming, complete the input stream without sending the
%% `MedicalScribeSessionControlEvent'.
%% To resume streaming, call the `StartMedicalScribeStream' and specify
%% the same SessionId you used to start the stream.
%%
%% The following parameters are required:
%%
%% `language-code'
%%
%% `media-encoding'
%%
%% `media-sample-rate-hertz'
%%
%% For more information on streaming with
%% Amazon Web Services HealthScribe,
%% see Amazon Web Services HealthScribe:
%% https://docs.aws.amazon.com/transcribe/latest/dg/health-scribe-streaming.html.
-spec start_medical_scribe_stream(aws_client:aws_client(), start_medical_scribe_stream_request()) ->
{ok, start_medical_scribe_stream_response(), tuple()} |
{error, any()} |
{error, start_medical_scribe_stream_errors(), tuple()}.
start_medical_scribe_stream(Client, Input) ->
start_medical_scribe_stream(Client, Input, []).
-spec start_medical_scribe_stream(aws_client:aws_client(), start_medical_scribe_stream_request(), proplists:proplist()) ->
{ok, start_medical_scribe_stream_response(), tuple()} |
{error, any()} |
{error, start_medical_scribe_stream_errors(), tuple()}.
start_medical_scribe_stream(Client, Input0, Options0) ->
Method = post,
Path = ["/medical-scribe-stream"],
SuccessStatusCode = 200,
{SendBodyAsBinary, Options1} = proplists_take(send_body_as_binary, Options0, false),
{ReceiveBodyAsBinary, Options2} = proplists_take(receive_body_as_binary, Options1, false),
Options = [{send_body_as_binary, SendBodyAsBinary},
{receive_body_as_binary, ReceiveBodyAsBinary},
{append_sha256_content_hash, false}
| Options2],
HeadersMapping = [
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>}
],
{Headers, Input1} = aws_request:build_headers(HeadersMapping, Input0),
CustomHeaders = [],
Input2 = Input1,
Query_ = [],
Input = Input2,
case request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode) of
{ok, Body0, {_, ResponseHeaders, _} = Response} ->
ResponseHeadersParams =
[
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-request-id">>, <<"RequestId">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>}
],
FoldFun = fun({Name_, Key_}, Acc_) ->
case lists:keyfind(Name_, 1, ResponseHeaders) of
false -> Acc_;
{_, Value_} -> Acc_#{Key_ => Value_}
end
end,
Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams),
{ok, Body, Response};
Result ->
Result
end.
%% @doc Starts a bidirectional HTTP/2 or WebSocket stream where audio is
%% streamed to
%% Amazon Transcribe Medical and the transcription results are streamed to
%% your
%% application.
%%
%% The following parameters are required:
%%
%% `language-code'
%%
%% `media-encoding'
%%
%% `sample-rate'
%%
%% For more information on streaming with Amazon Transcribe Medical, see
%% Transcribing
%% streaming audio:
%% https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html.
-spec start_medical_stream_transcription(aws_client:aws_client(), start_medical_stream_transcription_request()) ->
{ok, start_medical_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_medical_stream_transcription_errors(), tuple()}.
start_medical_stream_transcription(Client, Input) ->
start_medical_stream_transcription(Client, Input, []).
-spec start_medical_stream_transcription(aws_client:aws_client(), start_medical_stream_transcription_request(), proplists:proplist()) ->
{ok, start_medical_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_medical_stream_transcription_errors(), tuple()}.
start_medical_stream_transcription(Client, Input0, Options0) ->
Method = post,
Path = ["/medical-stream-transcription"],
SuccessStatusCode = 200,
{SendBodyAsBinary, Options1} = proplists_take(send_body_as_binary, Options0, false),
{ReceiveBodyAsBinary, Options2} = proplists_take(receive_body_as_binary, Options1, false),
Options = [{send_body_as_binary, SendBodyAsBinary},
{receive_body_as_binary, ReceiveBodyAsBinary},
{append_sha256_content_hash, false}
| Options2],
HeadersMapping = [
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-enable-channel-identification">>, <<"EnableChannelIdentification">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-number-of-channels">>, <<"NumberOfChannels">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-show-speaker-label">>, <<"ShowSpeakerLabel">>},
{<<"x-amzn-transcribe-specialty">>, <<"Specialty">>},
{<<"x-amzn-transcribe-type">>, <<"Type">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>}
],
{Headers, Input1} = aws_request:build_headers(HeadersMapping, Input0),
CustomHeaders = [],
Input2 = Input1,
Query_ = [],
Input = Input2,
case request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode) of
{ok, Body0, {_, ResponseHeaders, _} = Response} ->
ResponseHeadersParams =
[
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-enable-channel-identification">>, <<"EnableChannelIdentification">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-number-of-channels">>, <<"NumberOfChannels">>},
{<<"x-amzn-request-id">>, <<"RequestId">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-show-speaker-label">>, <<"ShowSpeakerLabel">>},
{<<"x-amzn-transcribe-specialty">>, <<"Specialty">>},
{<<"x-amzn-transcribe-type">>, <<"Type">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>}
],
FoldFun = fun({Name_, Key_}, Acc_) ->
case lists:keyfind(Name_, 1, ResponseHeaders) of
false -> Acc_;
{_, Value_} -> Acc_#{Key_ => Value_}
end
end,
Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams),
{ok, Body, Response};
Result ->
Result
end.
%% @doc Starts a bidirectional HTTP/2 or WebSocket stream where audio is
%% streamed to
%% Amazon Transcribe and the transcription results are streamed to your
%% application.
%%
%% The following parameters are required:
%%
%% `language-code' or `identify-language' or
%% `identify-multiple-language'
%%
%% `media-encoding'
%%
%% `sample-rate'
%%
%% For more information on streaming with Amazon Transcribe, see Transcribing
%% streaming audio:
%% https://docs.aws.amazon.com/transcribe/latest/dg/streaming.html.
-spec start_stream_transcription(aws_client:aws_client(), start_stream_transcription_request()) ->
{ok, start_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_stream_transcription_errors(), tuple()}.
start_stream_transcription(Client, Input) ->
start_stream_transcription(Client, Input, []).
-spec start_stream_transcription(aws_client:aws_client(), start_stream_transcription_request(), proplists:proplist()) ->
{ok, start_stream_transcription_response(), tuple()} |
{error, any()} |
{error, start_stream_transcription_errors(), tuple()}.
start_stream_transcription(Client, Input0, Options0) ->
Method = post,
Path = ["/stream-transcription"],
SuccessStatusCode = 200,
{SendBodyAsBinary, Options1} = proplists_take(send_body_as_binary, Options0, false),
{ReceiveBodyAsBinary, Options2} = proplists_take(receive_body_as_binary, Options1, false),
Options = [{send_body_as_binary, SendBodyAsBinary},
{receive_body_as_binary, ReceiveBodyAsBinary},
{append_sha256_content_hash, false}
| Options2],
HeadersMapping = [
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-content-redaction-type">>, <<"ContentRedactionType">>},
{<<"x-amzn-transcribe-enable-channel-identification">>, <<"EnableChannelIdentification">>},
{<<"x-amzn-transcribe-enable-partial-results-stabilization">>, <<"EnablePartialResultsStabilization">>},
{<<"x-amzn-transcribe-identify-language">>, <<"IdentifyLanguage">>},
{<<"x-amzn-transcribe-identify-multiple-languages">>, <<"IdentifyMultipleLanguages">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-language-model-name">>, <<"LanguageModelName">>},
{<<"x-amzn-transcribe-language-options">>, <<"LanguageOptions">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-number-of-channels">>, <<"NumberOfChannels">>},
{<<"x-amzn-transcribe-partial-results-stability">>, <<"PartialResultsStability">>},
{<<"x-amzn-transcribe-pii-entity-types">>, <<"PiiEntityTypes">>},
{<<"x-amzn-transcribe-preferred-language">>, <<"PreferredLanguage">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-session-resume-window">>, <<"SessionResumeWindow">>},
{<<"x-amzn-transcribe-show-speaker-label">>, <<"ShowSpeakerLabel">>},
{<<"x-amzn-transcribe-vocabulary-filter-method">>, <<"VocabularyFilterMethod">>},
{<<"x-amzn-transcribe-vocabulary-filter-name">>, <<"VocabularyFilterName">>},
{<<"x-amzn-transcribe-vocabulary-filter-names">>, <<"VocabularyFilterNames">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>},
{<<"x-amzn-transcribe-vocabulary-names">>, <<"VocabularyNames">>}
],
{Headers, Input1} = aws_request:build_headers(HeadersMapping, Input0),
CustomHeaders = [],
Input2 = Input1,
Query_ = [],
Input = Input2,
case request(Client, Method, Path, Query_, CustomHeaders ++ Headers, Input, Options, SuccessStatusCode) of
{ok, Body0, {_, ResponseHeaders, _} = Response} ->
ResponseHeadersParams =
[
{<<"x-amzn-transcribe-content-identification-type">>, <<"ContentIdentificationType">>},
{<<"x-amzn-transcribe-content-redaction-type">>, <<"ContentRedactionType">>},
{<<"x-amzn-transcribe-enable-channel-identification">>, <<"EnableChannelIdentification">>},
{<<"x-amzn-transcribe-enable-partial-results-stabilization">>, <<"EnablePartialResultsStabilization">>},
{<<"x-amzn-transcribe-identify-language">>, <<"IdentifyLanguage">>},
{<<"x-amzn-transcribe-identify-multiple-languages">>, <<"IdentifyMultipleLanguages">>},
{<<"x-amzn-transcribe-language-code">>, <<"LanguageCode">>},
{<<"x-amzn-transcribe-language-model-name">>, <<"LanguageModelName">>},
{<<"x-amzn-transcribe-language-options">>, <<"LanguageOptions">>},
{<<"x-amzn-transcribe-media-encoding">>, <<"MediaEncoding">>},
{<<"x-amzn-transcribe-sample-rate">>, <<"MediaSampleRateHertz">>},
{<<"x-amzn-transcribe-number-of-channels">>, <<"NumberOfChannels">>},
{<<"x-amzn-transcribe-partial-results-stability">>, <<"PartialResultsStability">>},
{<<"x-amzn-transcribe-pii-entity-types">>, <<"PiiEntityTypes">>},
{<<"x-amzn-transcribe-preferred-language">>, <<"PreferredLanguage">>},
{<<"x-amzn-request-id">>, <<"RequestId">>},
{<<"x-amzn-transcribe-session-id">>, <<"SessionId">>},
{<<"x-amzn-transcribe-session-resume-window">>, <<"SessionResumeWindow">>},
{<<"x-amzn-transcribe-show-speaker-label">>, <<"ShowSpeakerLabel">>},
{<<"x-amzn-transcribe-vocabulary-filter-method">>, <<"VocabularyFilterMethod">>},
{<<"x-amzn-transcribe-vocabulary-filter-name">>, <<"VocabularyFilterName">>},
{<<"x-amzn-transcribe-vocabulary-filter-names">>, <<"VocabularyFilterNames">>},
{<<"x-amzn-transcribe-vocabulary-name">>, <<"VocabularyName">>},
{<<"x-amzn-transcribe-vocabulary-names">>, <<"VocabularyNames">>}
],
FoldFun = fun({Name_, Key_}, Acc_) ->
case lists:keyfind(Name_, 1, ResponseHeaders) of
false -> Acc_;
{_, Value_} -> Acc_#{Key_ => Value_}
end
end,
Body = lists:foldl(FoldFun, Body0, ResponseHeadersParams),
{ok, Body, Response};
Result ->
Result
end.
%%====================================================================
%% Internal functions
%%====================================================================
-spec proplists_take(any(), proplists:proplist(), any()) -> {any(), proplists:proplist()}.
proplists_take(Key, Proplist, Default) ->
Value = proplists:get_value(Key, Proplist, Default),
{Value, proplists:delete(Key, Proplist)}.
-spec request(aws_client:aws_client(), atom(), iolist(), list(),
list(), map() | undefined, list(), pos_integer() | undefined) ->
{ok, {integer(), list()}} |
{ok, Result, {integer(), list(), hackney:client()}} |
{error, Error, {integer(), list(), hackney:client()}} |
{error, term()} when
Result :: map(),
Error :: map().
request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) ->
RequestFun = fun() -> do_request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) end,
aws_request:request(RequestFun, Options).
do_request(Client, Method, Path, Query, Headers0, Input, Options, SuccessStatusCode) ->
Client1 = Client#{service => <<"transcribe">>},
DefaultHost = build_host(<<"transcribestreaming">>, Client1),
URL0 = build_url(DefaultHost, Path, Client1),
PathBin = erlang:iolist_to_binary(Path),
{URL1, Host} = aws_util:apply_endpoint_url_override(URL0, DefaultHost, PathBin, <<"AWS_ENDPOINT_URL_TRANSCRIBE_STREAMING">>),
URL = aws_request:add_query(URL1, Query),
AdditionalHeaders1 = [ {<<"Host">>, Host}
, {<<"Content-Type">>, <<"application/x-amz-json-1.1">>}
],
Payload =
case proplists:get_value(send_body_as_binary, Options) of
true when is_list(Input) ->
proplists:get_value(<<"Body">>, Input, <<"">>);
true when Input =:= undefined ->
<<"">>;
true ->
maps:get(<<"Body">>, Input, <<"">>);
false ->
encode_payload(Input)
end,
AdditionalHeaders = case proplists:get_value(append_sha256_content_hash, Options, false) of
true ->
add_checksum_hash_header(AdditionalHeaders1, Payload);
false ->
AdditionalHeaders1
end,
Headers1 = aws_request:add_headers(AdditionalHeaders, Headers0),
MethodBin = aws_request:method_to_binary(Method),
SignedHeaders = aws_request:sign_request(Client1, MethodBin, URL, Headers1, Payload),
Response = hackney:request(Method, URL, SignedHeaders, Payload, Options),
DecodeBody = not proplists:get_value(receive_body_as_binary, Options),
handle_response(Response, SuccessStatusCode, DecodeBody).
add_checksum_hash_header(Headers, Body) ->
[ {<<"X-Amz-CheckSum-SHA256">>, base64:encode(crypto:hash(sha256, Body))}
| Headers
].
handle_response({ok, StatusCode, ResponseHeaders}, SuccessStatusCode, _DecodeBody)
when StatusCode =:= 200;
StatusCode =:= 202;
StatusCode =:= 204;
StatusCode =:= 206;
StatusCode =:= SuccessStatusCode ->
{ok, {StatusCode, ResponseHeaders}};
handle_response({ok, StatusCode, ResponseHeaders}, _, _DecodeBody) ->
{error, {StatusCode, ResponseHeaders}};
handle_response({ok, StatusCode, ResponseHeaders, Client}, SuccessStatusCode, DecodeBody)
when StatusCode =:= 200;
StatusCode =:= 202;
StatusCode =:= 204;
StatusCode =:= 206;
StatusCode =:= SuccessStatusCode ->
case hackney:body(Client) of
{ok, <<>>} when StatusCode =:= 200;
StatusCode =:= SuccessStatusCode ->
{ok, #{}, {StatusCode, ResponseHeaders, Client}};
{ok, Body} ->
Result = case DecodeBody of
true ->
try
jsx:decode(Body)
catch
Error:Reason:Stack ->
erlang:raise(error, {body_decode_failed, Error, Reason, StatusCode, Body}, Stack)
end;
false -> #{<<"Body">> => Body}
end,
{ok, Result, {StatusCode, ResponseHeaders, Client}}
end;
handle_response({ok, StatusCode, _ResponseHeaders, _Client}, _, _DecodeBody)
when StatusCode =:= 503 ->
%% Retriable error if retries are enabled
{error, service_unavailable};
handle_response({ok, StatusCode, ResponseHeaders, Client}, _, _DecodeBody) ->
{ok, Body} = hackney:body(Client),
try
DecodedError = jsx:decode(Body),
{error, DecodedError, {StatusCode, ResponseHeaders, Client}}
catch
Error:Reason:Stack ->
erlang:raise(error, {body_decode_failed, Error, Reason, StatusCode, Body}, Stack)
end;
handle_response({error, Reason}, _, _DecodeBody) ->
{error, Reason}.
build_host(_EndpointPrefix, #{region := <<"local">>, endpoint := Endpoint}) ->
Endpoint;
build_host(_EndpointPrefix, #{region := <<"local">>}) ->
<<"localhost">>;
build_host(EndpointPrefix, #{region := Region, endpoint := Endpoint}) ->
aws_util:binary_join([EndpointPrefix, Region, Endpoint], <<".">>).
build_url(Host, Path0, Client) ->
Proto = aws_client:proto(Client),
Path = erlang:iolist_to_binary(Path0),
Port = aws_client:port(Client),
aws_util:binary_join([Proto, <<"://">>, Host, <<":">>, Port, Path], <<"">>).
-spec encode_payload(undefined | map()) -> binary().
encode_payload(undefined) ->
<<>>;
encode_payload(Input) ->
jsx:encode(Input).