chore: rename SignalService to SignalsService

Signed-off-by: Heikki Hellgren <heikki.hellgren@op.fi>
This commit is contained in:
Heikki Hellgren
2024-03-12 08:54:03 +02:00
parent 0b120df27b
commit 6d84ee63ce
18 changed files with 137 additions and 56 deletions
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-signals-node': patch
---
Renamed `SignalService` to `SignalsService` and `signalService` to `signalServiceRef`
to follow the naming scheme of services and their references
+6
View File
@@ -0,0 +1,6 @@
---
'@backstage/plugin-notifications-backend': patch
'@backstage/plugin-signals-backend': patch
---
Changed to use the refactored signal service naming
+3 -3
View File
@@ -74,7 +74,7 @@ import { DefaultEventsService } from '@backstage/plugin-events-node';
import { PrometheusExporter } from '@opentelemetry/exporter-prometheus';
import { MeterProvider } from '@opentelemetry/sdk-metrics';
import { metrics } from '@opentelemetry/api';
import { DefaultSignalService } from '@backstage/plugin-signals-node';
import { DefaultSignalsService } from '@backstage/plugin-signals-node';
// Expose opentelemetry metrics using a Prometheus exporter on
// http://localhost:9464/metrics . See prometheus.yml in packages/backend for
@@ -105,7 +105,7 @@ function makeCreateEnv(config: Config) {
root.child({ type: 'plugin' }),
eventsService,
);
const signalService = DefaultSignalService.create({
const signalsService = DefaultSignalsService.create({
events: eventsService,
});
@@ -130,7 +130,7 @@ function makeCreateEnv(config: Config) {
permissions,
scheduler,
identity,
signalService,
signals: signalsService,
};
};
}
+2 -2
View File
@@ -27,7 +27,7 @@ import { PluginTaskScheduler } from '@backstage/backend-tasks';
import { IdentityApi } from '@backstage/plugin-auth-node';
import { PermissionEvaluator } from '@backstage/plugin-permission-common';
import { EventBroker, EventsService } from '@backstage/plugin-events-node';
import { SignalService } from '@backstage/plugin-signals-node';
import { SignalsService } from '@backstage/plugin-signals-node';
export type PluginEnvironment = {
logger: Logger;
@@ -45,5 +45,5 @@ export type PluginEnvironment = {
*/
eventBroker: EventBroker;
events: EventsService;
signalService: SignalService;
signals: SignalsService;
};
+3 -3
View File
@@ -19,7 +19,7 @@ import {
createBackendPlugin,
} from '@backstage/backend-plugin-api';
import { createRouter } from './service/router';
import { signalService } from '@backstage/plugin-signals-node';
import { signalsServiceRef } from '@backstage/plugin-signals-node';
import {
NotificationProcessor,
notificationsProcessingExtensionPoint,
@@ -66,7 +66,7 @@ export const notificationsPlugin = createBackendPlugin({
logger: coreServices.logger,
database: coreServices.database,
discovery: coreServices.discovery,
signals: signalService,
signals: signalsServiceRef,
},
async init({
auth,
@@ -86,7 +86,7 @@ export const notificationsPlugin = createBackendPlugin({
logger,
database,
discovery,
signalService: signals,
signals,
processors: processingExtensions.processors,
}),
);
@@ -23,7 +23,7 @@ import request from 'supertest';
import { createRouter } from './router';
import { ConfigReader } from '@backstage/config';
import { SignalService } from '@backstage/plugin-signals-node';
import { SignalsService } from '@backstage/plugin-signals-node';
import { mockServices } from '@backstage/backend-test-utils';
function createDatabase(): PluginDatabaseManager {
@@ -42,7 +42,7 @@ function createDatabase(): PluginDatabaseManager {
describe('createRouter', () => {
let app: express.Express;
const signalService: jest.Mocked<SignalService> = {
const signalService: jest.Mocked<SignalsService> = {
publish: jest.fn(),
};
@@ -56,7 +56,7 @@ describe('createRouter', () => {
logger: getVoidLogger(),
database: createDatabase(),
discovery,
signalService,
signals: signalService,
userInfo,
httpAuth,
auth,
@@ -38,7 +38,7 @@ import {
LoggerService,
UserInfoService,
} from '@backstage/backend-plugin-api';
import { SignalService } from '@backstage/plugin-signals-node';
import { SignalsService } from '@backstage/plugin-signals-node';
import {
NewNotificationSignal,
Notification,
@@ -53,7 +53,7 @@ export interface RouterOptions {
auth: AuthService;
httpAuth: HttpAuthService;
userInfo: UserInfoService;
signalService?: SignalService;
signals?: SignalsService;
catalog?: CatalogApi;
processors?: NotificationProcessor[];
}
@@ -71,7 +71,7 @@ export async function createRouter(
discovery,
catalog,
processors,
signalService,
signals,
} = options;
const catalogClient =
@@ -245,8 +245,8 @@ export async function createRouter(
if (read === true) {
await store.markRead({ user, ids });
if (signalService) {
await signalService.publish<NotificationReadSignal>({
if (signals) {
await signals.publish<NotificationReadSignal>({
recipients: [user],
message: { action: 'notification_read', notification_ids: ids },
channel: 'notifications',
@@ -255,8 +255,8 @@ export async function createRouter(
} else if (read === false) {
await store.markUnread({ user: user, ids });
if (signalService) {
await signalService.publish<NotificationReadSignal>({
if (signals) {
await signals.publish<NotificationReadSignal>({
recipients: [user],
message: { action: 'notification_unread', notification_ids: ids },
channel: 'notifications',
@@ -343,8 +343,8 @@ export async function createRouter(
processorSendNotification(ret);
notifications.push(ret);
if (signalService) {
await signalService.publish<NewNotificationSignal>({
if (signals) {
await signals.publish<NewNotificationSignal>({
recipients: user,
message: {
action: 'new_notification',
@@ -32,7 +32,7 @@ import {
CatalogRequestOptions,
GetEntitiesByRefsRequest,
} from '@backstage/catalog-client';
import { DefaultSignalService } from '@backstage/plugin-signals-node';
import { DefaultSignalsService } from '@backstage/plugin-signals-node';
import {
EventParams,
EventsService,
@@ -112,7 +112,7 @@ export async function startStandaloneServer(
},
};
const signalService = DefaultSignalService.create({ events });
const signalService = DefaultSignalsService.create({ events });
// TODO: Move to use services instead this hack
const { auth, httpAuth, userInfo } = createLegacyAuthAdapters<
any,
@@ -128,7 +128,7 @@ export async function startStandaloneServer(
database: dbMock,
catalog: catalogApi,
discovery,
signalService,
signals: signalService,
auth,
httpAuth,
userInfo,
+1 -1
View File
@@ -6,7 +6,7 @@ Signals plugin allows backend plugins to publish messages to frontend plugins.
## Getting started
First install the `@backstage/plugin-signals-node` plugin to get the `SignalService` set up.
First install the `@backstage/plugin-signals-node` plugin to get the `SignalsService` set up.
Next, add Signals router to your backend in `packages/backend/src/plugins/signals.ts`:
@@ -21,7 +21,7 @@ import {
import { Server } from 'http';
import { Logger } from 'winston';
import { createRouter } from './router';
import { DefaultSignalService } from '@backstage/plugin-signals-node';
import { DefaultSignalsService } from '@backstage/plugin-signals-node';
import { DefaultIdentityClient } from '@backstage/plugin-auth-node';
import {
EventParams,
@@ -63,7 +63,7 @@ export async function startStandaloneServer(
},
};
const signals = DefaultSignalService.create({
const signals = DefaultSignalsService.create({
events,
});
+48 -6
View File
@@ -6,28 +6,70 @@ Signals plugin allows backend plugins to publish messages to frontend plugins.
## Getting started
### New backend system
In `packages/backend/index.ts`, add the signals backend:
```ts
backend.add(import('@backstage/plugin-signals-backend'));
```
To use signals in your plugin, add it as a dependency to `my-plugin/plugin.ts`:
```ts
import {
coreServices,
createBackendPlugin,
} from '@backstage/backend-plugin-api';
import { signalsServiceRef } from '@backstage/plugin-signals-node';
export const myPlugin = createBackendPlugin({
pluginId: 'my-plugin',
register(env) {
env.registerInit({
deps: {
httpRouter: coreServices.httpRouter,
signals: signalsServiceRef,
},
async init({ httpRouter, signals }) {
httpRouter.use(
await createRouter({
signals,
}),
);
},
});
},
});
```
### Old backend system
Add SignalService to your plugin environment in `packages/backend/src/types.ts`:
```ts
import { SignalService } from '@backstage/plugin-signals-node';
import { SignalsService } from '@backstage/plugin-signals-node';
export type PluginEnvironment = {
// ...
signalService: SignalService;
signals: SignalsService;
};
```
Add it also to your `makeCreateEnv` to allow access from the other plugins:
```ts
import { SignalService } from '@backstage/plugin-signals-node';
import {
SignalsService,
DefaultSignalsService,
} from '@backstage/plugin-signals-node';
import { DefaultEventBroker } from '@backstage/plugin-events-backend';
function makeCreateEnv(config: Config) {
// ...
const eventBroker = new DefaultEventBroker(root.child({ type: 'plugin' }));
const signalService = DefaultSignalService.create({
const signalsService = DefaultSignalsService.create({
eventBroker,
});
@@ -36,7 +78,7 @@ function makeCreateEnv(config: Config) {
return {
logger,
eventBroker,
signalService,
signals: signalsService,
// ...
};
};
@@ -54,7 +96,7 @@ all subscribers, you can use `null` as `recipients` parameter.
```ts
// Periodic sending example
setInterval(async () => {
await signalService.publish({
await signals.publish({
recipients: null,
channel: 'my_plugin',
message: {
+16 -7
View File
@@ -7,10 +7,13 @@ import { EventsService } from '@backstage/plugin-events-node';
import { JsonObject } from '@backstage/types';
import { ServiceRef } from '@backstage/backend-plugin-api';
// @public @deprecated (undocumented)
export const DefaultSignalService: typeof DefaultSignalsService;
// @public (undocumented)
export class DefaultSignalService implements SignalService {
export class DefaultSignalsService implements SignalsService {
// (undocumented)
static create(options: SignalServiceOptions): DefaultSignalService;
static create(options: SignalsServiceOptions): DefaultSignalsService;
publish<TMessage extends JsonObject = JsonObject>(
signal: SignalPayload<TMessage>,
): Promise<void>;
@@ -23,20 +26,26 @@ export type SignalPayload<TMessage extends JsonObject = JsonObject> = {
message: TMessage;
};
// @public @deprecated (undocumented)
export interface SignalService extends SignalsService {}
// @public @deprecated (undocumented)
export const signalService: ServiceRef<SignalsService, 'plugin'>;
// @public (undocumented)
export interface SignalService {
export interface SignalsService {
publish<TMessage extends JsonObject = JsonObject>(
signal: SignalPayload<TMessage>,
): Promise<void>;
}
// @public (undocumented)
export const signalService: ServiceRef<SignalService, 'plugin'>;
// @public (undocumented)
export type SignalServiceOptions = {
export type SignalsServiceOptions = {
events: EventsService;
};
// @public (undocumented)
export const signalsServiceRef: ServiceRef<SignalsService, 'plugin'>;
// (No @packageDocumentation comment for this package)
```
@@ -13,15 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
import { DefaultSignalService } from './DefaultSignalService';
import { DefaultSignalsService } from './DefaultSignalsService';
describe('DefaultSignalService', () => {
describe('DefaultSignalsService', () => {
const mockEvents = {
publish: jest.fn(),
subscribe: jest.fn(),
};
const service = DefaultSignalService.create({ events: mockEvents });
const service = DefaultSignalsService.create({ events: mockEvents });
it('should publish signal', () => {
const signal = {
@@ -14,19 +14,19 @@
* limitations under the License.
*/
import { EventsService } from '@backstage/plugin-events-node';
import { SignalPayload, SignalServiceOptions } from './types';
import { SignalService } from './SignalService';
import { SignalPayload, SignalsServiceOptions } from './types';
import { SignalsService } from './SignalsService';
import { JsonObject } from '@backstage/types';
/** @public */
export class DefaultSignalService implements SignalService {
export class DefaultSignalsService implements SignalsService {
private events: EventsService;
static create(options: SignalServiceOptions) {
return new DefaultSignalService(options);
static create(options: SignalsServiceOptions) {
return new DefaultSignalsService(options);
}
private constructor(options: SignalServiceOptions) {
private constructor(options: SignalsServiceOptions) {
({ events: this.events } = options);
}
@@ -43,3 +43,9 @@ export class DefaultSignalService implements SignalService {
});
}
}
/**
* @public
* @deprecated Use `DefaultSignalsService` instead
*/
export const DefaultSignalService = DefaultSignalsService;
@@ -17,7 +17,7 @@ import { SignalPayload } from './types';
import { JsonObject } from '@backstage/types';
/** @public */
export interface SignalService {
export interface SignalsService {
/**
* Publishes a signal to user refs to specific topic
* @param signal - Signal to publish
@@ -26,3 +26,9 @@ export interface SignalService {
signal: SignalPayload<TMessage>,
): Promise<void>;
}
/**
* @public
* @deprecated Use `SignalsService` instead
*/
export interface SignalService extends SignalsService {}
+2 -2
View File
@@ -15,6 +15,6 @@
*/
export * from './lib';
export * from './DefaultSignalService';
export * from './SignalService';
export * from './DefaultSignalsService';
export * from './SignalsService';
export * from './types';
+10 -4
View File
@@ -17,12 +17,12 @@ import {
createServiceFactory,
createServiceRef,
} from '@backstage/backend-plugin-api';
import { DefaultSignalService } from './DefaultSignalService';
import { SignalService } from './SignalService';
import { DefaultSignalsService } from './DefaultSignalsService';
import { SignalsService } from './SignalsService';
import { eventsServiceRef } from '@backstage/plugin-events-node';
/** @public */
export const signalService = createServiceRef<SignalService>({
export const signalsServiceRef = createServiceRef<SignalsService>({
id: 'signals.service',
scope: 'plugin',
defaultFactory: async service =>
@@ -32,7 +32,13 @@ export const signalService = createServiceRef<SignalService>({
events: eventsServiceRef,
},
factory({ events }) {
return DefaultSignalService.create({ events });
return DefaultSignalsService.create({ events });
},
}),
});
/**
* @public
* @deprecated Use `signalsServiceRef` instead
*/
export const signalService = signalsServiceRef;
+1 -1
View File
@@ -19,7 +19,7 @@ import { JsonObject } from '@backstage/types';
/**
* @public
*/
export type SignalServiceOptions = {
export type SignalsServiceOptions = {
events: EventsService;
};