hamok
Version:
Lightweight Distributed Object Storage on RAFT consensus algorithm
77 lines (76 loc) • 2.58 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.createResponseChunker = createResponseChunker;
const HamokMessage_1 = require("./HamokMessage");
function createResponseChunker(maxKeys, maxValues) {
if (maxKeys < 1 && maxValues < 1) {
return {
apply: (message) => [message].values()
};
}
return new ResponseChunkerImpl(maxKeys, maxValues);
}
class ResponseChunkerImpl {
_maxKeys;
_maxEntries;
constructor(maxKeys, maxValues) {
this._maxKeys = maxKeys;
this._maxEntries = Math.min(maxKeys, maxValues);
}
apply(message) {
if (message.keys === undefined || message.values === undefined) {
return [message].values();
}
if (message.keys.length < 1) {
return [message].values();
}
if (message.values.length < 1) {
if (message.keys.length <= this._maxKeys) {
return [message].values();
}
return this._chunkByKeys(message);
}
else {
if (Math.max(message.keys.length, message.values.length) <= this._maxEntries) {
return [message].values();
}
return this._chunkByEntries(message);
}
}
*_chunkByKeys(message) {
const keys = message.keys;
let sliceStart = 0;
let sequence = 0;
while (sliceStart < keys.length) {
const sliceEnd = Math.min(sliceStart + this._maxKeys, keys.length);
const lastMessage = keys.length === sliceEnd;
yield new HamokMessage_1.HamokMessage({
...message,
keys: keys.slice(sliceStart, sliceEnd),
sequence,
lastMessage
});
sliceStart = sliceEnd;
++sequence;
}
}
*_chunkByEntries(message) {
const keys = message.keys;
const values = message.values;
let sliceStart = 0;
let sequence = 0;
while (sliceStart < keys.length && sliceStart < values.length) {
const sliceEnd = Math.min(sliceStart + this._maxEntries, keys.length);
const lastMessage = keys.length === sliceEnd;
yield new HamokMessage_1.HamokMessage({
...message,
keys: keys.slice(sliceStart, sliceEnd),
values: values.slice(sliceStart, sliceEnd),
sequence,
lastMessage
});
sliceStart = sliceEnd;
++sequence;
}
}
}