Type webtorrent
authorChocobozzz <florian.bigard@gmail.com>
Tue, 11 Jul 2017 08:09:18 +0000 (10:09 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Tue, 11 Jul 2017 08:09:18 +0000 (10:09 +0200)
client/package.json
client/src/app/core/auth/auth-user.model.ts
client/src/app/core/auth/auth.service.ts
client/src/app/videos/video-list/video-list.component.ts
client/src/app/videos/video-watch/video-watch.component.ts
client/src/app/videos/video-watch/webtorrent.service.ts
client/yarn.lock

index a922fe107d81544b3b1bf49317057d53bde7877d..b19a3e57d9d1e14060e5d79cad6098008aeb13a9 100644 (file)
@@ -93,6 +93,7 @@
     "zone.js": "~0.8.5"
   },
   "devDependencies": {
+    "@types/webtorrent": "^0.98.4",
     "add-asset-html-webpack-plugin": "^2.0.1",
     "codelyzer": "^3.0.0-beta.4",
     "standard": "^10.0.0",
index 9cb2019072df8fdf68b00847a354641585685f80..4155aea1927a1f131e5208d6a583378d049dd365 100644 (file)
@@ -96,6 +96,7 @@ export class AuthUser extends User {
     localStorage.removeItem(this.KEYS.ID)
     localStorage.removeItem(this.KEYS.ROLE)
     localStorage.removeItem(this.KEYS.DISPLAY_NSFW)
+    localStorage.removeItem(this.KEYS.EMAIL)
     Tokens.flush()
   }
 
@@ -130,6 +131,7 @@ export class AuthUser extends User {
   save () {
     localStorage.setItem(AuthUser.KEYS.ID, this.id.toString())
     localStorage.setItem(AuthUser.KEYS.USERNAME, this.username)
+    localStorage.setItem(AuthUser.KEYS.EMAIL, this.email)
     localStorage.setItem(AuthUser.KEYS.ROLE, this.role)
     localStorage.setItem(AuthUser.KEYS.DISPLAY_NSFW, JSON.stringify(this.displayNSFW))
     this.tokens.save()
index d5aa80512de63f9142e78ab1f1223f32d07becc9..de9e14b2d7d4823e3fffeff0f08b9bf766548d24 100644 (file)
@@ -11,7 +11,7 @@ import { NotificationsService } from 'angular2-notifications'
 
 import { AuthStatus } from './auth-status.model'
 import { AuthUser } from './auth-user.model'
-import { OAuthClientLocal } from '../../../../../shared'
+import { OAuthClientLocal, UserRole } from '../../../../../shared'
 // Do not use the barrel (dependency loop)
 import { RestExtractor } from '../../shared/rest'
 
@@ -181,7 +181,10 @@ export class AuthService {
 
   refreshUserInformations () {
     const obj = {
-      access_token: this.user.getAccessToken()
+      access_token: this.user.getAccessToken(),
+      refresh_token: null,
+      token_type: this.user.getTokenType(),
+      username: this.user.username
     }
 
     this.mergeUserInformations (obj)
@@ -195,7 +198,12 @@ export class AuthService {
         )
   }
 
-  private mergeUserInformations (obj: { access_token: string }) {
+  private mergeUserInformations (obj: {
+    access_token: string,
+    refresh_token: string,
+    token_type: string,
+    username: string
+  }) {
     // Do not call authHttp here to avoid circular dependencies headaches
 
     const headers = new Headers()
@@ -205,9 +213,10 @@ export class AuthService {
              .map(res => res.json())
              .map(res => {
                const newProperties = {
-                 id: res.id,
-                 role: res.role,
-                 displayNSFW: res.displayNSFW
+                 id: res.id as number,
+                 role: res.role as UserRole,
+                 displayNSFW: res.displayNSFW as boolean,
+                 email: res.email as string
                }
 
                return Object.assign(obj, newProperties)
@@ -215,7 +224,16 @@ export class AuthService {
     )
   }
 
-  private handleLogin (obj: any) {
+  private handleLogin (obj: {
+    access_token: string,
+    refresh_token: string,
+    token_type: string,
+    id: number,
+    username: string,
+    email: string,
+    role: UserRole,
+    displayNSFW: boolean
+  }) {
     const id = obj.id
     const username = obj.username
     const role = obj.role
@@ -233,7 +251,7 @@ export class AuthService {
     this.setStatus(AuthStatus.LoggedIn)
   }
 
-  private handleRefreshToken (obj: any) {
+  private handleRefreshToken (obj: { access_token: string, refresh_token: string }) {
     this.user.refreshTokens(obj.access_token, obj.refresh_token)
     this.user.save()
   }
index 0c36e5b0893cbf0784572097818044d26bb11db9..4ac539960363d31cdb053e08a49d76bb0d9285a5 100644 (file)
@@ -1,5 +1,6 @@
 import { ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core'
 import { ActivatedRoute, Router } from '@angular/router'
+import { Subscription } from 'rxjs/Subscription'
 import { BehaviorSubject } from 'rxjs/BehaviorSubject'
 
 import { NotificationsService } from 'angular2-notifications'
@@ -30,8 +31,8 @@ export class VideoListComponent implements OnInit, OnDestroy {
   videos: Video[] = []
 
   private search: Search
-  private subActivatedRoute: any
-  private subSearch: any
+  private subActivatedRoute: Subscription
+  private subSearch: Subscription
 
   constructor (
     private notificationsService: NotificationsService,
@@ -98,7 +99,7 @@ export class VideoListComponent implements OnInit, OnDestroy {
     return !this.loading.getValue() && this.videos.length === 0
   }
 
-  onPageChanged (event: any) {
+  onPageChanged (event: { page: number }) {
     // Be sure the current page is set
     this.pagination.currentPage = event.page
 
@@ -113,21 +114,21 @@ export class VideoListComponent implements OnInit, OnDestroy {
 
   private buildRouteParams () {
     // There is always a sort and a current page
-    const params: any = {
+    const params = {
       sort: this.sort,
       page: this.pagination.currentPage
     }
 
     // Maybe there is a search
     if (this.search.value) {
-      params.field = this.search.field
-      params.search = this.search.value
+      params['field'] = this.search.field
+      params['search'] = this.search.value
     }
 
     return params
   }
 
-  private loadRouteParams (routeParams) {
+  private loadRouteParams (routeParams: { [ key: string ]: any }) {
     if (routeParams['search'] !== undefined) {
       this.search = {
         value: routeParams['search'],
index 12ddf3eef450f292e9c2cc1b9b98d73a35c74317..6bd6c1f7eaff4123d0ae2920f6809dde53c47c45 100644 (file)
@@ -32,7 +32,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
   loading = false
   numPeers: number
   player: videojs.Player
-  playerElement: Element
+  playerElement: HTMLMediaElement
   uploadSpeed: number
   userRating: UserVideoRateType = null
   video: Video = null
@@ -41,7 +41,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
   private errorTimer: number
   private paramsSub: Subscription
   private errorsSub: Subscription
-  private warningsSub: Subscription
   private torrentInfosInterval: number
 
   constructor (
@@ -82,8 +81,10 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
       self.player = this
     })
 
-    this.errorsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.error('Error', err.message))
-    this.warningsSub = this.webTorrentService.errors.subscribe(err => this.notificationsService.alert('Warning', err.message))
+    this.errorsSub = this.webTorrentService.errors.subscribe(err => {
+      const message = typeof err === 'string' ? err : err.message
+      this.notificationsService.error('Error', message)
+    })
   }
 
   ngOnDestroy () {
@@ -102,7 +103,6 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
     // Unsubscribe subscriptions
     this.paramsSub.unsubscribe()
     this.errorsSub.unsubscribe()
-    this.warningsSub.unsubscribe()
   }
 
   loadVideo () {
@@ -117,7 +117,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy {
     // So we create a timer to inform the user the load is abnormally long
     this.errorTimer = window.setTimeout(() => this.loadTooLong(), VideoWatchComponent.LOADTIME_TOO_LONG)
 
-    this.webTorrentService.add(this.video.magnetUri, (torrent) => {
+    this.webTorrentService.add(this.video.magnetUri, torrent => {
       // Clear the error timer
       window.clearTimeout(this.errorTimer)
       // Maybe the error was fired by the timer, so reset it
index 211894bfd3e546559c13955745d9fc957a29b7de..8819e17d4900b8d76fd6e445c49bcdc65d882620 100644 (file)
@@ -5,21 +5,17 @@ import * as WebTorrent from 'webtorrent'
 
 @Injectable()
 export class WebTorrentService {
-  errors = new Subject<Error>()
-  warnings = new Subject<Error>()
+  errors = new Subject<string | Error>()
 
-  // TODO: use WebTorrent @type
-  // private client: WebTorrent.Client
-  private client: any
+  private client: WebTorrent.Instance
 
   constructor () {
     this.client = new WebTorrent({ dht: false })
 
-    this.client.on('error', (err) => this.errors.next(err))
-    this.client.on('warning', (err) => this.warnings.next(err))
+    this.client.on('error', err => this.errors.next(err))
   }
 
-  add (magnetUri: string, callback: Function) {
+  add (magnetUri: string, callback: (torrent: WebTorrent.Torrent) => any) {
     return this.client.add(magnetUri, callback)
   }
 
index b953fcb21b9088171c58f542360ceac26405c554..9a6aff1b26ab0c54ae49684a0a13a6d0e1f97ace 100644 (file)
   dependencies:
     tslib "^1.7.0"
 
+"@types/bittorrent-protocol@*":
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/@types/bittorrent-protocol/-/bittorrent-protocol-2.2.2.tgz#169e9633e1bd18e6b830d11cf42e611b1972cb83"
+  dependencies:
+    "@types/node" "*"
+
 "@types/core-js@^0.9.28":
   version "0.9.42"
   resolved "https://registry.yarnpkg.com/@types/core-js/-/core-js-0.9.42.tgz#dd6da92cd7d5ab5ca0b4477524537c3e633b6bce"
 
+"@types/magnet-uri@*":
+  version "5.1.1"
+  resolved "https://registry.yarnpkg.com/@types/magnet-uri/-/magnet-uri-5.1.1.tgz#861aaf64c92a3137dd848fefc55cd352a8ea851a"
+  dependencies:
+    "@types/node" "*"
+
 "@types/node@*":
   version "8.0.8"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.8.tgz#0dc4ca2c6f6fc69baee16c5e928c4a627f517ada"
   version "6.0.79"
   resolved "https://registry.yarnpkg.com/@types/node/-/node-6.0.79.tgz#5efe7d4a6d8c453c7e9eaf55d931f4a22fac5169"
 
+"@types/parse-torrent-file@*":
+  version "4.0.1"
+  resolved "https://registry.yarnpkg.com/@types/parse-torrent-file/-/parse-torrent-file-4.0.1.tgz#056a6c18f3fac0cd7c6c74540f00496a3225976b"
+  dependencies:
+    "@types/node" "*"
+
+"@types/parse-torrent@*":
+  version "5.8.1"
+  resolved "https://registry.yarnpkg.com/@types/parse-torrent/-/parse-torrent-5.8.1.tgz#012fe6f50d12ed23d86f10ea831a4f0e1b0aacb6"
+  dependencies:
+    "@types/magnet-uri" "*"
+    "@types/node" "*"
+    "@types/parse-torrent-file" "*"
+
+"@types/simple-peer@*":
+  version "6.1.1"
+  resolved "https://registry.yarnpkg.com/@types/simple-peer/-/simple-peer-6.1.1.tgz#5d0f65ea72a0125b1e92b3cb392be3cab14976ad"
+  dependencies:
+    "@types/node" "*"
+
 "@types/source-map@*":
   version "0.5.0"
   resolved "https://registry.yarnpkg.com/@types/source-map/-/source-map-0.5.0.tgz#dd34bbd8e32fe4e74f2e3d8ac07f8aa5b45a47ac"
     "@types/tapable" "*"
     "@types/uglify-js" "*"
 
+"@types/webtorrent@^0.98.4":
+  version "0.98.4"
+  resolved "https://registry.yarnpkg.com/@types/webtorrent/-/webtorrent-0.98.4.tgz#cf8dbe22e3d5cf6915305f7f970b52bca01bf8b4"
+  dependencies:
+    "@types/bittorrent-protocol" "*"
+    "@types/node" "*"
+    "@types/parse-torrent" "*"
+    "@types/simple-peer" "*"
+
 abbrev@1:
   version "1.1.0"
   resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f"