├── .github └── workflows │ └── validate.yml ├── .gitignore ├── .markdownlint.json ├── .vscode └── settings.json ├── CNAME ├── CODE_OF_CONDUCT.md ├── FHIR-fhircast.xml ├── GOVERNANCE.md ├── LICENSE ├── README.md ├── _gencontinuous.bat ├── _gencontinuous.sh ├── _genonce.bat ├── _genonce.sh ├── _updatePublisher.bat ├── _updatePublisher.sh ├── docs └── img │ ├── FHIRcast logo proof of Ownership.jpeg │ ├── FHIRcast logo.ai │ └── FHIRcast logo.jpg ├── ebnf ├── LICENSE │ ├── LICENSE.txt │ └── THIRD-PARTY-NOTICES.txt ├── README.txt ├── _createAllEbnfPng.sh ├── _createEbnfPng.sh ├── diagram │ ├── ContentSharingEventName.png │ ├── ContextEventName.png │ ├── EventName.png │ ├── FhircastScopes.png │ └── SelectionEventName.png ├── input │ ├── contextchange.ebnf │ ├── events.ebnf │ ├── scopes.ebnf │ ├── selection.ebnf │ └── update.ebnf └── rr.war ├── fhircast-template ├── content │ └── assets │ │ ├── ico │ │ └── favicon.png │ │ └── images │ │ └── FHIRcastLogo.jpg ├── includes │ └── fragment-header.html └── package │ └── package.json ├── fullSpec ├── createAggregatedCompleteSpec.sh ├── fullspec-md.html └── fullspec.html ├── ig.ini ├── input ├── fsh │ ├── CapabilityStatement.fsh │ ├── FHIRcastCodeSystem.fsh │ ├── FHIRcastContentUpdateBundle.fsh │ ├── FHIRcastDiagnosticReportClose.fsh │ ├── FHIRcastDiagnosticReportOpen.fsh │ ├── FHIRcastEncounterClose.fsh │ ├── FHIRcastEncounterOpen.fsh │ ├── FHIRcastImagingStudyClose.fsh │ ├── FHIRcastImagingStudyOpen.fsh │ ├── FHIRcastObservation.fsh │ ├── FHIRcastPatientClose.fsh │ ├── FHIRcastPatientOpen.fsh │ ├── FHIRcastSyncErrorContext.fsh │ ├── FHIRcastUserHibernateContext.fsh │ ├── FHIRcastUserLogoutContext.fsh │ ├── GetCurrentContextBundle.fsh │ ├── ReferredToResources.fsh │ └── rulesets.fsh ├── ignoreWarnings.txt ├── images-source │ ├── ContentExchangeAdvancedQuantification.plantuml │ ├── ContentExchangeBasic.plantuml │ ├── ContentExchangeClosure.plantuml │ ├── ContentExchangeFHIR.plantuml │ ├── ContentExchangeHybrid.plantuml │ ├── ContentExchangeOpenReport.plantuml │ ├── ContentExchangeShareContent.plantuml │ ├── DeniedSubscriptionSequence.plantuml │ ├── EBNF Event Pattern Diagram Instruction.txt │ ├── ErrorSequence.drawio.old │ ├── EventNotificationErrorSequence.plantuml │ ├── EventNotificationSequence.plantuml │ ├── FHIRcast overview for abstract.drawio │ ├── FHIRcast overview for abstract.pptx │ ├── FHIRcastOverviewForAbstract.plantuml │ ├── MultiplePatientOpens.xml │ ├── PatientOpenAndClose.xml │ ├── Request Context Change Flow.xml │ ├── SuccessfulWebSocketSubscriptionSequence.plantuml │ ├── UnsubscriptionSequence.plantuml │ └── content-sharing.EAP ├── images │ ├── ContentEventName.png │ ├── ContentSharingEventName.png │ ├── ContextEventName.png │ ├── EventName.png │ ├── FhircastScopes.png │ ├── Info_Simple_bw.svg.png │ ├── MultiplePatientOpens.png │ ├── PatientOpenAndClose.png │ ├── SelectionEventName.png │ ├── TransactionalUpdates.png │ ├── colorful overview diagram.png │ ├── hl7-logo-header-good-resolution.png │ ├── hl7-logo-header.png │ ├── information-svgrepo-com.svg │ └── question-mark-in-a-circle-svgrepo-com.svg ├── includes │ ├── img.html │ ├── infonote.html │ └── questionnote.html ├── jira │ └── FHIR-fhircast.xml └── pagecontent │ ├── 2-1-SessionDiscovery.md │ ├── 2-10-ContentSharing.md │ ├── 2-2-FhircastScopes.md │ ├── 2-3-Events.md │ ├── 2-4-Subscribing.md │ ├── 2-5-ReceiveEventNotification.md │ ├── 2-6-SendEventNotification.md │ ├── 2-7-Conformance.md │ ├── 2-8-Extensions.md │ ├── 2-9-GetCurrentContext.md │ ├── 2_Specification.md │ ├── 3-1-0-eventstructures.md │ ├── 3-1-1-template.md │ ├── 3-1-2-eventmaturitymodel.md │ ├── 3-2-0-infrastructureevents.md │ ├── 3-2-1-SyncError.md │ ├── 3-2-2-UserLogout.md │ ├── 3-2-3-UserHibernate.md │ ├── 3-2-5-Home-open.md │ ├── 3-3-0-patientevents.md │ ├── 3-3-1-Patient-open copy.md │ ├── 3-3-1-Patient-open.md │ ├── 3-3-2-Patient-close.md │ ├── 3-4-0-encounterevents.md │ ├── 3-4-1-Encounter-open.md │ ├── 3-4-2-Encounter-close.md │ ├── 3-5-0-imagingstudyevents.md │ ├── 3-5-1-ImagingStudy-open.md │ ├── 3-5-2-ImagingStudy-close.md │ ├── 3-6-0-diagnosticreportevents.md │ ├── 3-6-1-DiagnosticReport-open.md │ ├── 3-6-2-DiagnosticReport-close.md │ ├── 3-6-3-DiagnosticReport-update.md │ ├── 3-6-4-DiagnosticReport-select.md │ ├── 3_Events.md │ ├── 4-1-launch-scenarios.md │ ├── 4-2-0-contextsynchronizationscenarios.md │ ├── 4-2-1-syncconsiderations.md │ ├── 4-2-2-multitab-considerations.md │ ├── 4-2-3-multi-anchor-considerations.md │ ├── 4-3-security-considerations.md │ ├── 4-4-fhircast-event-content-sharing.md │ ├── 4_Scenarios.md │ ├── 5_glossary.md │ ├── 6_change-log.md │ ├── 7_design-notes.md │ └── index.md ├── oldspec ├── Feb2020Ballot.md ├── May2019Ballot.md ├── STU1.md ├── STU2.md └── STU3BallotDraft.md ├── publication-request.json ├── startDockerPublisher.sh ├── sushi-config.yaml └── updateSiteBasedOnMarkdownChange.sh /.github/workflows/validate.yml: -------------------------------------------------------------------------------- 1 | name: validate 2 | 3 | on: 4 | push: 5 | branches: [ master ] 6 | pull_request: 7 | types: [opened, synchronize] # This will trigger the workflow only when a PR is opened or updated with new commits 8 | workflow_dispatch: 9 | 10 | jobs: 11 | sushi: 12 | runs-on: ubuntu-latest 13 | 14 | steps: 15 | - uses: actions/checkout@v3 16 | 17 | - name: Install Sushi 18 | run: sudo npm install -g fsh-sushi 19 | 20 | - name: Validate with Sushi 21 | run: sushi . 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Mac 2 | *.DS_STORE 3 | 4 | # python 5 | env/ 6 | 7 | # mkdocs 8 | site/ 9 | 10 | .idea/ 11 | 12 | # FHIR publisher 13 | input-cache/ 14 | temp/ 15 | fsh-generated/ 16 | template/ 17 | output/ 18 | updateWebsite.sh 19 | nginx.conf 20 | fhircast-template/includes/.index.json 21 | fhircast-template/includes/.index.db 22 | fhircast-template/package/.index.db 23 | fhircast-template/package/.index.json 24 | fhircast-template/content/.index.json 25 | fhircast-template/content/.index.db 26 | fhircast-template/content/assets/.index.json 27 | fhircast-template/content/assets/.index.db 28 | fhircast-template/content/assets/ico/.index.json 29 | fhircast-template/content/assets/ico/.index.db 30 | fhircast-template/content/assets/images/.index.json 31 | fhircast-template/content/assets/images/.index.db 32 | -------------------------------------------------------------------------------- /.markdownlint.json: -------------------------------------------------------------------------------- 1 | { 2 | "blanks-around-tables": false 3 | } -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "fhircast" 4 | ] 5 | } -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | fhircast.org 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, gender identity and expression, level of experience, 9 | nationality, personal appearance, race, religion, or sexual identity and 10 | orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | * Using welcoming and inclusive language 18 | * Being respectful of differing viewpoints and experiences 19 | * Gracefully accepting constructive criticism 20 | * Focusing on what is best for the community 21 | * Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | * The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | * Trolling, insulting/derogatory comments, and personal or political attacks 28 | * Public or private harassment 29 | * Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | * Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting any member of the [Project Management Committee](./GOVERNANCE.md#project-management-committee). All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at [http://contributor-covenant.org/version/1/4][version] 72 | 73 | [homepage]: http://contributor-covenant.org 74 | [version]: http://contributor-covenant.org/version/1/4/ 75 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2018, HL7 2 | 3 | This document is licensed under the terms of HL7's FHIR license. 4 | http://hl7.org/fhir/license.html 5 | 6 | Creative Commons "No Rights Reserved" (CC0) 7 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FHIRcast 2 | 3 | ## Getting Started 4 | 5 | Refer to HL7 IG Publisher documentation. 6 | 7 | This FHIR Implementation Guide is viewable at: https://build.fhir.org/ig/HL7/fhircast-docs/ 8 | 9 | ## Contributing 10 | 11 | We encourage and welcome any contributions to FHIRcast. 12 | 13 | In support of a healthy and inclusive community, we use and enforce a [code of conduct](./CODE_OF_CONDUCT.md) for all members of our community. Our code of conduct is adapted from the [CDS Hooks project](https://github.com/cds-hooks/docs) which was adapted from the) [Contributor Covenant](http://contributor-covenant.org/). In addition, FHIRcast is now a work-product governed by the decison making practices of the HL7 Infrastructure and Messaging work group. 14 | 15 | Interested parties may subscribe to the Infrastructure and Messaging listsrv by creating a FREE logon to HL7.org, then navigating to https://www.hl7.org/myhl7/managelistservs.cfm to choose the Infrastructure and messaging/Infrastructure and Management(Primary list), and subscribing. 16 | 17 | The Conference call calendar is available at https://www.hl7.org/concalls/Default.aspx?ref=nav then from the drop-down select Infrastructure And Messaging. 18 | 19 | ## Copyright & License 20 | Copyright (c) 2021+ Health Level Seven® International (HL7) 21 | 22 | This document is licensed under the terms of HL7's FHIR license. 23 | http://hl7.org/fhir/license.html 24 | 25 | Creative Commons "No Rights Reserved" [![CC0](https://www.hl7.org/fhir/cc0.png)](https://www.hl7.org/fhir/license.html) 26 | 27 | ## ANSI Anti-Trust Policy: 28 | 29 | Professional Associations, such as HL7, which bring together competing entities are subject to strict scrutiny under applicable antitrust laws. HL7 recognizes that the antitrust laws were enacted to promote fairness in competition and, as such, supports laws against monopoly and restraints of trade and their enforcement. Each individual participating in HL7 meetings and conferences, regardless of venue, is responsible for knowing the contents of and adhering to the HL7 Antitrust Policy as stated in §05.01 of the Governance and Operations Manual (GOM). 30 | 31 | ## Used content 32 | 33 | This content uses icons from the (Basic Application Collection)[https://www.svgrepo.com/collection/basic-application/] -------------------------------------------------------------------------------- /_gencontinuous.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | CALL ./_genonce.bat -watch -------------------------------------------------------------------------------- /_gencontinuous.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | ./_genonce.sh -watch 3 | -------------------------------------------------------------------------------- /_genonce.bat: -------------------------------------------------------------------------------- 1 | @ECHO OFF 2 | SET publisher_jar=publisher.jar 3 | SET input_cache_path=%CD%\input-cache 4 | 5 | ECHO Checking internet connection... 6 | PING tx.fhir.org -4 -n 1 -w 1000 | FINDSTR TTL && GOTO isonline 7 | ECHO We're offline... 8 | SET txoption=-tx n/a 9 | GOTO igpublish 10 | 11 | :isonline 12 | ECHO We're online 13 | SET txoption= 14 | 15 | :igpublish 16 | 17 | SET JAVA_TOOL_OPTIONS=-Dfile.encoding=UTF-8 18 | 19 | IF EXIST "%input_cache_path%\%publisher_jar%" ( 20 | JAVA -jar "%input_cache_path%\%publisher_jar%" -ig . %txoption% %* 21 | ) ELSE If exist "..\%publisher_jar%" ( 22 | JAVA -jar "..\%publisher_jar%" -ig . %txoption% %* 23 | ) ELSE ( 24 | ECHO IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... 25 | ) 26 | 27 | PAUSE 28 | -------------------------------------------------------------------------------- /_genonce.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | publisher_jar=publisher.jar 3 | input_cache_path=./input-cache/ 4 | echo Checking internet connection... 5 | curl -sSf tx.fhir.org > /dev/null 6 | 7 | if [ $? -eq 0 ]; then 8 | echo "Online" 9 | txoption="" 10 | else 11 | echo "Offline" 12 | txoption="-tx n/a" 13 | fi 14 | 15 | echo "$txoption" 16 | 17 | export JAVA_TOOL_OPTIONS="$JAVA_TOOL_OPTIONS -Dfile.encoding=UTF-8" 18 | 19 | publisher=$input_cache_path/$publisher_jar 20 | if test -f "$publisher"; then 21 | java -jar $publisher -ig . $txoption $* 22 | 23 | else 24 | publisher=../$publisher_jar 25 | if test -f "$publisher"; then 26 | java -jar $publisher -ig . $txoption $* 27 | else 28 | echo IG Publisher NOT FOUND in input-cache or parent folder. Please run _updatePublisher. Aborting... 29 | fi 30 | fi 31 | -------------------------------------------------------------------------------- /_updatePublisher.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | pubsource=https://github.com/HL7/fhir-ig-publisher/releases/latest/download/ 3 | publisher_jar=publisher.jar 4 | dlurl=$pubsource$publisher_jar 5 | 6 | input_cache_path=$PWD/input-cache/ 7 | 8 | scriptdlroot=https://raw.githubusercontent.com/HL7/ig-publisher-scripts/main 9 | update_bat_url=$scriptdlroot/_updatePublisher.bat 10 | gen_bat_url=$scriptdlroot/_genonce.bat 11 | gencont_bat_url=$scriptdlroot/_gencontinuous.bat 12 | gencont_sh_url=$scriptdlroot/_gencontinuous.sh 13 | gen_sh_url=$scriptdlroot/_genonce.sh 14 | update_sh_url=$scriptdlroot/_updatePublisher.sh 15 | 16 | skipPrompts=false 17 | FORCE=false 18 | 19 | if ! type "curl" > /dev/null; then 20 | echo "ERROR: Script needs curl to download latest IG Publisher. Please install curl." 21 | exit 1 22 | fi 23 | 24 | while [ "$#" -gt 0 ]; do 25 | case $1 in 26 | -f|--force) FORCE=true ;; 27 | -y|--yes) skipPrompts=true ; FORCE=true ;; 28 | *) echo "Unknown parameter passed: $1. Exiting"; exit 1 ;; 29 | esac 30 | shift 31 | done 32 | 33 | echo "Checking internet connection" 34 | curl -sSf tx.fhir.org > /dev/null 35 | 36 | if [ $? -ne 0 ] ; then 37 | echo "Offline (or the terminology server is down), unable to update. Exiting" 38 | exit 1 39 | fi 40 | 41 | if [ ! -d "$input_cache_path" ] ; then 42 | if [ $FORCE != true ]; then 43 | echo "$input_cache_path does not exist" 44 | message="create it?" 45 | read -r -p "$message" response 46 | else 47 | response=y 48 | fi 49 | fi 50 | 51 | if [[ $response =~ ^[yY].*$ ]] ; then 52 | mkdir ./input-cache 53 | fi 54 | 55 | publisher="$input_cache_path$publisher_jar" 56 | 57 | if test -f "$publisher" ; then 58 | echo "IG Publisher FOUND in input-cache" 59 | jarlocation="$publisher" 60 | jarlocationname="Input Cache" 61 | upgrade=true 62 | else 63 | publisher="../$publisher_jar" 64 | upgrade=true 65 | if test -f "$publisher"; then 66 | echo "IG Publisher FOUND in parent folder" 67 | jarlocation="$publisher" 68 | jarlocationname="Parent Folder" 69 | upgrade=true 70 | else 71 | echo "IG Publisher NOT FOUND in input-cache or parent folder" 72 | jarlocation=$input_cache_path$publisher_jar 73 | jarlocationname="Input Cache" 74 | upgrade=false 75 | fi 76 | fi 77 | 78 | if [[ $skipPrompts == false ]]; then 79 | 80 | if [[ $upgrade == true ]]; then 81 | message="Overwrite $jarlocation? (Y/N) " 82 | else 83 | echo Will place publisher jar here: "$jarlocation" 84 | message="Ok (enter 'y' or 'Y' to continue, any other key to cancel)?" 85 | fi 86 | read -r -p "$message" response 87 | else 88 | response=y 89 | fi 90 | if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then 91 | 92 | echo "Downloading most recent publisher to $jarlocationname - it's ~100 MB, so this may take a bit" 93 | curl -L $dlurl -o "$jarlocation" --create-dirs 94 | else 95 | echo cancelled publisher update 96 | fi 97 | 98 | if [[ $skipPrompts != true ]]; then 99 | message="Update scripts? (enter 'y' or 'Y' to continue, any other key to cancel)?" 100 | read -r -p "$message" response 101 | fi 102 | 103 | if [[ $skipPrompts == true ]] || [[ $response =~ ^[yY].*$ ]]; then 104 | echo "Downloading most recent scripts " 105 | 106 | curl -L $update_bat_url -o /tmp/_updatePublisher.new 107 | cp /tmp/_updatePublisher.new _updatePublisher.bat 108 | rm /tmp/_updatePublisher.new 109 | 110 | curl -L $gen_bat_url -o /tmp/_genonce.new 111 | cp /tmp/_genonce.new _genonce.bat 112 | rm /tmp/_genonce.new 113 | 114 | curl -L $gencont_bat_url -o /tmp/_gencontinuous.new 115 | cp /tmp/_gencontinuous.new _gencontinuous.bat 116 | rm /tmp/_gencontinuous.new 117 | 118 | curl -L $gencont_sh_url -o /tmp/_gencontinuous.new 119 | cp /tmp/_gencontinuous.new _gencontinuous.sh 120 | chmod +x _gencontinuous.sh 121 | rm /tmp/_gencontinuous.new 122 | 123 | curl -L $gen_sh_url -o /tmp/_genonce.new 124 | cp /tmp/_genonce.new _genonce.sh 125 | chmod +x _genonce.sh 126 | rm /tmp/_genonce.new 127 | 128 | curl -L $update_sh_url -o /tmp/_updatePublisher.new 129 | cp /tmp/_updatePublisher.new _updatePublisher.sh 130 | chmod +x _updatePublisher.sh 131 | rm /tmp/_updatePublisher.new 132 | fi 133 | -------------------------------------------------------------------------------- /docs/img/FHIRcast logo proof of Ownership.jpeg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/docs/img/FHIRcast logo proof of Ownership.jpeg -------------------------------------------------------------------------------- /docs/img/FHIRcast logo.ai: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/docs/img/FHIRcast logo.ai -------------------------------------------------------------------------------- /docs/img/FHIRcast logo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/docs/img/FHIRcast logo.jpg -------------------------------------------------------------------------------- /ebnf/LICENSE/LICENSE.txt: -------------------------------------------------------------------------------- 1 | RR - Railroad Diagram Generator 2 | 3 | Copyright 2010-2021 Gunther Rademacher 4 | 5 | Licensed under the Apache 2.0 License, Version 2.0 (the "License"); 6 | you may not use this file except in compliance with the License. 7 | You may obtain a copy of the License at 8 | 9 | http://www.apache.org/licenses/LICENSE-2.0 10 | 11 | Unless required by applicable law or agreed to in writing, software 12 | distributed under the License is distributed on an "AS IS" BASIS, 13 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 14 | implied. See the License for the specific language governing 15 | permissions and limitations under the License. 16 | 17 | This distribution also includes 18 | 19 | - Saxon-HE from Saxonica.com 20 | - TagSoup 21 | - Apache Batik 22 | - Apache XML Graphics Commons 23 | - Apache XML Commons XML APIs 24 | 25 | For their license information see THIRD-PARTY-NOTICES.txt. 26 | 27 | Thank you for choosing RR - Railroad Diagram Generator. 28 | -------------------------------------------------------------------------------- /ebnf/README.txt: -------------------------------------------------------------------------------- 1 | This folder holds the "Railroad Diagram Generator" (see below) and a set of shell scripts 2 | that allow generation of EBNF railroad diagrams based on EBNF input files. 3 | 4 | Files and folders: 5 | _createAllEbnfPng.sh 6 | Shell script that runs _createEbnfPng.sh on all ebnf files in input and copies the resulting png files to input/images 7 | _createEbnfPng.sh 8 | Shell script that takes an ebnf file as input and generates an png file in the diagram directory 9 | input/ 10 | directory that holds the ebnf files 11 | diagram/ 12 | directory that holds the generated png files 13 | rr.war 14 | The Railroad Diagram Generator 15 | LICENSE/ 16 | directory that holds the Railroad Diagram Generator license information. 17 | 18 | 19 | =============================== 20 | 21 | 22 | RR - Railroad Diagram Generator 23 | 24 | version 1.63 25 | released Mar 13, 2021 26 | from https://bottlecaps.de/rr 27 | 28 | Usage: java -jar rr.war {-suppressebnf|-keeprecursion|-nofactoring|-noinline|-noepsilon|-color:COLOR|-offset:OFFSET|-png|-md|-out:FILE|width:PIXELS}... GRAMMAR 29 | or java -jar rr.war -gui [-port:PORT] 30 | 31 | -suppressebnf do not show EBNF next to generated diagrams 32 | -keeprecursion no direct recursion elimination 33 | -nofactoring no left or right factoring 34 | -noinline do not inline nonterminals that derive to single literals 35 | -noepsilon remove nonterminal references that derive to epsilon only 36 | -color:COLOR use COLOR as base color, pattern: #[0-9a-fA-F]{6} 37 | -offset:OFFSET hue offset to secondary color in degrees 38 | -png create HTML+PNG in a ZIP file, rather than XHTML+SVG output 39 | -out:FILE create FILE, rather than writing result to standard output 40 | -width:PIXELS try to break graphics into multiple lines, when width exceeds PIXELS (default 992) 41 | 42 | GRAMMAR path of grammar, in W3C style EBNF, default encoding (use '-' for stdin) 43 | 44 | -gui run GUI on http://localhost:8080/ 45 | -port:PORT use PORT rather than 8080 46 | 47 | rr.war is an executable war file. It can be run with "java -jar" as shown 48 | above, but it can also be deployed in servlet containers like Tomcat or Jetty. 49 | -------------------------------------------------------------------------------- /ebnf/_createAllEbnfPng.sh: -------------------------------------------------------------------------------- 1 | # remove old files 2 | rm -f diagram/*.png 3 | 4 | # create new files for all files in input 5 | find input/ -name *.ebnf -exec ./_createEbnfPng.sh {} \; 6 | 7 | # copy to input/images 8 | cp diagram/*.png ../input/images/ 9 | -------------------------------------------------------------------------------- /ebnf/_createEbnfPng.sh: -------------------------------------------------------------------------------- 1 | echo $1 2 | # create image zip 3 | java -jar rr.war -png $1 > output.zip 4 | 5 | # unzip and remove unrequired files. 6 | unzip -o output.zip 7 | rm -f index.html 8 | rm -f output.zip 9 | rm -f diagram/Railroad-Diagram-Generator.png 10 | 11 | -------------------------------------------------------------------------------- /ebnf/diagram/ContentSharingEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/diagram/ContentSharingEventName.png -------------------------------------------------------------------------------- /ebnf/diagram/ContextEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/diagram/ContextEventName.png -------------------------------------------------------------------------------- /ebnf/diagram/EventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/diagram/EventName.png -------------------------------------------------------------------------------- /ebnf/diagram/FhircastScopes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/diagram/FhircastScopes.png -------------------------------------------------------------------------------- /ebnf/diagram/SelectionEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/diagram/SelectionEventName.png -------------------------------------------------------------------------------- /ebnf/input/contextchange.ebnf: -------------------------------------------------------------------------------- 1 | ContextEventName ::= ( FHIRresource ) '-' ( 'open' | 'close' ) -------------------------------------------------------------------------------- /ebnf/input/events.ebnf: -------------------------------------------------------------------------------- 1 | EventName ::= (FHIRresource ) ('-') ( 'open' | 'close' | 'update' | 'select' ) 2 | -------------------------------------------------------------------------------- /ebnf/input/scopes.ebnf: -------------------------------------------------------------------------------- 1 | FhircastScopes ::= fhircast '/' ( 'FHIRcast-event-name' | '*' ) '.' ( 'read' | 'write' | '*' ) -------------------------------------------------------------------------------- /ebnf/input/selection.ebnf: -------------------------------------------------------------------------------- 1 | SelectionEventName ::= ( FHIRresource ) '-' ( select ) -------------------------------------------------------------------------------- /ebnf/input/update.ebnf: -------------------------------------------------------------------------------- 1 | ContentSharingEventName ::= ( FHIRresource ) '-' ( update ) -------------------------------------------------------------------------------- /ebnf/rr.war: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/ebnf/rr.war -------------------------------------------------------------------------------- /fhircast-template/content/assets/ico/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/fhircast-template/content/assets/ico/favicon.png -------------------------------------------------------------------------------- /fhircast-template/content/assets/images/FHIRcastLogo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/fhircast-template/content/assets/images/FHIRcastLogo.jpg -------------------------------------------------------------------------------- /fhircast-template/includes/fragment-header.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 | 7 |
8 |
9 | 10 |
11 | 14 | 15 |
16 | FHIRcast logo 17 |
-------------------------------------------------------------------------------- /fhircast-template/package/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "fhicast.fhir.template", 3 | "version": "0.1.0", 4 | "type": "fhir.template", 5 | "license": "CC0-1.0", 6 | "description": "FHIRcast FHIR Template", 7 | "author": "http://hl7.org", 8 | "canonical": "http://fhir.org/templates/fhircast.fhir.template", 9 | "base": "hl7.fhir.template", 10 | "dependencies": { 11 | "hl7.fhir.template": "current" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /fullSpec/createAggregatedCompleteSpec.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # copies all sections to a single markdown file and adds it to the site so it can be build 4 | # this is usefull for review. 5 | 6 | sushiconfig="../sushi-config.yaml" 7 | fullspec="fullspec.md" 8 | 9 | rm -Rf $fullspec 10 | rm -Rf $fullspec.tmp 11 | 12 | echo "#" FHIRcast > $fullspec 13 | echo >> $fullspec 14 | 15 | echo 1. The generated Toc will be an ordered list >> $fullspec 16 | echo {:toc} >> $fullspec 17 | echo >> $fullspec 18 | 19 | # cat $sushiconfig | sed -ne '/pages/,$ p' 20 | 21 | cat $sushiconfig | sed -ne '/pages/,$ p'| grep -e .md -e title: | while read line1 22 | do 23 | read line2 24 | echo title-: $line2 25 | echo md----: $line1 26 | echo "##" ${line2#title:} >> $fullspec 27 | echo >> $fullspec 28 | fn=../input/pagecontent/${line1%":"} 29 | cat $fn >> $fullspec 30 | done 31 | 32 | mv $fullspec ../temp/pages/_includes 33 | cp -f fullspec-md.html ../temp/pages/_includes 34 | cp fullspec.html ../temp/pages 35 | 36 | # cd ../temp/pages 37 | 38 | # jekyll b 39 | 40 | # cd output 41 | # mv ../$fullspec . 42 | # kramdown --auto-ids $fullspec > FHIRcast.html -------------------------------------------------------------------------------- /fullSpec/fullspec-md.html: -------------------------------------------------------------------------------- 1 | {% include fragment-pagebegin.html %} 2 | 10 |

FHIRcast

11 |
12 |

{{site.data.pages[page.path].title | escape_once}}

13 | {% assign path = page.path | split: '.html' %} 14 | 15 | {% capture toc-content %} 16 |
17 | {:toc} 18 | * This will not be displayed 19 |
20 | {% include {{path}}.md %} 21 | {% endcapture %} 22 | 23 | {% capture no-toc-content %} 24 |
25 | 26 |
27 | {% include {{path}}.md %} 28 | {% endcapture %} 29 | 30 | {% assign teststring = no-toc-content | markdownify | remove: '###### ' | remove: '##### '| remove: '#### ' | replace: " 40 | -------------------------------------------------------------------------------- /fullSpec/fullspec.html: -------------------------------------------------------------------------------- 1 | --- 2 | --- 3 | {% include fullspec-md.html%} -------------------------------------------------------------------------------- /ig.ini: -------------------------------------------------------------------------------- 1 | [IG] 2 | ig = fsh-generated/resources/ImplementationGuide-hl7.fhir.uv.fhircast.json 3 | template = fhircast-template 4 | # template = hl7.fhir.template#current 5 | auto-oid-root = true 6 | -------------------------------------------------------------------------------- /input/fsh/CapabilityStatement.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastCapabilityStatement 2 | Parent: CapabilityStatement 3 | Id: fhircast-capabilitystatement 4 | Description: "CapabilityStatment stating support for FHIRcast. To supplement or optionally identify the location of a FHIRcast hub, a FHIR server MAY declare support for FHIRcast using the FHIRcast extension on its FHIR CapabilityStatement’s rest element." 5 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 6 | * implementationGuide ^slicing.rules = #open 7 | * implementationGuide ^slicing.description = "Encourage FHIRcast IG to be listed" 8 | * implementationGuide ^slicing.discriminator.type = #value 9 | * implementationGuide ^slicing.discriminator.path = "$this" 10 | * implementationGuide 0..* 11 | * implementationGuide contains fhircast 0..1 12 | * implementationGuide[fhircast] = "http://hl7.org/fhir/uv/fhircast/ImplementationGuide/hl7.fhir.uv.fhircast|3.0.0" 13 | * rest ^slicing.rules = #open 14 | * rest ^slicing.discriminator.type = #value 15 | * rest ^slicing.discriminator.path = "mode" 16 | * rest ^slicing.description = "Slice stating support for FHIRcast extension. Note that this extension might not be supportable by client-side Hubs." 17 | * rest contains client 0..1 and server 0..1 18 | * rest[client].mode = #client 19 | * rest[server].mode = #server 20 | * rest[server].extension contains FHIRcastConfigurationExtension named fhircast 0..1 MS 21 | 22 | Extension: FHIRcastConfigurationExtension 23 | Id: fhircast-configuration-extension 24 | Title: "FHIRcast extension" 25 | Context: CapabilityStatement.rest 26 | Description: """ 27 | Extension in CapabilityStatement stating the location of the FHIRcast hub to be used with this FHIR server. 28 | """ 29 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 30 | * value[x] 0..0 31 | * extension contains hubUrl 1..1 MS 32 | * extension[hubUrl] 33 | * url 1..1 MS 34 | * ^fixedUri = "hub.url" 35 | * value[x] only url 36 | 37 | 38 | Instance: FHIRcastCapabilityStatement-Example 39 | InstanceOf: FHIRcastCapabilityStatement 40 | Description: "Example instance of a CapabilityStatement with FHIRcast extension." 41 | Usage: #example 42 | * id = "fhircast-capabilitystatement-example" 43 | * status = #active 44 | * date = "2024-04-04" 45 | * kind = #instance 46 | * fhirVersion = #4.0.1 47 | * format[+] = #json 48 | * format[+] = #xml 49 | * software 50 | * name = "FHIR server software supporting FHIRcast" 51 | * implementation 52 | * description = "Instance of FHIR server software supporting FHIRcast" 53 | * implementationGuide[fhircast] = "http://hl7.org/fhir/uv/fhircast/ImplementationGuide/hl7.fhir.uv.fhircast|3.0.0" 54 | * description = """ 55 | Example instance of a CapabilityStatement with FHIRcast extension. 56 | """ 57 | * rest[server] 58 | * extension[fhircast] 59 | * extension[hubUrl] 60 | * valueUrl = "http://my-fhircast-hub-url.example.org" 61 | * resource[+] 62 | * type = #Patient 63 | * interaction[+] 64 | * code = #read 65 | 66 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastCodeSystem.fsh: -------------------------------------------------------------------------------- 1 | CodeSystem: FHIRcastCodeSystem 2 | Id: fhircast-codesystem 3 | Title: "FHIRcast related Terminology." 4 | Description: """ 5 | This codesystem defines terminology that is used within the FHIRcast specification. 6 | """ 7 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 8 | * ^experimental = false 9 | * ^caseSensitive = true 10 | * ^version = "0.1.0" 11 | * #user-initiated "User initiated action." 12 | "The user initiated the action." 13 | * #system-timeout "System initiated action due to timeout" 14 | "The system on which the Subscriber running has reached a pre-specified length of inactivity such that it is initiating the logout." 15 | * #system-initiated "System initiated action" 16 | "The system on which the Subscriber running is initiating the action for a reason other than timeout." 17 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastContentUpdateBundle.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastContentUpdateBundle 2 | Parent: Bundle 3 | Id: fhircast-content-update-bundle 4 | Title: "FHIRcast Content Update Bundle" 5 | Description: """ 6 | Defines the structure of a Bundle that carries content updates that are 7 | communicated in FHIRcast `-update` messages. The bundle can only contain 8 | requests of type PUT and DELETE. 9 | POST is not allowed as the content sharing mechanism cannot indicate the 10 | id of the created resource using a POST operation. 11 | """ 12 | * insert SetWorkgroupFmmAndStatusRule( #inm, 3, #active) 13 | * type MS 14 | * type = #transaction 15 | * link 0..0 16 | * entry MS 17 | * entry ^slicing.discriminator.type = #value 18 | * entry ^slicing.discriminator.path = "request.method" 19 | * entry ^slicing.rules = #open 20 | * entry ^slicing.ordered = false // can be omitted, since false is the default 21 | * entry ^slicing.description = "Slice defining each method" 22 | * entry contains put 0..* MS and delete 0..* MS 23 | * entry[put] 24 | * fullUrl MS 25 | * fullUrl 0..1 26 | * resource 1..1 27 | * search 0..0 28 | * request 1..1 29 | * method = #PUT 30 | * url 1..1 31 | * response 0..0 32 | * entry[delete] 33 | * fullUrl MS 34 | * fullUrl 1..1 35 | * resource 0..0 36 | * search 0..0 37 | * request 1..1 38 | * method = #DELETE 39 | * url 1..1 40 | * response 0..0 41 | 42 | Instance: ImaginStudyUpdateExample 43 | InstanceOf: ImagingStudy 44 | Usage: #inline 45 | * id = "7e9deb91-0017-4690-aebd-951cef34aba4" 46 | * description = "CHEST XRAY" 47 | * started = "2010-02-14T01:10:00.000Z" 48 | * status = #available 49 | * subject = Reference( PatientExample ) 50 | * identifier[+] 51 | * type 52 | * coding = http://terminology.hl7.org/CodeSystem/v2-0203#ACSN 53 | * value = "3478116342" 54 | * identifier[+] 55 | * system = "urn:dicom:uid" 56 | * value = "urn:oid:2.16.124.113543.6003.1154777499.30276.83661.3632298176" 57 | 58 | Instance: ObservationUpdateExample 59 | InstanceOf: Observation 60 | Usage: #inline 61 | * id = "40afe766-3628-4ded-b5bd-925727c013b3" 62 | * partOf = Reference(ImaginStudyUpdateExample) 63 | * status = #preliminary 64 | * category = http://terminology.hl7.org/CodeSystem/observation-category#imaging "Imaging" 65 | * code = http://radlex.org#RID49690 "simple cyst" 66 | * effectiveDateTime = "2020-09-07T15:02:03.651Z" 67 | * issued = "2020-09-07T15:02:03.651Z" 68 | * subject = Reference(PatientExample) 69 | * performer = Reference(PractitionerExample) 70 | 71 | 72 | Instance: FHIRcastContentUpdateBundle-Example 73 | InstanceOf: FHIRcastContentUpdateBundle 74 | Usage: #example 75 | Description: "Example of a content update bundle" 76 | * type = #transaction 77 | * entry[put][+] 78 | * fullUrl = "urn:7e9deb91-0017-4690-aebd-951cef34aba4" 79 | * request.method = #PUT 80 | * request.url = "http://example.com/huburl/topic/fhir" 81 | * resource = ImaginStudyUpdateExample 82 | * entry[put][+] 83 | * fullUrl = "urn:40afe766-3628-4ded-b5bd-925727c013b3" 84 | * request.url = "http://example.com/huburl/topic/fhir" 85 | * request.method = #PUT 86 | * resource = ObservationUpdateExample 87 | 88 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastDiagnosticReportClose.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastDiagnosticReportClose 2 | Parent: DiagnosticReport 3 | Id: fhircast-diagnostic-report-close 4 | Title: "FHIRcast DiagnosticReport for Close Events" 5 | Description: 6 | """ 7 | Provides guidance as to which DiagnosticReport attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-close events. 8 | 9 | **FHIR R4 versus FHIR R5** 10 | In the FHIR R4 DiagnosticReport resource image study references would be placed in the `imagingStudy` attribute. In a FHIR R5 (or above) DiagnosticReport this attribute has been renamed `study` since the allowed reference types has been expanded to include references to GenomicStudy resources. This is obviously a breaking change. 11 | 12 | In FHIRcast deployments based on FHIR R5, the attribute `study` SHALL be used rather than the `imagingStudy` attribute. 13 | 14 | Additionally FHIR R5 includes a `supportingInfo` attribute. While not yet formally provided for in FHIR R5 (R6 formalizes this support), it has been recommended that the next release of FHIR allow an ImagingStudy reference be included in this attribute so that the DiagnosticReport could indicate one or more image studies were consulted during the creation of the report. As such in FHIR R5 deployments, this field should be considered labeled as must support. 15 | """ 16 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 17 | 18 | * id 1..1 19 | * id ^short = "A logical id of the resource SHALL be provided." 20 | * id ^definition = 21 | """ 22 | A logical id of the resource SHALL be provided. The provided `id` SHALL be the same DiagnosticReport id which was provided in the [FHIR resource]-open event (see also [FHIRcast DiagnosticReport for Open Events](StructureDefinition-fhircast-diagnostic-report-open.html)). 23 | """ 24 | * identifier 0..* MS 25 | * identifier ^short = "At least one identifier of the DiagnosticReport SHOULD be provided in an [FHIR resource]-close request." 26 | * identifier ^definition = 27 | """ 28 | At least one `identifier` of the DiagnosticReport SHOULD be provided in a [FHIR resource]-close request. This could be a business identifier provided in the [DiagnosticReport-open](3-6-1-DiagnosticReport-open.html) event or a business identifier provided subsequently in a [DiagnosticReport-update](3-6-3-DiagnosticReport-update.html) event. 29 | """ 30 | * basedOn 0..* MS 31 | * basedOn ^short = "At least one business identifier of the DiagnosticReport SHOULD be provided in a [FHIR resource]-open request (see detailed description)." 32 | * basedOn ^definition = 33 | """ 34 | The accession number of the order which directly or in directly triggered the report to be created SHOULD be included as a business identifier if it is known. The accession number is stored as Reference.identifier using the ServiceRequest Reference type and the “ACSN” identifier type. 35 | """ 36 | * imagingStudy ^short = "Imaging study (or studies) which are the subject of this report" 37 | * imagingStudy ^definition = 38 | """ 39 | If the report is created as part of an imaging scenario, at least one imaging study would likely be the subject of the report and included in the event's context. In this case a reference to the ImagingStudy (or references to the ImagingStudy's) in the event's context SHOULD be present in the `imagingStudy` array if known. 40 | """ 41 | * subject 1..1 42 | * subject only Reference(FHIRcastPatientClose) 43 | * subject ^short = "Reference to the patient associated with the report" 44 | * subject ^definition = 45 | "SHALL be valued with a reference to the Patient resource which is present in the [FHIR resource]-close event." 46 | 47 | Instance: FHIRcastDiagnosticReportClose-Example 48 | InstanceOf: FHIRcastDiagnosticReportClose 49 | Usage: #example 50 | Description: "Example of a DiagnosticReport which could be used in a [FHIR resource]-close event. Note that due to limitation of tools used to publishing the specification the below resource `id` is appended with '-close'. The specification requires that the resource `id` in the [FHIR resource]-close be identical to the resource `id` provided in the corresponding [FHIR resource]-open; hence in the real world the '-close' suffix would not be present." 51 | * id = "2402d3bd-e988-414b-b7f2-4322e86c9327-close" 52 | * status = http://terminology.hl7.org/fhir/ValueSet/diagnostic-report-status#final 53 | * code = http://loinc.org#19005-8 "Radiology Imaging study [Impression] (narrative)" 54 | * identifier.use = http://terminology.hl7.org/fhir/ValueSet/identifier-use#official 55 | * identifier.value = "GH339884.RPT.0001" 56 | * identifier.system = "http://myhealthcare.example.com/reporting-system" 57 | * subject = Reference(FHIRcastPatientClose-Example) 58 | * conclusionCode = http://snomed.info/sct#368009 "Heart valve disorder" 59 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastDiagnosticReportOpen.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastDiagnosticReportOpen 2 | Parent: DiagnosticReport 3 | Id: fhircast-diagnostic-report-open 4 | Title: "FHIRcast Diagnostic Report for Open Events" 5 | Description: 6 | """ 7 | Provides guidance as to which DiagnosticReport attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-open events. 8 | 9 | At least one business identifier of the DiagnosticReport SHOULD be provided in a [FHIR resource]-open request. 10 | 11 | Typically the report is associated with an order from an information system. In this case the accession number of the order is provided in the DiagnosticReport's `basedOn` array attribute as a reference using a ServiceRequest reference type and the “ACSN” identifier type. The accession number SHALL be included as a business identifier if it is known. 12 | 13 | A reporting system may also include its own identifier and should use an appropriate identifier type and system when supplying such a business identifier. 14 | 15 | In radiology reports or other image related uses of FHIRcast, at least one imaging study would likely be the subject of the report and included in the event's context. In this case, the reference to one or more ImagingStudy resources would be provided. 16 | 17 | **FHIR R4 versus FHIR R5** 18 | In the FHIR R4 DiagnosticReport resource image study references would be placed in the `imagingStudy` attribute. In a FHIR R5 (or above) DiagnosticReport this attribute has been renamed `study` since the allowed reference types has been expanded to include references to GenomicStudy resources. This is obviously a breaking change. 19 | 20 | In FHIRcast deployments based on FHIR R5, the attribute `study` SHALL be used rather than the `imagingStudy` attribute. 21 | 22 | Additionally FHIR R5 includes a `supportingInfo` attribute. While not yet formally provided for in FHIR R5 (R6 formalizes this support), it has been recommended that the next release of FHIR allow an ImagingStudy reference be included in this attribute so that the DiagnosticReport could indicate one or more image studies were consulted during the creation of the report. As such in FHIR R5 deployments, this field should be considered labeled as must support. 23 | """ 24 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 25 | 26 | * id 1..1 27 | * id ^short = "A logical id of the resource SHALL be provided." 28 | * id ^definition = 29 | """ 30 | A logical id of the resource SHALL be provided. It may be the `id` associated with the resource as persisted in a FHIR server. If the resource is not stored in a FHIR server, the Subscriber requesting the context change SHOULD use a mechanism to generate the `id` such that it will be globally unique (e.g., a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)). When a [FHIR resource]-close event including this report is requested, the Subscriber requesting the context be closed SHALL use the same DiagnosticReport `id` which was provided in the [FHIR resource]-open event (see also [FHIRcast DiagnosticReport for Close Events](StructureDefinition-fhircast-diagnostic-report-close.html)). 31 | """ 32 | * identifier 0..* MS 33 | * identifier ^short = "A business identifier of the DiagnosticReport may be provided as part of the [FHIR resource]-open request (see detailed description)." 34 | * identifier ^definition = 35 | """ 36 | The Study Instance UID SHALL be included as a business identifier if it is known. In FHIR, the Study Instance UID of an ImagingStudy is stored in the `identifier` array using the Identifier system of `urn:dicom:uid` and prefix the UID value with `urn:oid:`. 37 | """ 38 | * status 1..1 39 | * status ^short = "Status of the DiagnosticReport, note this may not be known and hence have a value of `unknown`; however, is included since it is required by FHIR" 40 | * status ^definition = 41 | """ 42 | While initially the `status` of the report may begin as `unknown` or `preliminary` (or something else), throughout the lifecycle of the context the report's status may transition. For example, a reporting application may enable a clinician to sign the report. In such a situation this change in status could become final and would be communicated through a [`DiagnosticReport-update`](3-6-3-DiagnosticReport-update.html) 43 | event prior to the DiagnosticReport context being closed by a DiagnosticReport-close event. 44 | """ 45 | * subject 1..1 46 | * subject only Reference(FHIRcastPatientOpen) 47 | * subject ^short = "Reference to the Patient resource associated with the DiagnosticReport" 48 | * subject ^definition = 49 | """ 50 | A reference to the FHIR Patient resource describing the patient whose report is currently in context SHALL be present. 51 | """ 52 | * basedOn 0..* MS 53 | * basedOn ^short = "At least one business identifier of the DiagnosticReport SHALL be provided in a [FHIR resource]-open request (see detailed description)." 54 | * basedOn ^definition = 55 | """ 56 | The accession number of the order which directly or in directly triggered the report to be created SHALL be included as a business identifier if it is known. The accession number is stored as Reference.identifier using the ServiceRequest Reference type and the “ACSN” identifier type. 57 | """ 58 | * imagingStudy only Reference(FHIRcastImagingStudyOpen) 59 | * imagingStudy ^short = "Imaging study (or studies) which are the subject of this report" 60 | * imagingStudy ^definition = 61 | """ 62 | If the report is created as part of an imaging scenario, at least one imaging study would likely be the subject of the report and included in the event's context. In this case a reference to the ImagingStudy (or references to the ImagingStudy's) in the event's context SHALL be present in the `imagingStudy` array if known. 63 | """ 64 | * obeys business-identifier 65 | 66 | Invariant: business-identifier 67 | Description: "identifier array or basedOn array SHALL contain at least one element" 68 | Expression: "identifier.exists() or basedOn.exists()" 69 | Severity: #error 70 | XPath: "f:identifier or f:basedOn" 71 | 72 | Instance: FHIRcastDiagnosticReportOpen-Example 73 | InstanceOf: FHIRcastDiagnosticReportOpen 74 | Usage: #example 75 | Description: "Example of a DiagnosticReport which could be used in a [FHIR resource]-open event" 76 | * id = "2402d3bd-e988-414b-b7f2-4322e86c9327" 77 | * status = http://terminology.hl7.org/fhir/ValueSet/diagnostic-report-status#unknown 78 | * subject = Reference(FHIRcastPatientOpen-Example) 79 | * code = http://loinc.org#19005-8 "Radiology Imaging study [Impression] (narrative)" 80 | * basedOn[0].type = "ServiceRequest" 81 | * basedOn[=].identifier.type.coding = http://terminology.hl7.org/CodeSystem/v2-0203#ACSN 82 | * basedOn[=].identifier.system = "urn:oid:2.16.840.1.113883.19.5" 83 | * basedOn[=].identifier.value = "GH339884" 84 | * basedOn[=].identifier.assigner.reference = "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc" 85 | * basedOn[=].identifier.assigner.display = "My Healthcare Provider" 86 | * imagingStudy = Reference(FHIRcastImagingStudyOpen-Example) 87 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastEncounterClose.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastEncounterClose 2 | Parent: Encounter 3 | Id: fhircast-encounter-close 4 | Title: "FHIRcast Encounter for Close Events" 5 | Description: "Provides guidance as to which Encounter attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-close events." 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * id 1..1 8 | * id ^short = "A logical id of the resource SHALL be provided." 9 | * id ^definition = 10 | """ 11 | A logical id of the resource SHALL be provided. The provided `id` SHALL be the same Encounter id which was provided in the corresponding [FHIR resource]-open event (see also [FHIRcast Encounter for Open Events](StructureDefinition-fhircast-encounter-open.html)). 12 | """ 13 | * identifier 0..* MS 14 | * identifier ^short = "At least one identifier of the Encounter SHOULD be provided in a [FHIR resource]-close request." 15 | * identifier ^definition = 16 | "At least one `identifier` of the Encounter SHOULD be provided in a [FHIR resource]-close request. Providing one or more of the `identifier` values for the Encounter which was provided in the corresponding [FHIR resource]-open event enables Subscribers to perform identity verification according to their requirements." 17 | * status ^short = "Status of the encounter. Note that the `status` attribute is required by the FHIR specification but may not be of significant interest when used in FHIRcast" 18 | * status ^definition = 19 | """ 20 | Status of the encounter. Note that the `status` attribute is required by the FHIR specification; however, the actual status of an encounter may not be known nor of significant interest when closing an encounter context. Hence, the `status` attribute may frequently have a value of `unknown`. 21 | """ 22 | * class ^short = "Classification of the encounter. Note that the `class` attribute is required by the FHIR specification but may not be of significant interest when used in FHIRcast" 23 | * class ^definition = 24 | """ 25 | Class of the encounter. Note that the `class` attribute is required by the FHIR specification; however, an encounter's class is generally not of significant interest when closing a context, hence the value of the `class` attribute should usually be ignored. Starting with FHIR R5, the `class` attribute is optional and will be removed from this profile in a FHIRcast specification based on FHIR R5 or above. 26 | """ 27 | * subject 1..1 28 | * subject only Reference(FHIRcastPatientClose) 29 | * subject ^short = "Reference to the patient associated with the encounter" 30 | * subject ^definition = 31 | "SHALL be valued with a reference to the Patient resource which is present in the [FHIR resource]-close event." 32 | 33 | Instance: FHIRcastEncounterClose-Example 34 | InstanceOf: FHIRcastEncounterClose 35 | Usage: #example 36 | Description: "Example of an encounter which could be used in a [FHIR resource]-close event. Note that due to limitation of tools used to publishing the specification the below resource `id` is appended with '-close'. The specification requires that the resource `id` in the -close be identical to the resource `id` provided in the corresponding -open; hence in the real world the '-close' suffix would not be present." 37 | * id = "8cc652ba-770e-4ae1-b688-6e8e7c737438-close" 38 | * status = http://terminology.hl7.org/fhir/ValueSet/encounter-status#unknown 39 | * class = http://terminology.hl7.org/CodeSystem/v3-ActCode#AMB 40 | * identifier.use = http://terminology.hl7.org/fhir/ValueSet/identifier-use#official 41 | * identifier.value = "r2r22345" 42 | * identifier.system = "http://myhealthcare.example.com/visits" 43 | * subject = Reference(FHIRcastPatientClose-Example) 44 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastEncounterOpen.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastEncounterOpen 2 | Parent: Encounter 3 | Id: fhircast-encounter-open 4 | Title: "FHIRcast Encounter for Open Events" 5 | Description: "Provides guidance as to which Encounter attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-open events." 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * id 1..1 8 | * id ^short = "A logical id of the resource SHALL be provided." 9 | * id ^definition = 10 | """ 11 | A logical id of the resource SHALL be provided. It may be the `id` associated with the resource as persisted in a FHIR server. If the resource is not stored in a FHIR server, the Subscriber requesting the context change SHOULD use a mechanism to generate the `id` such that it will be globally unique (e.g., a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)). When a [FHIR resource]-close event including this encounter is requested, the Subscriber requesting the context be closed SHALL use the same Encounter `id` which was provided in the [FHIR resource]-open event (see also [FHIRcast Encounter for Close Events](StructureDefinition-fhircast-encounter-close.html)). 12 | """ 13 | * identifier 1..* 14 | * identifier ^short = "At least one identifier of the Encounter SHALL be provided in a [FHIR resource]-open request." 15 | * identifier ^definition = 16 | """ 17 | At least one `identifier` of the Encounter SHALL be provided in a [FHIR resource]-open request. The Subscriber making the open request should not assume that all Subscribers will be able to resolve the resource id or access a FHIR server where the resource may be stored; hence, the provided `identifier` (or identifiers) should be a value by which all Subscribers will likely be able to identify the Encounter. 18 | """ 19 | * status ^short = "Status of the encounter. Note that the `status` attribute is required by the FHIR specification but may not be of significant interest when used in FHIRcast" 20 | * status ^definition = 21 | """ 22 | Status of the encounter. Note that the `status` attribute is required by the FHIR specification; however, the actual status of an encounter may not be known nor of signficant interest when establishing a context. Hence, the `status` attribute may frequently have a value of `unknown`. 23 | """ 24 | * class ^short = "Classification of the encounter. Note that the `class` attribute is required by the FHIR specification but may not be of significant interest when used in FHIRcast" 25 | * class ^definition = 26 | """ 27 | Class of the encounter. Note that the `class` attribute is required by the FHIR specification; however, the class of an encounter may not be known by all Subscribers in a FHIRcast topic. Since an encounter's class is generally not of significant interest when used in FHIRcast, the value of the `class` attribute should usually be ignored. Starting with FHIR R5, the `class` attribute is optional and will be removed from this profile in a FHIRcast specification based on FHIR R5 or above. 28 | """ 29 | * subject 1..1 30 | * subject only Reference(FHIRcastPatientOpen) 31 | * subject ^short = "Reference to the patient associated with the encounter" 32 | * subject ^definition = 33 | """ 34 | SHALL be valued with a reference to the Patient resource which is present in the [FHIR resource]-open event. 35 | """ 36 | 37 | Instance: FHIRcastEncounterOpen-Example 38 | InstanceOf: FHIRcastEncounterOpen 39 | Usage: #example 40 | Description: "Example of an encounter which could be used in a [FHIR resource]-open event" 41 | * id = "8cc652ba-770e-4ae1-b688-6e8e7c737438" 42 | * status = http://terminology.hl7.org/fhir/ValueSet/encounter-status#unknown 43 | * class = http://terminology.hl7.org/CodeSystem/v3-ActCode#AMB 44 | * identifier.use = http://terminology.hl7.org/fhir/ValueSet/identifier-use#official 45 | * identifier.value = "r2r22345" 46 | * identifier.system = "http://myhealthcare.example.com/visits" 47 | * subject = Reference(FHIRcastPatientOpen-Example) -------------------------------------------------------------------------------- /input/fsh/FHIRcastImagingStudyClose.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastImagingStudyClose 2 | Parent: ImagingStudy 3 | Id: fhircast-imaging-study-close 4 | Title: "FHIRcast ImagingStudy for Close Events" 5 | Description: 6 | """ 7 | Provides guidance as to which ImagingStudy attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-close events. 8 | 9 | It is recommended that the image study business identifiers provided in the corresponding [FHIR resource]-open event are provided in the [FHIR resource]-close event. Providing these business identifiers enables Subscribers to perform identity verification according to their requirements. See [FHIRcast ImagingStudy for Open Events](StructureDefinition-fhircast-imaging-study-open.html) for details on the business identifiers of an ImagingStudy. 10 | """ 11 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 12 | * id 1..1 13 | * id ^short = "A logical id of the resource SHALL be provided." 14 | * id ^definition = 15 | """ 16 | A logical id of the resource SHALL be provided. The provided `id` SHALL be the same ImagingStudy resource id which was provided in the corresponding [FHIR resource]-open event (see also [FHIRcast ImagingStudy for Open Events](StructureDefinition-fhircast-imaging-study-open.html)). 17 | """ 18 | 19 | * identifier 0..* MS 20 | * identifier ^short = "At least one business identifier of the ImagingStudy SHOULD be provided in a [FHIR resource]-close request (see detailed description)." 21 | * identifier ^definition = 22 | """ 23 | The Study Instance UID SHOULD be included as a business identifier if it is known. If a Study Instance UID was provided in the corresponding [FHIR resource]-open event, then the same Study Instance UID SHOULD be provided in the [FHIR resource]-close event. 24 | 25 | The accession number of the order which triggered the image procedure to be performed SHOULD be included as a business identifier if it is known. If an accession number was provided in the corresponding [FHIR resource]-open event, then the same accession number SHOULD be provided in the [FHIR resource]-close event. 26 | """ 27 | 28 | // The indentifier sequence below should be used and with 0..* when FHIRcast transitions to FHIR R5 or above since it would be valid to provide only the accession number in the basedOn sequence 29 | // * identifier 0..* MS 30 | // * identifier ^short = "At least one business identifier of the ImagingStudy SHOULD be provided in a [FHIR resource]-close request (see detailed description)." 31 | // * identifier ^definition = 32 | // """ 33 | // The Study Instance UID SHOULD be included as a business identifier if it is known. If a Study Instance UID was provided in the corresponding [FHIR resource]-open event, then the same Study Instance UID SHOULD be provided in the [FHIR resource]-close event. 34 | // """ 35 | 36 | * status 1..1 37 | * status ^short = "Status of the ImagingStudy, note this may be not be known and hence have a value of `unknown`; however, `status` is included since it is required by the FHIRcast" 38 | * subject 1..1 39 | * subject only Reference(FHIRcastPatientClose or Device or Group) 40 | * subject ^short = "Reference to the Patient resource associated with the ImagingStudy (see detailed description if the image study's subject is not a patient)" 41 | * subject ^definition = 42 | """ 43 | A reference to the FHIR Patient resource describing the patient associated with the imaging study being closed. Note there are rare cases in which the ImagingStudy subject references a resource 44 | which is not a patient. Regardless, the subject reference present in the corresponding [FHIR resource]-open event SHALL be provided in the [FHIR resource]-close event. 45 | """ 46 | 47 | // The basedOn sequence below should be used when FHIRcast transitions to FHIR R5 or above 48 | // * basedOn 0..1 MS 49 | // * basedOn ^short = "At least one business identifier of the ImagingStudy SHOULD be provided in a [FHIR resource]-close request (see detailed description)." 50 | // * basedOn ^definition = 51 | // """ 52 | // The accession number of the order which triggered the image procedure to be performed SHOULD be included as a business identifier if it is known. If an accession number was provided in the corresponding [FHIR resource]-open event, then the same accession number SHOULD be provided in the [FHIR resource]-close event. 53 | // """ 54 | 55 | Instance: FHIRcastImagingStudyClose-Example 56 | InstanceOf: FHIRcastImagingStudyClose 57 | Usage: #example 58 | Description: "Example of an imaging study which could be used in a [FHIR resource]-close event. Note that due to limitation of tools used to publishing the specification, the below resource `id` is appended with '-close'. The specification requires that the resource `id` in the [FHIR resource]-close be identical to the resource `id` provided in the corresponding [FHIR resource -open; hence in the real world the '-close' suffix would not be present." 59 | * id = "e25c1d31-20a2-41f8-8d85-fe2fdeac74fd-close" 60 | * status = http://terminology.hl7.org/fhir/ValueSet/imagingstudy-status#unknown 61 | * identifier[0].system = "urn:dicom:uid" 62 | * identifier[=].value = "urn:oid:1.2.840.83474.8.231.875.3.15.661594731" 63 | 64 | // This identifier slice shows the FHIR R4 approach and should be removed when the FHIRcast specification transitions to R5 or above 65 | * identifier[+].type.coding = http://terminology.hl7.org/CodeSystem/v2-0203#ACSN 66 | * identifier[=].system = "urn:oid:2.16.840.1.113883.19.5" 67 | * identifier[=].value = "GH339884" 68 | * identifier[=].assigner.reference = "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc" 69 | * identifier[=].assigner.display = "My Healthcare Provider" 70 | 71 | * subject = Reference(FHIRcastPatientClose-Example) 72 | 73 | // FHIR R5 Example should use the below for providing an accession number value 74 | // * basedOn[0].type = "ServiceRequest" 75 | // * basedOn[=].identifier.type.coding.system = http://terminology.hl7.org/CodeSystem/v2-0203#ACSN 76 | // * basedOn[=].identifier.system = "urn:oid:2.16.840.1.113883.19.5" 77 | // * basedOn[=].identifier.value = "GH339884" 78 | // * basedOn[=].identifier.assigner.reference = "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc" 79 | // * basedOn[=].identifier.assigner.display = "My Healthcare Provider" 80 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastObservation.fsh: -------------------------------------------------------------------------------- 1 | Alias: Loinc = http://loinc.org 2 | 3 | Profile: FHIRcastObservation 4 | Parent: Observation 5 | Id: fhircast-observation 6 | Title: "FHIRcast Observation" 7 | Description: "Defines the minimum set of attributes which an application wanting to share observation content must support" 8 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 9 | * subject 1..1 10 | * hasMember MS 11 | * derivedFrom MS 12 | 13 | Instance: FHIRcastObservation-Example 14 | InstanceOf: FHIRcastObservation 15 | Usage: #example 16 | Description: "Example of a simple observation which could be exchanged using FHIRcast" 17 | * id = "435098234" 18 | * derivedFrom.identifier.system = "urn:dicom:uid" 19 | * derivedFrom.identifier.value = "urn:oid:2.16.124.113543.6003.1154777499.30276.83661.3632298176" 20 | * status = #preliminary 21 | * code = Loinc#45651-7 "Pathological bone fracture [Minimum Data Set]" 22 | * issued = "2020-09-07T15:02:03.651Z" 23 | * valueCodeableConcept.coding = Loinc#LA33-6 "Yes" 24 | * subject = Reference( FHIRcastPatientOpen-Example ) 25 | * performer = Reference( PractitionerExample ) 26 | * effectiveDateTime = "2024-03-19" 27 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastPatientClose.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastPatientClose 2 | Parent: Patient 3 | Id: fhircast-patient-close 4 | Title: "FHIRcast Patient for Close Events" 5 | Description: "Provides guidance as to which Patient attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-close events." 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * id 1..1 8 | * id ^short = "A logical id of the resource SHALL be provided." 9 | * id ^definition = 10 | """ 11 | A logical id of the resource SHALL be provided. The provided `id` SHALL be the same Patient resource id which was provided in the corresponding [FHIR resource]-open event (see also [FHIRcast Patient for Open Events](StructureDefinition-fhircast-patient-open.html)). 12 | """ 13 | * identifier 0..* MS 14 | * identifier ^short = "At least one identifier of the Patient SHOULD be provided in a [FHIR resource]-close request." 15 | * identifier ^definition = 16 | """ 17 | At least one `identifier` of the Patient SHOULD be provided in a [FHIR resource]-close request. Providing one or more of the `indentifier` values for the Patient which was provided in the corresponding [FHIR resource]-open event enables Subscribers to perform identity verification according to their requirements. 18 | """ 19 | 20 | Instance: FHIRcastPatientClose-Example 21 | InstanceOf: FHIRcastPatientClose 22 | Usage: #example 23 | Description: "Example of a patient which could be used in a [FHIR resource]-close event. Note that due to limitation of tools used to publishing the specification, the below resource `id` is appended with '-close'. The specification requires that the resource `id` in the [FHIR resource]-close be identical to the resource `id` provided in the corresponding [FHIR resource]-open; hence in the real world the '-close' suffix would not be present." 24 | * id = "503824b8-fe8c-4227-b061-7181ba6c3926-close" 25 | * identifier[0].use = http://hl7.org/fhir/identifier-use#official 26 | * identifier[=].type = http://terminology.hl7.org/CodeSystem/v2-0203#MR 27 | * identifier[=].system = "urn:oid:2.16.840.1.113883.19.5" 28 | * identifier[=].value = "4438001" 29 | * identifier[=].assigner.reference = "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc" 30 | * identifier[=].assigner.display = "My Healthcare Provider" 31 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastPatientOpen.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastPatientOpen 2 | Parent: Patient 3 | Id: fhircast-patient-open 4 | Title: "FHIRcast Patient for Open Events" 5 | Description: "Provides guidance as to which Patient attributes should be present and considerations as to how each attribute should be valued in all [FHIR resource]-open events." 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * id 1..1 8 | * id ^short = "A logical id of the resource SHALL be provided." 9 | * id ^definition = 10 | """ 11 | A logical id of the resource SHALL be provided. It may be the `id` associated with the resource as persisted in a FHIR server. If the resource is not stored in a FHIR server, the Subscriber requesting the context change SHOULD use a mechanism to generate the `id` such that it will be globally unique (e.g., a [UUID](https://en.wikipedia.org/wiki/Universally_unique_identifier)). When a [FHIR resource]-close event including this patient is requested, the Subscriber requesting the context be closed SHALL use the same Patient `id` which was provided in the [FHIR resource]-open event (see also [FHIRcast Patient for Close Events](StructureDefinition-fhircast-patient-close.html)). Additionally, this `id` SHALL be the `id` used in the `subject` attribute's Patient reference in all resources containing a `subject` attribute in a given [FHIR resource]-open event. 12 | """ 13 | * identifier 1..* 14 | * identifier ^short = "At least one identifier of the Patient SHALL be provided in a [FHIR resource]-open request." 15 | * identifier ^definition = 16 | """ 17 | At least one `identifier` of the Patient SHALL be provided in a [FHIR resource]-open request. The Subscriber making the open request should not assume that all Subscribers will be able to resolve the resource `id` or access a FHIR server where the resource may be stored; hence, the provided `identifier` (or identifiers) should be a value by which all Subscribers will likely be able to identify the Patient (e.g., a patient's MRN or MPI identifier). 18 | """ 19 | * name 0..1 20 | * name ^short = "Name of the patient which may be used for identity verification" 21 | * name ^definition = 22 | """ 23 | The Subscriber making the open request SHOULD provide a value for the `name` attribute, if it is available, so that Subscribers may perform identity verification according to their requirements. 24 | """ 25 | * gender 0..1 26 | * gender ^short = "Gender of the patient which may be used for identity verification" 27 | * gender ^definition = 28 | """ 29 | The Subscriber making the open request SHOULD provide a value for the `gender` attribute, if it is available, so that Subscribers may perform identity verification according to their requirements. 30 | """ 31 | * birthDate 0..1 32 | * birthDate ^short = "Birth date of the patient which may be used for identity verification" 33 | * birthDate ^definition = 34 | """ 35 | The Subscriber making the open request SHOULD provide a value for the `birthDate` attribute, if it is available, so that Subscribers may perform identity verification according to their requirements 36 | """ 37 | 38 | Instance: FHIRcastPatientOpen-Example 39 | InstanceOf: FHIRcastPatientOpen 40 | Usage: #example 41 | Description: "Example of a patient which could be used in a [FHIR resource]-open event" 42 | * id = "503824b8-fe8c-4227-b061-7181ba6c3926" 43 | * identifier[0].use = http://hl7.org/fhir/identifier-use#official 44 | * identifier[=].type = http://terminology.hl7.org/CodeSystem/v2-0203#MR 45 | * identifier[=].system = "urn:oid:2.16.840.1.113883.19.5" 46 | * identifier[=].value = "4438001" 47 | * identifier[=].assigner.reference = "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc" 48 | * identifier[=].assigner.display = "My Healthcare Provider" 49 | * name.use = http://terminology.hl7.org/fhir/ValueSet/name-use#official 50 | * name.given = "John" 51 | * name.family = "Smith" 52 | * name.prefix = "Dr." 53 | * name.suffix[0] = "Jr." 54 | * name.suffix[1] = "M.D." 55 | * gender = http://terminology.hl7.org/fhir/ValueSet/administrative-gender#male 56 | * birthDate = "1978-11-03" 57 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastSyncErrorContext.fsh: -------------------------------------------------------------------------------- 1 | Profile: FhircastSyncErrorOperationOutcome 2 | Parent: OperationOutcome 3 | Id: fhircast-operation-outcome-syncerror 4 | Title: "OperationOutcome for sync-error events" 5 | Description: """ 6 | Defines the structure of OperationOutcomes to be used in sync-error events. The content of the 7 | OperationOutcomes contains information that is used to determine the cause of the sync-error. 8 | """ 9 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 10 | * issue MS 11 | * issue 1..* 12 | * issue ^slicing.rules = #open 13 | * issue ^slicing.ordered = false // can be omitted, since false is the default 14 | * issue ^slicing.description = "FHIRcast specific information" 15 | * issue ^slicing.discriminator.type = #value 16 | * issue ^slicing.discriminator.path = "code" 17 | * issue contains fhircast 1..1 MS 18 | * issue[fhircast].code = #processing 19 | * issue[fhircast].details 1..1 MS 20 | * issue[fhircast].details.coding ^slicing.discriminator.type = #value 21 | * issue[fhircast].details.coding ^slicing.discriminator.path = "system" 22 | * issue[fhircast].details.coding ^slicing.rules = #open 23 | * issue[fhircast].details.coding ^slicing.ordered = false // can be omitted, since false is the default 24 | * issue[fhircast].details.coding ^slicing.description = "Detailed information on syncerror cause." 25 | * issue[fhircast].details.coding 3..* 26 | * issue[fhircast].details.coding contains eventid 1..1 and eventname 1..1 and subscribername 1..1 27 | * issue[fhircast].details.coding[eventid].system = "https://fhircast.hl7.org/events/syncerror/eventid" 28 | * issue[fhircast].details.coding[eventid].code ^short = "The event id of the related event." 29 | * issue[fhircast].details.coding[eventname].system = "https://fhircast.hl7.org/events/syncerror/eventname" 30 | * issue[fhircast].details.coding[eventname].code ^short = "The event eventname of the related event." 31 | * issue[fhircast].details.coding[subscribername].system = "https://fhircast.hl7.org/events/syncerror/subscribername" 32 | * issue[fhircast].details.coding[subscribername].code ^short = "The subscribername of the subscriber causing the event." 33 | * issue[fhircast].diagnostics 1..1 MS 34 | * issue[fhircast].diagnostics ^short = "This field SHALL contain a human readable description of the source and reason for the error." 35 | 36 | Profile: FhircastHubSyncErrorOperationOutcome 37 | Parent: FhircastSyncErrorOperationOutcome 38 | Id: fhircast-hub-operation-outcome-syncerrror 39 | Title: "OperationOutcome for Hub generated sync-error events" 40 | Description: """ 41 | Defines the structure of an OperationOutcome to be used in sync-error events created by the Hub. 42 | """ 43 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 44 | * issue[fhircast].severity = #warning 45 | 46 | Profile: FhircastSubscriberSyncErrorOperationOutcome 47 | Parent: FhircastSyncErrorOperationOutcome 48 | Id: fhircast-subscriber-operation-outcome-syncerrror 49 | Title: "OperationOutcome for Subscriber generated sync-error events" 50 | Description: """ 51 | Defines the structure of an OperationOutcome to be used in sync-error events send by a Suscriber indicting refusal 52 | to follow context. 53 | """ 54 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 55 | * issue[fhircast].severity = #warning 56 | 57 | Instance: FhircastHubSyncErrorOperationOutcome-Example 58 | InstanceOf: FhircastHubSyncErrorOperationOutcome 59 | Usage: #example 60 | Description: "Example OperationOutcome as present in sync-error events" 61 | * issue[fhircast] 62 | * severity = #warning 63 | * code = #processing 64 | * diagnostics = "Subscriber Acme Product could not be reached." 65 | * details 66 | * coding[+] 67 | * system = "https://fhircast.hl7.org/events/syncerror/eventid" 68 | * code = #fdb2f928-5546-4f52-87a0-0648e9ded065 69 | * coding[+] 70 | * system = "https://fhircast.hl7.org/events/syncerror/eventname" 71 | * code = #Patient-open 72 | * coding[+] 73 | * system = "https://fhircast.hl7.org/events/syncerror/subscribername" 74 | * code = #"Acme Product" 75 | * coding[+] = http://example.com/events/syncerror/your-error-code-system#"FHIRcast sync error" 76 | 77 | 78 | Instance: FhircastSubscriberSyncErrorOperationOutcome-Example 79 | InstanceOf: FhircastSubscriberSyncErrorOperationOutcome 80 | Usage: #example 81 | Description: "Example OperationOutcome as present in sync-error events" 82 | * issue[fhircast] 83 | * severity = #warning 84 | * code = #processing 85 | * diagnostics = "Acme Product refused to follow context" 86 | * details 87 | * coding[+] 88 | * system = "https://fhircast.hl7.org/events/syncerror/eventid" 89 | * code = #fdb2f928-5546-4f52-87a0-0648e9ded065 90 | * coding[+] 91 | * system = "https://fhircast.hl7.org/events/syncerror/eventname" 92 | * code = #Patient-open 93 | * coding[+] 94 | * system = "https://fhircast.hl7.org/events/syncerror/subscribername" 95 | * code = #"Acme Product" 96 | * coding[+] = http://example.com/events/syncerror/your-error-code-system#"FHIRcast sync error" 97 | 98 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastUserHibernateContext.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastHibernateContext 2 | Parent: Parameters 3 | Id: fhircast-hibernate 4 | Title: "FHIRcast context for userHibernate events." 5 | Description: "Contains the rationale behind the userHibernate event" 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * ^experimental = false 8 | * parameter 1..* MS 9 | * parameter ^slicing.discriminator.type = #value 10 | * parameter ^slicing.discriminator.path = "name" 11 | * parameter ^slicing.rules = #open 12 | * parameter ^slicing.ordered = false // can be omitted, since false is the default 13 | * parameter ^slicing.description = "Reason for hibernation." 14 | * parameter contains code 1..1 MS and hub 0..1 15 | * parameter[code] 16 | * name = "code" 17 | * ^short = "Coded reason." 18 | * ^definition = "The reason the Subscriber sends a userHibernate event." 19 | * value[x] 1..1 20 | * value[x] only Coding 21 | * valueCoding from FHIRcastHibernateReason (extensible) 22 | * value[x] ^short = "Coded reason." 23 | * resource 0..0 24 | * part 0..0 25 | * parameter[hub] 26 | * ^short = "Whether the system hosting the Hub will hibernate." 27 | * ^definition = "If `true`, the hub will hibernate and FHIRcast synchronization is suspended." 28 | * name = "hub" 29 | * value[x] 1..1 30 | * value[x] only boolean 31 | * ^short = "`true` when system hosting hub will hibernate." 32 | * resource 0..0 33 | * part 0..0 34 | 35 | ValueSet: FHIRcastHibernateReason 36 | Title: "Reasons for sending a userHibernate event." 37 | Description: "This ValueSet lists possible reasons a hibernate event is send to other Subscribers." 38 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 39 | * ^experimental = false 40 | * FHIRcastCodeSystem#user-initiated "User initiated hibernate." 41 | * FHIRcastCodeSystem#system-timeout "System initiated logout due to a timeout." 42 | * FHIRcastCodeSystem#system-initiated "System initiated logout for reason other than timeout." 43 | 44 | Instance: FHIRcastHibernateContext-Example 45 | InstanceOf: FHIRcastHibernateContext 46 | Description: "Example of FHIRcast hibernate event context." 47 | Usage: #example 48 | * parameter[code] 49 | * name = "code" 50 | * valueCoding = FHIRcastCodeSystem#user-initiated 51 | -------------------------------------------------------------------------------- /input/fsh/FHIRcastUserLogoutContext.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastLogoutContext 2 | Parent: Parameters 3 | Id: fhircast-logout 4 | Title: "FHIRcast context for logout events." 5 | Description: "Contains the rationale behind the userLogout event" 6 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 7 | * ^experimental = false 8 | * parameter 1..* MS 9 | * parameter ^slicing.discriminator.type = #value 10 | * parameter ^slicing.discriminator.path = "name" 11 | * parameter ^slicing.rules = #open 12 | * parameter ^slicing.ordered = false // can be omitted, since false is the default 13 | * parameter ^slicing.description = "Reason for logout." 14 | * parameter contains code 1..1 MS 15 | * parameter[code].name = "code" 16 | * parameter[code] ^short = "Coded reason." 17 | * parameter[code] ^definition = "The reason the Subscriber logout as code." 18 | * parameter[code].value[x] 1..1 19 | * parameter[code].value[x] only Coding 20 | * parameter[code].valueCoding from FHIRcastLogoutReason (extensible) 21 | * parameter[code].value[x] ^short = "Coded reason." 22 | * parameter[code].resource 0..0 23 | * parameter[code].part 0..0 24 | 25 | ValueSet: FHIRcastLogoutReason 26 | Title: "Reasons for sending a logout event." 27 | Description: "This ValueSet lists possible reasons a user logs out and send a logout event to other Subscribers." 28 | * insert SetWorkgroupFmmAndStatusRule( #inm, 4, #active) 29 | * ^experimental = false 30 | * FHIRcastCodeSystem#user-initiated "User initiated logout." 31 | * FHIRcastCodeSystem#system-timeout "System initiated logout due to a timeout." 32 | * FHIRcastCodeSystem#system-initiated "System initiated logout for reason other than timeout." 33 | 34 | Instance: FHIRcastLogoutContext-Example 35 | InstanceOf: FHIRcastLogoutContext 36 | Description: "Example FHIRcast logout event context." 37 | Usage: #example 38 | * parameter[code] 39 | * name = "code" 40 | * valueCoding = FHIRcastCodeSystem#user-initiated 41 | -------------------------------------------------------------------------------- /input/fsh/GetCurrentContextBundle.fsh: -------------------------------------------------------------------------------- 1 | Profile: FHIRcastGetCurrentContentBundle 2 | Parent: Bundle 3 | Id: fhircast-get-current-content-bundle 4 | Title: "FHIRcast Get Current Content Bundle" 5 | Description: """ 6 | Defines the structure of a Bundle that carries current content state 7 | resulting from various FHIRcast `-update` messages. 8 | """ 9 | * insert SetWorkgroupFmmAndStatusRule( #inm, 3, #active) 10 | * type MS 11 | * type = #collection 12 | * link 0..0 13 | * entry MS 14 | * entry 0..* 15 | * link 0..0 16 | * fullUrl MS 17 | * fullUrl 0..1 18 | * resource MS 19 | * resource 0..1 20 | * search 0..0 21 | * request 0..0 22 | * response 0..0 23 | 24 | Instance: FHIRcastGetCurrentContentBundleExampleObservation 25 | InstanceOf: Observation 26 | Usage: #inline 27 | * id = "435098234" 28 | * partOf = Reference( ImagingStudyExample ) 29 | * status = #preliminary 30 | * subject = Reference( PatientExample ) 31 | * performer = Reference( PractitionerExample ) 32 | * effectiveDateTime = "2020-09-07T15:02:03.651Z" 33 | * category = http://terminology.hl7.org/CodeSystem/observation-category#imaging "Imaging" 34 | * code = http://radlex.org#RID49690 "simple cyst" 35 | * issued = "2020-09-07T15:02:03.651Z" 36 | 37 | Instance: FHIRcastGetCurrentContentBundle-Example 38 | InstanceOf: FHIRcastGetCurrentContentBundle 39 | Usage: #example 40 | Description: "Example response to the get current context." 41 | * id = "8i7tbu6fby5fuuey7133eh" 42 | * type = #collection 43 | * entry[+] 44 | * fullUrl = "urn:Observation/435098234" 45 | * resource = FHIRcastGetCurrentContentBundleExampleObservation 46 | 47 | -------------------------------------------------------------------------------- /input/fsh/ReferredToResources.fsh: -------------------------------------------------------------------------------- 1 | Instance: OrganizationExample 2 | InstanceOf: Organization 3 | Usage: #example 4 | Description: "Placeholder resource representing an Organization." 5 | * id = "a92ac1be-fb34-49c1-be58-10928bd271cc" 6 | * name = "Example Organization" 7 | 8 | Instance: PractitionerExample 9 | InstanceOf: Practitioner 10 | Usage: #example 11 | Description: "Placeholder resource representing a Practitioner" 12 | * id = "d2bb499c-3021-4c20-a97b-e62469e9e5f5" 13 | 14 | Instance: PatientExample 15 | InstanceOf: Patient 16 | Usage: #example 17 | Description: "Placeholder resource representing a Patient" 18 | * id = "19762ea6-4920-47a2-bf52-4027cb7adf92" 19 | 20 | Instance: ImagingStudyExample 21 | InstanceOf: ImagingStudy 22 | Usage: #example 23 | Description: "Placeholder resource representing an ImagingStudy" 24 | * id = "8i7tbu6fby5ftfbku6fniuf" 25 | * status = #available 26 | * subject = Reference( PatientExample ) -------------------------------------------------------------------------------- /input/fsh/rulesets.fsh: -------------------------------------------------------------------------------- 1 | RuleSet: SetWorkgroupFmmAndStatusRule ( wg, fmm, status ) 2 | * ^extension[http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm].valueInteger = {fmm} 3 | * ^extension[http://hl7.org/fhir/StructureDefinition/structuredefinition-wg][+].valueCode = {wg} 4 | * ^status = {status} -------------------------------------------------------------------------------- /input/ignoreWarnings.txt: -------------------------------------------------------------------------------- 1 | == Suppressed Messages == 2 | 3 | # We believe that this error is caused by infrastructure: https://jira.hl7.org/browse/FHIR-36685 4 | value should not start or finish with whitespace ' not(f:kind/@value='instance') or (not(exists(f:implementation)) and exists(f:software))' 5 | 6 | # CodeSystem used as an example so need not to be valid 7 | A definition for CodeSystem 'http://example.com/events/syncerror/your-error-code-system' could not be found, so the code cannot be validated 8 | 9 | # FHIRcast has chosen to use the system to indicate the event name - no CodeSystem is defined or required. 10 | %https://fhircast.hl7.org/events/syncerror/% 11 | 12 | # Examples ares provided by other profiles that are based on this one. 13 | The Implementation Guide contains no examples for this profile 14 | 15 | # informational message is incorrect. Believe that we are using the right canonical url for radlex. Tx.fhir.org just thinks it’s draft content 16 | Reference to draft CodeSystem http://radlex.org% 17 | 18 | # TSMG has voted for this CodeSystem to remain in this IG, see minutes: https://confluence.hl7.org/display/TSMG/2024-04-11+TSMG+Agenda+and+Minutes 19 | Most code systems defined in HL7 IGs will need to move to THO later during the process.% 20 | 21 | # Requests indication of the ValueSet version should have been done in the source FHIR version - this IG does not touch the field in a meaningful manner. 22 | % url 'http://terminology.hl7.org/ValueSet/v3-ActPriority'. It might be a good idea to fix to the correct version to reduce the likelihood of a wrong version being selected by an implementation/implementer.% 23 | % url 'http://terminology.hl7.org/ValueSet/v3-ActEncounterCode'. It might be a good idea to fix to the correct version to reduce the likelihood of a wrong version being selected by an implementation/implementer.% 24 | %There are multiple different potential matches for the url 'http://terminology.hl7.org/ValueSet/v3-ActEncounterCode'.% 25 | %There are multiple different potential matches for the url 'http://terminology.hl7.org/ValueSet/v3-ActPriority'.% 26 | 27 | # Ignore a warning that is caused by an error in the underlying FHIR specification 28 | %The definition for the element 'ImagingStudy.series.performer.function' binds to the value set 'http://hl7.org/fhir/ValueSet/series-performer-function' which is experimental, but this structure is not labeled as experimental% 29 | 30 | # The CapabilityStatement is an example and does not need an OID 31 | %The resource CapabilityStatement/fhircast-capabilitystatement-example could usefully have an OID assigned% 32 | 33 | # Not relevant as the non-matching slice has been put there on purpose in order to illustrate including additional information. 34 | This element does not match any known slice defined in the profile http://hl7.org/fhir/uv/fhircast/StructureDefinition/fhircast-subscriber-operation-outcome-syncerrror|3.0.0-ballot (this may not be a problem, but you should check that it's not intended to match a slice) 35 | %This element does not match any known slice defined in the profile http://hl7.org/fhir/uv/fhircast/StructureDefinition/fhircast-hub-operation-outcome-syncerrror% 36 | 37 | # The extension appears on the resource definition of CapabilityStatement in the R4 distribution and cannot be changed or effects this implementation guide. 38 | The extension http://hl7.org/fhir/StructureDefinition/elementdefinition-maxValueSet|5.2.0 is deprecated 39 | 40 | # urn:oid:2.16.840.1.113883.19.5 ought not resolve. This HL7 OID was specifically created for examples -- https://www.hl7.org/Oid/index.cfm?Comp_OID=2.16.840.1.113883.2.20.5.3 41 | %URL value 'urn:oid:2.16.840.1.113883.19.5' does not resolve% 42 | 43 | # IG Publisher bug. Not an error. The following urls actually do resolve. 44 | %Canonical URL 'http://www.rsna.org/RadLex_Playbook.aspx' does not resolve% 45 | %Canonical URL 'http://dicom.nema.org/medical/dicom/current/output/chtml/part04/sect_B.5.html#table_B.5-1' does not resolve% 46 | 47 | # Not an error, this is intentional. (invariants on the multiple slices are equivalent to MS at the element level, other slice is MS). 48 | %The slice 'code' on path 'Parameters.parameter' is not marked as 'must-support' which is not consistent with the element that defines the slicing, where 'must-support' is true% 49 | %The slice 'hub' on path 'Parameters.parameter' is not marked as 'must-support' which is not consistent with the element that defines the slicing, where 'must-support' is true% 50 | 51 | # This is a problem in the extension definition, see: https://chat.fhir.org/#narrow/channel/179252-IG-creation/topic/How.20to.20give.20IG.20pages.20an.20FMM.3F/with/519648126 52 | %The extension http://hl7.org/fhir/StructureDefinition/structuredefinition-fmm is not allowed to be used at this point (allowed = e:DomainResource, e:Resource; this element is [ImplementationGuide.definition.page, ImplementationGuide.definition.page.page, ImplementationGuide.definition.page.page.page])% 53 | 54 | -------------------------------------------------------------------------------- /input/images-source/ContentExchangeAdvancedQuantification.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | skinparam shadowing false 3 | skinparam lifelineStrategy nosolid 4 | hide footbox 5 | 6 | actor Clinician 7 | participant "EHR App\n(Subscriber)" as EHR 8 | participant "Reporting\nApplication\n(Subscriber)" as RepApp 9 | participant Hub 10 | participant "Image Reading\nApplication\n(Subscriber)" as App1 11 | participant "Advanced\nQuantification\nApplication\n(Subscriber)" as App2 12 | 13 | Clinician -> App1: 1: Open Advanced Quantification Application 14 | activate App1 15 | group Add New Subscriber to Existing Content Sharing Session 16 | ||| 17 | App1 -> App2++: 2: Open with FHIRcast Topic 18 | deactivate App1 19 | App2 -> Hub: 3: Subscribe to Topic 20 | activate Hub 21 | ||| 22 | App2 -> Hub: 4: Get Current Context (includes existing content if any) 23 | deactivate Hub 24 | App2 -> App2++--: 5: Adjust to Context\n and Store versionId 25 | end 26 | deactivate App2 27 | ... 28 | Clinician -> App2: 6: Generate Finding 29 | activate App2 30 | group New Subscriber Adds Finding 31 | App2 -\ Hub++: 7: DiagnosticReport-update 32 | note right Hub: with versionId 33 | Hub -> Hub++--: 8: Update Content and Generate New versionId 34 | Hub -\ EHR: 9a DiagnosticReport-update 35 | note right EHR: with versionId and priorVersionId 36 | activate EHR 37 | EHR -> EHR++--: 10: Ignore 38 | Hub -\ App1: 9b DiagnosticReport-update 39 | deactivate EHR 40 | activate App1 41 | note left App1: with versionId and priorVersionId 42 | App1 -> App1++--: 11: Update Content\n and Store versionId 43 | Hub -\ RepApp: 9c DiagnosticReport-update 44 | deactivate App1 45 | activate RepApp 46 | note right RepApp: with versionId\nand priorVersionId 47 | RepApp -> RepApp++--: 11: Update Content\n and Store versionId 48 | Hub -\ App2: 9d DiagnosticReport-update 49 | deactivate RepApp 50 | deactivate Hub 51 | note left App2: with versionId and priorVersionId 52 | App2 -> App2++--: 13 Store versionId 53 | end 54 | 55 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeBasic.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | skinparam shadowing false 3 | skinparam lifelineStrategy nosolid 4 | hide footbox 5 | 6 | actor Clinician 7 | participant "App1\n(Subscriber)" as App1 8 | participant Hub 9 | participant "App2\n(Subscriber)" as App2 10 | 11 | Clinician -> App1: Open Report 12 | group FHIRcast: Open Report 13 | activate App1 14 | App1 -> Hub: DiagnosticReport-open 15 | activate Hub 16 | Hub -> Hub++--: Store Context and Generate versionId 17 | App1 <-- Hub: 202 Accepted 18 | ||| 19 | deactivate App1 20 | Hub -\ App1: DiagnosticReport-open 21 | note right App1: with versionId 22 | Hub -\ App2: DiagnosticReport-open 23 | note left App2: with versionId 24 | deactivate Hub 25 | end 26 | ... 27 | Clinician -> App2: Make Observation 28 | group FHIRcast: Make Observation 29 | activate App2 30 | App2 -> Hub: DiagnosticReport-update 31 | activate Hub 32 | note right Hub: with versionId and Observation 33 | Hub -> Hub++--: Update Content and Generate New versionId 34 | App2 <-- Hub: 202 Accepted 35 | deactivate App2 36 | ||| 37 | Hub -\ App1: DiagnosticReport-update 38 | note right App1: with Observation, versionId,\nand priorVersionId 39 | Hub -\ App2: DiagnosticReport-update 40 | note left App2: with Observation, versionId,\nand priorVersionId 41 | deactivate Hub 42 | end 43 | ... 44 | Clinician -> App2: Close report 45 | group FHIRcast: Close Report 46 | activate App2 47 | App2 -> Hub: DiagnosticReport-close 48 | activate Hub 49 | App2 <-- Hub: 202 Accepted 50 | deactivate App2 51 | ||| 52 | Hub -\ App1: DiagnosticReport-close 53 | Hub -\ App2: DiagnosticReport-close 54 | App2 -> App2: Persist content 55 | Hub -> Hub++--: Purge Context including Content 56 | end 57 | deactivate Hub 58 | 59 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeClosure.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | skinparam shadowing false 3 | skinparam lifelineStrategy nosolid 4 | hide footbox 5 | autonumber 6 | 7 | actor Clinician 8 | participant "EHR App\n(Subscriber)" as EHR 9 | participant "Reporting\nApplication\n(Subscriber)" as RepApp 10 | participant Hub 11 | participant "Image Reading\nApplication\n(Subscriber)" as App1 12 | participant "Advanced\nQuantification\nApplication\n(Subscriber)" as App2 13 | 14 | group Close report 15 | Clinician -> RepApp: Close report 16 | RepApp -> Hub: DiagnosticReport-close 17 | activate Hub 18 | Hub -\ RepApp: DiagnosticReport-close 19 | activate RepApp 20 | Hub -\ App1: DiagnosticReport-close 21 | activate App1 22 | App1 -> App1: close imaging study 23 | activate App1 24 | deactivate App1 25 | deactivate App1 26 | Hub -\ App2: DiagnosticReport-close 27 | activate App2 28 | App2 -> App2: close imaging study 29 | activate App2 30 | deactivate App2 31 | deactivate App2 32 | 33 | RepApp -> RepApp: persist content 34 | activate RepApp 35 | deactivate RepApp 36 | deactivate RepApp 37 | Hub -> Hub: Purge Context including content 38 | activate Hub 39 | deactivate Hub 40 | deactivate Hub 41 | end 42 | 43 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeFHIR.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | component "FHIRcast\nHub" as Hub 4 | component "FHIR\nserver" as FHIRserver 5 | component Subscriber as Subscriber1 6 | component Subscriber as Subscriber2 7 | component Subscriber as Subscriber3 8 | 9 | Subscriber1 -down-> Hub: fhircast 10 | Subscriber1 -down-> FHIRserver: FHIR 11 | Subscriber2 -down-> Hub: fhircast 12 | Subscriber2 -down-> FHIRserver: FHIR 13 | Subscriber3 -down-> Hub: fhircast 14 | Subscriber3 -down-> FHIRserver: FHIR 15 | 16 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeHybrid.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | node Hybrid { 4 | component "FHIRcast\nHub" as Hub 5 | component "FHIR\nserver" as FHIRserver 6 | } 7 | component Subscriber as Subscriber1 8 | component Subscriber as Subscriber2 9 | component Subscriber as Subscriber3 10 | 11 | Subscriber1 -down-> Hub: fhircast 12 | Subscriber1 -down-> FHIRserver: FHIR 13 | Subscriber2 -down-> Hub: fhircast 14 | Subscriber2 -down-> FHIRserver: FHIR 15 | Subscriber3 -down-> Hub: fhircast 16 | Subscriber3 -down-> FHIRserver: FHIR 17 | 18 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeOpenReport.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | skinparam shadowing false 3 | skinparam lifelineStrategy nosolid 4 | hide footbox 5 | 6 | actor Clinician 7 | participant "EHR App\n(Subscriber)" as EHR 8 | participant "Reporting\nApplication\n(Subscriber)" as RepApp 9 | participant Hub 10 | participant "Image Reading\nApplication\n(Subscriber)" as App1 11 | 12 | Clinician -> EHR: 1: Open a Patient\nSummary 13 | group FHIRcast: Open Patient 14 | activate EHR 15 | EHR -> Hub: 2: Patient-open 16 | activate Hub 17 | deactivate EHR 18 | Hub -> Hub++--: 3: Store Context and Generate\nversionId 19 | Hub -\ RepApp: 4a: Patient-open 20 | note right RepApp: with versionId 21 | activate RepApp 22 | RepApp -> RepApp++--: 5: React and store\nversionId 23 | activate App1 24 | Hub -\ App1: 4b: Patient-open 25 | note left App1: with versionId 26 | deactivate RepApp 27 | App1 -> App1++--: 6: ignore 28 | activate EHR 29 | Hub -\ EHR: 4c: Patient-open 30 | note right EHR: with versionId 31 | deactivate Hub 32 | deactivate App1 33 | EHR -> EHR++--: 7: Store versionId 34 | end 35 | deactivate EHR 36 | ... 37 | 38 | Clinician -> RepApp: 8: create report 39 | group FHIRcast: Open Report 40 | activate RepApp 41 | RepApp-> Hub: 9: DiagnosticReport-open 42 | activate Hub 43 | deactivate RepApp 44 | Hub -> Hub++--: 10: Store Context and generate\nversionId 45 | Hub -\ RepApp: 11a: DiagnosticReport-open 46 | note right RepApp: with versionId 47 | activate RepApp 48 | RepApp -> RepApp++--: 12: store versionID 49 | Hub -\ App1: 11b: DiagnosticReport-open 50 | note left App1: with versionId 51 | deactivate RepApp 52 | activate App1 53 | App1 -> App1++--: 13: react and\nstore versionID 54 | Hub -\ EHR: 11c: DiagnosticReport-open 55 | note right EHR: with versionId 56 | deactivate App1 57 | activate EHR 58 | deactivate Hub 59 | EHR -> EHR++--: 14: ignore 60 | end 61 | deactivate EHR 62 | 63 | @enduml -------------------------------------------------------------------------------- /input/images-source/ContentExchangeShareContent.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | skinparam shadowing false 3 | skinparam lifelineStrategy nosolid 4 | hide footbox 5 | 6 | actor Clinician 7 | participant "EHR App\n(Subscriber)" as EHR 8 | participant "Reporting\nApplication\n(Subscriber)" as RepApp 9 | participant Hub 10 | participant "Image Reading\nApplication\n(Subscriber)" as App1 11 | 12 | Clinician -> App1: 1: make measurement 13 | App1 -> Hub++: 2: DiagnosticReport-update 14 | note right Hub: with versionId 15 | 16 | group FHIRcast: Add Measurement 17 | ||| 18 | group Validate Update Request 19 | else versionId incorrect 20 | Hub --> App1:2: Reject DiagnosticReport-update 21 | else VersionId correct 22 | Hub -> Hub++--: 3: Update Content \nand Generate New versionId 23 | Hub -\ EHR: 4a: DiagnosticReport-update 24 | activate EHR 25 | note right EHR: with versionId and priorVersionId 26 | EHR -> EHR++--: 5: Ignore 27 | Hub -\ App1: 4b: DiagnosticReport-update 28 | deactivate EHR 29 | note left App1: with versionId and priorVersionId 30 | activate App1 31 | App1 -> App1++--: 6: Store versionId 32 | Hub -\ RepApp: 4c:DiagnosticReport-update 33 | deactivate App1 34 | note right RepApp: with versionId and priorVersionId 35 | activate RepApp 36 | group Validate Current Version 37 | else priorVersion Correct 38 | RepApp -> RepApp++--: 7: Update Content and\nStore versionId 39 | else priorVersion Incorrect 40 | RepApp -> Hub: 8a: Get Current Context 41 | deactivate Hub 42 | RepApp -> RepApp++--: 8b: Update Content and\nStore versionId 43 | end 44 | deactivate RepApp 45 | ||| 46 | end 47 | end 48 | ||| 49 | Clinician -> RepApp: 9: Select a Measurement 50 | group FHIRcast: Select Measurement 51 | RepApp -> Hub: 10: DiagnosticReport-select 52 | activate Hub 53 | Hub -\ EHR: 11a: DiagnosticReport-select 54 | activate EHR 55 | EHR -> EHR++--: 12: Ignore 56 | Hub -\ App1: 11b: DiagnosticReport-select 57 | deactivate EHR 58 | activate App1 59 | App1 -> App1++--: Adjust UI 60 | Hub -\ RepApp: 11c: DiagnosticReport-select 61 | deactivate App1 62 | activate RepApp 63 | deactivate Hub 64 | end 65 | deactivate RepApp 66 | @enduml 67 | -------------------------------------------------------------------------------- /input/images-source/DeniedSubscriptionSequence.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | skinparam NoteTextAlignment left 4 | skinparam Padding 2 5 | skinparam ParticipantPadding 40 6 | skinparam LifelineStrategy solid 7 | 8 | title WebSocket subscription denial flow diagram 9 | 10 | participant "App\n(Subscriber)" as Subscriber 11 | participant "FHIRcast\nHub" as Hub 12 | 13 | autonumber 14 | 15 | group Denial Workflows 16 | else Reject Subscribe Request 17 | Subscriber -> Hub++: POST Subscribe 18 | Subscriber <-- Hub--: 4xx (Client error) 19 | ||| 20 | 21 | else Reject Before Confirmation 22 | Subscriber -> Hub++: POST Subscribe 23 | Subscriber <-- Hub: 202 Accepted [] 24 | Subscriber -> Hub: connect to > 25 | Subscriber <-- Hub--: WSS: denial 26 | ||| 27 | 28 | else Reject After Confirmation 29 | Subscriber -> Hub++: POST Subscribe 30 | Subscriber <-- Hub: 202 Accepted [] 31 | Subscriber -> Hub: connect to > 32 | Subscriber <-- Hub: WSS: confirmation 33 | ... 34 | Subscriber <-- Hub--: WSS: denial 35 | ||| 36 | end 37 | 38 | ' note right of Subscriber 39 | ' App Subscribes to Hub. Hub 40 | ' denies Subscription. This denial 41 | ' may occur at any time once 42 | ' the App has established wss 43 | ' connection, even after initial 44 | ' confirmation. 45 | ' end note 46 | 47 | @enduml 48 | -------------------------------------------------------------------------------- /input/images-source/EBNF Event Pattern Diagram Instruction.txt: -------------------------------------------------------------------------------- 1 | Events ::= (fhir-resource | '*') ('-') ( 'open' | 'close' | 'update' | 'select' | '*' ) 2 | 3 | using https://www.bottlecaps.de/rr/ui -------------------------------------------------------------------------------- /input/images-source/ErrorSequence.drawio.old: -------------------------------------------------------------------------------- 1 | 7Vptc5s4EP41zNx9iIcXg+2PsdO0mWmbzKUzSe+bDMLoIiMqRGz3199KiHf8ktQ0nev5S9AiLWifZ1e7Swxnsd6+5yiJPrEAU8M2g63hXBm2bVnmDP5IyS6XeLaTC1acBHpSJbgn37EWmlqakQCnjYmCMSpI0hT6LI6xLxoyxDnbNKeFjDafmqAV7gjufUS70gcSiCiXTl2zkn/AZBWJcsP6zhoVk7UgjVDANjWR885wFpwxkV+ttwtMpfEKu+TrrvfcLV+M41icssCJs/n1ls/83UcziW8fvtjo/cU01/KMaKY3/O5Z6rPNz0yQkPhIEBbrDYhdYZVnzAXco5eUrGIQLZkQbG04cxwHl9LqUkaZ/wSict+mHAjOnkpLWiDpbkPvDAcNZPSm3mO2xoLvYALHFN7uuQkU0nivynnl0jtG1M40Nx3TzZdoZlpTp6kiZRn3sV5VN2xL0dgdj46oEoivsOiogovajiqRQq4fxeDmq0kf/57f3/jpVeR/urucbS6sDooPeBkx9gTCyyQxbM+wHUva/480W6Y+J0vM/+ygCkgl8jJb048kxJTEMJonmBN4QczhDtXiu0o2B88TCGRcA+ozSlGSkqVSKx/KsZ/xFJD6C6e5gyspy+IAB3rVa1kimYi3B3lS4O15DZCm2i83lVtbU41jVHNpp/DoPmo1kHwpbHYHtg4kiaSMeq47N9yrFhyMi4itWIxoHZDKsOZrDHuQYSdbe3rc2GbX1vY5bG2nN8/br9+3n2fm9xCFK0IfnAvLPW7sIqp9REtM71hKVOyrRbd22BMsAWkk1rRisfKg9XYlj8PREqXEH207bA/BZ/RZp9wyJJQuGGVcvYhzfW3Cb0B0iuOriFfjLjx2LzwDeUL3GPqQLUEQq0MIzn/ASQcuEq/kGyQJ1YdTujeOwWoZwDYREfg+Qb6UbQCXJmZL5D+tFDy3mchjnpIHiD/dwioipJXMERwXbRiR5gHFoZDoa0Qn5wlYnjdpouRaXSfqg2k8GypgjbtO5M7HMsczFywOARIho9SA6ULdcyylATb2qG+qwVeF1thxC8HVVmvLR7v6qBY3c+GWiMccbohg+bihEMaVPjnY1QZtbQFKo5Isb5bojF13NHVn1a/BKjgXR55Z+9mvy4La6dQxvedLifrj/Z6IQtIqrARwyUL5TnkBAX4pN1RLl/wIxQAOLIvl3BgXK0SEmzPLvCo4Fp0GdIY3o5hVRIYiVHmz17HInjntXLqtamDiOG+XJ4QU4sXLc4Wrmeed58QpT5PC9tZpecH4AGF+KGvrnjdQ2KTgG1j8X9rU0jnPauDWm2334HaW0qYXuBOy7TcobQ5y7GRrjyfHjd219XClzS/cw8lj9XGeHD2ftOkvIA+b6P3+cPunWaFCsHvdkeVOzcOK9hxYlaJiIgvDFA9yqM267jiZ12KnsbCNS1Nrucwzm2+Z7EzOv82enX+yZRB8E54TW9UNw170aUgFElna1qLYX62slk1+arXQSMhb1dteEudEOB5BTiWxOZqZRYn2gyR2p9aB1L4T3l+Qy7eysI6qX4DURZT9LVM1z2qVcZPTUjVnsAZbt+K6gYqKwwneqK6KkqoFlLrbNLzy5sJ8MVMZW92iWlS4sY/jPEloQ7omQUD3NYKaGUUbwHMAVXzwKj3J7QA1HqjX1g+U3QHqtl3YNgvYvGjOYiTzXvn9zVAf0igE3jqyKA5UREsTFgep2iFsMK+u8x5RdQT4RbeolIw6lPiPtvHsnqKqt403GYwB3bLqfl93tUB/jQJFjA2YQtEEScjzjkjPdJaJglHpLvYBXHNBSZ6V+ihWcYCxtKQTBzpJBFVSkfdnpAmzFDwa9PAam9Qz1gnFa1BXPDRNsC9T3ZKAKf5tCOU4JxLKGi7493RN3LlEHkPCxgfuCVdN22bLdjqdvLhle1IW2PspXZcTR0ueF2aL5yx5LLNFnFd26dxxW9G0yBffJj/sBaTbg1At4N+qM9T+0vdTO0OH3OQX6wwdJNDpnSH3uLH7Mr2X2xqG1X8O5Q5T/f+V8+5f -------------------------------------------------------------------------------- /input/images-source/EventNotificationErrorSequence.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Event notification error flow diagram 3 | 4 | participant "Driving App\n" as Controller 5 | participant "FHIRcast\nHub" as Hub 6 | participant "App1\n(Subscriber)" as Subscriber1 7 | participant "App2\n(Subscriber)" as Subscriber2 8 | 9 | Controller -> Hub: request context change 10 | 11 | note over Controller 12 | Hub is notified of 13 | a context change. 14 | end note 15 | 16 | Hub -> Controller++: Event Notification 17 | note over Controller: context change is confirmed 18 | Hub <-- Controller--: { "id": "q9v3jubddqt63n1", "status": "200"} 19 | 20 | Hub -> Subscriber1++: Event Notification 21 | note over Subscriber1 22 | Application is unable to 23 | follow context and 24 | responds with a 409 'conflict' 25 | end note 26 | Hub <-- Subscriber1--: { "id": "q9v3jubddqt63n1", "status": "409"} 27 | 28 | Hub -> Subscriber2++: Event Notification 29 | note over Subscriber2: context is changed 30 | Hub <-- Subscriber2--: { "id": "q9v3jubddqt63n1", "status": "200"} 31 | 32 | note over Hub 33 | Subscribing applications are made aware 34 | that one of the subscribed applicationsis out 35 | of sync. Clien can choose to rollback, notify 36 | user or with an implementation specific response. 37 | end note 38 | 39 | Hub -> Subscriber1: Event notification [SyncError] 40 | Hub -> Controller: Event notification [SyncError] 41 | Hub -> Subscriber2: Event notification [SyncError] 42 | @enduml 43 | -------------------------------------------------------------------------------- /input/images-source/EventNotificationSequence.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | title Event notification flow diagram 3 | 4 | participant "Driving App\n" as Controller 5 | 6 | participant "FHIRcast\nHub" as Hub 7 | participant "App1\n(Subscriber)" as Subscriber1 8 | participant "App2\n(Subscriber)" as Subscriber2 9 | 10 | Controller -> Hub: request context change 11 | 12 | note over Controller 13 | Hub is notified of 14 | a context change. 15 | end note 16 | 17 | Hub -> Controller++: Event Notification 18 | note over Controller: context change is confirmed 19 | Hub <-- Controller--: { "id": "q9v3jubddqt63n1", "status": "200"} 20 | 21 | Hub -> Subscriber1++: Event Notification 22 | note over Subscriber1: context is changed 23 | Hub <-- Subscriber1--: { "id": "q9v3jubddqt63n1", "status": "200"} 24 | 25 | Hub -> Subscriber2++: Event Notification 26 | note over Subscriber2: context is changed 27 | Hub <-- Subscriber2--: { "id": "q9v3jubddqt63n1", "status": "200"} 28 | 29 | @enduml 30 | -------------------------------------------------------------------------------- /input/images-source/FHIRcast overview for abstract.drawio: -------------------------------------------------------------------------------- 1 | 5Vpbb5tKEP41ltqHIliMDY920rSRWrWKWzU9bxjWZhXM0mWJ7fPrz165U18ScjmJqoadvQAz38x8M2RkX2x2n4ifRl9xCOMRMMPdyL4cAWCNARjxf2a4l5KpZUvBmqBQLSoFC/QvVEJTSXMUwqy2kGIcU5TWhQFOEhjQmswnBG/ry1Y4rt819dewJVgEftyW/kIhjaTUdcxS/hmidaTvbJlqZuPrxUqQRX6ItxWR/XFkXxCMqbza7C5gzJWn9SL3XfXMFg9GYEKP2WAn+fxqR7xg/8VMk2+/fgD/0wd1yr0f5+qFZ2k6ApMRsJkF7Pm7LF9mAUFLSN6r16B7rRv2Rim/zDfxF7SCMUrYaJ5CgjaQQsJmYiX+XsrmzFLUZzI+b4lxHPtphpbiWH5TAoOcZOge3sBMAkJIcZ6EMFS7Cm3yqYwSfFfYh0+3laPfFBIKdxWRUtYniNkDkj1bomcnynAKua4abksYFMaOKhCwtdBX0FsXR5fWYRfKQCcYC7SM1TJJilFCxX2d+ci5bJgDExrhNU78uGqQUrHmOYr9K66O1vbYqSl72qXstq4tbyhdOy1df86Xb8wD7PFL84DJ6/EA51RtNzygU9kdHjAZStduW9fOfKHTAVdtU/X8XRFLnbMYrRMmWmJK8YapDCbhjOdiLotxcCdE7BlvmeCDaQA9/s2VbpjOYSPAHaJ8t2XokdyrR5c7tVUM9pVBxe5Sxm9cLhejfXXU3NDrWBnOSQAPx2/qkzX8G3QUymFYoyZt4BAY+5QFiTrp6cCB2vqdu0bFva064lpQki+kdjXQVDzG+QDzWgC7TigUT8iQhFYMShThpMJGHoS4A4hasaCs6KfFx6GfRUWsLdBq1aEKJs6jQmhwk7t1kwNzatiOWf6AoxDQOhdYp50rXWAwZOlAWYHWDfyTw4zKSoFFZHEV+QnT94CgYjuuEH/2RtAybbsWtiYSRycFrpcDItc27LFX/hxl6y4MGTaoHGOfcpfHi1Xh9W8zvv1nvrgOssso+Pp95m076qRLgu5Rsh5dgNHMrMQoP03jInK9NrrYYisdAOslMI75jHSx02ovp2A6oNh+zL1Eutj5tHavh4D/gXvU2MAj+IrlvjBXGb8AVzldyf1IfORGw2BuM23pXTTgzNjPkyASvnNVcZ8FzDLhOuYlygLM1LMfkr90EooHFD+9VmFV4Fi5xAPZSZOKsohnVIio2TjwaIZrHiiWemgOU7i/ryxTTtT7+FOz8zYlxOSBjc36dLxaZXAQAtTuBkicFv3hTMb5mMFiviTsas2vKOaOlC8N9ks00FRpJ5YzjMZLn+EQmDmJhRPSqHomMXpzRIIpTw7bCFG4SH0BvS3xUyaL6EYzbn76WsSgbzmV+URFGnL3je1CVDBs2XKoJwRfeU8MV/xFVOKwpo8T/yeN1poFOuIQeMpA1K7G84yFcF0lZW3bFoXUhbQx+59ZRRu3NGL2ZozoHWlEZygjdhS+0k2JLH+ZYsqy18SrWjksqBlf8TasVbjS81mrXZ98vJcNMOlIPTz56bteumFRdr7G06Jre3rn6zChGL5pMZ4Yk2mlneCcyQsOdC0O3ObxGmHdCGt/xvqZFJF5SGAd2/lyx+d17G+rA3mUV2L0VULStiYGcI/Cx6kw5Ec7ldknbp61i5zF19nND56CeClz9fn6RqgzwJsNFAmhiUyRomp5RkLuAseYiNwkegUrBrmGSCeVgFlTlKRNkG9QGMZ9ia1ev1ajZQmdhzUCzMMcwu1ISmCwpNTx3U9RP/76NbNM/uRYT3yQ6XrGFnjprpzTbPEdS2mc6GeCg6wwp5ZbuMxYNIE0e6/vwZ5Z3kbuejtAKGiGBoLrtelJV2tiMCSAjp6QM0dce4nPdwtrF62JLSZ3q5ilBBZMBYt54BfiE5lL3ye6sX3WJzqdsRhRdSe1jKUOPONbzTPkGGfsGK7TCvyandiMnZgP//xne85J5w7MekA731SBy1Db/GhTlES6GhoWuz3kqE6MzvxTBgVa4NXdwLVeFzniwAUNtHpTw5z2kphjqVILrN4w3IgNyz/ulMvLP5G1P/4H -------------------------------------------------------------------------------- /input/images-source/FHIRcast overview for abstract.pptx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images-source/FHIRcast overview for abstract.pptx -------------------------------------------------------------------------------- /input/images-source/FHIRcastOverviewForAbstract.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title FHIRcast interactions 4 | 5 | participant "Driving\nApplication 1" as DrivingApp1 6 | participant "App\n(Subscriber)" as Subscriber 7 | participant "FHIRcast\nHub" as Hub 8 | participant "Driving\nApplication 2" as DrivingApp2 9 | 10 | DrivingApp1 -> Subscriber: App launch 11 | Subscriber -> Hub: Subscribe 12 | DrivingApp2 -> Hub: request change context 13 | Hub --> Subscriber: context notification 14 | Hub --> DrivingApp1: context notification 15 | Hub --> DrivingApp2: context notification 16 | Subscriber -> Hub: Unsubscribe 17 | @enduml -------------------------------------------------------------------------------- /input/images-source/MultiplePatientOpens.xml: -------------------------------------------------------------------------------- 1 | 2 | 7Vxdb5s6GP41uUwEGAO5PGnX7WzqNK2TjnTuKDgJGmBEnDbdr58JNgGbBDcNhQbSi+LXxMD7PH6/bDIBN9Huc+om63vso3BiaP5uAm4nhmFoQKf/MskLk+ianUtWaeDnMv0geAj+ICbUmHQb+GhTOZFgHJIgqQo9HMfIIxWZm6b4uXraEofVqybuCkmCB88NZel/gU/WudSB2kH+BQWrNb+yrrGeyOUnM8Fm7fr4uSQCnybgJsWY5EfR7gaFmfa4XvLv3R3pLW4sRTFR+cK3b9Mv3v/f/0Tfvfu7r4vP/369/TWF+ShPbrhlDzwxrJCOt3ikB6vs4H5LtT0l7mOm0STh/fRCxSnsAckL1xp91iQ73EbhXepG9HDxvA4IekhcL5M/U7ZQ2ZpEIW3pWTdT7lzL5FyjIGstgzC8wSFO92OD5RJZnkflG5Li36jU49vzR00r7ucJpQTtjmpLLzCg7EU4QiR9oafwL5gMNkbcKbSY4PlAA8BZui5RwODfdBn1VsXgB3ToAQPoFWBZzWA9BPEqRD1Cy4fI8c06tBzjEVjWZdCyrf6hZY9oqaJlOJ2j5dSgJSp+rxPuBTLFFiY9U6XvbtbIZw03DFYxPfaoSlBahYMDGO1WmdOcRdj7vU1m1IMRN4hRuplFbroK4p/Un1EtLlL6/34v+YWTDDijDiBr/6E9dFA/oJflfTGOUVu4Kc8yoy3c5hJuP1ySPT4V6h1CmKb7aGSRspBmP9loN2vqNmtXHFv2qcNW0xxv3yNM10KuBO5x3suIlwB16vBkcUOKQqrtp2qsVIcxu8IPHOyR4TepCbTAy+UGEYkUxY2dzxPOyn5McIKTxZYQHJcYAs9C/shsT9GGjlp+lAg/uY8hpyKN0xFhbb1lAgFtPpuXP6ZMKPttfHqp0vId6KSfsjtTnKD4qONehmj3T5aaUL2j2GeHt17objaBV6VSyWQYJm+zIdktIF/KYASDTu8Cb1MPnXqe/DxC3Qw6A23Gmak206BhVZwEb5YIAWssCpe90aJAR3BRui6YmFwV7GvldEkYyQLiSJYwUq6sEyO9Aw2NZqtWohgzDoUh06tky+SUxdSexTm9NFDYJG5KjMJYNPPupFVokQRzATkguhlVDuiGmAVKQx0hwcUArkvQBw+wLU7Nc+E1Tg/UNrgKKeJYfclDCMmJvHN+qI8J4uthg/oMKgKnOzPYFnSDzhFvzezvTSG+PpQk0RiTxHaSRAUGXWOWyOnTDz711GmIVcXXOI22vL0BTriMLjH8KGXFnOhDcBlmn6b4FbkMBQZdpcuQC4vDWTZ8FRGKnN2ZOaoOwzice3GfAWRnP/qMsyICABQiglPu4/IpZPOkHAs1+9lY1Oa6K9WMQfc5uEFV3Fpbyj8Vc199meYSMfdAQu4x4m4p4h5kwA1OpvrvtZKvvuamsEjfYPu7X6U3YdX76FAwHqoreGLtSIf2DFqGyfkJBRr1YMke1JmvoSR4r6sEFvFHd7EkkJf9ytbBC/EGvYN5ULYNjRt9TO0kBN3bBnEHj+lcyDaYIkn6YAzkpUmJTcPb3iHs3ynab96+I43U8gYPfvmxbtC4wcPo3NSbdUWesW7QgJupiltrZQNTrvcMqG5wge0dZrOxv5LCgZzqdUiPK6ocKDDoGksHULY8YypXH3xbWuf+HfZq9vfUv0u4Kcdlrfl3KBdMBuTfL7AukBN/AP4dKrwsMfr3dhh0lf5d/sGFD/2SH2TFzMYFhGN497ZIaNtnlojEt/xs0Y31oEgI614TGouEwh6hc8vEUpFQGqnlIiGse7NoLBJO5GKT1f16EFQo2A8+iZBwU359r7Ukgqc1YxJxbgg4bzT215FEWL1aBrimJKKZQR8riaDNw6/35acffgQRfPoL -------------------------------------------------------------------------------- /input/images-source/PatientOpenAndClose.xml: -------------------------------------------------------------------------------- 1 | 2 | 7VrbbuIwEP0aHkG5Qnhc6G1bUVVLpZX2zSQmRHXiyDG3fv2OEzvkRstSaKMuecE+dibJnDPjsduOOQ43twzFiwn1MOkYmrfpmFcdwzA0U4cfgWwlojvDDPFZ4GWYvgOmwSuWoCbRZeDhpDSRU0p4EJdBl0YRdnkJQ4zRdXnanJLyU2Pk4xowdRGpo78Djy8y1LG1HX6HA3+hnqxrciREarIEkgXy6LoAmdcdc8wo5Vkr3IwxEd5Tfsnuu9kzmr8YwxE/5IaHh+6d++fxNXx0Jzf3o9uf91fPXWllhchSfnDH6BOwN5pBwxeNaRD54A3wO5oJp8axmgLPymfJb+Rb5Tj43Fg0lyG5YSiE5mi9CDiexsgV+BoEA9iChwR6uhiW/h1qAldONUVvHhAypoSy1LY5n+O+6wKecEZfcGHEGwxnmpa/zwozjjd7HabnNICAMQ0xZ1uYom6wJHNSu11DAeudEixTYouCCsyBBJFUn58b3xEEDcnRP/BlNPBVdXzqEyVW4dhcecIxHkoW2JMdRAI/grYLLsGsTIciMNz4IrZ7IXVflnEPAo2jIMIs6YWI+UH0C8IOvDhi8DtJkWcaC+KMJoL66QUjYNQL4LFqLKIRPhdvutOzD2TOyqeenDuzxt0T4sIFAOpfSCNjaeIcMZl904CDYdnVB7JfCkBxNfGraY6bjlRCNscPIni/9uusFyh1Ghg1JJ0ME/D2qpzWmziWT3iiQcqMekmtEtJ0Pk8wr4kif7HjdWK1KcY5jUdLzmlUEIh9FPF7Ap7hBKwWPyWkKzQjSolQUWAu+/qZ9WMZw96weFl1PQ0+JqdtWZXnV5N9WeEPXykG5pev8P33+Zosof5tFV2ejR3PaqLLMWZmut6fgK5Bv310DS50HUxXC+pnp01ra0vr5zpv7aifh5f6+UP1j/Of1M/q6KgdQf6NCuj3BfQdC2i9fkYm806Xxjjau3DPCd78ECeQ4HMcebJ55RKUJIFbllEhXRiW6kuT8vHYqx1UVhI6vAVdMhe/8S0yEDgsM/gIpqVeulpPs41+aZFQ3YIY7IZsorAPZhPbqSxRdiW7ZJ6QdxUPRSuG+mbFUC1PZb56w9InKPCAU7+CwmReyHOYXtaawEHAkMqiTF2amacjlUWMPE+8L7s3E8IZNTCsMGdWmTtUA7pR3QbWTO0RwckIrh8NXjbp+zbpLdhF6E1HdJddX+PuoQ10NZ2BXfJnmSd9eKr0WbN07uxZPzJTBZpLaIL3BtmnV2htrqgGZRIt40g5VOO/ZuisBRV0d39Rz6bv/jHBvP4L -------------------------------------------------------------------------------- /input/images-source/Request Context Change Flow.xml: -------------------------------------------------------------------------------- 1 | 2 | 7Vnbbts4EP0aAdmHFrra7mPspBdgFw1qoMU+UtLIIkKRKkXFdr9+SYm6Um6crNNqFzH8QA7JITXnzPBYtrxNdvjAUZ7+xWIglmvHB8u7sVzX8V3XUl87PtaW5UIbdhzHelJn2OIfoI22tpY4hmIwUTBGBM6HxohRCpEY2BDnbD+cljAy3DVHOzAM2wgR0/oNxyLVVse2u4GPgHep3noV6IEQRfc7zkqq97NcL6k+9XCGGl96fpGimO17Ju/W8jacMVG3ssMGiIptE7Z63fsTo+25OVBxzoJliELkRH4YucvED+03GqcHREodi49lqM8qjk185LFz1Swz8idOgGAqe+scOM5AAJcjRJvvOtt6n2IB2xxFauleMkfaUpER2XNkU4IpkFzC2z4hKC9wWO1qSwuHqOQFfoAvUNScUVZWCrXTpuVCNVVhALF21YbZrvxmONJtgkIg6xa0DSNMbU9Z9UCF4Oy+ZYBylMgzvkcZJorYX4HHiCJt1ix2JIZrRPCOyk4kYage3cRFQ/UAXMChZ9I4fQAmw8aPcooe9RvO6Jxa6e6+R9CGn2mPm/5CG5FOil3ruiOGbGhunMmTJlN7RDFY0sM2Z5iKav9gbQU3I7IwLlK2YxSRPl06CO15Qngyec7HNBhA2uI3wNSE1PNfAtKVgeh1nkvDVVGGRcRxCPyP10owg0rQ0mQWleDdayE4mUr/iUIQsrvMgx8Lsf4bf7r/ajsHJuu7geoX+F5CIWrVJR+raqWISiU1xhtofK1UmIoaQUWhIOrnd70AYkOEGUlRsJJH8PMoC8R38NOSfDLs9lvb9pxR6I3IBxORb2wcCBKyDg0l6AQa+gx3iv/dAYLRpe6NU7QOgF7VF3JjR8uRI2fkqI6S4UjihI69aTo/Tx7YG9WekcCUjdrj9OpRfFiSFCCsMVdbnJ5PX1PGurYyXF1HEeQCYvMme4y0MSrS9ho5l8EnmfdmgnoNoX8N9fzFu7fDquMGq+eRz/EfdXUp+nn25D4zo59v0O/2AaqTUCZwgiMJHKOKj4KpA1UeO5lVPJ2dFyqp7hkldfV0Yr8W1SexuimyM2N1YLB6W8pyWhRJSSrUzhYIza8GmQ3w+M+B7qXK51rgtxWZ33+Wq7BQcZO8C9pEMJTXU2rzmD/ulBqbkmOtbLu4HFsYof8Ncmy+Msq8gLyV97ycN69Fw9XlpNSJnWaW90uDfK9i6lHWtK/r/r2YMlxdioC+PbnPzOhnvpfaHmkEkl5ckZBRoh66ElL6CmITL6pevAjOQPhMsHDxzDI4wcKxq8uJnxM7zYyH5ouuG6BYVrH/sfTxloFB4ItJH9nt/umqUer+TvRu/wE= -------------------------------------------------------------------------------- /input/images-source/SuccessfulWebSocketSubscriptionSequence.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Successful WebSocket subscription flow diagram 4 | 5 | participant "App\n(Subscriber)" as Subscriber 6 | participant "FHIRcast\nHub" as Hub 7 | 8 | ' group Successful Workflow 9 | ' else Reject Subscribe Request 10 | ' end 11 | 12 | autonumber 13 | 14 | Subscriber -> Hub++: POST Suscribe 15 | Subscriber <-- Hub: 202 Accepted [] 16 | Subscriber -> Hub: connect to > 17 | Subscriber <-- Hub: WSS: confirmation 18 | 19 | group Optional (Recommended) 20 | else Hub sends existing open context events 21 | Subscriber <- Hub: -open 22 | ... 23 | end 24 | 25 | Subscriber <-> Hub: Events... 26 | ... 27 | 28 | ' note right of Hub 29 | ' App Subscribes to Hub. 30 | ' Hub creates a WebSocket 31 | ' and sends confirmation to 32 | ' subscription once app connects. 33 | ' end note 34 | 35 | ' Hub --> Subscriber--: WSS: denial 36 | 37 | @enduml 38 | -------------------------------------------------------------------------------- /input/images-source/UnsubscriptionSequence.plantuml: -------------------------------------------------------------------------------- 1 | @startuml 2 | 3 | title Unsubscription flow diagram 4 | 5 | participant "App\n(Subscriber)" as Subscriber 6 | participant "FHIRcast\nHub" as Hub 7 | 8 | autonumber 9 | 10 | Subscriber <-> Hub++: Successful Subscription 11 | Subscriber <--> Hub: Events... 12 | ... 13 | 14 | Subscriber -> Hub: POST Unsubscribe 15 | Subscriber <-- Hub: 202 Accepted [] 16 | 17 | ' note right of Hub 18 | ' App unsubscribes to Hub. Hub 19 | ' removes app from subscribed apps 20 | ' and closes the WebSocket (if any). 21 | ' end note 22 | 23 | 24 | Subscriber <- Hub--: WSS: denial 25 | 26 | @enduml 27 | -------------------------------------------------------------------------------- /input/images-source/content-sharing.EAP: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images-source/content-sharing.EAP -------------------------------------------------------------------------------- /input/images/ContentEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/ContentEventName.png -------------------------------------------------------------------------------- /input/images/ContentSharingEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/ContentSharingEventName.png -------------------------------------------------------------------------------- /input/images/ContextEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/ContextEventName.png -------------------------------------------------------------------------------- /input/images/EventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/EventName.png -------------------------------------------------------------------------------- /input/images/FhircastScopes.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/FhircastScopes.png -------------------------------------------------------------------------------- /input/images/Info_Simple_bw.svg.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/Info_Simple_bw.svg.png -------------------------------------------------------------------------------- /input/images/MultiplePatientOpens.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/MultiplePatientOpens.png -------------------------------------------------------------------------------- /input/images/PatientOpenAndClose.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/PatientOpenAndClose.png -------------------------------------------------------------------------------- /input/images/SelectionEventName.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/SelectionEventName.png -------------------------------------------------------------------------------- /input/images/TransactionalUpdates.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/TransactionalUpdates.png -------------------------------------------------------------------------------- /input/images/colorful overview diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/colorful overview diagram.png -------------------------------------------------------------------------------- /input/images/hl7-logo-header-good-resolution.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/hl7-logo-header-good-resolution.png -------------------------------------------------------------------------------- /input/images/hl7-logo-header.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/HL7/fhircast-docs/97d2ab797ceff9474fadbf1db1595db2878a3cd2/input/images/hl7-logo-header.png -------------------------------------------------------------------------------- /input/images/information-svgrepo-com.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /input/images/question-mark-in-a-circle-svgrepo-com.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /input/includes/img.html: -------------------------------------------------------------------------------- 1 | 2 | 3 |
4 |
5 | {{include.img}} 6 |
{{include.caption | default: ""}}
7 |
8 |

9 |
-------------------------------------------------------------------------------- /input/includes/infonote.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 |
6 | 7 | {{include.text}}
12 |
-------------------------------------------------------------------------------- /input/includes/questionnote.html: -------------------------------------------------------------------------------- 1 |
2 | 3 | 4 | 5 | 8 | 9 | 10 | 11 |
6 | 7 | {{include.text}}
12 |
-------------------------------------------------------------------------------- /input/jira/FHIR-fhircast.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | -------------------------------------------------------------------------------- /input/pagecontent/2-1-SessionDiscovery.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | A session is an abstract concept representing a shared workspace, such as user's login session over multiple applications or a shared view of one application distributed to multiple users. FHIRcast requires a session to have a unique and opaque identifier. This identifier is exchanged as the value of the `hub.topic` parameter. Before establishing a subscription, an application must know the `hub.topic` and the `hub.url` which contains the base URL of the Hub. 4 | 5 | Systems SHOULD use SMART on FHIR to authorize, authenticate, and exchange initial shared context. If using SMART, following a [SMART on FHIR EHR launch](http://www.hl7.org/fhir/smart-app-launch#ehr-launch-sequence) or [SMART on FHIR standalone launch](http://www.hl7.org/fhir/smart-app-launch/#standalone-launch-sequence), the application SHALL request and, if authorized, SHALL be granted one or more [FHIRcast OAuth 2.0 scopes](2-2-FhircastScopes.html). Accompanying this scope grant, the authorization server SHALL supply the `hub.url` and `hub.topic` SMART launch parameters alongside the `access_token` and other parameters appropriate to establish initial shared context. Per SMART, when the `openid` scope is granted, the authorization server additionally sends the current user's identity in an `id_token`. 6 | 7 | Although FHIRcast works best with the SMART on FHIR launch and authorization process, implementation-specific launch, authentication, and authorization protocols may be possible. If not using SMART on FHIR, the mechanism enabling the application to discover the `hub.url` and `hub.topic` is not defined in FHIRcast. See [other launch scenarios](4-1-launch-scenarios.html#alternate-application-launch) for guidance. 8 | -------------------------------------------------------------------------------- /input/pagecontent/2-2-FhircastScopes.md: -------------------------------------------------------------------------------- 1 | FHIRcast defines OAuth 2.0 access scopes that correspond directly to [FHIRcast events](3_Events.html). These scopes associate read or write permissions to an event. Applications that need to receive workflow related events SHOULD ask for `read` scopes. Applications that request context changes SHOULD ask for `write` scopes. 2 | 3 | Expressed in [Extended Backus-Naur Form](https://www.iso.org/obp/ui/#iso:std:iso-iec:14977:ed-1:v1:en) (EBNF) notation, the FHIRcast syntax for OAuth 2.0 access scopes is: 4 | 5 | ```ebnf 6 | FhircastScopes ::= fhircast '/' ( FHIRcast-event-name | '*' ) '.' ( 'read' | 'write' | '*' ) 7 | ``` 8 | 9 | {% include img.html img="FhircastScopes.png" caption="Figure: Syntax for FHIRcast scopes" %} 10 | 11 | Note the [FHIRcast event format](2-3-Events.html#event-name) contains a noun-verb, for example: `Patient-open`. So, a requested scope of `fhircast/Patient-open.read` would authorize the subscribing application to receive a notification when the patient in context changed. Similarly, a scope of `fhircast/Patient-open.write` authorizes the subscribing application to [request a notification](2-5-ReceiveEventNotification.html). 12 | 13 | -------------------------------------------------------------------------------- /input/pagecontent/2-6-SendEventNotification.md: -------------------------------------------------------------------------------- 1 | The Subscriber MAY request a context change, content change, or `select` event by sending the Hub a FHIRcast event notification. 2 | 3 | ### Request Context Change 4 | 5 | The Subscriber MAY request context changes with an HTTP POST to the `hub.url`. The Hub SHALL either accept this context change by responding with any successful HTTP status or reject it by responding with any 4xx or 5xx HTTP status. Similar to event notifications, described above, the Hub MAY also respond with a 202 (Accepted) status, process the request, and then later, instead of broadcasting the context change, responds with a `SyncError` event in order to reject the request. In this specific case in which the context change is rejected by the Hub and not broadcasted, the `SyncError` would only be sent to the requesting Subscriber. The Subscriber SHALL be capable of gracefully handling a rejected context request. 6 | 7 | Once a requested context change is accepted, the Hub SHALL broadcast the context notification to all Subscribers, including the original requesting Subscriber. The requesting Subscriber can use the broadcasted notification as confirmation of their request. The Hub reusing the request's `id` is further confirmation to the requesting Subscriber that the event is a result of their request. 8 | 9 |
10 | {% include EventNotificationSequence.svg %} 11 |
Figure: Event Notification Sequence
12 |

13 |
14 | 15 | ### Request Context Change body 16 | 17 | The format of the Request Context Change request is presented below. 18 | 19 | {:.grid} 20 | Field | Optionality | Type | Description 21 | ----------- | ----------- | -------- | --- 22 | `timestamp` | Required | *string* | ISO 8601-2 timestamp in UTC describing the time at which the event occurred. 23 | `id` | Required | *string* | Event identifier, which MAY be used to recognize retried notifications. This id SHALL be uniquely generated by the Subscriber and could be a UUID. Following an accepted context change request, the Hub SHALL re-use this value in the broadcasted event notification. 24 | `event` | Required | *object* | A JSON object describing the event as defined in [Event Definition](2-3-Events.html). 25 | 26 | Hubs and Subscribers SHALL be case insensitive for event-names. 27 | 28 | A Subscriber that initiates a context change and receives a `SyncError` related to a context change event it sent, SHOULD resend this event at regular intervals until sync is reestablished or another, newer, event has been received. It is recommended to wait at least 10 seconds before resending the event. Note that such resend will use the timestamp of the original event to prevent race conditions. 29 | 30 | ### Request Context Change example 31 | 32 | #### Request 33 | 34 | ```text 35 | POST https://hub.example.com HTTP/1.1 36 | Host: hub 37 | Authorization: Bearer i8hweunweunweofiwweoijewiwe 38 | Content-Type: application/fhir+json 39 | 40 | { 41 | "timestamp": "2018-01-08T01:40:05.14", 42 | "id": "wYXStHqxFQyHFELh", 43 | "event": { 44 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 45 | "hub.event": "Patient-close", 46 | "context": [ 47 | { 48 | "key": "patient", 49 | "resource": { 50 | "resourceType": "Patient", 51 | "id": "798E4MyMcpCWHab9", 52 | "identifier": [ 53 | { 54 | "type": { 55 | "coding": [ 56 | { 57 | "system": "http://terminology.hl7.org/CodeSystem/v2-0203", 58 | "value": "MR", 59 | "display": "Medical Record Number" 60 | } 61 | "text": "MRN" 62 | ] 63 | } 64 | } 65 | ] 66 | } 67 | } 68 | ] 69 | } 70 | } 71 | ``` 72 | 73 | #### Response 74 | 75 | ```text 76 | HTTP/1.1 202 Accepted 77 | ``` 78 | -------------------------------------------------------------------------------- /input/pagecontent/2-7-Conformance.md: -------------------------------------------------------------------------------- 1 | The FHIRcast specification can be described as a set of capabilities and any specific FHIRcast Hub may implement a subset of these capabilities. A FHIRcast Hub declares support for FHIRcast and specific capabilities by exposing an extension on the FHIR CapabilityStatement resource as described below. 2 | 3 | 4 | ### Wellknown Endpoint 5 | 6 | To support various architectures, including multiple decentralized FHIRcast hubs, the Hub exposes a `.well-known` endpoint containing additional information about the capabilities of that Hub. A Hub's supported events, version, and other capabilities can be exposed as a Well-Known Uniform Resource Identifiers (URIs) ([RFC5785](https://tools.ietf.org/html/rfc5785)) JSON document. 7 | 8 | Hubs SHALL serve a JSON document at the location formed by appending `/.well-known/fhircast-configuration` to their `hub.url`. Contrary to RFC5785 Appendix B.4, the `.well-known` path component may be appended even if the `hub.url` endpoint already contains a path component. 9 | 10 | A simple JSON document is returned using the `application/json` mime type, with the following key/value pairs: 11 | 12 | {:.grid} 13 | Field | Optionality | Type | Description 14 | ------------------ | ----------- | ----- | --- 15 | `eventsSupported` | Required | array | Array of FHIRcast events supported by the Hub. 16 | `websocketSupport` | Required (**deprecated**) | boolean | SHALL have the static value: `true` - indicating support for websockets. **FYI to Implementers**: Given that websocket support is the only defined communication method in FHIRcast versions STU3 and was required in STU2, it's likely that this element will become Optional and then Deprecated in the future. 17 | `fhircastVersion` | Optional | string | Specific FHIRcast IG Version supported by Hub (for example: `2.0.0` or `3.0.0`). Hubs SHOULD indicate the version of FHIRcast supported. See [history page](https://hl7.org/fhir/uv/fhircast/history.html) for versions. 18 | `getCurrentSupport` | Optional (**deprecated**) | boolean | `true` or `false` - indicating support for the "[Get Current Context](2-9-GetCurrentContext.html)" API. **FYI to Implementers**: Note that this element is being deprecated in favor of the `capabilities` array. Expect this element to be removed in the future. In the interim, capable implementers should support both this element and the `capabilities` array. 19 | `capabilities` | Optional | array | Array of key-value pairs representing supported topics. See Capabilities table below for list of defined keys and their meanings. 20 | `fhirVersion` | Optional | string | `DSTU1`, `DSTU2`, `STU3`, `R4`, `R4B`, or `R5` - indicating the specific version of FHIR for this Hub. 21 | 22 | A field of `webhookSupport` SHALL be ignored. 23 | 24 | #### Capabilities 25 | {:.grid} 26 | Field | Optionality | Type | Description 27 | ------------------ | ----------- | ----- | --- 28 | `supportsGetCurrentContext` | Optional | Boolean | `true` or `false` - indicating support for the "[Get Current Context](2-9-GetCurrentContext.html)" API. 29 | `supportsNonCurrentContextUpdates` | Optional | Boolean | `true` or `false` - indicating support for the "[Update Events Outside of Current Context](2-10-ContentSharing.html#experimental-capability--update-events-outside-of-current-context)" 30 | 31 | #### Wellknown endpoint discovery example 32 | 33 | In this example the Hub URL is "www.hub.example.com/". 34 | 35 | ##### Wellknown endpoint discovery Request 36 | 37 | ```text 38 | GET /.well-known/fhircast-configuration HTTP/1.1 39 | Host: www.hub.example.com 40 | ``` 41 | 42 | #### Wellknown endpoint discovery Response 43 | 44 | ```text 45 | HTTP/1.1 200 OK 46 | Content-Type: application/json 47 | 48 | { 49 | "eventsSupported": ["Patient-open", "Patient-close", "SyncError", "com.example.researchstudy-transmogrify"], 50 | "websocketSupport": true, 51 | "fhircastVersion": "3.0.0" 52 | "capabilities": [ 53 | "supportsGetCurrentContext": false, 54 | "supportsNonCurrentContextUpdates": false 55 | ] 56 | } 57 | ``` 58 | 59 | ### FHIR Capability Statement 60 | 61 | To supplement or optionally identify the location of a FHIRcast hub, a FHIR server MAY declare support for FHIRcast using the FHIRcast extension on its FHIR CapabilityStatement's `rest` element. Note that client-side Hubs without a client-side FHIR server likely will not support communicating the url of a hub in this extension. See [the FHIRcast CapabilityStatement profile](StructureDefinition-fhircast-capabilitystatement.html). 62 | 63 | ### FHIR Resource Structures 64 | 65 | FHIRcast defines profiles for various FHIR resource structures used in the specification, see [`summary of artifacts`](artifacts.html). 66 | 67 | #### Must Support 68 | 69 | In the context of FHIRcast, must support (MS) on any data element SHALL be interpreted to mean [FHIR’s MustSupport](https://www.hl7.org/fhir/conformance-rules.html#mustSupport). Generally, implementations are expected to: 70 | * if known and possible, populate supported data elements as part of the event notifications as specified by the FHIRcast profiles. 71 | * interpret missing, supported data elements within resource instances as data not present in the sending systems (or for which the requestor is unauthorized). 72 | -------------------------------------------------------------------------------- /input/pagecontent/2-8-Extensions.md: -------------------------------------------------------------------------------- 1 | The specification is not prescriptive about support for extensions. However, to support extensions, the specification reserves the name `extension` and will never define an element with that name, allowing implementations to use it to provide custom behavior and information. The value of an extension element SHALL be a pre-coordinated JSON object. For example, an extension on a notification could look like this: 2 | 3 | ```json 4 | { 5 | "context": [{ 6 | "key": "patient", 7 | "resource": { 8 | "resourceType": "Patient", 9 | "id": "ewUbXT9RWEbSj5wPEdgRaBw3" 10 | } 11 | }, 12 | { 13 | "key": "extension", 14 | "data": { 15 | "user-timezone": "+1:00" 16 | } 17 | } 18 | ] 19 | } 20 | ``` 21 | -------------------------------------------------------------------------------- /input/pagecontent/2_Specification.md: -------------------------------------------------------------------------------- 1 | This chapter consists of the following sections: 2 | 3 | [2.1 Session Discovery](2-1-SessionDiscovery.html) | 4 | [2.2 FHIRcast Scopes](2-2-FhircastScopes.html) | 5 | [2.3 Event Format](2-3-Events.html) | 6 | [2.4 Subscribing to Events](2-4-Subscribing.html) | 7 | [2.5 Receive Event Notification](2-5-ReceiveEventNotification.html) | 8 | [2.6 Send Event Notification](2-6-SendEventNotification.html) | 9 | [2.7 Conformance](2-7-Conformance.html) | 10 | [2.8 Extensions](2-8-Extensions.html) | 11 | [2.9 Get Current Context](2-9-GetCurrentContext.html) | 12 | [2.10 Content Sharing](2-10-ContentSharing.html) | 13 | 14 | The FHIRcast specification describes the APIs used by disparate healthcare applications to synchronize user interfaces (UI) in real time; allowing them to show the same clinical context and content to a user. 15 | 16 | 17 | Once an application [knows about](2-1-SessionDiscovery.html) the session (Hub topic), the application [subscribes](2-4-Subscribing.html) to specific workflow-related [events](2-3-Events.html) for the given session. The application is then [notified](2-5-ReceiveEventNotification.html) when those workflow-related events occur; for example, when the clinician opens a patient's chart in another application subscribed to the same session. A Subscriber may also [initiate a workflow event](2-6-SendEventNotification.html) by accessing APIs defined in this specification; for example, closing the patient's chart. A Subscriber [unsubscribes from the session](2-4-Subscribing.html#unsubscribe) to no longer receive session events. The notification events describing the workflow event are defined as a simple JSON wrapper around one or more FHIR resources. 18 | 19 | FHIRcast recommends the [HL7 SMART on FHIR launch protocol](http://www.hl7.org/fhir/smart-app-launch) for both session discovery and API authentication. FHIRcast enables a Subscriber to receive notifications over a WebSocket connection. This protocol is modeled on the [W3C WebSub RFC](https://www.w3.org/TR/websub/), such as its use of GET vs POST interactions and a Hub for managing subscriptions. The Hub exposes APIs for subscribing and unsubscribing, requesting context changes, sharing content, and distributing event notifications. The flow diagram presented below illustrates the series of interactions specified by FHIRcast, their origination, and their outcome. 20 | 21 |
22 | {% include FHIRcastOverviewForAbstract.svg %} 23 |
Figure: FHIRcast Overview
24 |

25 |
26 | 27 | 28 | All data exchanged through the HTTP APIs SHALL be formatted, sent, and received as [JSON](https://tools.ietf.org/html/rfc8259) structures (unless otherwise specified), and SHALL be transmitted over channels secured using the Hypertext Transfer Protocol (HTTP) over Transport Layer Security (TLS), also known as HTTPS which is defined in [RFC2818](https://tools.ietf.org/html/rfc2818). FHIR resources exchanged in FHIRcast messages use FHIR-specific JSON serialization as specified in [FHIR+JSON](https://www.hl7.org/fhir/json.html). 29 | 30 | {% include questionnote.html text='Looking for implementer feedback on changing the expectation for FHIRcast event\'s JSON content type from JSON to FHIR+JSON.' %} 31 | 32 | 33 | 34 | All data exchanged through WebSockets SHALL be formatted, sent, and received as [JSON](https://tools.ietf.org/html/rfc8259) structures, and SHALL be transmitted over Secure Web Sockets (WSS) as defined in [RFC6455](https://tools.ietf.org/html/rfc6455). 35 | -------------------------------------------------------------------------------- /input/pagecontent/3-1-0-eventstructures.md: -------------------------------------------------------------------------------- 1 | Definitions of FHIRcast event structure and the event maturity model. 2 | 3 | | **Definitions** | 4 | | [Event template](3-1-1-template.html) | 5 | | [Event maturity model](3-1-2-eventmaturitymodel.html) | 6 | -------------------------------------------------------------------------------- /input/pagecontent/3-1-1-template.md: -------------------------------------------------------------------------------- 1 | This section presents the template to use for defining new events. 2 | 3 | ### Event-name: [FHIR resource]-[suffix] 4 | 5 | eventMaturity | [0 - Draft](3-1-2-eventmaturitymodel.html) 6 | 7 | ### Workflow 8 | 9 | Describe when this event occurs in a workflow. Describe how the context fields relate to one another. Event creators SHOULD include as much detail and clarity as possible to minimize any ambiguity or confusion amongst implementors. 10 | 11 | ### Context 12 | 13 | Define context values that are provided when this event occurs, and indicate whether they must be provided, and the FHIR query used to generate the resource. 14 | 15 | {:.grid} 16 | Key | Cardinality | Type | Description 17 | --------- | ----------- | --------- | -------------- 18 | `patient` | 1..1 | resource | Describe the context value 19 | `FHIRresource` | 0..1 | resource | Describe the context value 20 | `subject` | 0..1 | reference | A reference to an important subject. 21 | 22 | ### Examples 23 | 24 | ```json 25 | { 26 | "timestamp": "2018-01-08T01:37:05.14", 27 | "id": "q9v3jubddqt63n1", 28 | "event": { 29 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 30 | "hub.event": "Patient-open", 31 | "context": [ 32 | { 33 | "key": "key-from-above", 34 | "resource": { 35 | "resourceType": "resource-type-from-above" 36 | } 37 | }, 38 | { 39 | "key": "encounter", 40 | "resource": { 41 | "resourceType": "Encounter" 42 | } 43 | } 44 | ] 45 | } 46 | } 47 | ``` 48 | 49 | ## Change Log 50 | 51 | Changes made to an event's definition SHALL be documented in a change log to ensure event consumers can track what has been changed over the life of an event. The change log SHALL contain the following elements: 52 | 53 | - Version: The version of the change 54 | - Description: A description of the change and its impact 55 | 56 | For example: 57 | 58 | {:.grid} 59 | Version | Description 60 | ------- | ---- 61 | 1.1 | Added new context FHIR object 62 | 1.0.1 | Clarified workflow description 63 | 1.0 | Initial Release 64 | -------------------------------------------------------------------------------- /input/pagecontent/3-1-2-eventmaturitymodel.md: -------------------------------------------------------------------------------- 1 | The intent of the FHIRcast Event Maturity Model is to attain broad community engagement and consensus before an event is labeled as mature, and to ensure that the event is necessary, implementable, and worthwhile to the systems that would reasonably be expected to use it. Implementer feedback should drive the maturity of new events. Diverse participation in open developer forums and events, such as HL7 FHIR Connectathons, is necessary to achieve significant implementer feedback. The below criteria will be evaluated with these goals in mind. 2 | 3 | {:.grid} 4 | Maturity Level | Maturity title | Requirements 5 | --- | --- | --- 6 | 0 | Draft | Event is correctly named and defined per the [FHIRcast event template](3-1-1-template.html). 7 | 1 | Submitted | _The above, and …_ Event definition is written up as a pull request using the [Event template](3-1-1-template.html) and community feedback is solicited from the community (e.g. the Zulip FHIRcast stream](https://chat.fhir.org/#narrow/stream/179271-FHIRcast)). 8 | 2 | Tested | _The above, and …_ The event has been tested and successfully supports interoperability among at least one Hub and two independent Subscribers using semi-realistic data and scenarios (e.g. at an HL7 FHIR Connectathon). The GitHub pull request defining the event is approved and published. 9 | 3 | Considered | _The above, and …_ At least 3 distinct organizations recorded ten distinct implementer comments (including a GitHub or Jira issue, tracker item, or comment on the event definition page), including at least two Hubs and three Subscribers. The event has been tested at minimum two HL7 FHIR Connectathons. 10 | 4 | Documented | _The above, and …_ The HL7 workgroup agrees that the artifact is sufficiently stable to require implementer consultation for subsequent non-backward compatible changes. The event is implemented in the standard FHIRcast reference implementation and multiple prototype projects. The Event specification SHALL: (1) Identify a broad set of example contexts in which the event may be used with a minimum of three, but as many as 10. (2) Clearly differentiate the event from similar events or other standards to help an implementer determine if the event is correct for their scenario. (3) Explicitly document example scenarios when the event should not be used. 11 | 5 | Mature | _The above, and ..._ The event has been implemented in production in at least two Hubs and three independent Subscribers. An HL7 working group ballots the event and the event has passed an HL7 STU ballot. 12 | 6 | Normative | _The above, and ..._ The responsible HL7 working group and the sponsoring working group agree the material is ready to lock down and the event has passed an HL7 normative ballot 13 | 14 | As each event progresses through a process of being defined, tested, implemented, used in production environments, and balloted, the event's formal maturity level increases. Each event has its own maturity level, which SHALL be defined in the event's definition and correspond to this Event Maturity Model. 15 | -------------------------------------------------------------------------------- /input/pagecontent/3-2-0-infrastructureevents.md: -------------------------------------------------------------------------------- 1 | Supporting events used in basic FHIRcast interactions. 2 | 3 | | **Infrastructure Events** | 4 | | [SyncError event](3-2-1-SyncError.html) | 5 | | [UserLogout event](3-2-2-UserLogout.html) | 6 | | [UserHibernate event](3-2-3-UserHibernate.html) | 7 | | [Home-open event](3-2-5-Home-open.html) | 8 | -------------------------------------------------------------------------------- /input/pagecontent/3-2-1-SyncError.md: -------------------------------------------------------------------------------- 1 | ### Event-name: SyncError 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | A synchronization error has been detected and this is indicated to Subscribers. 8 | 9 | Unlike most of FHIRcast events, `SyncError` is an infrastructural event and does not follow the `FHIR-resource`-`[open|close|update|select]` syntax and is directly referenced in the [underlying specification](2_Specification.html). 10 | 11 | A `SyncError` is sent by a Subscriber when: 12 | 1. It responds to a context change event with a 202 indicating the context change is accepted but has not yet occurred, and later the Subscriber decides to refuse the context (see: [`Event Notification Response`](2-5-ReceiveEventNotification.html#event-notification-response)). 13 | 14 | In these events the field `issue.severity` is SHALL be set to `warning` as is specified in [Operation outcome for Subscriber generated sync-errors](StructureDefinition-fhircast-subscriber-operation-outcome-syncerrror.html). `SyncError` is not used when a Subscriber responds to an `*-update` or `*-select` event. 15 | 16 | 17 | A `SyncError` is broadcast by the Hub when one of the following conditions occur: 18 | 1. A Subscriber encounters an error when following a context, returning a server error (50X) to the Hub (see: [`Event Notification Response`](2-5-ReceiveEventNotification.html#event-notification-response)). 19 | 2. A Subscriber decides not to follow a context, returning a server conflict (409) to the Hub (see: [`Event Notification Response`](2-5-ReceiveEventNotification.html#event-notification-response)). 20 | 3. The Hub detects a connection issue with a Subscriber (see: [`Hub Generated SyncError Events`](2-5-ReceiveEventNotification.html#hub-generated-syncerror-events)). 21 | 22 | In these events the field `issue.severity` SHALL beset to `warning` as is specified in [Operation outcome for Hub generated sync-errors](StructureDefinition-fhircast-hub-operation-outcome-syncerrror.html). 23 | 24 | ### Context 25 | 26 | {:.grid} 27 | Key | Cardinality | Type | Description 28 | --------- | ----------- | --------- | -------------- 29 | `operationoutcome` | 1..1 | resource | A FHIR OperationOutcome based on the profile [Operation outcome for sync-errors](StructureDefinition-fhircast-operation-outcome-syncerror.html). 30 | 31 | 32 | ### Example 33 | 34 | ```json 35 | { 36 | "timestamp": "2018-01-08T01:37:05.14", 37 | "id": "q9v3jubddqt63n1", 38 | "event": { 39 | "hub.topic": "7544fe65-ea26-44b5-835d-14287e46390b", 40 | "hub.event": "syncerror", 41 | "context": [ 42 | { 43 | "key": "operationoutcome", 44 | "resource": { 45 | "resourceType": "OperationOutcome", 46 | "issue": [ 47 | { 48 | "severity": "warning", 49 | "code": "processing", 50 | "diagnostics": "Acme Product failed to follow context", 51 | "details": { 52 | "coding": [ 53 | { 54 | "system": "https://fhircast.hl7.org/events/syncerror/eventid", 55 | "code": "fdb2f928-5546-4f52-87a0-0648e9ded065" 56 | }, 57 | { 58 | "system": "https://fhircast.hl7.org/events/syncerror/eventname", 59 | "code": "Patient-open" 60 | }, 61 | { 62 | "system": "https://fhircast.hl7.org/events/syncerror/subscriber", 63 | "code": "Acme Product" 64 | }, 65 | { 66 | "system": "http://example.com/events/syncerror/your-error-code-system", 67 | "code": "FHIRcast sync error" 68 | } 69 | ] 70 | } 71 | } 72 | ] 73 | } 74 | } 75 | ] 76 | } 77 | } 78 | ``` 79 | 80 | ### Change Log 81 | 82 | {:.grid} 83 | | Version | Description | 84 | | ------- | ------------- | 85 | | 1.0 | Initial Release | 86 | | 2.0 | Require id of event syncerror is about, in `OperationOutcome.details.coding.code` | 87 | | 2.1 | Clarify scenarios, make the OperationOutcome resource required, and specify explicit `severity` codes | 88 | -------------------------------------------------------------------------------- /input/pagecontent/3-2-2-UserLogout.md: -------------------------------------------------------------------------------- 1 | ### Event-name: UserLogout 2 | 3 | eventMaturity | [1 - Submitted](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | A Subscriber indicates that the User's session has ended, perhaps by exiting the Subscriber through a logout, session time-out or other reason. Upon receiving a `UserLogout` event, the Subscriber SHOULD logout the user or respond with a `SyncError`. 8 | 9 | Unlike most of FHIRcast events, `UserLogout` is a statically named event and therefore does not follow the regular FHIRcast syntax. 10 | 11 | Implementers are encouraged to consider if and when their application should logout the user upon receiving an userLogout event, and if so, how to preserve application state. 12 | 13 | If a Subscriber decides that it will not logout the current user it SHOULD send a [SyncError](3-2-1-SyncError.html) with appropriate details indicating why the Subscriber chose not to logout the current user. 14 | 15 | ### Context 16 | 17 | {:.grid} 18 | Key | Cardinality | Type | Description 19 | --------- | ----------- | --------- | -------------- 20 | `parameters` | 1..1 | resource | A Parameters resource according to the following profile [Logout Context](StructureDefinition-fhircast-logout.html). 21 | 22 | ### Examples 23 | 24 | ```json 25 | { 26 | "timestamp": "2019-11-25T13:16:00.00", 27 | "id": "35d0b1d4-de45-4b5b-a0e9-9c51b21ee71a", 28 | "event": { 29 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 30 | "hub.event": "userLogout", 31 | "context": [{ 32 | "key": "parameters", 33 | "resource" : { 34 | "resourceType": "Parameters", 35 | "parameter":[{ 36 | "name": "code", 37 | "valueCoding": { 38 | "system": "http://hl7.org/fhir/uv/fhircast/CodeSystem/fhircast-logout-codesystem", 39 | "code" : "user-initiated", 40 | "display": "The user initiated the logour and suggests all Subscribers should logout." 41 | } 42 | }] 43 | } 44 | }] 45 | } 46 | } 47 | ``` 48 | 49 | ### Change Log 50 | 51 | {:.grid} 52 | | Version | Description 53 | | ---- | ---- 54 | | 1.0 | Initial Release 55 | -------------------------------------------------------------------------------- /input/pagecontent/3-2-3-UserHibernate.md: -------------------------------------------------------------------------------- 1 | ### Event-name: UserHibernate 2 | 3 | eventMaturity | [1 - Submitted](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User temporarily suspended their session due to a session time-out or other reason. The user's session will eventually resume. 8 | 9 | Unlike most of FHIRcast events, `UserHibernate` is a statically named event and therefore does not follow the `FHIR-resource`-`[open|close|update|select]` syntax. 10 | 11 | ### Context 12 | 13 | {:.grid} 14 | Key | Cardinality | Type | Description 15 | --------- | ----------- | --------- | -------------- 16 | `parameters` | 1..1 | resource | A Parameters resource according to the following profile [Hibernate Context](StructureDefinition-fhircast-hibernate.html). 17 | 18 | ### Examples 19 | 20 | ```json 21 | { 22 | "timestamp": "2019-11-25T13:16:00.00", 23 | "id": "35d0b1d4-de45-4b5b-a0e9-9c51b21ee71a", 24 | "event": { 25 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 26 | "hub.event": "userHibernate", 27 | "context": [{ 28 | "key": "parameters", 29 | "resource" : { 30 | "resourceType": "Parameters", 31 | "parameter":[{ 32 | "name": "code", 33 | "valueCoding": { 34 | "system": "http://hl7.org/fhir/uv/fhircast/CodeSystem/fhircast-hibernate-codesystem", 35 | "code" : "user-initiated", 36 | "display" : "The user initiated the hibernation." 37 | } 38 | }] 39 | } 40 | }] 41 | } 42 | } 43 | ``` 44 | 45 | ### Change Log 46 | 47 | {:.grid} 48 | | Version | Description 49 | | ------- | ---- 50 | | 1.0 | Initial Release 51 | -------------------------------------------------------------------------------- /input/pagecontent/3-2-5-Home-open.md: -------------------------------------------------------------------------------- 1 | ### Home-open 2 | 3 | eventMaturity | [1 - Submitted](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | The user has opened or switched back to the application's home page or tab which does not have any FHIR related context. 8 | 9 | Unlike most of FHIRcast events, `Home-open` is representing the lack of a FHIR resource context and therefore does not fully follow the `FHIR-resource`-`[open|close]` syntax. 10 | 11 | 12 | ### Context 13 | 14 | The context field is empty. 15 | 16 | ### Example 17 | 18 | ```json 19 | { 20 | "timestamp": "2019-11-25T13:16:00.00", 21 | "id": "35d0b1d4-de45-4b5b-a0e9-9c51b21ee71a", 22 | "event": { 23 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 24 | "hub.event": "home-open", 25 | "context": [] 26 | } 27 | } 28 | ``` 29 | 30 | ### Change Log 31 | 32 | {:.grid} 33 | | Version | Description 34 | | ---- | ---- 35 | | 1.0 | Initial Release 36 | -------------------------------------------------------------------------------- /input/pagecontent/3-3-0-patientevents.md: -------------------------------------------------------------------------------- 1 | Events used when establishing patient contexts. 2 | 3 | | **Patient Events** | 4 | | --- | 5 | | [Patient-open event](3-3-1-Patient-open.html) | 6 | | [Patient-close event](3-3-2-Patient-close.html) | 7 | -------------------------------------------------------------------------------- /input/pagecontent/3-3-1-Patient-open copy.md: -------------------------------------------------------------------------------- 1 | ### Event name: Patient-open 2 | 3 | eventMaturity | [3 - Considered](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User opened a patient's medical record. The indicated patient is now the current patient in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient now in context. 15 | 16 | The following profile provides guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in a Patient open request: 17 | 18 | * [Patient for Open Events](StructureDefinition-fhircast-patient-open.html) 19 | 20 | Other attributes of the Patient resource (or resource extensions) may be present in the provided resource; however, attributes not called out in the profile are not required by the FHIRcast standard. 21 | 22 | ### Examples 23 | 24 | ```json 25 | { 26 | "timestamp": "2023-04-01T010:38:04.16", 27 | "id": "6efe28b2-7f8b-4cbc-bc59-a21a902f7e04", 28 | "event": { 29 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 30 | "hub.event": "Patient-open", 31 | "context": [ 32 | { 33 | "key": "patient", 34 | "resource": { 35 | "resourceType": "Patient", 36 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 37 | "identifier" : [ 38 | { 39 | "use" : "official", 40 | "type" : { 41 | "coding" : [ 42 | { 43 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 44 | "code" : "MR" 45 | } 46 | ] 47 | }, 48 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 49 | "value": "4438001", 50 | "assigner": { 51 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 52 | "display": "My Healthcare Provider" 53 | } 54 | } 55 | ], 56 | "name" : [ 57 | { 58 | "use" : "official", 59 | "family" : "Smith", 60 | "given" : [ 61 | "John" 62 | ], 63 | "prefix" : [ 64 | "Dr." 65 | ], 66 | "suffix" : [ 67 | "Jr.", 68 | "M.D." 69 | ] 70 | } 71 | ], 72 | "gender" : "male", 73 | "birthDate" : "1978-11-03" 74 | } 75 | } 76 | ] 77 | } 78 | } 79 | ``` 80 | 81 | ### Change Log 82 | 83 | {:.grid} 84 | | Version | Description 85 | | ---- | ---- 86 | | 1.0 | Initial Release 87 | | 1.1 | Deprecate encounter element in favor of dedicated `encounter-open` event 88 | | 1.2 | Reference context resource profiles and update example to be compliant with the profiles 89 | -------------------------------------------------------------------------------- /input/pagecontent/3-3-1-Patient-open.md: -------------------------------------------------------------------------------- 1 | ### Event name: Patient-open 2 | 3 | eventMaturity | [3 - Considered](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User opened a patient's medical record. The indicated patient is now the current patient in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient now in context. 15 | 16 | The following profile provides guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in a Patient open request: 17 | 18 | * [Patient for Open Events](StructureDefinition-fhircast-patient-open.html) 19 | 20 | Other attributes of the Patient resource (or resource extensions) may be present in the provided resource; however, attributes not called out in the profile are not required by the FHIRcast standard. 21 | 22 | ### Examples 23 | 24 | ```json 25 | { 26 | "timestamp": "2023-04-01T010:38:04.16", 27 | "id": "6efe28b2-7f8b-4cbc-bc59-a21a902f7e04", 28 | "event": { 29 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 30 | "hub.event": "Patient-open", 31 | "context": [ 32 | { 33 | "key": "patient", 34 | "resource": { 35 | "resourceType": "Patient", 36 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 37 | "identifier" : [ 38 | { 39 | "use" : "official", 40 | "type" : { 41 | "coding" : [ 42 | { 43 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 44 | "code" : "MR" 45 | } 46 | ] 47 | }, 48 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 49 | "value": "4438001", 50 | "assigner": { 51 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 52 | "display": "My Healthcare Provider" 53 | } 54 | } 55 | ], 56 | "name" : [ 57 | { 58 | "use" : "official", 59 | "family" : "Smith", 60 | "given" : [ 61 | "John" 62 | ], 63 | "prefix" : [ 64 | "Dr." 65 | ], 66 | "suffix" : [ 67 | "Jr.", 68 | "M.D." 69 | ] 70 | } 71 | ], 72 | "gender" : "male", 73 | "birthDate" : "1978-11-03" 74 | } 75 | } 76 | ] 77 | } 78 | } 79 | ``` 80 | 81 | ### Change Log 82 | 83 | {:.grid} 84 | | Version | Description 85 | | ---- | ---- 86 | | 1.0 | Initial Release 87 | | 1.1 | Deprecate encounter element in favor of dedicated `encounter-open` event 88 | | 1.2 | Reference context resource profiles and update example to be compliant with the profiles 89 | -------------------------------------------------------------------------------- /input/pagecontent/3-3-2-Patient-close.md: -------------------------------------------------------------------------------- 1 | ### Event-name: Patient-close 2 | 3 | eventMaturity | [3 - Considered](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User closed the patient's medical record. A previously opened and in context patient is no longer open nor in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient previously in context that is being closed. 15 | 16 | The following profiles provide guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in a Patient close request: 17 | 18 | * [Patient for Close Events](StructureDefinition-fhircast-patient-close.html) 19 | 20 | Other attributes of the Patient resource (or resource extensions) may be present in the provided resource; however, attributes not called out in the profile are not required by the FHIRcast standard. 21 | 22 | ### Examples 23 | 24 | ```json 25 | { 26 | "timestamp": "2023-04-01T010:50:22.16", 27 | "id": "112d5571-10e6-4912-8fd8-322da7926ae8", 28 | "event": { 29 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 30 | "hub.event": "Patient-close", 31 | "context": [ 32 | { 33 | "key": "patient", 34 | "resource": { 35 | "resourceType": "Patient", 36 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 37 | "identifier" : [ 38 | { 39 | "use" : "official", 40 | "type" : { 41 | "coding" : [ 42 | { 43 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 44 | "code" : "MR" 45 | } 46 | ] 47 | }, 48 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 49 | "value": "4438001", 50 | "assigner": { 51 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 52 | "display": "My Healthcare Provider" 53 | } 54 | } 55 | ] 56 | } 57 | } 58 | ] 59 | } 60 | } 61 | ``` 62 | 63 | ### Change Log 64 | 65 | {:.grid} 66 | | Version | Description 67 | | ---- | ---- 68 | | 1.0 | Initial Release 69 | | 1.1 | Deprecate encounter element in favor of dedicated `encounter-close` event 70 | | 1.2 | Reference context resource profiles and update example to be compliant with the profiles 71 | -------------------------------------------------------------------------------- /input/pagecontent/3-4-0-encounterevents.md: -------------------------------------------------------------------------------- 1 | Events used when establishing encounter contexts. 2 | 3 | | **Encounter Events** | 4 | | --- | 5 | | [Encounter-open event](3-4-1-Encounter-open.html) | 6 | | [Encounter-close event](3-4-2-Encounter-close.html) | 7 | -------------------------------------------------------------------------------- /input/pagecontent/3-4-1-Encounter-open.md: -------------------------------------------------------------------------------- 1 | ### Event-name: Encounter-open 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User opened patient's medical record in the context of a single encounter. The indicated encounter and its patient are now in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `encounter` | 1..1 | resource | FHIR Encounter resource describing the encounter now in context. 15 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient whose encounter is now in context. 16 | 17 | The following profiles provide guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in an Encounter open request: 18 | 19 | * [Encounter for Open Events](StructureDefinition-fhircast-encounter-open.html) 20 | * [Patient for Open Events](StructureDefinition-fhircast-patient-open.html) 21 | 22 | Other attributes of the Encounter and Patient resources (or resource extensions) may be present in the provided resources; however, attributes not called out in the profiles are not required by the FHIRcast standard. 23 | 24 | ### Examples 25 | 26 | ```json 27 | { 28 | "timestamp": "2023-04-01T010:54:10.23", 29 | "id": "c6a3e2eb-16b4-4eb8-b48b-7eb6c924919b", 30 | "event": { 31 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 32 | "hub.event": "Encounter-open", 33 | "context": [ 34 | { 35 | "key": "encounter", 36 | "resource": { 37 | "resourceType": "Encounter", 38 | "id": "8cc652ba-770e-4ae1-b688-6e8e7c737438", 39 | "identifier": [ 40 | { 41 | "use" : "official", 42 | "system" : "http://myhealthcare.example.com/visits", 43 | "value" : "r2r22345" 44 | } 45 | ], 46 | "status" : "unknown", 47 | "class" : { 48 | "system" : "http://terminology.hl7.org/CodeSystem/v3-ActCode", 49 | "code" : "AMB" 50 | }, 51 | "subject": { 52 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 53 | } 54 | } 55 | }, 56 | { 57 | "key": "patient", 58 | "resource": { 59 | "resourceType": "Patient", 60 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 61 | "identifier" : [ 62 | { 63 | "use" : "official", 64 | "type" : { 65 | "coding" : [ 66 | { 67 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 68 | "code" : "MR" 69 | } 70 | ] 71 | }, 72 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 73 | "value": "4438001", 74 | "assigner": { 75 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 76 | "display": "My Healthcare Provider" 77 | } 78 | } 79 | ], 80 | "name" : [ 81 | { 82 | "use" : "official", 83 | "family" : "Smith", 84 | "given" : [ 85 | "John" 86 | ], 87 | "prefix" : [ 88 | "Dr." 89 | ], 90 | "suffix" : [ 91 | "Jr.", 92 | "M.D." 93 | ] 94 | } 95 | ], 96 | "gender" : "male", 97 | "birthDate" : "1978-11-03" 98 | } 99 | } 100 | ] 101 | } 102 | } 103 | ``` 104 | 105 | ### Change Log 106 | 107 | {:.grid} 108 | | Version | Description 109 | | ---- | ---- 110 | | 1.0 | Initial Release 111 | | 1.1 | Reference context resource profiles and update example to be compliant with the profiles 112 | -------------------------------------------------------------------------------- /input/pagecontent/3-4-2-Encounter-close.md: -------------------------------------------------------------------------------- 1 | ### Event-name: Encounter-close 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User closed a patient's medical record encounter context. A previously open and in context patient encounter is no longer open nor in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `encounter` | 1..1 | resource | FHIR Encounter resource describing the encounter previously in context that is being closed. 15 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient associated with the encounter being closed. 16 | 17 | The following profiles provide guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in an Encounter close request: 18 | 19 | * [Encounter for Close Events](StructureDefinition-fhircast-encounter-close.html) 20 | * [Patient for Close Events](StructureDefinition-fhircast-patient-close.html) 21 | 22 | Other attributes of the Encounter and Patient resources (or resource extensions) may be present in the provided resources; however, attributes not called out in the profiles are not required by the FHIRcast standard. 23 | 24 | ### Examples 25 | 26 | ```json 27 | { 28 | "timestamp": "2023-04-01T010:58:32.35", 29 | "id": "96e847ed-4889-47e8-9f96-1458f50f405d", 30 | "event": { 31 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 32 | "hub.event": "Encounter-close", 33 | "context": [ 34 | { 35 | "key": "encounter", 36 | "resource": { 37 | "resourceType": "Encounter", 38 | "id": "8cc652ba-770e-4ae1-b688-6e8e7c737438", 39 | "identifier": [ 40 | { 41 | "use" : "official", 42 | "system" : "http://myhealthcare.example.com/visits", 43 | "value" : "r2r22345" 44 | } 45 | ], 46 | "status" : "unknown", 47 | "class" : { 48 | "system" : "http://terminology.hl7.org/CodeSystem/v3-ActCode", 49 | "code" : "AMB" 50 | }, 51 | "subject": { 52 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 53 | } 54 | } 55 | }, 56 | { 57 | "key": "patient", 58 | "resource": { 59 | "resourceType": "Patient", 60 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 61 | "identifier" : [ 62 | { 63 | "use" : "official", 64 | "type" : { 65 | "coding" : [ 66 | { 67 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 68 | "code" : "MR" 69 | } 70 | ] 71 | }, 72 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 73 | "value": "4438001", 74 | "assigner": { 75 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 76 | "display": "My Healthcare Provider" 77 | } 78 | } 79 | ] 80 | } 81 | } 82 | ] 83 | } 84 | } 85 | ``` 86 | 87 | ### Change Log 88 | 89 | {:.grid} 90 | | Version | Description 91 | | ---- | ---- 92 | | 1.0 | Initial Release 93 | | 1.1 | Reference context resource profiles and update example to be compliant with the profiles 94 | -------------------------------------------------------------------------------- /input/pagecontent/3-5-0-imagingstudyevents.md: -------------------------------------------------------------------------------- 1 | Events used when establishing imaging study contexts. 2 | 3 | | **ImagingStudy Events** | 4 | | ----------------------- | 5 | | [ImagingStudy-open event](3-5-1-ImagingStudy-open.html) | 6 | | [ImagingStudy-close event](3-5-2-ImagingStudy-close.html) | 7 | -------------------------------------------------------------------------------- /input/pagecontent/3-5-2-ImagingStudy-close.md: -------------------------------------------------------------------------------- 1 | ### Event-name: ImagingStudy-close 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User closed an imaging study. A previously open and in context image study is no longer open nor in context. When the ImagingStudy refers to a Patient this patient SHALL be indicated in the event. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `study` | 1..1 | resource | FHIR ImagingStudy resource describing the image study previously in context that is being closed. 15 | `encounter` | 0..1 | resource | A FHIR Encounter resource may be associated with the image study. 16 | `patient` | 0..1 | resource | FHIR Patient resource describing the patient associated with the image study being closed. A Patient SHALL be present if there is a patient associated with the image study. 17 | 18 | The following profiles provide guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in an ImagingStudy close request: 19 | 20 | * [ImagingStudy for Close Events](StructureDefinition-fhircast-imaging-study-close.html) 21 | * [Encounter for Close Events](StructureDefinition-fhircast-encounter-close.html) 22 | * [Patient for Close Events](StructureDefinition-fhircast-patient-close.html) 23 | 24 | Other attributes of the ImagingStudy, Encounter, and Patient resources (or resource extensions) may be present in the provided resources; however, attributes not called out in the profiles are not required by the FHIRcast standard. 25 | 26 | ### Examples 27 | 28 | ```json 29 | { 30 | "timestamp": "2023-04-01T011:13:12.42", 31 | "id": "bccaeba4-494a-459b-adf3-be0cf29dd2a0", 32 | "event": { 33 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 34 | "hub.event": "ImagingStudy-close", 35 | "context": [ 36 | { 37 | "key": "study", 38 | "resource": { 39 | "resourceType": "ImagingStudy", 40 | "id": "e25c1d31-20a2-41f8-8d85-fe2fdeac74fd", 41 | "identifier": [ 42 | { 43 | "system" : "urn:dicom:uid", 44 | "value" : "urn:oid:1.2.999.840.83474.8.231.875.3.15.661594731" 45 | }, 46 | { 47 | "type" : { 48 | "coding" : [ 49 | { 50 | "system": "http://terminology.hl7.org/CodeSystem/v2-0203", 51 | "code" : "ACSN" 52 | } 53 | ] 54 | }, 55 | "system" : "urn:oid:2.999.16.840.1.113883.19.5", 56 | "value" : "GH339884", 57 | "assigner" : { 58 | "reference" : "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 59 | "display" : "My Healthcare Provider" 60 | } 61 | } 62 | ], 63 | "status": "unknown", 64 | "subject": { 65 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 66 | } 67 | } 68 | }, 69 | { 70 | "key": "patient", 71 | "resource": { 72 | "resourceType": "Patient", 73 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 74 | "identifier" : [ 75 | { 76 | "use" : "official", 77 | "type" : { 78 | "coding" : [ 79 | { 80 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 81 | "code" : "MR" 82 | } 83 | ] 84 | }, 85 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 86 | "value": "4438001", 87 | "assigner": { 88 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 89 | "display": "My Healthcare Provider" 90 | } 91 | } 92 | ] 93 | } 94 | } 95 | ] 96 | } 97 | } 98 | ``` 99 | 100 | 179 | 180 | ### Change Log 181 | 182 | {:.grid} 183 | | Version | Description 184 | | ------- | ---- 185 | | 1.0 | Initial Release 186 | | 1.1 | Reference context resource profiles and update example to be compliant with the profiles 187 | -------------------------------------------------------------------------------- /input/pagecontent/3-6-0-diagnosticreportevents.md: -------------------------------------------------------------------------------- 1 | Events used when establishing diagnostic report contexts and exchanging content in the context of a diagnostic report. 2 | 3 | | **DiagnosticReport Events** | 4 | | --- | 5 | | [DiagnosticReport-open Event](3-6-1-DiagnosticReport-open.html) | 6 | | [DiagnosticReport-close Event](3-6-2-DiagnosticReport-close.html) | 7 | | [DiagnosticReport-update Event](3-6-3-DiagnosticReport-update.html) | 8 | | [DiagnosticReport-select Event](3-6-4-DiagnosticReport-select.html) | 9 | -------------------------------------------------------------------------------- /input/pagecontent/3-6-2-DiagnosticReport-close.md: -------------------------------------------------------------------------------- 1 | ### Event-name: DiagnosticReport-close 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | 7 | User closed a report. A previously open and in context report is no longer open nor in context. 8 | 9 | ### Context 10 | 11 | {:.grid} 12 | Key | Cardinality | Type | Description 13 | --------- | ----------- | --------- | -------------- 14 | `report` | 1..1 | resource | FHIR DiagnosticReport resource describing the report previously in context that is being closed. 15 | `encounter` | 0..1 | resource | A FHIR Encounter resource may be associated with the report 16 | `study` | 0..* | resource | FHIR ImagingStudy resource(s) describing any image study that was opened as part of the report context that is being closed. 17 | `patient` | 1..1 | resource | FHIR Patient resource describing the patient associated with the report being closed. 18 | 19 | The following profiles provide guidance as to which resource attributes should be present and considerations as to how each attribute should be valued in DiagnosticReport close request: 20 | 21 | * [DiagnosticReport for Close Events](StructureDefinition-fhircast-diagnostic-report-close.html) 22 | * [ImagingStudy for Close Events](StructureDefinition-fhircast-imaging-study-close.html) 23 | * [Encounter for Close Events](StructureDefinition-fhircast-encounter-close.html) 24 | * [Patient for Close Events](StructureDefinition-fhircast-patient-close.html) 25 | 26 | Other attributes of the DiagnosticReport, ImagingStudy, Encounter, and Patient resources (or resource extensions) may be present in the provided resources; however, attributes not called out in the profiles are not required by the FHIRcast standard. 27 | 28 | #### Content Sharing Support 29 | 30 | If a Hub supports content sharing, after it distributes the `DiagnosticReport-close` event to all Subscribers, the Hub should remove any content associated with the anchor context from its working memory. 31 | 32 | 33 | ### Examples 34 | 35 | #### DiagnosticReport-close Example 36 | 37 | ```json 38 | { 39 | "timestamp": "2023-04-01T011:18:52.21", 40 | "id": "1d35d190-2fc9-45df-a9c4-fd0de885544c", 41 | "event": { 42 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 43 | "hub.event": "DiagnosticReport-close", 44 | "context": [ 45 | { 46 | "key": "report", 47 | "resource": { 48 | "resourceType": "DiagnosticReport", 49 | "id": "2402d3bd-e988-414b-b7f2-4322e86c9327", 50 | "identifier" : [ 51 | { 52 | "use" : "official", 53 | "system" : "http://myhealthcare.example.org/reporting-system", 54 | "value" : "GH339884.RPT.0001" 55 | } 56 | ], 57 | "status": "unknown", 58 | "basedOn" : [ 59 | { 60 | "type" : "ServiceRequest", 61 | "identifier" : { 62 | "type" : { 63 | "coding" : [ 64 | { 65 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 66 | "code" : "ACSN" 67 | } 68 | ] 69 | }, 70 | "system" : "urn:oid:2.999.16.840.1.113883.19.5", 71 | "value" : "GH339884", 72 | "assigner" : { 73 | "reference" : "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 74 | "display" : "My Healthcare Provider" 75 | } 76 | } 77 | } 78 | ], 79 | "code" : { 80 | "coding" : [ 81 | { 82 | "system" : "http://loinc.org", 83 | "code" : "19005-8", 84 | "display": "Radiology Imaging study [Impression] (narrative)" 85 | } 86 | ] 87 | }, 88 | "subject": { 89 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 90 | }, 91 | "imagingStudy": [ 92 | { 93 | "reference": "ImagingStudy/e25c1d31-20a2-41f8-8d85-fe2fdeac74fd" 94 | } 95 | ] 96 | } 97 | }, 98 | { 99 | "key": "study", 100 | "resource": { 101 | "resourceType": "ImagingStudy", 102 | "id": "e25c1d31-20a2-41f8-8d85-fe2fdeac74fd", 103 | "identifier": [ 104 | { 105 | "system" : "urn:dicom:uid", 106 | "value" : "urn:oid:1.2.999.840.83474.8.231.875.3.15.661594731" 107 | } 108 | ], 109 | "status": "unknown", 110 | "subject": { 111 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 112 | }, 113 | "basedOn" : [ 114 | { 115 | "type" : "ServiceRequest", 116 | "identifier" : { 117 | "type" : { 118 | "coding" : [ 119 | { 120 | "system": "http://terminology.hl7.org/CodeSystem/v2-0203", 121 | "code" : "ACSN" 122 | } 123 | ] 124 | }, 125 | "system" : "urn:oid:2.999.16.840.1.113883.19.5", 126 | "value" : "GH339884", 127 | "assigner" : { 128 | "reference" : "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 129 | "display" : "My Healthcare Provider" 130 | } 131 | } 132 | } 133 | ] 134 | } 135 | }, 136 | { 137 | "key": "patient", 138 | "resource": { 139 | "resourceType": "Patient", 140 | "id": "503824b8-fe8c-4227-b061-7181ba6c3926", 141 | "identifier" : [ 142 | { 143 | "use" : "official", 144 | "type" : { 145 | "coding" : [ 146 | { 147 | "system" : "http://terminology.hl7.org/CodeSystem/v2-0203", 148 | "code" : "MR" 149 | } 150 | ] 151 | }, 152 | "system": "urn:oid:2.999.16.840.1.113883.19.5", 153 | "value": "4438001", 154 | "assigner": { 155 | "reference": "Organization/a92ac1be-fb34-49c1-be58-10928bd271cc", 156 | "display": "My Healthcare Provider" 157 | } 158 | } 159 | ] 160 | } 161 | } 162 | ] 163 | } 164 | } 165 | ``` 166 | 167 | ### Change Log 168 | 169 | {:.grid} 170 | | Version | Description 171 | | ------- | ---- 172 | | 0.1 | Initial draft 173 | | 0.5 | Connectathon trials and initial fielded solutions based on draft STU3 174 | | 1.0 | Reference context resource profiles and update example to be compliant with the profiles 175 | -------------------------------------------------------------------------------- /input/pagecontent/3-6-4-DiagnosticReport-select.md: -------------------------------------------------------------------------------- 1 | ### Event-name: DiagnosticReport-select 2 | 3 | eventMaturity | [2 - Tested](3-1-2-eventmaturitymodel.html) 4 | 5 | ### Workflow 6 | A `DiagnosticReport-select` request will be made to the Hub when a Subscriber desires to indicate that one or more FHIR resources contained in the DiagnosticReport's content are to be made visible, in focus, or otherwise "selected". It is assumed that a FHIR resource (e.g., Observation) with the specified `id` is contained in the specified [`anchor context's`](5_glossary.html) content, the Hub MAY or MAY NOT provide validation of its presence. 7 | 8 | This event allows other Subscribers to adjust their UIs as appropriate. For example, a reporting system may indicate that the user has selected a particular observation associated with a measurement value. After receiving this event an image reading application which created the measurement may wish to change its user display such that the image from which the measurement was acquired is visible. 9 | 10 | If one or more resources are noted as selected, any other resource which had been selected is assumed to be no longer selected (i.e., an implicit unselect of any previously selected resource). Additionally, a Subscriber may indicate that all selections have been cleared by posting a `DiagnosticReport-select` with an empty `select` array. 11 | 12 | ### Context 13 | 14 | {:.grid} 15 | Key | Cardinality | Type | Description 16 | --------- | ----------- | --------- | -------------- 17 | `report` | 1..1 | reference | Reference to the FHIR DiagnosticReport resource specifying the [`anchor context`](5_glossary.html) in which the selection is being made. 18 | `patient` | 0..1 | reference | May be provided so that Subscribers may perform identity verification according to their requirements. 19 | `select` | 1..* | reference | Contains zero or more references to selected resources. If a reference to a resource is present , there is an implicit unselect of any previously selected resource. If no resource references are present , this is an indication that any previously selected resource is now unselected. 20 | 21 | 22 | ### Examples 23 | 24 | #### DiagnosticReport-select Example 25 | 26 | The following example shows the selection of a single Observation resource in an anchor context of a diagnostic report. 27 | 28 | ```json 29 | { 30 | "timestamp": "2019-09-10T14:58:45.988Z", 31 | "id": "78ef1125-7f8b-4cbc-bc59-a2a02f7e04", 32 | "event": { 33 | "hub.topic": "fdb2f928-5546-4f52-87a0-0648e9ded065", 34 | "hub.event": "DiagnosticReport-select", 35 | "context": [ 36 | { 37 | "key": "report", 38 | "reference": 39 | { 40 | "reference": "DiagnosticReport/2402d3bd-e988-414b-b7f2-4322e86c9327" 41 | } 42 | }, 43 | { 44 | "key": "patient", 45 | "reference": { 46 | "reference": "Patient/503824b8-fe8c-4227-b061-7181ba6c3926" 47 | } 48 | }, 49 | { 50 | "key": "select", 51 | "reference": { 52 | "reference": "Observation/40afe766-3628-4ded-b5bd-925727c013b3" 53 | }, 54 | { 55 | "key": "select", 56 | "reference": { 57 | "reference": "Observation/e25ce4c2-95c1-4078-8ef5-84aab1a69036" 58 | } 59 | } 60 | ] 61 | } 62 | } 63 | ``` 64 | 65 | ### Change Log 66 | 67 | {:.grid} 68 | | Version | Description 69 | | ------- | ---- 70 | | 0.1 | Initial draft 71 | | 1.0 | Updated for STU3 72 | -------------------------------------------------------------------------------- /input/pagecontent/3_Events.md: -------------------------------------------------------------------------------- 1 | Section [2.3 Events](2-3-Events.html) defines the events and event types supported by FHIRcast. The events that are supported by a Hub are communicated using the conformance endpoint (see [Conformance](2-7-Conformance.html)). 2 | 3 | Although [2.3 Events](2-3-Events.html) provides the base definition of the events, many commonly used events extend on this base definition. Such extension include the definition of profiles on the resources used in context elements and the definition of additional context elements. 4 | 5 | This chapter contains the definition of these events and their event maturity level. 6 | 7 | The sections in this chapter are: 8 | 9 | | **3.1 Definitions** | 10 | | [3.1.1 Event template](3-1-1-template.html) | 11 | | [3.1.2 Event maturity model](3-1-2-eventmaturitymodel.html) | 12 | 13 | | **3.2 Infrastructure Events** | 14 | | [3.2.1 SyncError event](3-2-1-SyncError.html) | 15 | | [3.2.2 UserLogout event](3-2-2-UserLogout.html) | 16 | | [3.2.3 UserHibernate event](3-2-3-UserHibernate.html) | 17 | | [3.2.4 Home-open event](3-2-5-Home-open.html) | 18 | 19 | | **3.3 Patient Events** | 20 | | [3.3.1 Patient-open event](3-3-1-Patient-open.html) | 21 | | [3.3.2 Patient-close event](3-3-2-Patient-close.html) | 22 | 23 | | **3.4 Encounter Events** | 24 | | [3.4.1 Encounter-open event](3-4-1-Encounter-open.html) | 25 | | [3.4.2 Encounter-close event](3-4-2-Encounter-close.html) | 26 | 27 | | **3.5 ImagingStudy Events** | 28 | | [3.5.1 ImagingStudy-open event](3-5-1-ImagingStudy-open.html) | 29 | | [3.5.2 ImagingStudy-close event](3-5-2-ImagingStudy-close.html) | 30 | 31 | | **3.6 DiagnosticReport Events** | 32 | | [3.6.1 DiagnosticReport-open Event](3-6-1-DiagnosticReport-open.html) | 33 | | [3.6.2 DiagnosticReport-close Event](3-6-2-DiagnosticReport-close.html) | 34 | | [3.6.3 DiagnosticReport-update Event](3-6-3-DiagnosticReport-update.html) | 35 | | [3.6.4 DiagnosticReport-select Event](3-6-4-DiagnosticReport-select.html) | 36 | -------------------------------------------------------------------------------- /input/pagecontent/4-2-0-contextsynchronizationscenarios.md: -------------------------------------------------------------------------------- 1 | Scenarios for context synchronization. 2 | 3 | | **Context Synchronization Scenarios** | 4 | | ----------------------- | 5 | | [Synchronization recovery considerations](4-2-1-syncconsiderations.html) | 6 | | [Multi-tab considerations](4-2-2-multitab-considerations.html) | 7 | | [Multi-anchor considerations](4-2-3-multi-anchor-considerations.html) | 8 | -------------------------------------------------------------------------------- /input/pagecontent/4-2-3-multi-anchor-considerations.md: -------------------------------------------------------------------------------- 1 | {% include infonote.html text='This page contains guidance to implementers and is not part of the normative-track.' %} 2 | 3 | 4 | ### Apples & oranges: considerations for synchronizing applications that talk past one another 5 | 6 | Some healthcare applications know about apples, some oranges. When the orange application doesn't understand what the apple application is saying: the Hub should help translate. 7 | 8 | ### Applications understand each other 9 | For many context synchronization scenarios, all participating applications are subscribed to and understand all of the events used in the session. For example all of the applications in a session understand [`Patient-open`](3-3-1-Patient-open.html) and [`Patient-close`](3-3-2-Patient-close.html) events and those are the only events used in the session. 10 | 11 | ### Applications don't understand each other 12 | However, it may make sense to synchronize applications that don't subscribe to and understand the same FHIRcast events. For example, some specialized healthcare applications deal exclusively with billing charges or imaging studies and don't have the concept of a patient outside of a charge or study. A PACS may not send or even understand a [`Patient-open`](3-3-1-Patient-open.html), only [`ImagingStudy-open`](3-5-1-ImagingStudy-open.html). Similarly, a generalized healthcare application may understand [`Patient-open`](3-3-1-Patient-open.html) events, but not more specialized events, such as [`DiagnosticReport-open`](3-6-1-DiagnosticReport-open.html) events. 13 | 14 | ### Implied events 15 | 16 | FHIRcast event definitions specify the related FHIR resources that are contextually relevant to the event. An *-open event implies additional open events, one for each of the resource types referenced in the context. 17 | 18 | For example, an [`Encounter-open`](3-4-1-Encounter-open.html) implies a [`Patient-open`](3-3-1-Patient-open.html), because the `Encounter-open`'s context includes not just an encounter resource, but also a patient resource. Similarly, [`DiagnosticReport-open`](3-6-1-DiagnosticReport-open.html) implies [`Patient-open`](3-3-1-Patient-open.html) and possibly an [`ImagingStudy-open`](3-5-1-ImagingStudy-open.html) (if an ImagingStudy is supplied in the [`DiagnosticReport-open`](3-6-1-DiagnosticReport-open.html) event). 19 | 20 | ### Hub derives open events 21 | 22 | The Hub is responsible for identifying and sending these implied *-open events. When distributing a received event, the Hub is responsible for generating and communicating open events for the resource types referenced by the received event. It is important that Hubs do not generate and send duplicative events. 23 | 24 | 25 | See details in the specification about: 26 | * Hubs can [reject subscriptions](2-4-Subscribing.html#subscription-response) according to their own internal business logic. 27 | * Hubs are [required](2-5-ReceiveEventNotification.html#hub-generated-open-events) to derive and send open events. 28 | 29 | ### Hub may or may not derive close events 30 | 31 | {% include questionnote.html text='Implementer input is solicited. Is the absence of guidance from the specification problematic? If so, why? and how would you recommend we solve this?' %} 32 | 33 | A close event may or may not imply the closure of referenced resource types (see [multi-tab considerations](4-2-2-multitab-considerations.html)). FHIRcast does not currently prescribe this behavior. 34 | 35 | -------------------------------------------------------------------------------- /input/pagecontent/4-3-security-considerations.md: -------------------------------------------------------------------------------- 1 | {% include infonote.html text='This page contains guidance to implementers and is not part of the normative-track.' %} 2 | 3 | 4 | FHIRcast enables the synchronization of healthcare applications user interfaces in real-time through the exchange of a workflow event to a small number of disparate applications. The notification message which describes the workflow event is a simple json wrapper around one or more FHIR resources. These FHIR resources can contain Protected Health Information (PHI). 5 | 6 | ### Actors 7 | 8 | * Subscribing application 9 | * Hub 10 | * Authorization Server 11 | * Resource server 12 | 13 | FHIRcast ties SMART as the authorization layer together with a WebSub mechanism for subscription and event notification. 14 | 15 | ### Sources of Risk 16 | 17 | 1. The FHIRcast Hub pushes PHI to a dynamic URL specified by the authenticated application. 18 | 1. An application's credentials or a Hub's lack of authentication could be used by a malicious system to control the user's session. 19 | 1. FHIRcast recommends the use of SMART on FHIR, but does not require it. Implementation-specific launch, authentication, and authorization protocols may be possible. These alternate protocols should be scrutinized by implementers for additional security risks. 20 | 21 | ### SMART on FHIR 22 | 23 | [SMART on FHIR](http://www.hl7.org/fhir/smart-app-launch/) profiles [OAuth 2.0's authorization code grant type](https://tools.ietf.org/html/rfc6749#section-1.3.1) and extends it by introducing an "[EHR Launch Sequence](http://www.hl7.org/fhir/smart-app-launch/#ehr-launch-sequence)". The Argonaut Project performed a formal security review of SMART on FHIR, resulting in a [Risk Assessment report](http://argonautwiki.hl7.org/images/e/ed/%282015May26%29RiskAssessment_ReportV1.pdf). 24 | 25 | FHIRcast builds on SMART by introducing a new [syntax for standard OAuth 2.0 scopes](2-2-FhircastScopes.html), as well as two new SMART launch parameters of `hub.url` and `hub.topic`. 26 | 27 | * [HL7 SMART on FHIR specification](http://www.hl7.org/fhir/smart-app-launch/) 28 | * [Argonaut Risk Assessment report](http://argonautwiki.hl7.org/images/e/ed/%282015May26%29RiskAssessment_ReportV1.pdf). 29 | * [OAuth 2.0 Threat Model and Security Considerations](https://tools.ietf.org/html/rfc6819) 30 | 31 | ### Access to non-authorized content 32 | 33 | Access to non-authorized content is a critical issue in healthcare data exchange, as it can lead to privacy breaches and unauthorized use of sensitive information. In the FHIRcast event-based communication model, various types of content can be shared among applications that are connected to a session, such as updates to the current context, selected resources, and exchanged resources. 34 | 35 | To ensure that only authorized applications can access and share content, the FHIRcast specification includes a mechanism for checking authorization when a Subscriber subscribes to a session. This mechanism ensures that each application can only receive events that it is granted authorization to access. The responsibility of providing a valid set of authorizations lies with the authorization server. 36 | 37 | ### WebSocket Security Considerations 38 | 39 | It is recommended that Subscribers use and Hubs should only accept connections made over the secure _wss://_ WebSocket protocol and not the unsecured _ws://_ WebSocket protocol. 40 | 41 | The WebSocket standard defines an `Origin` header, sent from the client to the server and intended to contain the URL of the client. Subscribers using WebSockets may be running in a Web browser, in which case the Web browser enforces origin reporting to the Hub, or native applications in which the origin reported to the Hub can not be trusted. Therefore, a Hub exposing a WebSocket connection may not rely upon the origin sent by the Subscriber. 42 | 43 | While native application Subscribers can send any standard HTTP headers, notably including _Authorization: Bearer_, Web browser-based subscribers are limited to only HTTP Basic Auth or cookies. Therefore, the typical use of the OAuth 2.0 access_token for bearer authentication does not consistently work with WebSockets. FHIRcast describes a "ticket"-based authentication system, in which the `hub.topic` provided to the Subscriber as part of the secured SMART app launch serves not only as a unique session identifier, but also as an "authorization ticket". This authorization ticket effectively acts as a bearer token. The Hub should therefore take care to generate opaque and unique `hub.topic` values. 44 | 45 | * [The WebSocket Protocol RFC 6455](https://tools.ietf.org/html/rfc6455) 46 | * [Heroku's excellent explanation of WebSocket security](https://devcenter.heroku.com/articles/websocket-security) 47 | 48 | Unauthorized access to Websockets is also addressed by providing a Subscriber unique unguessable WebSocket endpoint with a limited lifetime. 49 | -------------------------------------------------------------------------------- /input/pagecontent/4_Scenarios.md: -------------------------------------------------------------------------------- 1 | This chapter contains informative discussion on various FHIRcast scenarios: 2 | 3 | [4.1 Application Launch Scenarios and Session Discovery](4-1-launch-scenarios.html) | 4 | [4.2 Context Synchronization Scenarios](4-2-0-contextsynchronizationscenarios.html) | 5 | [4.2.1 Synchronization Recovery Considerations](4-2-1-syncconsiderations.html) | 6 | [4.2.2 Multi-tab Considerations](4-2-2-multitab-considerations.html) | 7 | [4.2.3 Multi-anchor Considerations](4-2-3-multi-anchor-considerations.html) | 8 | [4.3 Security Considerations](4-3-security-considerations.html) | 9 | [4.4 Content Sharing Considerations](4-4-fhircast-event-content-sharing.html) | 10 | -------------------------------------------------------------------------------- /input/pagecontent/5_glossary.md: -------------------------------------------------------------------------------- 1 | 2 | {:.grid} 3 | Term | Description 4 | ---- | --- 5 | **Anchor Context** | a context that is used as a container for shared content, typical anchor contexts are FHIR resources such as `ImagingStudy` and `DiagnosticReport` 6 | **Container** | the set of resources related to an anchor resource consisting of the resource itself, all resources referring to the resource and all resources the anchor resource refers to. 7 | **Content** | FHIR resources created during a user's interaction with the anchor context and shared with other Subscribers; shared content either directly or indirectly references the anchor context - for example, if the anchor context is a `DiagnosticReport` the user may make a measurement resulting in a FHIR observation containing measurement information which is shared with other Subscribers. 8 | **Context** | a FHIR resource associated with a session which indicates a subject on which applications should synchronize as appropriate to their functionality 9 | **Current Context** | the context associated with a session that is active at a given time, that is the context of the last *-open for which no *-close has occurred. 10 | **Hub** | handles subscription requests, session change requests, and distributes events to Subscribers 11 | **Session Event** | a user initiated workflow event, communicated to Subscribers, containing the current context or shared content 12 | **Subscriber** | an application which subscribes to and requests or receives session events 13 | **Topic** | an identifier of a session 14 | -------------------------------------------------------------------------------- /input/pagecontent/6_change-log.md: -------------------------------------------------------------------------------- 1 | # Revision History 2 | All changes to the FHIRcast specification are tracked in the [specification's HL7 github repository](https://github.com/HL7/fhircast-docs/commits/master). Further, issues may be submitted and are tracked in [jira](https://jira.hl7.org/browse/FHIR-25651?filter=12642) or (historically as) [github issues](https://github.com/HL7/fhircast-docs/issues). For the reader's convenience, the below table additionally lists significant changes to the specification. 3 | 4 | ## Significant changes as part of the STU2 publication include: 5 | 6 | * Introduction of WebSockets as the preferred communication mechanism over webhooks. 7 | * Creation of a FHIR CapabilityStatement extension to support Hub capability discovery. 8 | * Additional, required information on `SyncError` OperationOutcome (namely communication of the error'd event's id and event name). 9 | * Websocket WSS URL communicated in HTTP body, instead of `Content-Location` HTTP header. 10 | * Subscribers should differentiate between immediately applied context changes and mere successfully received notifications with HTTP code responses of 200 and 202, respectively. 11 | * removal of the Heartbeat event 12 | 13 | ## Significant changes as part of the STU3 publication include: 14 | 15 | ### Spec format moved to FHIR Implementation Guide 16 | [FHIRcast STU2](https://fhircast.hl7.org/specification/STU2/) was the last version of FHIRcast published with our bespoke mkdocs publication pipeline. STU3 and beyond will be published as proper FHIR IGs, including the use of FHIR profiles. 17 | 18 | #### New events added to event library 19 | * home-open 20 | * heartbeat 21 | * encounter-open 22 | * encounter-close 23 | * imagingstudy-open 24 | * imagingstudy-close 25 | * diagnosticreport-open 26 | * diagnosticreport-close 27 | * diagnosticreport-update 28 | * diagnosticreport-select 29 | 30 | #### Get Current Context RESTful API is added as optional 31 | 32 | The [Get Current Context API](2-9-GetCurrentContext.html) was added to the specification. 33 | 34 | #### FHIRcast starts to become a "base specification" 35 | 36 | With the addition of update and select events, the scope of the FHIRcast specification significantly increases beyond context synchronization. In part this has lead to this FHIRcast publication specifying capabilities which require additional specification to be applied to specific interoperability use-cases. 37 | 38 | ### Changes to Context Synchronization 39 | #### Remove `webhook` channel 40 | In STU1 and STU2, FHIRcast supported a `webhook` channel (URL callbacks). As part of FHIRcast STU3, support for `webhooks` was removed in favor of `websockets` as the single communication method. The field `hub.channel.type` was used to indicate the channel type to use for event notification. This field has been retained in order to support backward compatibility as well as facilitate potentially adding new channels in the future. Similarly, the conformance statement related to WebSocketsupport was retained. 41 | 42 | #### New context synchronization events 43 | * home-open 44 | * encounter-open 45 | * encounter-close 46 | * heartbeat 47 | 48 | #### Hub Generated `open` events 49 | 50 | Significant complexity is created if/when subscribers support subsets of the FHIRcast context synchronization events used during a context synchronization session. If a hub permits subscribers to subscribe to subsets of one another's events, the hub is required to "generate" or "derive open events. This is required in the specification of [Event Notifications](2-5-ReceiveEventNotification.html#hub-generated-open-events) and discussed in [Multi-anchor considerations](4-2-3-multi-anchor-considerations.html) 51 | 52 | ### `update` events (aka Content Sharing) 53 | 54 | STU3 introduces the concept of content sharing. 55 | ### `select` events 56 | 57 | STU3 introduces the (experimental) concept of _selection_. 58 | 59 | ## Questions to implementers 60 | Scattered throughout the FHIRcast specification are the questions to implementers, the following hyperlink directly to them: 61 | * [2-4-Subscribing.html#current-context-notification-upon-successful-subscription](2-4-Subscribing.html#current-context-notification-upon-successful-subscription) 62 | * [2-5-ReceiveEventNotification.html#hub-generated-syncerror-events](2-5-ReceiveEventNotification.html#hub-generated-syncerror-events) 63 | * [2-9-GetCurrentContext.html#get-current-context](2-9-GetCurrentContext.html#get-current-context) 64 | * [4-1-launch-scenarios.html#dynamic-registration-for-native-apps-following-smart-launch-parent-application-registers-dynamic-application-which-participates-in-fhircast-session](4-1-launch-scenarios.html#dynamic-registration-for-native-apps-following-smart-launch-parent-application-registers-dynamic-application-which-participates-in-fhircast-session) 65 | * [4-2-3-multi-anchor-considerations.html#hub-derives-open-events](4-2-3-multi-anchor-considerations.html#hub-derives-open-events) 66 | * [4-2-3-multi-anchor-considerations.html#hub-may-or-may-not-derive-close-events](4-2-3-multi-anchor-considerations.html#hub-may-or-may-not-derive-close-events) 67 | 68 | 69 | # FHIR Publication Details 70 | 71 | ## Intellectual Property Statements 72 | 73 | {% include ip-statements.xhtml %} 74 | 75 | ## Cross Version Analysis 76 | 77 | {% include cross-version-analysis.xhtml %} 78 | 79 | ## Package Dependencies 80 | 81 | {% include dependency-table.xhtml %} 82 | 83 | ## Global Profile Definitions 84 | 85 | {% include globals-table.xhtml %} 86 | -------------------------------------------------------------------------------- /input/pagecontent/7_design-notes.md: -------------------------------------------------------------------------------- 1 | This section contains various design decisions that might be relevant to understand the FHIRcast specification. 2 | 3 | ### Remove `webhook` channel 4 | 5 | Originally, FHIRcast supported a `webhook` channel (URL callbacks). As part of FHIRcast STU3, support for `webhooks` was removed in favor of `websockets` as the single communication method. 6 | 7 | The field `hub.channel.type` was used to indicate the channel type to use for event notification. This field has been retained in order to support backward compatibility as well as facilitate potentially adding new channels in the future. 8 | 9 | Similarly, the conformance statement related to WebSocketsupport was retained. 10 | 11 | ### Content sharing approach 12 | 13 | Two base use cases for content-exchange were identified during use case analysis. One employs a transactional, event-based exchange mechanism while the second uses content sharing content persisted in a FHIR server. It is also possible to use both methods concurrently. A detailed description of these approaches is found in the content sharing section of the specification. 14 | -------------------------------------------------------------------------------- /input/pagecontent/index.md: -------------------------------------------------------------------------------- 1 | ### Overview 2 | 3 | FHIRcast synchronizes healthcare applications in real time to ensure the user acts on the same clinical information across these applications. For example, a radiologist often works in three disparate applications at the same time (a radiology information system, a PACS and a dictation system), in this case, each of these three systems needs to display the same study or patient at the same time. 4 | 5 | FHIRcast isn't limited to radiology use-cases. Modeled after the common event notification design pattern and specifically [WebSub](https://www.w3.org/TR/websub/), FHIRcast naturally extends the SMART on FHIR launch protocol to achieve tight integration between disparate, full-featured applications. 6 | 7 | FHIRcast builds on the [CCOW](https://www.hl7.org/implement/standards/product_brief.cfm?product_id=1) abstract model to specify an http-based and simple context synchronization specification that doesn't require a separate context manager. FHIRcast is intended to be both less sophisticated, and more implementer-friendly than CCOW and therefore is not a one-to-one replacement of CCOW, although it solves many of the same problems. 8 | 9 | Adopting the WebSub terminology, FHIRcast describes an application as a Subscriber synchronizing with a Hub (which may be an EHR or other system). Any user-facing application can synchronize with FHIRcast. While less common, bidirectional communication between multiple applications is also possible. 10 | 11 | #### Why? 12 | 13 | The large number of vendor-specific or proprietary context synchronization methods in production limit the industry's ability to enhance the very large number of integrations currently in production. In practice, these integrations are decentralized and simple. 14 | 15 | ### How it works and an example scenario 16 | 17 | A radiologist working in the reporting system clicks a button to open the dictation system. The dictation app is authorized and subscribes to the radiologist's session. Each time the radiologist opens a patient's chart in the reporting system, the dictation app will be notified of the current patient and therefore presents the corresponding patient information on its own UI. The reporting system and dictation app share the same session's context. 18 | 19 | {% include img.html img="colorful overview diagram.png" caption="Figure: FHIRcast Overview" %} 20 | 21 | By convention a driving application is the application which directs the context (for example, by opening and closing context). The driving application could be an EHR, a PACS, a worklist, or any other clinical workflow system. A driving application may or may not launch other applications; to launch other applications the driving application may use the [SMART App Launch](https://hl7.org/fhir/smart-app-launch) mechanism. As part of a [SMART App Launch](https://hl7.org/fhir/smart-app-launch), an application requests appropriate [FHIRcast OAuth 2.0 scopes](2-2-FhircastScopes.html) and receives the location of the Hub and a unique `hub.topic` session identifier. 22 | 23 | An application subscribes to specific workflow events for the topic during its subscription request. The Hub verifies the subscription then notifies the subscribed application when the requested workflow events occur; for example, by the clinician opening a patient’s chart a `Patient-open` event would be sent. An application unsubscribes from a topic when it no longer wants to receive notifications. Note that subscribed applications other than the driving application could send a close event for an open context; however, such a scenario may not be desirable in many workflows. 24 | 25 | Note that: 26 | 27 | * Event notifications are thin json wrappers around FHIR resources. 28 | * An application can request context changes by sending an event notification to the Hub's `hub.topic` session identifier. The HTTP response status indicates success or failure. 29 | * The [Event Catalog](3_Events.html) documents the workflow events that can be communicated in FHIRcast. Each event will always carry the same type of FHIR resources. 30 | 31 | ### Reading the Specification 32 | Much of this implementation guide is descriptive in how Subscribers and the FHIRcast Hub interact in various scenarios. The normative portion of this implementation guide is contained in Sections [2: Specification](2_Specification.html), [3: Event Library](3_Events.html), and [8: Artifacts](artifacts.html). Other portions of the specification are informative and are labeled as such. 33 | 34 | ### Relation to FHIR Subscriptions 35 | FHIRcast is focused on providing notifications when key elements in the context change (i.e., when the current Patient, Encounter, ImagingStudy, etc. is changed). Notable differences in the scenarios addressed by FHIRcast and FHIR Subscriptions: 36 | 37 | * FHIRcast is designed to be used by multiple applications perhaps with the same user and typically on the same device - Subscriptions are designed to be used by multiple distinct systems, often outside of a user workflow. 38 | * FHIRcast sends only single-event notifications - Subscriptions allow servers to batch multiple notifications in high-frequency scenarios. 39 | * FHIRcast is designed around short-lived sessions - Subscriptions are intended to be long-lived resources. 40 | 41 | ### Get involved 42 | * Check out our [awesome community contributions on github](https://github.com/fhircast) 43 | * [Log issues](https://jira.hl7.org/secure/CreateIssue.jspa), [submit a PR!](https://github.com/fhircast/docs) 44 | * [Converse at chat.fhir.org](https://chat.fhir.org/#narrow/stream/179271-FHIRcast) 45 | 46 | ### Credits 47 | This Implementation Guide was made possible by the [contributions](https://github.com/HL7/fhircast-docs/graphs/contributors) of the [HL7 Infrastructure & Messaging Workgroup](https://www.hl7.org/Special/committees/inm/) and those identified below. 48 | 49 | Authors: 50 | * Bas van der Heuval, Philips 51 | * Eric Martin, Proscia 52 | * Isaac Vetter, Epic 53 | 54 | Contributors: 55 | * Gergely Heja, Siemens 56 | * Paulius Galinauskas, Canon 57 | * Timothy Kopec, Epic 58 | * Kamal Gnanadesikan, Nuance 59 | -------------------------------------------------------------------------------- /publication-request.json: -------------------------------------------------------------------------------- 1 | { 2 | "package-id" : "hl7.fhir.uv.fhircast", 3 | "version" : "3.0.0", 4 | "path" : "http://hl7.org/fhir/uv/fhircast/STU3/", 5 | "mode" : "milestone", 6 | "status" : "trial-use", 7 | "sequence" : "STU3 (v3.0.0)", 8 | "desc" : "FHIRcast STU3 publication release", 9 | "changes" : "7_design-notes.html", 10 | "first" : false 11 | } 12 | -------------------------------------------------------------------------------- /startDockerPublisher.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | 3 | docker run \ 4 | --rm -it \ 5 | -v $(pwd):/home/publisher/ig \ 6 | hl7fhir/ig-publisher-base 7 | -------------------------------------------------------------------------------- /updateSiteBasedOnMarkdownChange.sh: -------------------------------------------------------------------------------- 1 | cd temp/pages 2 | cp ../../input/pagecontent/* _includes/; jekyll b 3 | 4 | echo updated site: temp/pages/_site 5 | 6 | cp _site/* ../../output --------------------------------------------------------------------------------