Skip to content

Commit e5aacee

Browse files
committed
Fix saving files PromiseQueue
1 parent 9592d32 commit e5aacee

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

src/base/repositories/AbstractFileRepository.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,19 @@
1+
import PromiseQueue from '../../helpers/PromiseQueueHellper';
2+
13
const fs = require('fs');
24
const path = require('path');
35

46
import FsHelper from '../../helpers/FsHelper';
57

6-
const APP_FOLDER = 'YadroTimeTracker';
8+
const APP_FOLDER = 'YadroTimeTracker_test';
79
const PROFILE_FOLDER = 'profile1';
810

911
export default abstract class AbstractFileRepository<T = any> {
1012
folderWithProfile: string = 'profile1';
1113
fileName: string = 'defaultFileName.json';
1214

15+
writeFileQueue = new PromiseQueue();
16+
1317
private static get appDataFolder() {
1418
return process.env.APPDATA || '';
1519
}
@@ -37,6 +41,13 @@ export default abstract class AbstractFileRepository<T = any> {
3741

3842
public save(data: T) {
3943
FsHelper.mkdirIfNotExists(AbstractFileRepository.profileFolder);
40-
return FsHelper.writeFile(this.filePath, data);
44+
this.writeFileQueue.add(() =>
45+
FsHelper.writeFile(this.filePath, data).catch(() => {
46+
console.error(
47+
`AbstractFileRepository: can't save file ${this.fileName} ${this.filePath}`
48+
);
49+
})
50+
);
51+
this.writeFileQueue.run();
4152
}
4253
}

src/helpers/PromiseQueueHellper.ts

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
interface PromiseQueueItem {
2+
execute: () => Promise<any>;
3+
resolve: (value: any) => void;
4+
reject: <T extends Error>(err: T) => void;
5+
}
6+
7+
export default class PromiseQueue {
8+
private queue: PromiseQueueItem[] = [];
9+
private pendingPromise: boolean = false;
10+
11+
add(promise: () => Promise<any>) {
12+
return new Promise((resolve, reject) => {
13+
this.queue.push({
14+
execute: promise,
15+
resolve,
16+
reject,
17+
});
18+
});
19+
}
20+
21+
run() {
22+
if (this.pendingPromise) {
23+
return;
24+
}
25+
26+
const item = this.queue.shift();
27+
28+
if (!item) {
29+
return;
30+
}
31+
32+
this.pendingPromise = true;
33+
item
34+
?.execute()
35+
.then((value) => {
36+
item.resolve(value);
37+
})
38+
.catch((err) => {
39+
item?.reject(err);
40+
})
41+
.finally(() => {
42+
this.pendingPromise = false;
43+
this.run();
44+
});
45+
}
46+
}

src/modules/tasks/TaskStore.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export default class TaskStore {
183183
}
184184

185185
private setupReminder(task?: TaskModel) {
186-
if (this.interval) {
186+
if (this.interval !== undefined) {
187187
clearInterval(this.interval);
188188
}
189189
if (task) {

0 commit comments

Comments
 (0)