Amazonでの着信コールの切断または拒否
Connect Streams APIのContact オブジェクトに対して、コールの受入れ、拒否、切断、ミュートなどのすべてのコール関連操作が実行されます。 
 contact.reject()関数を使用してコールを拒否し、 contact.getAgentConnection().destroy()関数を使用してコールを切断できます。 
コールは、次の3つの方法のいずれかで切断できます:
- エージェントは、コールが受け入れられる前に着信コールを拒否します。
- エージェントは、会話の完了後にコールを切断します。
- 顧客がコールを切断します。
シナリオ1: エージェントは、コールが受け入れられる前に着信コールを拒否
次のフロー図は、エージェントがFusionアプリケーションまたはメディア・ツールバー・アプリケーションでのコールを拒否した後に実行される操作の順序を示しています:

- エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを拒否できます。 エージェントがFusionアプリケーションの「辞退」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンドrejectで起動されます。
- パートナ・アプリケーションは、このイベントを受信し、イベントがコールを拒否する場合、Amazon Connect StreamsAPIをコールしてコールを拒否できます。
- CTIサプライヤがパートナ・アプリケーションにコールが拒否されたことを通知した後、パートナ・アプリケーションはcloseCommEventアクションを理由としてREJECTとして起動できます。
- Fusionアプリケーションがこのアクションを識別すると、コール・ダイアログ・ボックスはUIから破棄されます。
rejectCallの例を更新します:
public async rejectCall(): Promise<void> {
    this.contact.reject({
        success: () => {
            console.log("Rejected call")
        },
        failure: (err: any) => {
            console.error("Reject error", err);
        }
    });
}シナリオ2: 会話が完了すると、エージェントはコールを切断
次のフロー図は、エージェントがFusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを切断した後に実行される一連の操作を示しています:

- エージェントは、Fusionアプリケーションまたはメディア・ツールバー・アプリケーションからコールを拒否できます。 エージェントがFusionアプリケーションの「辞退」ボタンをクリックすると、onToolbarInteractionCommandイベントがコマンドrejectで起動されます。
- パートナ・アプリケーションは、このイベントを受信し、イベントがコールをdisconnectする場合、コールを切断するAmazon Connect StreamsAPIをコールできます。
- CTIサプライヤがパートナ・アプリケーションにコールが拒否されたことを通知した後、パートナ・アプリケーションはcloseCommEventアクションを理由としてHANGUPとして起動できます。
- Fusionアプリケーションは、アクションを識別した後、「まとめ」ウィンドウを表示します。
hangupCallの例を更新します:
public async hangupCall(): Promise<void> {
    this.contact.getAgentConnection().destroy({
        success: function () {
            console.log("Contact complete disconnected");
            this.contact.clear({
                success: function () {
                    console.log("Contact call clearContact");
                },
                failure: function (err: any) {
                    console.log("Contact call clearContact failure", err);
                },
            });
        },
        failure: function (err: any) {
            console.log("Contact call complete failure", err);
        },
    });
}シナリオ3: 顧客はコールを切断
次のフロー図は、顧客がコールを切断したときに実行される一連の操作を示しています:

- 顧客がコールを切断すると、Amazon Connectはdisconnectedイベントを起動します。
- rejectおよび- disconnectイベント用のイベント・リスナーをメディア・ツールバー・アプリケーションに追加します。
- closeCommEventアクションは、- REJECTまたは- WRAPUPという理由でメディア・ツールバー・アプリケーションから起動されます。
- Fusionアプリケーションは、アクションを識別した後、「まとめ」ウィンドウを表示します。
完全なコード
import { ICtiVendorHandler } from './ICtiVendorHandler';
import "amazon-connect-streams";
import { IntegrationEventsHandler } from '../integrationEventsHandler';
 
export class VendorHandler implements ICtiVendorHandler {
    private connect: any;
    private agent: any;
    private contact: any;
    private integrationEventsHandler: IntegrationEventsHandler;
    private eventId: string = '';
 
    constructor(integrationEventsHandler: IntegrationEventsHandler) {
        this.integrationEventsHandler = integrationEventsHandler;
        this.connect = (window as any)["connect"];
    }
    public async makeAgentAvailable(): Promise<void> {
        if (!this.agent) {
            this.init();
            this.subscribeForAmazonEvents();
            this.subscribeContactEvents();
        } else {
            let state = this.agent.getAgentStates()[0];
            this.agent.setState(state);
        }
    }
    public async makeAgentUnavailable(): Promise<void> {
        let state = this.agent.getAgentStates()[1];
        this.agent.setState(state);
    }
    public async makeOutboundCall(phoneNumber: string, eventId: string): Promise<void> {
    }
    public async acceptCall(): Promise<void> {
        this.contact.accept();
    }
    public async rejectCall(): Promise<void> {
        this.contact.reject({
            success: () => {
                console.log("Rejected call")
            },
            failure: (err: any) => {
                console.error("Reject error", err);
            }
        });
    }
    public async hangupCall(): Promise<void> {
        this.contact.getAgentConnection().destroy({
            success: function () {
                console.log("Contact complete disconnected");
                /*
                this.contact.clear({
                    success: function () {
                        console.log("Contact call clearContact");
                    },
                    failure: function (err: any) {
                        console.log("Contact call clearContact failure", err);
                    },
                });
                */
            },
            failure: function (err: any) {
                console.log("Contact call complete failure", err);
            },
        });
    }
 
    // Intialize Amazon connect ccp
    private init() {
        const containerDiv = document.getElementById("amazon-connect-cca-container");
        this.connect.core.initCCP(containerDiv, {
            ccpUrl: 'https://cti-amazon-connect-demo.my.connect.aws/ccp-v2', // REQUIRED
            loginPopup: true, // optional, defaults to `true`
            loginPopupAutoClose: true, // optional, defaults to `false`
            loginOptions: {
                // optional, if provided opens login in new window
                autoClose: true, // optional, defaults to `false`
                height: 600, // optional, defaults to 578
                width: 400, // optional, defaults to 433
                top: 0, // optional, defaults to 0
                left: 0, // optional, defaults to 0
            },
            region: "eu-west-2", // REQUIRED for `CHAT`, optional otherwise
            softphone: {
                // optional, defaults below apply if not provided
                allowFramedSoftphone: true, // optional, defaults to false
                disableRingtone: false, // optional, defaults to false
            },
            pageOptions: {
                //optional
                enableAudioDeviceSettings: false, //optional, defaults to 'false'
                enableVideoDeviceSettings: false, //optional, defaults to 'false'
                enablePhoneTypeSettings: true, //optional, defaults to 'true'
            },
            ccpAckTimeout: 5000, //optional, defaults to 3000 (ms)
            ccpSynTimeout: 3000, //optional, defaults to 1000 (ms)
            ccpLoadTimeout: 10000, //optional, defaults to 5000 (ms)
        });
    }
 
    private subscribeForAmazonEvents() {
        this.connect.agent((agent: any) => {
            this.agent = agent;
            let state = this.agent.getAgentStates()[0];
            this.agent.setState(state);
        });
    }
 
    private subscribeContactEvents() {
        this.connect.contact((contact: any) => {
            this.contact = contact;
            this.eventId = contact.contactId;
            contact.onConnecting((contact: any) => {
                console.log("Contact onConnecting >", contact);
                const phoneNumber = contact.getActiveInitialConnection().getEndpoint().phoneNumber;
                this.integrationEventsHandler.incomingCallHandler(phoneNumber, this.eventId);
            });
            contact.onAccepted((contact: any) => {
                console.log("Contact onAccepted >", contact);
                this.integrationEventsHandler.outboundCallAcceptedHandler(this.eventId);
            });
            contact.onEnded(async (contact: any) => {
                console.log("Contact onEnded >", contact);
                this.integrationEventsHandler.callHangupHandler(this.eventId);
            });
            contact.onMissed((contact: any) => {
                console.log("Contact onMissed >", contact);
                this.integrationEventsHandler.callRejectedHandler(this.eventId);
            });
        });
    }
 
}進捗の確認
Fusionアプリケーションにサインインし、メディア・ツールバーを開きます。 メディア・ツールバー・アプリケーションの「エージェント可用性」ボタンをクリックします。 
        - インバウンド・コールを行い、Fusionアプリケーションとツールバー・ウィンドウの両方で着信コール通知を確認します。 コールを拒否すると、コール通知がクローズします。
- インバウンド・コールを行い、Fusionアプリケーションとツールバー・ウィンドウの両方で着信コール通知を確認します。 コールを受け入れて、Fusionアプリケーションからのコールを終了すると、エンゲージメントはwrapup状態に変更されます。
- インバウンド・コールを行い、Fusionアプリケーションとツールバー・ウィンドウの両方で着信コール通知を確認します。 コールを受け入れてから、ユーザー側からのコールを終了すると、エンゲージメントはwrapup状態に変更されます。