UNPKG

hamok

Version:

Lightweight Distributed Object Storage on RAFT consensus algorithm

77 lines (76 loc) 2.58 kB
"use strict"; 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; } } }