Guest User

Untitled

a guest
Dec 4th, 2016
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import {Injectable} from "@angular/core";
  2. import {Storage} from '@ionic/storage';
  3. import Socket = SocketIOClient.Socket;
  4. import {Observable, ReplaySubject} from "rxjs";
  5. import * as io from 'socket.io-client';
  6.  
  7. @Injectable()
  8. export class SocketService {
  9.   public socket: Socket;
  10.   private connected: Promise<boolean>;
  11.   private asyncSocket = new AsyncSocket();
  12.  
  13.   constructor(public storage: Storage) {
  14.     this.reconnect();
  15.   }
  16.  
  17. // Waits for successful socket connection, gets the token out of local storage and then authenticates the user with the server
  18.   authenticate() {
  19.     console.log('%cBeginning socket authentication', 'color: grey');
  20.     this.storage.get('token').then(token => {
  21.       console.log('%cToken was returned: ', 'color: grey', token);
  22.       if (token) {
  23.         this.connected.then(() => {
  24.           console.log('%cSocket connection established', 'color: grey');
  25.           this.socket
  26.             .emit('authenticate', {token: token})
  27.             .once('authenticated', () => {
  28.               console.log('%cSocket auth successful', 'color:green; font-size:larger; font-weight: 700');
  29.               this.asyncSocket.connect(this.socket);
  30.               this.socket.emit('app:init', {});
  31.             })
  32.             .once('unauthorized', function (msg) {
  33.               console.error('Socket auth failed: ', msg);
  34.             });
  35.           console.log('%cEmitted socket authentication', 'color: grey');
  36.         });
  37.       } else {
  38.         console.warn('No token found');
  39.       }
  40.     });
  41.   }
  42.  
  43.   observe(event: string): Observable<any> {
  44.     console.debug('SocketService.observe(', event,')');
  45.     return Observable.bindCallback((event: string, f) => this.asyncSocket.on(event, f))(event);
  46.   }
  47.  
  48.   observeOnce(event: string): Observable<any> {
  49.     return Observable.bindCallback((event: string, f) => this.asyncSocket.once(event, f))(event);
  50.   }
  51.  
  52.   emit(event: string, payload: any = {}) {
  53.     this.asyncSocket.emit(event, payload);
  54.   }
  55.  
  56.   emitOnce(event: string, payload: any = {}) {
  57.     this.emit(event, payload);
  58.     return this.observeOnce(event);
  59.   }
  60.  
  61.   // Will connect the socket and resolve the internal promise once successful
  62.   reconnect() {
  63.     console.log('%cStarting socket reconnect', 'color: grey');
  64.     this.connected = new Promise(resolve => {
  65.       this.socket = io('https://app.getflip.de:3010', {
  66.         forceNew: true,
  67.         secure: true,
  68.         reconnectionDelay: 500,
  69.         reconnectionDelayMax: 2000
  70.       });
  71.       this.socket.once('connect', () => {
  72.         resolve(true);
  73.         console.log('%cResolving socket connection promise', 'color: grey');
  74.       });
  75.     });
  76.   }
  77. }
  78.  
  79. class AsyncSocket {
  80.   private onCalls = new ReplaySubject<{event: string, f: Function}>();
  81.   private onceCalls = new ReplaySubject<{event: string, f: Function}>();
  82.   private emits = new ReplaySubject<{event: string, payload: any}>();
  83.   private socket: Socket;
  84.  
  85.   on(event: string, f: any) {
  86.     console.debug('Queueing on for: ', event, f);
  87.     this.onCalls.next({event: event, f: f});
  88.   }
  89.  
  90.   once(event: string, f: any) {
  91.     console.debug('Queueing once for: ', event, f);
  92.     this.onceCalls.next({event: event, f: f});
  93.   }
  94.  
  95.   emit(event: string, payload: any) {
  96.     console.debug('Queueing emit for: ', event, payload);
  97.     this.emits.next({event: event, payload: payload});
  98.   }
  99.  
  100.   connect(socket: Socket) {
  101.     console.log('%cConnecting queued socket things to actual socket', 'color: grey');
  102.     this.socket = socket;
  103.     this.socket.on('likePost', (res => console.info(res)));
  104.     this.onCalls.do(call => console.debug('Calling on for ', call)).subscribe(call => this.socket.on(call.event, call.f));
  105.     this.onceCalls.do(call => console.debug('Calling once for ', call)).subscribe(call => this.socket.once(call.event, call.f));
  106.     this.emits.do(call => console.debug('Calling emit for ', call)).subscribe(call => this.socket.emit(call.event, call.payload));
  107.   }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment