From 054c39c124c1332280f79cc2dfa63d7e62a69ed6 Mon Sep 17 00:00:00 2001 From: Michael Weimann Date: Tue, 17 Dec 2024 13:39:01 +0100 Subject: [PATCH] docs(element): Add Matrix Modules and Widget API --- docs/architecture/apis.md | 125 +++++++++++++++++- .../apis_images/ChatVC-overview.png | Bin 28490 -> 0 bytes 2 files changed, 123 insertions(+), 2 deletions(-) delete mode 100644 docs/architecture/apis_images/ChatVC-overview.png diff --git a/docs/architecture/apis.md b/docs/architecture/apis.md index bb3917d9..ada21a15 100644 --- a/docs/architecture/apis.md +++ b/docs/architecture/apis.md @@ -51,6 +51,10 @@ This chapter presents APIs available in openDesk grouped by applications. * [Matrix Server-Server API](#matrix-server-server-api) * [Matrix Push Gateway API](#matrix-push-gateway-api) * [Matrix Identity Service API](#matrix-identity-service-api) + * [Matrix React SDK Module API](#matrix-react-sdk-module-api) + * [Matrix Widget API](#matrix-widget-api) + * [NeoBoard Data Model API](#neoboard-data-model-api) + * [NeoDateFix REST API](#neodatefix-rest-api) * [Knowledge management - XWiki](#knowledge-management---xwiki) * [REST API](#rest-api-1) * [Scripting API](#scripting-api) @@ -647,7 +651,56 @@ Following are APIs used by the Project management application: While Jitsi is available as standalone videoconferencing in openDesk, it is also used in [Element as videoconferencing backend](https://github.com/element-hq/element-web/blob/develop/docs/jitsi.md). -![APIs of Element and Jitsi providing Communication Service](./apis_images/ChatVC-overview.png) +```mermaid +--- + config: + class: + hideEmptyMembersBox: true +--- +classDiagram + class CommunicationService["Communication Service"] { + <> + } + + class MxChat["Element Matrix Chat"] { + <> + } + class JitsiVideoConference["Jitsi Video Conference"] { + <> + } + + CommunicationService <|.. MxChat + CommunicationService <|.. JitsiVideoConference + MxChat <-- JitsiVideoConference + + class MxAppServiceApi["Matrix Application Service API"] + class MxClientServerApi["Matrix Client Server API"] + class MxServerServerApi["Matrix Server Server API"] + class MxPushGatewayApi["Matrix Push Gateway API"] + class MxIdentityServiceApi["Matrix Identity Service API"] + class MxRtc["Matrix RTC"] + class MxElementWebModuleApi["Matrix React SDK Module API"] + class MxWidgetApi["Matrix Widget API"] + class NeoBoardDataModelApi["NeoBoard Data Model API"] + class NeoDateFixRestApi["NeoDateFix REST API"] + + MxChat *-- MxAppServiceApi + MxChat *-- MxClientServerApi + MxChat *-- MxServerServerApi + MxChat *-- MxPushGatewayApi + MxChat *-- MxIdentityServiceApi + MxChat *-- MxRtc + MxChat *-- MxElementWebModuleApi + MxChat *-- MxWidgetApi + + class JitsiIframeApi["Jitsi iFrame API"] + class JitsiMeetApi["Jitsi Meet API"] + class JitsiMeetReactSdk["Jitsi Meet React SDK"] + + JitsiVideoConference *-- JitsiIframeApi + JitsiVideoConference *-- JitsiMeetApi + JitsiVideoConference *-- JitsiMeetReactSdk +``` Following are APIs used by the Chat application: @@ -741,6 +794,74 @@ Following are APIs used by the Chat application: | Supported standards | [Matrix](https://spec.matrix.org/latest/identity-service-api/) | | Documentation | [Synapse](https://element-hq.github.io/synapse/latest/) is the reference implementation of the Matrix protocol, see standard for API details | +## Matrix React SDK Module API + +| Name | Matrix React SDK Module API | +| ------------------------------ | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Purpose | The module system in Element Web is a way to add or modify functionality of Element Web itself, bundled at compile time for the app. | +| Versioning | [Releases in the Git repository](https://github.com/matrix-org/matrix-react-sdk-module-api/releases); [Dependency in `package.json` in Element (Chat Web-UI)](https://github.com/element-hq/element-web/blob/develop/package.json) | +| Authentication | n/a - used as a library | +| In openDesk provided by | Element (Chat Web-UI) | +| Transport protocol | n/a - used as a library | +| Usage within component | [Element (Chat-Web-UI) Modules](https://github.com/nordeck/element-web-modules/) | +| Usage within openDesk | none | +| Usage for external integration | n/a - uses as a library | +| Parallel access | Allowed | +| Message protocol | n/a - used as a library | +| Supported standards | n/a - Element (Chat Web-UI) specific | +| Documentation | [Element (Chat Web-UI) Documentation](https://github.com/element-hq/element-web/blob/develop/docs/modules.md); [matrix-react-sdk-module-api Git repository](https://github.com/matrix-org/matrix-react-sdk-module-api) | + +## Matrix Widget API + +| Name | Matrix Widget API | +| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Purpose | Matrix Widgets are HTML and Javascript content / applications that can be embedded within, and communicate with Matrix clients. | +| Versioning | n/a | +| Authentication | Widgets request capabilities. They must be confirmed by a user or by the [Widget Lifecycle Module](https://github.com/nordeck/element-web-modules/blob/main/packages/element-web-widget-lifecycle-module/README.md). | +| In openDesk provided by | Element (Chat Web-UI) | +| Transport protocol | [HTML window.postMessage API](https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage) | +| Usage within component | [NeoDateFix](https://github.com/nordeck/matrix-meetings/), [NeoBoard](https://github.com/nordeck/matrix-neoboard), [NeoChoice](https://github.com/nordeck/matrix-poll) | +| Usage within openDesk | none | +| Usage for external integration | none | +| Parallel access | Allowed | +| Message protocol | JSON | +| Supported standards | [Matrix - MSC2764](https://github.com/matrix-org/matrix-spec-proposals/pull/2764) | +| Documentation | [Matrix - MSC2764](https://github.com/matrix-org/matrix-spec-proposals/pull/2764) | + +## NeoBoard Data Model API + +| Name | NeoBoard Data Model API | +| ------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------- | +| Purpose | The NeoBoard data model can be used to generate whiteboard documents. | +| Versioning | `version` field in the [NeoBoard data model](https://github.com/nordeck/matrix-neoboard/blob/main/docs/model/export-format.md#fields) | +| Authentication | n/a | +| In openDesk provided by | [NeoBoard](https://github.com/nordeck/matrix-neoboard) | +| Transport protocol | n/a | +| Usage within component | [NeoBoard](https://github.com/nordeck/matrix-neoboard) | +| Usage within openDesk | none | +| Usage for external integration | none | +| Parallel access | n/a | +| Message protocol | JSON | +| Supported standards | n/a | +| Documentation | [NeoBoard data model](https://github.com/nordeck/matrix-neoboard/tree/main/docs/model) | + +## NeoDateFix REST API + +| Name | NeoDateFix REST API | +| ------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------- | +| Purpose | Can be used to query and set up NeoDateFix Matrix meetings. | +| Versioning | Path segment in the [Meetings Bot API](https://github.com/nordeck/matrix-meetings/blob/main/docs/data-model.md#http-api) | +| Authentication | n/a | +| In openDesk provided by | [NeoDateFix](https://github.com/nordeck/matrix-meetings) | +| Transport protocol | HTTP(S) | +| Usage within component | [NeoDateFix](https://github.com/nordeck/matrix-meetings) | +| Usage within openDesk | Used by OX to sync calendar entries to NeoDateFix | +| Usage for external integration | none | +| Parallel access | n/a | +| Message protocol | JSON | +| Supported standards | n/a | +| Documentation | [NeoDateFix ADR001](https://github.com/nordeck/matrix-meetings/blob/main/docs/adrs/adr001-use-the-widget-api-to-interact-with-the-meetings-bot.md) | + # Knowledge management - XWiki Following are APIs used by the Knowledge management application: @@ -804,7 +925,7 @@ Following are APIs used by the Knowledge management application: ## JavaScript API -| Name | Javascript API | +| Name | JavaScript API | | ------------------------------ | -------------------------------------------------------------------------------------------- | | Purpose | Include dynamic components in XWiki/web pages | | Versioning | | diff --git a/docs/architecture/apis_images/ChatVC-overview.png b/docs/architecture/apis_images/ChatVC-overview.png deleted file mode 100644 index 028829d0cbc9092d061cdc73a90de44787a7233c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28490 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