1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950 |
- import { Subject } from './Subject';
- import { dateTimestampProvider } from './scheduler/dateTimestampProvider';
- export class ReplaySubject extends Subject {
- constructor(_bufferSize = Infinity, _windowTime = Infinity, _timestampProvider = dateTimestampProvider) {
- super();
- this._bufferSize = _bufferSize;
- this._windowTime = _windowTime;
- this._timestampProvider = _timestampProvider;
- this._buffer = [];
- this._infiniteTimeWindow = true;
- this._infiniteTimeWindow = _windowTime === Infinity;
- this._bufferSize = Math.max(1, _bufferSize);
- this._windowTime = Math.max(1, _windowTime);
- }
- next(value) {
- const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;
- if (!isStopped) {
- _buffer.push(value);
- !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);
- }
- this._trimBuffer();
- super.next(value);
- }
- _subscribe(subscriber) {
- this._throwIfClosed();
- this._trimBuffer();
- const subscription = this._innerSubscribe(subscriber);
- const { _infiniteTimeWindow, _buffer } = this;
- const copy = _buffer.slice();
- for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {
- subscriber.next(copy[i]);
- }
- this._checkFinalizedStatuses(subscriber);
- return subscription;
- }
- _trimBuffer() {
- const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;
- const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;
- _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);
- if (!_infiniteTimeWindow) {
- const now = _timestampProvider.now();
- let last = 0;
- for (let i = 1; i < _buffer.length && _buffer[i] <= now; i += 2) {
- last = i;
- }
- last && _buffer.splice(0, last + 1);
- }
- }
- }
- //# sourceMappingURL=ReplaySubject.js.map
|