Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support persisting completed tasks. #1234

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
3 changes: 3 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -206,8 +206,11 @@
"electron-store": "^8.0.0",
"electron-updater": "^4.3.9",
"element-ui": "^2.15.3",
"env-paths": "2.2.1",
"i18next": "^20.3.2",
"lodash": "^4.17.21",
"lowdb": "1.0.0",
"make-dir": "^3.1.0",
"node-fetch": "^2.6.1",
"normalize.css": "^8.0.1",
"parse-torrent": "^9.1.3",
Expand Down
67 changes: 65 additions & 2 deletions src/renderer/api/Api.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,9 @@ import { ipcRenderer } from 'electron'
import is from 'electron-is'
import { isEmpty, clone } from 'lodash'
import { Aria2 } from '@shared/aria2'
import { join } from 'path'
import envPaths from 'env-paths'

import {
separateConfig,
compactUndefined,
Expand All @@ -21,11 +24,33 @@ export default class Api {

async init () {
this.config = await this.loadConfig()

this.db = await this.initDb()
this.client = this.initClient()
this.client.open()
}

async initDb () {
const paths = envPaths('Motrix')
const dbDirName = paths.data
try {
const fs = require('fs')
fs.mkdirSync(dbDirName, { recursive: true })
} catch (err) {
if (err.code !== 'EEXIST') { // curDir already exists!
throw err
}
}
this.dbFile = join(dbDirName, 'db.json')
this.dbBuffer = undefined
const low = require('lowdb')
const FileSync = require('lowdb/adapters/FileSync')
const adapter = new FileSync(this.dbFile)
const db = low(adapter)

db.defaults({ completed: [] }).write()
return db
}

loadConfigFromLocalStorage () {
// TODO
const result = {}
Expand Down Expand Up @@ -232,7 +257,43 @@ export default class Api {
fetchStoppedTaskList (params = {}) {
const { offset = 0, num = 20, keys } = params
const args = compactUndefined([offset, num, keys])
return this.client.call('tellStopped', ...args)
return new Promise((resolve, reject) => {
this.client.call('tellStopped', ...args
).then((data) => {
console.log('[Motrix] fetch stopped task list data:', data)
const fs = require('fs')
const mtime = fs.statSync(this.dbFile).mtime
if (this.dbBuffer === undefined || mtime > this.dbBuffer.lastReadTime) {
const t = new Date().getTime()
const persistedTasks = this.db.get('completed')
console.log('DateBase is newer than buffer, read again', t)
this.dbBuffer = {
lastReadTime: t,
persistedTasks: persistedTasks
}
}
const persistedTasks = this.dbBuffer.persistedTasks
const persistedTasksValue = persistedTasks.value()
const result = []
for (let i = persistedTasksValue.length - 1; i >= 0; --i) {
result.push(persistedTasksValue[i].content)
}
for (const res of data) {
const taskid = res.gid
if (undefined === persistedTasks.find({ id: taskid }).value()) {
console.log('[Motrix] new completed taskid is: ', taskid)
result.unshift(res)
const record = { id: taskid, content: res }
this.db.get('completed').push(record).write()
}
}
console.log('Returned: ', result)
resolve(result)
}).catch((err) => {
console.log('[Motrix] fetch stopped task list fail:', err)
reject(err)
})
})
}

fetchTaskList (params = {}) {
Expand Down Expand Up @@ -332,12 +393,14 @@ export default class Api {
}

purgeTaskRecord (params = {}) {
this.db.set('completed', []).write()
return this.client.call('purgeDownloadResult')
}

removeTaskRecord (params = {}) {
const { gid } = params
const args = compactUndefined([gid])
this.db.get('completed').remove({ id: gid }).write()
return this.client.call('removeDownloadResult', ...args)
}

Expand Down
34 changes: 31 additions & 3 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -3599,7 +3599,7 @@ entities@^2.0.0:
resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55"
integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==

env-paths@^2.2.0, env-paths@^2.2.1:
env-paths@2.2.1, env-paths@^2.2.0, env-paths@^2.2.1:
version "2.2.1"
resolved "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz#420399d416ce1fbe9bc0a07c62fa68d67fd0f8f2"
integrity sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==
Expand Down Expand Up @@ -4543,6 +4543,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0,
resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee"
integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==

graceful-fs@^4.1.3:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==

"graceful-readlink@>= 1.0.0":
version "1.0.1"
resolved "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725"
Expand Down Expand Up @@ -5203,6 +5208,11 @@ is-plain-object@^2.0.3, is-plain-object@^2.0.4:
dependencies:
isobject "^3.0.1"

is-promise@^2.1.0:
version "2.2.2"
resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.2.2.tgz#39ab959ccbf9a774cf079f7b40c7a26f763135f1"
integrity sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==

is-regex@^1.0.4, is-regex@^1.1.3:
version "1.1.3"
resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz#d029f9aff6448b93ebbe3f33dac71511fdcbef9f"
Expand Down Expand Up @@ -5639,7 +5649,7 @@ lodash.uniq@^4.5.0:
resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=

lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.0:
lodash@4, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.2.0:
version "4.17.21"
resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
Expand All @@ -5659,6 +5669,17 @@ loglevel@^1.6.8:
resolved "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==

lowdb@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/lowdb/-/lowdb-1.0.0.tgz#5243be6b22786ccce30e50c9a33eac36b20c8064"
integrity sha512-2+x8esE/Wb9SQ1F9IHaYWfsC9FIecLOPrK4g17FGEayjUWH172H6nwicRovGvSE2CPZouc2MCIqCI7h9d+GftQ==
dependencies:
graceful-fs "^4.1.3"
is-promise "^2.1.0"
lodash "4"
pify "^3.0.0"
steno "^0.4.1"

lower-case@^2.0.2:
version "2.0.2"
resolved "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28"
Expand Down Expand Up @@ -5709,7 +5730,7 @@ make-dir@^2.0.0, make-dir@^2.1.0:

make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0:
version "3.1.0"
resolved "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f"
integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==
dependencies:
semver "^6.0.0"
Expand Down Expand Up @@ -7856,6 +7877,13 @@ static-extend@^0.1.1:
resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c"
integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=

steno@^0.4.1:
version "0.4.4"
resolved "https://registry.yarnpkg.com/steno/-/steno-0.4.4.tgz#071105bdfc286e6615c0403c27e9d7b5dcb855cb"
integrity sha1-BxEFvfwobmYVwEA8J+nXtdy4Vcs=
dependencies:
graceful-fs "^4.1.3"

string-width@^2.0.0:
version "2.1.1"
resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e"
Expand Down