Merge pull request #13510 from backstage/mob/factories

backend-next: incorporate options into createServiceFactory
This commit is contained in:
Patrik Oldsberg
2022-09-09 15:17:14 +02:00
committed by GitHub
12 changed files with 193 additions and 42 deletions
+27 -13
View File
@@ -28,10 +28,12 @@ export interface Backend {
}
// @public (undocumented)
export const cacheFactory: ServiceFactory<PluginCacheManager>;
export const cacheFactory: (
options?: undefined,
) => ServiceFactory<PluginCacheManager>;
// @public (undocumented)
export const configFactory: ServiceFactory<Config>;
export const configFactory: (options?: undefined) => ServiceFactory<Config>;
// @public (undocumented)
export function createSpecializedBackend(
@@ -41,28 +43,36 @@ export function createSpecializedBackend(
// @public (undocumented)
export interface CreateSpecializedBackendOptions {
// (undocumented)
services: ServiceFactory[];
services: (ServiceFactory | (() => ServiceFactory))[];
}
// @public (undocumented)
export const databaseFactory: ServiceFactory<PluginDatabaseManager>;
export const databaseFactory: (
options?: undefined,
) => ServiceFactory<PluginDatabaseManager>;
// @public (undocumented)
export const discoveryFactory: ServiceFactory<PluginEndpointDiscovery>;
export const discoveryFactory: (
options?: undefined,
) => ServiceFactory<PluginEndpointDiscovery>;
// @public (undocumented)
export const httpRouterFactory: ServiceFactory<HttpRouterService>;
export const httpRouterFactory: (
options?: undefined,
) => ServiceFactory<HttpRouterService>;
// @public (undocumented)
export const loggerFactory: ServiceFactory<Logger>;
export const loggerFactory: (options?: undefined) => ServiceFactory<Logger>;
// @public (undocumented)
export const permissionsFactory: ServiceFactory<
PermissionAuthorizer | PermissionEvaluator
>;
export const permissionsFactory: (
options?: undefined,
) => ServiceFactory<PermissionAuthorizer | PermissionEvaluator>;
// @public (undocumented)
export const schedulerFactory: ServiceFactory<PluginTaskScheduler>;
export const schedulerFactory: (
options?: undefined,
) => ServiceFactory<PluginTaskScheduler>;
// @public (undocumented)
export type ServiceOrExtensionPoint<T = unknown> =
@@ -70,8 +80,12 @@ export type ServiceOrExtensionPoint<T = unknown> =
| ServiceRef<T>;
// @public (undocumented)
export const tokenManagerFactory: ServiceFactory<TokenManager>;
export const tokenManagerFactory: (
options?: undefined,
) => ServiceFactory<TokenManager>;
// @public (undocumented)
export const urlReaderFactory: ServiceFactory<UrlReader>;
export const urlReaderFactory: (
options?: undefined,
) => ServiceFactory<UrlReader>;
```
@@ -26,7 +26,9 @@ import { stringifyError } from '@backstage/errors';
* @internal
*/
export type InternalServiceRef<T> = ServiceRef<T> & {
__defaultFactory?: (service: ServiceRef<T>) => Promise<ServiceFactory<T>>;
__defaultFactory?: (
service: ServiceRef<T>,
) => Promise<ServiceFactory<T> | (() => ServiceFactory<T>)>;
};
export class ServiceRegistry {
@@ -40,8 +42,18 @@ export class ServiceRegistry {
}
>;
constructor(factories: ServiceFactory<any>[]) {
this.#providedFactories = new Map(factories.map(f => [f.service.id, f]));
constructor(
factories: Array<ServiceFactory<unknown> | (() => ServiceFactory<unknown>)>,
) {
this.#providedFactories = new Map(
factories.map(f => {
if (typeof f === 'function') {
const cf = f();
return [cf.service.id, cf];
}
return [f.service.id, f];
}),
);
this.#loadedDefaultFactories = new Map();
this.#implementations = new Map();
}
@@ -57,9 +69,11 @@ export class ServiceRegistry {
if (!factory) {
let loadedFactory = this.#loadedDefaultFactories.get(defaultFactory!);
if (!loadedFactory) {
loadedFactory = Promise.resolve().then(
() => defaultFactory!(ref) as Promise<ServiceFactory>,
);
loadedFactory = Promise.resolve()
.then(() => defaultFactory!(ref))
.then(f =>
typeof f === 'function' ? f() : f,
) as Promise<ServiceFactory>;
this.#loadedDefaultFactories.set(defaultFactory!, loadedFactory);
}
// NOTE: This await is safe as long as #providedFactories is not mutated.
+4 -2
View File
@@ -43,7 +43,7 @@ export interface BackendRegisterInit {
* @public
*/
export interface CreateSpecializedBackendOptions {
services: ServiceFactory[];
services: (ServiceFactory | (() => ServiceFactory))[];
}
export type ServiceHolder = {
@@ -56,7 +56,9 @@ export type ServiceHolder = {
export function createSpecializedBackend(
options: CreateSpecializedBackendOptions,
): Backend {
return new BackstageBackend(options.services);
return new BackstageBackend(
options.services.map(s => (typeof s === 'function' ? s() : s)),
);
}
/**