diff --git a/packages/room/__mocks__/config.mock.ts b/packages/room/__mocks__/config.mock.ts index 0e0edc7c..4b27b914 100644 --- a/packages/room/__mocks__/config.mock.ts +++ b/packages/room/__mocks__/config.mock.ts @@ -26,4 +26,16 @@ export const MOCK_CONFIG: Configuration = { }, }, waterMark: true, + features: { + realtime: true, + presence: true, + videoConference: true, + comments: true, + whoIsOnline: true, + presence3dMatterport: true, + presence3dAutodesk: true, + presence3dThreejs: true, + formElements: true, + transcriptLangs: ['en-US'], + }, }; diff --git a/packages/room/src/common/types/feature-flag.types.ts b/packages/room/src/common/types/feature-flag.types.ts new file mode 100644 index 00000000..34d0de2f --- /dev/null +++ b/packages/room/src/common/types/feature-flag.types.ts @@ -0,0 +1,12 @@ +export interface FeatureFlags { + realtime: boolean; + presence: boolean; + videoConference: boolean; + comments: boolean; + whoIsOnline: boolean; + presence3dMatterport: boolean; + presence3dAutodesk: boolean; + presence3dThreejs: boolean; + formElements: boolean; + transcriptLangs: string[]; +} diff --git a/packages/room/src/core/types.ts b/packages/room/src/core/types.ts index 828a2ed0..af1e520a 100644 --- a/packages/room/src/core/types.ts +++ b/packages/room/src/core/types.ts @@ -55,8 +55,4 @@ export type GeneralEvent = ParticipantEvent | RoomEvent; export type RoomEventPayload = T extends keyof RoomEventPayloads ? RoomEventPayloads[T] : never; -export type RoomEventPair = { - [K in keyof RoomEventPayloads]: { event: K; payload: RoomEventPayloads[K] }; - }[keyof RoomEventPayloads]; - export type Callback = (event: RoomEventPayload) => void; diff --git a/packages/room/src/index.test.ts b/packages/room/src/index.test.ts index ad1510ed..d7c11fac 100644 --- a/packages/room/src/index.test.ts +++ b/packages/room/src/index.test.ts @@ -11,6 +11,18 @@ jest.mock('./services/api', () => ({ fetchLimits: jest.fn(() => Promise.resolve({})), createParticipant: jest.fn(() => Promise.resolve()), fetchParticipant: jest.fn(() => Promise.resolve(null)), + getFeatures: jest.fn(() => Promise.resolve({ + realtime: true, + presence: true, + videoConference: true, + comments: true, + whoIsOnline: true, + presence3dMatterport: true, + presence3dAutodesk: true, + presence3dThreejs: true, + formElements: true, + transcriptLangs: ['en-US'], + })), }, })); diff --git a/packages/room/src/index.ts b/packages/room/src/index.ts index 8b52b4a1..03158ad2 100644 --- a/packages/room/src/index.ts +++ b/packages/room/src/index.ts @@ -40,10 +40,11 @@ async function setUpEnvironment({ debug.disable(); } - const [canAccess, waterMark, limits] = await Promise.all([ + const [canAccess, waterMark, limits, features] = await Promise.all([ ApiService.validateApiKey(developerToken), ApiService.fetchWaterMark(developerToken), ApiService.fetchLimits(developerToken), + ApiService.getFeatures(developerToken), ]).catch((error) => { console.log(error); throw new Error('[SuperViz | Room] Failed to load configuration from server'); @@ -55,6 +56,7 @@ async function setUpEnvironment({ config.set('limits', limits); config.set('waterMark', waterMark); + config.set('features', features); } /** diff --git a/packages/room/src/services/api/index.ts b/packages/room/src/services/api/index.ts index 4a21f2ce..4c930bba 100644 --- a/packages/room/src/services/api/index.ts +++ b/packages/room/src/services/api/index.ts @@ -1,3 +1,4 @@ +import { FeatureFlags } from '../../common/types/feature-flag.types'; import config from '../config'; import { ComponentLimits } from '../config/types'; @@ -67,4 +68,12 @@ export class ApiService { const url = this.createUrl(path); return this.doRequest(url, 'GET', undefined, { apikey: config.get('apiKey') }); } + + static async getFeatures(apiKey: string): Promise { + return this.doRequest( + `https://remote-config.superviz.com/features/${apiKey}`, + 'GET', + undefined, + ) as Promise; + } } diff --git a/packages/room/src/services/config/types.ts b/packages/room/src/services/config/types.ts index 72d1682b..a1139961 100644 --- a/packages/room/src/services/config/types.ts +++ b/packages/room/src/services/config/types.ts @@ -1,3 +1,4 @@ +import { FeatureFlags } from '../../common/types/feature-flag.types'; import { Group } from '../../common/types/group.types'; export interface Configuration { @@ -9,6 +10,7 @@ export interface Configuration { limits: ComponentLimits; waterMark: boolean; group: Group + features: FeatureFlags; } type Paths = T extends object