tedis-mod
Version:
redis client for node.js with typescript and async
149 lines (148 loc) • 5.38 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
var Protocol = /** @class */ (function () {
function Protocol() {
this._result = [];
this._end = "";
this.data = {
state: true,
res: {
error: false,
data: null,
},
};
}
Protocol.prototype.write = function (data) {
var array = (this._end + data.toString()).split("\r\n");
this._end = array.pop();
this._result = this._result.concat(array);
};
Protocol.prototype.parse = function () {
this.data = {
state: true,
res: {
error: false,
data: null,
},
};
if (this._result.length < 1 ||
(this._result.length === 1 && this._end.length !== 0)) {
this.data.state = false;
}
else {
var current = this._result[0];
switch (current.charAt(0)) {
case "+":
this.data.res = {
error: false,
data: current.slice(1),
};
this._result.shift();
break;
case "-":
this.data.res = {
error: true,
data: current.slice(1),
};
this._result.shift();
break;
case ":":
this.data.res = {
error: false,
data: +current.slice(1),
};
this._result.shift();
break;
case "$":
var size = parseInt(current.slice(1), 10);
this._result.shift();
if (-1 === size) {
this.data.res = {
error: false,
data: null,
};
}
else {
var res = this._result.shift();
var ls = Buffer.byteLength(res);
if (ls === size) {
this.data.res = {
error: false,
data: res,
};
}
else {
this.data.res = {
error: false,
data: [res],
};
do {
var str = this._result.shift();
this.data.res.data.push(str);
ls += Buffer.byteLength(str);
} while (this._result.length > 0);
}
}
break;
case "*":
var len = parseInt(current.slice(1), 10);
if (0 === len) {
this.data.res = {
error: false,
data: [],
};
this._result.shift();
}
else {
this.data.res.data = [];
var i = void 0;
for (i = 1; i < this._result.length && this.data.res.data.length < len; i++) {
if ("$-1" === this._result[i].slice(0, 3)) {
this.data.res.data.push(null);
}
else if (typeof this._result[i + 1] === "undefined") {
break;
}
else {
this.data.res.data.push(this._result[++i]);
}
}
if (this.data.res.data.length === len) {
this._result.splice(0, i);
}
else {
this.data.state = false;
}
}
break;
default:
this.data.state = false;
}
}
};
Protocol.prototype.encode = function () {
var parameters = [];
for (var _i = 0; _i < arguments.length; _i++) {
parameters[_i] = arguments[_i];
}
var length = parameters.length;
var parameter;
var request = "*" + length + "\r\n";
for (var i = 0; i < length; i++) {
parameter = parameters[i];
if (typeof parameter === "string") {
request += "$" + Buffer.byteLength(parameter) + "\r\n" + parameter + "\r\n";
}
else if (typeof parameter === "number") {
parameter = parameter.toString();
request += "$" + Buffer.byteLength(parameter) + "\r\n" + parameter + "\r\n";
}
else {
throw new Error("encode ags err");
}
}
return request;
};
return Protocol;
}());
exports.Protocol = Protocol;