Advertisement
Guest User

Untitled

a guest
Mar 21st, 2019
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. import { Injectable } from '@angular/core';
  2. import { Observable, Subject } from 'rxjs';
  3. import { filter } from 'rxjs/operators';
  4. import { IncomingHeader, IncomingPacket, OutgoingHeader, OutgoingPacket } from '../codec';
  5.  
  6. @Injectable()
  7. export class SocketService
  8. {
  9.     private _server: WebSocket;
  10.  
  11.     private _statusChange: Subject<number>;
  12.     private _incomingPacket: Subject<IncomingPacket>;
  13.  
  14.     private _pingCount: number;
  15.  
  16.     constructor()
  17.     {
  18.         this._server            = null;
  19.  
  20.         this._statusChange      = new Subject();
  21.         this._incomingPacket    = new Subject();
  22.  
  23.         this._pingCount         = 0;
  24.     }
  25.  
  26.     public connect(): void
  27.     {
  28.         this._server = new WebSocket('wss://api.habboapi.com');
  29.  
  30.         this._statusChange.next(this._server.readyState);
  31.  
  32.         this._server.onopen     = this.onOpen.bind(this);
  33.         this._server.onmessage  = this.onMessage.bind(this);
  34.         this._server.onclose    = this.onClose.bind(this);
  35.         this._server.onerror    = this.onError.bind(this);
  36.     }
  37.  
  38.     private onOpen(event: Event): void
  39.     {
  40.         this._pingCount = 0;
  41.  
  42.         this._statusChange.next(this._server.readyState);
  43.     }
  44.  
  45.     private onMessage(event: MessageEvent): void
  46.     {
  47.         const reader = new FileReader();
  48.  
  49.         reader.readAsArrayBuffer(event.data);
  50.  
  51.         reader.onloadend = event =>
  52.         {
  53.             const data: number[] = Array.from(new Uint8Array(<ArrayBuffer> reader.result));
  54.  
  55.             const packets: IncomingPacket[] = [];
  56.  
  57.             const originalPacket        = new IncomingPacket(data);
  58.             const originalPacketLength  = originalPacket.bytesLength;
  59.  
  60.             let packetLength    = originalPacket.packetLength + 4;
  61.             let completedLength = 0;
  62.  
  63.             if(originalPacketLength > packetLength)
  64.             {
  65.                 for(let i = 0; i < originalPacketLength; i += packetLength)
  66.                 {
  67.                     const packet = new IncomingPacket(data.slice(i, i + packetLength));
  68.  
  69.                     if(packet.header !== 0) packets.push(packet);
  70.  
  71.                     packetLength    = packet.packetLength + 4;
  72.                     completedLength = completedLength + packetLength;
  73.  
  74.                     this._incomingPacket.next(packet);
  75.                 }
  76.             }
  77.             else
  78.             {
  79.                 this._incomingPacket.next(originalPacket);
  80.             }
  81.         }
  82.     }
  83.  
  84.     private onClose(event: Event): void
  85.     {
  86.         this._statusChange.next(this._server.readyState);
  87.     }
  88.  
  89.     private onError(error: Event): void
  90.     {
  91.         console.log(error);
  92.     }
  93.  
  94.     public requestPong()
  95.     {
  96.         this.sendPacket(new OutgoingPacket(OutgoingHeader.CLIENT_PING).writeInt(this._pingCount).prepare());
  97.     }
  98.  
  99.     public receivePong(packet: IncomingPacket)
  100.     {
  101.         if(packet && packet.readInt() === this._pingCount) this._pingCount++;
  102.     }
  103.  
  104.     public packetSubscription(header: IncomingHeader): Observable<IncomingPacket>
  105.     {
  106.         const observable = this._incomingPacket
  107.             .pipe(filter(packet => packet.header.toString() === header.toString()));
  108.  
  109.         return observable;
  110.     }
  111.  
  112.     public sendPacket(...packets: OutgoingPacket[]): void
  113.     {
  114.         if(this._server && this._server.readyState === WebSocket.OPEN)
  115.         {
  116.             let somePackets: OutgoingPacket[] = [];
  117.             somePackets = somePackets.concat(packets);
  118.  
  119.             if(somePackets)
  120.             {
  121.                 const totalPackets = packets.length;
  122.  
  123.                 for(let i = 0; i < totalPackets; i++)
  124.                 {
  125.                     const packet = packets[i];
  126.  
  127.                     if(packet instanceof OutgoingPacket)
  128.                     {
  129.                         if(packet.isPrepared)
  130.                         {
  131.                             this._server.send(new Uint8Array(packet.bytes))
  132.                         }
  133.                     }
  134.                 }
  135.             }
  136.         }
  137.     }
  138.  
  139.     public get server(): WebSocket
  140.     {
  141.         return this._server;
  142.     }
  143.  
  144.     public get statusChange(): Subject<number>
  145.     {
  146.         return this._statusChange;
  147.     }
  148.  
  149.     public get incomingPacket(): Subject<IncomingPacket>
  150.     {
  151.         return this._incomingPacket;
  152.     }
  153. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement