From af2d8cf157721cb5bdd88a056bc317c8cfaf81df Mon Sep 17 00:00:00 2001 From: GloriousCode Date: Mon, 28 Aug 2017 17:40:59 +1000 Subject: [PATCH] Adds websocket service Adds RXJS for websocket use --- web/package-lock.json | 11 +++--- web/package.json | 2 +- web/src/app/app.module.ts | 6 ++- .../websocket/websocket.service.spec.ts | 15 +++++++ .../services/websocket/websocket.service.ts | 39 +++++++++++++++++++ 5 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 web/src/app/services/websocket/websocket.service.spec.ts create mode 100644 web/src/app/services/websocket/websocket.service.ts diff --git a/web/package-lock.json b/web/package-lock.json index c42f6615..cde4f62b 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -68,7 +68,7 @@ "raw-loader": "0.5.1", "resolve": "1.3.3", "rsvp": "3.6.2", - "rxjs": "5.4.2", + "rxjs": "5.4.3", "sass-loader": "6.0.6", "script-loader": "0.7.0", "semver": "5.4.1", @@ -1162,8 +1162,7 @@ "bluebird": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.0.tgz", - "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=", - "dev": true + "integrity": "sha1-eRQg1/VR7qKJdFOop3ZT+WYG1nw=" }, "bn.js": { "version": "4.11.7", @@ -7725,9 +7724,9 @@ } }, "rxjs": { - "version": "5.4.2", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.2.tgz", - "integrity": "sha1-KjI2/L8D31e64G/Wly/ZnlwI/Pc=", + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-5.4.3.tgz", + "integrity": "sha512-fSNi+y+P9ss+EZuV0GcIIqPUK07DEaMRUtLJvdcvMyFjc9dizuDjere+A4V7JrLGnm9iCc+nagV/4QdMTkqC4A==", "requires": { "symbol-observable": "1.0.4" } diff --git a/web/package.json b/web/package.json index 0968e21d..169354e0 100644 --- a/web/package.json +++ b/web/package.json @@ -48,7 +48,7 @@ "@angular/router": "4.3.0", "core-js": "2.4.1", "enhanced-resolve": "3.3.0", - "rxjs": "5.4.2", + "rxjs": "^5.4.3", "zone.js": "0.8.12" }, "devDependencies": { diff --git a/web/src/app/app.module.ts b/web/src/app/app.module.ts index a369bb3d..a1909d29 100644 --- a/web/src/app/app.module.ts +++ b/web/src/app/app.module.ts @@ -14,16 +14,20 @@ import { HomeComponent } from './pages/home/home.component'; import { AboutComponent } from './pages/about/about.component'; import { AppRoutingModule } from './app-routing.module'; +import { WebsocketService } from './services/websocket/websocket.service'; import { ElectronService } from './providers/electron.service'; import { NavbarComponent } from './shared/navbar/navbar.component'; +import * as Rx from 'rxjs/Rx'; +import {Injectable} from '@angular/core'; @NgModule({ declarations: [ AppComponent, HomeComponent, AboutComponent, - NavbarComponent + NavbarComponent, + WebsocketService ], imports: [ BrowserModule, diff --git a/web/src/app/services/websocket/websocket.service.spec.ts b/web/src/app/services/websocket/websocket.service.spec.ts new file mode 100644 index 00000000..96a80897 --- /dev/null +++ b/web/src/app/services/websocket/websocket.service.spec.ts @@ -0,0 +1,15 @@ +import { TestBed, inject } from '@angular/core/testing'; + +import { WebsocketService } from './websocket.service'; + +describe('WebsocketService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [WebsocketService] + }); + }); + + it('should be created', inject([WebsocketService], (service: WebsocketService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/web/src/app/services/websocket/websocket.service.ts b/web/src/app/services/websocket/websocket.service.ts new file mode 100644 index 00000000..8c84c7ab --- /dev/null +++ b/web/src/app/services/websocket/websocket.service.ts @@ -0,0 +1,39 @@ +import { Injectable } from '@angular/core'; +import * as Rx from 'rxjs/Rx'; + +@Injectable() +export class WebsocketService { + private socket: Rx.Subject; + + public connect(url): Rx.Subject { + if(!this.socket) { + this.socket = this.create(url); + } + + return this.socket; + } + + private create(url): Rx.Subject { + let ws = new WebSocket(url); + + let observable = Rx.Observable.create( + (obs: Rx.Observer) => { + 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); +} +} \ No newline at end of file