# Quick Start

Omnitalk SDK는 쉽고 간편하게 WebRTC 기술을 이용할 수 있도록 만들어진 패키지입니다. Omnitalk SDK의 모든 API는 async \~ await 구조로 작성되었습니다. 요청이 실패하면 에러를 throw 합니다. 상세 API 사용법은[Typescript API ](https://docs.omnitalk.io/typescript/api-reference)를 참조 바랍니다.

## 1:1 영상 통화

### 1. 옴니톡 객체 생성

[콘솔](https://omnitalk.io/console/service/service-id)에서 발급받은 Service ID로 Omnitalk 객체를 생성합니다.

```typescript
import { Omnitalk } from "omnitalk-ts-sdk";

const SERVICE_ID = '발급받은 service id';
const SERVICE_KEY = '발급받은 service key';

Omnitalk.sdkInit(SERVICE_ID, SERVICE_KEY);
const sdk = Omnitalk.getInstance();
```

### 2. 세션 생성

인수로 전달한 user\_id로 세션을 생성하게 됩니다. user\_id 생략시 Omnitalk 서버에서 임의의 ID를 부여합니다.

```typescript
const sessionResult = await sdk.createSession('alice');
const session = sessionResult.session
```

### 3. 발신

1:1 영상 통화를 구현하기 위한 발신 기능은 offerCall API를 이용합니다. 영상을 화면에 재생하기 위해서 caller 및 callee의 영상을 담을 사용자 지정 tag id를 전달할 수 있습니다(미지정시 옴니톡 [Tag Rule](https://docs.omnitalk.io/api-reference#audio-video-tag-rule)에 따른 id를 사용하시면 됩니다).

offerCall 호출이 성공하면 caller에게는 `RINGBACK_EVENT`가, callee에게는 `RINGING_EVENT`가 전달됩니다.

```typescript
import { CALL_TYPE } from "omnitalk-ts-sdk/dist/public-types/common";

const localVideo = 'videotag1';
const remoteVideo = 'videotag2'; 
const callee = 'test@omnistory.net';

await sdk.offerCall(CALL_TYPE.VIDEO_CALL, callee, true, localVideo, remoteVideo);
```

### 4. 수신

callee측에서는 `RINGING_EVENT`를 받고 통화를 수락하거나 거절할 수 있습니다. 통화 수락은 [answerCall API](https://docs.omnitalk.io/api-reference#answercall)를 이용합니다. 영상을 화면에 재생하기 위해서 caller 및 callee의 영상을 담을 사용자 지정 tag id를 전달할 수 있습니다(미지정시 옴니톡 [Tag Rule](https://docs.omnitalk.io/api-reference#audio-video-tag-rule)에 따른 id를 사용하시면 됩니다).

answerCall이 정상적으로 수행되면 caller, callee 양측은 `CONNECTED_EVENT`를 받습니다. 수신 거절은[ leave API](https://docs.omnitalk.io/api-reference#leave)를 이용하시면 됩니다.

```typescript
import { OmniEvent } from "omnitalk-ts-sdk/dist/public-types/common"

sdk.on('event', async(msg) => {
    if (msg.cmd == OmniEvent.RINGING_EVENT) {
        const ringingMsg = msg as EventRinging;
        await omnitalk.answerCall();
    } else if (msg.cmd == OmniEvent.CONNECTED_EVENT) {
	console.log(msg.session);
    }
});
```

## 영상 회의

### 1. 옴니톡 객체 생성

[콘솔](https://omnitalk.io/console/service/service-id)에서 발급받은 Service ID로 Omnitalk 객체를 생성합니다.

```typescript
import { Omnitalk } from "omnitalk-ts-sdk";

const SERVICE_ID = '발급받은 service id';
const SERVICE_KEY = '발급받은 service key';

Omnitalk.sdkInit(SERVICE_ID, SERVICE_KEY);
const sdk = Omnitalk.getInstance();
```

### 2. 세션 생성

인수로 전달한 user\_id로 세션을 생성하게 됩니다. user\_id 생략시 Omnitalk 서버에서 임의의 ID를 부여합니다.

```typescript
const sessionResult = await sdk.createSession('alice');
const session = sessionResult.session
```

### 3. 룸 생성

영상 회의를 위한 룸을 생성합니다.

```typescript
import { VIDEOROOM_TYPE } from "omnitalk-ts-sdk/dist/public-types/common"

const roomResult = await sdk.createRoom(VIDEOROOM_TYPE.VIDEO_ROOM);
```

### 4. 룸 참여

룸에 참여하게 되면 음성과 채팅 메시지를 주고 받을 수 있는 상태가 됩니다.

```typescript
const roomId = roomResult.room_id;
await sdk.joinRoom(roomId);
```

### 5. 방송 시작

publish API 호출시 방송을 시작합니다. 영상을 화면에 재생하기 사용자 지정 tag id를 전달할 수 있습니다(미지정시 옴니톡 [Tag Rule](https://docs.omnitalk.io/api-reference#audio-video-tag-rule)에 따른 id를 사용하시면 됩니다).

```typescript
cosnt pubResult = await sdk.publish('Omnitalk-LocalVideo-0');
```

### 6. 방송 구독

구독하고자는 방송의 session을 인수로 전달하면 해당 방송을 구독할 수 있습니다. 영상을 화면에 재생하기 사용자 지정 tag id를 전달할 수 있습니다(미지정시 옴니톡 [Tag Rule](https://docs.omnitalk.io/api-reference#audio-video-tag-rule)에 따른 id를 사용하시면 됩니다).

```typescript
const pubSession = pubResult.session;
await sdk.subscribe(pubSession, 'Omnitalk-RemoteVideo-0');
```
