Skip to content

Commit

Permalink
[Search] Add "restore" to session service (elastic#81924)
Browse files Browse the repository at this point in the history
  • Loading branch information
Dosant committed Oct 30, 2020
1 parent ae05572 commit be4889c
Show file tree
Hide file tree
Showing 18 changed files with 141 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,6 @@ export interface ISearchSetup
| Property | Type | Description |
| --- | --- | --- |
| [aggs](./kibana-plugin-plugins-data-public.isearchsetup.aggs.md) | <code>AggsSetup</code> | |
| [session](./kibana-plugin-plugins-data-public.isearchsetup.session.md) | <code>ISessionService</code> | session management |
| [session](./kibana-plugin-plugins-data-public.isearchsetup.session.md) | <code>ISessionService</code> | session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) |
| [usageCollector](./kibana-plugin-plugins-data-public.isearchsetup.usagecollector.md) | <code>SearchUsageCollector</code> | |

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## ISearchSetup.session property

session management
session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)

<b>Signature:</b>

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,6 @@ export interface ISearchStart
| [aggs](./kibana-plugin-plugins-data-public.isearchstart.aggs.md) | <code>AggsStart</code> | agg config sub service [AggsStart](./kibana-plugin-plugins-data-public.aggsstart.md) |
| [search](./kibana-plugin-plugins-data-public.isearchstart.search.md) | <code>ISearchGeneric</code> | low level search [ISearchGeneric](./kibana-plugin-plugins-data-public.isearchgeneric.md) |
| [searchSource](./kibana-plugin-plugins-data-public.isearchstart.searchsource.md) | <code>ISearchStartSearchSource</code> | high level search [ISearchStartSearchSource](./kibana-plugin-plugins-data-public.isearchstartsearchsource.md) |
| [session](./kibana-plugin-plugins-data-public.isearchstart.session.md) | <code>ISessionService</code> | session management |
| [session](./kibana-plugin-plugins-data-public.isearchstart.session.md) | <code>ISessionService</code> | session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) |
| [showError](./kibana-plugin-plugins-data-public.isearchstart.showerror.md) | <code>(e: Error) =&gt; void</code> | |

Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

## ISearchStart.session property

session management
session management [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)

<b>Signature:</b>

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) &gt; [clear](./kibana-plugin-plugins-data-public.isessionservice.clear.md)

## ISessionService.clear property

Clears the active session.

<b>Signature:</b>

```typescript
clear: () => void;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) &gt; [getSession$](./kibana-plugin-plugins-data-public.isessionservice.getsession_.md)

## ISessionService.getSession$ property

Returns the observable that emits an update every time the session ID changes

<b>Signature:</b>

```typescript
getSession$: () => Observable<string | undefined>;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) &gt; [getSessionId](./kibana-plugin-plugins-data-public.isessionservice.getsessionid.md)

## ISessionService.getSessionId property

Returns the active session ID

<b>Signature:</b>

```typescript
getSessionId: () => string | undefined;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md)

## ISessionService interface

<b>Signature:</b>

```typescript
export interface ISessionService
```

## Properties

| Property | Type | Description |
| --- | --- | --- |
| [clear](./kibana-plugin-plugins-data-public.isessionservice.clear.md) | <code>() =&gt; void</code> | Clears the active session. |
| [getSession$](./kibana-plugin-plugins-data-public.isessionservice.getsession_.md) | <code>() =&gt; Observable&lt;string &#124; undefined&gt;</code> | Returns the observable that emits an update every time the session ID changes |
| [getSessionId](./kibana-plugin-plugins-data-public.isessionservice.getsessionid.md) | <code>() =&gt; string &#124; undefined</code> | Returns the active session ID |
| [restore](./kibana-plugin-plugins-data-public.isessionservice.restore.md) | <code>(sessionId: string) =&gt; void</code> | Restores existing session |
| [start](./kibana-plugin-plugins-data-public.isessionservice.start.md) | <code>() =&gt; string</code> | Starts a new session |

Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) &gt; [restore](./kibana-plugin-plugins-data-public.isessionservice.restore.md)

## ISessionService.restore property

Restores existing session

<b>Signature:</b>

```typescript
restore: (sessionId: string) => void;
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!-- Do not edit this file. It is automatically generated by API Documenter. -->

[Home](./index.md) &gt; [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) &gt; [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) &gt; [start](./kibana-plugin-plugins-data-public.isessionservice.start.md)

## ISessionService.start property

Starts a new session

<b>Signature:</b>

```typescript
start: () => string;
```
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@
| [ISearchSetup](./kibana-plugin-plugins-data-public.isearchsetup.md) | The setup contract exposed by the Search plugin exposes the search strategy extension point. |
| [ISearchStart](./kibana-plugin-plugins-data-public.isearchstart.md) | search service |
| [ISearchStartSearchSource](./kibana-plugin-plugins-data-public.isearchstartsearchsource.md) | high level search service |
| [ISessionService](./kibana-plugin-plugins-data-public.isessionservice.md) | |
| [KueryNode](./kibana-plugin-plugins-data-public.kuerynode.md) | |
| [OptionedValueProp](./kibana-plugin-plugins-data-public.optionedvalueprop.md) | |
| [QueryState](./kibana-plugin-plugins-data-public.querystate.md) | All query state service state |
Expand Down
1 change: 1 addition & 0 deletions src/plugins/data/common/search/session/mocks.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export function getSessionServiceMock(): jest.Mocked<ISessionService> {
return {
clear: jest.fn(),
start: jest.fn(),
restore: jest.fn(),
getSessionId: jest.fn(),
getSession$: jest.fn(),
};
Expand Down
6 changes: 6 additions & 0 deletions src/plugins/data/common/search/session/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ export interface ISessionService {
* Starts a new session
*/
start: () => string;

/**
* Restores existing session
*/
restore: (sessionId: string) => void;

/**
* Clears the active session.
*/
Expand Down
2 changes: 1 addition & 1 deletion src/plugins/data/public/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ export {
PainlessError,
} from './search';

export type { SearchSource } from './search';
export type { SearchSource, ISessionService } from './search';

export { ISearchOptions, isErrorResponse, isCompleteResponse, isPartialResponse } from '../common';

Expand Down
14 changes: 11 additions & 3 deletions src/plugins/data/public/public.api.md
Original file line number Diff line number Diff line change
Expand Up @@ -1423,8 +1423,6 @@ export interface ISearchSetup {
//
// (undocumented)
aggs: AggsSetup;
// Warning: (ae-forgotten-export) The symbol "ISessionService" needs to be exported by the entry point index.d.ts
// Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "kibana" does not have an export "ISessionService"
session: ISessionService;
// Warning: (ae-forgotten-export) The symbol "SearchUsageCollector" needs to be exported by the entry point index.d.ts
//
Expand All @@ -1440,7 +1438,6 @@ export interface ISearchStart {
aggs: AggsStart;
search: ISearchGeneric;
searchSource: ISearchStartSearchSource;
// Warning: (ae-unresolved-link) The @link reference could not be resolved: The package "kibana" does not have an export "ISessionService"
session: ISessionService;
// (undocumented)
showError: (e: Error) => void;
Expand All @@ -1457,6 +1454,17 @@ export interface ISearchStartSearchSource {
// @public (undocumented)
export const isErrorResponse: (response?: IKibanaSearchResponse<any> | undefined) => boolean | undefined;

// Warning: (ae-missing-release-tag) "ISessionService" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
export interface ISessionService {
clear: () => void;
getSession$: () => Observable<string | undefined>;
getSessionId: () => string | undefined;
restore: (sessionId: string) => void;
start: () => string;
}

// Warning: (ae-missing-release-tag) "isFilter" is exported by the package, but it is missing a release tag (@alpha, @beta, @public, or @internal)
//
// @public (undocumented)
Expand Down
1 change: 1 addition & 0 deletions src/plugins/data/public/search/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ export {
SearchSourceDependencies,
SearchSourceFields,
SortDirection,
ISessionService,
} from '../../common/search';

export { getEsPreference } from './es_search';
Expand Down
16 changes: 16 additions & 0 deletions src/plugins/data/public/search/session_service.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import { SessionService } from './session_service';
import { ISessionService } from '../../common';
import { coreMock } from '../../../../core/public/mocks';
import { take, toArray } from 'rxjs/operators';

describe('Session service', () => {
let sessionService: ISessionService;
Expand All @@ -39,5 +40,20 @@ describe('Session service', () => {
sessionService.clear();
expect(sessionService.getSessionId()).toBeUndefined();
});

it('Restores a session', async () => {
const sessionId = 'sessionId';
sessionService.restore(sessionId);
expect(sessionService.getSessionId()).toBe(sessionId);
});

it('sessionId$ observable emits current value', async () => {
sessionService.restore('1');
const emittedValues = sessionService.getSession$().pipe(take(3), toArray()).toPromise();
sessionService.restore('2');
sessionService.clear();

expect(await emittedValues).toEqual(['1', '2', undefined]);
});
});
});
22 changes: 13 additions & 9 deletions src/plugins/data/public/search/session_service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,16 @@
*/

import uuid from 'uuid';
import { Subject, Subscription } from 'rxjs';
import { BehaviorSubject, Subscription } from 'rxjs';
import { PluginInitializerContext, StartServicesAccessor } from 'kibana/public';
import { ISessionService } from '../../common/search';
import { ConfigSchema } from '../../config';
import { ISessionService } from '../../common/search';

export class SessionService implements ISessionService {
private sessionId?: string;
private session$: Subject<string | undefined> = new Subject();
private session$ = new BehaviorSubject<string | undefined>(undefined);
private get sessionId() {
return this.session$.getValue();
}
private appChangeSubscription$?: Subscription;
private curApp?: string;

Expand Down Expand Up @@ -68,13 +70,15 @@ export class SessionService implements ISessionService {
}

public start() {
this.sessionId = uuid.v4();
this.session$.next(this.sessionId);
return this.sessionId;
this.session$.next(uuid.v4());
return this.sessionId!;
}

public restore(sessionId: string) {
this.session$.next(sessionId);
}

public clear() {
this.sessionId = undefined;
this.session$.next(this.sessionId);
this.session$.next(undefined);
}
}

0 comments on commit be4889c

Please sign in to comment.