-
Notifications
You must be signed in to change notification settings - Fork 11
GSC317: Kompatibler Austausch strukturierter Daten #317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
404fb23
8e8340f
1116162
8e1dd9f
9f962c6
7d1aeba
155029c
60c36e7
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Vielen Dank für das Feedback. Ich hab den Beitrag in einen Kommentar auf der Datei kopiert weil wir so einen eigenen Thread zur Diskussion erhalten.
Ich glaube das ist ein überlappendes Thema, trifft so aber nicht 100%ig auf dieses Proposal zu. Scope dieses ProposalsDer Verarbeitungsstatus aus diesem Proposal soll den Erfolg / Misserfolg bei der Verarbeitung eines konkreten Matrix-Events beschreiben. Dazu gehört einerseits die Fähigkeit den Event-Typ verstehen zu können aber andererseits auch die Auswertung der konkreten Daten im Event. Wenn man sich konzeptionell den Absender als Client und den Empfänger als Server vorstellt, ist das gesendete Matrix-Event das HTTP-Request und der Verarbeitungsstatus die HTTP-Response. Client Capability NegotiationFür den Austausch von Metadaten über die Fähigkeiten von Clients, haben wir aufbauened auf diesem Proposal MSC4301 veröffentlicht. Hiermit könnten Clients adhoc die Fähigkeiten anderer Clients abfragen.
Die Fähigkeiten in die OAuth Client Metadaten aufzunehmen ist eine interessante Idee. Dadurch wären die Informationen statisch und könnten auch abgefragt werden, ohne dass beide Clients online sind. Man müsste sich hier noch überlegen wie diese Daten zwischen Clients transportiert werden. Können Clients die Registrierungsmetadaten anderer Clients direkt und vollständig abrufen? Oder gibt es einen Endpunkt in der CS-API, mit dem der Server Teile der Metadaten bereitstellt und dabei Zugriffsrechte durchsetzt (z. B. Abfrage nur bei gemeinsamen Räumen erlaubt)? Event-Verzeichnis
Das sind sehr interessante Punkte. Zur Struktur eines Event-Verzeichnisses haben wir uns bisher erst wenige Gedanken gemacht. Das verwandte Verzeichnis der Dienstkennungen in KIM z. B. finde ich nur bedingt hilfreich weil dort nur IDs aber keine Schemainformationen dokumentiert werden. Naiv hatte ich mir bisher vorgestellt, dass wir die Events einfach per JSON Schema dokumentieren und in einem GitHub Repository sammeln. Führt ein Hersteller neue Typen ein und möchte anderen Herstellern ermöglichen diese zu behandeln, könnte dann einfach ein Pull Request erstellt werden. Vielleicht reicht das mit Blick auf eIDAS und EHDS aber nicht aus. |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,251 @@ | ||
# GSC317: Kompatibler Austausch strukturierter Daten | ||
|
||
Matrix unterstützt neben den eingebauten Events auch den Austausch proprietärer Events. Solche | ||
Event-Typen müssen gemäß [Spezifikation] mit einem rDNS-Präfix beginnen um Kollisionen untereinander | ||
und mit den standardisierten `m.*` Events zu vermeiden. TI-M Hersteller können daher schon heute | ||
eigene Event-Typen für den Austausch strukturierter Daten verwenden und damit spezialisierte | ||
Anwendungsfälle bedienen. Ebenso ist es möglich strukturierte Daten als Datei über den eingebauten | ||
`m.file` Message-Type mit entsprechendem MIME-Type zu versenden. | ||
|
||
Hierbei ergeben sich allerdings folgende Probleme: | ||
|
||
1. Kompatibilität – Während Clients desselben Herstellers in der Regel dieselben proprietären | ||
Inhalte unterstützen sollten, kann das für Clients verschiedener Hersteller nicht angenommen | ||
werden. Zusätzlich beinhaltet Matrix aktuell keine Mechanismen, mit denen sich feststellen ließe | ||
welche Event-Typen Clients unterstützen oder ob ein gesendetes Event vom Empfänger verstanden | ||
wurde. Im schlimmsten Fall wird ein unbekanntes Event beim Empfänger überhaupt nicht angezeigt | ||
oder verarbeitet, ohne dass der Absender Kenntnis davon erlangt. Das kann besonders dann fatal | ||
sein, wenn automatisierte Systeme als TI-M Clients auftreten. | ||
2. Discoverability – Um zu verhindern, dass verschiedene Hersteller vergleichbare Probleme mehrfach | ||
lösen wäre es wünschenswert eine zentrale Übersicht ähnlich zu den [Dienstkennungen] von KIM zu | ||
haben. | ||
|
||
Dieses Proposal befasst sich mit Punkt 1 und beschreibt ein Verfahren, mit dem TI-M Clients Events | ||
mit proprietären Inhalten kompatibel austauschen können. | ||
|
||
## Änderungsvorschlag | ||
|
||
Zentrales Instrument dieses Proposals ist [MSC4300]. Dieses MSC definiert einen Mechanismus, mit dem | ||
Absender den Verarbeitungsstatus eines Events von Empfängern anfordern können. Hierzu wird auf dem | ||
betroffenen Event ein `de.gematik.msc4300.request.status` Content-Block gesetzt, welcher die | ||
absendende Device-ID und eine optionale Lebensdauer enthält. | ||
|
||
``` json5 | ||
{ | ||
"event_id": "$1", | ||
"type": "<Event-Typ>", | ||
"content": { | ||
<Event-Inhalt> | ||
// Anfrage des Verarbeitungsstatus | ||
"de.gematik.msc4300.request.status": { | ||
"from_device": "RJYKSTBOIE", | ||
"lifetime": 90_000, // 90s | ||
} | ||
}, | ||
... | ||
} | ||
``` | ||
|
||
Der Content-Block zur Anfrage des Verarbeitungsstatus ist modular und kann auf beliebigen | ||
Event-Typen verwendet werden. Eine Verpflichtung hierzu besteht für TI-M Clients jedoch nicht. Die | ||
gematik stellt hier lediglich die nötige Infrastruktur bereit, damit diese Anfragen bei Bedarf und | ||
in spezilisierten Anwendungsfällen verwendet werden können um Kompatibilität zu gewährleisten. | ||
|
||
Damit diese Funktion sinnvoll nutzbar ist, ist es allerdings erforderlich, dass *empfangene* | ||
Anfragen beantwortet werden. Daher werden alle TI-M Clients hierzu verpflichtet. | ||
|
||
**A_1 - Antwort auf Anfragen zum Verarbeitungsstatus von Events** | ||
|
||
TI-M Clients MÜSSEN Anfragen zum Verarbeitungsstatus von Events gemäß [MSC4300] beantworten. Enthält | ||
ein Event einen `de.gematik.msc4300.request.status` Content-Block, so MUSS der empfangende Client | ||
mit einem `de.gematik.msc4300.response.status` Event antworten sofern die `lifetime` der Anfrage | ||
noch nicht verstrichen ist. **\[\<=\]** | ||
|
||
Absendene Clients sollten Anfragen zum Verarbeitungsstatus nicht mit jedem beliebigen Event | ||
verschicken sondern nur in Fällen, in denen die Kenntnis des Verarbeitungsstatus essenziell ist. | ||
Dies wird üblicherweise nur bei proprietären Events oder Dateien mit speziellem Inhalt der Fall | ||
sein. So wäre es z. B. unsinnig den Verarbeitungsstatus von reinen Text- oder Bild-Nachrichten zu | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @Johennes wieso unsinnig? So könnte einfach abgefragt werden, ob eine Nachricht beim Empfänger eingegangen ist. Dies ist heute nicht "einfach" möglichl There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Guter Punkt. Ich glaube wir haben hier eventuell zwei leicht verschiedene Probleme im Sinn. In deinem Fall geht es um Bestätigungen für den reinen Empfang von Nachrichten auf Clients. Also Nachricht angekommen und konnte entschlüsselt werden. Was ich mit dem Verarbeitungsstatus hier im Sinn hatte geht darüber hinaus und soll beschreiben ob der Client mit den entschlüsselten Daten auch etwas anfangen konnte. Jetzt könnte man diesen Verarbeitungsstatus natürlich prinzipiell auch für reine Empfangsbestätigungen verwenden. Im Einzelfall fände ich das ok. Für einen massenhaften Einsatz auf jedem Event ist die Statusabfrage aber eventuell zu schwergewichtig denn jede Status-Antwort ist ja ein neues Event im Raum. Dafür gäbe es alernativ die "Delivery Receipts" aus MSC4089, die auf der leichtgewichtigeren Receipt-Infrastruktur aufbauen. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Finde ich auch gut. Sollten wir nur berücksichtigen in Zukunft :) |
||
erfragen, da alle TI-M Clients diese Nachrichten ohnehin unterstützen sollten. Werden andererseits | ||
komplexere Inhalte wie z. B. serialisierte FHIR-Resourcen versendet, kann es sinnvoll sein, den | ||
Verarbeitungsstatus anzufragen um sicherzustellen, dass der empfangende Client die Inhalte | ||
verstanden hat. | ||
|
||
Für Mitarbeiter im Gesundheitswesen kann es hilfreich sein unbekannte Events bei Bedarf manuell | ||
weiterzuverarbeiten, z. B. indem die Inhalte in ein PVS oder anderes Drittsystem exportiert werden. | ||
Dazu ist es erforderlich, dass solche Events angezeigt und mit der Möglichkeit zur Einsicht der | ||
Rohdaten versehen werden. | ||
|
||
**A_2 - Anzeige und Rohdaten von unbekannten proprietären Events** | ||
|
||
TI-M Pro Clients MÜSSEN ihnen unbekannte proprietäre Events (also solche, deren Typ nicht mit `m.` | ||
beginnt) darstellen und dem Nutzer die Möglichkeit bieten die Rohdaten des Events anzuzeigen. | ||
**\[\<=\]** | ||
|
||
*Offene Frage: Wäre es hilfreich die generelle Unterstützung eines Event-Typs schon vor dem Versand | ||
mittels [MSC4301] anfragen zu können? Was wären konkrete Anwendungsfälle dafür?* | ||
|
||
*Offene Frage: Viele Probleme des medizinischen Bereichs sind bereits mit FHIR modelliert worden. In | ||
Matrix können FHIR-Dateien schon heute über den `m.file` Message-Type mit dem MIME-Type | ||
`application/fhir+json` bzw. `application/fhir+xml` versendet werden. Wie schmerzhaft ist hierbei | ||
der Umweg über eine Datei? Wäre es hilfreich, die Daten mittels [MSC4302] inline in Events versenden | ||
zu können oder den Typ der enthaltenen Resourcen auch ohne Download erkennen zu können?* | ||
|
||
### Beispiel | ||
|
||
Dr. Alice und Patient Bob befinden sich in einem Matrix-Raum. Alice ist mit nur einem Client `A` | ||
verbunden wohingegen Bob auf zwei Geräten `B1` und `B2` angemeldet ist. Alice schickt Bob einen | ||
Anamnese-Fragebogen als FHIR [`Questionnaire`] in einer XML-Datei. Da Alice sicher gehen möchte, | ||
dass Bob den Fragebogen auf seinem Client ausfüllen kann, fragt sie zusammen mit dem Event auch | ||
dessen Verarbeitungsstatus an. | ||
|
||
``` json5 | ||
{ | ||
"event_id": "$1", | ||
"type": "m.room.message", | ||
"sender": "@dr.alice:alice.com", | ||
"content": { | ||
// Fragebogen | ||
"msgtype": "m.file", | ||
"body": "Bitten füllen sie diesen Fragebogen aus, danke.", | ||
"filename": "questionnaire.xml", | ||
"info": { | ||
"mimetype": "application/fhir+xml", | ||
... | ||
}, | ||
// Anfrage des Verarbeitungsstatus | ||
"de.gematik.msc4300.request.status": { | ||
"from_device": "A", | ||
"lifetime": 600_000, // 10min | ||
} | ||
... | ||
}, | ||
... | ||
} | ||
``` | ||
|
||
Bobs Client `B1` ist eine ältere Version und unterstützt das Ausfüllen von FHIR [`Questionnaire`]s | ||
nicht. Er unterstützt aber den allgemeinen Download von Dateien. Da dies bei FHIR-XML-Dokumenten | ||
eine u. U. starke Einschränkung für den Nutzer bedeuten kann, antwortet er mit einer Warnung: | ||
|
||
``` json5 | ||
{ | ||
"type": "de.gematik.msc4300.response.status", | ||
"sender": "@bob:bob.com", | ||
"content": { | ||
"m.response.status": { | ||
"from_device": "B1", | ||
"status": "success", | ||
"messages": [{ | ||
"type": "warning", | ||
"m.text": [{ "body": "Unbekannte FHIR-Datei wird nur zum Download angeboten" }] | ||
}] | ||
}, | ||
"m.relates_to": { | ||
"event_id": "$1", | ||
"rel_type": "m.reference", | ||
}, | ||
} | ||
} | ||
``` | ||
|
||
Bobs Client `B2` ist eine neuere Version und unterstützt das Ausfüllen von FHIR [`Questionnaire`]s | ||
nativ. Er antwortet daher mit einer Erfolgsmeldung ohne Warnung. | ||
|
||
``` json5 | ||
{ | ||
"type": "de.gematik.msc4300.response.status", | ||
"sender": "@bob:bob.com", | ||
"content": { | ||
"m.response.status": { | ||
"from_device": "B2", | ||
"status": "success", | ||
}, | ||
"m.relates_to": { | ||
"event_id": "$1", | ||
"rel_type": "m.reference", | ||
}, | ||
} | ||
} | ||
``` | ||
|
||
Alices Client kann nun erkennen, dass beide von Bobs Geräten den Fragebogen empfangen haben und ein | ||
Gerät in der Lage ist ihn auszufüllen. Sie kann daher sicher sein, dass Bob den Fragebogen | ||
bearbeiten kann. | ||
|
||
Bob füllt den Fragebogen auf seinem Gerät `B2` aus und sendet eine [`QuestionnaireResponse`] als | ||
FHIR-Datei zurück. Um sicherzugehen, dass Alice, seine Antwort erhält und versteht, fragt er nun | ||
seinerseits den Verarbeitungsstatus des Events an. | ||
|
||
``` json5 | ||
{ | ||
"event_id": "$2", | ||
"type": "m.room.message", | ||
"sender": "@bob:bob.com", | ||
"content": { | ||
// Ausgefüllter Fragebogen | ||
"msgtype": "m.file", | ||
"filename": "questionnaire_response.xml", | ||
"info": { | ||
"mimetype": "application/fhir+xml", | ||
... | ||
}, | ||
// Anfrage des Verarbeitungsstatus | ||
"de.gematik.msc4300.request.status": { | ||
"from_device": "B2", | ||
"lifetime": 600_000, // 10min | ||
} | ||
... | ||
}, | ||
... | ||
} | ||
``` | ||
|
||
Alice Client empfängt den ausgefüllten Fragebogen, validiert den Inhalt und bietet ihn Alice zur | ||
Weiterverarbeitung an bevor eine Erfolgsmeldung zurück gesendet wird. | ||
|
||
``` json5 | ||
{ | ||
"type": "de.gematik.msc4300.response.status", | ||
"sender": "@dr.alice:alice.com", | ||
"content": { | ||
"m.response.status": { | ||
"from_device": "A", | ||
"status": "success", | ||
}, | ||
"m.relates_to": { | ||
"event_id": "$2", | ||
"rel_type": "m.reference", | ||
}, | ||
} | ||
} | ||
``` | ||
|
||
Bob kann nun sicher sein, dass sein ausgefüllter Fragebogen empfangen und verstanden wurde. | ||
|
||
## Sicherheit und Datenschutz | ||
|
||
Die verpflichtende Antwort auf Abfragen zum Verarbeitungsstatus gibt den Online-Status des | ||
Empfängers gegenüber dem Absender preis. Zur Mitigierung dieses Problems können Clients ihre Antwort | ||
im Rahmen der `lifetime` von Anfragen verzögern. | ||
|
||
In Räumen mit mehreren Teilnehmern wird der Online-Status nicht nur dem Absender sondern allen | ||
Raumteilnehmern offengelegt. Dieses Problem erscheint vernachlässigbar, da der Regelfall in TI-M die | ||
direkte Kommunikation sein wird. Zudem ließe sich der Verarbeitungsstatus wie in [MSC4300] | ||
angedeutet in Zukunft auch per To-Device-Message kommunizieren. | ||
|
||
## Kompatibilität & Migration | ||
|
||
Clients, die dieses Proposal nicht implementieren werden Anfragen und Antworten zum | ||
Verarbeitungsstatus ignorieren. | ||
|
||
## Alternativen | ||
|
||
Keine. | ||
|
||
[Spezifikation]: https://spec.matrix.org/v1.14/appendices/#common-namespaced-identifier-grammar | ||
[Dienstkennungen]: https://fachportal.gematik.de/toolkit/dienstkennung-kim-kom-le | ||
[MSC4300]: https://github.com/matrix-org/matrix-spec-proposals/pull/4300 | ||
[MSC4301]: https://github.com/matrix-org/matrix-spec-proposals/pull/4301 | ||
[MSC4302]: https://github.com/matrix-org/matrix-spec-proposals/pull/4302 | ||
[`Questionnaire`]: https://build.fhir.org/questionnaire-definitions.html | ||
[`QuestionnaireResponse`]: https://build.fhir.org/questionnaireresponse.html |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ManuelB schreibt:
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sehr interessanter Gedanke. An ein Zusammenspiel von KIM und TI-M hatte ich bisher noch nicht gedacht. Eigentlich wollen wir KIM ja eher ablösen aber so eine Integration könnte den Übergang erleichtern.
Jetzt frage ich mich aber ob wir hier wirklich eine Tiefenintegration brauchen. Könnte man KIM-Nachrichten in TI-M nicht einfach als Datei verschicken? Mein KIM-fu ist schwach aber naiv stelle ich mir eine
.eml
Datei mitmessage/rfc822
MIME-Type vor. Eventuell müsste man einige Header oder andere Metadaten in den Event-Content duplizieren damit der Empfänger nicht die ganze Datei herunterladen muss um zu verstehen was drin steckt.Was genau hattest du dir bei JMAP vorgestellt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Kann man auch über message/rfc822 machen. Grundsätzlich bin ich leidenschaftslos über das Format, wie man es überträgt. Ich halte es nur für wichtig, dass man bereits bestehende Systeme mitdenkt z.B. laufen so gut wie alle eAUs in Deutschland über KIM (circa 500.000 am Tag) und auch alle Arztbriefe. Ein Gateway zwischen KIM und TIM wäre super cool. E-Mail an [maitrx-id]@kim-to-tim.telematik und es wird die KIM E-Mail per TI-M an die Matrix Id zugestellt. Optimalerweise gibt es das auch in die Rückrichtung.
JMap hätten den Vorteil, dass es JSON ist und somit deutlich besser in den Matrix Stack passen würde. Es gibt auch automatische Translator von Mime to JMAP (https://github.com/josephg/mime-to-jmap).
Es ist sehr unwahrscheinlich, dass so ein großes System wie KIM kurzfristig (in den nächsten 10 Jahren) abgelöst wird.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ja, richtig. Es war mehr die Hoffnung, die aus mir sprach. 😅
Ich finde die Idee einer KIM-Bridge super spannend. Das ganze ist aber etwas tangential zu diesem Proposal hier. Wir können den hier eingeführten Verarbeitungsstatus wahrscheinlich auch verwenden um KIM-Nachrichten in Matrix zu verschicken. Ich sehe momentan aber nicht so richtig wie das Design einer Bridge dieses Proposal hier beeinflussen könnte. Deshalb habe ich das Thema mal hierhin ausgelagert: #318
Ich lasse diesen Thread aber erstmal noch offen.