diff --git a/src/lib/app.ts b/src/lib/app.ts index a6d68d9ee9..f8625721ce 100644 --- a/src/lib/app.ts +++ b/src/lib/app.ts @@ -22,6 +22,7 @@ import noAuthentication from './middleware/no-authentication'; import secureHeaders from './middleware/secure-headers'; import { loadIndexHTML } from './util/load-index-html'; +import { clientEvents } from './types/events'; export default async function getApp( config: IUnleashConfig, @@ -136,6 +137,22 @@ export default async function getApp( res.send(indexHTML); }); + if (config.enableEventStream) { + console.log('Enabled, configuring events'); + app.get(`${baseUriPath}/api/client/events`, (req, res) => { + res.set({ + 'Content-Type': 'text/event-stream', + 'Cache-Control': 'no-cache', + Connection: 'keep-alive', + }); + clientEvents.forEach((e) => { + stores.eventStore.on(e, (data) => { + res.write(`event: message\n`); + res.write(`data: ${JSON.stringify(data)}\n\n`); + }); + }); + }); + } app.get(`${baseUriPath}/*`, (req, res) => { if (req.path.startsWith(`${baseUriPath}/api`)) { res.status(404).send({ message: '404 - Not found' }); @@ -144,5 +161,6 @@ export default async function getApp( res.send(indexHTML); }); + return app; } diff --git a/src/lib/create-config.ts b/src/lib/create-config.ts index 0c558ab9e4..016b08e14b 100644 --- a/src/lib/create-config.ts +++ b/src/lib/create-config.ts @@ -311,6 +311,7 @@ export function createConfig(options: IUnleashOptions): IUnleashConfig { eventHook: options.eventHook, enterpriseVersion: options.enterpriseVersion, eventBus: new EventEmitter(), + enableEventStream: safeBoolean(process.env.ENABLE_EVENT_STREAM, false), }; } diff --git a/src/lib/types/events.ts b/src/lib/types/events.ts index bdf8b37bc1..6601da352a 100644 --- a/src/lib/types/events.ts +++ b/src/lib/types/events.ts @@ -63,6 +63,28 @@ export const ENVIRONMENT_IMPORT = 'environment-import'; export const CLIENT_METRICS = 'client-metrics'; +export const clientEvents = [ + FEATURE_UPDATED, + FEATURE_ARCHIVED, + FEATURE_CREATED, + FEATURE_DELETED, + FEATURE_ENVIRONMENT_ENABLED, + FEATURE_ENVIRONMENT_DISABLED, + FEATURE_METADATA_UPDATED, + FEATURE_PROJECT_CHANGE, + FEATURE_REVIVED, + FEATURE_STALE_OFF, + FEATURE_STALE_ON, + STRATEGY_CREATED, + STRATEGY_DELETED, + STRATEGY_UPDATED, + STRATEGY_DEPRECATED, + STRATEGY_REACTIVATED, + FEATURE_STRATEGY_ADD, + FEATURE_STRATEGY_REMOVE, + FEATURE_STRATEGY_UPDATE, +]; + export interface IBaseEvent { type: string; createdBy: string; diff --git a/src/lib/types/option.ts b/src/lib/types/option.ts index f60413cd4a..4267b12133 100644 --- a/src/lib/types/option.ts +++ b/src/lib/types/option.ts @@ -158,4 +158,5 @@ export interface IUnleashConfig { enterpriseVersion?: string; eventBus: EventEmitter; disableLegacyFeaturesApi?: boolean; + enableEventStream?: boolean; }