# 정의 ```protobuf service Call { rpc Make(MakeRequest) returns (MakeResponse) rpc Hold(HoldRequest) returns (HoldResponse) rpc Retreive(RetriveRequest) returns (RetriveResponse) rpc Transfer(TransferRequest) returns (TransferResponse) rpc MuteTransfer(MuteTransferRequest) returns (MuteTransferRequest) rpc Conference(ConferenceRequest) returns (ConferenceResponse) rpc MuteConference(MuteConferenceRequest) returns (MuteConferenceResponse) rpc Release(ReleaseRequest) returns (ReleaseResponse) rpc Route(RouteRequest) returns (RouteReponse) rpc EventAlerted(EventAlertedRequest) returns (EventAlertedResponse) rpc EventHeld(EventHeldRequest) returns (EventHeldResponse) rpc EventRetrieved(EventRetrivedRequest) returns (EventRetrivedResponse) rpc EventTransfered(EventTransferedRequest) returns (EventTransferedReponse) rpc EventConferenced(EventConferencedRequest) returns (EventConferencedResponse) rpc EventConnected(EventConnetedRequest) returns (EventConnectedResponse) rpc EventReleased(EventReleasedRequest) returns (EventReleasedResponse) } ``` ## Call.Make(인입호) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant t as Telco participant sts as Sip Trunk Service participant cs as Call Service participant cf as Call Flow Service participant ci as Call Info Service participant ms as Media Service t ->> sts: INVITE (+OSDP1) note over sts: 콜, 발신 연결 생성 sts ->> t: 200 OK t ->> sts: ACK sts ->> cs: call.make req note over cs: 콜 목적지 조회 cs ->> sts: call.make res rect rgba(255, 0, 0, .1) alt 목적지(내선, 사용자, 큐) cs ->> ms: media.play req ms ->> cs: media.play res ms -->> t: 링백톤 재생 cs -> cs: call.route(사용자, 단말, 큐) end end rect rgba(0, 255, 0, .1) alt 목적지(플로우) cs -> cf: flow.start req cf -> cs: flow.start res end end ``` ## Call.Make(내선) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p as Phone participant sls as Sip Line Service participant cs as Call Service participant cf as Call Flow participant ci as Call Info Service participant ms as Media Service p ->> sls: INVITE (+OSDP1) sls ->> p: 200 OK p ->> sls: ACK sls ->> cs: call.make req note over cs: 내선 콜 목적지 조회 cs ->> sls: call.make res rect rgba(255, 0, 0, .1) alt 목적지 국선, 내선 cs ->> ms: media.play req ms ->> cs: media.play res ms -->> p: 링백톤 재생 cs -> cs: call.route(국선, 내선) end end rect rgba(0, 255, 0, .1) alt 목적지 플로우 cs ->> cf: flow.start req cf ->> cs: flow.start res end end ``` ## Call.Make(3PCC) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p as Phone participant a as Agent participant pu as Public Api participant sls as Sip Line Service participant cs as Call Service participant ci as Call Info Service participant ms as Media Service a ->> pu: make.call note over pu: 콜 생성 pu ->> cs: call.make req cs ->> pu: call.make res note over cs: 3PCC 콜 연결 cs ->> sls: sip.newcall(3pcc) req sls ->> cs: sip.newcall(3pcc) res sls ->> p: INVITE p ->> sls: 100 trying p ->> sls: 180 riging sls ->> p: Notify p ->> sls: 200 OK(Notify) p ->> sls: 200 OK sls ->> p: ACK sls ->> cs: call.event.connected req cs ->> sls: call.event.connected res cs ->> cs: call.make(내선) ``` ## Call.Hold(내선) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p1 as Phone1 participant sls1 as Sip Line Service1 participant cs as Call Service participant sls2 as Sip Line Service2 participant p2 as Phone2 participant ci as Call Info Service participant ms as Media Service p1 ->> sls1: INVITE(sendonly) note over sls1: 미디어 재연결(sendonly) sls1 ->> p1: 200 OK p1 ->> sls1: ACK sls1 ->> cs: call.hold req cs ->> sls1: call.hold res note over cs: 번호분석 cs ->> ci: state.device req ci ->> cs: state.device res cs ->> sls2: sip.held req sls2 ->> cs: sip.held res sls2 ->> p2: INVITE(recvonly) p2 ->> sls2: 200 OK note over sls2: 미디어 재연결 sls2 ->> p2: ACK sls2 ->> cs: call.event.held req cs ->> sls2: call.event.held res cs ->> ms: media.play req ms ->> cs: media.play res ms -->> p2: 홀드음 재생 ``` ## Call.Hold(국선) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p as Phone1 participant sls as Sip Line Service participant cs as Call Service participant sts as Sip Trunk Service participant t as Telco participant ci as Call Info Service participant ms as Media Service p ->> sls: INVITE(sendonly) note over sls: 미디어 재연결(sendonly) sls ->> p: 200 OK p ->> sls: ACK sls ->> cs: call.hold req cs ->> sls: call.hold res note over cs: 번호분석 cs ->> ms: media.play req(held) ms ->> cs: media.play res ms -->> t: 홀드음 재생 ``` ## Call.Retrive(내선) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p1 as Phone1 participant sls1 as Sip Line Service1 participant cs as Call Service participant sls2 as Sip Line Service2 participant p2 as Phone2 participant ci as Call Info Service participant ms as Media Service p1 ->> sls1: INVITE(sendrecv) note over sls1: 미디어 재연결(sendrecv) sls1 ->> p1: 200 OK p1 ->> sls1: ACK sls1 ->> cs: call.retrive req cs ->> sls1: call.retrive res note over cs: 번호분석 cs ->> ci: state.device req ci ->> cs: state.device res cs ->> ms: media.stop req ms ->> cs: media.stop res note over ms: 홀드음 정지 cs ->> sls2: sip.retrive req sls2 ->> cs: sip.retrive res sls2 ->> p2: INVITE(sendrecv) p2 ->> sls2: 200 OK note over sls2: 미디어 재연결 sls2 ->> p2: ACK sls2 ->> cs: call.event.retrived req cs ->> sls2: call.event.retrived res ``` ## Call.Retrive(국선) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p as Phone1 participant sls as Sip Line Service participant cs as Call Service participant sts as Sip Trunk Service participant t as Telco participant ci as Call Info Service participant ms as Media Service p ->> sls: INVITE(sendrecv) note over sls: 미디어재연결(sendrecv) sls ->> p: 200 OK p ->> sls: ACK sls ->> cs: call.retrive req cs ->> sls: call.retrive res note over cs: 번호분석 cs ->> ms: media.stop req ms ->> cs: media.stop res ms -->> t: 국선 홀드음 정지 cs ->> sts: sip.retrive req sts ->> cs: sip.retrive res note over sts: 미디어 재연결 sts ->> cs: call.event.retrived req cs ->> sts: call.event.retrived res ``` ## Call.Transfer ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p1 as Phone1 participant p2 as Phone2 participant sls1 as Sip Line Service1 participant sls2 as Sip Line Service2 participant cs as Call Service participant sts as Sip Trunk Service participant t as Telco participant ci as Call Info Service participant ms as Media Service %% CL1: 첫번쨰 콜 발신레그(국선발신) %% CL2: 첫번쨰 콜 착신레그(내선착신) %% CL3: 두번째 콜 발신레그(내선발신) %% CL4: 두번째 콜 착신레그(전달주체) p1 ->> sls1: Refer sls1 ->> p1: 202 Accepted sls1 ->> p1: NOTIFY(100 trying) p1 ->> sls1: 200 OK(NOTIFY) sls1 ->> cs: call.transfered req note over cs: 콜 분석 cs ->> sls1: call.transfered res cs ->> ci: state.device req ci ->> cs: state.device res cs ->> sls2: sip.newcall req sls2 ->> cs: sip.newcall res note over sls2: 콜 착신 연결 요청 note over sls2: 미디어 연결 요청 sls2 ->> p2: INVITE p2 ->> sls2: 180 ringing sls2 ->> cs: call.event.alerted req cs ->> sls2: call.event.alerted res cs ->> ms: media.play req ms ->> cs: media.play res ms -->> t: 국선 링백톤 재생 cs ->> sls1: sip.release req sls1 ->> cs: sip.release res note over sls1: 컨퍼런스 참여해제 note over sls1: 미디어 해제 sls1 ->> p1: BYE p1 ->> sls1: 200 OK sls1 ->> cs: call.event.released req cs ->> sls1: call.event.released res p2 ->> sls2: 200 OK sls2 ->> p2: ACK note over sls2: 미디어 재연결 note over sls2: 컨퍼런스 sls2 ->> cs: call.event.conneted req cs ->> sls2: call.event.conneted res ``` ## Call.MuteTransfer ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant p as Phone participant sls as Sip Line Service participant cs as Call Service participant t as Telco participant ci as Call Info Service participant ms as Media Service %% CL1: 첫번쨰 콜 발신레그(국선발신) %% CL2: 첫번쨰 콜 착신레그(내선착신) %% CL3: 두번째 콜 발신레그(내선발신) %% CL4: 두번째 콜 착신레그(전달주체) p ->> sls: Refer sls ->> p: 202 Accepted sls ->> cs: call.transfer req note over cs: 콜 분석 cs ->> sls: call.transfer res cs ->> ms: media.stop req ms ->> cs: media.stop res ms -->> t: 국선 홀드음 정지(C1-M1) note over cs: (C2-CL4)->(C1-CL4) cs ->> sls: sip.transfer req sls ->> cs: sip.transfer res note over sls: 컨퍼런스 참여해제(C2-CL4) note over sls: 컨퍼런스 참여(C1-CL4) sls ->> p: NOTIFY(200) p ->> sls: 200(NOTIFY) sls ->> cs: call.event.transfered req cs ->> sls: call.event.transfered res cs ->> sls: sip.release req (CL3) sls ->> cs: sip.release res (CL3) note over sls: 컨퍼런스 참여해제 note over sls: 미디어 해제 note over sls: 컨퍼런스 해제 sls ->> p: BYE(CL3) p ->> sls: 200 OK sls ->> cs: call.event.release req(CL3) cs ->> sls: call.event.release res cs ->> sls: sip.release req (CL2) sls ->> cs: sip.release res (CL2) note over sls: 컨퍼런스 참여해제 note over sls: 미디어 해제 sls ->> p: BYE(CL2) p ->> sls: 200 OK sls ->> cs: call.event.release req(CL2) cs ->> sls: call.event.release res ``` ## Call.Conference ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant pa as public API participant p as Phone participant sls as Sip Line Service participant ci as Call Info participant ms as Media Service pa ->> cs : call.conference req note over cs: 콜 분석 cs ->> pa : call.conference res cs ->> sls : sip.conference note over sls: 미디어 생성 note over sls: 연결 생성 sls ->> p: INVITE (orig sdp) p ->> sls: 180 (ans sdp) note over sls: 미디어 재연결 sls ->> cs: call.event.alerted req cs ->> sls: call.event.alerted res p ->> sls: 2xx (ans sdp) sls ->> p : ACK note over sls: 미디어 재연결 note over sls: 컨퍼런스 참여 sls ->> cs: call.event.conferenced req cs ->> sls: call.event.conferenced res ``` ## Call.MuteConference ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant pa as Public Api participant p as Phone participant sls as Sip Line Service participant cs as Call Service participant t as Telco participant ci as Call Info Service participant ms as Media Service %% CL1: 첫번쨰 콜 발신레그(국선발신) %% CL2: 첫번쨰 콜 착신레그(내선착신) %% CL3: 두번째 콜 발신레그(내선발신) %% CL4: 두번째 콜 착신레그(컨퍼런스참여주체) pa ->> cs: call.conference req (CL3) note over cs: 콜분석 cs ->> pa: call.conference res cs ->> ms: media.stop req ms ->> cs: media.stop res ms -->> t: 국선 홀드음 정지(C1-M1) cs ->> sls: sip.conference req sls ->> cs: sip.conference res note over sls: 컨퍼런스 참여(C2-L4) -> (C1) sls ->> cs: call.event.conferenced req cs ->> sls: call.event.conferencedres cs ->> sls: sip.release req(C2-L3) sls ->> cs: sip.release res(C2-L3) note over sls: 미디어 해제 note over sls: 컨퍼런스 해제 sls ->> p: BYE (C2-L3) p ->> sls: 200 (BYE) sls ->> cs: call.event.released req cs ->> sls: call.event.released res ``` ## Call.Route(Device) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant cs as Call Service participant sts as Sip Line Service participant p as Phone participant ci as Call Info Service cs ->> ci: state.device req ci ->> cs: state.device res note over cs: 트렁크 인스턴스 확인 sts ->> cs: command.newcall req cs ->> sts: command.newcall res sts ->> p: INVITE note over sts: 미디어 생성 note over sts: 연결 생성 p->> sts: 183 sts ->> cs: call.event.alerted req cs ->> sts: call.event.alerted res p ->> sts: 200 OK sts ->> p: ACK sts ->> cs: call.event.connected req cs ->> sts: call.event.connected res ``` ## Call.Route(Trunk) ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant cs as Call Service participant sts as Sip Trunk Service participant t as Telco participant ci as Call Info Service note over cs: 발신 라우트 확인 cs ->> ci: state.trunk req ci ->> cs: state.trunk res note over cs: 트렁크 인스턴스 확인 sts ->> cs: command.newcall req cs ->> sts: command.newcall res sts ->> t: INVITE note over sts: 미디어 생성 note over sts: 연결 생성 t->> sts: 183 sts ->> cs: call.event.alerted req cs ->> sts: call.event.alerted res t ->> sts: 200 OK sts ->> t: ACK sts ->> cs: call.event.connected req cs ->> sts: call.event.connected res ``` ## Call.Release ```mermaid sequenceDiagram %%{init: {'securityLevel': 'loose', 'theme':'base'}}%% autonumber participant t as Telco participant sts as Sip Trunk Service participant cs as Call Service participant sls as Sip Line Service participant ci as Call Info Service t ->> sts: BYE note over sts: 미디어 해제 note over sts: 연결 해제 sts ->> t: 200 OK sts ->> cs: call.release req cs ->> sts: call.release res note over cs: 해제할 콜 확인 cs ->> sls: sip.release req sls ->> cs: sip.release res note over sls: 미디어 해제 note over sls: 연결 해제 cs ->> ci: callinfo.free req ci ->> cs: callinfo.free res ```