diff --git a/README.md b/README.md index bbb4515c..80184b34 100644 --- a/README.md +++ b/README.md @@ -767,6 +767,8 @@ One other thing is that the type of the return is precisely the same type requir - presentation-area: - open: this function will open the presentation area content automatically; - close: this function will close the presentation area content automatically; +- screenshare: + - stop: Stops broadcasting the screenshare if user is presenter and is sharing screen (it is ignored otherwise); - sidekick-area: - options: - renameGenericContentMenu: this function will rename the menu of the generic content in the sidekick-area (must have the ID of the sidekick and the newName); @@ -862,6 +864,9 @@ So the idea is that we have a `uiCommands` object and at a point, there will be - save: this function saves the given text, locale and caption type - addLocale: this function sends a locale to be added to the available options + - presentation: + - upload: uploads a new presentation to BigBlueButton; + **Example usage:** ```typescript diff --git a/package-lock.json b/package-lock.json index 2411d451..862627c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -745,6 +745,19 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/aggregate-error": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", @@ -759,10 +772,11 @@ } }, "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "version": "6.15.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", + "integrity": "sha512-fgFx7Hfoq60ytK2c7DhnF8jIvzYgOMxfugjLOSMHjLIPgenqa7S7oaagATUq99mV6IYvN2tRmC0wnTYX6iPbMw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -999,14 +1013,16 @@ } }, "node_modules/axios": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.1.tgz", - "integrity": "sha512-hU4EGxxt+j7TQijx1oYdAjw4xuIp1wRQSsbMFwSthCWeBQur1eF+qJ5iQ5sN3Tw8YRzQNKb8jszgBdMDVqwJcw==", + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" } }, "node_modules/axobject-query": { @@ -1034,10 +1050,11 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", + "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2149,15 +2166,16 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.4.2.tgz", + "integrity": "sha512-PjDse7RzhcPkIJwy5t7KPWQSZ9cAbzQXcafsetQoD7sOJRQlGikNbx7yZp2OotDnJyrDcbyRq3Ttb18iYOqkxA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.16.0", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", "dev": true, "funding": [ { @@ -2191,10 +2209,11 @@ } }, "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", "dev": true, + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", @@ -2564,6 +2583,20 @@ "react-is": "^16.7.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "dev": true, + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", @@ -2953,10 +2986,11 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", + "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", "dev": true, + "license": "MIT", "dependencies": { "argparse": "^2.0.1" }, @@ -3353,10 +3387,11 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.5.tgz", + "integrity": "sha512-VgjWUsnnT6n+NUk6eZq77zeFdpW2LWDzP6zFGrCbHXiYNul5Dzqk2HHQ5uFH2DNW5Xbp8+jVzaeNt94ssEEl4w==", "dev": true, + "license": "ISC", "dependencies": { "brace-expansion": "^1.1.7" }, @@ -3668,10 +3703,11 @@ } }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.6" }, @@ -3747,11 +3783,14 @@ } }, "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=10" + } }, "node_modules/punycode": { "version": "2.3.0", @@ -4588,10 +4627,11 @@ "dev": true }, "node_modules/yaml": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", "dev": true, + "license": "ISC", "engines": { "node": ">= 6" } diff --git a/samples/sample-server-commands-plugin/src/components/sample-server-commands-plugin-item/component.tsx b/samples/sample-server-commands-plugin/src/components/sample-server-commands-plugin-item/component.tsx index b6e4e58d..3a329526 100644 --- a/samples/sample-server-commands-plugin/src/components/sample-server-commands-plugin-item/component.tsx +++ b/samples/sample-server-commands-plugin/src/components/sample-server-commands-plugin-item/component.tsx @@ -43,6 +43,35 @@ function SampleServerCommandsPluginItem( }); }, }), + new MediaAreaOption({ + label: 'Upload PDF', + icon: 'copy', + tooltip: '', + allowed: true, + onClick: () => { + pluginApi.serverCommands.presentation.upload({ + content: { + base64: 'JVBERi0xLjQKMSAwIG9iago8PC9UeXBlIC9DYXRhbG9nCi9QYWdlcyAyIDAgUgo+PgplbmRvYmoK MiAwIG9iago8PC9UeXBlIC9QYWdlcwovS2lkcyBbMyAwIFJdCi9Db3VudCAxCj4+CmVuZG9iagoz IDAgb2JqCjw8L1R5cGUgL1BhZ2UKL1BhcmVudCAyIDAgUgovTWVkaWFCb3ggWzAgMCA1OTUgODQy XQovQ29udGVudHMgNSAwIFIKL1Jlc291cmNlcyA8PC9Qcm9jU2V0IFsvUERGIC9UZXh0XQovRm9u dCA8PC9GMSA0IDAgUj4+Cj4+Cj4+CmVuZG9iago0IDAgb2JqCjw8L1R5cGUgL0ZvbnQKL1N1YnR5 cGUgL1R5cGUxCi9OYW1lIC9GMQovQmFzZUZvbnQgL0hlbHZldGljYQovRW5jb2RpbmcgL01hY1Jv bWFuRW5jb2RpbmcKPj4KZW5kb2JqCjUgMCBvYmoKPDwvTGVuZ3RoIDUzCj4+CnN0cmVhbQpCVAov RjEgMjAgVGYKMjIwIDQwMCBUZAooRHVtbXkgUERGKSBUagpFVAplbmRzdHJlYW0KZW5kb2JqCnhy ZWYKMCA2CjAwMDAwMDAwMDAgNjU1MzUgZgowMDAwMDAwMDA5IDAwMDAwIG4KMDAwMDAwMDA2MyAw MDAwMCBuCjAwMDAwMDAxMjQgMDAwMDAgbgowMDAwMDAwMjc3IDAwMDAwIG4KMDAwMDAwMDM5MiAw MDAwMCBuCnRyYWlsZXIKPDwvU2l6ZSA2Ci9Sb290IDEgMCBSCj4+CnN0YXJ0eHJlZgo0OTUKJSVF T0YK', + }, + mimeType: 'application/pdf', + }); + }, + }), + new MediaAreaOption({ + label: 'Upload BBB Image', + icon: 'copy', + tooltip: '', + allowed: true, + onClick: () => { + pluginApi.serverCommands.presentation.upload({ + content: { + base64: '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', + }, + mimeType: 'image/jpg', + filename: 'bbbImage.jpg', + }); + }, + }), new MediaAreaOption({ label: 'Send custom chat message', icon: { iconName: 'chat' }, diff --git a/samples/sample-ui-commands-plugin/src/sample-ui-commands-plugin-item/component.tsx b/samples/sample-ui-commands-plugin/src/sample-ui-commands-plugin-item/component.tsx index 9d66e145..8f3b37e3 100644 --- a/samples/sample-ui-commands-plugin/src/sample-ui-commands-plugin-item/component.tsx +++ b/samples/sample-ui-commands-plugin/src/sample-ui-commands-plugin-item/component.tsx @@ -93,6 +93,16 @@ function SampleUiCommandsPlugin( } }, }), + new MediaAreaOption({ + label: 'Stop screenshare', + icon: 'copy', + tooltip: '', + dataTest: 'stopScreenshareButton', + allowed: true, + onClick: () => { + pluginApi.uiCommands?.screenshare.stop(); + }, + }), ]); }, [usersData, currentUser]); diff --git a/src/server-commands/commands.ts b/src/server-commands/commands.ts index c25d8f71..41b36c26 100644 --- a/src/server-commands/commands.ts +++ b/src/server-commands/commands.ts @@ -1,7 +1,9 @@ import { caption } from './caption/commands'; import { chat } from './chat/commands'; +import { presentation } from './presentation/commands'; export const serverCommands = (pluginName: string) => ({ caption, chat: chat(pluginName), + presentation, }); diff --git a/src/server-commands/index.ts b/src/server-commands/index.ts index f8cda123..9c50b54b 100644 --- a/src/server-commands/index.ts +++ b/src/server-commands/index.ts @@ -1,2 +1,9 @@ export { CaptionCommandsEnum, CaptionsTypeEnum } from './caption/enum'; export { ChatCommandsEnum } from './chat/enum'; +export { + UploadPresentationBase64Content, + UploadPresentationBlobContent, + UploadPresentationFileContent, + UploadPresentationDataUrlContent, + UploadPresentationContent, +} from './presentation/types'; diff --git a/src/server-commands/presentation/commands.ts b/src/server-commands/presentation/commands.ts new file mode 100644 index 00000000..41039252 --- /dev/null +++ b/src/server-commands/presentation/commands.ts @@ -0,0 +1,20 @@ +import { PresentationCommandsEnum } from './enum'; +import { UploadPresentationCommandArguments } from './types'; + +export const presentation = { + /** + * Uploads a presentation (if presenter, ignores otherwise): Image, PDF, etc. + * + * @param uploadPresentationCommandArguments Content which will be sent to be uploaded + * as presentation - Can be base64 or url. + */ + upload: (uploadPresentationCommandArguments: UploadPresentationCommandArguments) => { + window.dispatchEvent( + new CustomEvent< + UploadPresentationCommandArguments + >(PresentationCommandsEnum.UPLOAD, { + detail: uploadPresentationCommandArguments, + }), + ); + }, +}; diff --git a/src/server-commands/presentation/enum.ts b/src/server-commands/presentation/enum.ts new file mode 100644 index 00000000..39ddae1d --- /dev/null +++ b/src/server-commands/presentation/enum.ts @@ -0,0 +1,3 @@ +export enum PresentationCommandsEnum { + UPLOAD = 'PRESENTATION_UPLOAD_COMMAND', +} diff --git a/src/server-commands/presentation/types.ts b/src/server-commands/presentation/types.ts new file mode 100644 index 00000000..4b03582b --- /dev/null +++ b/src/server-commands/presentation/types.ts @@ -0,0 +1,31 @@ +export interface UploadPresentationBase64Content { + base64: string; +} + +export interface UploadPresentationBlobContent { + blob: Blob; +} + +export interface UploadPresentationFileContent { + file: File; +} + +export interface UploadPresentationDataUrlContent { + dataUrl: string; +} + +export type UploadPresentationContent = + | UploadPresentationBase64Content + | UploadPresentationBlobContent + | UploadPresentationFileContent + | UploadPresentationDataUrlContent; + +export interface UploadPresentationCommandArguments { + content: UploadPresentationContent; + mimeType: string; + filename?: string; +} + +export interface ServerCommandsPresentationObject { + upload: (uploadPresentationCommandArguments: UploadPresentationCommandArguments) => void; +} diff --git a/src/server-commands/types.ts b/src/server-commands/types.ts index 01caf1d0..70c11e01 100644 --- a/src/server-commands/types.ts +++ b/src/server-commands/types.ts @@ -1,7 +1,9 @@ import { ServerCommandsCaptionObject } from './caption/types'; import { ServerCommandsChatObject } from './chat/types'; +import { ServerCommandsPresentationObject } from './presentation/types'; export interface ServerCommands { caption: ServerCommandsCaptionObject; chat: ServerCommandsChatObject; + presentation: ServerCommandsPresentationObject; } diff --git a/src/ui-commands/commands.ts b/src/ui-commands/commands.ts index 58e364aa..d8762d02 100644 --- a/src/ui-commands/commands.ts +++ b/src/ui-commands/commands.ts @@ -11,6 +11,7 @@ import { actionsBar } from './actions-bar/commands'; import { layout } from './layout/commands'; import { navBar } from './nav-bar/commands'; import { sidekickArea } from './sidekick-area/commands'; +import { screenshare } from './screenshare/commands'; import { UiCommands } from './types'; export const uiCommands: UiCommands = { @@ -27,4 +28,5 @@ export const uiCommands: UiCommands = { conference, notification, layout, + screenshare, }; diff --git a/src/ui-commands/index.ts b/src/ui-commands/index.ts index ca5916f4..d20ff9ff 100644 --- a/src/ui-commands/index.ts +++ b/src/ui-commands/index.ts @@ -2,3 +2,4 @@ export { NotificationTypeUiCommand } from './notification/enums'; export { ChangeEnforcedLayoutTypeEnum, EnforcedLayoutTypeEnum } from './layout/enums'; export { CaptionsLanguageEnum } from './captions/enums'; export { ChatUiCommandsEnum } from './chat/enums'; +export { ScreenshareCommandsEnum } from './screenshare/enums'; diff --git a/src/ui-commands/screenshare/commands.ts b/src/ui-commands/screenshare/commands.ts new file mode 100644 index 00000000..e86978a6 --- /dev/null +++ b/src/ui-commands/screenshare/commands.ts @@ -0,0 +1,10 @@ +import { ScreenshareCommandsEnum } from './enums'; + +export const screenshare = { + /** + * Stops the ongoing screenshare session. + */ + stop: () => { + window.dispatchEvent(new Event(ScreenshareCommandsEnum.STOP)); + }, +}; diff --git a/src/ui-commands/screenshare/enums.ts b/src/ui-commands/screenshare/enums.ts new file mode 100644 index 00000000..cb817148 --- /dev/null +++ b/src/ui-commands/screenshare/enums.ts @@ -0,0 +1,3 @@ +export enum ScreenshareCommandsEnum { + STOP = 'STOP_SCREENSHARE_COMMAND', +} diff --git a/src/ui-commands/screenshare/types.ts b/src/ui-commands/screenshare/types.ts new file mode 100644 index 00000000..de48ff3e --- /dev/null +++ b/src/ui-commands/screenshare/types.ts @@ -0,0 +1,3 @@ +export interface UiCommandsScreenshareObject { + stop: () => void; +} diff --git a/src/ui-commands/types.ts b/src/ui-commands/types.ts index ad76c35c..0c973951 100644 --- a/src/ui-commands/types.ts +++ b/src/ui-commands/types.ts @@ -11,6 +11,7 @@ import { UiCommandsNavBarObject } from './nav-bar/types'; import { UiCommandsCameraObject } from './camera/types'; import { UiCommandsSidekickArea } from './sidekick-area/types'; import { UiCommandsCaptionsObject } from './captions/types'; +import { UiCommandsScreenshareObject } from './screenshare/types'; export interface UiCommands { layout: UiCommandsLayoutObject; @@ -26,4 +27,5 @@ export interface UiCommands { userStatus: UiCommandsUserStatusObject; conference: UiCommandsConferenceObject; notification: UiCommandsNotificationObject; + screenshare: UiCommandsScreenshareObject; }