address code review comments
Signed-off-by: Brian Fletcher <brian@roadie.io>
This commit is contained in:
@@ -2,4 +2,6 @@
|
||||
'@backstage/plugin-events-backend': patch
|
||||
---
|
||||
|
||||
Export `InMemoryEventBroker` to allow decoupling of the catalog and events backends in the `example-backend`.
|
||||
Export `DefaultEventBroker` to allow decoupling of the catalog and events backends in the `example-backend`.
|
||||
|
||||
Please look at `plugins/events-backend/README.md` for the currently advised was to set up the event backend and catalog providers.
|
||||
|
||||
@@ -67,7 +67,7 @@ import linguist from './plugins/linguist';
|
||||
import { PluginEnvironment } from './types';
|
||||
import { ServerPermissionClient } from '@backstage/plugin-permission-node';
|
||||
import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
|
||||
import { InMemoryEventBroker } from '@backstage/plugin-events-backend';
|
||||
import { DefaultEventBroker } from '@backstage/plugin-events-backend';
|
||||
|
||||
function makeCreateEnv(config: Config) {
|
||||
const root = getRootLogger();
|
||||
@@ -85,7 +85,7 @@ function makeCreateEnv(config: Config) {
|
||||
discovery,
|
||||
});
|
||||
|
||||
const eventBroker = new InMemoryEventBroker(root.child({ type: 'plugin' }));
|
||||
const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' }));
|
||||
|
||||
root.info(`Created UrlReader ${reader}`);
|
||||
|
||||
|
||||
@@ -18,16 +18,29 @@ import {
|
||||
EntityProvider,
|
||||
EntityProviderConnection,
|
||||
} from '@backstage/plugin-catalog-node';
|
||||
import { EventParams, EventSubscriber } from '@backstage/plugin-events-node';
|
||||
import {
|
||||
EventBroker,
|
||||
EventParams,
|
||||
EventSubscriber,
|
||||
} from '@backstage/plugin-events-node';
|
||||
import { Logger } from 'winston';
|
||||
|
||||
export class DemoEventBasedEntityProvider
|
||||
implements EntityProvider, EventSubscriber
|
||||
{
|
||||
constructor(
|
||||
private readonly logger: Logger,
|
||||
private readonly topics: string[],
|
||||
) {}
|
||||
private readonly logger: Logger;
|
||||
private readonly topics: string[];
|
||||
|
||||
constructor(opts: {
|
||||
eventBroker: EventBroker;
|
||||
logger: Logger;
|
||||
topics: string[];
|
||||
}) {
|
||||
const { eventBroker, logger, topics } = opts;
|
||||
eventBroker.subscribe(this);
|
||||
this.logger = logger;
|
||||
this.topics = topics;
|
||||
}
|
||||
|
||||
async onEvent(params: EventParams): Promise<void> {
|
||||
this.logger.info(
|
||||
|
||||
@@ -23,13 +23,14 @@ import { DemoEventBasedEntityProvider } from './DemoEventBasedEntityProvider';
|
||||
export default async function createPlugin(
|
||||
env: PluginEnvironment,
|
||||
): Promise<Router> {
|
||||
const { eventBroker, logger } = env;
|
||||
|
||||
const builder = await CatalogBuilder.create(env);
|
||||
builder.addProcessor(new ScaffolderEntitiesProcessor());
|
||||
|
||||
const demoProvider = new DemoEventBasedEntityProvider(logger, ['example']);
|
||||
eventBroker.subscribe(demoProvider);
|
||||
const demoProvider = new DemoEventBasedEntityProvider({
|
||||
logger: env.logger,
|
||||
topics: ['example'],
|
||||
eventBroker: env.eventBroker,
|
||||
});
|
||||
builder.addEntityProvider(demoProvider);
|
||||
|
||||
const { processingEngine, router } = await builder.build();
|
||||
|
||||
@@ -28,7 +28,7 @@ You will need to add the following to the backend configuration `#makeCreateEnv`
|
||||
|
||||
```diff
|
||||
// packages/backend/src/index.ts
|
||||
+ const eventBroker = new InMemoryEventBroker(root.child({ type: 'plugin' }));
|
||||
+ const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' }));
|
||||
```
|
||||
|
||||
Then update plugin environment to include the event broker.
|
||||
|
||||
@@ -12,6 +12,17 @@ import express from 'express';
|
||||
import { HttpPostIngressOptions } from '@backstage/plugin-events-node';
|
||||
import { Logger } from 'winston';
|
||||
|
||||
// @public
|
||||
export class DefaultEventBroker implements EventBroker {
|
||||
constructor(logger: Logger);
|
||||
// (undocumented)
|
||||
publish(params: EventParams): Promise<void>;
|
||||
// (undocumented)
|
||||
subscribe(
|
||||
...subscribers: Array<EventSubscriber | Array<EventSubscriber>>
|
||||
): void;
|
||||
}
|
||||
|
||||
// @public
|
||||
export class EventsBackend {
|
||||
constructor(logger: Logger);
|
||||
@@ -43,15 +54,4 @@ export class HttpPostIngressEventPublisher implements EventPublisher {
|
||||
// (undocumented)
|
||||
setEventBroker(eventBroker: EventBroker): Promise<void>;
|
||||
}
|
||||
|
||||
// @public
|
||||
export class InMemoryEventBroker implements EventBroker {
|
||||
constructor(logger: Logger);
|
||||
// (undocumented)
|
||||
publish(params: EventParams): Promise<void>;
|
||||
// (undocumented)
|
||||
subscribe(
|
||||
...subscribers: Array<EventSubscriber | Array<EventSubscriber>>
|
||||
): void;
|
||||
}
|
||||
```
|
||||
|
||||
@@ -22,4 +22,4 @@
|
||||
|
||||
export { EventsBackend } from './service/EventsBackend';
|
||||
export { HttpPostIngressEventPublisher } from './service/http';
|
||||
export { InMemoryEventBroker } from './service/InMemoryEventBroker';
|
||||
export { DefaultEventBroker } from './service/DefaultEventBroker';
|
||||
|
||||
+4
-4
@@ -17,15 +17,15 @@
|
||||
import { getVoidLogger } from '@backstage/backend-common';
|
||||
import { TestEventSubscriber } from '@backstage/plugin-events-backend-test-utils';
|
||||
import { EventParams, EventSubscriber } from '@backstage/plugin-events-node';
|
||||
import { InMemoryEventBroker } from './InMemoryEventBroker';
|
||||
import { DefaultEventBroker } from './DefaultEventBroker';
|
||||
|
||||
const logger = getVoidLogger();
|
||||
|
||||
describe('InMemoryEventBroker', () => {
|
||||
describe('DefaultEventBroker', () => {
|
||||
it('passes events to interested subscribers', () => {
|
||||
const subscriber1 = new TestEventSubscriber('test1', ['topicA', 'topicB']);
|
||||
const subscriber2 = new TestEventSubscriber('test2', ['topicB', 'topicC']);
|
||||
const eventBroker = new InMemoryEventBroker(logger);
|
||||
const eventBroker = new DefaultEventBroker(logger);
|
||||
|
||||
eventBroker.subscribe(subscriber1);
|
||||
eventBroker.subscribe(subscriber2);
|
||||
@@ -86,7 +86,7 @@ describe('InMemoryEventBroker', () => {
|
||||
})();
|
||||
|
||||
const errorSpy = jest.spyOn(logger, 'error');
|
||||
const eventBroker = new InMemoryEventBroker(logger);
|
||||
const eventBroker = new DefaultEventBroker(logger);
|
||||
|
||||
eventBroker.subscribe(subscriber1);
|
||||
await eventBroker.publish({ topic, eventPayload: '1' });
|
||||
+2
-2
@@ -22,14 +22,14 @@ import {
|
||||
import { Logger } from 'winston';
|
||||
|
||||
/**
|
||||
* In-memory event broker which will pass the event to all registered subscribers
|
||||
* In process event broker which will pass the event to all registered subscribers
|
||||
* interested in it.
|
||||
* Events will not be persisted in any form.
|
||||
*
|
||||
* @public
|
||||
*/
|
||||
// TODO(pjungermann): add prom metrics? (see plugins/catalog-backend/src/util/metrics.ts, etc.)
|
||||
export class InMemoryEventBroker implements EventBroker {
|
||||
export class DefaultEventBroker implements EventBroker {
|
||||
constructor(private readonly logger: Logger) {}
|
||||
|
||||
private readonly subscribers: {
|
||||
@@ -20,7 +20,7 @@ import {
|
||||
EventSubscriber,
|
||||
} from '@backstage/plugin-events-node';
|
||||
import { Logger } from 'winston';
|
||||
import { InMemoryEventBroker } from './InMemoryEventBroker';
|
||||
import { DefaultEventBroker } from './DefaultEventBroker';
|
||||
|
||||
/**
|
||||
* A builder that helps wire up all component parts of the event management.
|
||||
@@ -33,7 +33,7 @@ export class EventsBackend {
|
||||
private subscribers: EventSubscriber[] = [];
|
||||
|
||||
constructor(logger: Logger) {
|
||||
this.eventBroker = new InMemoryEventBroker(logger);
|
||||
this.eventBroker = new DefaultEventBroker(logger);
|
||||
}
|
||||
|
||||
setEventBroker(eventBroker: EventBroker): EventsBackend {
|
||||
|
||||
@@ -29,7 +29,7 @@ import {
|
||||
EventSubscriber,
|
||||
HttpPostIngressOptions,
|
||||
} from '@backstage/plugin-events-node';
|
||||
import { InMemoryEventBroker } from './InMemoryEventBroker';
|
||||
import { DefaultEventBroker } from './DefaultEventBroker';
|
||||
import Router from 'express-promise-router';
|
||||
import { HttpPostIngressEventPublisher } from './http';
|
||||
|
||||
@@ -113,7 +113,7 @@ export const eventsPlugin = createBackendPlugin({
|
||||
router.use(eventsRouter);
|
||||
|
||||
const eventBroker =
|
||||
extensionPoint.eventBroker ?? new InMemoryEventBroker(winstonLogger);
|
||||
extensionPoint.eventBroker ?? new DefaultEventBroker(winstonLogger);
|
||||
|
||||
eventBroker.subscribe(extensionPoint.subscribers);
|
||||
[extensionPoint.publishers, http]
|
||||
|
||||
Reference in New Issue
Block a user