-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
97 lines (86 loc) · 3.06 KB
/
index.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
const assert = require("assert");
const EventEmitter = require("events").EventEmitter;
const logger = require("./service/logger")("MAIL"),
Mailbox = require("./service/mailbox"),
migrate = require("./service/migration"),
Config = require("./service/config");
// trust all certificates
process.env.NODE_TLS_REJECT_UNAUTHORIZED = "0";
const mailChecker = new EventEmitter();
/**
* @type {Config|null}
*/
mailChecker.config = null;
/**
* @param {{checkPeriod:number, messageChunkSize: number, storage:{}}} options
*/
mailChecker.setConfig = function (options) {
this.config = new Config(options);
};
/**
* Проверяет почтовый ящик. Генерирует событие data на получение новых писем
* @param {Mailbox} mailbox
*/
const checkMailbox = function (mailbox) {
mailbox
.listNewMessages()
.then(mailbox.parseNewMessages) // результат парсинга - массив готовых для работы объект сообщения
.then((newMessages) => {
if (newMessages.length > 0) {
mailChecker.emit("data", newMessages);
}
})
.catch((e) => {
logger.error(`Failed to check: ${e.stack}`);
mailChecker.emit("error", e);
})
.finally(mailbox.closeMailbox);
};
/**
* Запускает процесс проверки и обработки настроенных почтовых ящиков с определенной периодичностью
*
* @param {{user: string, password: string, host: string, port: number, tls: boolean}[]} mailboxes
*/
mailChecker.start = async (mailboxes) => {
assert(
mailChecker.config,
"Missing options, use setConfig() method to set mailchecker options",
);
try {
await migrate(mailChecker.config); // run migration is table does not exist
logger.verbose("Mail client has been started...");
mailboxes.map((mailboxConfig, idx) => {
const mailbox = new Mailbox(mailboxConfig, mailChecker.config);
setTimeout(
() => {
setInterval(() => {
checkMailbox(mailbox);
}, mailChecker.config.checkPeriod);
},
idx * (mailChecker.config.checkPeriod / 2),
);
});
} catch (e) {
logger.error("Could not start mail client: " + e.stack);
mailChecker.emit("error", e);
}
};
/**
* Убирает сообщения в указанном диапазоне дат из прочитанных. При следуюзем прогоне эти сообщения будут интерпретированы как новые.
*/
mailChecker.unprocess = async function (mailboxes, dateStart, dateEnd) {
logger.info(`Unprocessing messages ${dateStart} - ${dateEnd}`);
mailboxes.map(async (mailboxConfig) => {
const mailbox = new Mailbox(mailboxConfig, mailChecker.config);
try {
const unprocessedCount = await mailbox.unprocessMessages(
dateStart,
dateEnd,
);
mailChecker.emit("unprocessed", unprocessedCount);
} catch (e) {
mailChecker.emit("error", e);
}
});
};
module.exports = mailChecker;