From f3575bc34c2f53fb20362ca7e871dfd6c7cd0fcb Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Fri, 8 Dec 2023 15:33:42 +0200 Subject: [PATCH] fix: initial review finding fixes Signed-off-by: Heikki Hellgren --- plugins/devtools-backend/src/plugin.ts | 5 +- plugins/signals-backend/README.md | 18 +++++++ plugins/signals-backend/api-report.md | 5 ++ plugins/signals-backend/package.json | 1 + plugins/signals-backend/src/index.ts | 1 + plugins/signals-backend/src/plugin.ts | 48 +++++++++++++++++++ plugins/signals-backend/src/service/router.ts | 3 +- plugins/signals-node/api-report.md | 4 ++ plugins/signals-node/package.json | 1 + plugins/signals-node/src/index.ts | 1 + plugins/signals-node/src/lib.ts | 21 ++++++++ yarn.lock | 2 + 12 files changed, 107 insertions(+), 3 deletions(-) create mode 100644 plugins/signals-backend/src/plugin.ts create mode 100644 plugins/signals-node/src/lib.ts diff --git a/plugins/devtools-backend/src/plugin.ts b/plugins/devtools-backend/src/plugin.ts index 685522557e..02c3831128 100644 --- a/plugins/devtools-backend/src/plugin.ts +++ b/plugins/devtools-backend/src/plugin.ts @@ -20,6 +20,7 @@ import { createBackendPlugin, } from '@backstage/backend-plugin-api'; import { createRouter } from './service/router'; +import { signalService } from '@backstage/plugin-signals-node'; /** * DevTools backend plugin @@ -35,13 +36,15 @@ export const devtoolsPlugin = createBackendPlugin({ logger: coreServices.logger, permissions: coreServices.permissions, httpRouter: coreServices.httpRouter, + signals: signalService, }, - async init({ config, logger, permissions, httpRouter }) { + async init({ config, logger, permissions, httpRouter, signals }) { httpRouter.use( await createRouter({ config, logger: loggerToWinstonLogger(logger), permissions, + signalService: signals, }), ); }, diff --git a/plugins/signals-backend/README.md b/plugins/signals-backend/README.md index 1f58c1195a..f9ebfb80c7 100644 --- a/plugins/signals-backend/README.md +++ b/plugins/signals-backend/README.md @@ -24,3 +24,21 @@ export default async function createPlugin( }); } ``` + +Now add the signals to `packages/backend/src/index.ts`: + +```ts +// ... +import signals from './plugins/sonarqube'; + +async function main() { + // ... + const signalsEnv = useHotMemoize(module, () => createEnv('signals')); + + const apiRouter = Router(); + // ... + apiRouter.use('/signals', await signals(signalsEnv)); + apiRouter.use(notFoundHandler()); + // ... +} +``` diff --git a/plugins/signals-backend/api-report.md b/plugins/signals-backend/api-report.md index 309bd22ce3..afbc63abf2 100644 --- a/plugins/signals-backend/api-report.md +++ b/plugins/signals-backend/api-report.md @@ -3,6 +3,7 @@ > Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). ```ts +import { BackendFeature } from '@backstage/backend-plugin-api'; import express from 'express'; import { Logger } from 'winston'; import { SignalService } from '@backstage/plugin-signals-node'; @@ -18,5 +19,9 @@ export interface RouterOptions { service: SignalService; } +// @public +const signalsPlugin: () => BackendFeature; +export default signalsPlugin; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/signals-backend/package.json b/plugins/signals-backend/package.json index ee303cdf3b..2fe6d86480 100644 --- a/plugins/signals-backend/package.json +++ b/plugins/signals-backend/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", diff --git a/plugins/signals-backend/src/index.ts b/plugins/signals-backend/src/index.ts index d2e8d61bad..05e1f941b2 100644 --- a/plugins/signals-backend/src/index.ts +++ b/plugins/signals-backend/src/index.ts @@ -14,3 +14,4 @@ * limitations under the License. */ export * from './service/router'; +export { signalsPlugin as default } from './plugin'; diff --git a/plugins/signals-backend/src/plugin.ts b/plugins/signals-backend/src/plugin.ts new file mode 100644 index 0000000000..b4a0a3e095 --- /dev/null +++ b/plugins/signals-backend/src/plugin.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { loggerToWinstonLogger } from '@backstage/backend-common'; +import { + coreServices, + createBackendPlugin, +} from '@backstage/backend-plugin-api'; +import { createRouter } from './service/router'; +import { signalService } from '@backstage/plugin-signals-node'; + +/** + * Signals backend plugin + * + * @public + */ +export const signalsPlugin = createBackendPlugin({ + pluginId: 'devtools', + register(env) { + env.registerInit({ + deps: { + httpRouter: coreServices.httpRouter, + logger: coreServices.logger, + service: signalService, + }, + async init({ httpRouter, logger, service }) { + httpRouter.use( + await createRouter({ + logger: loggerToWinstonLogger(logger), + service, + }), + ); + }, + }); + }, +}); diff --git a/plugins/signals-backend/src/service/router.ts b/plugins/signals-backend/src/service/router.ts index acffde19c7..7b0cc02a1d 100644 --- a/plugins/signals-backend/src/service/router.ts +++ b/plugins/signals-backend/src/service/router.ts @@ -33,7 +33,6 @@ export async function createRouter( ): Promise { const { logger, service } = options; let subscribed = false; - const upgradeMiddleware = (req: Request, _: Response, next: NextFunction) => { const server: https.Server | http.Server = ( (req.socket ?? req.connection) as any @@ -49,10 +48,10 @@ export async function createRouter( } if (!subscribed) { + subscribed = true; server.on('upgrade', async (request, socket, head) => { await service.handleUpgrade(request, socket, head); }); - subscribed = true; } }; diff --git a/plugins/signals-node/api-report.md b/plugins/signals-node/api-report.md index 3ad4da11ee..750dd1774a 100644 --- a/plugins/signals-node/api-report.md +++ b/plugins/signals-node/api-report.md @@ -13,6 +13,7 @@ import { IdentityApi } from '@backstage/plugin-auth-node'; import { IncomingMessage } from 'http'; import { JsonObject } from '@backstage/types'; import { Logger } from 'winston'; +import { ServiceRef } from '@backstage/backend-plugin-api'; // @public (undocumented) export type ServiceOptions = { @@ -49,5 +50,8 @@ export class SignalService implements EventSubscriber { supportsEventTopics(): string[]; } +// @public (undocumented) +export const signalService: ServiceRef; + // (No @packageDocumentation comment for this package) ``` diff --git a/plugins/signals-node/package.json b/plugins/signals-node/package.json index 66e4528678..d5e980d857 100644 --- a/plugins/signals-node/package.json +++ b/plugins/signals-node/package.json @@ -30,6 +30,7 @@ ], "dependencies": { "@backstage/backend-common": "workspace:^", + "@backstage/backend-plugin-api": "workspace:^", "@backstage/config": "workspace:^", "@backstage/plugin-auth-node": "workspace:^", "@backstage/plugin-events-node": "workspace:^", diff --git a/plugins/signals-node/src/index.ts b/plugins/signals-node/src/index.ts index 289efade07..43a3a88ac0 100644 --- a/plugins/signals-node/src/index.ts +++ b/plugins/signals-node/src/index.ts @@ -14,5 +14,6 @@ * limitations under the License. */ +export * from './lib'; export * from './SignalService'; export * from './types'; diff --git a/plugins/signals-node/src/lib.ts b/plugins/signals-node/src/lib.ts new file mode 100644 index 0000000000..d303b4d3cc --- /dev/null +++ b/plugins/signals-node/src/lib.ts @@ -0,0 +1,21 @@ +/* + * Copyright 2023 The Backstage Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { createServiceRef } from '@backstage/backend-plugin-api'; + +/** @public */ +export const signalService = createServiceRef< + import('./SignalService').SignalService +>({ id: 'signals.service', scope: 'plugin' }); diff --git a/yarn.lock b/yarn.lock index de28fd808d..7a3fbb3902 100644 --- a/yarn.lock +++ b/yarn.lock @@ -8839,6 +8839,7 @@ __metadata: resolution: "@backstage/plugin-signals-backend@workspace:plugins/signals-backend" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-auth-node": "workspace:^" @@ -8865,6 +8866,7 @@ __metadata: resolution: "@backstage/plugin-signals-node@workspace:plugins/signals-node" dependencies: "@backstage/backend-common": "workspace:^" + "@backstage/backend-plugin-api": "workspace:^" "@backstage/cli": "workspace:^" "@backstage/config": "workspace:^" "@backstage/plugin-auth-node": "workspace:^"