leejh eb0f86578d 1. 다른디바이스와의 Sync 처리. ::: EVENT_RES, EVENT_READ_RES
2. 대화리스트의 finalEventMessage 갱신되지 않는 문제 수정 :: virture scroll 처리 제거.
2019-10-29 10:10:08 +09:00

195 lines
4.7 KiB
TypeScript

import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import {
map,
takeWhile,
timeout,
take,
share,
filter,
tap
} from 'rxjs/operators';
import { ProtocolService } from '@ucap-webmessenger/protocol';
import {
InfoRequest,
InfoResponse,
encodeInfo,
decodeInfo,
decodeInfoData,
InfoData
} from '../protocols/info';
import {
SVC_TYPE_EVENT,
SSVC_TYPE_EVENT_INFO_REQ,
SSVC_TYPE_EVENT_INFO_RES,
SSVC_TYPE_EVENT_INFO_DATA,
SSVC_TYPE_EVENT_SEND_REQ,
SSVC_TYPE_EVENT_PUSH_CL_REQ,
SSVC_TYPE_EVENT_READ_REQ,
SSVC_TYPE_EVENT_DEL_REQ,
SSVC_TYPE_EVENT_CANCEL_REQ,
SSVC_TYPE_EVENT_CANCEL_NOTI,
SSVC_TYPE_EVENT_SEND_NOTI,
SSVC_TYPE_EVENT_READ_NOTI,
SSVC_TYPE_EVENT_DEL_RES,
SSVC_TYPE_EVENT_SEND_RES,
SSVC_TYPE_EVENT_READ_RES
} from '../types/service';
import {
SendRequest,
SendResponse,
decodeSend,
encodeSend,
decodeSendNotification,
SendNotification
} from '../protocols/send';
import { PushRequest, encodePush } from '../protocols/push';
import {
ReadResponse,
ReadRequest,
encodeRead,
decodeRead,
decodeReadNotification,
ReadNotification
} from '../protocols/read';
import {
CancelRequest,
CancelResponse,
encodeCancel,
decodeCancel,
CancelNotification,
decodeCancelNotification
} from '../protocols/cancel';
import {
decodeDelNotification,
DelNotification,
DelRequest,
DelResponse,
encodeDel,
decodeDel
} from '../protocols/del';
type Notifications =
| SendNotification
| ReadNotification
| CancelNotification
| DelNotification;
@Injectable({
providedIn: 'root'
})
export class EventProtocolService {
private notificationSubject: Subject<Notifications>;
public notification$: Observable<Notifications>;
constructor(private protocolService: ProtocolService) {
this.notificationSubject = new Subject();
this.notification$ = this.notificationSubject.asObservable().pipe(share());
this.protocolService.serverMessage
.pipe(
filter(message => message.serviceType === SVC_TYPE_EVENT),
tap(message => {
switch (message.subServiceType) {
case SSVC_TYPE_EVENT_SEND_RES:
case SSVC_TYPE_EVENT_SEND_NOTI:
{
this.notificationSubject.next(decodeSendNotification(message));
}
break;
case SSVC_TYPE_EVENT_READ_RES:
case SSVC_TYPE_EVENT_READ_NOTI:
{
this.notificationSubject.next(decodeReadNotification(message));
}
break;
case SSVC_TYPE_EVENT_CANCEL_NOTI:
{
this.notificationSubject.next(
decodeCancelNotification(message)
);
}
break;
case SSVC_TYPE_EVENT_DEL_RES:
{
this.notificationSubject.next(decodeDelNotification(message));
}
break;
default:
break;
}
})
)
.subscribe();
}
public info(req: InfoRequest): Observable<InfoResponse | InfoData> {
return this.protocolService
.call(SVC_TYPE_EVENT, SSVC_TYPE_EVENT_INFO_REQ, ...encodeInfo(req))
.pipe(
takeWhile(res => SSVC_TYPE_EVENT_INFO_RES !== res.subServiceType, true),
map(res => {
if (SSVC_TYPE_EVENT_INFO_DATA === res.subServiceType) {
return decodeInfoData(res);
}
return decodeInfo(res);
})
);
}
public send(req: SendRequest): Observable<SendResponse> {
return this.protocolService
.call(SVC_TYPE_EVENT, SSVC_TYPE_EVENT_SEND_REQ, ...encodeSend(req))
.pipe(
take(1),
map(res => {
return decodeSend(res);
})
);
}
public push(req: PushRequest): void {
return this.protocolService.send(
SVC_TYPE_EVENT,
SSVC_TYPE_EVENT_PUSH_CL_REQ,
...encodePush(req)
);
}
public read(req: ReadRequest): Observable<ReadResponse> {
return this.protocolService
.call(SVC_TYPE_EVENT, SSVC_TYPE_EVENT_READ_REQ, ...encodeRead(req))
.pipe(
take(1),
map(res => {
return decodeRead(res);
})
);
}
public del(req: DelRequest): Observable<DelResponse> {
return this.protocolService
.call(SVC_TYPE_EVENT, SSVC_TYPE_EVENT_DEL_REQ, ...encodeDel(req))
.pipe(
take(1),
map(res => {
return decodeDel(res);
})
);
}
public cancel(req: CancelRequest): Observable<CancelResponse> {
return this.protocolService
.call(SVC_TYPE_EVENT, SSVC_TYPE_EVENT_CANCEL_REQ, ...encodeCancel(req))
.pipe(
take(1),
map(res => {
return decodeCancel(res);
})
);
}
}