-
Notifications
You must be signed in to change notification settings - Fork 1
/
quesGenerateProcess.js
executable file
·103 lines (90 loc) · 2.99 KB
/
quesGenerateProcess.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/*
This process listens for ipc messages on socket
which are sent be main application and generate
questions for a contest
New requests are inserted into queue and processed
one by one
*/
const util = require('./lib/util');
const ipc = require('node-ipc');
const crypto = require('crypto');
const generateGrid = require('./cubeGeneration/algo');
const contestService = require('./lib/services/contestService');
const questionService = require('./lib/services/questionService');
const dictionaryService = require('./lib/services/dictionaryService');
const MAX_WORDS_IN_GRID = 2;
const SLEEP_TIME = 10000; // Queue is checked every 5 seconds if empty
const GRID_ROWS = 5;
const GRID_COLS = GRID_ROWS * 4;
class Queue {
constructor() {
this.array = [];
}
push(contestId) {
this.array.push(contestId);
return true;
}
pop() {
if(this.array.length) {
return this.array.shift();
}
return null;
}
}
let queue = new Queue();
ipc.config.id = 'generateProcess';
ipc.config.retry = 15000;
ipc.serve(() => {
ipc.server.on(
'app.message', (data, socket) => {
queue.push(data.contestId);
}
);
});
// IPC server listens on local unix socket for events to occur
ipc.server.start();
let listen = () => {
let contestId = queue.pop();
if(contestId) {
console.log('Genereating questions for', contestId);
questionService.getRandomQuestions(contestId).then((contestQuestions) => {
let questions = {};
Promise.all(
contestQuestions.map((ques) => {
// Get random words from a dictionary
return dictionaryService.getRandomWords(MAX_WORDS_IN_GRID - ques.solutions.length, 'english').then((ans) => {
let words = Array.from(ans);
ques.solutions.map((solution) => { words.push(solution.answer.toUpperCase()); });
let result = generateGrid(words);
console.log('Generated ', result);
return new Promise((resolve, reject) => {
if(result) {
questions[ques._id] = {
words: result.words,
grid: result.grid
};
resolve('complete');
}
else {
console.log('Can\'t generate grid for contest', contestId);
reject('');
}
});
});
})
).then((data) => {
contestService.setQuestions(contestId, questions).then((response) => {
console.log('Questions generated for', contestId);
});
listen();
}).catch((err) => {
console.trace(err);
listen();
});
});
}
else {
setTimeout(listen, SLEEP_TIME);
}
};
listen();