# 정의
```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
```