mirror of
https://github.com/Myxelium/Bridge-Multi.git
synced 2026-07-07 18:45:09 +00:00
Improved performance for large download queues
This commit is contained in:
@@ -11,7 +11,19 @@ export class DownloadService {
|
|||||||
private downloads: DownloadProgress[] = []
|
private downloads: DownloadProgress[] = []
|
||||||
|
|
||||||
constructor(private electronService: ElectronService) {
|
constructor(private electronService: ElectronService) {
|
||||||
process.setMaxListeners(100)
|
this.electronService.receiveIPC('download-updated', result => {
|
||||||
|
// Update <this.downloads> with result
|
||||||
|
const thisDownloadIndex = this.downloads.findIndex(download => download.versionID == result.versionID)
|
||||||
|
if (result.type == 'cancel') {
|
||||||
|
this.downloads = this.downloads.filter(download => download.versionID != result.versionID)
|
||||||
|
} else if (thisDownloadIndex == -1) {
|
||||||
|
this.downloads.push(result)
|
||||||
|
} else {
|
||||||
|
this.downloads[thisDownloadIndex] = result
|
||||||
|
}
|
||||||
|
|
||||||
|
this.downloadUpdatedEmitter.emit(result)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
get downloadCount() {
|
get downloadCount() {
|
||||||
@@ -32,19 +44,6 @@ export class DownloadService {
|
|||||||
|
|
||||||
addDownload(versionID: number, newDownload: NewDownload) {
|
addDownload(versionID: number, newDownload: NewDownload) {
|
||||||
if (!this.downloads.find(download => download.versionID == versionID)) { // Don't download something twice
|
if (!this.downloads.find(download => download.versionID == versionID)) { // Don't download something twice
|
||||||
this.electronService.receiveIPC('download-updated', result => {
|
|
||||||
// Update <this.downloads> with result
|
|
||||||
const thisDownloadIndex = this.downloads.findIndex(download => download.versionID == result.versionID)
|
|
||||||
if (result.type == 'cancel') {
|
|
||||||
this.downloads = this.downloads.filter(download => download.versionID != versionID)
|
|
||||||
} else if (thisDownloadIndex == -1) {
|
|
||||||
this.downloads.push(result)
|
|
||||||
} else {
|
|
||||||
this.downloads[thisDownloadIndex] = result
|
|
||||||
}
|
|
||||||
|
|
||||||
this.downloadUpdatedEmitter.emit(result)
|
|
||||||
})
|
|
||||||
this.electronService.sendIPC('download', { action: 'add', versionID, data: newDownload })
|
this.electronService.sendIPC('download', { action: 'add', versionID, data: newDownload })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ export class SelectionService {
|
|||||||
private searchResults: SongResult[] = []
|
private searchResults: SongResult[] = []
|
||||||
|
|
||||||
private selectAllChangedEmitter = new EventEmitter<boolean>()
|
private selectAllChangedEmitter = new EventEmitter<boolean>()
|
||||||
private selectionChangedEmitter = new EventEmitter<SelectionEvent>()
|
private selectionChangedCallbacks: { [songID: number]: (selection: boolean) => void } = {}
|
||||||
|
|
||||||
private allSelected = false
|
private allSelected = false
|
||||||
private selections: { [songID: number]: boolean | undefined } = {}
|
private selections: { [songID: number]: boolean | undefined } = {}
|
||||||
@@ -32,7 +32,9 @@ export class SelectionService {
|
|||||||
|
|
||||||
searchService.onNewSearch((results) => {
|
searchService.onNewSearch((results) => {
|
||||||
this.searchResults = results
|
this.searchResults = results
|
||||||
this.deselectAll()
|
this.selectionChangedCallbacks = {}
|
||||||
|
this.selections = {}
|
||||||
|
this.selectAllChangedEmitter.emit(false)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -49,11 +51,7 @@ export class SelectionService {
|
|||||||
* (note: only one emitter can be registered per `songID`)
|
* (note: only one emitter can be registered per `songID`)
|
||||||
*/
|
*/
|
||||||
onSelectionChanged(songID: number, callback: (selection: boolean) => void) {
|
onSelectionChanged(songID: number, callback: (selection: boolean) => void) {
|
||||||
this.selectionChangedEmitter.subscribe((selection: SelectionEvent) => {
|
this.selectionChangedCallbacks[songID] = callback
|
||||||
if (selection.songID == songID) {
|
|
||||||
callback(selection.selected)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -78,14 +76,14 @@ export class SelectionService {
|
|||||||
deselectSong(songID: number) {
|
deselectSong(songID: number) {
|
||||||
if (this.selections[songID]) {
|
if (this.selections[songID]) {
|
||||||
this.selections[songID] = false
|
this.selections[songID] = false
|
||||||
this.selectionChangedEmitter.emit({ songID, selected: false })
|
this.selectionChangedCallbacks[songID](false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
selectSong(songID: number) {
|
selectSong(songID: number) {
|
||||||
if (!this.selections[songID]) {
|
if (!this.selections[songID]) {
|
||||||
this.selections[songID] = true
|
this.selections[songID] = true
|
||||||
this.selectionChangedEmitter.emit({ songID, selected: true })
|
this.selectionChangedCallbacks[songID](true)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -19,7 +19,7 @@ class DownloadHandler implements IPCEmitHandler<'download'> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private addDownload(data: Download) {
|
private addDownload(data: Download) {
|
||||||
const filesHash = data.data.driveData.filesHash
|
const filesHash = data.data.driveData.filesHash // Note: using versionID would cause chart packs to download multiple times
|
||||||
if (this.currentDownload?.hash == filesHash || this.downloadQueue.isDownloadingLink(filesHash)) {
|
if (this.currentDownload?.hash == filesHash || this.downloadQueue.isDownloadingLink(filesHash)) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { emitIPCEvent } from '../../main'
|
|||||||
|
|
||||||
export class DownloadQueue {
|
export class DownloadQueue {
|
||||||
|
|
||||||
downloadQueue: ChartDownload[] = []
|
private downloadQueue: ChartDownload[] = []
|
||||||
|
|
||||||
isDownloadingLink(filesHash: string) {
|
isDownloadingLink(filesHash: string) {
|
||||||
return this.downloadQueue.some(download => download.hash == filesHash)
|
return this.downloadQueue.some(download => download.hash == filesHash)
|
||||||
|
|||||||
Reference in New Issue
Block a user