frontend-tutorial-framework/src/app/services/websocket.service.ts

43 lines
1.0 KiB
TypeScript

import { Injectable } from '@angular/core';
import { Observable } from 'rxjs';
import { webSocket, WebSocketSubject } from 'rxjs/webSocket';
import { filter, map } from 'rxjs/operators';
import { WebSocketMessage } from '../message-types/websocket-message';
export enum Scope {
ZMQ = 'zmq',
WEBSOCKET = 'websocket'
}
export enum Intent {
CONTROL = 'control',
EVENT = 'event'
}
@Injectable()
export class WebSocketService {
private ws: WebSocketSubject<WebSocketMessage>;
constructor() {}
public connect() {
if (!this.ws) {
const wsproto = (location.protocol === 'https:') ? 'wss://' : 'ws://';
const connAddr = wsproto + window.location.host + '/ws';
this.ws = webSocket<WebSocketMessage>(connAddr);
}
}
public observeKey<T extends WebSocketMessage>(key: string): Observable<T> {
return this.ws.pipe(
filter(message => message.key.startsWith(key)),
filter(message => message.intent !== Intent.EVENT),
map(message => <T> message)
);
}
public send(json: any) {
this.ws.next(json);
}
}