rsocket-rxjs
Version:
RSocket Protocol Client Implementation
46 lines (45 loc) • 1.69 kB
JavaScript
import { factory } from '../config-log4j';
import { Payload } from './payload';
const log = factory.getLogger("protocol.FragmentsContext");
export class FragmentContext {
constructor() {
this.fragments = [];
}
add(payload) {
this.fragments.push(payload);
}
/**
* Returns aggregated payload
*/
get() {
if (this.fragments.length == 1) {
log.trace("Returning Single Fragment Payload");
const payload = this.fragments[0];
this.fragments = [];
return payload;
}
else {
log.trace("Returning Multi Fragment Payload");
let metdataLength = 0;
let dataLength = 0;
for (let fragment of this.fragments) {
if (fragment.hasMetadata()) {
metdataLength += fragment.metadata.byteLength;
}
dataLength += fragment.data.byteLength;
}
let metadataBufferView = new Uint8Array(metdataLength);
let dataBufferView = new Uint8Array(dataLength);
let metadataPosition = 0;
let dataPosition = 0;
for (let fragment of this.fragments) {
metadataBufferView.set(new Uint8Array(fragment.metadata), metadataPosition);
metadataPosition += fragment.metadata.byteLength;
dataBufferView.set(new Uint8Array(fragment.data), dataPosition);
dataPosition += fragment.data.byteLength;
}
this.fragments = [];
return new Payload(dataBufferView, metadataBufferView);
}
}
}