115 lines
2.8 KiB
TypeScript
115 lines
2.8 KiB
TypeScript
import { Injectable } from '@angular/core';
|
|
|
|
import { Observable, Subject } from 'rxjs';
|
|
import { map, take, share, filter, tap } from 'rxjs/operators';
|
|
|
|
import { ProtocolService } from '@ucap-webmessenger/protocol';
|
|
import {
|
|
SVC_TYPE_INFO,
|
|
SSVC_TYPE_INFO_USER_REQ,
|
|
SSVC_TYPE_INFO_STATE_REQ,
|
|
SSVC_TYPE_INFO_USER_OPTION_REQ,
|
|
SSVC_TYPE_INFO_USER_OPTION_UPD_REQ,
|
|
SSVC_TYPE_INFO_USER_NOTI
|
|
} from '../types/service';
|
|
import {
|
|
UserRequest,
|
|
encodeUser,
|
|
UserResponse,
|
|
decodeUser,
|
|
decodeUserNotification,
|
|
UserNotification
|
|
} from '../protocols/user';
|
|
import {
|
|
StatusRequest,
|
|
StatusResponse,
|
|
encodeStatus,
|
|
decodeStatus
|
|
} from '../protocols/status';
|
|
import {
|
|
UserOptionResponse,
|
|
decodeUserOption,
|
|
UserOptionUpdateRequest,
|
|
encodeUserOptionUpdate,
|
|
UserOptionUpdateResponse,
|
|
decodeUserOptionUpdate
|
|
} from '../protocols/user-option';
|
|
|
|
type Notifications = UserNotification;
|
|
|
|
@Injectable({
|
|
providedIn: 'root'
|
|
})
|
|
export class InfoProtocolService {
|
|
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_INFO),
|
|
tap(message => {
|
|
switch (message.subServiceType) {
|
|
case SSVC_TYPE_INFO_USER_NOTI:
|
|
{
|
|
this.notificationSubject.next({
|
|
...decodeUserNotification(message),
|
|
Type: SSVC_TYPE_INFO_USER_NOTI
|
|
});
|
|
}
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
})
|
|
)
|
|
.subscribe();
|
|
}
|
|
|
|
public user(req: UserRequest): Observable<UserResponse> {
|
|
return this.protocolService
|
|
.call(SVC_TYPE_INFO, SSVC_TYPE_INFO_USER_REQ, ...encodeUser(req))
|
|
.pipe(
|
|
take(1),
|
|
map(res => decodeUser(res))
|
|
);
|
|
}
|
|
|
|
public status(req: StatusRequest): Observable<StatusResponse> {
|
|
return this.protocolService
|
|
.call(SVC_TYPE_INFO, SSVC_TYPE_INFO_STATE_REQ, ...encodeStatus(req))
|
|
.pipe(
|
|
take(1),
|
|
map(res => decodeStatus(res))
|
|
);
|
|
}
|
|
|
|
public userOption(): Observable<UserOptionResponse> {
|
|
return this.protocolService
|
|
.call(SVC_TYPE_INFO, SSVC_TYPE_INFO_USER_OPTION_REQ)
|
|
.pipe(
|
|
take(1),
|
|
map(res => decodeUserOption(res))
|
|
);
|
|
}
|
|
|
|
public userOptionUpdate(
|
|
req: UserOptionUpdateRequest
|
|
): Observable<UserOptionUpdateResponse> {
|
|
return this.protocolService
|
|
.call(
|
|
SVC_TYPE_INFO,
|
|
SSVC_TYPE_INFO_USER_OPTION_UPD_REQ,
|
|
...encodeUserOptionUpdate(req)
|
|
)
|
|
.pipe(
|
|
take(1),
|
|
map(res => decodeUserOptionUpdate(res))
|
|
);
|
|
}
|
|
}
|