|
|
|
@ -1379,6 +1379,47 @@ let commandHandlers = createCommandHandlers({
|
|
|
|
|
},
|
|
|
|
|
"CAPABILITY": function (_request, { payload }) {
|
|
|
|
|
this._caps = payload.map((v) => v.toUpperCase());
|
|
|
|
|
},
|
|
|
|
|
"NAMESPACE": function (_request, { payload }) {
|
|
|
|
|
this.namespaces = payload;
|
|
|
|
|
},
|
|
|
|
|
"PREAUTH": function (_request, _) {
|
|
|
|
|
this.state = 'authenticated';
|
|
|
|
|
},
|
|
|
|
|
"EXPUNGE": function (_request, { sequenceNumber }) {
|
|
|
|
|
if (this._box != null) {
|
|
|
|
|
if (this._box.messages.total > 0) {
|
|
|
|
|
this._box.messages.total -= 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.emit('expunge', sequenceNumber);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"STATUS": {
|
|
|
|
|
untagged: {
|
|
|
|
|
"STATUS": function (request, { payload }) {
|
|
|
|
|
// REFACTOR: Improve this?
|
|
|
|
|
let attrs = defaultValue(payload.attrs, {});
|
|
|
|
|
|
|
|
|
|
let box = {
|
|
|
|
|
name: payload.name,
|
|
|
|
|
uidnext: defaultValue(attrs.uidnext, 0),
|
|
|
|
|
uidvalidity: defaultValue(attrs.uidvalidity, 0),
|
|
|
|
|
messages: {
|
|
|
|
|
total: defaultValue(attrs.messages, 0),
|
|
|
|
|
new: defaultValue(attrs.recent, 0),
|
|
|
|
|
unseen: defaultValue(attrs.unseen, 0)
|
|
|
|
|
},
|
|
|
|
|
// CONDSTORE
|
|
|
|
|
highestmodseq: (attrs.highestmodseq != null)
|
|
|
|
|
? String(attrs.highestmodseq)
|
|
|
|
|
: undefined
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
request.legacyArgs.push(box);
|
|
|
|
|
Object.assign(request.responseData, box);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
@ -1533,18 +1574,6 @@ Connection.prototype._resUntagged = function({ type, num: sequenceNumber, textCo
|
|
|
|
|
if (commandHandlers.canHandleUntagged(this._curReq, response)) {
|
|
|
|
|
// FIXME: Include other fields
|
|
|
|
|
commandHandlers.handleUntagged.call(this, this._curReq, response);
|
|
|
|
|
} else if (type === 'namespace') {
|
|
|
|
|
this.namespaces = payload;
|
|
|
|
|
} else if (type === 'preauth') {
|
|
|
|
|
this.state = 'authenticated';
|
|
|
|
|
} else if (type === 'expunge') {
|
|
|
|
|
if (this._box) {
|
|
|
|
|
if (this._box.messages.total > 0) {
|
|
|
|
|
this._box.messages.total -= 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.emit('expunge', sequenceNumber);
|
|
|
|
|
}
|
|
|
|
|
} else if (type === 'ok') {
|
|
|
|
|
if (this.state === 'connected' && !this._curReq) {
|
|
|
|
|
this._login();
|
|
|
|
@ -1598,26 +1627,6 @@ Connection.prototype._resUntagged = function({ type, num: sequenceNumber, textCo
|
|
|
|
|
this.emit('error', err);
|
|
|
|
|
this._sock.end();
|
|
|
|
|
}
|
|
|
|
|
} else if (type === 'status') {
|
|
|
|
|
let attrs = defaultValue(payload.attrs, {});
|
|
|
|
|
|
|
|
|
|
box = {
|
|
|
|
|
name: payload.name,
|
|
|
|
|
uidnext: defaultValue(attrs.uidnext, 0),
|
|
|
|
|
uidvalidity: defaultValue(attrs.uidvalidity, 0),
|
|
|
|
|
messages: {
|
|
|
|
|
total: defaultValue(attrs.messages, 0),
|
|
|
|
|
new: defaultValue(attrs.recent, 0),
|
|
|
|
|
unseen: defaultValue(attrs.unseen, 0)
|
|
|
|
|
},
|
|
|
|
|
// CONDSTORE
|
|
|
|
|
highestmodseq: (attrs.highestmodseq != null)
|
|
|
|
|
? String(attrs.highestmodseq)
|
|
|
|
|
: undefined
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// FIXME
|
|
|
|
|
this._curReq.cbargs.push(box);
|
|
|
|
|
} else if (type === 'fetch') {
|
|
|
|
|
if (/^(?:UID )?FETCH/.test(this._curReq.fullcmd)) {
|
|
|
|
|
// FETCH response sent as result of FETCH request
|
|
|
|
|