"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",
localStorage.removeItem(this.KEYS.ID)
localStorage.removeItem(this.KEYS.ROLE)
localStorage.removeItem(this.KEYS.DISPLAY_NSFW)
+ localStorage.removeItem(this.KEYS.EMAIL)
Tokens.flush()
}
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()
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'
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)
)
}
- 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()
.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)
)
}
- 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
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()
}
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'
videos: Video[] = []
private search: Search
- private subActivatedRoute: any
- private subSearch: any
+ private subActivatedRoute: Subscription
+ private subSearch: Subscription
constructor (
private notificationsService: NotificationsService,
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
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'],
loading = false
numPeers: number
player: videojs.Player
- playerElement: Element
+ playerElement: HTMLMediaElement
uploadSpeed: number
userRating: UserVideoRateType = null
video: Video = null
private errorTimer: number
private paramsSub: Subscription
private errorsSub: Subscription
- private warningsSub: Subscription
private torrentInfosInterval: number
constructor (
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 () {
// Unsubscribe subscriptions
this.paramsSub.unsubscribe()
this.errorsSub.unsubscribe()
- this.warningsSub.unsubscribe()
}
loadVideo () {
// 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
@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)
}
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"