A hubub of code to test websockets. To remove and refine

This commit is contained in:
GloriousCode
2017-08-31 21:13:42 +10:00
parent af2d8cf157
commit e193258710
11 changed files with 144 additions and 36 deletions

View File

@@ -0,0 +1,15 @@
import { TestBed, inject } from '@angular/core/testing';
import { ChatService } from './chat.service';
describe('ChatService', () => {
beforeEach(() => {
TestBed.configureTestingModule({
providers: [ChatService]
});
});
it('should be created', inject([ChatService], (service: ChatService) => {
expect(service).toBeTruthy();
}));
});

View File

@@ -0,0 +1,27 @@
import { Injectable } from '@angular/core';
import { Observable, Subject } from 'rxjs/Rx';
import { WebsocketService } from './websocket/websocket.service';
const CHAT_URL = 'ws://localhost:9050/ws';
export interface Message {
author: string,
message: string
}
@Injectable()
export class ChatService {
public messages: Subject<Message>;
constructor(wsService: WebsocketService) {
this.messages = <Subject<Message>>wsService
.connect(CHAT_URL)
.map((response: MessageEvent): Message => {
let data = JSON.parse(response.data);
return {
author: data.author,
message: data.message
}
});
}
}

View File

@@ -3,37 +3,36 @@ import * as Rx from 'rxjs/Rx';
@Injectable()
export class WebsocketService {
private socket: Rx.Subject<MessageEvent>;
constructor() { }
private subject: Rx.Subject<MessageEvent>;
public connect(url): Rx.Subject<MessageEvent> {
if(!this.socket) {
this.socket = this.create(url);
}
return this.socket;
if (!this.subject) {
this.subject = this.create(url);
console.log("Successfully connected: " + url);
}
return this.subject;
}
private create(url): Rx.Subject<MessageEvent> {
let ws = new WebSocket(url);
let observable = Rx.Observable.create(
(obs: Rx.Observer<MessageEvent>) => {
ws.onmessage = obs.next.bind(obs);
ws.onerror = obs.error.bind(obs);
ws.onclose = obs.complete.bind(obs);
(obs: Rx.Observer<MessageEvent>) => {
ws.onmessage = obs.next.bind(obs);
ws.onerror = obs.error.bind(obs);
ws.onclose = obs.complete.bind(obs);
return ws.close.bind(ws);
})
let observer = {
next: (data: Object) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
}
}
}
return Rx.Subject.create(observer, observable);
}
return ws.close.bind(ws);
}
);
let observer = {
next: (data: Object) => {
if (ws.readyState === WebSocket.OPEN) {
ws.send(JSON.stringify(data));
}
},
};
return Rx.Subject.create(observer, observable);
}
}