From 7ce5f0009a058e20f5bb330976f3325084ea0d1b Mon Sep 17 00:00:00 2001 From: Heikki Hellgren Date: Thu, 1 Feb 2024 20:28:04 +0200 Subject: [PATCH] chore: restore back to recipients + add test Signed-off-by: Heikki Hellgren --- .../src/service/SignalManager.test.ts | 6 +-- .../src/service/SignalManager.ts | 8 ++-- .../src/service/standaloneServer.ts | 2 +- plugins/signals-node/api-report.md | 2 +- .../src/DefaultSignalService.test.ts | 38 +++++++++++++++++++ .../signals-node/src/DefaultSignalService.ts | 7 +--- plugins/signals-node/src/types.ts | 2 +- plugins/signals-react/api-report.md | 1 + plugins/signals-react/src/hooks/useSignal.ts | 7 +++- 9 files changed, 55 insertions(+), 18 deletions(-) create mode 100644 plugins/signals-node/src/DefaultSignalService.test.ts diff --git a/plugins/signals-backend/src/service/SignalManager.test.ts b/plugins/signals-backend/src/service/SignalManager.test.ts index 76cff0d44e..5720d1ff52 100644 --- a/plugins/signals-backend/src/service/SignalManager.test.ts +++ b/plugins/signals-backend/src/service/SignalManager.test.ts @@ -89,7 +89,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - receivers: null, + recipients: null, channel: 'test', message: { msg: 'test' }, }, @@ -109,7 +109,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - receivers: null, + recipients: null, channel: 'test', message: { msg: 'test' }, }, @@ -162,7 +162,7 @@ describe('SignalManager', () => { await onEvent({ topic: 'signals', eventPayload: { - receivers: 'user:default/john.doe', + recipients: 'user:default/john.doe', channel: 'test', message: { msg: 'test' }, }, diff --git a/plugins/signals-backend/src/service/SignalManager.ts b/plugins/signals-backend/src/service/SignalManager.ts index 1f1681b86c..db374418e1 100644 --- a/plugins/signals-backend/src/service/SignalManager.ts +++ b/plugins/signals-backend/src/service/SignalManager.ts @@ -132,11 +132,11 @@ export class SignalManager { return; } - const { channel, receivers, message } = eventPayload; + const { channel, recipients, message } = eventPayload; const jsonMessage = JSON.stringify({ channel, message }); let users: string[] = []; - if (receivers !== null) { - users = Array.isArray(receivers) ? receivers : [receivers]; + if (recipients !== null) { + users = Array.isArray(recipients) ? recipients : [recipients]; } // Actual websocket message sending @@ -146,7 +146,7 @@ export class SignalManager { } // Sending to all users can be done with null if ( - receivers !== null && + recipients !== null && !conn.ownershipEntityRefs.some((ref: string) => users.includes(ref)) ) { return; diff --git a/plugins/signals-backend/src/service/standaloneServer.ts b/plugins/signals-backend/src/service/standaloneServer.ts index 311d3f8587..00ef7b5c77 100644 --- a/plugins/signals-backend/src/service/standaloneServer.ts +++ b/plugins/signals-backend/src/service/standaloneServer.ts @@ -84,7 +84,7 @@ export async function startStandaloneServer( setInterval(() => { signals.publish({ - receivers: null, + recipients: null, channel: 'test', message: { hello: 'world' }, }); diff --git a/plugins/signals-node/api-report.md b/plugins/signals-node/api-report.md index bfd8543a17..cbf4142daf 100644 --- a/plugins/signals-node/api-report.md +++ b/plugins/signals-node/api-report.md @@ -16,7 +16,7 @@ export class DefaultSignalService implements SignalService { // @public (undocumented) export type SignalPayload = { - receivers: string[] | string | null; + recipients: string[] | string | null; channel: string; message: JsonObject; }; diff --git a/plugins/signals-node/src/DefaultSignalService.test.ts b/plugins/signals-node/src/DefaultSignalService.test.ts new file mode 100644 index 0000000000..9938c84c86 --- /dev/null +++ b/plugins/signals-node/src/DefaultSignalService.test.ts @@ -0,0 +1,38 @@ +/* + * Copyright 2024 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 { DefaultSignalService } from './DefaultSignalService'; + +describe('DefaultSignalService', () => { + const mockEventBroker = { + publish: jest.fn(), + subscribe: jest.fn(), + }; + + const service = DefaultSignalService.create({ eventBroker: mockEventBroker }); + + it('should publish signal', () => { + const signal = { + channel: 'test-channel', + recipients: null, + message: { msg: 'hello world' }, + }; + service.publish(signal); + expect(mockEventBroker.publish).toHaveBeenCalledWith({ + topic: 'signals', + eventPayload: signal, + }); + }); +}); diff --git a/plugins/signals-node/src/DefaultSignalService.ts b/plugins/signals-node/src/DefaultSignalService.ts index 4824c1219f..2a234fe5d4 100644 --- a/plugins/signals-node/src/DefaultSignalService.ts +++ b/plugins/signals-node/src/DefaultSignalService.ts @@ -37,14 +37,9 @@ export class DefaultSignalService implements SignalService { * @param message - message to publish */ async publish(signal: SignalPayload) { - const { receivers, channel, message } = signal; await this.eventBroker?.publish({ topic: 'signals', - eventPayload: { - receivers, - message, - channel, - }, + eventPayload: signal, }); } } diff --git a/plugins/signals-node/src/types.ts b/plugins/signals-node/src/types.ts index 21af773268..7e61aea320 100644 --- a/plugins/signals-node/src/types.ts +++ b/plugins/signals-node/src/types.ts @@ -25,7 +25,7 @@ export type SignalServiceOptions = { /** @public */ export type SignalPayload = { - receivers: string[] | string | null; + recipients: string[] | string | null; channel: string; message: JsonObject; }; diff --git a/plugins/signals-react/api-report.md b/plugins/signals-react/api-report.md index e3c4f740a5..ef4bc1b7fc 100644 --- a/plugins/signals-react/api-report.md +++ b/plugins/signals-react/api-report.md @@ -27,6 +27,7 @@ export interface SignalSubscriber { // @public (undocumented) export const useSignal: (channel: string) => { lastSignal: JsonObject | null; + isSignalsAvailable: boolean; }; // (No @packageDocumentation comment for this package) diff --git a/plugins/signals-react/src/hooks/useSignal.ts b/plugins/signals-react/src/hooks/useSignal.ts index a7d50fbe3b..084427e2cc 100644 --- a/plugins/signals-react/src/hooks/useSignal.ts +++ b/plugins/signals-react/src/hooks/useSignal.ts @@ -16,7 +16,7 @@ import { signalApiRef } from '../api'; import { useApiHolder } from '@backstage/core-plugin-api'; import { JsonObject } from '@backstage/types'; -import { useEffect, useState } from 'react'; +import { useEffect, useMemo, useState } from 'react'; /** @public */ export const useSignal = (channel: string) => { @@ -40,5 +40,8 @@ export const useSignal = (channel: string) => { }; }, [signals, channel]); - return { lastSignal }; + // Can be used to fallback (for example to long polling) if signals are not available in the system + const isSignalsAvailable = useMemo(() => !signals, [signals]); + + return { lastSignal, isSignalsAvailable }; };