rx-elasticsearch
Version:
RxJS Observables for the Elasticsearch client
37 lines (30 loc) • 1.15 kB
text/typescript
import {Scrollable} from './Scrollable';
import {Observable} from '@reactivex/rxjs';
export class Scroll implements Scrollable {
public static scroll<T>(params:Elasticsearch.SearchParams, client:Elasticsearch.Client):Observable<T> {
let searchPromise = <Promise<T>>client
.search(params);
let obs = Observable
.fromPromise(searchPromise)
.expand((response:any) => {
if (response.hits.hits.length === 0) return Observable.empty<T>();
return Observable.fromPromise(<Promise<T>>client.scroll({
scrollId: response._scroll_id,
scroll: params.scroll
}
));
}
);
let published = obs.publish();
this.clearScroll(published, client);
published.connect();
return published;
}
private static clearScroll(published, client) {
published
.last()
.subscribe((response:any) => client.clearScroll({
scrollId: response._scroll_id
}));
}
}