[Part of #176153] HTTP service (#179754)

This commit is contained in:
Alejandro Fernández Haro 2024-04-02 11:19:48 +02:00 committed by GitHub
parent 3497a5da79
commit b55b55e88c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 12 additions and 23 deletions

View file

@ -7,7 +7,7 @@
*/
import { Stream } from 'stream';
import { ValidationError, Type, schema, isConfigSchema } from '@kbn/config-schema';
import { ValidationError, schema, isConfigSchema } from '@kbn/config-schema';
import type {
RouteValidationSpec,
RouteValidationFunction,
@ -18,15 +18,6 @@ import type {
} from '@kbn/core-http-server';
import { RouteValidationError } from '@kbn/core-http-server';
// Ugly as hell but we need this conditional typing to have proper type inference
type RouteValidationResultType<T extends RouteValidationSpec<any> | undefined> = NonNullable<
T extends RouteValidationFunction<any>
? ReturnType<T>['value']
: T extends Type<any>
? T['type']
: undefined
>;
/**
* Route validator class to define the validation logic for each new route.
*
@ -92,9 +83,9 @@ export class RouteValidator<P = {}, Q = {}, B = {}> {
unsafe?: boolean,
data?: unknown,
namespace?: string
): RouteValidationResultType<typeof validationRule> {
): T {
if (typeof validationRule === 'undefined') {
return {};
return {} as T;
}
let precheckedData = this.preValidateSchema(data).validate(data, {}, namespace);
@ -125,12 +116,10 @@ export class RouteValidator<P = {}, Q = {}, B = {}> {
validationRule: RouteValidationSpec<T>,
data?: unknown,
namespace?: string
): RouteValidationResultType<typeof validationRule> {
): T {
if (isConfigSchema(validationRule)) {
// @ts-expect-error upgrade typescript v4.9.5
return validationRule.validate(data, {}, namespace);
} else if (typeof validationRule === 'function') {
// @ts-expect-error upgrade typescript v4.9.5
return this.validateFunction(validationRule, data, namespace);
} else {
throw new ValidationError(

View file

@ -18,7 +18,7 @@ import type {
} from '@kbn/core-http-server';
import { ensureRawRequest } from '@kbn/core-http-router-server-internal';
class ScopedCookieSessionStorage<T extends Record<string, any>> implements SessionStorage<T> {
class ScopedCookieSessionStorage<T extends object> implements SessionStorage<T> {
constructor(
private readonly log: Logger,
private readonly server: Server,
@ -72,7 +72,7 @@ function validateOptions(options: SessionStorageCookieOptions<any>) {
* @param server - hapi server to create SessionStorage for
* @param cookieOptions - cookies configuration
*/
export async function createCookieSessionStorageFactory<T>(
export async function createCookieSessionStorageFactory<T extends object>(
log: Logger,
server: Server,
cookieOptions: SessionStorageCookieOptions<T>,
@ -113,7 +113,6 @@ export async function createCookieSessionStorageFactory<T>(
return {
asScoped(request: KibanaRequest) {
// @ts-expect-error upgrade typescript v4.9.5
return new ScopedCookieSessionStorage<T>(log, server, ensureRawRequest(request));
},
};

View file

@ -292,8 +292,9 @@ export class HttpServer {
registerAuth: this.registerAuth.bind(this),
registerOnPostAuth: this.registerOnPostAuth.bind(this),
registerOnPreResponse: this.registerOnPreResponse.bind(this),
createCookieSessionStorageFactory: <T>(cookieOptions: SessionStorageCookieOptions<T>) =>
this.createCookieSessionStorageFactory(cookieOptions, config.basePath),
createCookieSessionStorageFactory: <T extends object>(
cookieOptions: SessionStorageCookieOptions<T>
) => this.createCookieSessionStorageFactory(cookieOptions, config.basePath),
basePath: basePathService,
csp: config.csp,
auth: {
@ -554,7 +555,7 @@ export class HttpServer {
this.server.ext('onPreResponse', adoptToHapiOnPreResponseFormat(fn, this.log));
}
private async createCookieSessionStorageFactory<T>(
private async createCookieSessionStorageFactory<T extends object>(
cookieOptions: SessionStorageCookieOptions<T>,
basePath?: string
) {

View file

@ -22,7 +22,7 @@ type ReturnMocked<T> = {
type DeepMocked<T> = jest.Mocked<ReturnMocked<T>>;
const creatSessionStorageFactoryMock = <T>() => {
const creatSessionStorageFactoryMock = <T extends object>() => {
const mocked: DeepMocked<SessionStorageFactory<T>> = {
asScoped: jest.fn(),
};

View file

@ -218,7 +218,7 @@ export interface HttpServiceSetup<
* Creates cookie based session storage factory {@link SessionStorageFactory}
* @param cookieOptions {@link SessionStorageCookieOptions} - options to configure created cookie session storage.
*/
createCookieSessionStorageFactory: <T>(
createCookieSessionStorageFactory: <T extends object>(
cookieOptions: SessionStorageCookieOptions<T>
) => Promise<SessionStorageFactory<T>>;