61 lines
2.6 KiB
JavaScript
61 lines
2.6 KiB
JavaScript
import { Subscription } from '../Subscription';
|
|
import { operate } from '../util/lift';
|
|
import { createOperatorSubscriber } from './OperatorSubscriber';
|
|
import { arrRemove } from '../util/arrRemove';
|
|
import { asyncScheduler } from '../scheduler/async';
|
|
import { popScheduler } from '../util/args';
|
|
import { executeSchedule } from '../util/executeSchedule';
|
|
export function bufferTime(bufferTimeSpan, ...otherArgs) {
|
|
var _a, _b;
|
|
const scheduler = (_a = popScheduler(otherArgs)) !== null && _a !== void 0 ? _a : asyncScheduler;
|
|
const bufferCreationInterval = (_b = otherArgs[0]) !== null && _b !== void 0 ? _b : null;
|
|
const maxBufferSize = otherArgs[1] || Infinity;
|
|
return operate((source, subscriber) => {
|
|
let bufferRecords = [];
|
|
let restartOnEmit = false;
|
|
const emit = (record) => {
|
|
const { buffer, subs } = record;
|
|
subs.unsubscribe();
|
|
arrRemove(bufferRecords, record);
|
|
subscriber.next(buffer);
|
|
restartOnEmit && startBuffer();
|
|
};
|
|
const startBuffer = () => {
|
|
if (bufferRecords) {
|
|
const subs = new Subscription();
|
|
subscriber.add(subs);
|
|
const buffer = [];
|
|
const record = {
|
|
buffer,
|
|
subs,
|
|
};
|
|
bufferRecords.push(record);
|
|
executeSchedule(subs, scheduler, () => emit(record), bufferTimeSpan);
|
|
}
|
|
};
|
|
if (bufferCreationInterval !== null && bufferCreationInterval >= 0) {
|
|
executeSchedule(subscriber, scheduler, startBuffer, bufferCreationInterval, true);
|
|
}
|
|
else {
|
|
restartOnEmit = true;
|
|
}
|
|
startBuffer();
|
|
const bufferTimeSubscriber = createOperatorSubscriber(subscriber, (value) => {
|
|
const recordsCopy = bufferRecords.slice();
|
|
for (const record of recordsCopy) {
|
|
const { buffer } = record;
|
|
buffer.push(value);
|
|
maxBufferSize <= buffer.length && emit(record);
|
|
}
|
|
}, () => {
|
|
while (bufferRecords === null || bufferRecords === void 0 ? void 0 : bufferRecords.length) {
|
|
subscriber.next(bufferRecords.shift().buffer);
|
|
}
|
|
bufferTimeSubscriber === null || bufferTimeSubscriber === void 0 ? void 0 : bufferTimeSubscriber.unsubscribe();
|
|
subscriber.complete();
|
|
subscriber.unsubscribe();
|
|
}, undefined, () => (bufferRecords = null));
|
|
source.subscribe(bufferTimeSubscriber);
|
|
});
|
|
}
|
|
//# sourceMappingURL=bufferTime.js.map
|