-
Notifications
You must be signed in to change notification settings - Fork 2
Websocket Protocol Specification
Rhee Jung In edited this page Dec 9, 2021
·
15 revisions
LiveClass는 실시간 통신을 위해 대부분의 IO를 Websocket을 이용해서 처리합니다.
웹소켓 프로토콜을 위해서 room 기능과 broadcasting 기능을 제공하는 socket.io 라이브러리를 사용하였습니다.
이 문서는 다음과 같이 구성되어 있습니다.
- 이벤트 이름
- 이벤트가 Client -> Server로 emit될 때 필요한 data type
- 서버 상태 변화
- 이벤트가 Server -> Client로 emit될 때 지니는 data type
Class에 접속할 때와, 접속한 이후로 사용되는 이벤트들입니다.
Classroom에 입장하는 프로토콜입니다.
- Data
{
classUuid: string
}- Server State Change
classUuid에 해당하는 Class 소켓 룸으로 입장합니다.
- Data
{
classUuid: string;
instructor: // instructor information
{
userId: number;
userName: string;
memberType: MemberType.INSTRUCTOR;
},
status: number
}해당 Class의 Lecture들을 요청한 Client에게 보내줍니다.
- Data
{
classUuid: string
}- Server State
No Change
- Data
{
lectures: Lecture[]; // server/src/data/lecture.ts
status: number
}- Data
{
classUuid: string;
lectureDate: Date;
lectureName: string;
playlist: string;
}- Server State
- Save lecture in DB with given data type
- Broadcast created lecture to class socket room
- Send Back created lecture to client
- Data
{
lecture: Lecture; // server/src/data/lecture.ts
status: number;
}- Data
{
classUuid: string;
}- Server State
No Change- Data
{
members: Member[]; // server/src/data/member.ts
status: number;
}-
Data { classUuid: string; lectureId: number; }
-
Server State
- Check if user is in lecture. 2-1. If he or she is in the lecture, do nothing. 2-2. If he is not in the lecture, join user into lecture socket room and broadcast that user joined to lecture room.
- Send back user and lecture information to requested user (in both above cases)
- Data
{
user: UserEntity; // server/src/entity/userEntity.ts
lecture: Lecture; // server/src/data/lecture.ts
status: number;
}- Data
{
classUuid:string;
lectureId:number;
}- Server State
- Exit lecture socket room
- If user it instructor and lecture was on live, stop live end broadcast live stop event
- Broadcast changed active lecture member to lecture socket room
- Broadcast lecture information to class socket room
- Data
This Event shouldn't be emitted to client
- Data
{
classUuid: string;
lectureId: number;
}- Server State
No Change
- Data
{
members: Member[]; // array of lecture participants
status: number;
}- Data
{
classUuid: string;
lectureId: number;
status: boolean;
}- Server State
- Set lecture live status to given status
- Broadcast live status to user, lecture room
- Broadcast lecture information to class socket room
- Data
{
liveStatus: boolean;
status: number;
}
- Data
{
classUuid: string;
lectureId: number;
newtime: number;
}- Server State
- Data
- Data
{
classUuid: string;
lectureId: number;
}- Server State
No Change
- Data
undefined // No data, Just event
- Data
{
classUuid: string;
lectureId: number;
}- Server State
No Change
- Data
undefined // No data, Just event
- Data
{
classUuid: string;
lectureId: number;
selectedVideoIdx: number;
}- Server State Set video index of lecture to given index
- Data
{
selectedVideoIdx: number;
status: number;
}- Data
{
classUuid: string;
lectureId: number;
text: string;
}- Server State
- Try translating in both Korean & English
- Create Message (
server/src/types/index.ts:18) - Store message to lecture
- Broadcast message to lecture room
- Data
{
message: Message;
status: number;
}
- Data
{
classUuid: string;
lectureId: number;
arrayBuffer: ArrayBuffer;
}- Server State Broadcast audio message to lecture room
- Data
{
senderId: number;
arrayBuffer: ArrayBuffer;
}- Data
{
classUuid: string;
lectureId: number;
marker: // MarkerRequest
{
markerType: MarkerType;
videoIndex: number;
time: number;
}
}- Server State
- Save marker information in DB using given MarkerRequest data
- Add marker into lecture
- Broadcast marker info to lecture room
- Data
{
marker: Marker; // server/src/data/marker.ts
status: number;
}- Data
{
classUuid: string;
lectureId: number;
markerTextMessage:
{
markerId: number;
message: string;
}
}- Server State
- Try to translate
- Save marker message into DB
- Create message that has
Message & { messageId: number }type - Broadcast it to lecture room
- Data
{
markerId: number;
savedMessage: Message & { messageId: number };
status: number;
}
- Data
{
markerId: number;
}- Server State
No Change
- Data
{
textMessages: (Message & { messageId: number })[];
status: number;
}
- Data
{
classUuid: string;
lectureId: number;
videoIndex: number;
}- Server State
No Change- Data
{
markers: Marker[]; // markers of given video index
status: number;
}