Skip to content

Commit d6657b2

Browse files
committed
lint: lib/realtime
- add JobWorker type - add typing annotate in: - realtimeUpdateDirtyNoteJob - realtimeSaveRevisionJob - realtimeClientConnection - processQueue
1 parent 330c520 commit d6657b2

File tree

5 files changed

+86
-46
lines changed

5 files changed

+86
-46
lines changed

lib/realtime/jobWorker.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
export interface JobWorker {
2+
start(): void
3+
4+
stop(): void
5+
}

lib/realtime/processQueue.ts

Lines changed: 49 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {EventEmitter} from "events";
2+
import {JobWorker} from "./jobWorker";
23

34
/**
45
* Queuing Class for connection queuing
@@ -10,22 +11,48 @@ const QueueEvent = {
1011
Finish: 'Finish'
1112
}
1213

13-
export class ProcessQueue extends EventEmitter {
14-
private max: number;
15-
private triggerTime: number;
14+
type AsyncFunc = () => Promise<void>
15+
type SyncFun = () => void
16+
type TaskFunc = AsyncFunc | SyncFun
17+
18+
interface Task {
19+
id: string
20+
processingFunc: TaskFunc
21+
}
22+
23+
24+
export interface ProcessQueueOptions {
25+
maximumLength?: number
26+
triggerTimeInterval?: number
27+
proactiveMode?: boolean
28+
continuousMode?: boolean
29+
}
30+
31+
const defaultOptions: ProcessQueueOptions = {
32+
maximumLength: 500,
33+
triggerTimeInterval: 5000,
34+
// execute on push
35+
proactiveMode: true,
36+
// execute next work on finish
37+
continuousMode: true
38+
}
39+
40+
export class ProcessQueue extends EventEmitter implements JobWorker {
41+
private readonly max: number;
42+
private readonly triggerTime: number;
1643
private taskMap: Map<string, boolean>;
17-
public queue: any[];
44+
public queue: Task[];
1845
public lock: boolean;
1946
private eventTrigger: NodeJS.Timeout;
2047

2148
constructor({
22-
maximumLength = 500,
23-
triggerTimeInterval = 5000,
49+
maximumLength,
50+
triggerTimeInterval,
2451
// execute on push
25-
proactiveMode = true,
52+
proactiveMode,
2653
// execute next work on finish
27-
continuousMode = true
28-
}) {
54+
continuousMode
55+
} = defaultOptions) {
2956
super()
3057
this.max = maximumLength
3158
this.triggerTime = triggerTimeInterval
@@ -42,29 +69,29 @@ export class ProcessQueue extends EventEmitter {
4269
}
4370
}
4471

45-
onEventProcessFunc() {
72+
onEventProcessFunc(): void {
4673
if (this.lock) return
4774
this.lock = true
4875
setImmediate(() => {
4976
this.process()
5077
})
5178
}
5279

53-
start() {
80+
start(): void {
5481
if (this.eventTrigger) return
5582
this.eventTrigger = setInterval(() => {
5683
this.emit(QueueEvent.Tick)
5784
}, this.triggerTime)
5885
}
5986

60-
stop() {
87+
stop(): void {
6188
if (this.eventTrigger) {
6289
clearInterval(this.eventTrigger)
6390
this.eventTrigger = null
6491
}
6592
}
6693

67-
checkTaskIsInQueue(id) {
94+
checkTaskIsInQueue(id: string): boolean {
6895
return this.taskMap.has(id)
6996
}
7097

@@ -74,7 +101,7 @@ export class ProcessQueue extends EventEmitter {
74101
* @param processingFunc {Function<Promise>}
75102
* @returns {boolean} if success return true, otherwise false
76103
*/
77-
push(id: string, processingFunc) {
104+
push(id: string, processingFunc: TaskFunc): boolean {
78105
if (this.queue.length >= this.max) return false
79106
if (this.checkTaskIsInQueue(id)) return false
80107
const task = {
@@ -88,7 +115,7 @@ export class ProcessQueue extends EventEmitter {
88115
return true
89116
}
90117

91-
process() {
118+
process(): void {
92119
if (this.queue.length <= 0) {
93120
this.stop()
94121
this.lock = false
@@ -104,7 +131,13 @@ export class ProcessQueue extends EventEmitter {
104131
this.emit(QueueEvent.Finish)
105132
})
106133
}
107-
task.processingFunc().then(finishTask).catch(finishTask)
134+
const runFunc = task.processingFunc() as Promise<void>;
135+
// Wait until the promise fulfilled if processing function is a promise
136+
if (typeof runFunc.then === 'function') {
137+
runFunc.then(finishTask).catch(finishTask)
138+
} else {
139+
finishTask()
140+
}
108141
}
109142
}
110143

lib/realtime/realtimeClientConnection.ts

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ export class RealtimeClientConnection {
1515
this.realtime = require('./realtime')
1616
}
1717

18-
registerEventHandler() {
18+
registerEventHandler(): void {
1919
// received client refresh request
2020
this.socket.on('refresh', this.refreshEventHandler.bind(this))
2121
// received user status
@@ -40,27 +40,27 @@ export class RealtimeClientConnection {
4040
this.socket.on('permission', this.permissionChangeEventHandler.bind(this))
4141
}
4242

43-
isUserLoggedIn() {
43+
isUserLoggedIn(): boolean {
4444
return this.socket.request.user && this.socket.request.user.logged_in
4545
}
4646

47-
isNoteAndUserExists() {
47+
isNoteAndUserExists(): boolean {
4848
const note = this.realtime.getNoteFromNotePool(this.socket.noteId)
4949
const user = this.realtime.getUserFromUserPool(this.socket.id)
5050
return note && user
5151
}
5252

53-
isNoteOwner() {
53+
isNoteOwner(): boolean {
5454
const note = this.getCurrentNote()
5555
return get(note, 'owner') === this.getCurrentLoggedInUserId()
5656
}
5757

58-
isAnonymousEnable() {
58+
isAnonymousEnable(): boolean {
5959
// TODO: move this method to config module
6060
return config.allowAnonymous || config.allowAnonymousEdits
6161
}
6262

63-
getAvailablePermissions() {
63+
getAvailablePermissions(): string[] {
6464
// TODO: move this method to config module
6565
const availablePermission = Object.assign({}, config.permission)
6666
if (!config.allowAnonymous && !config.allowAnonymousViews) {
@@ -78,7 +78,7 @@ export class RealtimeClientConnection {
7878
return this.realtime.getUserFromUserPool(this.socket.id)
7979
}
8080

81-
getCurrentLoggedInUserId() {
81+
getCurrentLoggedInUserId(): string {
8282
return get(this.socket, 'request.user.id')
8383
}
8484

@@ -91,13 +91,13 @@ export class RealtimeClientConnection {
9191
return this.socket.broadcast.to(this.socket.noteId)
9292
}
9393

94-
async destroyNote(id) {
94+
async destroyNote(id: string): Promise<number> {
9595
return Note.destroy({
9696
where: {id: id}
9797
})
9898
}
9999

100-
async changeNotePermission(newPermission) {
100+
async changeNotePermission(newPermission: string): Promise<void> {
101101
const [changedRows] = await Note.update({
102102
permission: newPermission
103103
}, {
@@ -110,7 +110,7 @@ export class RealtimeClientConnection {
110110
}
111111
}
112112

113-
notifyPermissionChanged() {
113+
notifyPermissionChanged(): void {
114114
this.realtime.io.to(this.getCurrentNote().id).emit('permission', {
115115
permission: this.getCurrentNote().permission
116116
})
@@ -128,11 +128,11 @@ export class RealtimeClientConnection {
128128
})
129129
}
130130

131-
refreshEventHandler() {
131+
refreshEventHandler(): void {
132132
this.realtime.emitRefresh(this.socket)
133133
}
134134

135-
checkVersionEventHandler() {
135+
checkVersionEventHandler(): void {
136136
this.socket.emit('version', {
137137
version: config.fullversion,
138138
minimumCompatibleVersion: config.minimumCompatibleVersion
@@ -152,7 +152,7 @@ export class RealtimeClientConnection {
152152
this.realtime.emitUserStatus(this.socket)
153153
}
154154

155-
userChangedEventHandler() {
155+
userChangedEventHandler(): void {
156156
logger.info('user changed')
157157

158158
const note = this.getCurrentNote()
@@ -164,7 +164,7 @@ export class RealtimeClientConnection {
164164
this.realtime.emitOnlineUsers(this.socket)
165165
}
166166

167-
onlineUsersEventHandler() {
167+
onlineUsersEventHandler(): void {
168168
if (!this.isNoteAndUserExists()) return
169169

170170
const currentNote = this.getCurrentNote()
@@ -193,7 +193,7 @@ export class RealtimeClientConnection {
193193
this.getNoteChannel().emit('cursor activity', out)
194194
}
195195

196-
cursorBlurEventHandler() {
196+
cursorBlurEventHandler(): void {
197197
if (!this.isNoteAndUserExists()) return
198198
const user = this.getCurrentUser()
199199
user.cursor = null
@@ -202,7 +202,7 @@ export class RealtimeClientConnection {
202202
})
203203
}
204204

205-
deleteNoteEventHandler() {
205+
deleteNoteEventHandler(): void {
206206
// need login to do more actions
207207
if (this.isUserLoggedIn() && this.isNoteAndUserExists()) {
208208
const note = this.getCurrentNote()
@@ -220,7 +220,7 @@ export class RealtimeClientConnection {
220220
}
221221
}
222222

223-
permissionChangeEventHandler(permission) {
223+
permissionChangeEventHandler(permission: string): void {
224224
if (!this.isUserLoggedIn()) return
225225
if (!this.isNoteAndUserExists()) return
226226

@@ -237,7 +237,7 @@ export class RealtimeClientConnection {
237237
.catch(err => logger.error('update note permission failed: ' + err))
238238
}
239239

240-
disconnectEventHandler() {
240+
disconnectEventHandler(): void {
241241
if (this.realtime.disconnectProcessQueue.checkTaskIsInQueue(this.socket.id)) {
242242
return
243243
}

lib/realtime/realtimeSaveRevisionJob.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,32 +2,33 @@
22

33
import {logger} from "../logger";
44
import {saveAllNotesRevision} from "../services/note";
5+
import {JobWorker} from "./jobWorker";
56

67
/**
78
* clean when user not in any rooms or user not in connected list
89
*/
9-
export class SaveRevisionJob {
10+
export class SaveRevisionJob implements JobWorker {
1011
private realtime: any;
1112
private saverSleep: boolean;
1213
private timer: NodeJS.Timeout;
1314

14-
constructor(realtime) {
15+
constructor(realtime: any) {
1516
this.realtime = realtime
1617
this.saverSleep = false
1718
}
1819

19-
start() {
20+
start(): void {
2021
if (this.timer) return
2122
this.timer = setInterval(this.saveRevision.bind(this), 5 * 60 * 1000)
2223
}
2324

24-
stop() {
25+
stop(): void {
2526
if (!this.timer) return
2627
clearInterval(this.timer)
2728
this.timer = undefined
2829
}
2930

30-
saveRevision() {
31+
saveRevision(): void {
3132
if (this.getSaverSleep()) return
3233
saveAllNotesRevision((err, notes) => {
3334
if (err) {
@@ -39,11 +40,11 @@ export class SaveRevisionJob {
3940
})
4041
}
4142

42-
getSaverSleep() {
43+
getSaverSleep(): boolean {
4344
return this.saverSleep
4445
}
4546

46-
setSaverSleep(val) {
47+
setSaverSleep(val: boolean): void {
4748
this.saverSleep = val
4849
}
4950
}

lib/realtime/realtimeUpdateDirtyNoteJob.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,27 +2,28 @@ import moment from "moment";
22

33
import config from "../config";
44
import {logger} from "../logger";
5+
import {JobWorker} from "./jobWorker";
56

6-
export class UpdateDirtyNoteJob {
7+
export class UpdateDirtyNoteJob implements JobWorker {
78
private realtime: any;
89
private timer: NodeJS.Timeout;
910

10-
constructor(realtime) {
11+
constructor(realtime: any) {
1112
this.realtime = realtime
1213
}
1314

14-
start() {
15+
start(): void {
1516
if (this.timer) return
1617
this.timer = setInterval(this.updateDirtyNotes.bind(this), 1000)
1718
}
1819

19-
stop() {
20+
stop(): void {
2021
if (!this.timer) return
2122
clearInterval(this.timer)
2223
this.timer = undefined
2324
}
2425

25-
updateDirtyNotes() {
26+
updateDirtyNotes(): void {
2627
const notes = this.realtime.getNotePool()
2728
Object.keys(notes).forEach((key) => {
2829
const note = notes[key]

0 commit comments

Comments
 (0)