public replyReceived()

in Node/calling/src/dialogs/Prompts.ts [112:284]


    public replyReceived(session: ses.CallSession): void {
        var args: IPromptArgs = session.dialogData;
        var results = <IConversationResult>session.message;
        if (results.operationOutcome) {
            // Parse response
            var state = PromptResponseState.completed;
            var retryPrompt: any;
            var response: any;
            switch (args.promptType) {
                case PromptType.action:
                    response = results.operationOutcome;
                    break;
                case PromptType.choice:
                    var recognizeOutcome = <IRecognizeOutcome>results.operationOutcome;
                    var choiceOutcome = <IChoiceOutcome>(recognizeOutcome.choiceOutcome || {});
                    switch (choiceOutcome.completionReason) {
                        case recognize.RecognitionCompletionReason.dtmfOptionMatched:
                        case recognize.RecognitionCompletionReason.speechOptionMatched:
                            response = { entity: choiceOutcome.choiceName, score: 1.0 };
                            break;
                        case recognize.RecognitionCompletionReason.callTerminated:
                            state = PromptResponseState.terminated;
                            break;
                        case recognize.RecognitionCompletionReason.temporarySystemFailure:
                            state = PromptResponseState.failed;
                            break;
                        case recognize.RecognitionCompletionReason.incorrectDtmf:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidDtmfPrompt;
                            break;
                        case recognize.RecognitionCompletionReason.initialSilenceTimeout:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.recognizeSilencePrompt;
                            break;
                        default:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidRecognizePrompt;
                            break;
                    }
                    break;
                case PromptType.confirm:
                    var recognizeOutcome = <IRecognizeOutcome>results.operationOutcome;
                    var choiceOutcome = <IChoiceOutcome>(recognizeOutcome.choiceOutcome || {});
                    switch (choiceOutcome.completionReason) {
                        case recognize.RecognitionCompletionReason.dtmfOptionMatched:
                        case recognize.RecognitionCompletionReason.speechOptionMatched:
                            switch (choiceOutcome.choiceName) {
                                case 'yes':
                                    response = true;
                                    break;
                                case 'no':
                                default:
                                    response = false;
                                    break;
                                case 'cancel':
                                    state = PromptResponseState.canceled;
                                    break;
                            }
                            break;
                        case recognize.RecognitionCompletionReason.callTerminated:
                            state = PromptResponseState.terminated;
                            break;
                        case recognize.RecognitionCompletionReason.temporarySystemFailure:
                            state = PromptResponseState.failed;
                            break;
                        case recognize.RecognitionCompletionReason.incorrectDtmf:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidDtmfPrompt;
                            break;
                        case recognize.RecognitionCompletionReason.initialSilenceTimeout:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.recognizeSilencePrompt;
                            break;
                        default:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidRecognizePrompt;
                            break;
                    }
                    break;
                case PromptType.digits:
                    var recognizeOutcome = <IRecognizeOutcome>results.operationOutcome;
                    var digitsOutcome = <ICollectDigitsOutcome>(recognizeOutcome.collectDigitsOutcome || {});
                    switch (digitsOutcome.completionReason) {
                        case recognize.DigitCollectionCompletionReason.completedStopToneDetected:
                            response = digitsOutcome.digits;
                            break;
                        case recognize.DigitCollectionCompletionReason.interdigitTimeout:
                            var stopTones = (<IRecognizeAction>args.action).collectDigits.stopTones;
                            if (stopTones && stopTones.length > 0) {
                                state = PromptResponseState.retry;
                                retryPrompt = Prompts.settings.invalidRecognizePrompt;
                            } else {
                                response = digitsOutcome.digits;
                            }
                            break;
                        case recognize.DigitCollectionCompletionReason.callTerminated:
                            state = PromptResponseState.terminated;
                            break;
                        case recognize.DigitCollectionCompletionReason.temporarySystemFailure:
                            state = PromptResponseState.failed;
                            break;
                        case recognize.DigitCollectionCompletionReason.initialSilenceTimeout:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.recognizeSilencePrompt;
                            break;
                        default:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidRecognizePrompt;
                            break;
                    }
                    break;
                case PromptType.record:
                    var recordOutcome = <IRecordOutcome>results.operationOutcome;
                    switch (recordOutcome.completionReason) {
                        case record.RecordingCompletionReason.completedSilenceDetected:
                        case record.RecordingCompletionReason.completedStopToneDetected:
                            response = <record.IRecording>{
                                recordedAudio: results.recordedAudio,
                                lengthOfRecordingInSecs: recordOutcome.lengthOfRecordingInSecs
                            };
                            break;
                        case record.RecordingCompletionReason.callTerminated:
                            state = PromptResponseState.terminated;
                            break;
                        case record.RecordingCompletionReason.temporarySystemFailure:
                            state = PromptResponseState.failed;
                            break;
                        case record.RecordingCompletionReason.initialSilenceTimeout:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.recordSilencePrompt;
                            break;
                        case record.RecordingCompletionReason.maxRecordingTimeout:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.maxRecordingPrompt;
                            break;
                        default:
                            state = PromptResponseState.retry;
                            retryPrompt = Prompts.settings.invalidRecordingPrompt;
                            break;
                    }
                    break;
            }

            // Route response
            switch(state) {
                case PromptResponseState.canceled:
                    session.endDialogWithResult({ resumed: dlg.ResumeReason.canceled });
                    break;
                case PromptResponseState.completed:
                    session.endDialogWithResult({ resumed: dlg.ResumeReason.completed, response: response  });
                    break;
                case PromptResponseState.failed:
                    session.endDialogWithResult(<any>{ resumed: dlg.ResumeReason.notCompleted, error: new Error('prompt error: service encountered a temporary failure'), promptType: args.promptType });
                    break;
                case PromptResponseState.retry:
                    if (args.maxRetries > 0) {
                        args.maxRetries--;
                        session.send(retryPrompt);
                        session.send(args.action);
                        session.sendBatch();
                    } else {
                        session.endDialogWithResult({ resumed: dlg.ResumeReason.notCompleted });
                    }
                    break;
                case PromptResponseState.terminated:
                    session.endConversation();
                    break;
            }
        } else {
            var msg = results.operationOutcome ? results.operationOutcome.failureReason : 'Message missing operationOutcome.';
            session.endDialogWithResult(<any>{ resumed: dlg.ResumeReason.notCompleted, error: new Error('prompt error: ' + msg), promptType: args.promptType });
        }
    }