1 Innledning

Perfuse flytter kliniske meldinger mellom systemer som aldri var designet til å snakke med hverandre. Et laboratorium sender resultater i HL7 v2; praksisadministrasjonssystemet forventer dem med forskjellige feltstillinger, en annen pasientidentifikator og en bekreftelse innen fem sekunder. Noe må sitte i midten, og det er en integrasjonsmotor.

Denne manualen beskriver hva Perfuse gjør, hver enkelt valgmulighet den aksepterer, og — der en avgjørelse ikke er åpenbar — hvorfor den fungerer på den måten den gjør.

1.1 Hva Perfuse er for

En enkelt grensesnitt mellom to kliniske systemer er vanligvis priset i titusener av kroner, med femten til tyve prosent av det igjen hvert år i vedlikehold. Mye av denne kosten er ikke arbeidet; det er at arbeidet krever noen som har gjort HL7 før, og de fleste praksiser har ikke ansatt en slik person.

Perfuse er bygget på antagelsen at personen som konfigurerer den har et problem å løse og ingen tidligere HL7-erfaring. Denne antagelsen viser seg i bestemte steder:

Kapittelet om testing og det om migration eksisterer fordi svaret på "hvorfor skal jeg stole på dette" må være bevis du samler selv, ikke et krav gjort her.

1.2 Hva som er i det

Alt under er i den ene binærfilen. Hver linje navngir kapittelet som dekker det.

1.3 Standarder og versjoner

Hvilken utgave av hver standard Perfuse implementerer, og hvordan dette ble sjekket. "Sjekket" navngir den eksterne verktøyet eller referansen som dømte resultatet; hvor ingenting utenfor har dømt det, sier det det. Resultatene er fra testdata, ikke fra en produksjonssted.

1.3.1 Meldinger og dokumenter

StandardUtgaveSjekket
HL7 v2enhver versjon: meldinger leses av deres egne skilletegn, ikke et versjons skjema; kvitteringer standardiseres til 2.5.1NIST HL7 v2 validator; ekte Mirth og OIE trafikk
HL7 v2 til FHIRHL7s V2-til-FHIR-tilordning (ADT, ORU, SIU, MDM, VXU og segmentene i dem)HL7 FHIR-validator mot US Core, UK Core, FR Core, ISiK, nl-core og HL7 Europa
FHIRR4 (4.0.1), med R4B og R5 lest og skrevetHL7 FHIR-validator; Inferno
C-CDA og CDAC-CDA 2.1ONC SITE (C-CDA-eksempler sendt og mottatt over XDR); ikke av en CDA-skjema
HL7 v3PIX og PDQ (IHE ITI-44, 45, 47)IHEs NE2008-skjemaer og eksempel-meldinger
DICOM og DICOMwebDIMSE C-STORE, C-FIND, C-MOVE, C-GET, C-ECHO; QIDO-RS, WADO-RS, WADO-URI, STOW-RSOrthanc
X12 (HIPAA)005010: 837, 835, 270/271 (X279A1), 276/277 (X212), 834, 278 forespørsel (X217) og spørsmål (X215); 275 i 006020 (X314)betalernes offentliggjorte companion guides; CMS esMD-eksempler
CAQH CORE-koblingvC2.2.0 SOAP og MIME, vC4.0.0 med MTOMen stand-in UM-system skrevet fra CAQHs regler
NCPDPTelekommunikasjon D.0; SCRIPT 2023011 (og 2017071) med ePA; Real-Time Prescription Benefit v13skrevet fra offentlige Surescripts companion guides og deres eksempler; ikke mot NCPDPs lisensierte skjema
UN/EDIFACTsyntaks 3 og 4, CONTRLpydifact 0.1.8
IHE-dokumentdelingXDS.b, XCA, XDR, MHD 4.2.2, PIXm, PDQm, XDMNIST XDS Toolkit; ONC SITE
Direkte sikker meldingsutvekslingApplicability Statement 1.2, XDR og XDM for Direkte, DNS og LDAP-sertifikatoppdagelseONC SITE; ONC's Certificate Discovery Tool (18 av 18)
AS2RFC 4130, komprimering RFC 5402pyas2lib
Signerte vedleggHL7 DSDR, XAdES-X-Lxmlsec1, OpenSSL

1.3.2 FHIR-implementeringsveiledninger

VeilederUtgaveKontrollert
US Corekonverteringer til 9.0.0 (USCDI v6); FHIR-server mot 6.1.0 og 7.0.0HL7-validerer; Inferno US Core
SMART App Launch2.2Inferno: 80 av 80 (offentlig app)
Bulk Data Access2.0.0Inferno: 48 av 48
Abonnements R5 Backportfor R4en ekte HTTP-mottaker; PAS-kittets varslingstester
Da Vinci CRD2.2.1, og 2.1.0Inferno 2.2.1: 92 passerer, ingen feiler; 2.1.0 etter veilederens egne eksempler
Da Vinci DTR2.2.0, og 2.1.0Inferno 2.2.0: 43 passerer, 2 feiler (en feil i kittet); 2.1.0 etter veilederens egne eksempler
Da Vinci PAS2.2.1, og 2.1.0Inferno 2.2.1: 82 av 84; 2.1.0 etter veilederens egne eksempler
Da Vinci PAS, sending (leverandør-side)2.2.1HL7 Da Vinci PAS-betalings-referanse-implementering; ikke en produksjons-betaler
Da Vinci PDex2.2.0Inferno PDex 2.0: betaler-til-betaler 19 av 19
Da Vinci HRex $member-match1.2.0Inferno PDex betaler-til-betaler
Da Vinci ATR2.1.0ikke kontrollert av et eksternt verktøy
Da Vinci CDex $submit-attachment2.1ikke kontrollert av et eksternt verktøy
Da Vinci Plan-Net1.1.0Inferno: 199 passerer, 10 feiler (en feil i kittet)
Da Vinci US Drug Formulary2.1.0HL7-validerer
ISiK (tyske sykehus), FHIR-serverStufe 5, Basis-modulgematik's ISiK-test-suite 3.0.9: 421 av 421
PACIO Transitions of Care, Medication Profile, Advance Directives, Functioning1.0.0, 1.0.0, 2.0.0-ballot, 2.0.0PACIO's Inferno-kitter med PACIO's egne data: hver feil i data eller kittet. C-CDA til TOC-dokument: HL7-validerer på HL7's eksempler, en feil igjen, veilederens egne
CARIN Blue Button2.2.0HL7-validerer
eCR2.1.2HL7-validerer
ELRHL7 2.5.1 ELR Release 1 med errataONC's ELR-verktøy: 28 av 28
Internasjonal Pasient-oppsomming2.0.0HL7-validerer
DEQM5.0.0HL7-validerer
SQL på FHIRv2det offisielle test-suitet: 144 av 144
SMART Health Cards og LinksCards 1.4, Links STU 1spesifikasjonens egne eksempel-kort; et publisert SMART Health Links-visnings-bibliotek
UDAP SikkerhetSTU 1en ekte autorisasjons-server og tillits-samfunn
TEFCA Facilitert FHIRSOP v2.0ikke kontrollert mot en ekte QHIN

1.3.3 Nasjonale og europeiske profiler

Kontrollert ved å konvertere offentliggjorte eller oppfunne HL7 v2-meldinger og validering av hver ressurs; fullstendige resultater og årsaker til hver feil er i repositoriets conformance/national-mappe.

ProfilUtgivelseGyldige ressurser
UK CoreSTU2 2.0.2185 av 187
FR Core2.2.0138 av 156
ISiK Basismodul4.0.3 (Stufe 4)18 av 47; 42 av 47 med sykehusets eget bundle-skript
Nictiz nl-core0.12.1-beta.1 (zib 2020)12 av 24; 18 av 24 med sykehusets eget bundle-skript
HL7 Europe Laboratory Report2.1.0106 av 426 (veilederen forventer et dokument, og et v2-resultat er ikke)
HL7 Europe Hospital Discharge Report1.0.068 av 69

Ingen av dette er en sertifisering. Perfuse har ikke blitt sertifisert av ONC, CMS, gematik, Nictiz, NHS England eller noen andre.

1.4 Hva det erstatter

Perfuse dekker det området som Mirth Connect holder, og kan importere Mirth-kanal-eksport direkte. Kapittelet om migration beskriver hva som oversettes rent, hva som trenger en avgjørelse, og hvordan man kan bevise at resultatet matcher før man bytte ut.

Forskjellene som teller i daglig bruk er feilsøking og stillhet. I Mirth betyr å se hva en transformer gjorde med en melding vanligvis å gjeninnføre kanalen med logging lagt til. I Perfuse kan enhver innspilt melding spilles tilbake gjennom den nåværende konfigurasjonen og inspiseres steg for steg, uten å berøre den kjørende kanalen. Og hvor en Mirth-varsel på "ingen trafikk" er en fast terskel som er nytteløs på noen strøm som er stille om natten, lærer Perfuse hva hver strøms normale uke ser ut og varsler mot det.

1.5 Hvordan å lese denne manualen

De første kapitlene er konseptuelle og er verdt å lese i rekkefølge: kanaler, meldingsstrøm, deretter transformasjon. Alt etter det kan leses etter behov.

Referanskapitlene nær slutten lister opp hver konfigurasjonsnøkkel, dens type, om den er påkrevd og dens standardverdi. Disse kapitlene er generert fra kildekoden, så de kan ikke beskrive en valgmulighet som ikke eksisterer eller utelate en som gjør det. Hvis en nøkkel vises i en konfigurasjonsfil og ikke i indeksen, er det ikke en Perfuse-nøkkel.

1.6 Konvensjoner

Konfigurasjonen er YAML. De fleste nøklene er snake_case på nettet — max_message_size, idle_timeout — og denne håndboken gir alltid nettformen, fordi det er det du skriver. Det er ett gammelt unntak, dataType på en kanal, som er camelCase; det er dokumentert på den måten i kanalreferansen og aksepteres bare i den stavingen.

Feltreferanser i HL7 bruker den vanlige notasjonen: PID-5 er det femte feltet i PID-segmentet, PID-5.1 er dens første komponent, og PID-3(2) er den andre gjentakelsen av det tredje feltet. En sti skrevet uten en gjentakelse addreserer hver gjentakelse (se stier).

Varigheter skrives som et tall og en enhet — 30s, 5m, 2h. Et bart tall er ikke en varighet og vil bli avvist i stedet for å bli gjettet på.

2 Komme i gang

Perfuse er en enkelt binær fil med en innebygd webgrensesnitt. Det er ingen applikasjonsserver å installere, ingen database å etablere og ingen separat administrasjonskonsoll.

2.1 Kjøre den

perfuse serve -channels ./channels -db ./perfuse.db -addr 0.0.0.0:8443 \
  -tls-cert ./cert.pem -tls-key ./key.pem

-channels er en mappe med YAML-filer, en per kanal. -db er en SQLite-fil som inneholder innspilte meldinger, brukere og revisjonslogg; den opprettes hvis den ikke eksisterer.

Ved første start uten konfigurerte brukere, opprettes en administrator-konto og dens passord skrives til loggen en gang. Det passordet kan ikke gjenopprettes senere.

Kjøre uten -tls-cert og -tls-key betjener vanlig HTTP. Dette er akseptabelt på en loopback-adresse for et første blikk og er ikke akseptabelt andre steder: webgrensesnittet inneholder legitimasjon og meldingsinnhold, begge er lesbare på nettet uten TLS. Se sikkerhet.

2.2 Den første kanalen

En kanal trenger et navn, en kilde og minst en destinasjon. Den minste nyttige kanalen mottar HL7 over MLLP og skriver hver melding til en fil:

name: first-feed
dataType: hl7
source:
  type: mllp
  listen: "0.0.0.0:6661"
destinations:
  - name: to-disk
    type: file
    file:
      root: /var/spool/perfuse
      dir: incoming

Lagre det som channels/first-feed.yaml og det blir plukket opp uten omstart.

Tre ting om den filen er verdt å merke seg, fordi de er formen på hver kanal:

2.3 Bygge en kanal fra grensesnittet

Alt ovenfor kan gjøres fra webgrensesnittet i stedet, og for en første kanal er det den bedre ruten fordi skjemaet ikke lar deg produsere en fil som ikke laster.

Byggeren tilbyr tre måter å komme inn:

  1. Fra en melding noen sendte deg. Lim inn eksempelet laboratoriet eller leverandøren sendte. Perfuse leser det og foreslår en kanal, sammen med tre separate lister: hva eksempelet viser, hva som er gjettet, og hva ingen eksempel kan fortelle deg. Dette er beskrevet i testing.
  2. Fra noe som allerede fungerer. En samling komplette kanaler som bare trenger å fylle inn adresser.
  3. Fra ingenting. Et tomt skjema. Tilgjengelig, men det er den sloweste av de tre og den enkleste å få feil.

2.4 Verifisere at det fungerer før du kobler noe

To ting kan gjøres før sendesystemet eksisterer.

Send en melding for hånd fra grensesnittet — meldingsavsenderen aksepterer limt inn tekst og rapporterer hva som skjedde med den, inkludert hvilke destinasjoner aksepterte den og hva hver transformasjon gjorde.

Eller generer testtrafikk. Hvis kanalen har håndtert noen meldinger overhodet, kan Perfuse lære deres form og produsere flere meldinger like dem, i samme proporsjoner, uten noen av det opprinnelige innholdet. Se testing.

2.5 Hva du skal gjøre neste

3 Web-grensesnittet

Perfuse er bygget på antagelsen om at alt kan gjøres fra nettleseren, og en funksjon som bare kan nås ved å redigere en fil, behandles som en feil. Dette kapitlet er en tur gjennom hva som ligger bak hver del av navigasjonen, organisert på samme måte som grensesnittet: etter spørsmålet du stiller.

Baren har Oversikt og Kanaler direkte, fordi de er der de fleste sesjoner starter og slutter. Alt annet er gruppert, og gruppene er navngitt etter spørsmål rather enn etter undersystemer — du går ikke til "revisjonsundersystemet", du går og finner ut hvem endret noe.

3.1 Lesing av toppfeltet

Fem ting i headeren er lett å overse.

Hver visning har en adresse. Adresselinjen følger visningen — #/channels, #/messages, #/settings — så en omlasting returnerer til den, en bookmark åpner den, en lenke sendt til en kollega lander dem på den, og tilbake-knappen flytter mellom visninger heller enn å forlate konsollen. En adresse som navngir en visning over din rolje åpner dashbordet i stedet.

Søk, eller ⌘K. Det søker over kanaler, innstillinger, meldinger og manualen, som betyr at det vanligvis er raskere enn å navigere — spesielt for en innstilling hvis navn du halvt husker.

Tema. Tre av dem: Midnight, Dark og Light. Midnight er nær-svart og er hva en veggbakke i et serverrom vanligvis ønsker; Dark er en mykere nøytral grå; Light er for en bærbar datamaskin ved et vindu. Valget lagres i nettleseren rather enn mot kontoen, fordi et tema er en egenskap ved hvor noen sitter, ikke hvem de er — samme operatør ønsker Midnight på veggen og Light på et tog. En maskins eget valg konsulteres en gang, for å velge en fornuftig standard første gang.

Språk. Konsollen er på engelsk (UK eller US datoorden), tysk, fransk, nederlandsk, spansk, italiensk, portugisisk, polsk, svensk, dansk, norsk eller finsk, med datoer og tall skrevet på måten som denne locale skriver dem. Valget lagres i nettleseren, og nettleserens eget språk brukes til en valg er gjort. Oversettelsene ble gjort av maskin og har ikke blitt gjennomgått av native talere ennå; engelsk er referansen, og velgeren sier det. Kode, meldinger, payload, kanalnavn og alt som tastes inn blir aldri oversatt. Manualen publiseres på samme språk på https://perfuse.health/manual/<language>/ (denne serverens egen Manual er den engelske).

Manual. Dokumentet du leser, betjent av den kjørende serveren. Det er samme filen som binærfilen kan skrive til disk, så det beskriver alltid versjonen foran deg rather enn den siste utgivelsen.

3.2 Overvåk — om det fungerer, og hva skjedde

3.2.1 Oversikt

Tilstanden til hver kanal, gjennomstrømming og hva som er galt for øyeblikket. Dette er skjermen som skal være åpen.

3.2.2 Meldinger

Hver melding som ankom, hva den ble transformert til, per destinasjon, og hva som skjedde med den. Søkbar, inkludert etter et filteruttrykk, så "vis meg de fra denne avsenderen som ble avvist" er et spørring rather enn en ettermiddag.

Et melding kan spilles av igjen her, og bearbeides på nytt gjennom den *nåværende* konfigurasjonen, i stedet for den som var aktiv på det tidspunktet — som er hvordan du bekrefter at en fiksering fungerer mot trafikken som førte til feilen. Se meldingslagret for hva som lagres og for hvor lenge.

3.2.3 Kø

Hva som venter på å bli levert, og hvorfor. En kø som ikke tømmes er den mest nyttige tidlige advarsel en integrasjonsmotor produserer, og det er verdt å kombinere med en varslingsregel så ingen behøver å overvåke. Se levering.

3.2.4 Varslinger

Hva som har utløst og hva reglene er. Regler redigeres her i stedet for i en fil. Se alerting.

3.2.5 Målinger

Gjennomstrømming, forsinkelse og feilrater over tid. Nyttig for kapasitets-spørsmål og, oftere, for styre-pakker — som er hvorfor nettstedets eget logo vises på det hvis en har blitt lastet opp.

3.2.6 SQL på FHIR

SQL på FHIR-visninger: velg et eksempel eller en lagret visning, eller skriv en, kjør den over denne serverens FHIR-lagring (alle pasienter eller en) eller over ressurser limt inn, se radene med deres typer, og last ned CSV, NDJSON eller Parquet. Lagre beholder den for FHIR-endepunktets $sql-run. Se meldingsformater.

3.2.7 Kvalitetsmål

Digitale kvalitetsmål: velg et eksempel eller et mål i FHIR-butikken, eller skriv ett med FHIRPath-kriterier. Velg et målingsperiode og en rapport (sammendrag, sammendrag med pasientlister eller en pasient) og evaluér det over FHIR-butikken eller limt ressurser. Skjermen viser hver populasjons teller og pasienter, scoren og strata. Last ned Målerapport lagrer FHIR-resultatet, og Lagre til FHIR-butikken beholder målet for Measure/$evaluate-measure. Mål i CQL avvises: Perfuse har ingen CQL-motor. Se digitale kvalitetsmål.

3.2.8 Flytkart

Et bilde av hvordan meldinger faktisk flyter: hvilke kilder mater hvilke kanaler, og hvilke destinasjoner de når.

Verdien er ikke dekorasjon. Hver eiendom akkumulerer en kanal som ingen husker å ha bestilt og en destinasjon som ingen innser fortsatt mottar, og begge er synlige her på en måte de ikke er i en liste over kanalfiler.

3.2.9 Teamdashbord

En dashboard for hver type person som overvåker grensesnittene: Drift, Tilkoblinger, Grensesnittsanalyse, Forhåndsgodkjenning, Bilde, Inntekts_syklus, Laboratorium, Personvern og sikkerhet, og en enkel ord-avdelingssammendrag. Fliser viser tellere, stater og tider, aldri en melding eller en pasient, så en dashboard kan gå til en leder eller en veggskjerm uten å utvide hvem som ser pasientdata.

Hver person åpner dashbordet sitt fra kataloggruppen eller rollen som er gitt. -dashboards dashboards.yaml kartlegger dem:

groups: {PACS-Admins: imaging, Network-Team: connections}
roles: {viewer: manager}

En gruppe seirer over en rolle, og enhver som ikke er koblet åpner på Drift. Arranger fliser skjuler og omprioriterer fliser, kanalvelgeren filterer dem, og Lagre som min utsikt holder det som din egen dashboard til Tilbakestill.

Eksporter til Grafana laster ned dashboardet som Grafana JSON over /metrics, med en datakildevariabel og en kanalfilter, for alle som trenger mer enn lett konfigurasjon. Fliser uten en metrikkbak dem utelates, og eksportbeskrivelsen navngir dem.

Den Tilkoblinger-flisen sjekker hver nettverksdestinasjon i lag. Den ser opp navnet, åpner en TCP-tilkobling, fullfører TLS der det brukes, og leser destinasjonens siste levering og feil fra ekte trafikk. Hver feil sier hva det betyr, for eksempel «avvist: partnerens motor er sannsynligvis stoppet», «tidsavbrudd: en brannmur eller en VPN-tunnel som er nede», eller «et sertifikat fra en myndighet denne serveren ikke stoler på». Ingen blir sendt til partneren, med ett unntak: en vaksinasjonsregister som har hatt ingen trafikk på syv dager blir bedt om sin CDC connectivityTest, som sender ingenting. Med -vpn tunnels.yaml VPN-tunneler-flisen ved siden av den leser hver partner-tunnels tilstand fra AWS Site-to-Site VPN, en Azure VPN Gateway-tilkobling eller strongSwan på denne verten, så et tidsavbrudd kan skilles fra en tunnel som er nede. Den sammenligner også begge sidene sine IKE- og IPsec-innstillinger, da skyen rapporterer våre og filen lister deres, og sier hvor de ikke kan enes. Tilkoblingsskjema laster ned en partners innstillinger side om side som Markdown for å sende dem; den holder aldri en forhåndsdelte nøkkel. Figurer en dashboard trenger som ikke er registrert ennå, listes under Ikke målt ennå i stedet for å tegnes som tomme fliser.

Departementdashbordene beregner sine egne tall på serveren, og hver enkelt sier hva vinduet og kilden dekker:

3.2.10 Deling av hva en feed faktisk inneholder

Profil denne feeden rapporterer hva som faktisk ankommer: hvilke utløsende hendelser, hvilke felt er fylt ut og hvor ofte, hva formen på verdiene tar, og hvilke koder en avsender faktisk bruker. Den siste er vanligvis den mest nyttige enkeltfakta i den.

En profil kan lastes ned og sendes til noen andre. Den trenger et navn og — påkrevd — hvilket system som produserte feeden, fordi spørsmålet en fremmed stiller til en delt profil er om den beskriver deres system, og et valgfritt felt ville gjøre "Ukjent" til det vanligste svaret i noen delt samling.

Den inneholder ingen pasientdata, og det blir sjekket heller enn antatt. En profil er statistisk: tellere, rater, lengder, former. Verdier beholdes bare for felt som standarden definerer som kode-tabeller, fordi en kode-tabellverdi ikke er identifiserende. Identifikatorverdier blir aldri listet.

To følgende punkter kommer fra at dette er et løfte snarere enn et håp. Serveren bygger profilen på nytt fra lagrede meldinger når du eksporterer den, i stedet for å sende den som vises på skjermen — så det som forlater bygningen, ble sammensatt av profileren, som har en test som beviser denne egenskapen, og ikke av en nettleser. Og eksporten avviser helt åpenbart hvis en profil noen gang lister verdier for et felt som ikke er en kode-tabell, og navngir feltet, men ikke verdiene.

En profil som ankommer fra et annet sted, blir sjekket på samme måte på vei inn, av en annen grunn: den ble produsert av noen hvis omsorg er ukjent, og å vise pasientens identifikatorer ville være en avsløring fra denne serveren. Å importere en endrer ingenting — en profil beskriver en feed, og hva som skal gjøres med den, er en separat beslutning.

3.3 Bygg — endre hva en kanal gjør, og prøv det før det er live

3.3.1 Kanaler

Kanalbyggeren. Kilder, mål, filtre, transformasjoner, skript og tester, med den genererte YAML-filen vist ved siden av skjemaet mens du arbeider — så filen er aldri en mysterium, og alle som foretrekker filen, kan følge med.

Se kanaler for hva delene er, og transformasjon for hva stegene gjør.

3.3.2 Skript

En arbeidsplass for skript, adskilt fra byggeren fordi å skrive et skript og å koble et skript er forskjellige aktiviteter.

Alle syv plasser blir tilbudt — filter, transformer, preprosessor, postprosessor, skriver, livssyklus og leser — og å velge riktig plass, er viktig, fordi plassen bestemmer hva skriptet mottar og hva det forventes å returnere. Å sjekke et skript som feil type, er ikke en midlertidig løsning; det kompilerer en annen ting.

JavaScript, Lua og WebAssembly er alle tilgjengelige. Se transformasjon.

3.3.3 Kontrakter

Forventninger om hvordan en feed må se ut, opprettet og sjekket her samt fra perfuse contract. Se kommandolinjen.

3.3.4 Tabeller

Oppslagstabeller og kode-sett: mappingene som omdanner en systems kode til en annens. Redigerbart her så å legge til en kode ikke er en distribusjon.

3.3.5 AI Mapper

Forslag om felttilordninger med en konfidensscore for hver, og avstår heller enn å gjette. Til tross for navnet bruker den ingen språkmodell og gjør ingen nettverksanrop: forslagene kommer fra regler, feltnavn og eksemplets innhold, på denne serveren. Den foreslår også en kanal fra en enkelt eksempelmelding, og uttaler eksplisitt hva eksemplet ikke kan fortelle den. Den andre halvdelen er den delen som gjør den pålitelig — et forslag som så ut til å være fullstendig ville invitere deg til å tro ting meldingen aldri sa.

3.3.6 Lekeplass

En skissebok for meldinger og transformasjoner. Lim inn en melding, aplikér steg, se resultatet.

Ingenting blir sendt noen sted en gang siden siden har lastet, som er grunnen til at den eksisterer i denne formen: det er trygt å lime inn noe reelt inn i, med forståelse av at det blir i nettleseren.

3.3.7 Skygge

Kjører trafikk gjennom en kandidatkonfigurasjon sammen med den live konfigurasjonen og rapporterer forskjellene, så en endring kan dokumenteres før den godkjennes. Samme idé som perfuse compare, men anvendt på en endring i stedet for en migrering. Se testing.

3.4 Utveksling — standardene denne serveren snakker til andre organisasjoner

3.4.1 FHIR lab

Konverter HL7 v2 til FHIR, valider en ressurs, og inspisere resultatet. Eksemplene dekker innleggelse, laboratorie-resultater, avtaler, kliniske notater, vaksinasjoner og en rapporterbar besøk. Valideringen inkluderer US Core, som er profilen amerikansk regulering er skrevet mot, så dette svarer på "er det de sendte oss faktisk konformt" uten å adoptere noe.

Offentlig helse-sak-rapport bygger eCR eICR en sak-rapport-destinasjon ville sende for meldingen. Den viser hvilken utløser-kode gjorde besøket rapporterbar, hva rapporten måtte markere som manglende, og dokumentet selv. En melding med ingenting rapporterbar, får grunnen i stedet. Ingenting blir sendt fra her.

3.4.2 Abonnementer

FHIR-abonnementer og om deres varslinger ankommer: hendelser, aksepterte, ventende og siste grunn til at en ble avvist. Abonnementer opprettes av FHIR-klienter gjennom FHIR-APIen, ikke fra denne siden, og legitimasjonen de ga serveren vises aldri. Se meldingsformater.

3.4.3 Dokumenter

Kliniske dokumenter — CDA og den trykkbare formen av et dokument. Nyttig når det som utveksles er en utskrivelsesoppsummering i stedet for en melding.

3.4.4 Dokumentdeling

IHE XDS.b-registret og -lageret som startet med -xds: hvor mange dokumenter, pasienter og innsendelsessett det inneholder og hvor mange som ble erstattet; adressene til lageret, registret, XCA-gatewayen og MHD; en søk etter en pasients dokumenter i dette registret eller et annet samfunns (et ITI-18-registrer eller en ITI-38-gateway, med en token for det); og publisering av et CDA-dokument manuelt, med fasilitets typen og praksisinnstillingen et dokument ikke sier. Se meldingsformater.

3.4.5 Direkte

Direkte sikker meldingsutveksling. Denne serverens Direct-adresser listar hver adresse en kanal sender eller mottar som, med dens sertifikat, når det utløper, de ankrene det stoler på, og hva som er galt (en manglende fil, et utløpt sertifikat). Adressboken holder korrespondenter og sertifikatene deres e-post er kryptert til: lim inn ett fra deres HISP, eller Lagre med sertifikatet fra DNS; et sertifikat som ikke er for adressen eller dets domene blir avvist. Finn et sertifikat i DNS spør uten å lagre. Se meldingsformater.

SMART Health Links og Cards, for CMS's *Kill the Clipboard*. Motta en SMART Health Link leser lenken eller QR-koden en pasient viser ved innmelding, verifiserer de helsekortene inne og sender den videre til en kanal. Del en besøksrekord lager en lenke denne serveren hoster, eventuelt med en passkode, og en QR-kode for pasienten; Bruk deres pasientoppsummering fyller den med pasientens Internasjonal Pasientoppsummering fra denne serverens FHIR-lager. Lenker denne serveren hoster listar dem med hvor ofte hver ble hentet, når den utløper og hvor mange passkodforsøk er igjen, og trekker tilbake en. Verifiser en SMART Health Card sjekker et kortsignatur og utsteder på egen hånd. Se CMS-0057 for serverinnstillingene det trenger.

3.4.7 Bilde

Arkivet denne serveren beholder når den kjører med -dicomweb-archive: tellinger av studier, serier, eksemplarer og plassbruk, DICOMweb-adressen og datakildeblokken for en OHIF-leser, og en studiesøk etter pasientnavn, ID, aksessjon og dato gjort med samme QIDO-RS-forespørsel en lesere gjør. En studie åpner til sine serier og eksemplarer, og et eksemplar lastes ned som en DICOM-fil. Ingen rendering skjer: Perfuse flytter bilder og en lesere viser dem. Uten et arkiv sier skjermen hvordan du aktiverer det. Se DICOMweb.

3.4.8 TEFCA

Revisjonsspor for utveksling gjennom et Kvalifisert helseinformasjonsnettverk, og formålet med bruken som styrer det.

To transport, på virkelig forskjellige stadier, og skjermen sier hvilken som er hvilken. Én flagg som dekker begge ville være feil i hvilken som helst retning den var avrundet.

Fasilitert FHIR er implementert, og har aldri snakket med et virkelig QHIN. Den følger Sequoia Project Standard Operating Procedure effektiv 8. mars 2026: oppdag partnerens UDAP-metadata, verifiser det, registrer dynamisk, få en tilgangstoken som bærer formålet med bruken, og spør. UDAP er en offentlig nøkkelinfrastruktur over OAuth 2.0 — et tillitsfellesskap utsteder X.509-sertifikater til medlemmene, og en medlem autentiserer ved å signere JWT-er med den private nøkkelen og vedlegge sertifikatkjeden.

Sikkerhetslaget er verifisert mot noen andres implementering, som er den eneste verifiseringen som er noe verd her. En registrering signert av denne byggingen ble sendt til en live tredjeparts-referanseserver og avvist med unapproved_software_statement — Untrusted: Certificate is not a member of community. For å produsere dette svaret dekodet serveren forespørselen, parserte programuttalelsen som en JWT, sjekket signatur, gikk gjennom sertifikatkjeden og tok en beslutning om medlemskap. Det er forskjellen på å bli avvist ved døren og å få tilbake et uleselig brev.

Hva som gjenstår kan ikke gjøres fra her. Sertifikatet som beviser fellesskapsmedlemskap kommer ut av QHIN-opptak og er ikke noe programvare produserer. Før ett eksisterer, fullfører ingen utveksling med en virkelig partner.

Hvordan en kanal ber. En destinasjon av type tefca ber den facilitatede FHIR-partneren i Innstillinger, TEFCA (tefca.partnerFHIRBase) om hver meldings pasient: ved identifikator når meldingen har en (PID-3, eller en FHIR-pasients identifikator), ellers ved etternavn med fødselsdato, og aldri bare ved navn, fordi en feilaktig sammenligning av navn returnerer en annen persons rekord uten feil. Destinasjonen setter formålet med bruk (behandling, betaling, operasjoner, folkehelser, individuell tilgang); et formål som deltakeren ikke erklærer, avvises før noe sendes. Formål går som TEFCA-utvekslingsformål-koder (T-TRTMNT, T-PYMNT, T-HCO, T-PH, T-IAS, system urn:oid:2.16.840.1.113883.3.7204.1.5.2.1), eller med tefca.purposeCodes: hl7 som HL7-formål-med-bruk-koder for samfunn som bruker disse. Bundlet funnet er destinasjonens svar og kan overføres til en annen kanal med results_to. Hver forespørsel, inkludert avviste, er i sporet på denne skjermen, som navngir partneren.

Hele banen, fra oppdagelse til en token som partnerens FHIR-tjener aksepterer, testes mot udap-dotnet-referanseserveren (se verifisering).

Den eldre QHIN-til-QHIN-utvekslingen bygget på IHE-profilene er ikke implementert. Et forsøk avvises med en feil som sier det, og avvisningen auditeres som en feil. Det er bevisst i stedet for å vente på en opprydning: en stubbet utveksling som rapporterer suksess ville sett inn poster i revisjonsspor for utvekslinger som aldri skjedde, og et spor som ikke er enig med hva som skjedde er verre enn ingen, fordi sporet er hva som blir trodd.

Gjennom hele, kommer endepunktene brukt for utveksling fra signerte deler av en partners metadata, aldri dokumentkroppen. Å verifisere en signatur og deretter lese endepunktene fra den usignerte kopi ville være en komplisert måte å stole på nettverket: en angriper i stand til å omskrive svaret lar den signerte delen være alene, peker token-endepunktet mot sin egen server og samler inn klient-påstander fra alle som sjekket signatur og deretter ignorerte hva den dekket.

Et tillitsankerbunt er påkrevd og fravær refuseres ved oppstart. Å sjekke en partners signerte metadata mot sertifikatet som ankom inni den, beviser bare at en part lagde begge — en feil denne kodebasen har gjort før, i SAML, hvor verifiseren foretrakk det innebygde sertifikatet og autentiserte en angriper som administrator mens alle tester passerte. Inkluder mellomleddene i bunten: en UDAP-tjener trenger bare å sende sitt bladsertifikat, og den offentlige referanseserveren gjør nettopp det.

3.5 Betaler — krav, forhåndsgodkjenning, legemidler og CMS-betalerregler

3.5.1 Krav og autentisering

Bygg en X12 275-kravvedlegg i 006020-formen CMS-0053-F antar, fra en limt C-CDA eller en lastet opp PDF, TIFF eller JPEG, og se det leses tilbake. Les en 275 og last ned dokumentet inne. Konverter en X12 278-beslutning til en Da Vinci PAS ClaimResponse. Ingen informasjon på denne siden blir lagret eller sendt. Se meldingsformater for hva 275 er bygget fra og hva den ikke gjør.

3.5.2 Legemidler

Legemiddelformulariet lastet med -formulary, og de to NCPDP-standardene besvart fra det. Formulary listar planene og legemidlene med deres nivå og krav, og hvor de offentlige Da Vinci US Drug Formulary API og NCPDP-endepunktene er. Prissjekk (RTPB) priser et legemiddel for en medlem som en reseptors Real-Time Prescription Benefit forespørsel ville: dekningstatus, begrensninger i ord med deres koder, medlemmets andel og planens, og billigere alternativer. Forhåndsgodkjenning (ePA) sender en SCRIPT-initiering til denne serverens eget endepunkt, viser spørsmålssettet som en skjema, sender svarene og viser avgjørelsen; under, hver sak med hvor den står og om reseptoren har blitt informert, sakens svar, en knapp for å sende en usendt avgjørelse igjen, og legemiddelfigurene CMS-0062-P foreslår. Se CMS-0057.

3.5.3 CMS-0057

Betalerens side av CMS Interoperability og Forhåndsgodkjenning-regelen, som fem verktøy:

og hva hver av dem ennå mangler.

godkjenne færre enheter. Se gjennomgangskøen.

Konverteringene lagrer ingen informasjon og sender ingen informasjon.

3.5.4 CMS-sammenstilling

Klarhet for CMS Interoperability Framework: hver av dets 26 kriterier, gruppert som CMS grupperer dem, med hva Perfuse tilbyr, om det er på her, innstillingen som slår det på, og hva organisasjonen må gjøre. Tellene øverst filterer listen. Se CMS-0057.

3.6 Administrer — hvem som kan gjøre hva, og hvordan denne serveren er konfigurert

3.6.1 Brukere

Kontoer, roller (overvåker, viser, operatør, redaktør, admin) og kanalgrupper. Hver persons kanalgrupper redigeres på plass i listen; tom betyr alle kanaler, og lab=editor, adt gir en annen rolle i en gruppe. En administrator begrenset til noen grupper ser bare personene i disse gruppene. Overskriften viser dine egne grupper ved siden av din rolle når du har noen. Se sikkerhet.

Maskinlegitimasjoner er også her. En token er for en maskin i stedet for en person: den utløper ikke og påvirkes ikke av noen som logger ut, hvilket er hva en server som poller sin nabo trenger. Bare en hash lagres, så en token vises bare en gang når den opprettes og kan ikke gjenopprettes — en stjålet database gir ingen brukbar token. Gi den lavest rolle som gjør jobben.

Med MCP på, viser seksjonen også adressen en AI-agent kobler til, en klientkonfigurasjon til å kopiere og hvert verktøy med rollen det trenger; utstedelse av en token med La en AI-agent handle med den gir den mcp:write-omfang. Se sikkerhet.

3.6.2 Leietakere

På en delt server, plattformoperatørens liste over organisasjoner: hver enkelt organisasjons kanalantall og lagrede størrelse ved siden av dens begrensninger (kanaler, meldinger per minutt, lagring), som settes på plass. Vist bare til plattformrollen. Se sikkerhet for hva hver begrensning gjør.

3.6.3 Sertifikater

De TLS-sertifikatene som er i bruk og når de utløper. Utløpsdatoene er poenget: et sertifikat som utløpte på en søndag er en klasse av nedtid som er fullstendig forebyggelig og rutinemessig ikke forebygges.

3.6.4 Aktivitet

Hvem endret hva, og når. Hver konfigurasjonsendring blir registrert, hvilket er hva gjør "det begynte å feile på tirsdag" besvart.

3.6.5 Dataproteksjon

En persons forespørsler under GDPR og UK GDPR, juridiske hold, slettingslogg, oppbevaring og prosessering av aktivitetsrekorder; bare administratorer. Se datatilsyn.

3.6.6 Flåte

Hvert Perfuse-eksempel på en side.

Mirth selger dette som et separat produkt; her er det en konfigurasjonsfil og en skrivebeskyttet token. Grunnen til at det er verdt å ha er smal og viktig: en død server ser ikke ut som en stille en. En enkelt instans' dashboard kan ikke fortelle deg at en annen nettsted stoppet med å rapportere, og en flåtevisning kan.

3.6.7 Migrer

Slipp inn en Mirth- eller OIE-kanal-eksport og se hvor mange av dine kanaler som ville kjøre her uendret. Samme analyse som perfuse explain og perfuse translate, uten å trenge en terminal. Se migration.

3.6.8 Innstillinger

Hver innstilling serveren har, med en kontroll for hver — inkludert de som tradisjonelt bare ville leve i en fil. Hver sier om den trenger effekt med en gang eller trenger en omstart, og om den er satt eksplisitt eller sitter på sin standardverdi.

Innstillingene dekker hver perfuse serve-valg som slår på en funksjon: FHIR-endepunktet og dets versjon, payer-API-ene, PAS og CRD-reglene, X12 278-broen, eCR, SMART-autoriseringsserveren, TLS og signing, målinger, flåte og VPN. De er gruppert som FHIR, Payers, Folkehelse, SMART, Sikkerhet og så videre. Hver er også vist med flagget det korresponderer til.

Omstart fra konsollen. En innstilling merket *Trenger omstart* blir lagret med en gang, men leses bare når serveren starter. Mens noen venter, viser en banner øverst i Innstillinger dem med en Omstart serveren-knapp (signeringseditoren og innstillingfilene tilbyr samme knapp etter en lagring). Den spør først, fordi hver kanal stopper i noen sekunder: hver fullfører meldingen den håndterer, som den gjør når tjenesten stoppes, og sendere sender på nytt hva som ankommer imens. Konsollen venter deretter på at serveren skal svare igjen og leser innstillingene på nytt. Bare en administrator kan omstarte, og hver omstart blir logget i aktivitetloggen som server.restart.

På Linux og macOS erstatter prosessen seg selv med en fersk kopi av samme program og argumenter, og beholder prosess-ID-en, så systemd, launchd eller en container-runtime ser ingenting skje. På Windows starter serveren på nytt inni samme prosess, som holder en Windows-tjeneste under tjenestehåndtereren. Hvis serveren ikke har svart etter to minutter, sier konsollen det; årsaken finnes i serverens logg.

Flagg og innstillingsfilen. Første gang serveren starter, skrives flaggene den fikk med til innstillingsfilen. Deretter er filen viktigere enn flaggene, så endring av en innstilling gjøres i konsollen (eller filen), ikke ved å redigere servicens kommandolinje. Et flagg filen enda ikke nevner, blir registrert når serveren starter med det. Fjerning av et flagg fra kommandolinjen senere vil ikke deaktivere funksjonen: slå den av i Innstillinger.

SNMP har en panel under innstillingene: om agenten svarer og på hvilken adresse, nettverkene det svarer, hvor mange varslingstrapper ble sendt eller mislyktes, og Last ned MIB for basis-OID i bruk. Verdier blir satt under Overvåking, SNMP.

Branding er her også: et nettsted kan sette produktets navn, en slagord, en aksentfarge og laste opp et logo. Logoen vises deretter i headeren, på innloggingssiden, på dashboarden og på rapporteringsskjermbildene. Hvis ingen lastes opp, settes ingenting i stedet — en ubrandet installasjon forblir ubrandet heller enn å tilegne seg dekorasjon.

3.7 Hva fargene betyr

Fire register, og hver sier noe annet. Forskjellen er verdt å nevne fordi det er forskjellen på en skjerm du kan lese på ett blikk og en der alt konkurranse om oppmerksomheten.

Vanlig tekst er en faktum om hvordan Perfuse fungerer. Størsteparten av grensesnittet. Ingen er farget for å fortelle deg at det er viktig.

Grønn betyr at noe lyktes akkurat nå, fordi du gjorde noe. Den vises etter en handling og forsvinner ikke.

Gul er en advarsel: verdt å vite før du handler, og ikke en feil. En funksjon som ikke er slått på, en innstilling hvis endringer er audited, en konvertering som approksimerer heller enn reproduserer, en transport Perfuse håndterer men ikke kan fullt verifisere. Gul er fargen til "les dette før du fortsetter".

Rød betyr at noe er galt akkurat nå. En verdi som ble avvist, en forespørsel som feilet, et sertifikat som har utløpt, en kritisk varsling som utløses. Ingen andre bruker den.

Den siste regelen er hvorfor en skjerm ikke åpner rød. Rød er den eneste fargen som bærer en instruksjon — stopp, og det kan være noe du gjorde — og en skjerm som bruker den på dekorasjon har ingenting igjen å si når inndata faktisk er feil. Dette var ikke alltid sant: brukerskjermbildet åpnet tidligere med "serveren sendte en respons som ikke kunne leses" på hver installasjon som ikke hadde konfigurert passnøkler, og innstillingskjermbildet markerte auditede verdier med samme farge som en avvist en. En test i web/src/RedMeansWrong.test.ts feiler nå hvis en frase som beskriver noe fraværende eller approksimert får en rød stil.

Inni en kodeboks er vokabularet annerledes. Der bærer rød ingen domme i det hele tatt — en HL7-segmentnavn, en XML-element — og er bare en token-type.

4 Kanaler

En kanal er én strøm av meldinger: et sted de kommer fra, valgfrie endringer og ett eller flere steder de går. Den er konfigurasjonsenheten, overvåkingsenheten og driftsenheten. Alt annet i Perfuse eksisterer for å betjene kanaler.

4.1 Anatomi

En kanalfil har disse delene, i rekkefølgen de virker:

DelNøkkelObligatoriskHva den gjør
IdentitetnamejaNavngir kanalen. Må være unik.
DatatypedataTypeneiHvordan meldinger skal tolkes. Standard er HL7 v2.
KildesourcejaHvor meldinger ankommer fra. Nøyaktig én.
FilterfilterneiBestemmer hvilke meldinger som skal aksepteres.
TransformasjonertransformationsneiOrdenerte endringer av meldingen.
DestinasjonerdestinationsjaHvor meldinger går. Én eller flere.

Pluss flere som gjelder for hele kanalen: scripts, shadow, contract, tables, attachments, group og enabled. Hver er i kanalreferansen.

4.2 Én kilde, mange destinasjoner

Denne asymmetrien er bevisst og det er verdt å forstå tidlig, fordi det er den eneste vanligste kilden til forvirring når man kommer fra en annen motor.

En kanal har nøyaktig én kilde. Hvis meldinger ankommer fra to steder, er det to kanaler. Å forsøke å uttrykke det som én kanal produserer en konfigurasjon hvor en feil i noen transport ser lik ut fra utsiden, og hvor de to strømmenes trafikk blandes sammen i statistikken — så et fall i én blir skjult av den andre.

En kanal har et hvilket som helst antall destinasjoner, og de er uavhengige. Én feil stopper ikke de andre, og hver har sin egen kø, sin egen gjentakelsespolitikk og sin egen leveringspost. En melding som nådde tre av fire destinasjoner blir registrert som nettopp det, ikke som en suksess eller en feil.

4.3 Destinasjoner er ikke en kjede

Hver destinasjon mottar meldingen slik den var etter kanalens transformasjoner. En destinasjon mottar ikke utgangen av destinasjonen før den.

Dette er viktig når en destinasjon har sine egne transformasjoner, som den kan. Disse gjelder bare for den destinasjonens kopi. En vanlig feil er å legge en endring på den første destinasjonen og forvente at den andre skal se den.

Hvis du virkelig trenger en kjede — utgangen av én strøm som mates inn i en annen — bruk en kanaldestinasjon, som sender til en annen kanal ved navn. Det er eksplisitt, vises i meldingens historikk som to kanaler, og kan overvåkes som to ting, som en skjult kjede ikke kan.

4.4 Navngiving

Navnet er kanalens identitet overalt: i filen, i meldingslagret, i varslinger, i revisjonsloggen og i URL-en. Å endre det er ikke en omnavngiving; det er en ny kanal, og den gamle kanalens historikk blir under det gamle navnet.

group er separat og eksisterer for å organisere grensesnittet. En gruppe har ingen effekt på atferd, og å gruppere kanaler gjør dem ikke til å dele noe.

På en multi-fasilitetsutbredelse, legg fasiliteten i navnet i stedet for bare i gruppen. Mirth-utbredelser på flere steder drifter pålitelig inn i inkonsistente navngivingskonvensjoner, og punktet hvor det blir smertefullt er en hendelse klokken to om natten hvor kanalisten har fire ting kalt adt-inbound.

4.5 Aktivering og deaktivering

enabled: false stopper en kanal fra å starte uten å slette den. Konfigurasjonen, historikken og statistikken blir.

En deaktivert kanal er ikke en pause. Kilden lytter ikke, så en sender som forsøker å koble til får en avvist tilkobling i stedet for en hengt tilkobling. For MLLP er det riktig atferd — senderen vil køe og gjenta — men det betyr at senderens egen feillogg vil fylles opp, så en deaktivert kanal er ikke en erstatning for å avtale en nedetid med den som sender.

4.6 Hvor kanaler bor

Én YAML-fil per kanal, i katalogen gitt av -channels. Filnavnet er ikke kanalnavnet; name-nøkkelen er. Å holde dem like er sterkt rådet og ingenting tvinger det.

Filer leses på nytt uten omstart. En fil som ikke parseres rapporteres og den tidligere lastede versjonen fortsetter å kjøre, så en syntaksfeil kan ikke ta en fungerende strøm av luften.

En kanal redigert i nettgrensesnittet skrives tilbake til sin fil. Hvis disse filene er i versjonskontroll — som anbefales — forvent commits fra konfigurasjonsendringer gjort gjennom grensesnittet, og rediger ikke en fil samtidig som noen andre har den åpen i byggeren.

4.7 Kryptering av en kanals egen lytter

En kanal som lytter på en port er sin egen server, og dens TLS er separat fra TLS på Perfuses nettgrensesnitt. Å sette den ene betyr ikke at den andre settes. For en HTTP-kilde er innstillingene under TLS og grenser på kilde.

Å slå på TLS ber om et sertifikat og en privat nøkkel. Å kreve en klient-sertifikat gjør det til gjensidig TLS: avsenderen må presentere ett signert av en myndighet du navngir, som er autentisering, så en lytter med det på ikke også trenger en delt token — selv om å ha begge er ikke feil.

Myndigheten spørres bare om en gang en klient-sertifikat kreves, og utelates fra filen til da. En kanal som navngir en myndighet som aldri konsulteres, ser ut som om avsendere verifiseres når de ikke er det.

En MLLP-lytter har samme innstillinger under Krypter denne lytteren, med en forskjell verdt å nevne: på MLLP er et klient-sertifikat den eneste autentiseringen som er tilgjengelig. Det finnes ingen token og ingen header, så en lytter uten ett aksepterer meldinger fra enhver vert som kan nå porten.

To grenser sitter ved siden av det. Gi opp å lese etter en varighet, fordi en avsender som åpner en forbindelse og stopper å skrive ellers holder den åpen. Og største melding akseptert, i bytes, fordi null betyr ingen grense og grensen er da minne — en avsender som poster en gigabyte blir avvist i stedet for å absorbere.

4.8 Validering

En kanal sjekkes når den lastes, og sjekken er nektelser i stedet for advarsler der alternativet ville være en kanal som kjører og gjør feil ting.

Eksempler på ting som blir avvist på en gang: en destinasjon uten type, en transformasjon som addresserer en sti som ikke kan eksistere i den erklærte datatypen, en bekreftelsesmodus som kilde-transporten ikke kan levere, og en Schedule II-resept med refiller.

Forskjellen Perfuse prøver å holde fast ved er at alt som ville produsere et plausibelt feil resultat blir avvist, og alt som bare er uvanlig blir tillatt og rapportert. En kanal som ikke kan være feil er mer verdifull enn en kanal som starter.

5 Meldingsflyt

Dette kapitlet følger en melding fra øyeblikket den ankommer til øyeblikket den leveres eller gir opp på. Å kjenne denne rekkefølgen er den raskeste måten å finne ut hvor en endring hører hjemme, og hvorfor noe ikke skjer.

5.1 Rekkefølgen av hendelser

Arrival de-frame Parse Record as received Filter Transform Destination A Destination B Destination C unparseable filtered Filtered is a normal outcome, not an error. Unparseable is recorded and stops. The acknowledgement is sent after delivery by default, so a sender is not told "received" before it is true.
  1. Ankomst. Kilden aksepterer byteene. For en strømmetransport inkluderer dette de-framing — å finne hvor en melding slutter og den neste begynner.
  2. Parse. Byteene blir et tre i henhold til kanalens dataType. En melding som ikke kan parses, stopper her og registreres som en parse-feil.
  3. Registrer. Meldingen skrives til meldingslagret slik den mottas, før noe modifiserer den. Dette er hva som gjør det mulig å replaye og reprosessere.
  4. Filter. Hvis kanalen har en filter, bestemmer den om å akseptere meldingen. En avvist melding registreres som filtrert, som er en normal utfall og ikke en feil.
  5. Transform. Kanalens transformations kjøres i rekkefølge, hver mot resultatet av den forrige.
  6. Fan out. Hver destinasjon får en kopi av den transformerte meldingen, anvender sine egne transformasjoner hvis den har noen, og leverer.
  7. Registrer utfallet. Per destinasjon: levert, køt, feilet eller filtrert.
  8. Bekreft. Hvis kilden forventer en bekreftelse, genereres og sendes den. Som standard skjer dette her, etter levering — se nedenfor.

5.2 Når bekreftelsen sendes

Dette er den mest konsekvensfulle innstillingen i en kanal, fordi den bestemmer hva avsenderen blir lovet. Det er ack.when, og det har to verdier.

on_delivery er standard. Bekreftelsen sendes bare etter at hver aktivert destinasjon har akseptert meldingen. En positiv bekreftelse betyr derfor at data faktisk ankom et sted, som er den sterkste påstand en motor i midten kan ærlig gjøre.

on_receipt bekrefter så snart meldingen er parsed og køet, før noen destinasjon har blitt skrevet.

Perfuse standarder til on_delivery fordi å love levering og så miste meldingen er verre enn å være langsom. Under on_receipt, en melding som har blitt bekreftet kan fortsatt bli mistet hvis prosessen dør med arbeid køet — avsenderen tror det er levert, ingenting oppstrøms vil sende det igjen, og den eneste rekorden som det eksisterte er i Perfuses eget lager.

5.3 Når å velge on_receipt

Saken for det er reel, og det er tidsfrister. En MLLP-avsender som ikke får en bekreftelse innen noen sekunder vil vanligvis sende igjen, så en langsom destinasjon under on_delivery produserer duplikater i stedet for forsinkelse. Hvis en destinasjon er en langsom arkiv eller et system som regelmessig er utilgjengelig, on_delivery kobler avsenderens tidsfrist til den destinasjonens verste case.

Handelen er eksplisitt: on_receipt overfører risikoen fra duplikater til tap. Å velge dette betyr å akseptere at en bekreftet melding kan gå tapt i tilfelle av en feil, og det er verd å kombinere med varsel om kødybde slik at en kø som har stoppet å tømme blir merket. Se varsel.

Under begge innstillinger, en positiv bekreftelse er ikke en løfte om at mottakende applikasjon har *behandlet* meldingen — bare at den aksepterte byte. Hvis du trenger å vite et resultat ble arkivert, må det komme fra mottakende system, og ingen integrasjonsmotor kan tilby det.

5.4 Hvor meldingen blir registrert

Før filteret, og derfor før noen transformasjon. Tre konsekvenser:

Den transformerte formen blir også registrert, per destinasjon, sammen med utfallet. Så lagret inneholder hva som ankom, hva som ble sendt, og hva som skjedde — som er hva en undersøkelse trenger.

5.5 Feil på hvert steg

StageHva feil ser ut somHva skjer
AnkomstFraming-feil, forbindelse lukket midt i meldingRegistrert, forbindelse lukket, avsender prøver igjen
ParseIkke gyldig for den erklærte typenRegistrert som en parse-feil, negativ bekreftelse hvis kilden forventer en
FilterFilteret selv feilerBehandlet som en nektelse, registrert med feilen
TransformEn steg feilerAvhenger av stegets on_error; se transformasjon
LeverDestinasjon utilgjengelig eller avvistKøet og prøver igjen per destinasjonens policy; se levering

Den viktige asymmetrien: en pars-feil er permanent og en leveringsfeil vanligvis ikke er det. Å forsøke å parsere en umulig melding vil aldri hjelpe, så den forsøkes ikke. Å forsøke å nå en utilgjengelig destinasjon vil vanligvis hjelpe, så den forsøkes.

5.6 Rekkefølge

Innen én destinasjon, meldinger leveres i rekkefølgen de ankom, og en melding som feiler og kommer inn i køen holder sin plass — senere meldinger venter bak den i stedet for å gå forbi.

Dette er standardrekkefølgen for kliniske data, hvor en innleggning fulgt av en utskrivning leveres i feil rekkefølge er verre enn at begge er forsinket. Det betyr også at én forgiftet melding kan holde opp en kø, som er hvorfor kø-dybde er verdt å varsle om.

Mellom destinasjoner er det ingen rekkefølgegaranti, fordi de er uavhengige. To destinasjoner vil ikke nødvendigvis motta samme melding på samme tid, og en rask kan være flere meldinger foran en langsom.

Rekkefølge mellom kanaler er ikke garantert i det hele tatt. Hvis to strømmer må påvirkes i en bestemt rekkefølge i forhold til hverandre, må rekkefølgen påtvings av mottaker-systemet, fordi ingenting i midten kan vite hvilken av to uavhengige ankomne meldinger skjedde først.

5.7 Samtidighet

En kilde kan håndtere flere forbindelser samtidig, begrenset av max_connections. Meldinger fra forskjellige forbindelser prosesseres samtidig.

Dette betyr at ankomstrekkefølgen for to meldinger sendt samtidig ned to forbindelser ikke er definert, og kan ikke være — de ankom faktisk på samme tid. En avsender som trenger rekkefølge må bruke én forbindelse, som er hva de fleste av dem gjør.

6 Transformasjon

Transformasjoner endrer en melding. De er en liste, de kjøres i rekkefølge, og hver enkelt ser resultatet av den foregående.

Perfuses transformasjoner er deklarative: hver enkelt steg navngir en operasjon og feltet det gjelder for. Det finnes ingen skriptspråk i den vanlige banen. Dette er en bevisst begrensning og begrunnelsen er i hvorfor ikke et skript nedenfor.

6.1 Stegene

StegHva det gjør
setSkriver en bokstavelig verdi til en sti, og oppretter den hvis den mangler.
copyKopierer én sti til en annen, med en valgfri standardverdi når kildestien mangler.
clearTømmer et felt, og lar det være til stede.
removeFjerner et felt helt.
mapSøker opp den nåværende verdien i en tabell og erstatter den.
replaceRegulær uttrykk-erstatter innenfor et felt.
padFyller ut en verdi til en fast bredde.
dateKonverterer en dato eller tidsstempel mellom formater.
trimFjerner omgivende hvitrom.
caseKonverterer til stor eller liten skrift.

Hvert steg aksepterer også description, som vises i sporet og i grensesnittet, og when, som gjør stegene betingede.

Et steg skrives som operasjonsnavnet med sin egen blokk:

transformations:
  - description: Our record number, not theirs
    set:
      path: PID-3.4
      value: RIVERSIDE
  - copy:
      from: PID-19
      to: PID-3.1
      default: UNKNOWN
  - map:
      path: PID-8
      table:
        M: Male
        F: Female
set og value er ikke søsken. set tar en blokk som inneholder path og value. Å skrive set: PID-3.4 med value: ved siden av det er den vanligste feilen i en håndskrevet kanal og produserer en last-feil i stedet for en stille miskonfigurasjon.

6.2 Tøm, fjern og forskjellen

clear lar feltet være til stede og tomt. remove fjerner det helt.

For HL7 er denne forskjellen reell og den når mottakeren. Et tomt felt sier "Jeg har dette feltet og det har ingen verdi". Et fraværende felt sier ingenting i det hele tatt. Noen mottakersystemer behandler den første som en instruksjon om å slette deres lagrede verdi og den andre som en instruksjon om å la den være alene — som er forskjellen mellom å slette en pasients registrerte allergi og ikke å nevne den.

Hvis du ikke vet hvilken mottakeren ønsker, spør. Å gjette har en femti prosent sjanse til å ødelegge data på den andre siden uten å varsle om det.

6.3 Betingelser

when tar en uttrykk og trinnet kjører bare hvis det er sant:

  - when: MSH-9.2 == "A08"
    set:
      path: EVN-1
      value: A08

Et steg hvis betingelse er falsk, registreres som skipped, og dette rapporteres separat fra et steg som kjørte og ikke endret noe. Denne distinksjonen er poenget med steg-gjennom-debuggeren og det dekker i feilsøking: en falsk betingelse og et fraværende felt ser identiske ut fra utsiden og betyr motsatte ting.

6.4 Stier

En sti adresserer et felt: PID-5 er det femte feltet i PID, PID-5.1 er dens første komponent, PID-3(2) er den andre gjentakelsen av PID-3 og OBX(3)-5 er det femte feltet i det tredje OBX-segmentet.

To beteender verdt å vite:

6.5 Feil

De fleste trinn har ingenting å feile på. Å sette en verdi, å fjerne et felt eller å kopiere fra en fraværende sti med en standardverdi er alle definert for alle inndata.

date er unntaket, fordi en verdi som ikke er en dato den gjenkjenner, har ingen korrekt konvertering. Den tar on_error:

Standard er fail fordi en tidsstempel som stille ikke konverterer er verre enn en melding som ikke ankom. En dato i feil format ser likevel ut som en dato, så den passer mottakerens validering og havner i rekorden som feil dag.

keep er legitimt når mottakeren tolererer begge format, og når den brukes, markerer sporet endringen som bevisst, så den ikke leser som et trinn som feilet stille.

6.6 Rekkefølge betyr noe, og sporet viser det

Hvert trinn ser forrige trinns utdata. To konsekvenser som fanger folk:

Begge er synlige i steg-for-steg-visningen, som viser hele meldingen etter hver enkelt steg i stedet for bare endringen. Se feilsøking.

6.7 Forslag til mapping, og hva å gjøre med et forslag

AI Mapper foreslår mapping mellom en sett av kildefelter og en sett av mål. Dets definierende atferd er at det avstår: under sin konfidensstørrelse avstår det fra å gjette, fordi en selvsikker feil mapping i et klinisk system er verre enn ingen mapping i det hele tatt.

6.7.1 Gi det noe å være trygg på

Et navn på egen hånd er svak bevis, selv når det matcher nøyaktig. PatientMRN mot PatientMRN scorer 68, som avstår ved standardtørskelen på 70.

The engine knows what an HL7 path means — it will tell you PID-7 is Date/Time of Birth and score your field name against that rather than against the string PID-7, which shares no characters with anything. A locally defined Z segment means whatever your site decided, so nothing is claimed about it.

Det får en mapping nesten hele veien. For å fullføre det, lever både halvdelene:

Med disse, kan motoren se at verdiene er enige med målfeltets type, og et forslag hviler på mer enn et navn.

6.7.2 Godkjenning skjer ett kartlegging til gangen

Hver forslag har sin egen godkjenningsboks. Det finnes ingen «godta alt over 80 %», med vilje: motoren har allerede brukt konfidensen til å bestemme om å tilby kartleggingen, og hva som gjenstår er en vurdering om dette feltet i denne feeden. Et tall er ikke den vurderingen.

En avstemning kan ikke godkjennes i det hele tatt. Den har ingen boks, ikke engang en deaktivert en, og skjermen sier at motoren ikke vet. Hvis du kjenner svaret, kartlegg det manuelt — det er en annen handling enn å gå med på et forslag.

Et forslag under din terskel vises uten en boks også, merket som under den. Verdt å lese — et nærmiss er ofte den kartleggingen du ønsket, og å skjule den ville etterlate deg med å undre deg om motoren vurderte den — men ikke godkjennbar, fordi din terskel er linjen du tegnet.

6.7.3 To ting å gjøre med det du har godkjent

Legg dem til en kanal gjør hver kartlegging til en kopi-trinn. Dette fungerer bare der kilden er en sti i meldingen, slik som ZPI-1, fordi et trinn kopierer fra ett sted i en melding til et annet. Trinnene går inn i kanal-filen og treffer når den neste lastes — ingenting endrer seg i trafikken før da. Hver trinns beskrivelse registrerer konfidensen det ble foreslått med og at en person godkjente det, som er det som gjør det ansvarlig seks måneder senere.

Last ned som en oppskrift er det riktige svaret for den vanligere casen: en kartlegging fra en kolonne-navn, en JSON-nøkkel eller en leverandørs eget felt-navn. Disse er ekte kartlegginger, og en kanal kan ikke lese slike felt direkte, så et trinn kan ikke uttrykke dem. Oppskriften registrerer dem som godkjent og kan deles.

6.8 Hvorfor ikke et skript

Mirth setter en JavaScript-omformer i midten av hver kanal, og det er den mest fleksible designet som er tilgjengelig. Perfuse tilbyr skripting — se scripts-nøkkelen i kanal-referansen — men gjør det ikke til den vanlige stien, av tre grunner som kommer fra hva som går galt i praksis.

Et deklarativt trinn kan inspiceres. Perfuse kan si deg at et trinn leser PID-5 og skriver PID-8, før det kjøres, og kan derfor vise en felt-nivå-sporing, advare om at et trinn adresserer en sti som den erklærte datatypen ikke kan inneholde, og generere en per-trinn-replay. Ingen av dette er mulig for arbitrær kode.

Et deklarativt trinn kan resonereres om av grensesnittet. Byggeren kan tilby feltene som finnes i denne kanalens trafikk, og en endring av et trinn kan sjekkes mot ekte historiske meldinger før det lagres.

Og et deklarativt trinn kan ikke gjøre noe uavhengig av meldingen. Et skript kan ringe ut til nettverket, lese filsystemet eller avhenge av tid på dagen. Når en kanal som fungerte i to år begynner å produsere feil output, er årsaken utenfor meldingen den hardeste casen å diagnostisere, og å fjerne muligheten er verdt mer enn den fleksibiliteten det koster.

Der en ekte transformasjon ikke kan uttrykkes deklarativt, bruk et skript og aksepter at sporingen vil vise det som ett uigjennomsiktig trinn.

6.9 Hva et skript er tillatt å gjøre

Et skript er nektet alt utenfor meldingen med mindre det er gitt, og tillatelsene er på Skript-delen av byggeren. Dette er med vilje ulikt Mirth, som gir hver skript alle — så der, kan en omformer stille lese filsystemet etter en kopi-og-lim-inn.

Det finnes tre.

Les og skriv filer krever at du navngir katalogene det kan bruke, og en kanal som gir fil-tilgang uten dem blir nektet ved lasting. Denne kravet er hele forskjellen mellom fil-tilgang og ubegrenset fil-tilgang: å gi det uten kataloger en gang nådde hele filsystemet, inkludert Perfuses egen database, som holder passord-hashes, LDAP-tjenestekonto-passord og OIDC-klient-hemmelighet. Å opprette en kanal trenger bare redaktør-rolle, så eskaleringen fullførtes øyeblikket en administrator startet kanalen.

Spørr en database bruker koblingene konfigurert på kanalen. Et skript med dette kan lese alt disse legitimasjonene kan.

Rute meldinger til andre kanaler lar et skript sende en melding inn i en annen kanal, som er hvordan en løkke mellom to kanaler blir mulig.

Å gi en evne til en kanal uten skript gjør ingenting, og den genererte filen utelater hele blokkene i det tilfelle.

6.10 Håndtering av en dato som ikke matcher sin format

Et dato-trinn konverterer fra ett format til et annet, og det interessante spørsmålet er hva som skjer når en verdi ikke matcher formatet det hevder.

Standarden er å stopp meldingen, og det er riktig standard: en tidsstempel som stille ikke konverterer er akseptert nedstrøms og deretter misforstått, som er verre enn en melding som feilet høyt og sitter der noen kan se det.

La verdien være som den er passerer den gjennom i sitt opprinnelige format. Nedstrøms ser deretter to formater i ett felt, som er feilen trinnet eksisterte for å forhindre — men det er riktig valg der feltet er valgfritt og en partner sender det inkonsekvent.

Tøm feltet er ærlig og bedre enn et feil format, men en mottaker som krever feltet avviser deretter meldingen i stedet.

6.11 Skriptspråkene

Tre er akseptert, og hvilken en som skal velges avhenger hovedsakelig av om du migrerer. Verdien går i en skripts language-nøkkel:

VerdiHva det er
javascriptStandard. Et uskrevet skript er JavaScript.
luaBedre valg når ingen migrerer.
wasmByte av et kompilert WebAssembly-modul, ikke kilde.

JavaScript er standard, og et uskrevet skript behandles som JavaScript. Det er her som en kompatibilitetsforpliktelse snarere enn et valg: Mirths skript er JavaScript og en nettsted som flytter over har tusenvis av linjer med det. Dette inkluderer støtte for E4X, en utdødde utvidelse av språket som Mirth-skript bruker for XML og som må oversettes før noe vil parse det.

Lua (lua) er bedre valg for alle som ikke migrerer. En mindre kjøretid, ingen prototype-kjede å misbruke, og heltallsindekserte tabeller som matcher segment- og feltadressering mer naturlig enn JavaScripts gjør. Dets standardbibliotek er små nok til å oppramse, hvilket er hva som gjør sandkassen lettere å være trygg på.

WebAssembly (wasm) er ikke et språk, men et kompilert modul, og feltet ønsker byte av en .wasm-fil i stedet for kilde. Bruk det når transformasjonen allerede eksisterer i et kompilert språk, eller når det er tungt nok til at kjøretidkostnaden teller.

Dets kontrakt er bevisst den enkleste tilgjengelige: et modul leser meldingen på standardinngang og skriver resultatet til standardutgang. Byte inn, byte ut — hvilket er hva hver verktøykjedde allerede gjør, og hva noen som tester et modul på sin egen kommandolinje allerede har. Alternativet var en eksportert funksjon over lineær minne, som er raskere og krever at hver modulforfatter er enig om allokering, strengkoding og hvem frigjør hva; for noe som kjører én gang per melding, er den handelen ikke verdt det.

Alt et modul skriver til standardfeil blir loggliner, så det kan forklare seg selv på samme måte som et skript som kaller logger kan.

En ikke-null utgang betyr at modulen *feilet*, som ikke er det samme som et filter som bestemmer å avvise en melding. Et filtermodul sier true eller false på standardutgang. Å blande de to ville gjøre et krasjende modul u skillet fra ett som bevisst dropper trafikk.

6.11.1 Hva utgangen betyr

Reglene er de samme for alle tre språkene i stedet for nye for hver kjøretid, så et skripts observerbare atferd — hva det kan se, hva det kan gjøre, hvor lenge det kan ta, hva et filterutslag betyr — er definert én gang.

For en transformer, forprosessor eller skriver, tom utgang betyr at meldingen er uendret. Å falle av slutten av et skript lar meldingen være alene; å behandle ingen utgang som "meldingen er nå tom" ville kaste trafikk på en teknisitet.

WebAssembly-moduler er kompilert når kanalen lastes, ikke på den første meldingen. Kompilering er ikke gratis — et modul bygget fra et språk som bringer sin egen kjøretid kan ta hundrevis av millisekunder — og å betale det på lasttid betyr at den første meldingen gjennom en kanal ikke er mystisk langsommere enn resten.

6.12 Felles karttabeller

Den andre halvdelen av samme problem: en steds kjønnskoder og pasientklasser oversettes identisk i hver kanal som berører dem, og en tabell inne i en kanal er en tabell bare den kanalen kan bruke.

# codes.codeset.yaml
tables:
  - name: sex-to-lab
    describes: the hospital's sex codes into the numeric codes the lab expects
    decided_by: Dave, during the 2019 migration
    decided_on: 2019-04-11
    source: the lab's interface specification, version 3
    entries:
      - from: M
        to: "1"
      - from: U
        to: "9"
        why: the lab has no 'unknown', and 9 is its 'not stated'
# in the channel
tables:
  - codes.codeset.yaml
transformations:
  - map:
      path: PID-8
      use: sex-to-lab

Provenansen er poenget. Det meste av hva som gjør et grensesnitt vanskelig å vedlikeholde er at ingen vet *hvorfor* en mapping er slik den er, og personen som visste har forlatt. En mapping med en grunn kan diskuteres; en uten blir noe ingen våger å endre og ingen våger å slette.

Tabeller opprettes og endres på Build → Tabeller samt i filen. Å lagre en aktiv tabel omstarter de kjørende kanalene som laster inn filen, så den neste meldingen bruker den; en utkast omstarter ingenting.

6.12.1 Versjoner og effektive datoer

En tabell kan holde flere utgaver under ett navn, hver med sin egen version. Utgaven en melding bruker, velges når meldingen ankommer: blant de godkjente utgavene hvis datoer dekker denne dagen (UTC), den som startet senest. Så en kodeendring som er enige om for første dagen i neste måned, blir nå innført og overtar på egen hånd.

tables:
  - name: sex-to-lab
    version: "3"
    effective_from: 2026-11-01   # optional; empty means from the start
    effective_until: 2027-10-31  # optional; the last day it applies
    source_system: urn:local:hospital-sex
    target_system: http://terminology.hl7.org/CodeSystem/v2-0001
    entries: [...]

6.12.2 Godkjenning

Med Innstillinger → Data → Karttabeller "Endringer i en karttabell trenger en annen persons godkjenning" (data.tableApproval) på, blir hver lagring et utkast, og personen som lagret den, kan ikke godkjenne den: noen andre gjør det, eventuelt med dagen det kommer i kraft. En godkjent utgave kan ikke redigeres på stedet; Ny versjon fra denne kopierer den inn i neste versjon. Godkjenning, pensjonering og sletting av et utkast skrives til revisjonsloggen, og godkjenning starter om de kjørende kanalene som laster filen.

6.12.3 Verdier ingen tabel matcher

Hver verdi en kartsteg så etter og ikke fant, blir telt, per tabell, med kanalene den kom gjennom og når den ble først og sist sett. Skjermbildet Tabeller lister dem, mest frekvent først. Kart den åpner tabellen med den verdien allerede lagt til som en rad; Fjern fjerner den til den blir sett igjen. Verdier lengre enn 64 tegn blir ikke registrert (de er ikke koder), og listen holder hva som ble sett innen meldingsretensjonsperioden. Listen blir holdt i terminology.db ved siden av hoveddatabasen.

6.12.4 Kodesystemer

Publiserte kodesystemer kan importeres fra deres utgivere sine egne filer, under Kodesystemer på Tabelloverlappings-skjermen (admins) eller med POST /api/terminology/import?format=… og filen som innholdet:

FormatFilSystem
loincLoinc.csv fra LOINC-tabelutgivelsenhttp://loinc.org
icd10cmCMS-ordrefilen (icd10cm_order_*.txt) eller kodefilenhttp://hl7.org/fhir/sid/icd-10-cm
rxnormRXNCONSO.RRF fra RxNorm fullutgivelsenhttp://www.nlm.nih.gov/research/umls/rxnorm
snomedRF2-beskrivelsessnapshot (sct2_Description_Snapshot-en_*.txt)http://snomed.info/sct
snomed-rf2en hel SNOMED CT RF2-utgavepakke (zip-filen en nasjonal utgiver publiserer)http://snomed.info/sct, versjon http://snomed.info/sct/{module}/version/{date}
clamlen ClaML-fil: WHO ICD-10, ICD-10-GM og OPS (BfArM), CIM-10 FR (ATIH)fra filens tittel, eller det gitt system
icd11WHO ICD-11 MMS enkel tabulering (tab-separert, med Code og Title-kolonner)http://id.who.int/icd/release/11/mms
csven hvilken som helst avgrenset fil, med system, codeColumn og displayColumn (CPT, HCPCS, lokale koder, nasjonale tabeller)det gitt system

Ingen følger med Perfuse: LOINC, SNOMED CT, RxNorm og CPT har hver sine egne lisenser, og skjermen ber importereren bekrefte at organisasjonen har lisensen (registrert med importen). Importerte koder brukes på tre måter:

de lagres, og koder som ikke er i systemet listes på utgaven;

for dem (se FHIR-tjenerens alternativer). ICD-10-CM-koder aksepteres med eller uten punktum.

Nasjonale utgaver og klassifiseringer. En SNOMED CT-utgave importeres fra hele RF2-pakken: begreper med deres faktiske status, hver aktiv beskrivelse og språkreferansesettene. Utgaven finnes fra pakken (den nasjonale modulen med flest begreper; edition navngir den i stedet) og blir versjons-URIen. language velger hvem som foretrukket betegnelse er for hvert begrep (sv, da, nl, de, fr, en-GB, en-US ...; engelsk ellers), og hver språks foretrukne betegnelse og fullt spesifisert navn beholdes som betegnelser: $lookup returnerer dem, og dens displayLanguage velger en (de-CH falter tilbake til de). Utgavene Perfuse navngir (Internasjonal, UK, Tyskland, Nederland, Sverige, Danmark, Belgia, Irland, Norge, Sveits, Estland, Spania) er listet av GET /api/terminology/editions, modul-IDene ikke sjekkes mot en publisert kilde merket som slik; noen andre utgave importeres også, navngitt av sin modul.

ClaML-filer leses i UTF-8, ISO-8859-1, ISO-8859-15 eller Windows-1252, som deres XML-erklæring sier. Hver kategoris tittel er dens foretrukne rubrik (innlemmet terminologi inkludert); en modifiserer (en femte karakter for stedet for en fraktur, for eksempel) gjør kodene den legger til, med modifisererens tittel etter kategoritittelen, med mindre kategorien ekskluderer den; blocks=true importerer kapitler og blokker også. ICD-11-tabellens kolonner finnes ved navn, siden deres rekkefølge har endret seg mellom utgaver, og bindestrekene som viser dybde fjernes fra titler. En avgrenset fil tar delimiter (, ; | eller tab), encoding (utf-8, iso-8859-1, iso-8859-15, windows-1252) og noHeader=true`, med kolonner nummerert fra 1 deretter. Konsollen tilbyr innstillinger for UK ICD-10 5. utgave og OPCS-4-filer (TRUD), Frankrikes CIM-10 FR-tabel over etiketter (ATIH) og en ICD-10-BE-eksport; deres forlag dokumenterer ikke alle kolonnene, så sjekk dem mot filens header.

Virkningsdatoer. effective=YYYY-MM-DD importerer en versjon nå og bruker den fra den dagen (ICD-10-GM, for eksempel, hver 1. januar): inntil da svarer en oppslag som ikke navngir noen versjon med versjonen som allerede er i kraft, og skjermen viser datoen.

ICD-11 fra WHO. Med en klient registrert på icd.who.int (Innstillinger → Data → Kodesystem, serve -icd11-client-id og -icd11-client-secret; -icd11-release, 2025-01 som standard), ICD-11-koder som ikke er importert søkes i WHO ICD API (codeinfo, deretter enhetens tittel) og beholdes i en dag. En postkoordinert kode (NC72.2&XK9K) sjekkes hel, så en kombinasjon ICD-11 ikke tillater, avvises, og dens visningsnavn hver del ("Brudd i halsen på femur (Høyre)").

ICD-11 uten å sende koder ut. WHO publiserer samme API som en container (whoicd/icd-api, gratis, Intel og Arm). Kjør den på ditt eget nettverk og gi dens adresse (serve -icd11-url http://icd-api.local, eller ICD API-adresse i samme innstillinger); ingen klient er nødvendig og ingen kode forlater ditt nettverk. Testet mot denne containeren (versjon 2.6.0, utgivelse 2025-01 på engelsk og fransk).

7 Filtrering

Et filter bestemmer hvilke meldinger en kanal aksepterer. Det er ett uttrykk på kanalen, evaluert etter at meldingen har blitt parsert og registrert, før noen transformasjon.

filter: MSH-9.1 == "ADT" && MSH-9.2 in ("A01", "A03", "A08")

Et melding som filteret avviser, blir registrert med resultatet filtered. Dette er et normalt resultat, ikke en feil, og det utløser ikke en advarsel eller produserer en negativ bekreftelse.

7.1 Filtrert er ikke feilet

Denne distinksjonen er verdt å være fast på fordi å blande dem sammen er hvordan et reelt problem blir skjult.

En filtrert melding ble riktig avvist: den var ikke for denne kanalen. En feilet melding var en som denne kanalen skulle ha håndtert og ikke kunne. Hvis begge ble registrert på samme måte, ville en kanal som starter med å feile hver melding se ut akkurat som en kanal som filtrerer mesteparten av trafikken, som er den normale tilstanden for mange kanaler.

Så statistikken teller dem separat, advarselreglene behandler dem forskjellig, og grensesnittet viser dem i forskjellige farger. En økning i filtrerte meldinger kan bety at avsenderen har startet å sende noe nytt; en økning i feil betyr at noe er feil.

7.2 Hva et filter kan lese

Ethvert felt i den parsede meldingen, ved samme stier som transformasjoner bruker. Filteret kjører før transformasjoner, så det ser meldingen slik den ankom — ikke slik den vil bli sendt.

Denne rekkefølgen er bevisst. Et filter som leser post-transformasjonsverdier ville være å bestemme om å akseptere en melding basert på endringer gjort under antagelse av at den var akseptert, som er sirkulær og produserer kanaler hvis oppførsel avhenger av rekkefølgen på to ting som ser uavhengige ut.

7.3 Uttrykk

Sammenligninger: ==, !=, og for tall <, <=, >, >=.

Medlemskap: in ("A01", "A03"), som er klarere enn en kjede av || og er formen byggeren produserer.

Kombinasjon: &&, ||, og parenteser. Negasjon med !.

Fravær: en sti som ikke er til stede sammenlignes ulikt med noen verdi, inkludert den tomme strengen. For å teste for fravær eksplisitt, sammenlign mot absent. Dette er viktig fordi et fraværende felt og et tomt felt er forskjellige, som beskrevet i transformasjon, og et filter som behandler dem likt vil akseptere meldinger det var skrevet for å ekskludere.

7.4 En feil i filteret er en nektelse

Hvis filteret selv feiler å evaluere — et ugyldig uttrykk som kom forbi validering, eller en sammenligning som ikke kan gjøres — blir meldingen nektet og feilen blir registrert mot den.

Nektelse i stedet for aksept er det tryggere av de to, men ingen av dem er god, og resultatet blir registrert forskjellig fra et vanlig filternektelse så det kan varsles på. Et filter som feiler på hver melding er stille og slipper hele strømmen, og det må ikke se ut som et filter som fungerer.

7.5 Filtrer ved kilde hvor du kan

Et filter kjører etter at meldingen har krysset nettverket og blitt parsed. Noen kilder kan filtrere tidligere og billigere:

Filtrering ved kilde er en ytelsesbeslutning, ikke en korrekthetsbeslutning, og det har en kostnad: en melding som filtreres ved brokeren blir aldri registrert av Perfuse, så den vises ikke i meldingslagret og kan ikke inspiceres senere. Hvis du trenger å kunne bevise hva avsenderen sendte, filtrer her i stedet for der.

7.6 Testing av et filter

Et filter kan sjekkes mot virkelig historisk trafikk før det blir lagret. Grensesnittet rapporterer hvor mange av de siste N registrerte meldinger filteret ville akseptere, avvise og feile på — som er den raskeste måten å finne ut at et uttrykk som ser riktig ut aksepterer ingenting.

Sporet viser også, per melding, hvilke felt filteret leste og hva verdier den fant. Et filter som uventet avviser alt er vanligvis å lese en sti som ikke eksisterer i denne strømmen, og sporet navngir den.

8 Meldingsformater

En kanals dataType bestemmer hvordan bytes blir en melding. Det påvirker parsing, hva stier betyr, hvordan meldingen skrives tilbake ut, og hvilke transformasjoner som er gyldige.

VerdiFormat
hl7HL7 v2, standarden med pipe-skilte verdier. Standardverdien.
hl7v3HL7 v3 og CDA-dokumenter, som er XML.
x12ASC X12, brukt for kvalifisering og krav.
ncpdpNCPDP Telekommunikasjonsstandard D.0 apotekkrav.
scriptNCPDP SCRIPT, elektroniske resepter. XML.
dicomDICOM-bildeobjekter.
delimitedCSV og andre skilte tekstfiler.
rawIngen parsing. Bytes inn, bytes ut.

8.1 HL7 v2

Standardverdien, og det som de fleste eksemplene i denne håndboken bruker. Segmenter avsluttes med linjeskift, felt med |, komponenter med ^, gjentakelser med ~.

To ting om kodingen er verdt å vite fordi de kan forårsake stille feil.

Skilletegnene er ikke faste. De er erklært i MSH-1 og MSH-2 i hver melding, og Perfuse leser dem fra der i stedet for å anta pipes. En avsender som bruker en annen feltseparator parser korrekt.

Konsekvensen er at en melding hvis separatorer har blitt erstattet — oftest av en tekstbehandler eller e-postklient som erstatter typografiske likhetstegn — parser perfekt inn i felt som alle er feil. Ingen feil oppstår. Dette er hvorfor eksempel-leseren beskrevet i testing rapporterer hvilket separator-tegn den fant, og nekter å uttrykke tillit når det er uvanlig.

Når noen sender deg et eksempel og kanalen bygget fra det produserer nonsens, sjekk separatorene før noe annet. Be om en vanlig tekstvedlegg i stedet for en melding limt inn i en e-postkropp.

8.2 HL7 v3 og CDA

XML i stedet for skilte. Stier er element- og attributtpunkter i stedet for feltstillinger.

I v3 er en verdi nesten alltid et attributt i stedet for elementtekst. En sammenligning som bare leser elementtekst vil rapportere to dokumenter som identiske når fødselsdatoen, kjønnet og hver identifikator skilles. Perfuses sammenligning leser både, og dette er hvorfor: alternativet lykkes stille.

hl7v3-valg er i format-referansen.

8.3 X12

Segmenter avsluttes med ~ konvensjonelt, med skilletegn erklært i ISA-segmentet. Liksom HL7, leses de fra meldingen i stedet for å antas.

X12s struktur er konvolutter innen konvolutter — utveksling, funksjonell gruppe, transaksjonssett — og en enkelt utveksling kan holde mange transaksjoner.

Som standard er en utveksling en melding. Hele filen får en post, ett resultat og en rad i grensesnittet, uansett hvor mange transaksjoner den inneholder.

8.3.1 Mirths X12-XML

Mirth Connect og Open Integration Engine viser X12 som XML: en rot X12Transaction (eller EDIMessage når innputt ikke starter med ISA) som bærer grenseverdier som attributter, og ett element per segment og element navngitt ISA.01, NM1.03.1 osv. Kanaler og mottakere bygget for Mirth leser og skriver denne formen. Perfuse leser og skriver samme form:

Formatet ble skrevet fra Open Integration Engine 4.6s observerte utdata og publisert format, og sjekkes mot det: 25 genererte interchanges og 4 beholdte eksempler kommer ut byte for byte som OIE skriver dem, og tilbake (se verifisering). En DOCTYPE avvises, som i hver XML Perfuse leser.

8.3.2 Deling av en utveksling

Innstilling av split gjør hver transaksjonssett til en melding i eget rett, med sin egen post, sine egne målinger og sin egen rad. En operatør som søker etter ett krav finner da ett krav i stedet for en fil med fire hundre.

Det er av som standard fordi å slå det på multipliserer alt nedstrøms — meldings teller, rader, varslingstrøskler — og en terskel innstilt for filer som plutselig teller krav, vil ikke bety det samme som tidligere. Det bør være en beslutning noen tok, i stedet for en standard de arvet.

split og acknowledge kan ikke begge være satt, og en kanal med begge blir avvist under lasting. En bekreftelse er en uttalelse om en hel utveksling, så deling ville sende en per transaksjonssett, og en partner som mottar flere 999 som navngir samme funksjonell gruppe, har ingen måte å forlike dem på.

8.3.3 Når tellingene ikke stemmer overens

X12 erklærer sine egne tellinger — hvor mange segmenter, hvor mange transaksjoner — og envelope-nøkkelen sier hva som skal gjøres når de ikke stemmer overens med hva som faktisk er til stede. Disse tellingene er den eneste mekanismen X12 har for å oppdage at halve kravfilen ankom.

VerdiAtferd
requireAvvis utvekslingen. Standardverdien.
warnBehandle den, og registrer feilen mot meldingen.
ignoreSjekk ikke i det hele tatt.

warn eksisterer for en reell situasjon: noen partnere sin programvare har generert feil tellinger i år i ellers fullstendige filer, og en nettsted som må behandle dem, trenger en måte å si det høyt i konfigurasjonen i stedet for å slå av validering helhetlig.

ignore er navngitt for å være ubehagelig. Innstilling av den kaster bort den eneste måten X12 gir deg for å merke en avkortet fil, og en avkortet kravfil er ikke å skille fra en liten en.

8.3.4 Transaksjoner Perfuse leser som strukturert data

Enhver X12-utveksling kan rutes, filtreres og adresseres etter sti. Disse transaksjonene parses også til navngitte felt, så en kanal kan spørre hva en betaler bestemte, i stedet for hvilket element sitter på posisjon fire.

TransaksjonHva den inneholder
835Refusjonsråd: hva som ble betalt, hva som ble avvist og justeringsårsaker.
275Kravvedlegg: klinisk dokumentasjon som støtter et krav.
277Kravstatus, inkludert en betalers forespørsel om ytterligere dokumentasjon.
278Forhåndsgodkjenning: forespørselen om gjennomgang og betalerens avgjørelse.
999Funksjonell bekreftelse, som Perfuse også genererer.
271Kvalifisering: om en pasient er dekket, og deres selvbetaling, selvdekkende, fradragsbeløp og utenfor nettverksbeløp, innenfor og utenfor nettverk.
834Registrering: medlemmer lagt til, endret og avsluttet, med hver dekning linje og dens datoer.
837Krav, profesjonell og institusjonell (les for CMS-0057's CARIN-omforming).

Perfuse bygger også 270-rettighetssøknaden og 276-kravstatusforespørselen, under Betaler → Krav & godkjenning eller gjennom POST /api/x12/eligibility/build og /api/x12/claimstatus/build. Begge er HIPAA 5010-versjonene (005010X279A1, 005010X212), lest tilbake og konvolutfunksjonskontrollert før de vises, og ingen av dem sendes fra denne siden: å levere en er en kanals jobb, der handelspartnern og dens legitimasjon er.

8.3.5 Kvalifisering og CAQH CORE datainnholdregel

En 271 er en liste over EB-segmenter, hver enkelt faktum: aktiv dekning, eller en $25-kontantbetaling for tjenestetype 30 i nettverk, eller $800 av den enkeltes fradragsbeløp igjen. Leseren setter dem sammen til svaret en resepsjon ønsker - "dekning aktiv under Gold PPO 2000; kontantbetaling i nettverk $25; enkeltfradragsbeløp igjen i nettverk $800" - og navngir en avvisning (et AAA-segment) i ord, med hva betaleren sier å gjøre neste.

Den sjekker også svaret mot CAQH CORE Eligibility & Benefits datainnholdregelen: for en søknad om helseforsikringsdekning (tjenestetype 30), skal en aktiv respons medføre plan datoer, plan navn, kontantbetaling, selvbetaling, fradragsbeløp og igjen fradragsbeløp både i og utenfor nettverk, og basis tjenestetyper (1, 33, 35, 47, 48, 50, 86, 88, 98, AL, MH, UC). Hver er listet som møtt eller mangler. Dette er Perfuses lesning av regelen, nyttig for "hvorfor forteller denne betaleren oss aldri fradragsbeløpet?" - det er ikke CORE-godkjenning, som CAQHs autoriserte testleverandører utfører.

8.3.6 Forhåndsgodkjenning

Perfuse implementerer forhåndsgodkjenning to ganger, med vilje.

Den FHIR-siden er hva CMS-0057-F krever at betalere eksponerer fra 1. januar 2027. Den 278 er hva betalere aksepterer i dag, og regelen erstatter den ikke — Da Vinci PAS er i praksis en mapping til denne transaksjonen, fordi en 278 er hva en utnyttelsesstyringssystem snakker. En motor som bare leser den FHIR-halvdelen kan snakke med systemene som vil eksistere og ikke med de som gjør.

En 278-respons inneholder godkjenningnummer, og det er feltet hele transaksjonen eksisterer for å levere. Uten det er en sertifisert tjeneste ikke fakturerbar: kravet går inn uten godkjenningnummer og avvises for mangelen på ett, som les nedover som en klinisk avvisning.

En avvisning og en nektelse til å vurdere er ikke det samme

Dette er den dyreste forvirringen i transaksjonen, og Perfuse rapporterer de to separat.

Hva ankomHva det betyrHva å gjøre
HCR med handling A3Betaleren vurderte forespørselen og vil ikke godkjenne den.Anke, eller endre behandlingsplanen.
Et AAA-segmentBetaleren ville ikke vurdere den — pasient ikke funnet, forespøreren ikke gjenkjent, gjennomgang ikke dekket. Ingenting ble avgjort.Rett forespørselen og send den igjen.

Begge leses som "ikke godkjent" for enhver som scannrer, og de riktige handlingene er motsatte. Å anke noe som ingen har avgjort, fører ikke til noe; å sende inn en avslag på nytt, resulterer i samme avslag. De parsede resultatnavnene som skjedde — denied mot not-considered — og AAA04 inneholder forsikrers egen råd om hvorvidt forespørselen er tilbakekrevbar overhodet.

Delvis sertifisering rapporteres som partially-certified i stedet for å bli innlemmet i godkjenning. Det finnes en autorisasjonsnummer å fakturere mot, så det teller som godkjent, men mengden sertifisert er ikke mengden som ble forespurt — og en praksis som booker seks sesjoner mot tre godkjente oppdager det ved den fjerde kravet.

En handlingkode Perfuse ikke gjenkjenner, rapporteres som unknown, ikke som pending. Pending leses som "vent", og venting er feil handling for det meste av hva en ikke-gjenkjent kode kunne være.

En kanal kan rute på avgjørelsen direkte:

filter: HCR-1 == "A3"

Omforming mellom de to

Perfuse omformer en parsed 278 til en Da Vinci PAS ClaimResponse, og rapporterer hver enkelt vurdering omformingen trengte i stedet for bare resultatet. Omformingen følger tre regler:

Innsnevring til en tre-tilstands-vokabular — godkjent, avvist, ventende — er tilgjengelig og eksplisitt om hva den kasserer. Innsnevring av et avslag på å vurdere, gir "avvist" og sier i ord at den riktige handlingen er en korrigert gjeninnsending i stedet for en anke.

Kontrollert mot PAS 2.2.1, ikke bare mot seg selv

ClaimResponse er formet til Da Vinci PAS 2.2.1-profilen og ble kontrollert med den offisielle HL7-validereren lastet med den publiserte PAS-pakken. Den første versjonen hadde bare blitt kontrollert av Perfuses egne tester, og validereren avviste den med seks til åtte feil per ressurs. Hver enkelt av dem er noe en betalers PAS-endepunkt også ville ha avvist:

Hva som var feilHvor PAS plasserer det
Beslutningen var i adjudication.category og reason.reviewAction-utvidelsen, på en adjudikasjon hvis kategori er submitted.
Årsaks-koden med navn X12-element 1034.X12 ekstern kode liste 886.
En ventende forespørsel svarte outcome: queued.outcome handler om prosessering og PAS tillater bare complete, error og partial. En ventende er complete, med gjennomgangshandling A4.
processNote.type var en CodeableConcept.R4 har en kode: print.
patient, created, insurer og request manglet.Alle fire er påkrevde. De gis som identifikator-referanser, fordi svaret står alene i stedet for i en samling.

Den korrigerte utdataen validerer uten feil for en sertifisering, et avslag og en ventende. Advarselen som gjenstår er validereren som sier at den ikke kan laste X12s kode-systemer, som X12 lisenser. Autorisasjonsnummeret er båret i reviewAction.number, hvor guidens eget eksempel plasserer det, og i preAuthRef når svaret bare har ett.

Validereren er ikke en del av make check, fordi den trenger Java og en nedlasting av guiden og dens avhengigheter. Hva den fant, holdes av en test i stedet: hver regel den tvang frem, hevdes, så en endring som gjeninnfører en av disse feilene, feiler.

Krav & auth-visningen konverterer en limt 278 og viser beslutningene, notatene og ressursen.

8.3.7 Vedlegg og hvorfor de trenger spesiell håndtering

CMS-0053-F gjør 275 til en HIPAA-standard for krav-vedlegg, med overholdelse påkrevd fra 26. mai 2028. Den bærer et dokument — en operativ notat, en bilde-rapport, en skannet skjema — knyttet til kravet det støtter.

277 er den andre halvdelen av samme samtalen. En betaler mottar et krav, bestemmer at det trenger dokumentasjon, og sender en 277 som ber om det; leverandøren svarer med en 275.

En kanal kan rute på status-koden direkte, fordi STC01 er en sammensatt og dens andre komponent er status. Skrevet i kanonisk form, fordi en komponent er adressert med en punktum og de to notasjonene ikke kan blandes — STC-1.2 er element 1, komponent 2:

filter: STC-1.2 in ("227", "233", "252", "287")

Disse er kodene som uansett betyr at et dokument er ønsket. Status kategori i STC-1.1 er med vilje ikke brukt på egen hånd: R4 betyr en dokument-anmodning i noen implementeringsguider og "videreformidlet andre steder" i andre, så en filter på kategorien alene ville plassere ferdigstilte krav i køen for noen å jakte.

To identifikatorer bestemmer om et vedlegg noen gang assosieres med sitt krav, og begge rapporteres: vedlegg-kontrollnummeret, som leverandøren plasserte på det opprinnelige kravet for å si at dokumentasjon ville følge, og sporing-nummeret, som matcher betalers anmodning. Et vedlegg som ankommer med ingen av dem, blir arkivert og aldri koblet til noe, mens kravet eldes.

Et dokument inne i en 275 er ikke tolket. Perfuse rapporterer dens bytes og hva avsenderen sier de er. Et vedlegg kan være en PDF, en TIFF, en CDA-dokument eller en HL7-melding, og en kanal som trenger innholdet, kan overføre disse byte til formatet som leser det.

006020-skjemaet, som er det regelen antar

CMS-0053-F antar versjon 006020, og dens 275 skiller seg fra 005010-skjemaet på to måter som betyr noe.

Perfuse pakker ut enheten og rapporterer dokumentet inne i den, med innholdstypen og filnavnet. Bytesene den rapporterer er nøyaktig de samme som avsenderen pakket inn. En enhet som ikke kan pakkes ut lar den rå payloaden være på plass, med en notis som sier hvorfor.

Bygging av en 275. Perfuse bygger også 006020X314-vedlegg: et uoppfordret vedlegg som følger en krav, eller et svar på en betalers 277-forespørsel. Forskjellen er BGN01 02 mot 11, og om TRN02 bærer kravets PWK06 eller 277-forespørselens TRN02. Hvert bygget utveksling parses tilbake før det returneres, og svaret sier om dokumentet inne er det samme som gikk inn.

Strukturen kommer fra de to publiserte companion-guidene for 006020X314: CMS esMD-guiden og UnitedHealthcares. Den kommer ikke fra X12-teknisk rapport, som X12 lisenser og som dette prosjektet ikke har.

Det er ingen validering mot den tekniske rapporten. Partnerens companion-guide styrer.

8.3.8 Elektroniske signaturer på vedlegg

CMS-0053-F tar også i bruk en signaturstandard, på 45 CFR 162.2002(e): HL7 Implementation Guide for CDA Release 2, Digital Signatures and Delegation of Rights, Release 1. Den gjelder for signaturer som legges på vedleggsinformasjon når den sendes i en HIPAA-vedleggs-transaksjon, fra 26. mai 2028. En betaler kan ikke be om mer enn guiden gjør.

Perfuse signerer en C-CDA på den måten på vei inn i en 275, og sjekker signaturer på hver C-CDA i en 275 den leser.

Hvis noen av dette er utilgjengelig, blir signaturen likevel laget og holder. Resultatet navngir XAdES-formen den nådde, og sier hva som stoppet den kortere enn X-L: for eksempel et selvsignert sertifikat (ingen CA å spørre) eller ingen tidsstempelmyndighet.

Nøkkelen er -signing-cert og -signing-key. Plasser CA-sertifikatene etter signatursertifikatet i samme fil så stien reiser med signatur. For en signatur som betyr hva DSDR betyr, bør sertifikatet navngi kliniker, med deres NPI, i stedet for serveren. Signering er en admin-handling, som signering av ethvert dokument er.

Guiden navngir ikke et navnerom for sine egne elementer. Perfuse plasserer digitalSignature, authorizedSigner og SignaturePurpose i urn:hl7-org:sdtc. Den uttaler også formålet som en XAdES-forpliktelsestype med ASTM-OID, som XAdES-verktøy forstår. Delegering av rettigheter, hvor en delegat signerer med en SAML-påstand fra den autoriserte signer, produseres ikke, og en mottatt en rapporteres som ikke verifisert.

Lege-NPI sjekkes mot kontrollsifferet. En betaler matcher et vedlegg til kravet delvis på dette nummeret, og et feilskrevet nummer lar vedlegget være umatchet mens kravet avvises for manglende dokumentasjon.

Visningen Krav & auth bygger en 275 fra en limt C-CDA eller en lastet opp fil, valgfritt signere C-CDA, og leser en tilbake med hver signaturs funn. Ingen ting på denne siden sender noe: utvekslingen håndteres tilbake til å bli levert gjennom en kanal, som er der partneren, legitimasjonen og audit-spor hører hjemme.

8.3.9 Binarsegmenter

En BIN-segment bærer rå bytes, og rå bytes inneholder avgrensnings tegn. Hvert annet X12-segment slutter ved segment-terminatoren, så en vanlig parser finner segmenter ved å søke etter ett byte; et vedlegg kan ikke finnes på den måten. En PDF som inneholder en ~ ville bli delt i stykker, og hvert stykke er et strukturert gyldig segment — så dokumentet er trunkert, hvert segment etter det er misjustert, og ingenting rapporterer en feil.

Perfuse leser byte-tellingen segmentet erklærer og tar nøyaktig like mange bytes. To konsekvenser verdt å vite:

esMD-guidens egen eksempel på utveksling erklærer 16 byte for samme 53-byte payload som tabellen korrekt teller som 53. Perfuse avviser dette eksemplet, som det skal. En test holder både tabellens eksempel og eksemplets skrivefeil, så en endring i noen retning blir merket.

8.4 FHIR

8.4.1 Hva en HL7 v2-melding blir

Meldingstypen bestemmer hva som produseres, og hver konvertering rapporterer dommene den trengte som notater ved siden av pakken.

v2FHIR
ADTPasient, et møte når det er et besøk, en tilstand per DG1-diagnose (også oppført i møtets diagnosis, en innleggelses som AD), en prosedyre per PR1 og en AllergyIntolerance per AL1. A28, A31, A29 og A24 handler om personen, så de produserer ingen møte eller diagnoser, men de har allergier.
ORUDiagnosticReport per OBR, med sine Observations og Specimen, og ordren det svarer på som en ServiceRequest (dens requester OBR-16 eller ORC-12, dens status ORC-5); OBR-32 er resultattolkeren, OBR-34 og OBR-35 utførerne. Resultatene er gruppert under OBR før dem etter posisjon, fordi OBX-4 er ikke pålitelig.
ORM, OML, OMGServiceRequest.
SIUAvtale, med pasienten, praktikerne fra AIP og stedene fra AIL.
MDMDocumentReference som inneholder dokumentet.
VXUVaksinasjon, en per RXA.

Alt annet produserer Pasient og en advarsel som navngir typen som ikke ble kartlagt.

Planlegging. En booking, en ombooking, en avbestilling og en ikke-møte alle lander på samme Avtale. dens identitet kommer fra avtalens egne numre i SCH-1 og SCH-2, aldri fra meldingen, så en avbestilling oppdaterer bookingen. Alternativet ville være en annen, avbrutt avtale ved siden av en live en, som viser at pasienten booket inn i en tid som ikke lenger eksisterer.

Dokumenter. Tekstnotater (TX, FT, ST) beholder sine linjeskift, inkludert blanke linjer, fordi en blank gjentakelse i en notat er en avsnittsbrudd.

Dette er hva CMS Interoperability Framework-kriterium 14 ber om: kartnotater og kliniske dokumenter returnert som FHIR-vedlegg.

Vaksinasjoner. En dose blir aldri rapportert som gitt når meldingen sier noe annet.

Ubehagelig innputt. Hver av disse rapporteres i notatene heller enn avgjort stille:

Identifier.period. En tildelt myndighet som bærer en ISO OID (AUSHIC&2.16.840.1.113883.3.879&ISO) blir urn:oid:. En typekode utenfor HL7-tabell 0203 beholdes som tekst, ikke merket som en.

annen hendelse, som en A08, slås ingenting sammen og en advarsel sier at den forrige identifikatoren fortsatt er aktiv.

tidssonen, ellers offsettet på MSH-7 (v2 antar avsenderens lokale tid), ellers UTC. En fødselsdato er unntaket: uten offset fra noen av de tre blir den utelatt i stedet for å bli merket som UTC, fordi en feil offset kan flytte en fødsel til en annen dag. birthDate beholdes, og en advarsel sier at tiden ble droppet og at å sette en tidssone for datastrømmen beholdes.

DocumentReference som Observation peker på i derivedFrom, ettersom en R4 Observation ikke har en vedleggverdi. En SN komparator på = droppes som overflødig; <> beholdes teksten, fordi ingen mengde kan si "ikke lik".

smaken UNK, fordi R4 krever en klasse.

own and a partner's, as Dutch and Flemish names are sent - family is the whole name and the parts go in HL7's family-name extensions (humanname-own-prefix, -own-name, -partner-prefix, -partner-name).

anaesthetist (PR1-8) and surgeon (PR1-11) are performers with SNOMED CT roles. An OPS code also gets its SNOMED CT category from its chapter, by HL7 Deutschland's OPS-SNOMED-Category map, which ISiK requires.

8.4.2 Hva et nettsted legger til: bunke-skriptet

Et nasjonalt profil ønsker ofte hva en HL7 v2-melding ikke bærer: et sykehusets IK-nummer eller ODS-kode, hvilket kontakt nivå et besøk er (ISiK), om et gitt navn er et fornavn eller en initial (den nederlandske nl-core). Perfuse gjetter ikke disse. En fhir-destinasjons bundle_script er der et nettsted skriver dem: JavaScript kjørt på hver konvertert Bundle, som bundle, før det valideres og sendes. Hva skriptet lar være er hva som går ut, sjekket som noen konvertering, og et skript som kaster feiler meldingen som noen transformer gjør. Konsollen har det under destinasjonens *Legg til hva dine systemer vet*.

destinations:
  - name: kis
    type: fhir
    fhir:
      url: https://fhir.klinikum.example/fhir
      version: "4.0.1"
      identifier_systems: {KLINIKUM-MUSTERSTADT: "https://fhir.klinikum-musterstadt.example/sid/patientennummer"}
      bundle_script: |
        bundle.entry.forEach(function (e) {
          if (e.resource.resourceType === "Organization" && e.resource.name === "KLINIKUM-MUSTERSTADT") {
            e.resource.identifier = [{system: "http://fhir.de/sid/arge-ik/iknr", value: "260326822"}];
          }
        });

perfuse fhir convert -bundle-script FILE runs the same script, so a site can try it on its own messages first. Two worked examples are in the repository: examples/isik/bundle-script.js (IKNR, Kontaktebene, MR-typed patient number, Diagnosetyp) and examples/nictiz/bundle-script.js (first names and initials). With them the invented German and Dutch messages in conformance/national go from 18 to 42 of 47 resources valid against ISiK and from 12 to 18 of 24 against nl-core; what is left is in the messages or the terminology server, and is listed there.

Bunken går gjennom Perfuses modell på vei tilbake, så et skripts endringer sjekkes og skrives i målets FHIR-versjon. Medlemmer modellen ikke har noen felt for, beholdes som skriptet skrev dem, inne i datatyper også.

8.4.3 US Core 9.0.0 og USCDI v6

-us-core (og claim_us_core på en fhir-destinasjon) setter et US Core-profil i meta.profile, men bare på en ressurs som har blitt sjekket mot dette profilen og funnet å være i samsvar. En som ikke møter kravene, blir likevel konvertert og sendt uten kravet, og en notis gir grunnen, som for eksempel "US Core krever en møte-type, og denne Encounter mangler". Sjekkingene er transkribert fra US Core 9.0.0, den versjonen ONC's 2026 Standards Version Advancement Process godkjenner for USCDI v6. De dekker Patient, Encounter, laboratorie-Observation og DiagnosticReport, Prøve, Praktiker, Organisasjon, Sted, Vaksinasjon, DocumentReference, møte-diagnose Condition og AllergyIntolerance.

Hva konverteren bærer, etter USCDI v6 dataklasse:

USCDI v6FraSom
PasientdemografiPIDNavn, fødselsdato, kjønn, adresse, telefon og e-post, identifikatorer. Rase og etnisitet (PID-10, PID-22) i US Cores utvidelser når de er kodet i CDC Rase og Etnisitet. Foretrukket språk (PID-15) som BCP 47
MøteinformasjonPV1Møte med type, klasse, periode, sted og deltakere
InstitusjonsinformasjonPV1-3Sted, med institusjonen som dens ledende organisasjon
Problemer, dato for opphavDG1Tilstand (møtediagnose). DG1-5 er opphavet, som HL7 v2-til-FHIR-kartet har det
Allergier og intoleranser, reaksjonAL1AllergyIntolerance med kategori, kritikalitet og reaksjon
LaboratoriumORUDiagnostiskRapport, observasjoner, prøver (fra SPM), bestilling
BestillingerORM, OMLServiceRequest
VaksinasjonerVXUVaksinasjon
Kliniske notaterMDMDokumentReferanse
BehandlingsteammedlemmerPV1, TXA, DG1Praktiker

Ikke medtatt, fordi v2-meldinger av disse typene ikke inneholder dem eller Perfuse ikke kartlegger dem: Medisiner, Prosedyrer, Mål og preferanser, Helsestatusvurderinger, Omsorgsplan, Familiens helsehistorie, Medisinske enheter (UDI), Helseforsikringsinformasjon, Vitaltegn som en distinkt profil og Proveniens.

8.4.4 R4 i begge retninger

En FHIR-tjener som erklærer R4 aksepterer R4. Det var ikke sant for Møter før denne utgaven. Tjeneren konverterte hva den betjente til R4, men leste hva den mottok som om det allerede var i sin interne form, så en R4 Møte ble avvist med en 400. Det samme var hver bundle Perfuse egen ADT-konvertering produserte, fordi hver bærer Encounter.class, som R4 skriver som en enkelt kode.

Det ble funnet første gang noe postet en konvertert ADT til Perfuse egen R4-tjener. En test gjør nå det for hver kartlagt meldingstype, og en annen sjekker at alt som skrives som R4 leses tilbake uendret.

8.4.5 Internasjonal Pasientoppsum

GET /fhir/Patient/{id}/$summary, eller GET /fhir/Patient/$summary?identifier=system|value, returnerer en internasjonal pasientoppsummering (HL7 IPS 2.0.0): en FHIR document-samling som lister pasientens aktive problemer, allergier, medisiner, vaksinasjoner, resultater, vitaltegn, prosedyrer, enheter, tidligere sykdommer og omsorgsplaner, hver med en lesbar narrativ. Det er den korte rekorden en kliniker som aldri har møtt pasienten leser først, og oppsummeringen det europeiske helsedataspace bytter mellom land fra 2029.

Det bygges fra hva FHIR-butikken inneholder, og ingenting oppfinnes:

Access follows $everything: a token limited to one patient gets a 403 for another, and an identifier that matches two patients is refused rather than guessed. Only the IPS profile is built; asking for another profile is refused. The document Perfuse produces from its test records validates against the IPS 2.0.0 Bundle profile with the HL7 validator, with no errors. A record built from real feeds can still fail where the feed's own codes do (a display name the code system does not use, for example), because the summary passes the data on as it was received.

Utveksling → Helse-lenker → Del fyller innholdet med en pasients oppsummering: skriv inn pasientens FHIR-id og velg Bruk deres pasientoppsummering, deretter les den og opprett lenken. Byggingen blir auditeret som fhir.summary.

8.4.6 Overføringsoppsummeringer for post-akutte omsorg (PACIO)

Når en pasient forlater sykehuset for et sykehjem, et rehabiliteringsenhet eller hjemme helse, sender sykehusets EHR en C-CDA: en overføringsoppsummering, en utskrivningsoppsummering eller en CCD. Perfuse omgjør dette dokumentet til overføringsoppsummeringen som PACIOs Transitions of Care-veileder beskriver (hl7.fhir.us.pacio-toc 1.0.0): en FHIR R4 document-samling, US Core 8.0.1 inne, som mottakende fasilitets system kan arkivere uten at noen må lese XML.

Tre måter å lage en:

Bundle endpoint (url), or writes <document>.transfer.json to dir. In the channel builder: Emit › A PACIO transfer summary.

Kontrollert med den offisielle FHIR-valideringen mot TOC 1.0.0 Bundle-profilen, mot HL7 sine egne C-CDA-eksempler (en overføringsoppsummering, en utskrivelsesoppsummering og en CCD). Den ene feilen den rapporterer, er i guiden: hver vitalt tegn matcher både sin simple-observation og sin vital-signs Bundle-inndelingspunkt, så det kan ikke unngås av noen avsender. Ikke gjort enda: å omdanne tekstbare seksjoners poster (funksjonell status, mental status, omsorgsplan, enheter) til kodete ressurser, og guidens TOC DocumentReference som indekserer en lagret overføringsoppsummering.

8.4.7 Abonnementer

Med -fhir-subscriptions sender FHIR-endepunktet varslinger når en Encounter eller en Appointment opprettes eller endres. Den følger FHIR Subscriptions R5 Backport IG for R4, som er hva CMS Interoperability Framework-kriterium 15 og TEFCA's FHIR-veikart bruker for appointment- og encounter-varslinger.

En klient oppretter en Subscription som navngir et emne, og valgfritt en filter som Encounter?patient=Patient/123. Emnene er listet i kapasitetsutviklingen:

EmneUtløser påFilter
https://perfuse.health/fhir/SubscriptionTopic/encounterEncounter opprettet eller oppdatertpatient, status, class
https://perfuse.health/fhir/SubscriptionTopic/appointmentAppointment opprettet eller oppdatertpatient, status

En filter som navngir noe annet avvises, ikke ignoreres. En ignorert filter er et abonnement som varsler om hver pasient når klienten spurte om en.

Egenskapene implementeringen er bygget rundt:

Hva en klient kan få serveren til å gjøre, er begrenset med vilje:

Det er av med mindre det ber om, fordi en gang det er på, kan en FHIR-klient få denne serveren til å sende pasientdata til en URL som klienten velger. Den trenger en R4-endepunkt som aksepterer skriving, og avviser å starte ellers.

Ikke implementert, så ingen trenger å finne ut ved å prøve:

Visningen Abonnementer viser hvert abonnements emne, filter og endepunkt, hvor mange hendelser det har hatt, hvor mange som er akseptert og hvor mange som venter, og siste grunn til at en ble avvist. Header-verdier og endepunktets spørringsstreng holdes tilbake, fordi det er der en abonnents legitimasjoner bor.

8.5 NCPDP Telekommunikasjonsstandard

Apotek-krav. Fast bredde-header fulgt av variable segmenter.

To detaljer som teller, begge av dem er lette å få galt og produsere plausibele resultater:

Headeren er nøyaktig 56 bytes og fast bredde. En kort header kan ikke detekteres bare ved lengde, fordi en avkortet header pluss følgende segmenter fortsatt overstiger 56 bytes. Detektering skjer ved at en korrekt header aldri inneholder en separatorbyte, så headeren skannes for en og en melding som har en blir avvist med antall bytes den mangler.

0x1E og 0x1C er gruppe- og felt start-markører, ikke separatorene. Å behandle dem som separatorene flytter hver felt en plass til venstre, og de fleste av de resulterende verdiene forblir plausibele — en mengde havner der en dags forsyning var forventet og begge er tall.

NCPDP og SCRIPT-kanaler er ekskludert fra MLLP-ramming, og dette påtvinges i stedet for å anbefales. En krav kan legitimt inneholde 0x1C, som er MLLP sin egen slutt-på-blokk-byte, så å ramme en krav ville forkorte den ved det første feltmarkøren.

8.6 NCPDP SCRIPT

Elektroniske resepter, i XML. Den interne pakken kalles eprescribe fordi script var tatt av JavaScript-motoren.

Den sentrale sikkerhetsbekymringen er erstatningsflagget, og det leser motsatt av intuisjonen: på ledningen, betyr 0 at erstatning er tillatt og 1 betyr utlever som skrevet.

Et fraværende erstatningsflag avvises i stedet for å være standard. Begge mulige standarder når pasienten — en kan utlevere en generisk der legen krevde merkevaren, den andre forhindrer en erstatning som legen tillot — så det finnes ingen trygg antagelse og meldingen stopper.

En Schedule II-resept med refiller avvises, og byggeren vil ikke produsere en.

Avvisninger og advarsler holdes som separate lister i stedet for en liste med alvorlighetsmerking, fordi en leser som må sjekke en alvorlighetsfelt for å vite om meldingen ble sendt, vil til slutt ikke sjekke det.

Elektronisk forhåndsgodkjenning (PAInitiationRequest, PARequest, PAAppealRequest, PACancelRequest) og Real-Time prescriptionsfordel er besvart av betaleren på /ncpdp/script og /ncpdp/rtpb, fra legemiddelformular; se CMS-0057.

8.7 DICOM

Bildebehandling. Perfuse kan motta DICOM-objekter, spørre en fjernarkiv og lagre til en, over de klassiske DICOM-nettverkstjenestene eller over DICOMweb, og den kan holde et arkiv av sin egen for visere.

DICOM er ikke en meldingsformat på samme måte som de andre — objekter er store, og assosieringshåndtrykkingen betyr mer enn payload-parsing. De called_ae og calling_ae-tittelene er den vanligste årsaken til at en første forbindelse feiler, og feilen ser ut som et nettverksproblem i stedet for et konfigurasjonsproblem.

8.7.1 Hva en C-STORE-lytter aksepterer

Latt åpne, aksepterer en DICOM-lytter alt fra noen som kan nå porten. Fire innstillinger under Hva denne lytteren aksepterer snevrer dette inn, og den første er den som er verdt å forstå.

Kun aksepter disse kalende AE-titler er begrensningen. Den *kalte* AE-tittel — den som ligger ved siden av adressen — er navnet en avsender ringer, så den identifiserer denne lytteren i stedet for avsenderen, og den er ikke en begrensning. Enhver som kan nå porten kan bruke den korrekte kalte AE-tittel, fordi den er publisert til dem. Uten en liste over tillatte kallere, kan enhver vert på nettverket trykke bilder inn i en klinisk kanal.

Kun aksepter disse SOP-klassene og kun aksepter disse overførings-syntaksene tar komma-separerte UIDs. Tom aksepterer hver type objekt og forhandler hva som helst kompresjon avsenderen tilbyr, som inkluderer typer denne kanalens destinasjoner ikke kan håndtere. Avvisning ved assosiering er klarere for avsenderen enn å akseptere objektet og feile etterpå.

Største objekt akseptert er i bytes, og null betyr ingen begrensning. Hel-side-bilder og lange serier kan nå gigabytes, så begrensningen er ellers minne.

8.7.2 DICOMweb

DICOMweb er DICOM over HTTP: QIDO-RS-søk, WADO-RS og WADO-URI henter, STOW-RS lagrer. Nettlesere som OHIF snakker bare DICOMweb, og det gjør også skytjenestene for bildebehandling (Google Cloud Healthcare, Azure Health Data Services, AWS HealthImaging). Perfuse bruker det på tre steder.

Bildearkivet. Start serveren med -dicomweb-archive DIR (Innstillinger › Data › Bildearkiv) og den lagrer objekter i den mappen, indekserer dem i SQLite og tilbyr dem på /dicomweb på konsollens egen adresse: QIDO-RS på studie-, serie- og instansnivå, WADO-RS for objekter, metadata, ramer og bulkdata, WADO-URI på /dicomweb/wado og STOW-RS. Leseoperasjoner krever seerrollen og lagring operatørrollen, med en sesjon eller en API-nøkkel; hver lese- og lagringsoperasjon er loggført i Aktivitet som dicomweb.read eller dicomweb.store. En konto begrenset til en leier eller til kanalgrupper avvises, fordi arkivet tilhører hele serveren. Objekter lagres nøyaktig som de mottas, så hva en seer henter er bokstavelig talt det samme som ble lagret. Ramer returneres i overføringssyntaxen de ble lagret i; en forespørsel som ville kreve omkoding svarer 406 i stedet for et konvertert bilde.

En søk på en attributt arkivet ikke indekserer svarer 400 i stedet for å ignorere betingelsen og returnere flere studier enn det som ble bedt om. Indekserer: pasientnavn (jokertegn og fuzzy-matching med fuzzymatching=true), pasient-ID, fødselsdato, kjønn, studie-dato og -tid (intervaller), inntaksnummer, studie-ID, beskrivelse, henvisende lege, studie-, serie- og SOP-eksemplar-UID (lister), modalitet, kroppsdel, serienummer og -beskrivelse, SOP-klasse, eksemplar-nummer, rader, kolonner og antall rammeverk.

Kilden. type: dicomweb lytter etter STOW-RS, på /dicom-web/studies som standard (sammen med Orthanc og dcm4chee bruker), og sender hver objekt gjennom kanalen som en DICOM-melding. Kanalen trenger dataType: dicom. Sett en bearer- token eller et brukernavn og passord: uten en, kan hvem som helst som kan nå porten sende bilder inn i kanalen. Svaret lister hver objekt som lagret eller feilet, med DICOM-feilårsak, så en avsender vet hvilke som skal sendes på nytt.

name: imaging-from-viewers
dataType: dicom
source:
  type: dicomweb
  dicomweb:
    listen: 0.0.0.0:8043
    token: ${STOW_TOKEN}
    tls: { enabled: true, cert_file: /etc/perfuse/imaging.crt, key_file: /etc/perfuse/imaging.key }
destinations:
  - name: archive
    type: dicomweb
    dicomweb:
      url: https://perfuse.example/dicomweb
      token: ${ARCHIVE_TOKEN}

Destinasjonen er i levering, under DICOMweb-arkiv.

Peke OHIF mot arkivet

Bruk en DICOMweb-datakilde med qidoRoot og wadoRoot satt til arkivets adresse (skjermen Bilde viser den, med hele datakilde-blokken til å kopiere), wadoUriRoot til den adressen etterfulgt av /wado, imageRendering og thumbnailRendering til wadors, og supportsFuzzyMatching true. En visningsprogram på en annen opphav trenger den opphav i -dicomweb-cors (Tillatte nettleser-opphav som kan ringe det), og dens forespørsler trenger en API-nøkkel i Authorization-headeren, fordi en nettleser på en annen opphav ikke sender konsollens sesjonskoke. Å tilby OHIF fra samme opphav gjennom en omvendt proxy unngår begge.

Testet mot Orthanc med DICOMweb-utvidelsen, i begge retninger: destinasjonen lagrer i Orthanc, og Orthancs DICOMweb-klient søker i Perfuses arkiv og henter en studie som er byte-identisk med den lagrede. OHIF 3 lister arkivets studier og viser deres rammeverk med innstillingene ovenfor. OHIF og flere andre klienter sender type= uquotet i Accept- og Content-Type-hodene, som RFC 2045 ikke tillater; Perfuse aksepterer det.

8.8 IHE-dokumentdeling: XDS.b, XCA, XDR, MHD, PIXm og PDQm

Kliniske dokumenter delt mellom organisasjoner på samme måte som helseinformasjonsutvekslinger, Carequality og eHealth Exchange gjør: et repository holder dem, et register indekserer deres metadata, og en samfunn svarer andre samfunns spørringer gjennom en portal. Start serveren med -xds REPOSITORY-OID (Innstillinger › Data › Dokumentdeling) og den er alle tre, i denne serverens database, på disse adressene, hver som tar en API-nøkkel som en bærertoken (visningsrollen for å spørre og hente, operatørrollen for å sende inn; de fleste affinitetsdomener legger til gjensidig TLS foran):

AdresseSkuespillerTransaksjoner
/xds/repositoryDokumentarkivITI-41 Provide and Register Document Set-b, ITI-43 Retrieve Document Set
/xds/registryDokumentregisterITI-18 Registry Stored Query (alle tretten lagrede spørringer), ITI-42 Register Document Set-b
/xca/gatewayXCA Responding GatewayITI-38 Cross Gateway Query, ITI-39 Cross Gateway Retrieve, med -xds-home-community urn:oid:...
/mhdMHD Dokumentmottaker og ResponderITI-65 Provide Document Bundle, ITI-66 Find Lists, ITI-67 Find Document References, ITI-68 Retrieve Document
/mhd/PatientPDQm Leverandør og PIXm ManagerITI-78 Patient Demographics Query, ITI-83 Patient/$ihe-pix, fra FHIR-lagret Pasienter
/pixv3PIX Manager (HL7 v3)ITI-44 Patient Identity Feed HL7 V3, ITI-45 PIXV3 Query, fra pasientindekset (-mpi)
/pdqv3PDQ Leverandør (HL7 v3)ITI-47 PDQV3 Query, med kontinuerlig og avbryt, fra pasientindekset

SOAP-transaksjonene er SOAP 1.2 med WS-Addressing, og MTOM/XOP der dokumenter reiser (et dokument inline som base64 blir også akseptert). En feilet transaksjon blir svart med en RegistryResponse som bærer IHEs feilkoder, ikke en SOAP-feil: XDSDuplicateUniqueIdInRegistry, XDSNonIdenticalHash, XDSPatientIdDoesNotMatch, XDSMissingDocument, XDSRegistryMetadataError (med feltet som mangler), XDSStoredQueryMissingParam, XDSUnknownStoredQuery, XDSUnknownRepositoryId, XDSUnknownCommunity, og UnresolvedReferenceException. En erstatning (RPLC, XFRM_RPLC) gjør det dokumentet den erstatter, uaktuell, som deretter bare svarer på spørringer som ber om uaktuelle dokumenter; APND, XFRM og signs blir holdt som assosiasjoner. Hash og størrelse blir beregnet av repository og sjekket mot hva innleveringen sier. Dokumenter og metadata oppdatering (ITI-57) blir ikke støttet, og en innlevering som ber om det blir avvist med grunn.

MHD er samme register i FHIR: et dokument levert over MHD finnes ved ITI-18 og over XCA, og ett levert over XDS.b finnes ved ITI-67. En DocumentReferences id er postens UUID, masterIdentifier den unike id, og vedleggets url er ITI-68-adressen til dokumentet. Pasienter løses til affinitetsdomenets identifikator fra FHIR-butikken: den første identifikatoren hvis system er urn:oid:, eller Pasienten som følger med i Bundle. PIXm svarer på hver annen identifikator til Pasienten med den gitt (sourceIdentifier=system|value, innsmalere av targetSystem), og 404 for en den ikke kjenner; PDQm søker etter identifikator, navn, fødselsdato, kjønn, adresse og telecom.

Publisering. En kanals xds-destinasjon publiserer hver klinisk dokument den mottar, et CDA-dokument eller et som er med i en HL7 v2-melding, til ethvert XDS.b-repository med ITI-41. Metadaten leses fra dokumentet: pasienten (identifikatoren i patient_domain, affinitetsdomenets tildelingsmyndighet), tittel, type (som typeCode og, med mindre den er satt, classCode), opprettelse og tjenestetid, forfatter, konfidensialitet, språk og format (C-CDA 2.1 eller 1.1 strukturert innhold, XDS-SD eller mimeTypeSufficient, fra dens maler); og fullføres fra hva et dokument ikke sier: senders source_id, facility_type og practice_setting hver registry krever. Repositorys RegistryResponse bestemmer leveringen: en feil eller en feil i en PartialSuccess er en feilaktig levering med registrys feilkoder.

destinations:
  - name: hie
    type: xds
    xds:
      url: https://hie.example/xds/repository
      source_id: 1.2.840.114350.1.13.99
      patient_domain: 1.2.840.114350.1.13.99.2.7.5.737384.14
      facility_type: { code: "225732001", scheme: 2.16.840.1.113883.6.96, display: Community hospital }
      practice_setting: { code: "394802001", scheme: 2.16.840.1.113883.6.96, display: General medicine }
      tls: { enabled: true, cert_file: /etc/perfuse/hie.crt, key_file: /etc/perfuse/hie.key }

XDR. Legg til direct_from (din Direct-adresse) og direct_to (mottakerens) og samme destinasjon sender XDR som Directs transport, som Direct-prosjektets *XDR og XDM for Direct Messaging* beskriver det: en Direct-adresseblokk (urn:direct:addressing) i SOAP-hodet navngir avsender og mottakere, og innsendingens intendedRecipient navngir hver mottaker (||^^Internet^address). Peke url mot mottakerens XDR-endepunkt eller en HISP som tar XDR. XDR reiser over TLS, vanligvis med en klient-sertifikat (tls), og er ikke S/MIME. En direct kilde tar XDR også (se Direct nedenfor).

    xds:
      url: https://xdr.hisp.example/xdr
      source_id: 1.2.840.114350.1.13.99
      patient_domain: 1.2.840.114350.1.13.99.2.7.5.737384.14
      facility_type: { code: "225732001", scheme: 2.16.840.1.113883.6.96, display: Community hospital }
      practice_setting: { code: "394802001", scheme: 2.16.840.1.113883.6.96, display: General medicine }
      direct_from: referrals@direct.hospital.example
      direct_to: ["intake@direct.clinic.example"]
      tls: { enabled: true, cert_file: /etc/perfuse/xdr.crt, key_file: /etc/perfuse/xdr.key }

PIX og PDQ i HL7-versjon 3. Med pasientindekset på (-mpi), er /pixv3 en PIX Manager og /pdqv3 en PDQ Leverandør over SOAP 1.2, for sykehus og bytte som fortsatt snakker IHEs v3-profiler. En kilde mater pasienter med ITI-44 (rekord lagt til PRPA_IN201301UV02, revidert PRPA_IN201302UV02, duplikater løst PRPA_IN201304UV02): pasientens første identifikator er dens rekord, de andre og de i asOtherIDs er identifikatorer den bærer, og en sammenslåing folder den forrige rekordens identifikator inn i den overlevende, som en HL7 v2 A40 gjør. ITI-45 (PRPA_IN201309UV02) svarer på de andre identifikatorene til personen som holder en, innsmurret av dataSource, i Patient.id; den spørte identifikatoren kommer bare tilbake i den gjentatte spørringen. ITI-47 (PRPA_IN201305UV02) matcher demografi (navn, kjønn, fødselsdato, identifikator, adresse, telecom) med indeksets egen matcher, minimumDegreeMatch som en score på 100, otherIDsScopingOrganization begrensning av domener, og initialQuantity sidning av svaret: resten kommer med QUQI_IN000003UV01 for ti minutter, eller blir droppet av dens avbryt. Svarene følger transaksjonenes caser: en ukjent pasient eller domene er AE med feil 204 og plasseringen av parameteren, en kjent pasient med ingenting i domenene som spørres, er NF. v3 navngir en myndighet bare med OID, så en identifikator hvis system er en URL uten OID bak (noen nasjonale numre) blir utelatt fra v3-svar og gitt over FHIR; sett enterprise-identifikatorens system til en OID (urn:oid:..., i indeksinnstillingene) for EUID og custodian å dukke opp. Viserrollen spør og operatørrollen mater; hver transaksjon blir audited med en identifikator, aldri et navn. En bare v3-melding postet som application/xml blir svart i samme, som er håndig for testing ved hånden.

Utveksling › Dokumentdeling viser hva registry inneholder og hvor den nås, finner en pasients dokumenter i denne registry eller en annen (en registrys ITI-18 eller en gateways ITI-38), laster ned en og publiserer et CDA-dokument manuelt med metadaten en destinasjon ville gi den.

Verifisert mot NIST XDS Toolkit 7.13.0, IHE-referanseimplementeringen: Perfuses ITI-41, ITI-18 og ITI-43 mot dens Registry/Repository-simulator (akseptert med ingen valideringsfeil, dokumentet hentet byte-identisk), og dens Initiating Gateway-simulator som spør og henter fra Perfuses Responding Gateway over XCA, med ingen feil i loggen. Hvert SOAP-melding Perfuse skriver validerer mot ebXML Registry 3.0 og XDS.b-skjema, og MHD DocumentReference og SubmissionSet mot IHE MHD 4.2.2 med HL7 FHIR-validereren. XDR fra en xds-destinasjon med en Direct-adresseblokk ble akseptert av verktyets Document Recipient-simulator, hvis metadata-validering fant den ene feilen beskrevet i docs/verification.md, og av ONC SITES XDR-validerer, Direct XDR-sjekklister (h)(2)-sertifiseringstesten anvender. PIX og PDQ v3-svarene validerer mot IHEs HL7 V3-skjema (NE2008 multicacheschemas), og IHEs egne eksempel-meldinger (ITI-44-feed, slå sammen, ITI-45-spør, ITI-47-spør, fortsettelse og avbryt) besvares som deres publiserte svar viser. Ikke sjekket mot en uavhengig PIX eller PDQ v3-implementering, Gazelle eller en Connectathon.

8.9 Direkte sikker meldingsutveksling

Direct er hvordan US-leger sender hverandre henvisninger, sammenfatninger og resultater via sikker e-post: hver melding er signert med avsenders sertifikat og kryptert til mottakers (S/MIME), og reiser mellom HISPer (Health Information Service Providers) som utsteder adresser og garanterer for dem. Perfuse er kantsystemet ved siden av din HISP, ikke en HISP: HISP utsteder din adresse, dens sertifikat og dens nøkkel, og du beholder dens tillitsbunt (slik som DirectTrusts). Det følger Direct Applicability Statement for Secure Health Transport 1.2, Implementation Guide for Delivery Notification, IHE XDM (ITI TF-1 Annex 15) for dokumenter med metadata, Certificate Discovery for Direct Project Implementation Guide (DNS og LDAP), og XDR og XDM for Direct Messaging.

Sending. A direct destination signs each message as your address (SHA-256, RSA), encrypts it to every recipient's certificate and your own (AES-256-CBC, RSA key transport), and submits it to the HISP by SMTP with STARTTLS required. The message travels as an attachment named by its content (document.xml, message.hl7, resource.json), or, with xdm: true, a CDA document travels as an IHE XDM package (IHE_XDM/SUBSET01/METADATA.XML with the document and its hash and size, plus INDEX.HTM and README.TXT) that receiving EHRs import with its metadata. Recipient certificates come from the Direct address book (below), then from DNS, where Direct publishes them as CERT records (RFC 4398): under the address with its @ made a dot, else under its domain; then from the recipient domain's LDAP directory, which its _ldap._tcp SRV record names (or ldap: host:port; ldap: off never asks one): each naming context is searched anonymously for an entry whose mail is the address, then the domain, and its userSMIMECertificate or userCertificate read. A certificate is used only when it is for the address or its domain, has not expired, and chains to one of your anchors, fetching any intermediate issuer its Authority Information Access extension names; and it is refused when its issuer's revocation list (from its CRL distribution point, signed by that issuer) lists it. A list that cannot be fetched does not stop delivery. A recipient with no such certificate is a failed delivery, never plain e-mail. to and subject take field references such as {PV1-8.1}, and request_mdn asks the recipient for a delivery notification.

destinations:
  - name: referrals
    type: direct
    direct:
      address: referrals@direct.hospital.example
      cert_file: /etc/perfuse/direct/referrals.crt   # with its chain after it
      key_file: /etc/perfuse/direct/referrals.key
      anchors_file: /etc/perfuse/direct/anchors.pem
      to: ["intake@direct.clinic.example"]
      subject: "Referral for {PID-5.1}"
      text: "Please see the attached summary."
      xdm: true
      xdm_source_id: 1.2.840.114350.1.13.99
      smtp_host: smtp.hisp.example:587
      username: referrals
      password: ${DIRECT_HISP_PASSWORD}
      request_mdn: true

Mottak. En direct-kilde er SMTP-serveren HISP leverer din adressens e-post til. Den tar imot e-post bare for den adressen (alt annet avvises ved RCPT), krever STARTTLS når det er gitt et sertifikat, og åpner hver melding før noe leser den: dekrypterer den med din nøkkel, verifiserer signatur mot dine ankere og sjekker at signatur-sertifikatet er for Fra-adressen eller dens domene. En melding som ikke er kryptert S/MIME, er signert av en sender du ikke stoler på, eller er signert av et sertifikat for noen andre, avvises ved DATA med årsaken, så HISP beholder den og rapporterer den til senderen; Perfuse aksepterer aldri hva den deretter dropper. Et XDM-pakkes dokumenter blir hver en melding (sjekket mot hasene i dens metadata); ellers hver vedlegg blir en melding, eller teksten når det ikke er noen. Med smtp_host satt, hver melding tatt imot besvares med en signert, kryptert "prosessed"-bekreftelse (MDN), og bekreftelser som ankommer for hva du sendte, logges.

source:
  type: direct
  direct:
    address: intake@direct.clinic.example
    cert_file: /etc/perfuse/direct/intake.crt
    key_file: /etc/perfuse/direct/intake.key
    anchors_file: /etc/perfuse/direct/anchors.pem
    listen: 0.0.0.0:2525
    tls_cert: /etc/perfuse/tls/server.crt
    tls_key: /etc/perfuse/tls/server.key
    smtp_host: smtp.hisp.example:587

Fra HISPs postkasse. En HISP som beholder e-post i stedet for å levere den gir adressen en IMAP-postkasse: imap leser den (TLS eller STARTTLS, hver avstemming en ny sesjon), åpner hver melding som ovenfor, flytter hva som ble tatt til move_to (eller sletter det) og hva som ikke kunne åpnes til error_folder, så ingenting leses to ganger. listen kan da bli utelatt. En HISP hvis e-postserver har et privat sertifikat tillits med tls.ca_file (dets sertifikat, eller dets myndighets) og tls.server_name; verifisering kan ikke slås av.

    imap:
      host: imap.hisp.example
      username: intake@direct.clinic.example
      password: ${DIRECT_MAILBOX_PASSWORD}
      move_to: Processed

XDR. xdr tar imot XDR på /xdr på sin egen HTTPS-adresse, som en HISP sender Direct som er konvertert til SOAP eller en partner sender punkt-til-punkt: en ITI-41 Provide and Register-forespørsel hvis dokumenter hver blir en melding. En innsending hvis Direct-adresseblokk navngir en annen adresse, blir avvist, og en som kanalen ikke tar imot, blir besvart med en RegistryResponse-feil som sier hvorfor. client_ca_file krever en klient-sertifikat fra disse myndighetene. XDR er beskyttet av TLS, ikke S/MIME, så en kilde som bare tar imot XDR, trenger adressen, men ikke sertifikatet, nøkkelen eller ankrene. Hvert dokument blir en melding av kanalens dataType: CDA-dokumenter trenger raw (videreformidlet som de er) eller hl7v3, siden standarden, hl7, forventer HL7 v2 og avviser dem.

    xdr:
      listen: 0.0.0.0:8445
      tls_cert: /etc/perfuse/tls/server.crt
      tls_key: /etc/perfuse/tls/server.key
      client_ca_file: /etc/perfuse/direct/hisp-clients.pem

Utveksling › Direct listar Direct-adressene dine kanaler sender og mottar som, med deres sertifikater, utløp og ankere; beholder adresseboken over korrespondenter (navn, organisasjon, notater og sertifikat, limt fra deres HISP eller funnet i DNS eller LDAP, og avvist når det ikke er for den adressen eller domenet); og søker opp en adressens sertifikater i DNS eller LDAP uten å lagre dem. Boken er katalogen direct-certs ved siden av databasen, en PEM-fil per adresse eller domene, som en destinasjon leser med mindre den navngir sin egen recipient_certs_dir.

Verifisert mot OpenSSL 4.0s cms og smime i begge retninger: hva Perfuse signerer og krypterer OpenSSL verifiserer og dekrypterer (PKCS#1 v1.5 og OAEP-nøkkeltransport), og Perfuse åpner hva OpenSSL signerer og krypterer (AES-128 og AES-256). En melding laget med openssl smime og levert over SMTP mottas, åpnes og lagres av en kanal, og en som Perfuse sender en melding til en annen gjennom en HISP-stedfortreder, som svarer med en MDN avsender åpner. Sertifikater finnes i OpenLDAP 2.4 (adresse-bundet og domene-bundet, skrevet av OpenLDAPs egen ldapadd); en Direct-melding leses fra en GreenMail IMAP-postboks og åpnes, og en som ikke er Direct flyttes til feil-mappen; XDR fra en xds-destinasjon tas av en direct-kilde og avvises når den er adressert til noen andre, og aksepteres av NIST XDS Toolkit's Document Recipient og ONC SITES XDR-verifisering; SITES Direct XDR Edge Test Tool sendte både minimal og full metadata-meldinger til en direct-kilde, som tok dem. Mot ONCs Direct-sertifikat-verifisering verktøy, en Direct-destinasjon velger riktig sertifikat, eller ingen, i alle 18 av dens oppdagelses-tilfeller (D1 til D18: utløpte, revokerte og AIA-utstedte sertifikater, SRV-prioritet og vekt, en utilgjengelig katalog). En Direct-kilde leser en melding fra SITES egen HISP (Apache James) over IMAP med STARTTLS. Ikke testet ennå: SMTP-utveksling med SITES HISP (AWS holder utebunden post på port 25 for nye kontoer) eller med en akkreditert HISP.

8.10 SQL på FHIR-utsikt

En ViewDefinition (HL7 SQL på FHIR v2) gjør hver FHIR-ressurs av en type om til rader med navngitte kolonner, hver kolonne en FHIRPath-uttrykk, så FHIR-data kan leses som tabeller av DuckDB, Athena, Spark, et datawarehouse eller et regneark. Perfuse kjører dem med sin egen FHIRPath-motor: column, nestede select, forEach, forEachOrNull, repeat og unionAll, where, constant (hver value[x]-type), collection-kolonner, %rowIndex og getResourceKey() og getReferenceKey(type)-join-nøkler.

{
  "resourceType": "ViewDefinition",
  "name": "blood_pressure",
  "resource": "Observation",
  "constant": [{ "name": "systolic", "valueCode": "8480-6" }],
  "where": [{ "path": "code.coding.exists(system = 'http://loinc.org' and code = '85354-9')" }],
  "select": [{ "column": [
    { "name": "id", "path": "getResourceKey()", "type": "id" },
    { "name": "patient_id", "path": "subject.getReferenceKey(Patient)", "type": "id" },
    { "name": "systolic", "path": "component.where(code.coding.code = %systolic).value.ofType(Quantity).value.first()", "type": "decimal" }
  ]}]
}

Overvåkning › SQL på FHIR kjører en visning over denne serverens FHIR-lagring (en pasient eller alle) eller over ressurser limt inn (NDJSON fra en bulk-eksport, en Bundle, en JSON-array), viser radene og laster dem ned som CSV, NDJSON eller Parquet. Den starter fra fem eksempelvisninger (pasientdemografi, observasjoner med en verdi, blodtrykk, tilstander, møter) og lagrer visninger i views-katalogen ved siden av databasen, en JSON-fil hver.

FHIR-endepunktet svarer på spesifikasjonens $sql-run på systemnivå, ved hjelp av GET eller POST, for en ViewDefinition-objekt gitt inline (subjectResource), ved subjectReference (ViewDefinition/<name>, en lagret visning) eller ved subjectCanonical (en lagret visnings url), med _format (csv, ndjson (standard), json eller parquet), header, patient, _since, _limit og resource for å kjøre over ressurser sendt med forespørselen i stedet for lagret. Dette er en leseoperasjon: en SMART-token trenger leseomfang for visningsressursens type, en token bundet til en pasient får bare den pasientens rader, og granulære omfang begrenser ressursene som leses, slik de gjør under en søk. Mer enn en million rader krever _limit, patient eller _since.

perfuse sof -view v.json [-format csv|ndjson|json|parquet] [-o out] files... kjører en visning over FHIR-filer uten en server: NDJSON-filene fra en bulk-eksport, Bundles eller arrayer.

perfuse sof -view blood_pressure.json -format parquet -o bp.parquet export/Observation.ndjson
duckdb -c "SELECT patient_id, avg(systolic) FROM 'bp.parquet' GROUP BY 1"

Parquet-filer har en radgruppe og upakkede PLAIN-sider; booleans er BOOLEAN, heltallstyper INT64, desimaler DOUBLE og alt annet UTF-8-strenger (en samlingkolonne som dens JSON).

Verifisert med den offisielle SQL på FHIR-testsuite (de 144 testene i sql-on-fhir.js-repositoriets tests/, kjørt på hver bygging: alle passerer), og Parquet-utdata leses tilbake av DuckDB 1.5.6 med riktige typer og verdier. Ikke støttet: SQLQuery og SQLView-biblioteker (SQL over visningstabellene), $sql-export, _format=fhir og source- og group-parametere; hver av dem avvistes med begrunnelse.

8.11 Digitale kvalitetsmål

En digital kvalitetsmåling teller pasientene i hver befolkning av en FHIR Measure over en målingsperiode (initial befolkning, teller, tellelle eksklusjoner og unntak, teller, teller eksklusjoner) og scorer resultatet. Svaret er en FHIR MeasureReport, formet som Da Vinci Data Exchange for Quality Measures (DEQM)-veilederen ber om. Dette er der CMS's eCQM-programmer og NCQA's digitale HEDIS er på vei.

I Perfuse er befolkningskriteriene FHIRPath ("language": "text/fhirpath"), kjørt av samme motor som SQL på FHIR. Hvert kriterium evalueres én gang per pasient. Fokus er en Bundle av pasientens journal (Patient-kompartimentet), og det har disse variablene: %subject (pasienten), %periodStart og %periodEnd (perioden, som dateTimes) og %"Measurement Period". Et kriterium gir true eller false; en enkelt verdi som eksisterer, teller som true.

{
  "code": { "coding": [{ "system": "http://terminology.hl7.org/CodeSystem/measure-population", "code": "numerator" }] },
  "criteria": {
    "language": "text/fhirpath",
    "expression": "entry.resource.ofType(Observation).where(code.coding.where(system = 'http://loinc.org' and code = '4548-4').exists() and effective.ofType(dateTime) >= %periodStart and effective.ofType(dateTime) <= %periodEnd).exists()"
  }
}

Befolkningene nestes som Målingsspesifikasjonen sier. En pasient er i tellen bare hvis den er i den innledende befolkningen. Et telleunntak fjerner pasienten før telleren vurderes. Et unntak teller bare for en pasient som ikke er i telleren. En proporsjons score er (teller − tellerunntak) / (telle − unntak − unntak); en ratios score er teller / telle; en kohort har tellinger og ingen score. Enkeltkriteriums-stratifikatorer deler hver befolkning etter deres verdi (kjønn, for eksempel).

Perfuse har ingen CQL-motor. De publiserte CMS eCQM-ene og HEDIS-digitalmålingene er skrevet i CQL, så de kan ikke kjøres som de er. En Måling hvis kriterier er CQL avvies med denne årsaken. Skriv logikken som FHIRPath i stedet. Kontinuerlig-variabel scoring, flerkomponent-stratifikatorer og Gruppe eller Praktiker-emner avvies på samme måte.

Overvåkning › Kvalitetsmål vurderer et mål over denne serverens FHIR-lager eller over limte ressurser, for en periode. Den tilbyr tre rapporter: en sammenfatting, en sammenfatting med pasienter i hver befolkning, eller en pasient. Skjermen viser befolkningene, poengsummen og stratene, og laster ned MeasureReport. Den starter fra tre eksempler: blodtrykk under kontroll, diabetes med et HbA1c-test, og pasienter sett i perioden. De er illustrative, skrevet for denne håndboken, og er ikke CMS eCQMs eller HEDIS-mål. Lagre til FHIR-lager sjekker målet og lagrer det som en Measure-ressurs.

FHIR-endepunktet svarer Measure/[id]/$evaluate-measure og Measure/$evaluate-measure?measure=<url>, ved GET eller POST av en Parameters-ressurs. Parametere:

Rapporten returneres, ikke lagret. Operasjonen er en leseoperasjon, så en SMART-token trenger leseadgang til Måling og Pasient. En token bundet til en pasient får en individuell rapport om den pasienten og ingen andre.

perfuse measure -measure m.json -period-start 2026-01-01 -period-end 2026-12-31 [-type summary|subject|subject-list] [-subject Patient/ID] [-o out] files... evaluerer en måling over FHIR-filer (en bulk-eksports NDJSON, Bundles, arrayer) uten en server. -measure example:example-bp-control kjører en eksempel som er levert, og -examples lister dem.

Verifisert. HL7 FHIR-validereren sjekker de medfølgende Målinger mot FHIR R4, uten feil. Den sjekker en sammenfatting, en individuell og en emne-liste Målingsrapport mot DEQM 5.0.0-sammenfattnings-, individuelle og emne-liste-profiler, også uten feil. Ikke verifisert: ekvivalens med noen publisert eCQM, siden ingen kan kjøres her uten CQL.

8.12 Pasientindekset (MPI)

En masterpasientindeks kobler sammen alle systemers journaler for en person (sykehusets MRN, klinikken, laboratoriet) til én bedriftsidentifikator, EUID. Den er av til noen bestemmer seg for å holde en, fordi den er en tabell over pasienters navn, fødselsdato og identifikatorer: slå på Innstillinger → Data → Pasientindeks (eller serve -mpi) og restart. Den bor i mpi.db ved siden av hoveddatabasen.

Mating det. Legg til en destinasjon av type mpi (Pasientregisteret i byggeren) til kanalene som bærer registreringer. Den leser PID fra hver HL7 v2-melding eller en FHIR-pasient på en rå kanal. Postens eget identifikator er PID-3-gjentakelse av type MR (id_type endrer det); de andre, og PID-19, blir dens andre identifikatorer. En tildelingsmyndighet med et universelt identifikator (PID-3.4.2 med type ISO) blir urn:oid:...; en med bare et navnerom kartlegges av authorities, eller blir urn:perfuse:aa:<namespace>. En A40, A34, A18 eller A39 slår sammen personen som har MRG-1s identifikator med personen som har PID-3s (no_merge ignorerer dem).

destinations:
  - name: index
    type: mpi
    mpi:
      authorities: { HOSP: "urn:oid:1.2.840.114350.1.13.1" }

Sammenligning. En ny post blir koblet i denne rekkefølgen:

  1. Pålitelige identifikatorer. En post som deler en identifikator fra et system som er listet som pålitelig (en nasjonal identifikator, et bedriftsnummer) er samme person, uten scoring. List aldri et system som en familie deler, som for eksempel en forsikringsabonnents abonnentnummer.
  2. Score. Ellers finnes personene hvis poster som kan matche ved blokkering (samme lydende etternavn og fødselsår, samme fødselsdato eller samme telefonnummer) og scores med Fellegi-Sunter-vekt over etternavn og fornavn (Jaro-Winkler og Soundex, aksenter og punktering ignorert, byttede navn merket), fødselsdato (en dag og måned byttet er delvis enighet), kjønn, postnummer, telefon og adresse. Bare felt som begge postene har, teller. Scoringen er bevis funnet som en andel av mulig bevis. Blokkering bruker fem nøkler, så ett feil ikke skjuler en person: etternavnslyd og fødselsår, fødselsdato, telefon, begge navnenes lyd (i hvilken som helst rekkefølge) og postnummer med fornavnets lyd.
  3. Avgjørelse. Som standard kobles ingenting på scoring alene. En post som scorer på eller over gjennomgangsgransen (60%) blir en ny person og mulig match venter på gjennomgangskøen; de som er på eller over automatisk terskel (90%) med etternavn og fødselsdato som begge er enige, merkes *sikkert*. Å koble to personer sammen til en (en overlagring) plasserer en pasients resultater i en annen pasients diagram, så automatisk kobling er en bryter en administrator slår på (Koble sikkert sammen uten å spørre noen) en gang køen har vist at de sikkert er riktige. Med den på, kobles en sikkert match når ingen andre personer scorer like høyt. Under gjennomgangsgransen er posten en ny person.

Nasjonale numre. NHS-nummeret (og Skottlands CHI og Nord-Irlands helse- og omsorgsnummer), Irlands PPSN og IHI, Tysklands KVNR, Østerrikes SVNR, Sveits' AHV-nummer, Nederlands BSN, Belgias nasjonale registernummer, Luxembourgs matricule, Frankrikes INS (NIR og NIA), Italias codice fiscale, Spanias DNI/NIE og CIP-SNS, Portugals SNS-nummer, de nordiske personnumrene (Sverige, Danmark, Norge med d-nummer, Finland, Island), de baltiske kodene, Polens PESEL, Tsjekkias og Slovakias fødselsnummer og de ungarske, rumenske, bulgarske, kroatiske, slovenske og greske numrene er kjent for registeret. Hver er lagret på én måte: under dens systemsystem, mellomrom og punktum fjernet, så NHS-nummeret sendt som urn:oid:2.16.840.1.113883.2.1.4.1|999 000 0018 av ett system og som https://fhir.nhs.uk/Id/nhs-number|9990000018 av et annet er ett identifikator. En HL7 v2 PID-3-gjentakelse hvis identifikatortype er NN og et lands trebokstavers kode (NNDEU, NNNLD) leses som landets hovednummer, og type NH fra NHS-myndigheten som NHS-nummeret. Hvert nummers kontrollsiffer testes: ett som feiler, beholdes på dens post, rapporteres (maskert) i svaret og brukes aldri til å koble eller å finne noen, siden et feilskrevet siffer vanligvis gjør en annen persons nummer. Danmarks CPR sjekkes bare for dato, fordi numre utstedt siden 2007 ikke trenger å gå gjennom den gamle modulus 11.

Innstillingene lister opp hver ordning med dens format, dens kontroll og systemet det lagres under. Systemer tatt fra landets egen FHIR-veileder (UK Core, fhir.de, Nictiz, CH Core, ANS, HL7 Italia, MedCom, de svenske, norske og finske OID-registrene) er merket som slike; de andre er standarder som kan endres til nasjonal verdi, som en nettsted kan gjøre per ordning (den gamle er fortsatt gjenkjent). Å stole på en ordning er ett hakk. Nasjonale numre vises i fullt til redaktører og over som standard og maskert (de siste tegnene) til alle andre; Hvem ser numre i fullt endrer det, ned til visere eller opp til administratorer bare. Der et lands lovgivning begrenser en nummers bruk (Frankrikes Référentiel INS, Irlands PPSN, Belgias nasjonale registernummer, Tysklands §290 SGB V), sier innstillingene det. GET /api/mpi/schemes lister opp ordningene og POST /api/mpi/check sjekker ett nummer uten å lagre det. FHIR $match og PIXm svarer autoriserte klienter med numre i fullt.

En dato skrevet dag- eller månedsførst (08/15/1972) beholdes som skrevet og matcher ikke en år-først en: USAs og Europas rekkefølger er uenige, og å gjette ville koble feil personer.

Pasientregisterets skjerm (Bygg) viser tellinger, finner personer etter navn, nummer, EUID eller fødselsdato og åpner hver person: deres poster, hver identifikator og hva som har skjedd med dem og hvem som har gjort det. Redaktører avgjør gjennomgang (Samme person kobler dem; Forskjellige personer holder dem adskilt for alltid), flytter en post til en annen person, tar en post ut (Ikke denne personen) og slår sammen to personer. Administratorer setter terskler, pålitelige identifikatorsystemer, nasjonale numre og EUIDs system. Hver søkning og hver person lest skrives til revisjonsloggen.

Svarer på andre. POST /fhir/Patient/$match (FHIR-operasjon, som IHE PDQm ITI-119 bruker) tar en pasient og returnerer personene som kunne være det, best først, hver en pasient hvis id er EUID, med hver identifikator, search.score og match-grade-utvidelsen (certain, probable, possible); onlyCertainMatches og count blir respektert. PIXm (/mhd/Patient/$ihe-pix, ITI-83) svarer fra indeksen: hver identifikator av hver journal som er koblet til personen, og EUID. Dette gjør også PIX og PDQ i HL7 v3 (/pixv3, /pdqv3; se IHE-dokumentdeling), som også forsyner det.

API-en er /api/mpi (oppsummering og søk), /api/mpi/persons/{euid}, /api/mpi/find, /api/mpi/reviews, /api/mpi/records (register, kobling, frakobling), /api/mpi/merge og /api/mpi/settings.

Vekter. Standard Fellegi-Sunter-vekter kommer fra litteraturen om record-linkage for sykehusregistreringsdata. Estimér fra våre poster (i innstillingene, administratorer; POST /api/mpi/estimate) passer dem til stedets egen indeks med forventning-maksimering, ingen gjennomgåtte par nødvendig: m (enighet blant sanntidige treff) fra parene som blokkering bringer sammen, u (enighet ved tilfeldighet) fra 20 000 par trukket tilfeldig, siden blokkerte par er enige om navn og datoer ved konstruksjon. Estimatet vises ved siden av vektene i bruk og endrer ingenting før det brukes og lagres. Et felt sammenlignet på for få par beholder sin standardverdi. Tilpasningen antar at feltene er uavhengige gitt klassen, som de ikke helt er, så behandle en stor endring med mistanke.

Målt. På FEBRL-datasett 3 (5 000 syntetiske poster av 2 000 personer, duplikatene med skrivefeil, byttede felt, manglende verdier og kallenavn; PERFUSE_TEST_FEBRL), registrert i filrekkefølge med en gjennomgående som svarer på hvert køtt par:

Koblet på egen håndPlassert foran en gjennomgående med riktig personGjemtFeil koblinger
Automatisk kobling av (standard)02 649 av 3 0003510
På, standardvekt1 6371 0123510
På, vekter estimert fra postene1 6221 0703080

Ingen journal ble noen gang koblet til feil person, og ingen av de 2 000 nye personene ble køet unødvendig. De manglende forskjellene på nesten hvert felt (en fødselsdato og en adresse begge skrivefeil, for eksempel) og score under gjennomgangsterskelen. FEBRL er syntetisk og har få navnelikheter; en virkelig indeks har flere, så dens gjennomgangskø vil være lenger, og disse tallene er en gulv på omsorg, ikke et løfte.

8.13 Avgrenset

CSV og dens slektninger. Valgene er på kilde i byggeren, og format-referansen lister filnøklene.

Stier adresserer kolonner. En navngitt kolonne er tilgjengelig når en header-rad er erklært eller navnene er gitt; ellers er kolonnene posisjonelle.

8.13.1 Navngi kolonnene

Det er to måter, og de er eksklusive. Enten navner den første raden i filen dem — den første raden navner kolonnene — eller du lister dem selv, i rekkefølge. Å erklære en header betyr at raden ikke behandles som data.

Hvis ingen er satt, kan kolonnene bare adresseres ved posisjon, så et filter skrevet mot et navn har ingenting å sammenligne med. Å slå på headeren fjerner listen over navn i stedet for å beholde begge: med en header kommer navnene fra filen, så en liste som er igjen vil bli ignorert, og en kanal som leser som om den valgte navnene når filen valgte dem er vanskeligere å feilsøke enn en som nekter.

8.13.2 Hva et filter eller et skript ser

En avgrenset dokument blir mange meldinger, så dette må stå før du skriver noen.

Med splitting på, kjører alt per rad. Declarative trinn, filteret og transformer-skriptet ser alle en rad, og en sti betyr *denne* radens kolonne. Et filter som avviser en rad avviser bare den raden og ingen andre, og mottatt teller er rader i stedet for dokumenter.

Med splitting av, er meldingen hele dokumentet og en skrivning som krysser rader nektes i stedet for å bli brukt på den første. Denne nektelsen er bevisst: stille skrivning til rad én er det atferd som produserer en fil som ser omformet ut og ikke er.

8.13.3 De tre som endrer hva som teller som en feil

Aksepter rader med feil antall kolonner er av som standard. En rad med for mange eller for få kolonner er da en feil, som er hva som fanger en fil hvis form endret uten varsel. Å slå på aksepterer raden og lar manglende kolonner være tomme.

Klipperom mellomrom rundt hver verdi fikser det vanlige tilfelle av en verdi som er padet til en kolonnebredde. La det være av hvor trailing-rom er viktige, som de av og til er i en identifikator.

Behold blanke linjer som rader er av som standard og bør vanligvis være det. På, blir en blank linje en rad med tomme kolonner, som bare betyr noe når en teller må være lik filen nøyaktig.

8.14 Rå

Ingen parsing i det hele tatt. Meldingen er bytes.

Bruk dette når innholdet ikke er noe Perfuse forstår og ikke trenger å: en PDF som flyttes mellom systemer, et proprietært format, et allerede dannet dokument som videreformidles uendret.

Kosten er at ingenting som avhenger av struktur fungerer — ingen felt-nivå-transformasjon, ingen filter på et felt, ingen felt-nivå-sammenligning i paritetssjekkeren. En rå kanal er en pipe, og den er ærlig om å være en.

8.15 Velg

Hvis meldingen er HL7 v2, bruk hl7, selv om du bare har tenkt å videreformidle den uendret. Parsing gir deg sporet, felt-nivå-statistikk, mulighet til å filtrere senere og mulighet til å sammenligne. raw på parsbar innhold kjøper ingenting og mister alt dette.

Bruk raw når parsing ville feile eller ville være en løgn om innholdet.

CMS's *Kill the Clipboard* ber leverandører om å akseptere en pasients poster fra en QR-kode ved innmelding, og å levere besøksposten tilbake på samme måte. QR-koden inneholder en SMART Health Link (shlink:/...): en adresse, en 256-bits nøkkel og, valgfritt, en etikett, en utløpsdato og en passkodflagg. Utveksling → Helse-lenker leser en.

Mottak. Lim inn lenken, eller skann den med kameraet der nettleseren kan (Chrome og Edge). Perfuse henter manifestet, dekrypterer hver fil med nøkkelen fra lenken, summerer hver FHIR-pakke - hvem pasienten er, hvor mange av hver ressurs - og sjekker hver SMART Health Card inne mot utgiverens publiserte nøkkel. *Levér til kanalen* overfører FHIR-innholdet til en kanal som en melding, som er hvordan det når EHR. Henting holdes til egress-politikken ved tilkoblingstid, plain HTTP avvisses, og svaret fra en server som ikke er en manifest-server vises aldri, fordi adressen kom fra en ukjent QR-kode.

Deling. *Del* krypterer en FHIR-pakke, hoster den og viser lenken og dens QR-kode en gang. Serveren beholder chifferteksten og ikke nøkkelen - den kan ikke åpne hva den hoster, og kan ikke vise lenken igjen. En passkod hasheres; ti feil passkoder deaktiverer lenken. Lenker utløper etter 30 dager som standard, kan tilbakekalles og lister hvor ofte og av hvem de ble hentet. Start serveren med -public-url satt til https-adressen pasientenes telefoner når; manifest-URL-en den bygger må være innenfor spesifikasjonens 128 tegn.

Verifisere et kort. *Verifisere et kort* tar en numerisk shc:/ QR (en blokk eller flere), en .smart-health-card-fil eller en JWS, og sier om signaturen matcher utgiverens nøkkel.

8.17 UN/EDIFACT

dataType: edifact leser UN/EDIFACT-utvekslinger (ISO 9735): ORDERS, INVOIC, DESADV, IFTSTA og resten, inkludert den europeiske helsekrav- og laboratoriemeldingen. Tjenestestreng-råd (UNA) respekteres, med frigjørings tegn og, for syntaksversjon 4, gjentakelsesseparator; funksjonelle grupper (UNG/UNE) er valgfrie. Utvekslingen leveres nøyaktig som avsender skrev den.

name: supplier-orders
dataType: edifact
edifact:
  envelope: require      # require (default), warn, or ignore
  split: false           # true: one interchange per message
  acknowledge: contrl    # none (default) or contrl
filter: 'UNB-2.1 == "5412345000013"'
source:
  type: as2              # or http, sftp, file, email ...
  # ...
destinations:
  - name: orders
    type: file
    dir: /data/orders
    filter: 'UNH-2.1 == "ORDERS"'

Konvolutten. UNTs segmenttelling og referanse, UNEs meldingsantall og referanse, og UNZs telling og referanse sammenlignes med hva utvekslingen inneholder. Med require, standard, avviser en mismatch utvekslingen (det er hvordan en overføring som ble avbrutt vises); warn aksepterer den og logger en advarsel; ignore sjekker ikke.

Stier, for kanal- og destinasjonsfilter, teller elementer og komponenter fra 1 i rekkefølgen segmentet skrives, som implementeringsveiledninger nummerer dem: BGM-2 (dokumentnummer), BGM-1.1, NAD(2)-2.1 (den andre NAD-part), LIN-3(2).1 (en repetisjon), UNB-2.1 (avsender), UNH-2.1 (meldingstype). En sti uten en forekomst addreser hver enkelt.

Splitt leverer en utveksling per melding, hver med den opprinnelige UNB (og gruppeheader) og trailere som teller en, så en bestilling kan filtreres, søkes og prøves på egen hånd. Destinasjonsfiltre ser hver del. En fildestinasjon navngir filer etter meldingstype (ORDERS_INVOIC-20261017.edi), og ${control_id} er utvekslingsreferansen.

CONTRL. Med acknowledge: contrl, en avsender som poster over HTTP besvares med en CONTRL-syntaks og tjenesterapport: UCI-handling 7 når utvekslingen ble lest og levert, 4 når den ble avvist eller ikke kunne leveres (HTTP 400 eller 502 så). Den kan ikke kombineres med split, siden en CONTRL besvarer en hel utveksling. Over AS2 er partnerens kvittering bekreftelsen.

Ikke tilbudt: meldingskataloger (som segmenter ORDERS D.96A tillater), så strukturen sjekkes, ikke innholdet; transformasjoner, som ville omskrive en partners dokument; og filter- eller transformasjonsskript (en preprosessor kjører, før parsing). Sjekket mot pydifact 0.1.8, en uavhengig parser, i begge retninger.

9 Bekreftelser

En bekreftelse forteller avsender hva som skjedde. For HL7 v2 over MLLP er det en ACK-melding; avsender vil ikke sende neste melding før den ankommer, og vil vanligvis sende på nytt hvis den ikke gjør det.

Å få bekreftelser feil er den vanligste måten en integrasjon tyst taper data, fordi en avsender som bekreftes har ingen grunn til å klage.

9.1 Tid

Dekket i meldingsflyt, og sammenfatningen er: ack.when er on_delivery som standard, hvilket betyr at bekreftelsen sendes bare etter at hver aktivert destinasjon har akseptert meldingen. on_receipt sender den så snart meldingen er parsert og køet.

9.2 Hva Perfuse sender

En AA når meldingen ble akseptert, en AE når den ble avvist på grunn av en årsak avsender kunne handle på, og en AR når den ble avvist på grunn av en årsak avsender ikke kunne.

Forskjellen mellom AE og AR er hvem som må gjøre noe. AE betyr at meldingen hadde et problem — et felt som ikke kunne tolkes som en dato, et påkrevd segment manglet — og avsenderen kan korrigere det og sende det på nytt. AR betyr at Perfuse ikke kunne akseptere det uavhengig av innhold, noe som vanligvis betyr et konfigurasjons- eller tilgjengelighetsproblem i denne enden. En avsender som sender på nytt etter en AR vil få samme svar.

9.3 Identifisere denne motoren

ack.application og ack.facility fyller MSH-3 og MSH-4 i bekreftelsen.

Når begge er tomme, speiler bekreftelsen den opprinnelige mottakeren — den bruker hva den innkommende meldingen hadde i MSH-5 og MSH-6. Dette er hva de fleste sendere forventer, og det er standard på grunn av det.

Sett dem eksplisitt når senderen validerer dem, eller når flere Perfuse-eksemplarer behandler samme feed og du trenger å vite hvilken som svarte.

9.4 Utløsende hendelse

ack.include_trigger_event sender ACK^A01 i stedet for bare ACK.

Noen mottakere krever det, og andre avviser det, som er grunnene til at det er en eksplisitt valg uten noen smart standard. Hvis en sender avviser dine bekreftelser og innholdet ser riktig ut, er dette det første du bør prøve.

9.5 Negative bekreftelser er ikke feil som skal skjules

En NACK behandlet som en suksess er en av de mest skadelige miskonfigurasjonene som er mulig, og det er vanlig nok til å være verdt å navngi. Det skjer når en destinasjon sender tilbake en negativ bekreftelse og sendersiden registrerer *overføringen* som suksessfull fordi byteene gikk ut og noe kom tilbake.

Perfuse leser bekreftelsen den mottar fra en MLLP-destinasjon og registrerer resultatet i henhold til det. En AE eller AR fra et nedstrømsystem er en leveringsfeil, og det prøves på nytt i henhold til destinasjonens retningslinjer, og teller mot feilraten som utløser varslinger.

Hvis du migrerer fra en annen motor, er dette verdt å verifisere eksplisitt på eget trafikk i stedet for å anta. Paritetskontrollen vil vise det: en destinasjon som den gamle motoren registrerte som levert og Perfuse registrerer som feilet, betyr vanligvis at den gamle motoren ignorerte en NACK.

9.6 Tidsavbrudd

Å vente på en bekreftelse er begrenset. Når den ikke ankommer i tide, er leveringen en feil og køes for nytt forsøk.

Et tidsavbrudd er ikke det samme som en avvisning og registreres forskjellig. En avvisning betyr at den andre siden vurderte meldingen og avviste den; et tidsavbrudd betyr at du ikke vet om den ble prosessert. Den forskjellen bestemmer om et nytt forsøk er trygt: å prøve på nytt etter en avvisning er meningsløst, og å prøve på nytt etter et tidsavbrudd risikerer en duplikat. Perfuse prøver på nytt etter et tidsavbrudd, fordi en manglende klinisk melding vanligvis er verre enn en duplikat, og mottakersystemet vanligvis er i stand til å oppdage en gjentakelse av meldingskontroll-ID.

Om den handelen er riktig for en gitt feed, er en vurdering, og det er verdt å gjøre bevisst for alt der en duplikat har en klinisk konsekvens — en ordre, en medikamentadministrasjon — i stedet for å akseptere standardvalget stille.

9.7 Kilder som ikke bekrefter

Ikke alle transportmidler har begrepet. En filkilde har ingen sted å sende en bekreftelse; en brokerkilde bekrefter til brokeren i stedet for til den opprinnelige senderen; en HTTP-kilde svarer med en statuskode.

Hvor kilden ikke kan levere bekreftelsesmodusen en kanal ber om, avvises kanalen ved lasting i stedet for å starte og stille bekrefte. En kanal som tror den bekrefter og ikke gjør det, er verre enn en som ikke starter.

9.8 X12-bekreftelser

Alt ovenfor handler om HL7 v2. X12 har sine egne bekreftelser, og i motsetning til v2 er de av på standard: en tom innstilling betyr ingen.

Den standarden er den tryggeste, fordi en handelspartner som ikke forventer en bekreftelse og mottar en, kan behandle den som en uønsket interchange. acknowledge-nøkkelen på en X12-kanal tar en av fire verdier:

VerdiHva som sendes
noneIngen. Standard.
999Implementeringsbekreftelse. Erstatter 997 for HIPAA-transaksjoner.
997Funksjonsbekreftelse. Eldre, og fortsatt hva mange betalingsforbindelser forventer.
ta1Interchange-bekreftelse, om omslaget i stedet for innholdet.

Hva som skal sendes, er en egenskap ved handelspartnerforholdet i stedet for meldingen, som er grunnene til at det må konfigureres og ikke kan sluttes. En 999 erstatter en 997 for HIPAA-transaksjoner, men mange partnere — eldre betalingsforbindelser spesielt — er satt opp for å forvente en 997 og vil behandle en 999 som en ukjent fil.

Å sende feil bekreftelse er verre enn å sende ingen. Det svarer på et spørsmål ingen stilte, samtidig som det forlater det virkelige spørsmålet åpent, og senderen har ingen måte å skille forskjellen på.

9.9 HL7 v3-bekreftelser

En HL7 v3-kanal sender en bekreftelse på standard, som er motsatt av X12 og verdt å vite.

Årsaken er transporten snarere enn standarden: en v3-interaksjon ankommer vanligvis over en synkron tilkobling hvor senderapplikasjonen venter på en svar, og en sender som ikke mottar noe vil vanligvis prøve igjen. Det er hvordan en pasient blir registrert tre ganger.

Å slå det av er mulig og må gjøres eksplisitt — "ikke satt" og "satt til false" er med vilje forskjellige, så standarden står med til noen sier noe annet.

10 Levering, køing og nytt forsøk

En destinasjon som ikke kan nås er det normale tilfelle, ikke unntaket. Systemer starter om på nytt, nettverk slutter å fungere, og et sykehus grensesnittsmotor er utilgjengelig under eget vedlikeholds vindu. Levering er bygget rundt dette.

10.1 Kø per destinasjon

Attempt Delivered queue on disk — per destination 1, 2, 3, 4 … Retry growing backoff Dead letter kept, never discarded the same message, at the front Each destination has its own queue, so one slow receiver does not hold up the others. The queue is on disk, so a restart does not lose it. Order is preserved: message 2 is not attempted before message 1 succeeds or is given up on. A message that exhausts its attempts is dead-lettered and kept. Nothing is deleted to make a queue look healthy.

Hver destinasjon har sin egen kø. En destinasjon som feiler, påvirker ikke de andre, og hver har sin egen dybde, alder og nyttforsøksstatus.

Køing er per destinasjon snarere enn per kanal fordi feilen er per destinasjon. En kanalvid kø ville forsinke levering til tre fungerende systemer fordi et fjerde er nede, og de to situasjonene — en destinasjon utilgjengelig, alle fire utilgjengelige — ville se lik ut i statistikken.

10.2 Køinnstillinger

queue on a destination:

NøkkelHva den gjør
enabledOm feilede meldinger skal køes overhodet.
max_attemptsAntall ganger å prøve før å gi opp.
backoffVent før første nytt forsøk.
max_backoffTak for den økende ventetiden.
max_depthMest meldinger å holde. Uten begrensning hvis ikke satt.
retain_hoursHvor lenge en levert melding skal beholdes. Uten begrensning hvis ikke satt.

De to siste manglet fra denne tabellen og fra byggeren, og de er paret som stopper en disk fra å fylle seg. En kø uten noen av dem vokser til filsystemet er fullt, og denne feilen kommer som noe ubeslektet som bryter — en skrivefeil et helt annet sted — snarere enn som et køproblem.

Backoff øker mellom forsøk opp til max_backoff. Økende snarere enn fast, fordi en destinasjon som er nede vanligvis er nede i minutter snarere enn sekunder, og å prøve igjen hver sekund i ti minutter produserer flere hundre logginnførsler som begraver den som betyr noe.

10.3 Rekkefølge bevares

Innenfor en destinasjon, leveres meldinger i ankomstrekkefølge, og en melding som feiler holder sin plass. Senere meldinger venter bak den snarere enn å overtake.

Dette er riktig standard for klinisk data — en innleggelse og en utskrivning som gjøres i feil rekkefølge er verre enn begge som er forsinket — og det har en konsekvens verdt å forstå: en melding som alltid feiler, holder opp alt bak den.

Dette er grunnen til at kølengde og køalder er separate varslingsbetingelser. En dyp kø som tømmes, er et beskjeftiget system. En kø der den eldste meldingen bare blir eldre og eldre, er fastlåst, og varslingstypene queue-depth, queue-age og queue-stuck skiller mellom dem.

En giftmelding — en som aldri vil lykkes uansett hvor ofte den prøves — er den spesifikke feilen denne designen er sårbare for. max_attempts er hva begrenser skaden: etter det, blir meldingen registrert som feilet og køen fortsetter. Å sette max_attempts svært høyt i håp om til slutt å lykkes, omgjør en enkelt feilet melding til en stoppet strøm.

10.4 Når køing er deaktivert

Med queue.enabled false, er en feilet levering en feilet levering. Den blir registrert og ikke prøvd igjen.

Det er riktig valg når forsinket data er verre enn ingen data — en sanntidsvisning, en pagingsystem, noe hvor en melding levert førti minutter etter hendelsen ville være misvisende snarere enn bare forsinket.

Det er feil valg for noe som går inn i en rekord, hvor meldingen er like gyldig en time senere.

10.5 Nytt forsøk versus kø

Det finnes to mekanismer og de opererer på forskjellige nivåer.

retry på en destinasjon styrer umiddelbare forsøk innen én levering — en tilkobling som feiler, prøves igjen etter en kort pause, uten å forlate leveringsveien. Dette håndterer midlertidige feil: en droppet tilkobling, et øyeblikks nei.

queue styrer hva som skjer når disse umiddelbare forsøkene er uttømt. Meldingen forlater leveringsveien og prøves igjen senere på en lengre plan.

Begge eksisterer fordi de to feilene er forskjellige. En tilkoblingsnullstilling på første forsøk er vanligvis borte ved andre forsøk, og å gå gjennom køen for det ville legge til minutter med latency til en feil som varte millisekunder. En destinasjon som er skrudd av for vedlikehold, kommer ikke tilbake innen tre umiddelbare forsøk, og å hamre på den er meningsløst.

10.6 Hva en HTTP-endepunkt regner som levert

En HTTP-destinasjon har tre innstillinger som bestemmer om en melding behandles som sendt, og alle tre er på destinasjonen i byggeren.

Statuskoder som betyr levert. Tom betyr noen 2xx. Noen endepunkter svarer 202 Accepted for noe de ikke har prosessert ennå, og noen svarer 200 med en feil i kroppen — det siste er hva *Behandle som feil hvis svaret inneholder* er for. Å sette en eksplisitt liste er verdt å gjøre når en partner har fortalt deg hvilken kode betyr hva, fordi alternativet er å oppdage forskjellen fra en melding som aldri ble levert og aldri køet.

Følg omdirigeringer. Av ved default, og med overlappende formål. En omdirigering kan peke på en annen vert, så å følge en sender meldingen til et sted ingen har konfigurert og rapporterer suksess.

Bearer-token. Sendes som en Authorization-header. Den lagres med kanalen og vises aldri igjen, så å la boksen være tom når du redigerer en eksisterende kanal beholder tokenet som allerede er lagret, i stedet for å fjerne det.

10.7 Navngi og beskjær et arkivmappe

En fildestinasjon legger til en fil per dag og meldingstype som standard (20261012-ADT_A01.hl7), MLLP-rammet så filen kan spilles av med perfuse send. Fire innstillinger på destinasjonen endrer dette.

Filnavn (file_name) gjør en fil per melding i stedet, navngitt fra ${date}, ${timestamp}, ${control_id}, ${message_type} og ${destination}. Et navn som allerede er tatt (samme kontroll-ID to ganger) får et unikt suffiks i stedet for å overskrive meldingen der.

Legg til (append: true) skriver hver melding til filen Filnavn navner, så ${date}.hl7 er en fil per dag for hver type.

Suffix under skriving (temp_suffix, en fil per melding bare) standard er .part og fjernes ved omnavning når filen er fullstendig. Den som samler inn disse filene bør ikke plukke opp en halvskrevet, og en omnavning innen en mappe er atomisk. Endre det bare hvis samleren filtrerer på en annen utvidelse.

Slett etter (retain_hours) rydder filer i mappen eldre enn det gitt antall timer, sjekket på maks hver tiende minutt mens meldinger ankommer. Bare vanlige filer direkte i mappen slettes, aldri en undermappe. Tom eller null beholder dem for alltid, som er standard og er et valg i stedet for en oversikt — men et arkiv ingen rydder fyller disken, og en full disk stopper kanalen i stedet for arkiveringen.

10.8 Sending til en FHIR-tjener

Tre innstillinger bestemmer hvor mye som sjekkes før en pakke forlater.

Hevde US Core-overensstemmelse legger profilen til hver ressurs. Hevde det bare når ressursen bærer hva profilen krever, fordi en mottaker kan validere mot hevdningen og avvise en pakke som ellers ville blitt akseptert.

Valider før sending sjekker hver ressurs her i stedet for å lære fra mottakeren. Et avslag i den fjerne enden forteller deg mindre, senere, og ofte bare i en logg du ikke kan lese.

Behandle advarsler som avslag har bare en effekt når validering er på, og kontrollen er utilgjengelig til den er. Den er streng nok til å stoppe en pakke en mottaker ville akseptere, så den hører hjemme på en feed som tas i bruk i stedet for en i tjeneste.

10.8.1 Vertede FHIR-tjenester

En fhir-destinasjons auth-blokk logger inn på de vertede tjenestene, hvor et limt bearer-token slutter å fungere innen time:

fhir:
  url: https://healthlake.us-east-1.amazonaws.com/datastore/<id>/r4/
  auth: {type: aws, access_key_id: ${AWS_ACCESS_KEY_ID}, secret_access_key: ${AWS_SECRET_ACCESS_KEY}}

aws signerer hver forespørsel til AWS HealthLake med Signature Version 4, med regionen lest fra URLen. azure får en Microsoft Entra-ID-token for Azure Health Data Services fra tenant_id, client_id og client_secret - en app-registrering som innehar FHIR Data Contributor-rolle - med FHIR-tjenestens URL som målgruppe. client_credentials gjør det samme mot en hvilken som helst OAuth 2.0 token_url. Tokenene gjenbrukes til en minutt før de utløper. De samme valgene finnes under Hosted service sign-in i kanalbyggeren.

10.8.2 Offentlig helse-rapportering av tilfeller

Velg Rapporter rapporterbar tilstand til offentlig helse på en FHIR-destinasjon, og den sender saksrapporter i stedet for samlinger. Hver melding sjekkes for en rapporterbar-tilstand-utløserkode: en diagnose, en laboratorietest eller en kodet resultat. Hvis den har en, blir meldingen en HL7 eCR 2.1.2 eICR, innkapslet i en eCR-melding og postet til URLens $process-message. Hvis den ikke har noen, sendes ingenting og ingenting feiler; destinasjonen teller den som ikke-rapporterbar.

fhir:
  url: https://ecr.agency.example/fhir
  ecr:
    rctc: /etc/perfuse/rctc.json
    source: https://fhir.springfield-general.example/fhir
    facility: {name: Springfield General Hospital, phone: +1-217-555-0100, city: Springfield, state: IL}

rctc er Reportable Conditions Trigger Codes, som en FHIR ValueSet eller eRSD Bundle. Den trenger en UMLS-lisens, så den er ikke inkludert; uten den brukes en kort innbygd eksempel til testing kun. source er hvor byrået sender sin Reportability-svar. Enhet er påkrevd fordi eCR ber om telefon og adresse, og en v2-melding har ingen av delene.

En rapport sier hva meldingen manglet i stedet for å oppfinne det, og hver gap blir logget. Prøv en melding i FHIR-laboratoriets Offentlig helse saksrapport-panel før du peker en live-strøm mot et byrå.

10.8.3 Laboratorieresultater til offentlig helse: ELR

perfuse elr -config elr.yaml results.hl7 konverterer et laboratoriums resultater til HL7 2.5.1 ELR-meldinger som helsemyndighetene mottar, én for hver melding med en rapporterbar resultat, og bare de bestillingene som inneholder en: en fullstendig blodprøve ved siden av en positiv SARS-CoV-2 test er ikke offentlig helsevern. Utløserkodene er de samme som for casereportering, RCTC du laster eller den innebygde eksempelet.

ELR navner alle ved OID eller CLIA-nummer, som ingen laboratoriefeed inneholder for avsender og mottaker, så disse kommer fra filen:

sending_application: {namespace: Perfuse, id: 2.16.840.1.113883.19.5.9, type: ISO}
sending_facility: {namespace: Springfield Lab, id: 2.16.840.1.113883.19.5, type: ISO}
receiving_application: {namespace: ELR, id: 2.16.840.1.113883.19.6.1, type: ISO}
receiving_facility: {namespace: State DOH, id: 2.16.840.1.113883.19.6, type: ISO}
processing: T
ordering_facility: {name: Springfield Clinic, phone: "+1 217 555 0100", line: 1 Main St, city: Springfield, state: IL, postalCode: "62701"}
performing_lab: {name: Springfield Lab, line: 2 Lab Rd, city: Springfield, state: IL, postalCode: "62701"}
performing_lab_clia: 14D0000000
placer_authority: {namespace: SPRINGFIELD-EHR, id: 2.16.840.1.113883.19.5.1, type: ISO}
filler_authority: {namespace: SPRINGFIELD-LAB, id: 2.16.840.1.113883.19.5.2, type: ISO}

Bestillingsfasiliteten, utførende laboratorium og tildelingsmyndighetene brukes bare der laboratoriets melding utelater dem, og hver bruk er en notat. Det som bare laboratoriet vet, fylles aldri inn: en resultat uten prøve-type går med SPM-4 tom og en notat som sier så, fordsom en gjettet prøve i en rapport til offentlig helse er verre enn et hull staten kan spørre om. Start med processing: T så lenge statens onboarding-team tester feeden.

Hva laboratoriet gjorde riktig, beholdes som det ble sendt. En underordnet bestilling (en susseptibilitetspanel eller en refleks-test hvis OBR-29 navngir forelderen och som ikke har noen ORC på egen hånd) går som mottatt, uten noen ORC eller prøve oppfunnet for den, og en underordnet uten noen rapporterbar resultat på egen hånd går med foreldrens, ettersom en susseptibilitet ikke betyr noe uten kulturen det tilhører. En notat etter PID blir hos pasienten, og ORC-14, tilbakekall-telefonnummer, kopieres fra OBR-17 når laboratoriet bare plasserte det der. Alle 28 eksempel- meldinger ONC publiserer for sin ELR-sertifiseringstool kommer ut gyldige uten feil.

MSH-2 skrives som ^~\&#, de fem tegnene ELR Release 1's errata krever og ONC's sertifiseringstool sjekker. Hvis din stats guide viser de eldre fire, legg til encoding_characters: "^~\\&" til filen.

For å sende dem fra en kanal i stedet for fra kommandolinjen, gi destinasjonen som nårer staten en elr-blokk som navngir samme fil. Hver laboratorie-resultat omformes på vei ut, og en med ingen rapporterbar er ikke sendt i det hele tatt, hvilket teller som levert, ikke feilet: staten ba om rapporterbare resultater bare.

destinations:
  - name: state-elr
    type: mllp                 # or http, sftp, file: whatever the state's onboarding team gives you
    address: elr.health.state.example:6661
    tls: {enabled: true}
    elr:
      config: elr.yaml         # beside this channel file
      rctc: rctc.json          # optional; the built-in sample is for testing only

Blokkene gjelder på en HL7 v2-kanal, til destinasjoner som leverer meldingen selv (mllp, http, tcp, fil, sftp, ftp, S3, Azure Blob, soap, meldingsformidlerne eller en annen kanal); kanalen nekter å laste ellers, og når filen mangler eller lacker sendingfasilitet, mottakende applikasjon eller mottakende fasilitet. Notatene skrives til loggen med meldingens kontroll-ID.

ELR-filen er kanalen companion, ikke en kanal: perfuse check og Kanaler-skjermen hopper over den heller enn å rapportere en kanal som ikke laster. I kanalen-byggeren er de samme to innstillingene under destinasjonen, i Lab-rapportering (ELR 2.5.1); utløserkodene-feltet åpner en gang en ELR-fil er navngitt, og lagring avviser en fil som ikke er ved siden av kanalen.

10.8.4 DICOMweb-arkiv

type: dicomweb lagrer hver objekt med STOW-RS: Orthanc, dcm4chee, skytjenester for bilde, eller en Perfuse-servers egen arkiv. Gi tjenestens rot (https://pacs.example/dicom-web); /studies legges til, og en URL som allerede slutter med /studies avvises heller enn å poste til /studies/studies. Autentiser med token (en bearer-token) eller username og password; headers legger til andre, som en skytjenestes prosjektnøkkel. Kanalen trenger dataType: dicom.

Serverens svar bestemmer resultatet, ikke bare statuskoden alene. En objekt som svaret lister som feilet er en feilaktig levering med DICOM-feilårsak, og det samme er en 202 som ikke lister noe som lagret: serveren tok forespørselen og beholdt ingen av den. Tidsavbrudd har en standardverdi på to minutter, fordi en stor serie er langsom.

10.8.5 Dokument-repositorier (IHE XDS.b)

type: xds publiserer hver klinisk dokument til en XDS.b-arkiv med ITI-41 Provide and Register: en CDA-dokument, eller en en HL7 v2-melding (MDM, ORU) bærer. Metadaten kommer fra dokumentet og destinasjonens innstillinger (source_id, patient_domain, facility_type, practice_setting), og arkivets RegistryResponse avgjør leveringen. Se IHE-dokumentdeling.

10.8.6 Vaksinasjons-registre

Hver US-stat immunisering-registrer (IIS) tar HL7 2.5.1-meldinger på samme SOAP-grensesnitt, det som CDC publiserte i 2011 (navnerom urn:cdc:iisb:2011). Det har to operasjoner: connectivityTest, som beviser endepunktet, og submitSingleMessage, som bærer meldingen. En VXU^V04 rapporterer en vaksine og kommer tilbake som en ACK; en QBP^Q11 spør om en pasients historie og prognose og kommer tilbake som en RSP^K11.

Velg Vaksinasjonsregister (CDC IIS web-tjeneste) som tjenesten til en SOAP-destinasjon, eller skriv profile: cdc-iis:

destinations:
  - name: state-registry
    type: soap
    soap:
      profile: cdc-iis
      url: https://iis.state.example/iis-ws/cdc
      username: clinic-submitter       # the registry account for this submitter
      password: "..."
      facility_id: FAC-1234            # optional in the WSDL; many registries require it
    queue: {enabled: true}

Perfuse bygger omslaget, så det er ingen kropp å skrive. Brukernavnet og passordet går inn i forespørselen, der CDC WSDL plasserer dem, ikke i HTTP-autentisering. Versjonen er SOAP 1.2, WSDLs binding, med mindre du setter version: "1.1" for en registreringsveileder som ber om det. Hvor en registrering krever en klient-sertifikat, sett destinasjonens tls som for en hvilken som helst HTTPS-oppkall.

Registreringsbekreftelsen bestemmer om meldingen ble levert, ikke HTTP-status. En registrering svarer en avvist vaksine med HTTP 200 og en AR inni, så en destinasjon som stole på status ville rapportere en tapt vaksinering som levert.

Registret svarerPerfuse-logger
AA (eller CA)Levert.
AE med ERR-segmenter som alle er advarsler (ERR-4 W eller I)Levert. Advarslene er i svaret.
AE med noen ERR-4 E, eller en ERR uten alvorlighetsgradFeilet, med hver ERRs plassering, kode og tekst i feilen.
AR eller CRFeilet, på samme måte.
En SOAP-feil (feil passord, melding for stor)Feilet, med registrets årsak.
Noe som ikke er en HL7-meldingFeilet.

warnings_are_errors: true (Behandle advarsler som feil) gjør at hver AE venter på en person. Svaret, som respons-skriptene og en HTTP-kaller som venter på kanalen leser, er registrets HL7-melding: ACK eller RSP med historikk og prognose. examples/iis inneholder tre kanaler å starte fra: VXU fra et EHR over MLLP, QBP-spørringer over HTTP og en lokal erstatter for et register.

The Connections-dashbord spør et register om dets connectivityTest når ingenting har blitt sendt i syv dager. Denne operasjonen finnes for dette formålet og sender ingenting, så det er den eneste applikasjonsnivåkontrollen Perfuse gjør. Den beviser adressen, TLS og SOAP-bindingen, ikke brukernavn og passord; bare en ekte sending tester disse.

En SOAP-kilde kan svare på samme måte: Svar som en vaksinasjonsregister, eller profile: cdc-iis på kilde. Den gjentar connectivityTest, tar meldingen fra submitSingleMessage, returnerer kanalens bekreftelse i return, og betjener CDC WSDL på ?wsdl. Et brukernavn og passord, når de er satt, blir sjekket mot de som er i forespørselen, og et feil par får WSDLs SecurityFault. En melding som kanalen avviser, blir returnert som en NAK, aldri som en feil, slik CDC-veilederen sier. Bruk den som en test-dobbeltgjenger, eller for å motta innsendinger på samme måte som en register gjør.

Ikke dekket: de statsspesifikke delene av påmelding. Hver registrering har sin egen endpoint, konto-prosess og lokal profil av 2.5.1-veilederen (påkrevde RXA- og OBX-felt, VFC-berettigelse, nekt-koder). Disse er meldingens innhold, som kanalens transformasjoner former; ingen stats endpoint er bygget inn. Perfuse er testet mot seg selv og mot innspilte registrerings-svar, ikke mot en live statsregistrering.

10.9 Når transporten sier ja og meldingen ikke ankom

"Ankom denne" er ofte ikke et spørsmål transporten kan svare på. En MLLP-mottaker returnerer en applikasjonsbekreftelse hvis mening er i dens tekst. En HTTP-mottaker returnerer 200 med en feildokument. I begge tilfeller lyktes transporten og meldingen ankom ikke.

Inspecter svaret på en destinasjon tar et skript gitt mottakerens respons. Returner false, eller kast, og leveringen blir merket feilet — hvilket betyr at den prøver igjen, køer og vises i feil-tellingen i stedet for å bli stille regnet som levert.

Den tilbys bare på destinasjoner som mottar et svar. På en som ikke kan, blir den avvist ved lasting i stedet for å bli liggende uten å kjøre.

10.10 Hva en leveringsresultat betyr

ResultatMening
DeliveredDestinasjonen aksepterte meldingen. For MLLP, ble en positiv bekreftelse mottatt.
QueuedLevering feilet og meldingen vil bli prøvd på nytt.
FailedLevering feilet og vil ikke bli prøvd på nytt, enten fordi køing er av eller forsøk er uttømt.
FilteredDestinasjonen avviste meldingen ved sin egen filter. Ikke en feil.

Disse blir registrert per destinasjon per melding, så en melding som nådde tre av fire destinasjoner blir registrert som nettopp det. Det finnes ingen kanal-nivå "suksess", fordi det ikke ville bety noe.

10.11 Langsom levering

En destinasjon som aksepterer meldinger, men tar lang tid om det, er et eget problem fra en som feiler, og det er lett å overse fordi hver resultat er en suksess.

Den slow-delivery-varslingsarten finnes for dette. Den er verdt å sette på alt hvor senders bekreftelse venter på levering, fordi en destinasjon hvis responstid har stille doblet, vil til slutt krysse senderens tidsavbrudd og begynne å produsere resendinger — og på det tidspunktet vises symptomet oppstrøms, i et system du kanskje ikke administrerer.

10.12 Skriving til en database

type: database kjører en uttalelse per melding med verdier bundet fra meldingen.

Placeholdere er driverens egne — $1 for postgres, ? for mysql og sqlite, @p1 for sqlserver — og Perfuse omskriver dem ikke. Dette er bevisst: en oversettelseslag som fikk en placeholder feil, ville binde en pasients navn til feil kolonne, og resultatet ville se ut som gyldig data i stedet for en feil.

En uttalelse skrevet i feil dialekt blir avvist når den blir lagret, og navnet på stilen driveren ønsker. Før denne kontrollen eksisterte, dukket feilen opp som syntax error at or near "," fra serveren når en melding ankom, som navnet en uttalelse du skrev, og sender deg til å se etter en skrivefeil i stedet for på dialekten.

destinations:
  - name: warehouse
    type: database
    database:
      driver: postgres
      dsn: ${WAREHOUSE_DSN}
      statement: INSERT INTO messages (mrn, family_name, birth_date) VALUES ($1, $2, $3)
      params:
        - PID-3.1
        - PID-5.1
        - PID-7

En sitert parameter er en konstant i stedet for en sti, som er hvordan en kanal skriver sin egen navn eller en kilde-systemkode inn i en rad ved siden av meldingsdataene.

Verdier er alltid bundet som parametre. En ${...}-referanse inne i uttalelsen blir avvist: et navn som inneholder en apostrof ville bryte uttalelsen, og en fiendtlig verdi ville omskrive den.

10.13 Sending til en rå socket

type: tcp skriver til en socket med ramming du velger, som er hva en enhet eller et laboratorieinstrument vanligvis ønsker. MLLP er en ramming blant flere; denne destinasjonen tilbyr de andre.

destinations:
  - name: instrument
    type: tcp
    tcp:
      address: instrument.lab:9100
      framing: delimited
      delimiter: \r
      expect_reply: true
      timeout: 30s

Ramming har ingen standardverdi, med vilje. Skriving med feil ramming feiler ikke. Den fjerne enden leser meldinger delt på feil steder, eller venter på en avslutter som aldri kommer, og symptomet vises i mottakssystemet heller enn her.

framingHva den skriver
mllp0x0b før, 0x1c 0x0d etter. Samme rammeverk som en MLLP-destinasjon bruker.
delimitedEn delimiter etter hver melding, og et valgfritt start_block før den.
fixedPoster justert eller forkortet til record_length.
lengthEn length_bytes-prefiks. big_endian og length_includes_header har begge to konvensjoner i bruk og forskjellen er stille.
wholeEn melding per tilkobling, lukket for å markere slutten.

Kun innstillingene den valgte rammingen bruker, er akseptert. En postlengde på en avgrenset strøm avvises heller enn ignoreres, fordi en innstilling som stille ignoreres er en noen tror er i virksomhet.

expect_reply endrer hva levering betyr. Uten det, betyr suksess at byte nådde operativsystemets sendebuffert — som en peer som krasjet et øyeblikk senere aldri leste.

10.14 Amazon S3, SQS og SNS

En kanal kan lese fra en SQS-kø eller en S3-bucket-prefiks, og levere til SQS, SNS eller S3. Alle fem er signert HTTP med ingen AWS SDK i binærfilen, og alle fem tar samme tilgangsinnstillinger: region, access_key_id, secret_access_key (skriv ${AWS_SECRET_ACCESS_KEY} for å lese miljøvariabelen), et valgfritt session_token og endpoint for LocalStack, MinIO eller en VPC-endpoint. Under Kanaler → Ny kanal, velg *Vi leser fra en Amazon SQS-kø*, *Vi samler objekter fra en Amazon S3-bucket* eller SQS-, SNS- og S3-destinasjonstypene.

Ingenting blir bekreftet til AWS før kanalen har håndtert det. En SQS-melding slettes etterpå og kommer ellers tilbake når synlighets-tidsavbruddet slutter, så en køs redrive-politikk er det som flytter en som fortsatt feiler til en død-brev-kø. En S3-objekt flyttes til processed/ etterpå, eller til error/ hvis den ikke kunne håndteres, så en dårlig fil ikke stopper resten.

På en FIFO-kø eller -emne, blir meldinger gruppert etter pasient som standard - SQS beholder rekkefølge innen en gruppe og ingen andre steder - og deduplisert etter innhold, så en gjentakelse ikke blir levert to ganger.

En S3-arkiv kan skrives direkte til Glacier med storage_class, og som JSON-linjer for Amazon Athena med format: ndjson; perfuse athena skriver ut tabellen. Referansen har alle innstillingene.

10.15 AMQP 1.0 og Azure

AMQP 1.0 er hva Azure Service Bus og Event Hubs kommuniserer med, og RabbitMQ 4, ActiveMQ og Artemis i tillegg til deres andre protokoller. En amqp-kilde mottar fra en kø eller en abonnement og aksepterer hver melding bare én gang kanalen har behandlet den; en som ikke kunne behandles, frigjøres som en feilaktig levering, så megleren leverer den på nytt og, forbi køens grense, markerer den som avdød. En amqp -destinasjon rapporterer bare suksess når megleren aksepterer meldingen. For Service Bus: addr er <namespace>.servicebus.windows.net:5671 med tls, username er navnet på den delt tilgangspolitikken, password er dens nøkkel, og address er navnet på køen, eller <topic>/subscriptions/<name> for å motta.

Azure Blob Storage: en azure_blob-destinasjon skriver en blob per melding i valgt tilgangsnivå - Hot, Cool, Cold eller Arkiv - og en azure_blob-kilde plukker opp blobs fra en prefiks, flyttende dem til processed/ eller error/ som S3-kilden gjør. Foretræk en SAS-token begrenset til containeren over konto-nøkkelen.

10.16 MQTT

En mqtt kilde abonnerer på et emnefilter (+ matcher ett nivå, # hver nivå under) på en hvilken som helst MQTT 3.1.1-broker: Mosquitto, EMQX, HiveMQ, AWS IoT Core, Azure Event Grid. Ved QoS 1, standardverdien, blir hver melding bare bekreftet én gang kanalen har håndtert den. MQTT har ingen måte å avvise en enkelt melding på, så en som ikke kunne håndteres blir latt ubekreftet og forbindelsen gjøres på nytt; brokkeren beholder sesjonen under klient-id (perfuse-<channel> med mindre client_id sier noe annet) og sender den på nytt, først i kø. QoS 0 er maks én gang: alt som sendes mens Perfuse er nede, går tapt. En mqtt destinasjon publiserer og, ved QoS 1, rapporterer suksess når brokkeren har mottatt meldingen.

source:
  type: mqtt
  mqtt:
    addr: broker.hospital.local:8883
    topic: hl7/+/adt
    username: perfuse
    password: ${MQTT_PASSWORD}
    tls: {enabled: true, ca_file: /etc/perfuse/broker-ca.pem}

AWS IoT Core ønsker en klient-sertifikat: gi tls.cert_file og tls.key_file.

10.17 IBM MQ

ibm_mq leser og skriver IBM MQ-køer gjennom kømanagerens meldings-REST-API (mqweb), som IBM MQ 9.1.5 og senere leverer på hver plattform, inkludert z/OS, så ingen MQ-klient er installert ved siden av Perfuse. Brukeren trenger MQWebUser-rollen og put, get og browse-myndighet på køen. En kilde blar gjennom den første meldingen, overfører den til kanalen og fjerner den ved meldings-id bare én gang den ble håndtert; en melding som feiler, blir først i køen. Kjør en lesere per kø. En destinasjon legger til vedvarende meldinger (med mindre non_persistent), med HL7-kontroll-id som korrelasjons-id.

destinations:
  - name: to-mainframe
    type: ibm_mq
    ibm_mq:
      url: https://mq.hospital.local:9443
      queue_manager: QM1
      queue: HL7.ADT.OUT
      username: perfuse
      password: ${IBM_MQ_PASSWORD}
      tls: {enabled: true, ca_file: /etc/perfuse/mq-ca.pem}

api_version er v3 for MQ 9.3 og senere (standard), v2 for 9.1.5 til 9.2. En kømanager med en AMQP-kanal kan også nås med amqp-koblingen.

10.18 Google Cloud Pub/Sub og Cloud Storage

En pubsub-kilde trekker fra en abonnement og bekrefter hver melding når den er håndtert; en som feiler blir levert tilbake med en gang (ved å sette dens bekreftelsesfrist til null), sammen med resten av batchen, så Pub/Sub leverer den på nytt og, etter abonnementets dead-letter-policy, sender den til dead-letter. En pubsub-destinasjon publiserer med HL7-meldingstype og kontroll-ID som attributter; order_by: patient setter sorteringsnøkkel fra PID-3.1, så et abonnement med meldingsrekkefølge holder hver pasients meldinger i rekkefølge.

En gcs-destinasjon skriver et objekt per melding, navngitt som en S3-nøkkel, i lagringsklassen valgt (STANDARD, NEARLINE, COLDLINE, ARCHIVE). En gcs-kilde plukker opp objekter fra et prefiks og flytter dem til processed/ eller error/ som S3-kilden gjør.

Begge logger inn som en tjenekonto: credentials_file er dens JSON-nøkkel. La den være tom på Google Cloud (en VM, GKE eller Cloud Run) for å bruke tjenekontoen som er koblet der. endpoint navngir en emulator (Pub/Sub-emulator, fake-gcs-server), som ikke tar noen legitimasjon.

source:
  type: pubsub
  pubsub:
    project: hospital-integration
    subscription: adt-to-perfuse
    credentials_file: /etc/perfuse/gcp-key.json

10.19 Lese en postkasse (IMAP og POP3)

En email-kilde leser en postkasse og omdanner hva den finner til meldinger: hver vedlegg (take: attachments, standard, innsmurret av attachment_names-mønster), e-postens tekst (take: body), eller hele e-posten (take: raw) for et skript å ta fra hverandre. Laboratorier, bildebehandlingscentre og små praksiser sender fremdeles resultater på denne måten.

Hver kontroll logger inn, leser den ubleste e-posten fra eldst til nyest, og logger ut. Over IMAP hentes en e-post uten å bli merket som lest, levert til kanalen, og bare én gang alle meldinger fra den er akseptert, flyttes den til move_to (Behandlet), merkes som lest (after_read: flag) eller slettes. E-post som feiler, eller som ikke blir tatt (en avsender utenfor allowed_senders, ingen vedlegg som matcher attachment_names, større enn max_message_size), flyttes til error_folder (Feil) med årsaken i loggen. Begge mappene opprettes når de mangler. POP3 har ingen mapper eller flagg, så det sletter: slettinger blir bekreftet ved QUIT-en ved slutten av kontrollen, så en sesjon som avbrytes sletter ingenting og en håndtert e-post kan leses igjen (aldri tapt). POP3-e-post som ier tatt, blir værende på serveren og rapporteres én gang.

Innlogging er et passord (${MAIL_PASSWORD}; et app-passord for Gmail) eller OAuth 2.0 over SASL XOAUTH2, som Microsoft 365 krever (det har slått av passord-innlogging) og Gmail foretrekker:

source:
  type: email
  email:
    host: outlook.office365.com        # imap.gmail.com, pop.gmail.com, or your server
    username: results-feed@hospital.example
    oauth:
      provider: microsoft              # microsoft, google or custom (with token_url)
      tenant: hospital.onmicrosoft.com
      client_id: 00000000-0000-0000-0000-000000000000
      client_secret: ${MAIL_CLIENT_SECRET}
    attachment_names: ["*.hl7"]
    allowed_senders: [lab.example, results@partner.example]

Med client_secret og ingen refresh_token, brukes Microsoft 365 app-bare tilgang (client-credentials-godkjenning, omfang https://outlook.office365.com/.default): en administrator registrerer appen, gir den IMAP.AccessAsApp og begrenser den til den ene postkassen med en Exchange-tjenesteeier. Med en refresh_token (en persons samtykke), brukes det delegerte omfanget IMAP.AccessAsUser.All eller POP.AccessAsUser.All, og en rotert refresh-token blir lagret for prosessens levetid. Gmail trenger en refresh_token: Google tilbyr ingen app-bare tilgang til en postkasse.

allowed_senders tar adresser og domener. Fra-linjen i en e-post kan forfalskes, så den holder ute uhell og villfarne e-post, ikke en angriper; en feed som må være tillitsfull, hører hjemme på Direct (S/MIME-signert), SFTP eller en VPN. security er tls (993 eller 995, standard), starttls (143 eller 110) eller none, som bare er tillatt til localhost. Kontroller er minst 10 sekunder fra hverandre (60 som standard), fordi e-post-tjenester begrenser kontoer som kontrollerer oftere.

Testet mot GreenMail 2.1.3 (IMAPS, IMAP, POP3S og POP3: innlogging nektet med feil passord, henting uten å markere som lest, FLYTT, flagg, slett, en for stor e-post nektet før den leses) og mot Gmails IMAP med et app-passord (opprett en mappe, legg til, hent, FLYTT, slett). OAuth ble testet mot en stand-in token-sluttpunkt bare: ikke mot Microsoft eller Google.

10.20 AS2

AS2 (RFC 4130) er hvordan mange betalere, klareringshus og leverandører utveksler EDI: en HTTP-POST hvor body er signert med avsendersertifikatet og kryptert til mottakers, besvart med en kvittering (en MDN) som navngir en digest av hva som ankom. S/MIME er samme kode som Direct-meldinger bruker. Begge ender er på kanalbyggeren: Handelspartnere sender oss EDI over AS2 som kilde, En handelspartner over AS2 som destinasjon.

# receive: partners post here
source:
  type: as2
  as2:
    listen: ":4080"            # path /as2 by default
    id: HOSPITAL-AS2           # our AS2 identifier (AS2-To)
    cert_file: as2/ours.crt    # partners encrypt to this
    key_file: as2/ours.key     # and receipts are signed with it
    tls: { enabled: true, cert_file: tls.crt, key_file: tls.key }
    partners:
      - id: PAYER-AS2
        cert_file: as2/payer.crt
dataType: x12
# send
destinations:
  - name: payer
    type: as2
    as2:
      url: https://as2.payer.example/as2
      from: HOSPITAL-AS2
      to: PAYER-AS2
      cert_file: as2/ours.crt
      key_file: as2/ours.key
      partner_cert_file: as2/payer.crt
      file_name: "${control_id}.x12"

Mottak. En melding til en annen AS2-To, eller fra en avsender som ikke er i partners, blir nektet med 403 og ingen kvittering. En partners melding må være signert og kryptert med mindre dens post setter allow_unsigned eller allow_unencrypted. Payloaden dekrypteres, signatur kontrolleres mot partnersertifikatet (partnere bytter vanligvis selvsignerte sertifikater, som er greit: sertifikatet er tillit), og overføres til kanalen som dens meldingsformat sier. Partneren får kvitteringen den ba om: i svaret, eller postet til dens Receipt-Delivery-Option-URL; signert når den ba om en signert en. En melding som feiler, får en kvittering som navngir hvorfor (decryption-failed, authentication-failed, insufficient-message-security, unexpected-processing-error).

Sending. Hver melding signeres (SHA-256) og krypteres (AES-256-CBC). Med receipt: sync, som er standard, regnes det som levert først når kvitteringen verifiseres mot partner_cert_file, sier processed, og har samme digest (MIC) som what ble sendt; noe annet er en feilende levering og prøves på nytt. receipt: async ber om kvittering på receipt_url, som må være en AS2-kilde på denne serveren som listar partnern: meldingen regnes som levert så snart partnern aksepterer forespørselen, og en kvittering som senere ikke er enig logges som en feil. receipt: none ber om ingenting. unsigned, unencrypted og unsigned_receipt avslapper hver del for en avtale som sier det; username og password legger til HTTP-basisk autentisering for gateways som krever det. Innholdstypen følger kanalens format (application/edi-x12 for X12) med mindre content_type setter en.

Triple DES, AES-128 og AES-192 leses like godt som AES-256, siden partnere fortsatt sender dem, og likeledes er det streaming BER (uendelige lengder) som Java-gateways skriver.

Komprimering (RFC 5402). En komprimert melding leses uansett hvordan den ble bygget: komprimert før signering eller kryptering, eller en signert melding komprimert hel. Kvitteringens MIC følger RFC-en: over hva som ble signert når det er signert, over ukomprimert innhold når det ikke er. En melding som ville utvide seg forbi ti ganger kildens max_message_size, blir nektet med decompression-failed, så noen få kilobyte ikke kan kreve gigabyte med minne. En destinasjon komprimerer med compress: true, før signering og kryptering, som de fleste gateways gjør; spør partneren først.

En melding sendt to ganger. En partner som aldri fikk vår kvittering sender meldingen igjen med samme Message-ID (RFC 4130 seksjon 7.5). Kilden husker hver partners Message-IDs for duplicate_window (standard 720h, 30 dager; minst en time) og svarer på en ny sending med en processed kvittering uten å sende den videre igjen. Oppføringen lagres i databasen, så en omstart glemmer den ikke. En melding hvis behandling feilet, huskes ikke, så partnerens nytt forsøk går igjennom. Kopier som ankommer samtidig venter på hverandre, og bare den første sendes videre. Hvis oppføringen ikke kan leses, avvises meldingen med unexpected-processing-error og partneren prøver igjen senere, i stedet for å risikere en andre kopi. En melding uten Message-ID kan ikke gjenkjennes og logges som slik.

Samhandling testes mot pyas2lib 1.4.3 i begge retninger, med Triple DES og AES-256, komprimert og ikke, signerte synkroniseringskvitteringer inkludert.

10.21 OpenPGP

Betalere, clearinghus og statlige etater tar ofte og sender filer bare under OpenPGP. En pgp-blokk på en kilde åpner hva som ankommer; en på en destinasjon beskytter hva som forlater. Begge er på kanalbyggeren: Åpne PGP-krypterte meldinger under kilden, Krypter med OpenPGP på hver destinasjon.

source:
  type: sftp
  sftp: { host: sftp.payer.example, user: hospital, key_file: keys/id_ed25519, dir: outbound }
  pgp:
    decrypt_with: keys/our-secret.asc      # our secret key, armored or binary
    passphrase: ${PGP_PASSPHRASE}
    verify_with: [keys/payer.asc]          # the senders' public keys
    require_signature: true
destinations:
  - name: claims
    type: sftp
    sftp: { host: sftp.payer.example, user: hospital, key_file: keys/id_ed25519, dir: inbound,
            file_name: "${date}-${control_id}.x12.pgp" }
    pgp:
      encrypt_to: [keys/payer.asc]
      sign_with: keys/our-secret.asc
      passphrase: ${PGP_PASSPHRASE}

Nøkkel-filer leses relativt til kanal-filen, og leses og låses åpne når kanalen lastes: en manglende nøkkel eller feil passord stopper kanalen der, ikke på den første filen.

Meldinger skrives med AES-256 i RFC 4880-formatet eldre mottakere leser, og nyere RFC 9580-formatet leses også. Kryptografien er ProtonMail/go-crypto; Perfuse implementerer ingen primitiv. Samarbeidstesting er testet mot GnuPG i begge retninger: gpg dekrypterer og verifiserer hva Perfuse skriver, og Perfuse åpner og verifiserer hva gpg skriver.

10.22 Levering til en annen kanal

En kanal-destinasjon overleverer meldingen til en annen kanal ved navn. Mottaker-kanalen behandler den som en vanlig ankomst: den registrerer den, filtrerer den, transformerer den og sender den videre.

Dette er den støttede måten å bygge en kjede. Den er bevisst synlig — to kanaler, to sett med statistikk, to oppføringer i meldingshistorikken — fordi en kjede skjult inni en kanal er en kjede ingen kan overvåke.

Meldingen overleveres i minne i stedet for over et nettverk, så det er ingen ramming, ingen bekreftelse og ingen tidsavbrudd mellom de to.

10.23 Hva skjer når prosessen avsluttes

Spørsmålet enhver som har kjørt en grensesnittsmotor spør først, og det som sjelden besvares, fordi det ærlige svaret vanligvis er pinlig.

Det ble svart ved å drepe prosessen med SIGKILL delvis gjennom en batch — som er hva en strømfeil, en minne-ut-mot-kill og en hypervisor-tilbakestilling alle ligner på fra innen — og telle hva som overlevde mot hva som var lovet.

Egenskapen som testes, er ikke "ingen blir tapt". Det er ikke oppnåelig og å hevde det ville være en løgn. Det er det smalere løftet en avsender faktisk pålitrer: en melding som ble positivt bekreftet, er en melding som ankom.

Med ack.when: on_delivery, som er standard, skrives hver destinasjon før bekreftelsen sendes ut, så en AA er en uttalelse om destinasjonen heller enn om en kø. En melding som ble drept før bekreftelsen, kan godt bli tapt, og det er correct: avsenderen ble aldri lovet noe og vil sende den igjen.

10.23.1 Bekreftelse ved levering

Fem kjøringer, drept etter 5, 25, 40, 75 og 110 meldinger av 120.

BekreftetTil stede nedstrøms etterpåBekreftet men mangler
2552550

Løftet som ble holdt på hver avbrytning, og ingenting ble duplisert. En duplikat ville ha vært akseptabelt og en tap ville ikke: en sendt A08 er en plage mottakere absorberer, og et laboratorie-resultat som stille og rolig aldri ankom er en pasientsikkerhetshendelse.

10.23.2 Bekreftelse ved mottak

on_receipt svarer så snart meldingen er køet, før noen destinasjon har blitt skrevet. Dette kapitlet har alltid sagt en bekreftet melding kan fortsatt bli tapt på denne måten. Her er størrelsen på det.

Drept etterBekreftetTil stede nedstrømsTapt
5514
2525124
7575273
1101102108

Essensielt alt i flyt. Innstillingen er ikke en defekt og det finnes fôringer hvor det er riktig valg, men det bør velges med kunnskap om at en krasj diskarderer hva som har blitt bekreftet og ikke skrevet ennå, og at dette er nesten alt av en burst.

Ingenting gjenopprettet ved omstart, fordi perfuse run har ingen varig lagring. En destinasjon som ikke må tape meldinger under en nedtid, trenger queue.enabled, som trenger databasen som perfuse serve tilbyr — og perfuse run nekter nå slike kanaler heller enn å starte dem uten køen.

10.23.3 En avsender som dør halvveis gjennom en melding

Den farligste av disse feilene, fordi en trunkert HL7-melding vanligvis fortsatt parser. Segmentene før kuttingen er komplette og velformede, så en mottaker har ingen måte å vite at PID og PV1 ankom og OBX-segmentene som bærer resultater ikke gjorde.

En ramme ble åpnet, seks tiendedeler av en melding sendt, og tilkoblingen nullstilt i stedet for lukket. Den delvise meldingen ble ikke levert, lytteren overlevde, og en velformet melding sendt umiddelbart etterpå ble akseptert normalt, så fragmentet ble ikke båret inn i den neste meldingen heller.

Tilkoblingsloggen rapporterer nå hvor mange bytes av en ufullstendig ramme som ble forkastet, for hver feilmodus heller enn bare en ren lukking. Tidligere logget en krasjet avsender, en drept prosess og en trukket kabel alle messages=0 og ingenting annet, som ikke kan skille en tom helsekontroll fra et laboratorieresultat kastet bort ni tiendedeler av veien.

10.23.4 En full disk

Utmatings-utmattelse blir nå detektert og logget i stedet for svelget. To ting om det er verdt å vite.

Avsenderen får ikke en umiddelbar avvisning. Leveringen gjentas på den vanlige skjemaet — en sekund, to, fire, åtte — og den negative bekreftelsen ankommer omtrent femten sekunder senere. En avsender hvis egen tidsavbrudd er kortere enn det ser en stanset tilkobling i stedet for en AE, og vil konkludere at nettverket er feil i stedet for disken.

Og en volum som rapporterer null byte ledig kan fortsatt akseptere små vedlegg en stund, fordi tilføyelse av noen hundre byte til en fil hvis siste blokk har plass trenger ingen ny allokering. Den første skrivefeil skjer senere enn øyeblikket disken ble full.

10.23.5 Hva som ikke ble testet

En destinasjonsmappe som mister skrivetilgang. Den kunne ikke injiseres med chmod: motoren holder skrivefilen åpen, og å endre en filsmode påvirker ikke en beskriver allerede åpnet mot den. Å teste det ordentlig krever at volumet monteres som skrivebeskyttet eller fjernes under prosessen, noe som ikke er gjort. Den er nevnt her i stedet for å utelates, fordi et gap ingen nevner, leser som et gap ingen har søkt etter.

11 Varsling

Ingenting utenfor Perfuse vil fortelle deg at en fôring har stoppet. Avsenderen blir bekreftet og er tilfreds; mottakeren har ingen måte å vite at en melding ble sendt. Varsling er det eneste som står mellom en ødelagt grensesnitt og noen som legger merke til det uker senere.

11.1 Varslingstypene

TypeUtløses når
error-rateFeil overskrider en proporsjon av trafikken.
queue-depthEn kø har mer enn N meldinger som venter.
queue-ageDen eldste køede meldingen er eldre enn en varighet.
queue-stuckEn kø tømmes ikke i det hele tatt.
no-trafficIngenting har ankommet i en fast periode.
below-rhythmTrafikken er langt under hva denne kanalen normalt gjør *på denne ukedagen*.
channel-downEn kanal som burde være i gang, er ikke det.
script-errorsEt skript feiler.
rows-quarantinedEn databasekilde setter radene til side.
slow-deliveryLeveranser lykkes, men tar for lang tid.
contractEn melding bryter mot kanalens erklærte kontrakt.
phi-volumeEn kanal transporterer flere ganger sin vanlige rate for timen.
phi-after-hoursEn kanal som bare transporterer dagtrafikk, transporterer noen om natten.
phi-new-destinationEn kanal leverer til en adresse den ikke har sendt til før.
phi-bulk-readsEn person leser mer enn N forskjellige pasienters poster innen en minutt.

De fire siste overvåker tilgang til pasientdata og beskrives nedenfor.

11.2 Stille er det hardeste å oppdage

En kanal som har stoppet å motta data produserer ingen feil. Det er ingenting å telle. Dette er hvorfor no-traffic eksisterer, og hvorfor det ikke er nok på egen hånd.

no-traffic er en fast terskel: varsle hvis ingenting har ankommet i, for eksempel, to timer. På en feed som aldri går stille, fungerer det. På en klinikkens laboratoriefeed er det nytteløst — feeden er stille hver natt og hele helgen, så en to-timers terskel varsler noen klokken 01.00 hver natt, og en terskel lang nok til å overleve helgen vil ikke merke en utsikt på en tirsdag morgen før på tirsdag ettermiddag.

Det finnes ingen enkelt tall som er begge deler. Dette er ikke et justeringsproblem; det er at spørsmålet "har denne feeden stoppet" ikke kan besvares av en konstant når feedens normale varierer med en faktor på hundre over uken.

11.3 Rytmebevisst deteksjon

below-rhythm sammenligner nåværende trafikk mot hva denne kanalen normalt gjør i denne timen på denne dagen i uken.

Perfuse lærer hver kanals uke fra sin egen innspilte historie: 168 timebøtter, mandag først så en arbeidsuke er sammenhengende. For hver bøtte holder den en median, en lav og en høy, en gulv, og hvor mange observasjoner den er basert på.

Grensen er en andel av normalt, som standard er 0.8 (80 prosent i konsollen) — varsle når trafikken faller under fire femdeler av hva som er normalt for denne timen.

11.3.1 Median, ikke gjennomsnitt

En enkelt backlogg-utløsning av førti tusen meldinger mot en normal på tre hundre flytter et gjennomsnitt langt nok til at feeden kan gå helt stille etterpå uten å noen gang falle under det. Medianen er uendret av en ekstraordinær time, som er nettopp den egenskapen som trengs.

11.3.2 Gulvet er en percentil, ikke minimum

Om en kanals rytme er pålitelig nok til å varsle på, bestemmes av dens laveste punkt, ikke dens høyeste punkt. En varsling for underskudd utløses når trafikken er *lav*, så bare laveste punkt kan fortelle om det vil produsere falske positiver. En tidlig versjon av dette sammenlignet høyde mot median og fikk det feil i begge retninger på samme tid: den diskvalifiserte en fullstendig jevn feed i en måned etter en backlogg, og den godkjente en genuint ustabil feed som svingte mellom to og ni hundre meldinger i samme time fordi dens høyde bare var tre ganger dens median.

Gulvet er den tyvende percentilen i stedet for minimum, fordi minimum trekkes til null av en enkelt bankferie. Og percentilen er ikke interpolert — hvert tall i en varsling klokken to om morgenen bør være et tell som feeden faktisk produserte, ikke en gjennomsnitt av to tell som den ikke gjorde.

11.3.3 Den vil si når den ikke kan si

En kanal med ingen historie overhodet utelates fullstendig i stedet for å behandles som en som har stoppet. En ny kanal må ikke se ut som en ødelagt en.

Hvor historien er for tynn eller for ustabil til å støtte en dom, avviser regelen å utløse i stedet for å gjette. "Jeg kan ikke ærlig si" er et førsteklasses svar her, og det er foretrukket fremfor en varsling som er riktig litt oftere enn tilfeldighet.

Fraværende timer innenfor læringsvinduet registreres som ekte nuller, ikke som manglende data. Halve signalen i en klinikks feed er *når den er legitimt stille*, og å behandle disse timene som ukjente ville kaste det bort.

11.4 Konfigurere varslinger

Fra grensesnittet, underVarsler, per kanal eller på tvers av alle. Hver regel har en type, en terskel og hvor å sende varselet. Reglene lagres til alerts.yaml ved siden av databasen (eller filen -alerts navn) og treffer umiddelbart; inntil den første lagringen gjelder de innebygde reglene. Filen kan også redigeres manuelt: endringen blir plukket opp innen tretti sekunder, og en fil som ikke lenger lastes, rapporteres i loggen og reglene i kraft beholdes.

Verdt å gjøre før en feed går live i stedet for etter den første hendelsen. Den spesifikke samlingen verdt å ha på noen kliniske feed:

  1. below-rhythm — feeden har gått stille når den ikke bør være stille.
  2. error-rate — meldinger ankommer og feiler.
  3. queue-age — noe er fast og ikke bare opptatt.
  4. channel-down — kanalen kjører ikke i det hele tatt.

Den første er den som fanger feilen ingen andre vil rapportere.

11.5 Overvåking av tilgang til pasientdata

En bruddannonsere seg sjelden. Det ligner en kanal som bærer mer enn vanlig, trafikk klokken tre om natten på en kanal som bare arbeider på kontortid, en destinasjon ingen har satt opp, eller en person åpner pasient etter pasient. Perfuse overvåker disse fire, på som standard (serve -watch-access=false slår det av), og rapporterer hva den ser gjennom advarselsreglene ovenfor, så det er konfigurert, bekreftet og levert som enhver annen advarsel.

Ingenting vurderes for en kanal før den har sendt 200 meldinger, fordi "uvanlig" ikke betyr noe uten en mønster. Mønsteret lærer fra de siste to ukene av meldingslagret når serveren starter, så en omstart gjør ikke hver kanal ny igjen. Alt som sees, holdes i femten minutter, så varslingen fjerner seg selv.

Den ser bare på og rapporterer. Den holder aldri opp en melding eller nektar en lesing: disse er heuristiske, og en strøm som stopper fordi en gjetning var feil, er et klinisk problem. Hver varsling sier hva som ble sett og hva det kunne uskyldig være, fordi de fleste av dem vil være uskyldige.

Administratorene ser hva overvåkningen har lært på Varslingsskjermbildet, under Overvåking av tilgang til pasientdata: hver kanals mønster (fortsatt lærer, bare på dagtid eller dag og natt), hvor mange destinasjoner den kjenner, og alt som er sett i de siste femten minuttene, inkludert hva som er under en regels terskel.

11.6 Hvor varslinger går

Varsler kan sendes som JSON til en webhook (-alert-webhook: Slack, Teams, Mattermost, PagerDuty, Alertmanager eller noe som aksepterer en POST), sendes som SNMPv2-feller til SNMP-managere (-snmp-traps, se SNMP), eller skrives til loggen for en samler å plukke opp. Det finnes ingen e-postlevering på egen hånd: peke webhooken mot en relé hvis varsler må ankomme som e-post.

En varsling som bare skrives til en logg ingen leser er ikke en varsling. Hvis Perfuse er det eneste som vil merke en stoppet feed, må varslingen nå en person.

12 Meldingslagringen

Hver melding Perfuse mottar blir registrert, slik den ble mottatt, før noe modifiserer den. Det samme gjelder for hva som ble sendt til hver destinasjon og hva som skjedde med den. Lagringen er en SQLite-fil gitt av -db.

12.1 Hva som lagres

Per melding: de rå byte som ankom, når de ankom, hvilken kanal, den parsede meldingstypen og triggerhændelsen, og filterresultatet.

Per destinasjon per melding: byte som ble sendt, resultatet, tiden det tok, og eventuelle feil eller negative bekreftelser som ble mottatt.

Dette er formen en undersøkelse trenger. "Hva sendte de oss", "hva sendte vi dem" og "hva sa de om det" er tre forskjellige spørsmål og hver av dem blir stilt.

12.2 Søking

Etter kanal, tidsspann, resultat, meldingstype og triggerhændelse, og etter feltverdi.

Feltsøk fungerer på den parsede meldingen, så søking etter en journalnummer finner det uansett hvor i meldingen feltet bor, i stedet for å matche sifrene hvor som helst i teksten. En tekstsøk etter 12345 i en melding som inneholder en mengde på 12345 finner en melding som ikke har noe å gjøre med pasienten du søker etter.

12.3 Gjenavspilling og gjenprosessering

Fordi originalen lagres, kan en melding kjøres gjennom den nåværende konfigurasjonen igjen.

Sporing tar en innspilt melding og viser hva kanalen ville gjøre med den nå, uten å sende noe. Dekket i feilsøking.

Gjenprosessering kjører den faktisk igjen, inkludert levering. Dette er hva fikser en batch med meldinger som feilet fordi en destinasjon var feilkonfigurert: korrigér konfigurasjonen, velg de berørte meldingene, gjenprosesser.

Gjenprosessering leverer igjen. Hvis meldingene delvis lyktes første gang, vil gjenprosessering produsere duplikater hos destinasjonene som allerede hadde dem. Perfuse registrerer hvilke destinasjoner som lyktes, så gjenprosessering kan begrenses til de som feilet — gjør det i stedet for å gjenprosessere alt, med mindre mottakssystemet fjerner duplikater basert på meldingskontroll-ID.

12.4 Uaktualitet

En sporingslogg av en gammel melding mot den nåværende konfigurasjonen svarer på en hypotetisk: hva *ville* skje nå. Det er vanligvis hva du vil, men ikke alltid — hvis du undersøker hva gikk galt forrige tirsdag, kan kanalen ha endret seg siden.

Perfuse detekterer dette og sier det. En sporingslogg av en melding som ankom før kanalen ble redigert sist, blir merket som sådan, så svaret ikke blir forvekslet med en rekonstruksjon av hva som faktisk skjedde.

12.5 Oppbevaring

Lagringen vokser. cleanup.periodDays kontrollerer hvor lenge meldinger lagres.

To ting å veie. Kliniske meldinger kan falle under oppbevaringskrav som er lengre enn noe du ville velge av operative årsaker, og lagringen er ikke systemet for registrering — mottakssystemet er. Perfuses kopi eksisterer for å diagnostisere og gjenprosessere, og begge disse behovene avtar skarpt etter noen uker.

Retensjon bestemmer også hvor mye historikk rytme-læren har å jobbe med. Se alerting: et retensjonsvindu kortere enn noen uker gjør det umulig å skille mellom en stille søndag og en stoppet strøm.

12.6 Lagringen inneholder kliniske data

Dette er den delen av Perfuse som inneholder pasientinformasjon, og den bør behandles som sådan: på kryptert lagring, sikkerhetskopiert som klinisk data og tilgangskontrollert. Se sikkerhet.

De genererte testmeldingene beskrevet i testing eksisterer delvis så denne dataene ikke trenger å forlate miljøet for å reprodusere et problem andre steder.

13 Feilsøking

Spørsmålet er nesten alltid det samme: denne meldingen kom inn, noe gikk galt ut, hvor ble det endret? Perfuse besvarer det ved å spille av en innspilt melding gjennom den nåværende konfigurasjonen og vise hver enkelt steg.

Ingenting sendes mens det spores. Kanalen fortsetter å kjøre urørt, og ingen ny distribusjon er nødvendig.

13.1 Sporing av en melding

Velg en hvilken som helst innspilt melding og spor den. Resultatet vises, i rekkefølge:

13.2 Steg for steg

Gjennomgangsvisningen kjører hver transformasjon for seg og tar et øyeblikksbilde av hele meldingen etterpå. En nummerert liste over steg, fargelagt etter hva som skjedde, og meldingen slik den var på hvert punkt.

Hele meldingen heller enn bare endringen, fordi problemet ofte ikke er der endringen er — et steg som korrekt modifiserte feltet det var rettet mot, på en melding hvor et tidligere steg allerede hadde plassert feil ting der, ser perfekt korrekt ut i isolasjon.

13.3 Fire resultater, og forskjellen som teller

ResultatBetydning
changedSteget kjørte og modifiserte meldingen.
no-effectSteget kjørte, og meldingen er uendret.
skippedStegets when-betingelse var falsk, så det kjørte ikke.
failedSteget feilet.

no-effect og skipped rapporteres separat, og dette er poenget med hele funksjonen.

Utenfor er de identiske: meldingen er den samme etterpå uansett. De betyr motsatte ting. skipped betyr at betingelsen fungerte som skrevet og denne meldingen var ikke en den gjaldt for — vanligvis korrekt. no-effect betyr at steget kjørte og fant ingenting å gjøre, som vanligvis betyr at det er rettet mot et felt som ikke er der.

En motor som rapporterer begge som "ingenting skjedde" lar deg ikke kunne skille mellom en fungerende betingelse og en feil sti, og det er den vanligste transformasjonsfeilen der er.

Et steg som rapporterer no-effect på hver melding er nesten alltid en feil sti. Gjennomgangshodet teller hvor mange steg fant ingenting, som er den raskeste måten å spore det på: en kanal med tre steg og tre no-effect-resultater transformerer ingenting i det hele tatt.

13.4 Testing av en endring før den lagres

Byggeren kan kjøre en kandidatkonfigurasjon mot innspilt trafikk og rapportere hva som vil være forskjellig. Dette er den tryggeste måten å endre en live-kanal: gjør redigeringen, se hva den gjør med de siste få hundre ekte meldingene, og lagre deretter.

Det er også hvordan du finner ut at en endring som ser åpenbart korrekt påvirker meldinger du ikke hadde tenkt på — et steg betinget av en utløsende hendelse, på en strøm som viser seg å bære fire.

13.5 Hva sporingsfunksjonen ikke kan fortelle deg

Den kjører den nåværende konfigurasjonen. Hvis kanalen er redigert siden meldingen ankom, er sporingen en hypotetisk heller enn en rekonstruksjon, og Perfuse markerer den som sådan heller enn å la forskjellen passere stille.

Den øver ikke transporten heller. En sporingsfunksjon viser hva som ville bli sendt, ikke om destinasjonen ville akseptere det — en melding som er korrekt og en destinasjon som nektar forbindelser, produserer en ren sporingsfunksjon og en feilende levering. Disse er synlige i leveringsrekorden i stedet.

13.6 Skript

Et skript er ett uigjennomsiktig steg i sporingen. Perfuse kan vise hva som gikk inn og hva som kom ut, og kan ikke vise hva som skjedde imellom eller hvilke felt som ble lest.

Dette er den konkrete kostnaden ved å bruke et skript i stedet for deklarative steg, og det er verdt å vurdere når du velger. Se transformation.

14 Testing

Standard råd for testing av et grensesnitt er å bygge eksempelmeldinger som reflekterer din egen miljø — laboratoriets koder, case-mix, senders vaner — og å fjerne pasientdataene for hånd. Det er tregt, og å gjøre det ufullstendig er det normale resultatet.

Perfuse tilbyr tre ting i stedet: generert trafikk som matcher en strøms form uten innhold, en kanal foreslått fra en eksempel noen sendte deg, og en sammenligning mot motoren du erstatter.

14.1 Generert testtrafikk

Hvis en kanal har håndtert meldinger, kan Perfuse produsere flere meldinger som ligner dem.

Hva som er troverdig:

Hva som ikke er troverdig, og dette er uttalt heller enn antydet: klinisk konsistens. En generert pasient har et urelatert journalnummer, en navn-lignende streng og en diagnose uten noen relasjon til observasjonen. Disse meldingene øver en grensesnitt. De er ikke en klinisk testsett og kan ikke brukes til å validere klinisk logikk.

14.1.1 Hvorfor den ikke inneholder noen ekte data

Argumentet er strukturelt heller enn et krav om innsats. Generatorens eneste innputt er kanalens trafikk profil, og en profil holder fyllingsrater, former, lengder, repetisjons tellere og segmentfrekvenser. Den holder ingen verdier.

Den eneste unntakningen er kode-tabellfelt, og en kode identifiserer ingen.

Dette er en sterkere garanti enn å fjerne identifiserende opplysninger fra ekte meldinger, som er en prosess som kan gjøres ufullstendig og vanligvis er det. Her er det ingen vei hvor et navn kunne nå utdata, fordi navnet aldri var i innputt.

Hver generert melding blir parsert før den returneres — en uparsbar korpus ville sende noen på jakt etter en feil i deres grensesnitt som faktisk er en feil i generator — og hver enkelt er merket T i MSH-11, med en bevisst syntetisk senderapplikasjon og fasilitet.

En testmelding som ikke er merket som en slik vil til slutt bli funnet i et produksjonssystem av noen som ikke har noen måte å vite at den ikke var ekte. T og den syntetiske sender er ikke kosmetisk.

14.2 Bygging av en kanal fra et eksempel

Lim inn meldingen en laboratorium, sykehus eller leverandør e-postet deg og Perfuse foreslår en kanal for den. Ingen trenger å kjøre først.

Den håndterer hva folk faktisk limmer inn: flere meldinger i en blokk, noen som helst linjeavslutning, MLLP-ramming som overlevde kopieringen, og dekknoten over meldingen. Å nekte et eksempel fordi det ankom med Windows-linjeavslutninger ville være et hinder heller enn en kontroll.

14.2.1 Tre lister

Forslaget kommer med hva eksemplet viser, hva som har blitt gjettet, og hva eksemplet ikke kan fortelle deg — tre separate lister, vektet like mye i grensesnittet.

De er separate fordi en leser som ikke kan se hvilken som er hvilken må verifisere alt eller stole på alt, og begge er verre enn å vite hvor å se.

Fra en enkelt melding er grensene navngitt spesifikt heller enn generelt: hvilke felt er valgfrie, hvilke segmenter gjentas, hvilke koder finnes utover de som er her, om senderen noen gang sender en annen utløserhendelse. En generell advarsel er en advarsel folk skumler.

Tillit er et ord — lav, moderat, rimelig — aldri en prosent. En prosent antyder en beregning, og dette er en vurdering av hvor mange eksempler det er.

Z-segmenter kalles ved navn, fordi et lokalt segment er det ingen spesifikasjon nevner og den vanligste årsaken til at en kanal bygget fra en standardmal ikke fungerer.

14.2.2 Advarsel om separator

Hvis eksemplets feltseparator ikke er den vanlige |, vises det først, og tillit senkes til lav.

Årsaken er en ekte stille feil. HL7 tar sin feltseparator fra meldingen selv, så et eksempel hvor pipene er erstattet med typografiske likheter — som er hva en tekstbehandler gjør — parser perfekt inn i felt som alle er feil. Ingen feil noen steder.

Å nekte et slikt eksempel ville være feil, fordi en sender kan legitimt bruke en annen separator. Så det merkes, og tegnet navngis, og det foreslås å be om en vanlig tekstvedlegg.

14.3 Sammenligning mot den gamle motoren

Før du flytter en live-strøm, er spørsmålet om Perfuse produserer samme utdata som det som har vært i drift i årevis. Ingen mengde designkvalitet kan besvare det. Se migration.

14.4 Verifisering mot den virkelige ting, i containere

Tre sjekker kjøres mot virkelige implementasjoner i stedet for mot Perfuse's egen ide om et protokoll. De lever utenfor make check fordi de trenger en container-kjøretid og en sjekk som trenger Docker er en sjekk folk stopper å kjøre.

scripts/interop-up.sh starter alle og skriver ut hva hver enkelt låser opp.

ContainerSjekkerHva den fant
Keycloak 26web/e2e-saml/, og internal/saml fikserEn feil. Den kanoniske formen en signatur dekker ble beregnet med namespace-prefikser droppet, så ingen virkelig identitetsleverandør noen gang kunne ha signert noen inn
Microsoft Entrainternal/saml live-tester og fikserTo feil, begge i hva som omgir protokollen. En konto ble opprettet under Entra's uklare NameID, fordi den lesbare-navn-logikken ønsket en e-post-krav og Entra sender ingen. Og en SAML-konto ble registrert som OIDC, fordi butikken avledet protokollen fra en utgiver som ser identisk ut for begge
HAPI FHIRgo test ./internal/engine/ -run HAPIEn feil. En umappet tildelingsmyndighet produserte en identifikasjonssystem som annonserte en OID og bar et ord, som HAPI aksepterte uten klage
ActiveMQgo test ./internal/engine/ -run RealBrokerRiktig, inkludert null-byte-rammefallen. Hevdet gjennom brokerens egen administrasjonsgrensesnitt i stedet for gjennom en funksjon som returnerer nil
nginx, klient-sertifikatergo test ./internal/engine/ -run ClientCertificateRiktig
Orthanc (en virkelig PACS)go test ./internal/engine/ -run RealPACSRiktig. En C-STORE ankommer og pasientnavnet, identifikatoren, studie-datoen, modaliteten og SOP-klassen overlever alle
PostgreSQLgo test ./internal/engine/ -run RealPostgresRiktig, og det utløste en bedre feil: en uttalelse i feil dialektens placeholdere er nå avvist når den lagres i stedet for å bli en syntaksfeil på serveren når en melding ankommer
OpenSSH sftp-servergo test ./internal/engine/ -run OpenSSHServerRiktig. De eksisterende SFTP-testene bruker samme Go-bibliotek på begge ender; OpenSSH er en annen implementasjon og den på den fjerne enden av nesten hver virkelig strøm
Mirth 4.5.2go test ./internal/mirth/ -run RealMirthRiktig nå. Den eneste fiksen var tidligere håndskrevet og Mirth ville ikke laste den; scripts/mirth-author-channel.sh har Mirth skrevet en i stedet, og Perfuse leser den

Hver enkelt hopper over i stedet for å feile når dens container er fraværende, så make check passerer på en maskin med ingen Docker.

Hvorfor dette er separat fra resten av suiten. Hver andre test av disse funksjonene hadde begge halvdelene skrevet her: et dokument denne kodebasen signerte, lest tilbake av koden som signerte det. Det er enighet med seg selv, og det er verdt mindre enn det ser ut til.

SAML-kanonisereren er caset som beviser poenget. Den bar tusen linjer med tester, fem av dem spesifikt om kanonisering, og alle passerte mens ingen virkelig identitetsleverandør noen gang kunne ha signert noen inn — den kanoniske formen som en signatur dekker ble beregnet med namespace-prefikser droppet, og den eneste måten å finne det ut var å håndtere et dokument Perfuse ikke hadde skrevet.

To av de åtte sjekkene fant feil rett og slett, og en tredje utløste en virkelig forbedring. Tre fant ingen feil. Denne forholdet er argumentet for å holde alle: en sjekk som passerer har fortalt deg noe du ikke kunne ha visst på forhånd, og det var ingen måte å vite på forhånd hvilke de ville være.

En mønster verdt å navngi, fordi den dukket opp i begge feil: aksept er ikke verifisering. HAPI aksepterte det feilaktige identifikasjonssystemet og lagret det; feilen dukket bare opp da ressursen ble lest tilbake. En mottaker som tolererer noe er ikke bevis for at det er riktig, bare at denne mottakeren var mild.

To fanget påstander er commitet, på internal/saml/testdata/keycloak-assertion.xml og entra-response.xml, med tester over begge — så den spesielle regressionen fanges uten en container.

Begge er nødvendige i stedet for at en er reserve. Keycloak prefikserer sin påstand og signatur, Entra gjør ikke, og disse er de to motsatte casene i kanonisering — som er nettopp der feilen var. En test påstår hver enkelt dokument fortsatt dekker sin egen casus, fordi en erstatning som skjedde å prefiksere ville stille halvparten av dekningen uten å feile noe. Den generelle læren generaliserer ikke så billig: for alt annet, er containeren sjekken.

14.5 Diagnose av en test som feiler en gang og aldri igjen

En test som feiler i en fullstendig kjøring og passerer alene seksten ganger er ikke en flakende test. Det er en test som deler noe med kjøringen, og måten å finne ut hva er å måle det delte på i stedet for testen.

To instrumenter eksisterer for dette, og begge er ment å kjøres sammen med en fullstendig suite:

./scripts/e2e-watchdog.sh /tmp/watchdog.log     # the HTTP server and the shared session
./scripts/e2e-mllp-probe.py /tmp/mllp.log       # the fixture channel's listener

Hver oppdager kjøringens porter fra setupets egen tilstandsfil og sampler hver 500 millisekund inntil serveren eksiterer. De logger hver enkelt sample i stedet for bare feilene, som er det som gjør dem nyttige: en blip viser opp i en kjøring hvor ingenting feiler, så en feil som viser seg en gang i tre kjøringer blir målbar på hver enkelt.

Sett PERFUSE_E2E_KEEP=1 for å beholde den midlertidige katalogen, som inneholder databasen slik den ble latt og serverloggen for hele kjøringen. Serverloggen er vanligvis svaret. I ett undersøkt tilfelle ble det registrert en kanal som stoppet og dens lytter ble koblet på nytt 421 millisekunder senere, og sonens ene avviste forbindelse falt innenfor dette vinduet.

Les sporet i stedet for error-context.md, som har vært tom på mer enn ett tilfelle hvor sporet inneholdt den virkelige meldingen.

Kopier artefaktene ut før du kjører noe på nytt. En vellykket kjøring sletter test-results, så sporet av feilen du undersøker forsvinner i samme øyeblikk du prøver å gjenskape den. Når den er borte, kan spørsmålet det ville ha svart på ikke lenger besvares.

Stans interop-beholderne først. Stans dem før en fullstendig nettleserkjøring, og start dem med ./scripts/interop-up.sh etterpå hvis du fortsatt trenger dem.

Åtte containere holder rundt 9,8 GB med minne, og på en maskin uten mye mer enn det er det for lite igjen til Chromes prosesser, node og Go-verktøykjedet sammen. Det det produserer er ikke en out-of-memory-feil, men en renderer som slutter å bli planlagt: ett registrert spor viser et 60,2 sekunders gap med ingen ramer i det hele tatt, under hvilket Playwright ventet på at en knapp skulle bli "synlig, aktivert og stabil" og ikke kunne få to påfølgende animasjonsrammer til sammenligning. Serveren var frisk gjennom hele kjøringen, den sloweste forespørselen i hele kjøringen var 154 millisekunder.

Den feilen ser ut som en defekt i hvilket som helst test som skjedde å kjøre. Det er verdt å vite formen på den: hver forespørsel rask, siden visuelt frosset, gjentakelsesløkken nådde aldri en andre iterasjon, og hele ting passerer i isolasjon.

Kun én kjøring om gangen. Suiten deler en server, en pålogget økt i web/e2e/.auth/admin.json, og en tilstandsfil som navngir serverprosessen. Ingen av dette er per-kjøring, så en andre kjøring som starter mens den første pågår overskriver tilstandsfilen, og hvilken som helst avslutning som fullføres først dreper den andre kjøringens server og sletter dens økt.

What that looks like is nothing like the cause. It produced a run of 279 failures whose first message was ENOENT: no such file or directory, open './e2e/.auth/admin.json', a run that stopped early reporting 217 passed, and two tests failing with bind: address already in use — none of which suggest two runs fighting. The suite now takes a lock and refuses to start, naming the process that holds it. A lock left by an interrupted run is taken over rather than blocking for ever, because a safety measure that wedges the suite is one somebody deletes along with the safety.

En relatert felle, nå fikset: to spesifikasjoner navnga deres lytterporter åpenbart, så en server som ble igjen etter en avbrutt kjøring gjorde dem feile på noe de ikke hadde noe å gjøre med. Portene spørres nå om av operativsystemet.

Svare ikke på noen av dette med gjentakelser. En test som passerer på andre forsøk fant en virkelig kappløp og skjulte det, og playwright.config.ts setter retries: 0 av denne grunn.

En advarsel: å prøve hver 100 millisekunder spawnet tyve prosesser per sekund, strakk en kjøring med en halv gang, og feilet to tester på tidsavbrudd som ikke hadde noe galt med dem. Et instrument som endrer hva det måler produserer funn om seg selv.

14.6 Hva som fortsatt trenger ekte infrastruktur

Flere deler av Perfuse er implementert og har aldri blitt testet mot den ekte varen. De er listet her i stedet for å bli oppdaget:

Funksjonene i dette kapitlet og det neste eksisterer så du kan samle dine egne bevis i stedet for å ta noen andres ord.

14.7 Målt mot offentlige konformitetskorpus

En test-suite hvis fikseringer ble skrevet her, beviser enighet med seg selv. Dette er andre menneskers data.

14.7.1 FHIR R4, spesifikasjonens egne eksempler

Alle 2 912 eksempelfiler som er publisert med FHIR R4-spesifikasjonen — hver enkelt eksempel som standardforfatterne skrev.

ResultatTelling
Ressurser validerer med ingen funn13 723
Ressurser rapportert ugyldig0
Filer nektet som en uimplementert ressurs-type753
Bundle-innledninger hoppet over som en uimplementert type1 348

Ingen enkelt ressurs ble valideret feil. Hver feil er en eksplisitt nektelse som navngir typen den ikke kan lese — 672 ValueSet, 80 ConceptMap og en Parameters. En validerer som stille passerer hva den ikke forstår er verre enn en som sier det.

Korpuset fant en defekt, som er grunnen til å kjøre det. Validering av en samling skrev ut "Validering av samling fra en fil støttes ikke ennå" og fortsatte. Det var feil i begge retninger: samlinger hvis oppføringer skjedde å være typer parseren kunne holde, ble allerede valideret, og en samling som var genuint ugyldig produserte samme linje, teller ingenting, og avsluttet null — inkludert under -strict, som eksisterer så dette kan porte en bygging. Førtito av spesifikasjonens egne samlinger ble hoppet over.

Samlinger valideres nå inngang for inngang, med tre resultater holdt adskilt: en inngang som er feil feiler og navngir feltet, en inngang av en type som denne bygningen ikke kan lese, teller som hoppet over og rapporteres, og en samling som bærer ingen ressurskropper er ingen. Samme korpus gikk fra 2 100 ressurser sjekket til 13 723.

14.7.2 HL7 v2, HAPI-testkorpuset

Meldingsfikser fra HAPI, den referanse Java HL7 v2-implementeringen — bevisst vanskelig materiale inkludert uuencoded payloader, escaped delimitere og gjentakende grupper.

59 meldinger, 59 parsede, ingenting avvist. Syv meldingstyper i et korpus som enhver enkelt system ville beskrive som en ting, som er poenget perfuse profile eksisterer for å gjøre.

14.7.3 Hva som ikke er kjørt

DICOM mot en offentlig konformitetssamling, og X12 mot en publisert korpus. Ingen av dem er gjort, og ingen av dem bør antydes fra de to ovenfor.

15 Migrering fra Mirth

To ting er nødvendige for å erstatte en arbeidende motor: kanalene må komme over, og noen må kunne vise at erstatningen produserer samme utgang. Perfuse gjør det første ved å importere Mirths egne eksporteringer, og det andre ved å sammenligne de to motorer på eget trafikk.

Alt i dette kapitlet gjelder like mye for Open Integration Engine og BridgeLink. Mirth Connect sluttet å være åpen kildekode ved 4.6 i mars 2025; OIE (vært av Eclipse Foundation) og BridgeLink (Innovar Healthcare) er forkene som fortsetter åpen kildekode-linjen, og begge skriver samme eksportformater. Importøren er testet mot alle tre nedenfor.

15.1 Importering av kanaler

Perfuse leser hver eksport disse motorer skriver:

EksportFra AdministratorHva som kommer over
En kanalEksport KanalKanalen
En kanalgruppeEksport GruppeHver kanal i den, hver med gruppen beholdt
KodemalerEksport KodemalerHver bibliotek som ett skriptfil
En serverbackupBackup Konfigurasjon, eller GET /api/server/configurationAlt ovenfor på en gang

Pek perfuse translate på noen av dem, eller slipp en på Administer → Migrer:

perfuse translate -o ./channels server-backup.xml

En kodemalbibliotek blir lib/<library>.js ved siden av kanalene, og hver kanal Mirth hadde biblioteket aktivert for, får scripts.include: [lib/<library>.js] — så en transformer som kalder en stedfunksjon som formatMRN() fortsatt finner den. En kanal biblioteket ikke var aktivert for, inkluderer det ikke, fordi skriptene ikke kunne se det i Mirth heller. Drag-and-drop-utklipp utelates: Mirth limte dem bare inn i et steg manuelt, så de er ikke kode som kjører på egen hånd. I nettleseren lagrer import av en kanal bibliotekene den inkluderer først.

En Kanal-forfatter navngir kanalen den leverer til, ved id. I en gruppe eller en reserve er målet i samme dokument, så det blir en channel-destinasjon som navngir den kanalen; fra en enkelt-kanal-eksport rapporteres det for å fylle inn. Server-wide globale skript har ingen Perfuse-ekvivalent og rapporteres i stedet for å droppes.

Rapporten sier, per kanal, om den ble oversatt ren, oversatt med advarsler eller ikke kunne leses.

Overskriften er en brøk med teller — "37 av 40 klare" — fordi "37 klare" forteller deg ingenting om hva du fortsatt må gjøre.

En kanal som ikke kunne leses er et annet problem enn en som ikke kunne oversettes. Førstnevnte betyr at XML selv ikke parserte og er vanligvis en trunkert eller delvis eksport; sistnevnte betyr at kanalens innhold har noe uten en Perfuse-ekvivalent. Importen skiller dem.

15.2 Hva som oversettes og hva som trenger en avgjørelse

Kilder, destinasjoner, filtre og vanlige transformer-steg oversettes direkte. Konnektorene som oversettes: TCP/MLLP (og rå TCP med ramming), HTTP, Fil, Database, JavaScript, DICOM, Web Service (SOAP), SMTP og Kanal Leser/Skriver. JMS og Dokument Skriver oversettes ikke, og rapporteres som blokkeringer.

En Mapper-steg som setter en variabel legger den i kartet med navnet på området sitt — channelMap som standard — nøyaktig som Mirth gjør, så senere steg som leser den med $('name') finner den.

JavaScript-transformatorer gjør det vanligvis ikke. Mirth-kanaler inneholder ofte betydelig kode i en transformer, og det er ingen automatisk konvertering fra vilkårlig JavaScript til deklarative steg. Importøren rapporterer disse heller enn å forsøke en oversettelse som kan være subtilt feil: en mistranslatert transformer er verre enn en som er flagget for en menneskelig, fordi den vil kjøre.

Hvor et skript virkelig må forbli et skript, kan Perfuse kjøre det – se scripts-nøkkelen i kanalreferansen – til en kostnad av stegnivåsporingen beskrevet i feilsøking.

15.3 Hva importøren er testet mot

Fem motorer, hver som skriver sine egne dokumenter: Mirth 4.5.2, OIE 4.5.2, 4.6.0 og 4.7.0, og BridgeLink 26.9.0. scripts/mirth-engine-corpus.sh kompilerer et lite program mot hver motors egne jar-filer og har sin egen serialisator skrive tre vanlige kanaler — en MLLP-matning med en mapper, et skript som kaller en kode-malbibliotek og en filter; en HTTP-matning inn i en database; en fil-polling ut over MLLP — pluss biblioteket og en kanalgruppe. Det laster dem inn i den kjørende motoren og laster ned motorens egen server-bakoppslag. Resultatene er commitet under internal/mirth/testdata/engines/, og test-suitten holder importøren til hver av dem på hver bygging: hver bakoppslag leses, oversettes, lastes, og ADT-kanalen kjøres med to meldinger for å sjekke at biblioteket fyller rekordnummeret og filteret dropper resultatet.

Perfuses egne eksport går den andre veien — Perfuse-kanaler importert inn i hver kjørende motor og sjekket at motoren ikke lagrer dem som ugyldige. Alle fem aksepterer hver transport Perfuse eksporterer. Open Integration Engine 4.7.0 la til to HTTP-innstillinger uten noen ekvivalent her: en HTTP-avsender bundet til en valgt lokal adresse rapporteres som en advarsel, og en HTTP-lytter forespørsels-hodegrense bare når den er over 1 MB som Perfuse aksepterer.

Den første kjøringen mot denne korpusen fant fire feil, alle fikset: oversetteren nektet HTTP- og filkilder som «bare MLLP er støttet» lenge etter at Perfuse hadde både; den leste en HTTP-avsenders adresse fra et felt ingen av motorene skrev; den oversatte Mirths sokkelbuffertstørrelse som en 64 KB-meldingsbegrensning; og en Mappers variabel ble en JavaScript-global som $('mrn') aldri så, så biblioteket fylte en tom streng.

Den enkelt-kanal-fikset som startet dette, ble også eksportert av Mirth 4.5.2, skrevet av Mirth selv, i stedet for å være skrevet her. Denne distinksjonen tjente sin plass: den eneste fikset i dette repositoryt, ble brukt til å være håndskrevet, og en ekte Mirth vil ikke laste det — API-et aksepterer POST-en og lagrer så kanalen som This channel is invalid. Verify all required extensions are loaded correctly, med hver destinasjons-connector diskardert.

Håndskrivning var aldri gått å fungere, og grunnen er verdt å vite hvis du produserer eksporter av din egen. Mirths serialiser ignorerer elementer den ikke kjenner, så et feil elementnavn produserer ingen feil i det hele tatt — connector-en er bare ikke der etterpå. Det er ingenting å lese og ingenting å korrigere mot.

scripts/mirth-author-channel.sh bygger en ved hjelp av Mirths egne modell-klasser og sin egen serialiser, så poster den til en kjørende server og feiler hvis serveren avviser den. Perfuses importør les resultatet: navn, kilde-transport og destinasjoner overlever alle.

15.4 Beviser at det matcher

Dette er den delen som bestemmer om en migrering skjer, og det trenger bevis snarere enn tillit.

Perfuse sammenligner sin egen utdata mot den gamle motorens, melding for melding, på din trafikk. Hva den trenger er par: meldingen som den ankom, og meldingen den gamle motoren produserte fra den. Begge er i Mirths egen meldings-lager og kan eksporteres fra dens meldings-blað.

Perfuse kan ikke nå inn i Mirth, og denne håndboken vil ikke påstå noe annet. Et verktøy som hevdet å verifisere en migrering uten å se den gamle motorens faktiske utdata ville verifisere ingenting. Å forsyne parene er den ærlige formen på øvelsen.

15.4.1 Fire tall, ikke en bestått rate

ResultatMening
IdentiskByte for byte det samme.
Kosmetisk bareForskjeller på måter som ikke bærer informasjon — trailing tomme felter, en slutterminator.
ForskjellEt feltverdis forskjell.
Ville ikke kjørePerfuse kunne ikke prosessere meldingen i det hele tatt.

De er fire tall fordi de betyr fire forskjellige ting og å kollapse dem skjuler de som trenger en beslutning.

Identisk betyr byte for byte, ikke ekvivalent. En svakere test ville la forskjeller i segment-rekkefølge eller trailing-separatere gjennom, og det er nettopp det en krævende nedstrøms-system avviser.

Kosmetiske forskjeller telles separat snarere enn foldet inn i den gode kolonnen. De bærer virkelig ingen informasjon, så å behandle dem som feil ville begrave ekte funn under tusenvis av ingenting — men de er ikke identiske heller, og en mottaker som gjør sin egen strenge parsing kan være uenig.

«Ville ikke kjøre» er separat fra «forskjell» fordi det vanligvis er et konfigurasjons-gap importøren ikke kunne fylle, ikke en mapping-beslutning. Hvis alt er i den kolonnen, sier dommen det og forteller deg å se på konfigurasjonen før du leser noe annet.

15.4.2 Forskjeller er gruppert etter felt

En kjøring over femti tusen meldinger som rapporterer fire tusen forskjeller har fortalt deg ingenting du kan handle på. Samme kjøring som rapporterer at PID-8 forskjeller i hver melding fordi den gamle motoren skrev Male hvor Perfuse skriver M har fortalt deg nettopp en ting å bestemme.

Så hver funn er et felt, med en telling, og det sier om forskjellen er systematisk — samme verdi-par hver gang — eller om feltets innhold forskjeller.

Den distinksjonen er det mest nyttige i rapporten. Et distinkt verdi-par over fire tusen meldinger er en enkelt mapping-beslutning. Fire tusen distinkte par er innholdet som forskjeller, som er et annet og mye verre problem, og de to må ikke lese likt.

Funnet er ordnet etter hvor mange meldinger de påvirker, så den største enkeltårsaken er først.

15.4.3 Dommen runder ikke

Den gir eksakte tellinger: 49 993 av 50 000, ikke «over 99 %». De syv er hele poenget med å kjøre det.

Det er skrevet for å kunne sitere i en endringsforespørsel, fordi det er der nummeret ender.

15.5 En foreslått sekvens

  1. Importer kanaler og løs eventuelle problemer som rapporteres som uleselige.
  2. Gjennomgå advarsler for hver kanal. De fleste vil være skript.
  3. Eksporter noen tusen meldingspar fra Mirth for den travleste kanalen og kjør sammenligningen.
  4. Gjennomgå funnene. Systematiske funn er ett valg hver.
  5. Kjør på nytt til de eneste forskjellene er de du har bestemt er korrekte.
  6. Kjør Perfuse i skyggen sammen med Mirth på live-trafikk, leverer ingen steder, og sammenlign på nytt over en periode som inkluderer en helg og en månedsslutt.
  7. Bytt ut en kanal, ikke alle sammen.

15.6 Hva som bare kjører på en leverandørs programvare

Migrasjons-skjermen besvarer et annet spørsmål, og det er verdt å spørre før du har noen mening om Perfuse: hvor mye av din integrasjonslogikk kan bare kjøre på programvaren du har.

Hver kanal får en Portabilitet-dom, fra samme skanning som produserer migrasjonsnotater. Den kjører mot en kanal-eksport, så den trenger ingen installert og endrer ingenting.

15.6.1 Forskjellen er hele poenget

De fleste Java i Mirth-skript er ikke låst til. SimpleDateFormat, HashMap, Apache Commons — alt sammen arbeider rundt en JavaScript-motor fra 2009, alt sammen vanlig, alt sammen med direkte ekvivalenter. En kanal med tre hundre av disse referansene er fullstendig portabel, og et verktøy som rapporterte "300 Java-referanser, du er fanget" ville lyve for deg.

Låsing er spesifikt kallene som trenger leverandørens egen server: com.mirth.connect.* og leverandør-jar. Fem av disse og du er fanget. Fem hundre av den andre typen og du er fri.

Så dommen starter med det tall som teller og sier i samme setning at det større tallet ikke er det. Der det finnes leverandør-kall, listes de opp ved navn — en telling er en påstand, og en liste er noe din egen ingeniør kan gå og sjekke.

En tredje kategori holdes separat: funksjonalitet som eksisterer, men ikke fra et skript. Å starte en kanal fra JavaScript har ingen ekvivalent her, og det finnes en API-endepunkt som gjør nøyaktig det samme. Å kalle det låsing ville overdrive funnene.

15.6.2 Java-kall som kjører uendret

De vanligste Java-klassene kjører som de er skrevet. Perfuse har ingen Java-kjøretid, så disse er JavaScript-klasser med samme navn og metoder, nok for måten kanalmanuscripter bruker dem; importPackage(java.util) og importClass(...) bringer dem inn i omfang med kort navn, som i Rhino (JavaScripts egen Date, Map, Set, Math, String og Boolean er aldri erstattet: Java-utgavene er fortsatt der med fullt navn). Migreringsrapporten teller hver av disse kallene som allerede støttet.

PakkeKlasser
java.utilArrayList, LinkedList, Vector, List, Collection, HashMap, LinkedHashMap, Hashtable, TreeMap, Properties, HashSet, LinkedHashSet, TreeSet, Arrays, Collections, Date, Calendar, GregorianCalendar, UUID, Base64, regex.Pattern (med Matcher), concurrent.ConcurrentHashMap
java.langString, StringBuilder, StringBuffer, Integer, Long, Short, Byte, Double, Float, Boolean, Math, System (tid og linjeseparator bare)
java.text, java.math, java.net, java.nioSimpleDateFormat og DateFormat (Mirths mønsterbokstaver), BigDecimal (som en dobbel), URLEncoder, URLDecoder, StandardCharsets
Apache Commonslang3.StringUtils og lang.StringUtils (om seksti metoder), StringEscapeUtils, codec.binary.Base64

De oppfører seg som Java der skriptene avhenger av det: Integer.parseInt("x") kaster NumberFormatException, String.replaceAll og split tar regulære uttrykk mens replace er bokstavelig, kartlegger nøkkelstrenger med verdi, TreeMap og TreeSet itererer i rekkefølge, og SimpleDateFormat.parse returnerer en dato getTime() fungerer på. En metode et skript kaller som den tilsvarende mangler feiler på den linjen, og navngir den; enhver annen Java-klasse feiler med navn, som før. BigDecimal er en dobbel her, så den beholder ikke Javas nøyaktige desimalaritmetikk: sjekk skript som bruker den for penger.

15.6.3 Eksterne skript rapporteres som ukjent

Et steg som kjører et eksternt skriptfil refererer til en sti på den gamle serveren, og filen er ikke i eksporten. Ingen kan si noe om hva den inneholder, så den teller som ukjent i stedet for å anta enten vei — i begge retninger.

15.6.4 Perfuses egen låsing, uttalt i samme åndedrag

Dette avsnittet ville være uærlig uten det.

Perfuse er Apache 2.0, som er uopprettelig for kode som allerede er utgitt. Du kan fork det som eksisterer i dag og ingen kan trekke det tilbake. Kanaler er YAML-filer og skriptene er vanlig JavaScript, så det finnes ingen proprietær overflate å ringe — Mirths smak av Java-avhengighet er strukturelt utilgjengelig her, som er det eneste stedet en begrensning virkelig er en funksjon.

Hva det ikke lover: at en fremtidig versjon forblir åpen, at en vertsetjeneste eksisterer til en pris du liker, eller at å migrere vekk fra Perfuse kostar ingenting. Å flytte noen integrasjonslag innebærer å gjennomføre hver kanal på nytt mot ekte trafikk. Det du velger er om artefaktene du bygger er leselige og portable, og om utgangen avhenger av en lisens noen andre kontrollerer.

15.6.5 Konfigurasjon av steg 6

One message real traffic Live channel unchanged Candidate the version you are testing Receiver delivers nothing Comparison field by field The candidate sees the same real messages as the live channel and delivers none of them. Only the live channel reaches the receiver. What you read afterwards is where the two disagreed, field by field — not a pass or a fail.

Avsnittet Skygge starter en sammenligning. Velg kanalen som kjører, velg kandidaten til å sammenligne mot fra listen, og start.

Tre ting om det er verdt å vite før du baserer deg på tallene.

Kandidaten velges fra en liste, ikke skrevet. En skyggenavn gir en kanalfil, og et navn som ikke kan løses, gjør den *aktive* kanalen ugyldig — Perfuse avviser en kanal som helhet når noe den refererer til er feil. Så et skrivefeil produserer ikke en advarsel, det gjør den kjørende kanalen forsvinner.

Andelen er et prosent. Reduser det bare på en travel feed, og vite hva det koster: steking reducere arbeid og tillit i samme proporsjon, og meldingen som ville ha vist forskjellen er den uvanlige en.

Felter som skal ignoreres er vanligvis nødvendig. En kanal som stempler en tidsstempel eller en sekvensnummer forskjeller på hver enkelt melding, som rapporterer en forskjellshastighet på 100% og forteller deg ingenting. MSH-7 og MSH-10 er det vanlige paret.

En sammenligning skrives til kanalfilen så snart du starter den, og begynner å observere når kanalen neste laster — skjermen sier det heller enn å hevde at den allerede kjører. Stopp en sammenligning lar kandidatkanalen være på plass, fordi kandidaten er det som er ment å gå live.

Trinn 6 er det som ikke kan forkortes. Forskjellene som betyr noe er vanligvis i trafikk som bare viser seg av og til — en sjelden utløsende hendelse, en månedsslutt part, en avsender som oppfører seg annerledes ved midnatt — og et utvalg tatt over en ettermiddag vil ikke inneholde dem.

15.7 Gå tilbake den andre veien

En kanal kan eksporteres som en Mirth-kanalfil, fra nettleseren: Kanaler, deretter Til Mirth på kanalen du ønsker.

Dette eksisterer fordi innvendingen mot å erstatte en fungerende motor er sjelden om erstatningen er noen god. Det er hva som skjer hvis avgjørelsen viser seg å være feil, og en eksport som går tilbake den samme veien er det billigste svaret på det.

Les hva dialogen forteller deg før du tar filen. Mirths format har ingen sted å plassere en Perfuse-filt, en transformasjonskjede, en kontrakt eller en skyggesammenligning, så en eksportert kanal gjør mindre enn den den kom fra. Transportene og deres adresser konverterer; logikken gjør det ikke. Hver tap liste opp navn før filen tilbys, og samme liste går inn i kanalens beskrivelse så at den som importerer den ser det også.

En kanal Mirth ikke kan uttrykke avvises heller enn approksimert. En S3-destinasjon har ingen Mirth-ekvivalent, og en kanal som importerte renlig mens den leverte et annet sted enn bucket ville være verre enn ingen fil i det hele tatt. Avvisningen navngir destinasjonen som er feil.

Konnektordefinisjonene er ikke skrevet fra en lesing av Mirths format. scripts/mirth-dump-connector-templates.sh har Mirths egen serialisator produsere standarder for hver konnektorklasse, og Perfuse erstatter verdier i disse dokumentene — avviser enhver innstilling som malen ikke allerede inneholder. Dette betyr på grunn av hvordan Mirth svarer på en kanal det ikke kan parsere: det avviser ikke importen. Det lagrer en kanal hvis beskrivelse har blitt erstattet med "Denne kanalen er ugyldig. Verifiser alle nødvendige utvidelser er lastet korrekt" og hvis destinasjoner har blitt stille diskardert. En eksportør som er kontrollert mot sin egen utgang heller enn mot en server passer hver test mens den produserer dokumenter som kastes, som er nettopp hva som skjedde her før eksportene ble prøvd mot en kjørende Mirth.

Hva krysser i dag: MLLP og TCP i begge retninger, HTTP i begge retninger, fillesing og skriving, databaselesing og skriving, DICOM i begge retninger, og SMTP, SOAP og JavaScript-destinasjoner. Hver par er verifisert ved å importere til en ekte Mirth 4.5.2 og sjekke serveren ikke stille erstattet kanalen.

16 CMS-0057 for betalere

CMS Interoperabilitet og Prior Autorisasjon sluttrapport (CMS-0057-F) krever at berørte betalere — Medicare Advantage-organisasjoner, statlige Medicaid og CHIP-programmer og deres managed care-planer, og QHP-utgivere på de føderale børsene — kjører fire FHIR-APIer fra 1. januar 2027, og å publisere prior autorisasjonsmetrikker på deres offentlige nettsted hvert år fra 2026.

Perfuse tilbyr de fire API-ene på sin FHIR-endepunkt og konverteringene som fyller dem: avgjorte krav som CARIN Blue Button, prior autorisasjoner som Da Vinci PDex, og de årlige metrikkene i layoutet til CMS-eget mal. CMS-0057-visningen, under Utveksling, sier hvilke av de fire denne instansen kan svare og hva hver ennå trenger, og gjør alle tre konverteringene i nettleseren.

Legemidler er utenfor omfang hele tiden, slik de er i regelens prior autorisasjonsbestemmelser: ingen apotekkrav, ingen formular, og en metrikkrad som navngir et legemiddel avvises heller enn telle.

16.1 De fire API-ene

APIHva den betjenerGuiderAktivert av
Patient AccessEn medlems krav, kliniske data og tidligere autorisasjoner, til en app de velgerCARIN Blue Button 2.2.0, PDex 2.2.0, US Core, SMART App Launch-fhir og en SMART-utsteder (-smart-issuer)
Provider AccessDet samme for en providers tilknyttede medlemmer, i bulkPDex 2.2.0, Da Vinci ATR 2.1.0, Bulk Data-fhir-payer-apis og -fhir-bulk-export
Payer-to-PayerEn medlems rekord til en annen payer, etter å ha matchet demHRex 1.2.0 $member-match, PDex 2.2.0-fhir-payer-apis
Prior AuthorizationHva en ordre trenger, dokumentasjonen, så forespørselen og avgjørelsenDa Vinci CRD, DTR og PAS 2.2.x (2.2.1, 2.2.0, 2.2.1) og 2.1.0, med X12 278-oversettelse-fhir, skrivbar, og -crd-rules

Pasienttilgangs-API trenger ingen egen operasjon: det er FHIR-endepunktets vanlige lese- og søkefunksjoner, beskyttet av SMART, med CARIN- og PDex-ressurser i lagret. Søking etter ExplanationOfBenefit støtter parameterne CARIN-navn — patient, identifier, type, service-date, billable-period-start, provider, insurer, coverage — og Coverage støtter subscriber-id, identifier og payor.

16.1.1 To utgaver av guidene: 2.1.0 og 2.2.x

CMS-0057-F anbefaler CRD, DTR og PAS 2.0.1 og 2.1.0. 2.0.1-utgavene hviler på US Core 3.1.1, som utløp 1. januar 2026, så 2.1.0 er utgaven en EHR bygget for regelen sannsynligvis snakker; de nyeste er CRD 2.2.1, DTR 2.2.0 og PAS 2.2.1. Perfuse svarer i begge. Den finner ut hvilken en kaller snakker, mest spesifik først:

  1. fra forespørselen: CRDs CDS Hooks-utvidelse davinci-crd.requestedVersion ("2.1"), eller versjonen på en Da Vinci-profil en DTR eller PAS-krav (profile-pas-request-bundle|2.1.0);

2. fra kallerens registrering: davinci_version: "2.1" på en SMART-klient (-smart-clients) eller en CDS-klient (-cds-clients); 3. fra serveren: serve -davinci-version 2.1; standard er 2.2.

clients:
  - issuer: https://ehr.example.org
    jwks_url: https://ehr.example.org/.well-known/jwks.json
    davinci_version: "2.1"

Hver beslutning avgjøres og lagres i 2.2.x-format og omskrives for en 2.1.0-kaller når den sendes, så reglene, gjennomgangskøen, X12 278-lenken og målingene er de samme for begge. Omskrivingen dekker hva utgavene staver forskjellig: CRD 2.1.0 har ingen indeterminate (Perfuse sier betinget, med årsak) og ingen kategori på en dekningsdetalj; DTR 2.1.0 navngir pakken PackageBundle og lar QuestionnaireResponse være til appen; PAS 2.1.0's $inquire svarer med én Bundle, og den mangler reviewer- og overføringsutvidelser. Den fullstendige listen, og sjekken mot hver 2.1.0-veileder sin egen eksempler, er i conformance/davinci21. En PAS-varsling følger -davinci-version, ettersom en abonnement ikke sier hvilken utgave eieren leser.

16.2 Dekningskrav og dokumentasjon: CRD og DTR

Prior Authorization API er i praksis tre Da Vinci-veiledere sammen. CRD forteller klinikerne, mens ordren fortsatt er en utkast, om den er dekket, om den trenger forhåndsgodkjenning og hva dokumentasjon som ønskes. DTR overfører EHR-spørsmålet som samler inn den ønskede dokumentasjonen. PAS sender forespørselen og returnerer avgjørelsen. Perfuse betjener alle tre som betaler.

-crd-rules rules.yaml betjener CRD via CDS Hooks på /cds-services: alle seks av CRD's hooks, order-sign, order-select, order-dispatch, appointment-book, encounter-start og encounter-discharge, hver med en prefetch for pasientens aktive dekning. De to møtehookene henter også møtet og besvarer spørsmål om møtet selv, sammenlignet med dens type og servicetype, slik appointment-book besvarer spørsmål om en avtale. Reglene er forsikrers politikken, lagret i en fil fordi de endres uten programvareutgivelser:

payer: Springfield Health Plan
rules:
  - description: Home oxygen equipment
    codes: [E0424, E0431]
    covered: covered            # covered, not-covered, conditional
    pa: auth-needed             # no-auth, auth-needed, satisfied, performpa, conditional
    documentation: [clinical]
    questionnaire: https://www.springfield-health-plan.example/fhir/Questionnaire/home-oxygen

Hver ordre får en systemActions-oppdatering som bærer CRD-dekning-informasjonsutvidelsen - som EHR lagrer på ordren og senere sender med forhåndsgodkjenningen - og et kort som klinikerne kan lese. En ordre hvis kode ikke har noen regel, blir besvart conditional, aldri antatt dekket; en forespørsel uten noen dekning overhodet får et kort som sier det. examples/crd/ har en regelfil og et tilhørende spørsmål.

En regel kan også bære resten av hva CRD lar en betaler si:

Hva EHR ikke forhåndshentet, leser Perfuse fra EHRs fhirServer med tokenet det sendte. Hvis det feiler, er svaret indeterminate med CRD-technical årsak, aldri et gjett. En dekning som har utløpt eller ikke er aktiv, blir besvart not-covered, no-active-coverage.

members: fhir i regelfilen løser dekningen mot betalerens egne poster i denne serverens FHIR-lager (start den med -fhir), samme poster $member-match leser:

med det nummeret.

Oppdagelse erklærer davinci-crd.version og en coverage-info konfigurasjonsvalg. Når en klient slår av valget, er svaret tomt. EHR JWT-er sjekkes som CDS Hooks definerer dem, med iss, aud, exp, iat og jti og ingen sub, og en gjentakelse jti avvises.

Anrop autentiserer med JWT-en EHR signerer for hver anrop, fra en utgiver navngitt i -cds-clients med sin JWKS-URL - som er hvordan CDS Hooks beskriver det - eller med en Perfuse API-nøkkel. Oppdagelse er åpen, som CDS Hooks krever.

DTR: last inn spørsmålene i FHIR-endepunktet, og POST /fhir/Questionnaire/$questionnaire-package returnerer dem som DTR-pakkebunter, med CQL-bibliotekene de navngir. Forespørselen kan navngi spørsmålet, eller sende ordren og la dekning-informasjonen si hvilket.

Prøving: Payers → Claims & auth → Coverage requirements (CRD) sender en ordre til denne serverens regler, eller til en betalers CDS-tjeneste-URL, og viser kortene og dekning-informasjonen.

16.3 Krav som CARIN Blue Button

perfuse cms0057 carinbb parer hver krav i en 837 med sin betaling i en 835, etter pasientkonto-nummeret 835 er påkrevd å echo tilbake, og skriver en FHIR-transaksjon for hver: ExplanationOfBenefit med pasienten, dekning, organisasjoner og praktikere den refererer til.

perfuse cms0057 carinbb -system https://fhir.your-plan.org/identifier -network innetwork \
    claims.837 remittance.835

Profilen følger kravet: profesjonelle krav (837P) blir C4BB-ExplanationOfBenefit-Professional-NonClinician, og institusjonelle (837I) innlagt eller utlagt etter type av regning. Hver post er en PUT med en ID tatt fra kilde-identifikatorene, så lasting av samme krav to ganger oppdaterer det i stedet for å lage en annen kopi.

Tre ting er ikke i noen av X12-filene, og hver håndteres ved å si det i stedet for å gjetting:

Diagnoser skrives med desimalpunkt (J02.9, ikke J029), fordi det er hvordan kode-systemet publiserer dem og en terminologiserver spurt om den andre stavingen sier at den ikke eksisterer. En avhengigs medlem-identifikator er abonnentens, som er hva 837 bærer, og notatene sier det. En NPI hvis kontrollsiffer er feil, rapporteres før US Core avviser det.

16.4 Forhåndsgodkjenninger som PDex

perfuse cms0057 priorauth konverterer en Da Vinci PAS ClaimResponse — eller PAS-svarspakken som inneholder en — til en PDex prior autorisasjons ExplanationOfBenefit, som er det alle tre data-API-ene betjener.

perfuse cms0057 priorauth pas-response.json pas-claim.json

PAS-kravet er valgfritt og nesten alltid nødvendig. En ExplanationOfBenefit må angi hvilket dekning beslutningen ble fattet under, og bare forespørselen inneholder dette; uten det stopper konverteringen og sier det. Gjennomgangshandlingen — godkjent, avvist, utsatt, med autorisasjonsnummer og årsak — flyttes fra PAS-utvidelsen til PDex, og X12-tjenestetype beholdes under URI-en PDex binder den til.

16.5 Tilbyderadgangs- og betaler-til-betaler-API-er

Med -fhir-payer-apis svarer FHIR-endepunktet på tre flere operasjoner:

Eksportene følger regelens eksklusjoner på vei ut. Krav mister betalingen og hver kostnadsdeling og refusjonsbeløp, og beholder tjenestene, kodene, datoene og tilbyderne; CARIN-profilen fjernes fra meta.profile fordi ressursen ikke lenger møter den. Btaler-til-betaler utelater også avviste forhåndsgodkjenninger. Medlemmer som innehar en aktiv PDex-tilbyderadgang-opt-out-samtykke utelates fra en tilbyder-eksport, og loggen registrerer hvor mange. patient-parameteren kan bare snevres inn til medlemmer av gruppen; å navngi noen andre blir avvist.

Tilgang til en gruppes eksport avgjøres av endepunktets autentisering. SMART-omfang sier hva slags ressurs en nøkkel kan lese, ikke hvilken gruppe, så hver leverandør trenger en nøkkel som kan nå bare sin egen tilskrivelsesliste. En API-nøkkel kan begrenses til grupper når den lages — perfuse token create -label riverside-provider-access -fhir-groups riverside-attributed, eller Begrens til FHIR-grupper-feltet under Brukere → Maskinlegitimasjoner — og på FHIR-endepunktet kan den deretter lese disse gruppene, kjøre $davinci-data-export eller $export på dem og hente hva eksporten produserte, og ingenting annet. En annen leverandørs gruppe svarer ikke funnet i stedet for forbudt, så en nøkkel lærer ikke hvilke andre tilskrivelseslister som finnes; hver annen forespørsel, medlemssammenligning og vanlig søk inkludert, avvises. Begrensningen gjelder for API-nøkler; en nøkkel fra en SMART-utgiver bærer ingen gruppebegrensning. Når SMART er konfigurert også, avvises API-nøkler med mindre Innstillinger → FHIR → Aksepter Perfuse API-nøkler ved siden av SMART-nøkler er på (se Sikkerhet, *Hvem kan ringe FHIR-endepunktet*); en leverandørs gruppebegrenset nøkkel trenger det.

16.6 En tilbyderkatalog: Plan-Net

CMS-0057 ber også forsikringsgivere om en leverandørkatalog, og FHIR-endepunktet tilbyr en til Da Vinci Plan-Net 1.1.0 uten mulighet til å slå den av: last inn praktiserende, praktiserende roller, organisasjoner, organisasjonsmedlemskap, steder, helsetjenester, forsikringsplaner og endepunkter, og medlemmers apper kan søke i dem. Hver Plan-Net søkeparameter er indeksert - en rolles nettverk og tjeneste, en plans dekningområde, et medlemskaps deltakende organisasjon, en organisasjons partof - sammen med inkluder og reverskjeder (_has) veiledningens spørringer bruker, og CapabilityStatement listen Plan-Net profiler.

Infernos Plan-Net suite består av 199 tester. De 10 den feiler er fremoverkjeder hvor kit tar sin søkeverdi fra den første organisasjonen den har sett, i stedet for en som de søkte ressursene henviser til; det rapporteres til kit (dets problem 34), og serveren svarer korrekt på disse spørringene når den får en verdi dataene inneholder.

16.7 Forhåndsgodkjenning-mål

perfuse cms0057 metrics leser en CSV med beslutninger eksportert fra utnyttelses­ledelsessystemet og produserer den offentlige siden CMS krever, i layoutet til dets *Forhåndsgodkjenning-mål-rapportering — Oversikt og mal*.

perfuse cms0057 metrics -year 2025 -org "Springfield Health Plan" -services services.csv \
    decisions.csv > prior-authorization-metrics-2025.html

Kolonner finnes ved header: priority, received, decided og decision er påkrevd, og request_id, line_of_business, extended, appealed, appeal_decision, service_code og service_description leses når de er til stede. En forespørsel tilhører året den ble avgjort i; en som fortsatt er pendende listes som ekskludert, aldri tellt. Hver rad som ikke kan leses, rapporteres med sin linje­nummer.

Arithmetikken følger malen: for standard og akselererte forespørsler separat, andelen godkjent og avvist, godkjent og avvist innen beslutningstid, godkjent etter at gjennomgangstiden ble forlenget, og godkjent etter anke — av anker, ikke av forespørsler — med gjennomsnitt og median tid fra mottak til beslutning. En median under en dag skrives i timer i stedet for å avrundes til "0 dager", som malen ber om eksplisitt. Delvis godkjente forespørsler telles som godkjent, siden malen ikke har en kategori for dem, og siden sier hvor mange det var. Mål rapporteres per forretningslinje, som er nivået CMS krever.

Siden er selvinnholdende — ingen skript, ingen ekstern stylesheet eller font — fordi den publiseres på en offentlig nettside av den som vedlikeholder den, og alt den laster fra andre steder er noe annet som kan bryte eller spore en besøkende. -format csv og -format json gir samme tall for andre formål. Uten -services har siden en merknad om at listen over elementer og tjenester som krever forhåndsgodkjenning mangler, fordi CMS krever det på samme side.

16.8 Legemidler: formulariet, Real-Time Prescription Benefit og elektronisk forhåndsgodkjenning

CMS-0062-P (forslag 14. april 2026) vil bringe medisiner inn i forhåndsgodkjenning: berørte forsikringsgivere vil støtte NCPDP SCRIPT elektronisk forhåndsgodkjenning, NCPDP Formulary & Benefit-standarden og NCPDP Real-Time Prescription Benefit fra 1. oktober 2027, avgjøre medisinerforespørsler innen 24 timer (hastet) og 72 timer (standard), gi en spesifikk grunn for hver avvisning, og rapportere medisinermetrikk fra 2028. Medicare Part D krever allerede SCRIPT ePA. En fil, formulariet, besvarer alt dette:

perfuse serve -fhir -pas -crd-rules payer-rules.yaml -formulary formulary.yaml

examples/formulary/formulary.yaml er et eksempel hvis medisiner er virkelige RxNorm-begreper med NDCs RxNorm lister for dem (sjekket mot RxNav). En fil navngir forsikringsgiveren, dens planer (hver med formulariet den bruker, dens gruppe-ID og dens kostnadsdeling etter apotekfordel og nivå) og dens formularier. Hver medisin er en RxNorm SCD eller SBD med sin RxNorm-gruppe (SCDG eller SBDG Drug Formulary API krever), dens NDCs, et nivå og dens begrensninger: prior_authorization, step_therapy, quantity_limit (en mengde i en rullerende antall dager, og en daglig maksimum), not_covered, alternatives (RxNorm-koder, mest foretrukket først), notes, og questionnaire, den kanoniske URL-en til FHIR-spørreskjemaet en forhåndsgodkjenning ber om. cost_30_day er planens kostnad for en 30-dagers forsyning, som en coinsurance er en prosentdel av; uten det er en coinsurance sitert som en prosent, aldri som en oppfunnet mengde. Hele filen sjekkes når den lastes, hver problem liste samtidig. En medlem finnes ved filens members liste, ved gruppe, eller gjennom FHIR-butikken: en Coverage hvis subscriberId er medlem-ID og hvis class av type plan er planens ID. Forsikringsgivere › Medisiner viser formulariet, priser en medisin og kjører en forhåndsgodkjenning fra ende til ende.

16.8.1 Da Vinci US Drug Formulary API

Publisert på /formulary/fhir som Da Vinci US Drug Formulary 2.1.0: hver plan en PayerInsurancePlan, hver formular en Formulary (begge InsurancePlan), hver medisin en FormularyDrug (MedicationKnowledge) og hver post en FormularyItem (Basic). Veiledningens spørringer betjenes (Basic?code=formulary-item&formulary=...&drug-tier=...&pharmacy-benefit-type=...&period=..., subject:MedicationKnowledge.code, InsurancePlan?formulary-coverage=..., coverage-type, MedicationKnowledge?code=...&doseform=...) med _include=Basic:subject, Basic:formulary og InsurancePlan:formulary-coverage. Det er offentlig, uten legitimasjon, som CMS krever av en forsikringsgivers formular: det betjenes fra en butikk på eget initiativ, i minne, som holder formulariet og ingenting annet, så å være åpen kan ikke nå en pasients journal. Det er skrivebeskyttet. En ekskludert medisin publiseres ikke, ettersom API-en lister hva et formular dekker; RTPB og ePA svarer likevel på den som ikke dekket. Verifisert med HL7 FHIR-validerer mot veiledningens 2.1.0-pakke med terminologi sjekket: hver ressurs generert fra eksemplet har ingen feil.

16.8.2 Real-Time Prescription Benefit

POST /ncpdp/rtpb tar en RTPBRequest (NCPDP RTPB v13) med en API-nøkkel for operatørrollen og svarer en RTPBResponse fra formulariet: dekningstatus, formularstatus, medlemmets estimerte andel og planens, og dekningbegrensninger, med opptil fem dekkede alternativer priset på samme måte. Begrensningkoder og statusen hver kartlegger følger NCPDPs offentlige RTPB-Implementeringsanbefalinger: 75 forhåndsgodkjenning påkrevd, 608 stegterapi, 76 planbegrensninger overskredet, 7X dagers forsyning over planbegrensningen (en medisin ikke tilgjengelig via post, for eksempel), 70 ikke dekket, alle *dekket med begrensninger* (CR) unntatt 70 (NC). En medlem med en godkjent forhåndsgodkjenning på fil får CC og AB8, slik Surescripts-veiledningen ber om, så prescriberen ikke sendes for å spørre igjen. En forespørsel som ikke kan prises er NotProcessed med en NCPDP-avvisningskode: 52 for en medlem ikke funnet, E7 og 19 for en manglende mengde eller dagers forsyning. Apotekfordelen leses fra forespørselen: en fylling over 34 dager er en tre-måneders forsyning, og apotektype M er postordre.

16.8.3 Elektronisk forhåndsgodkjenning (NCPDP SCRIPT)

POST /ncpdp/script tar PAInitiationRequest, PARequest, PAAppealRequest og PACancelRequest med en API-nøkkel for operatørrollen, og svarer hver med sin respons:

ForespørselSvar
PAInitiationRequestClosed når ingen er nødvendig: CC ingen forhåndsgodkjenning påkrevd, FN innenfor mengdebegrensningen, FM ikke dekket eller ikke på formulariet, FQ en godkjenning på fil, CD ingen slik medlem, CG en allerede i prosess. Ellers Open, med en sak-ID og spørsmålssettet.
PARequestAvgjort som en PAS-forespørsel: Approved med godkjenningsnummer og periode, Denied med grunn, eller Open under gjennomgang.
PAAppealRequestEn avvist sak avgjort igjen, på grunn i PANote (en anke uten en er bedt om den).
PACancelRequestApproved mens saken er åpen eller under gjennomgang, og PAS-forespørselen er avbrutt; Denied en gang den er avgjort.

Spørsmålssettet er legemidlets FHIR-spørreskjema fra FHIR-butikken, det samme som DTR fyller ut: en boolesk blir et ja/nei-valg, et valg et valg, et tall et numerisk felt, en dato et datofelt, og alt annet fritt tekstfelt; grupper er flattet i rekkefølge, og enableWhen blir ikke med, siden SCRIPT grenser etter valg og ikke etter betingelse. Et legemiddel uten spørreskjema blir bedt om å svare på tre fritt-tekst-spørsmål: diagnosen, hva som ble prøvd, og hvorfor dette legemidlet. En PARequest blir en Da Vinci PAS-forespørsel: en Claim for legemidlet (RxNorm og NDC), MedicationRequest det ber om, pasienten, skriver ut og dekning, og svarene som en QuestionnaireResponse, med eventuelle vedlegg som DocumentReference. Det blir deretter avgjort som alle tidligere godkjenninger på denne serveren: regelfilen, et avgjørelsestjeneste (-pas-decider-url), eller reviewer-køen, hvor det merkes som Legemiddel og holdes til legemidletidsrammene. En avgjørelsestjeneste ser en legemiddelforespørsel nøyaktig som den ser en fra en EHRs PAS-klient. Vi anbefaler Vaglio, BioDreams åpne kildekode (PolyForm Shield) avgjørelsemotor, som har legemiddepolitikker med stegterapi; en payers egen motor kobles inn gjennom samme -pas-decider-url, og ingen er nødvendig for regelfilen og reviewerne for å avgjøre.

En avgjørelse som er gjort etter at forespørselen ble besvart (en reviewers, en anke) sendes til skriver ut som en uoppfordret PAResponse eller PAAppealResponse, rute til kanalen navngitt av -epa-reply-channel, som leverer det til nettverket. Uten en, eller når leveringen feiler, sier saken at skriver ut ikke har blitt fortalt og skjermen sender det igjen.

Payers › Legemidler › Godkjenning sender meldingene en skriver ut-system ville til denne serverens egen endpoint (start, besvar spørsmålene, se avgjørelsen), lister hver sak med hva skriver ut ble fortalt, og viser legemiddeltallene CMS-0062-P foreslår: forespørsler godkjent, avvist og ventende, anket og godkjent eller avvist på anke, gjennomsnitt og median timer fra forespørsel til avgjørelse, og hvor mange ble avgjort for sent. Medisinske legemidler som blir forespurt gjennom PAS (en HCPCS J-kode med en MedicationRequest, eller en vare kodet i RxNorm eller NDC) teller som legemidler i PAS-tallene også.

Hva dette hviler på, uttalt på en enkel måte. NCPDPs skjemaer og implementeringsveiledninger er lisensiert. Elementnavnene og rekkefølgen her følger de offentlige Surescripts ePA- og RTPB-veiledninger og deres eksempler, og NCPDPs offentlige RTPB-anbefalinger. To elementer det offentlige materialet aldri viser er skrevet til SCRIPT-mønsteret som brukes andre steder og bør kontrolleres mot en lisensiert kopi før sertifisering: Closed/ReasonCode og Denied/DenialReason. Ingen melding har blitt kontrollert mot NCPDPs XSD eller et nettverks sertifisering. NCPDP Formulary & Benefit-filen blir ikke produsert: dens fullstendige layout er i NCPDPs lisensiert veiledning, og en delvis fil vil bli avvist av nettverket som laster den.

16.9 Hva som ble kontrollert, og mot hva

CARIN- og PDex-utdataene ble valideret med den offisielle HL7 FHIR-validereren, lastet med de publiserte pakkenavnene (hl7.fhir.us.carin-bb#2.2.0, hl7.fhir.us.davinci-pdex#2.2.0): profesjonell, innlegg og utlegg krav og to PAS-beslutninger, uten feil. PDex-inndata var PAS-veiledningens egne eksempler fremfor former skrevet her for å være enig med konverteren. Validereren fant fem feil på første kjøring — blant dem at CARIN krever profilversjonen i meta.profile og krav-type kode-systemversjon på institusjonelle krav — og hver er fikset og dekket av en test.

Bygging av dette fant en feil eldre enn det: FHIR-butikken droppet hver enkelt element dens interne modell ikke erklærte, så en ExplanationOfBenefit mistet sine elementer, diagnoser, avgjørelse og betaling på veien inn. Butikken holder nå hva enn en ressurs bærer, og en test laster en CARIN-krav gjennom serveren og leser det tilbake helt.

CRDs utdata - den oppdaterte ordren, og CDS Hooks-svaret mot CRDs egen logiske modell - og DTRs pakkeutdata validerer i den offisielle HL7-validereren mot CRD 2.2.1 og DTR 2.2.0 uten feil.

DTR her er payers siden av 2.2.0. $questionnaire-package tar spørreskjemaene navngitt, de CRD navngav på en ordre, eller dekningssertifikatets id CRD returnerte (context, mens samme prosess betjener CRD), og returnerer hver som en pakke-bundle med en QuestionnaireResponse å fylle ut, Bibliotekene dens CQL trenger og deres avhengigheter. Verdisettene svarene bruker reiser i pakken når de lastes (PUT /fhir/ValueSet/{id}), og $expand lister deres koder. $log-questionnaire-errors skriver hva en DTR-app rapporterer til serverloggen.

Adaptive spørreskjemaer: skriv hele spørreskjemaet en gang, med SDCs questionnaireAdaptive-utvidelse og enableWhen på spørsmålene som bare gjelder noen ganger. Pakken gir appen en tom skall, og hver $next-question-kall legger til neste spørsmål som gjelder for svarene hittil, til det ikke er noe igjen å spørre om og svaret er merket som fullført. Rekkefølgen og grenseringen er payers egne regler; spørsmål som ikke gjelder vises aldri.

Logge inn som en klient: DTR- og PAS-klienter når payer med SMART Backend Services - en signert JWT byttet mot en token på payers autorisasjonsserver. Peker Perfuse mot den serveren med -smart-issuer (og -smart-jwks hvis dens adresse ikke kan løses fra Perfuse), og passer -smart-backend-services så oppdagelsesdokumentet sier det. Inferno DTR-suiten passerer denne måten med Keycloak som autorisasjonsserver.

Perfuse kan være den autorisasjonsserveren selv: serve -fhir -smart-clients clients.yaml utsteder Backend Services-tokens på /auth/token til klientene listet, hver med de offentlige nøklene den signerer sine påstander med og systemomfangene den kan bli tildelt, og FHIR-endepunktet aksepterer dem. Ingen separat identitetsserver er nødvendig for en payers maskin-til-maskin-klienter.

Med -smart-users users.yaml også, medlemmer og kliniske ansatte logger inn der for å autorisere apper, som Patient Access API trenger: appen sender personen til /auth/authorize, de logger inn, en klinisk ansatt velger pasienten, og begge ser hva appen ber om og kan fjerne noen av det. En medlem blir bare noen gang gitt sin egen post, uansett hva appen ber om. Hver person i filen navngir FHIR-resursen de er, Patient/… eller Practitioner/…, og en passordhash fra perfuse smart hash; passordet selv blir aldri skrevet ned.

Personer kan logge inn hos organisasjonens egen identitetsleverandør i stedet: -smart-oidc oidc.yaml angir navnet (utsteder, klient-ID og hvor hemmeligheten er), og innloggingsiden tilbyr "Logg inn med" den ved siden av passordet. Hver person er koblet til leverandørens emne, oidc_subject i brukerfilen, så filen bestemmer fortsatt hvem som kan godkjenne apper og hvilken FHIR-ressurs de er; en konto koblet til ingen blir avvist. Koder, oppfriskningstoken og tilbaketrekninger lagres i databasen, så en omstart logger ingen ut.

Brukere → SMART-apper i konsollen lister opp registrerte apper og personer, og legger til, redigerer og fjerner dem. Hver lagring kontrolleres som filene er ved oppstart, skrevet til dem og brukt med en gang. En konfidensiell app lagret uten hemmelighet får en, vist en gang; et passord settes der og vises aldri igjen. Fjerning av en app eller en person stopper tilgangstokene som allerede er utstedt til den eller gitt av dem med en gang, ikke når de utløper, og deres oppfriskningstoken med dem.

Omfang kan være detaljert, som SMART App Launch 2 og US Core definerer dem: patient/Observation.rs?category=laboratory leser bare Observasjoner som søket ville finne. En godkjenning som er filtrert for en type anvender filteret til hver søk og hver lesing av den typen; en ufiltret godkjenning for typen, eller for *, løfter det. Et filter som ikke kan leses gir ingen tilgang i stedet for all tilgang.

16.10 Avgjørelse av på forhånd autorisasjonsforespørsler: PAS

serve -fhir -pas -crd-rules rules.yaml svarer Da Vinci PAS 2.2.1 på POST /fhir/Claim/$submit og POST /fhir/Claim/$inquire. Beslutningene kommer fra samme regelfil som CRD's svar, så rekkefølgen en kliniker blir bedt om å godkjenne, avgjøres av regelen som sa det:

  - description: Physical therapy
    codes: ["PT"]                       # matched on the item's productOrService, then the code of the order it requests
    system: https://codesystem.x12.org/005010/1365
    covered: covered
    pa: auth-needed
    pa_decision: approve                # approve, deny or pend; empty: not-covered is denied, no-auth approved, the rest pended
    details:
      - {code: allowed-quantity, value: "6"}   # asked for more, it is certified for six (A6, with the authorised detail)
  - description: MRI
    codes: ["62"]
    pa_decision: approve
    pa_alternative: {system: "https://codesystem.x12.org/005010/1365", code: "4"}  # approved as an X-ray instead (an added item)
  - description: Surgery
    codes: ["2"]
    pa: auth-needed                     # pended for a reviewer, asking for:
    questionnaire: https://payer.example.org/Questionnaire/surgery   # a DTR questionnaire
    pa_attachments: ["18776-5"]         # and documents, by LOINC attachment code

Hver post får en X12-gjennomgangshandling: A1 sertifisert, A3 ikke sertifisert, A4 utsatt, A6 endret, C avlyst (sertifiseringstype 3). En linje som ikke navngir en tjeneste, blir ikke avgjort, men besvart med en feil (X12 901 AG, korrekt og send igjen). Svaret gjentar hva en 278-svar gjentar — postsporingnummer, ønskede tjenestedatoer, møtedatoer, overføringsidentifikatorer med avsender og mottaker byttet om — og gir hver linje forsikringsgiverens egen administrasjonsreferansenummer. En tjeneste som ingen regel navngir, blir utsatt, aldri godkjent: en avgjørelse som ingen har skrevet ned, er en avgjørelse for en person.

Utsatte forespørsler venter på en gjennomganger, som svarer med POST /fhir/Claim/$decide:

{"resourceType": "Parameters", "parameter": [
  {"name": "claimResponse", "valueString": "<the ClaimResponse id>"},
  {"name": "decision", "valueCode": "approve"},
  {"name": "reason", "valueString": "Reviewed with the plan of care."},
  {"name": "reviewer", "valueString": "<the reviewer's NPI>"}]}

decision kan også være modify: sertifisert, men ikke som bedt om, med quantity (valueDecimal, enhetene sertifisert) og/eller alternative (valueCoding, tjenesten godkjent i stedet). Responsen sier da A6 Modified, med den sertifiserte detaljen eller alternativet som en lagt til post, og en autorisasjonsnummer. item (valueInteger, gjentakelse) begrenser avgjørelsen til noen linjer. Avgjørelsen blir en ny versjon av responsen, merket som gjennomgått av en person, og med -fhir-subscriptions leveres den på PAS-tema (PASSubscriptionTopic, filtrert av org-identifier, organisasjonens identifikator som ba om det) som det fullstendige PAS-svar-bundle, i samme transaksjon som registrerer det. $inquire returnerer den nåværende responsen til hver forespørsel leverandøren gjorde om den medlemmen; en annen leverandørs forespørsel finner ingenting. $decide trenger en skriveområde; $inquire er en leseområde.

Forespørsler og hver versjon av deres svar lagres i pas_requests og pas_responses i serverens database.

16.10.1 Gjennomgangerkøen

I webkonsollen, Forsikringsgivere → CMS-0057 → Gjennomgangskø lister opp utsatte forespørsler som snartest utløper først: en rasjonert forespørsel (Krav.prioritet stat) utløper 72 timer etter ankomst, en standard 7 dager. Valg av en viser medlemmen, leverandøren, hver tjeneste med enhetene som er ønsket og hvor den står, hva svaret ønsket, og hver dokument mottatt for den, med ren tekst-dokumenter vist inline. En redaktør registrerer avgjørelsen der: godkjenne, avvise eller endre (sertifiserte enheter, eller en annen tjeneste godkjent i stedet), med en grunn og redaktørens NPI. En endring må sertifisere færre enheter enn det som ble ønsket; like mange eller flere er en godkjenning, og avvises som en endring. En godkjent tjeneste i stedet starter i kode-systemet til den som ble ønsket. Det er samme avgjørelse som $decide gjør, så leverandørens abonnement leverer den. Lesing av en forespørsel og avgjørelse av den er begge skrevet til revisjonsloggen.

Overvåk → Teamdashbord → Forhåndsgodkjenning viser, for de siste 30 dagene, hvor mange standard- og rasjonerte forespørsler ble avgjort innen CMS-0057s tidsrammer, avgjort for sent, fortsatt venter innen tidsrammene og forsinket nå, med median tid til avgjørelse, og hvordan tjenestene som ble ønsket ble besvart: godkjent, endret, avvist eller fortsatt utsatt. Disse to flisene leses fra forespørslene selv, så de er ikke i dashbordets Grafana-eksport, som sier det i sin beskrivelse.

16.10.2 Motta dokumenter som en pendende forespørsel ber om

En ventende respons ber om dokumenter med en oppgave og en CommunicationRequest per dokument. Et spørreskjema blir bedt om som PAS beskriver det: en CommunicationRequest med den enkelte LOINC-koden 102089-0, under sporingsnummeret for linjen det gjelder for (itemTraceNumber, som ClaimResponse gjentar; en linje sendt uten ett blir tildelt ett). Det sporingsnummeret er DTR-konteksten: $questionnaire-package med bare context satt til det returnerer spørreskjemaet. Leverandøren sender det som ble bedt om med Da Vinci CDex $submit-attachment (POST /fhir/$submit-attachment): TrackingId er forespørselens eget sporingsnummer (ClaimResponses første identifikator, som også er Task-identifikatoren), eller en CommunicationRequests identifikator, AttachTo er preauthorization, og MemberId må være forespørselens medlem. Hver vedleggs DocumentReference eller QuestionnaireResponse beholdes med forespørselen og vises til dens gjennomgående; et dokument som ankommer avgjør ingenting.

16.10.3 Avgjøre i et X12-utnyttelsesstyringssystem

De fleste betalere bestemmer forhåndsautorisasjoner i et UM-system som snakker X12 278. Med -pas-278-url er Perfuse FHIR-fronten av dette systemet: hver $submit sendes som en 278-forespørsel (005010X217), hver enkelt pasienthendelse. Hver bærer hva PAS navngir for det: gjennomgangstypen (extension-serviceItemRequestType, UM01: helse-tjenester, innleggelse eller spesialistbehandling), sertifikat-typen (extension-certificationType, UM02), tjenestetypen, stedet for tjenesten (UM04), tjenestenivået (extension-levelOfServiceCode, UM06: valgfri,急 eller nødvendig; en stat-prioritet står i for urgent), datoen, en innleggelses-gjennomgangs innleggelses- og utskrivningsdatoer, diagnosene, omsorgsteamets leverandør som skal utføre tjenesten, og prosedyren og mengden, som en profesjonell (SV1) eller, på en institusjonell krav, et sykehus (SV2) tjenestelinje. 278-svarets handling-kode og autorisasjonsnummer blir hendelsens gjennomgangshandling: sertifisert, delvis eller endret, avvist, utsatt, avbrutt eller ikke vurdert (utsatt for en gjennomgang, med avvisningsårsaker). Lokale regler konsulteres ikke.

perfuse serve -fhir -pas -pas-278-url https://um.example/x12/278 -pas-278-receiver ACMEUM \
  -pas-278-token-env UM_TOKEN

Et UM-system som først setter på vent og avgjør senere, posterer sin senere 278-svar til POST /fhir/Claim/$decide-278; hvert hendelse er koblet til sin forespørsel ved sporingsnummeret Perfuse sendte, og avgjøres som $decide ville avgjøre det. Hvis UM-systemet ikke kan nås, eller svarer med noe som ikke er et 278-svar, settes hver post på vent for en gjennomganger og leverandøren blir bare informert om det; årsaken er i serverloggen.

Spørsmål UM-systemet svarer på

En lege's $inquire må finne en autorisasjon uansett hvordan den ble bedt om: via faks, gjennom betalerens portal, via telefon, eller i en 278 en annen søker sendte. Perfuse holder bare forespørsler som kom gjennom det; UM-systemet holder dem alle. Så med et UM-system som svarer i sanntid (hver transport bortsett fra sftp), hver $inquire sendes også der som en 278-spørsmål (005010X215: BHT02 28, medlem, lege, autorisasjonsnummer fra Kravets insurance.preAuthRef når det har ett, og hendelsesdatoer fra billablePeriod eller tjenestens datoer, ellers et år på hver side av i dag). Hver autorisasjon svaret holder som Perfuse ikke (matchet av spor-numre det sendte og autorisasjons-numre det allerede ga) kommer tilbake som en mer Krav-spørsmål-pakke: UM-systemets avgjørelse for hver tjenestelinje, autorisasjonsnummer og periode, og en notis som sier hvor det ble funnet. Ingen Krav lages opp for en autorisasjon ingen sendte i FHIR: dens ClaimResponse.request bærer en data-fraværs-årsak, som PAS-profilen tillater. Et spørsmål leser bare; ingenting i Perfuse egne poster endres. Hvis UM-systemet er nede eller svarer med en TA1 eller 999, får lege det Perfuse holder, og lenkens status sier hvorfor. Formen følger 278-spørsmål-veiledningene UnitedHealthcare, Cigna og Blue Cross Blue Shield of Massachusetts publiserer; den har ikke blitt prøvd mot et virkelig UM-system.

Hvordan 278-ene når UM-systemet

UM-systemets tilkoblingsveileder sier hvordan det tar 278-er, og -pas-278-transport (Innstillinger, Payers, Utnyttelsesstyring lenke) følger det:

TransportHva som sendesAutentisering
x12 (standard)278 POSTet som application/edi-x12; svaret er responsens tekstEn bærertoken, OAuth, HTTP Basic, et klient sertifikat
core-soapCAQH CORE real-time SOAP 1.2-omslag (COREEnvelopeRealTimeRequest, payloadtype X12_278_Request_005010X217E1_2, eller X12_278_Request_005010X215 for en forespørsel): Connectivity Rule vC2.2.0 med payloaden i omslaget, som de fleste betalere og CMS esMD kjører, eller -pas-278-core-version C4.0.0 med payloaden som en MTOM-vedleggvC2.2.0: et brukernavn og passord (WS-Security UsernameToken) eller et klient sertifikat. vC4.0.0: et klient sertifikat og en OAuth-token
core-mimeCAQH CORE vC2.2.0 HTTP MIME multipart-omslag, payloaden som en fil-delOmslagets UserName og Password, eller et klient sertifikat
sftpHver 278 plassert i en mappe på UM-systemets SFTP-tjener (-pas-278-sftp, -pas-278-sftp-outbound); svarene samlet fra en annen (-pas-278-sftp-inbound, hver -pas-278-sftp-every)En SSH-nøkkel eller passord; tjenerens nøkkel må være i -pas-278-sftp-known-hosts

Et klient-sertifikat er -pas-278-cert og -pas-278-key; -pas-278-ca stoler på en payers egen sertifikat-utsteder. OAuth er -pas-278-oauth-token-url, -pas-278-oauth-client-id og hemmeligheten, hentet med klient-credens-grant og holdt til en minut før den utløper. Passord, token og hemmeligheter er aldri flagg: hver er navngitt av en miljøvariabel (-pas-278-password-env, -pas-278-token-env, -pas-278-oauth-secret-env, -pas-278-sftp-password-env), eller skrevet inn i innstillingsskjermbildet, hvor den holdes i innstillingfilen (lesbar av serverkontoen bare) og aldri vist igjen.

UM_PASSWORD=... perfuse serve -fhir -pas -pas-278-transport core-soap \
  -pas-278-url https://um.example/CORE/RealTime -pas-278-receiver ACMEUM \
  -pas-278-user perfuse -pas-278-password-env UM_PASSWORD

Over SFTP ventes hver forespørsel ut til svaret kommer: 278-svaret avgjør elementene, og Perfuse legger en 999 som godtar det i utgående mappe. En fil den ikke kan lese, blir i innkommende mappe for en person og tilbys igjen ved neste lesing.

Når UM-systemet ikke kan lese en forespørsel

Et UM-system som ikke kan lese en 278 svarer med en TA1 (konvolutten) eller en 999 (transaksjonen) i stedet for en avgjørelse. Perfuse leser hva og hva det sier, venteer hver element ("utnyttelsesstyring kunne ikke lese forespørselen"), og registrerer det. Betaler, CMS-0057, Gjennomgående kø viser lenken: hva som ble sendt de siste syv dagene, hver interchange etter sitt kontrollnummer, og hva som skjedde med det (besvart; bekreftet, svar kommer; avvist, med 999-segment, element og kode; ikke nådd). Hver interchange har sitt eget kontrollnummer, ett mer enn det forrige, som er hva en TA1 eller 999 navngir når den svarer.

16.10.4 Avgjøre basert på kliniske bevis, med en avgjørelsetjeneste

En regelfil avgjør etter tjenestekode: en kode trenger ingen autorisasjon, er ikke dekket eller går til en gjennomganger. Om denne pasienten møter kriteriene for det, er et annet spørsmål, besvart fra betingelsene, spørsmålsbesvarelser og dokumenter leverandøren sendte med forespørselen. Med -pas-decider-url, settes hver post reglene lar gå til en gjennomganger, først til en avgjørelsestjeneste, som f.eks. Vaglio, som leser den samme PAS-forespørsel-bunten gjennom Perfuses publiserte pas-pakke. En offentlig Vaglio, på oppfunnete forespørsler bare, kjører ved siden av Perfuses testinstans på https://vaglio.perfuse.health:8443 (logge inn som demo, passord try-vaglio-demo; den kan se på alt og endre ingenting): hver avgjørelse der har sin bevis, et rent språk-brev og en kvittering alle kan sjekke.

perfuse serve -fhir -pas -crd-rules payer-rules.yaml -pas-decider-url https://vaglio.example/api/pas/decide \
  -pas-decider-token-env VAGLIO_TOKEN

The URL must be https, or plain http to this machine (localhost, 127.0.0.1), because it carries a patient's record and the token. Vaglio itself answers on https only; when it uses a certificate from its own authority, pass that authority with -pas-decider-ca DATA/tls/ca.crt (or any payer's internal authority the service's certificate comes from). The service is sent the request Bundle as the provider sent it, POST <url>?item=<sequence> (application/fhir+json), and answers {"decision": "approve" | "deny" | "pend", "why": "...", "requested": ["..."]}, or 404 when it decides nothing for that item, which leaves the rules' answer standing. why is the response's process note and is required for a denial, which is otherwise pended; requested is said to the provider as the information a pended request needs. A pend may also carry "questionnaire": "<canonical>" and "attachments": ["<LOINC>", ...], which are asked for in the response's CDex Task and CommunicationRequests beside whatever DTR questionnaire or attachments the rule asks for (the rule's questionnaire wins, since a Task asks for one; a code that is not LOINC's shape is dropped and logged). A rule that approves or denies is the payer's coverage policy and is not sent to the service. A failure, a timeout or an answer that is not one of the three decisions pends the item for a reviewer, with the reason in the server log: nothing here turns a failure into an approval. It cannot be combined with -pas-278-url, where the UM system answers every item.

Råd før innsending. Med -crd-advisor-url ved siden av -crd-rules, ber også CRD en avgjørelsestjeneste hva en priorisert godkjenningforespørsel for hver ordre som trenger det, ville bli sagt som journalen står, og viser svaret som en ekstra kort: "Før du sender: en forespørsel for dette ville trenge: ...", eller "ville bli godkjent", med hva som fortsatt trengs, spørsmålet som ber om det, og hva som ville godkjenne det. Vaglio svarer på /api/pas/advise, med samme token og myndighet som ovenfor:

perfuse serve -fhir -pas -crd-rules payer-rules.yaml \
  -crd-advisor-url https://vaglio.example/api/pas/advise -crd-advisor-token-env VAGLIO_TOKEN

CRD sends POST <url> with {"service": {"system": "...", "code": "..."}, "resources": [ ... ]}, the resources being the hook's prefetch (the patient first, the coverage left out), and reads {"decides": true, "answer": "approve" | "pend" | "deny", "summary": "...", "missing": [...], "questionnaire": "...", "toApprove": [[...]], "policyTitle": "..."}. It is advice and changes nothing: the coverage-information, the other cards and the PAS decision are what the rules say. It waits at most three seconds, and no answer, a failure, or "decides": false leaves the response exactly as it is without it. Perfuse never needs a decision service.

Forespørselen bærer X-PAS-Request-Id, id-en svaret er kjent med. En tjeneste med sine egne gjennomgåere som setter en post på vent, kan sende sin avgjørelse senere som en hvilken som helst gjennomgåers: Claim/$decide med den id-en som claimResponse, postens sekvens, og avgjørelsen og årsaken. Leverandørens abonnement leverer det som det ville en avgjørelse lagt i gjennomgåer-køen.

En abonnement med id-only-innhold forteller leverandøren hvilket svar som har endret seg uten å si hva det er: fokuset for varselet er Bundle/<id>. GET /fhir/Bundle/<id> returnerer den siste PAS-svaretpakken, GET /fhir/Bundle/<id>/_history/<n> versjonen som varsende varselet, og GET /fhir/ClaimResponse/<id> ClaimResponse alene. En token som er bundet til en pasient tildelt blir informert om at de ikke eksisterer, slik som for noen rekord utenfor dens pasient.

Verifisert med den offisielle Inferno PAS Server v2.2.1-suitten (se verifisering). Ikke sendt, selv om PAS merker dem som må-støtte: ClaimResponse.adjudication med en gjennomgangshandling, ClaimResponse.extension:authorizedProvider og ClaimResponse.item.extension:communicatedDiagnosis, fordi utvidelsene de trenger ikke er tillatt der av deres egen kontekst i PAS 2.2.1 og validereren avviser et svar som bærer dem; og request.extension:DataAbsentReason, fordi Perfuse alltid vet forespørselen. 278-ene som sendes til et utnyttelsesstyringssystem (ovenfor) er sjekket mot PAS 2.2.1-eget forespørsels eksempler, CMS-publikerte esMD 278-eksempler og en 278-sjekker skrevet fra offentlige companion-guider, og hver transport mot en stand-in UM-system skrevet fra CAQHs Connectivity Rules (se verifisering); ikke ennå mot et virkelig UM-system eller clearinghouse, og ikke CORE-sertifisert. Ikke implementert: vedlegg sendt tilbake med CDex.

En regelfil sjekkes mot CRDs egne invarianter når den lastes: et spørsmål trenger dokumentasjon, en tjeneste som ikke er dekket kan ikke trenge autorisasjon, satisfied hører til ett tilfelle og ikke en regel, og alt betinget må gi en årsak.

Ikke verifisert: eksportene og medlemssammenligning mot en annen betalers implementering, målingene mot en betalers publiserte tall, og CRD mot en virkelig EHRs CDS Hooks-klient.

16.11 Sending av forespørsler om forhåndsgodkjenning til en betaler (for leverandører)

Alt ovenfor svarer forespørsler, som en betaler. En leverandørs side er motsatt: en EHR eller en DTR-app bygger en Da Vinci PAS-forespørselbunke, og noe må sende den til betaleren, holde svaret og sende det videre. En pas-destinasjon gjør dette.

name: prior-auth-out
dataType: raw
source:
  type: http
  http:
    listen: 127.0.0.1:8095
    path: /pas
destinations:
  - name: acme-health
    type: pas
    pas:
      payer: https://pas.acme-health.example/fhir
      bearer_token: ${ACME_PAS_TOKEN}     # or auth: { type: client_credentials, token_url, client_id, client_secret }
      results_to: pas-answers             # optional: a channel that takes each answer back to the EHR

Hvert melding må være en hel PAS-forespørsel Bundle på en rå kanal. Perfuse posterer den uendret til {payer}/Claim/$submit: betaleren avgjør Claim sammen med pasienten, dekning og støtteressursene i Bundle, og en Claim gjenoppbygget fra en sammenfatting ville tape dem. Av denne maskinen må betalerens adresse være https.

En beslutning er en levert forespørsel, uansett hva den sier. En godkjenning, en avvisning og en pend er alle registrert og ingen blir forsøkt på nytt, fordi å forsøke på nytt en avvisning sender samme forespørsel to ganger. Det som feiler leveringen, og blir forsøkt på nytt, er en betaler som ikke har avgjort: en feilstatus, en OperationOutcome (dens tekst er feilen) eller en ClaimResponse hvis utfall er error. Beslutningen leses punkt for punkt fra PAS-gjennomgangshandlingene (X12 306: A1 godkjent, A2 delvis, A3 avvist, A4 utsatt, A6 modifisert); et svar uten kode blir listet som "ingen beslutningskode" i stedet for å bli tatt som en godkjenning. En avvisning uten noen grunn blir avvist fordi den ikke møter CMS-0057.

Svar fra betaleren er bestemmelsens svar, så Inspect the reply kan vurdere det, og results_to overfører det til en annen kanal. Hver forespørsel er listet på CMS-0057, Forespørsler sendt til betalere: når den ble sendt, pasienten, tjenesten, avgjørelsen og betalerens referanse (preAuthRef), som en senere forespørsel navngir. Listen oppbevares i prior-auth.json ved siden av databasen (høyst 10 000 forespørsler; de eldste avgjorte går først, en ventende går aldri), og hver leier ser bare sin egen.

Verifisert mot HL7 Da Vinci PAS-betalerreferanseimplementeringen (docker-bilde hlseven/davinci-prior-auth): en forespørsel sendt gjennom en kjørende kanal blir utsatt av den med dens referanse, og svaret vises på skjermen (se verifisering). Ikke prøvd mot en produksjonsbetaler ennå. Ikke bygget: oppfølging av en utsatt forespørsel med $inquire, eller mottak av betalerens senere svar via abonnement; en kanal kan gjøre begge deler i dag med en http- eller fhir-bestemmelse.

16.12 CMS-sammenlignede nettverk

CMS Interoperabilitetsrammeverket (CMS Health Technology Ecosystem) ber helse-data-nettverk om å selv-erklære seg til 26 kriterier og bli listet som CMS Aligned Networks; EHRer, leverandører, betalere og apper kobler seg til dem. Kriterium 13 til 16 har vært i kraft siden 4. juli 2026: FHIR-APIer på US Core med en full CapabilityStatement og Bulk Data, dokumenter som menneske-leselige FHIR-vedlegg, avtale- og møtevarslinger via FHIR-abonnement, og en journal-lokator.

Administrer › CMS-sammenlignende nettverk listar hver kriterium med hva Perfuse tilbyr for det og hvor denne serveren står, lest fra hva som er slått på her:

StatusMening
Klart herPerfuse tilbyr det og det er på.
Klart, med et gapDet er på, og en del av kriteriet er utenfor det (navngitt på skjermen).
Bygget, ikke påPerfuse tilbyr det; skjermen navngir innstillingen eller flagget som slår det på.
Ditt å gjøreOrganisasjonens del: en avtale, en sertifisering, publisering til National Provider Directory.
Ikke byggetProgramvare ville gjøre det, og Perfuse gjør det ikke.

Hva de fire i kraft trenger fra denne serveren:

KriteriumI PerfuseSlå på
13 FHIR-API-er, US Core, Bulk DataFHIR-endepunktet med sin CapabilityStatement, og $export-fhir, -fhir-bulk-export
14 Dokumenter som FHIR-vedleggDocumentReference med Binary, og IHE MHD over XDS-registret-fhir (MHD også -xds)
15 Møte- og møte-varslingerEmnebaserte abonnementer (R5 Backport for R4) fra ADT- og SIU-kanaler-fhir-subscriptions
16 PostlokatorXDS.b-registret, XCA for andre samfunn, PIXm-xds, -xds-home-community

Skjermen er et arbeidsark for attestering, ikke en sertifisering: CMS gjennomgår nettverk de mistenker ikke møter kriteriene, og ramverkets egen tekst er myndigheten. Ikke bygget i dag: åpne kvalitetsgapforespørsler (kriterium 8), en forsikrers spørring for en kravs møtedata (9), rapportering av spørringsmetrikker til National Provider Directory (19), sjekking av leverandører mot denne katalogen (6), lesing av mobile sjåførerlisenser eller digitale forsikringskort (3, 23), og gjennomføring av en generell samtykkepolitikk på hver lesing (5). IAL2-identitetsverifisering er identitetstjenestens; Perfuse aksepterer tokenene til den du velger.

17 Sikkerhet

Perfuse håndterer klinisk data. Dette kapitlet er hva det gjør med det og hva det lar være til deg.

17.1 Transport-sikkerhet

TLS på web-grensesnittet er konfigurert med -tls-cert og -tls-key. Uten dem er grensesnittet vanlig HTTP, som er akseptabelt på en loopback-adresse for en første titt og ingen andre steder — det inneholder legitimasjon og meldingsinnhold, begge lesbar på ledningen.

TLS på kanal-transporter er per kilde og per mål, under en tls-blokk. Tilgjengelige innstillinger er i kilde og mål referanser.

insecure_skip_verify aksepterer ethvert sertifikat. Den eksisterer fordi hospitalsystemer rutinemessig presenterer sertifikater som ikke vil verifiseres, og å nekte å koble til ville bety å nekte å integrere. Den er navngitt for å være tydelig, og å bruke den betyr at forbindelsen er kryptert, men ikke autentisert — du har beskyttelse mot passiv avlytting og ingen mot en innført server.

En uverifisert TLS-forbindelse er ikke det samme som en verifisert en, og forskjellen er verdt å registrere et sted der dine revisorer vil finne det. Den bedre løsningen er nesten alltid å skaffe den fjerne endens sertifikat og stole på det eksplisitt i stedet for å stole på alt.

17.2 Autentisering og roller

Brukere holdes i databasen. Hver har en av fem roller, og hver rolle inkluderer alt i rollene over den:

RolleKan
OvervåkSe om ting fungerer: kanalstatus, tellinger, flytkart, varsler, dashboards, metrikker og køens dybde. Ingen meldingsinnhold, kanalfiler eller køede meldinger.
ViserKan også lese meldinger, kanalfiler, spor og aktivitetlogg.
OperatørKan også sende på ny: gjenprosesser en melding, avspille en kanal og prøve å levere køede meldinger på ny.
RedaktørKan også opprette og endre kanaler, og kjøre sammenligninger.
AdminKan også starte og stoppe kanaler, tømme køer og administrere personer, token og serverinnstillinger.

En sjette rolle, Plattform, tilhører den som kjører en delt server: den oppretter leietakere og setter deres grenser, og har ingen kanaler av sin egen.

Overvåkning er for en hjelpepult, eller for en operasjonsskjem på en vegg: alt som trengs for å se at en kanal har stoppet, og ingenting som navngir en pasient. Viser kan lese meldingsinnhold, som er klinisk data; det er en lav-privilegeringsrolle for *konfigurasjon*, ikke for personvern. Operatør skiller fiksering av en feilende levering om natten fra å endre hva en kanal gjør: personen som sender på nytt trenger ikke å kunne omskrive kanalen.

17.2.1 Gjentatte feil passord

Feil passord og mislykkede passkort-innlogginger telles etter adresse som tilkoblingen kommer fra, og etter noen på rad må denne adressen vente før den kan prøve igjen (svaret er 429, med Retry-After). Kontoer låses ikke ved navn, fordi det ville tillate noen å låse ut en administrator med vilje.

Adressen er tilkoblingens egen, aldri en adresse som en forespørsel hevder i X-Forwarded-For, som avsenderen skriver. Bak en omvendt proxy på samme maskin bruker Perfuse siste X-Forwarded-For-post, den proxyen la til, så hver klient teller likevel hver for seg. En proxy på en annen maskin når Perfuse fra én adresse, og alle dens klienter deler én telling: ratelimiter innlogginger ved den proxyen også.

17.2.2 Kanalgropper

En person (eller en API-nøkkel) kan begrenses til noen kanalgrupper: de ser da og handler kun på kanaler hvis group er en av deres. Dette er ordningen for en sykehusgruppe på en server, hvor hver enkelt anleggs analytikere tar hånd om sine egne feeds og et sentralt team, uten begrensning, tar hånd om alle. Rhapsody kalder det en låst boks.

Begrensningen gjelder overalt på samme tid, fordi den pålegges forespørselen i stedet for å huskes av hver skjerm: kanalisten, dashbordet og flytskjemaet, meldinger og deres søk, tellinger og diagrammer, køen, varslinger, metrikker, sertifikater, kontrakter og kodebruk. En kanal utenfor personens grupper eksisterer ikke for dem; å spørre etter den ved navn svarer *ikke funnet*, så navnet er heller ikke bekreftet. En kanal uten gruppe sees bare av personer uten begrensning.

Lagring av en kanal holder den inne i personens grupper: de kan ikke opprette en kanal i en annen gruppe, eller flytte en ut av sin egen. Hva hver fasilitet deler - kodetabeller, skriptbiblioteker, forhåndsgodkjenningsbeslutninger - kan de lese, men ikke endre. Serveromfattende tall (forhåndsgodkjenning, tokenbruk, tunneler) vises bare til personer uten begrensning, og det samme gjelder metrikker og varslinger om hele serveren i stedet for en kanal.

En administrator begrenset til grupper er en fasilitets egen administrator. De håndterer personer og nøkler i sine grupper, starter og stopper sine kanaler og rydder sine køer. En kollega de legger til får deres grupper med mindre de navngir noen av dem, de kan ikke gi en gruppe de ikke har, og de ser eller endrer aldri noen uten begrensning. Alt annet en administrator kan gjøre, endrer hele serveren - innstillinger, pålogging, omstart, varslingsregler, merking, flåte, SMART-serveren - og nektes dem.

Grupper settes i Brukere (og for nøkler i Nøkler), som en komma-separert liste. Hver endring registreres i aktivitetlogg og treffer i kraft ved personens neste forespørsel.

En annen rolle i hver gruppe

En person kan ha en annen rolle i hver av sine grupper: lab=editor, adt i Brukere redigerer labens kanaler og har rollen valgt ved siden av den - for eksempel viser - i admissjonens kanaler. De ser begge gruppens kanaler på hver skjerm. Lagring, start eller gjensending av en kanal i en gruppe hvor deres rolle er for lav, blir avvist med rollen de har der; det later ikke som om kanalen mangler, siden de kan se den. Deres rolle øverst på skjermen er den sterkeste de har, som åpner skjermene som rollen bruker, og hver handling på disse skjermene er fortsatt begrenset til gruppene hvor de har den.

Kun personer begrenset til kanalgrupper kan ha en. Noen som ser hver kanal har en rolle, fordi "redaktør av labens kanaler" for en person uten begrensning ville være redaktør av alt som tilhører ingen gruppe, og av serveromfattende sider. En fasilitets administrator kan gi en rolle per gruppe bare i gruppene de administrerer, og aldri over sin egen rolle der.

17.3 Hvem kan ringe FHIR-endepunktet

FHIR-endepunktet (serve -fhir) sjekker en av to typer token:

begrenses til FHIR-grupper. Dette er standard når ingen SMART-autorisasjonstjeneste er konfigurert.

bærer omfang og endpointet holder hver forespørsel til dem.

Med SMART konfigurert, aksepteres bare SMART-nøkler, så hver kaller holdes til sine omfang. En API-nøkkel har en rolle og ingen omfang: en viser-nøkkel kan lese hver pasients journal. En forsikrer som aktiverte SMART for å begrense hver app til hva den var gitt, bør ikke ha en måte inn som ikke er begrenset.

Noen steder trenger både alt det samme - en intern kravstrøm som inneholder en API-nøkkel og ikke har en SMART-klient, i tillegg til medlemsapper som logger inn via SMART. For disse, lar Innstillinger → FHIR → Aksepter Perfuse API-nøkler samt SMART-nøkler (-fhir-api-tokens ved oppstart) API-nøkler inn også. Den er av som standard, den trer i kraft på neste forespørsel i begge retninger, og endring av den skrives til revisjonsloggen. En nøkkel skilles fra hverandre av sin form: en SMART-nøkkel er en signert JWT, og en API-nøkkel er aldri det, så en sjekkes aldri som den andre. Der du kan, gi et slikt system en SMART Backend Services-klient i stedet, med bare de systemomfangene det trenger.

17.3.1 En FHIR-endepunkt åpen for fremmede

En offentlig testserver gir ut legitimasjoner som kan skrive, fordi testing av på forhånd autorisasjon eller abonnementer trenger skriving. To begrensninger forhindrer at en klient ødelegger det for alle, begge under Innstillinger → FHIR og begge av er deaktivert som standard:

Et sykehus eget endpoint trenger ikke dette.

17.4 Et sykehusets eget endepunkt trenger ingen av delene.

Med Innstillinger › Sikkerhet › AI-agenter (MCP) på (eller serve -mcp), betjener Perfuse Model Context Protocol på /mcp, så en AI-agent som Claude, ChatGPT eller en IDE-assistent kan spørre det hva som skjer. Den er av som standard, og å slå den av stopper hver agent på dens neste anrop.

En agent kobler seg til med en API-nøkkel fra Administrer › Brukere › Maskinlegitimasjoner som en bærertoken, aldri med en persons nettlesersesjon (det blir avvist, så en agent handler aldri med en persons full tilgang). En klientkonfigurasjon ser ut som:

{ "mcpServers": { "perfuse": { "type": "http", "url": "https://perfuse.example/mcp",
    "headers": { "Authorization": "Bearer <token>" } } } }
VerktøyRolleHva det gjør
server_status, list_channels, queue, alertsovervåkerOm ting fungerer, uten meldingsinnhold
get_channel, search_messages, get_message, find_patient, fhir_searchviserKanaler, meldinger (med innhold), en pasients meldinger på tvers av formater, et FHIR-søk
retry_delivery, reprocess_messageoperatør, og mcp:writeForsøk en køt levering på nytt, send en melding gjennom dens kanal igjen
start_channel, stop_channeladministrator, og mcp:writeStart eller stopp en kanal

Hvert verktøy besvares av samme rute eller FHIR-søk en persons skjerm bruker, kalt med agentens egen token, så tokenets rolle, kanalgrupper og leietaker bestemmer hva det ser, nøyaktig som de gjør i konsollen; og fhir_search får tokenets egen tilgang på FHIR-endepunktet (som kan avvise API-nøkler helt; se FHIR-delen ovenfor). En agent tilbys bare verktøyene dens token kan bruke. Lesing er standard: et verktøy som endrer noe, må også ha tokenets mcp:write-omfang ("La en AI-agent handle med det" når token utstedes), så en token utstedt for en rapporteringsagent kan ikke overtale til å handle ved en prompt. En overvåkingsokens svar har meldingsinnhold fjernet, uansett hva en rute returnerer.

Hver enkelt kall er i Activity som mcp.tool med tokenets navn, verktøyet, dets argumenter og resultatet (ok, refused, invalid, rate-limited eller HTTP-status); mcp.connect registrerer hvilken klient som koblet til. Hver token kan gjøre 60 verktøykall per minutt (Verktøykall per minutt fra en token); over dette, besvares et kall med en feil som agenten kan lese, og ingenting gjøres. En forespørsel fra en nettleserside på en annen opprinnelse avvises, som MCP ber en server om å stoppe DNS-omkobling. Transporten er MCPs strømbare HTTP, besvart som JSON uten hendelsesstrøm; protokollversjoner 2025-06-18, 2025-03-26 og 2024-11-05 er akseptert. Meldinger og FHIR-ressurser inneholder pasientdata: et agents svar går til den modellen det kjører på, så gi en token til et agent bare der den modellen er tillatt å se dem, og gi den den laveste rollen som gjør jobben.

17.5 En demonstrasjonskonto

serve -demo-account demo:PASSWORD oppretter en delt konto for en offentlig demonstrasjonsserver, og innloggingsiden viser brukernavnet og passordet med en knapp som logger inn med dem. Kontoen er en viser, så den kan se på alt og endre ingenting. I motsetning til enhver annen viser kan den også åpne administrator-skjermene (brukere, maskintokene, innstillinger, datavern, flåtens likeverdige), skrivebeskyttet: en demonstrasjon vurderes av skjermene. Den leser dem som en viser leser kanaler, med hver legitimasjon vist som satt eller ikke, aldri verdien, og hver endring avvist. Den kan også trykke på kontrollene som ikke endrer noe og når ingenting utenfor serveren: et skripts kontroll, og kanalredigeringsverktoyets valider og pars. Den kan ikke endre passordet eller legge til en passnøkkel, fordi den første besøkeren som gjør noen av delene ville låse ute alle etter dem. Hver start setter den tilbake som viser med det publiserte passordet. Passordet må være minst 12 tegn, som ethvert annet. Bruk det bare på en server som inneholder testdata: enhver som leser innloggingsiden kan lese hver melding på serveren.

17.6 Revisjon

Konfigurasjonsendringer, innlogginger og tilgang til meldingsinnhold registreres med hvem, hva og når.

Revisjonsloggen er i samme database som meldingene. Det er praktisk og det er en begrensning: noen som kan modifisere databasen, kan modifisere revisjonsloggen. Hvis dine krav inkluderer åpenbar revisjon, må loggen sendes til et sted som bare kan legges til, og Perfuses egen loggutgang er måten å gjøre det på.

17.7 Hemmeligheter i konfigurasjon

Passord, passkoder og nøkler vises i kanal-konfigurasjon, som betyr at de er i YAML-filene.

To konsekvenser. Filene må ha filsystemrettigheter som reflekterer hva de inneholder, og hvis de er i versjonskontroll — som ellers anbefales — inneholder laget legitimasjoner og må behandles deretter.

Hvor en verdi er en hemmelighet, viser grensesnittet den som en hemmelighet og API-et returnerer den ikke når den er lagret. Dette beskytter den mot å bli lest over noen sin skulder eller lekket i et skjermbilde. Det beskytter ikke filen.

17.8 Hva som er i databasen

Meldingslagret inneholder meldinger som mottatt, som for en klinisk strøm betyr pasientidentifiserbare data. Det bør være på kryptert lagring, sikkerhetskopiert som kliniske data med den oppbevaringstiden det innebærer, og tilgangskontrollert på filsystemnivå samt gjennom Perfuses egne roller.

cleanup.periodDays begrenser hvor lenge det beholdes. Se meldingsarkivet for spenningen mellom det og å ha nok historikk for rytmebevisst varsling.

17.9 Dataproteksjon (GDPR og UK GDPR)

Skjermen Databeskyttelse (Administrer, bare administratorer) besvarer en persons forespørsler under GDPR og UK GDPR. Den avgjør ingenting på vegne av kontrolleren: om en forespørsel må innvilges, og om en unntak gjelder, er kontrollerens avgjørelse, som blir registrert med forespørselen.

Hva som er lagret. En person identifiseres ved hjelp av identifikatorer: system|value (et NHS-nummer, et MRN med sin utstedende myndighet) eller et nummer på egen hånd. Med en pasientindeks utvides disse til hvert nummer på hver post som er koblet til samme person, så en forespørsel som nevner ett sykehusnummer finner postene som er arkivert under de andre. Se hva som er lagret søker deretter i hver butikk som lagrer pasientdata:

LagreFunnet av
Meldingeridentitetsindeksen (Innstillinger → Data → Indeks pasientidentifikatorer); uten det, kan meldinger ikke finnes ved identifikator
Leveringskøenles hver enkelt meldings identifikatorer
FHIR-lagretPasientressursene som bærer en identifikator, og hver ressurs hvis indekserte referanser peker på en
Forespørsler om forhåndsgodkjenningidentifikatorene til forespørselens pasient
Pasientindeksenidentifikatoren, eller EUID

Hva den ikke kan nå, sier den: spor sendt til en samler (-trace-endpoint), revisjonsloggen (den er beholdt: den er rekorden av hvem gjorde hva, denne forespørselen inkludert), og sikkerhetskopier.

Forespørsler. En forespørsel registreres med sin type (tilgang, artikkel 15; overførbarhet, artikkel 20; sletting, artikkel 17; begrensning, artikkel 18), hvem den er fra som kontrollerens poster refererer til dem, identifikatorene og en notat (hvordan identiteten ble bekreftet, en utvidelse og dens grunn). Den er forfalt en måned etter mottak (artikkel 12(3)); en forfalt forespørsel vises i rødt.

En lukket forespørsel beholder bare de siste tegnene av personens nummer: den forblir som en rekord av et svar uten å være en kopi av dem. Hvert steg er i revisjonsloggen med numrene maskert.

Rettslige hold. Et hold navngir en person med identifikatorer, med en årsak og et valgfritt sluttdato. Mens det er i kraft, avvises en sletting fullstendig, og meldingslagringsvinduet for personens meldinger (rekorder og tekst) unntas inntil holdet løftes.

Sikkerhetskopier og slettingslogg. En sikkerhetskopi laget før en sletting inneholder fortsatt det som ble slettet inntil den utløper. Hver sletting skrives til en logg: når, av hvem, godkjent av hvem, hvor mye ble fjernet fra hver lagring, og personens identifikatorer som saltede SHA-256-hashes i stedet for i klartekst. Etter å ha gjenopprettet en sikkerhetskopi, hasher Bruk slettinger på nytt identifikatorene lagret i hver post med salt og sletter hver person loggen navngir. Korte numre kan finnes fra deres hasjer ved å prøve hver verdi, så loggen er selv personlige data og lagres med databaseens egen beskyttelse.

Oppbevaring. Skjermen lister hvor lenge hver type rekord oppbevares her og hva som endrer det: meldingsrekorder og tekst etter deres oppbevaringsvinduer, køen inntil den er levert eller fjernet, FHIR-lagringsplassen, tidligere autoriseringsforespørsler og pasientindekset inntil det slettes (kliniske rekorder slettes ikke på en fast plan), revisjonsloggen oppbevares.

Behandlingsrekord (Artikkel 30). Behandlingsrekord laster ned, som Markdown eller CSV, hva denne serveren vet om det: kontrolleren, personvernombudet og hvor dataene lagres (Innstillinger → Data → Personvern), oppbevaringstiden for hver type rekord, og en behandlingsaktivitet per kanal med hva den mottar, fra hvor, til hvilke destinasjoner, og vertene den sender til. Formålene, lovlige grunnlag og kategorier av datasubjekt er igjen for kontrolleren å fylle ut, og si det. En CSV-celle som begynner med =, +, - eller @ skrives med en ledende apostrof, så et regneark ikke kjører det.

Hvor dataene lagres. Hvor dataene lagres (Innstillinger → Data → Personvern) angir, i ord en regulator kan sjekke, hvor serveren, dens database og dens sikkerhetskopier kjører; personvernsskjermen og rekorden viser det. En utkast til personvernavtale for organisasjoner BioDream er vert for, er i docs/legal/dpa-template.md; det er et utkast for en advokat, ikke juridisk råd.

API-et er /api/privacy (oppsummering), /api/privacy/find, /api/privacy/requests (og /{id}/approve, /{id}/export, /{id}/erase, /{id}/close), /api/privacy/holds, /api/privacy/reapply og /api/privacy/register.

17.10 Leietakere

En leier er en isoleringsgrense: kanaler, meldinger, brukere og innstillinger tilhører en, og ingenting krysser.

Dette eksisterer for en tjenesteleverandør som kjører feeds for flere praksiser. Ikke bruk det til å skille avdelinger innen én organisasjon som trenger å se hverandres trafikk: isolasjonen er reell, og det finnes ingen tverr-tenant-visning. For det, bruk kanalgrupper (ovenfor), som deler menneskene i én organisasjon mens en sentral team kan se alt.

17.10.1 Grenser

En plattformoperatør setter hver leierens grenser i Tenants, slik at en kunde ikke kan fortrenge resten av en delt server. La en grense stå tom for ingen.

Ingen av dem mister en melding. Over raten eller lagringsgrensen, avvises en mottatt melding på samme måte som en opptatt mottaker avviser en, før noe lagres eller leveres: MLLP får ingen bekreftelse (ikke en avvisning, som noen sendere tar som "ikke send på nytt"), HTTP får 429 med Retry-After, SOAP får 503, DICOM får en retrybar status, og en kø, bucket eller fil forblir der den var. Senderen sender på nytt, som hver grensesnittsmotor og EHR gjør. Ingen allerede lagrede data slettes for å gjøre plass. En økt grense treffer i kraft innen en minutt, og hver endring av grenser er registrert i aktivitetloggen.

17.11 Testdata

De genererte meldingene beskrevet i testing eksisterer delvis som en personvernkontroll. Å gjenskape et problem andre steder, sende et eksempel til en leverandør eller fylle en testmiljø er alle ting som ellers gjøres med ekte meldinger.

Generatorens utdata inneholder ingen pasientdata ved konstruksjon heller enn ved redigering. Foretræk det fremfor håndstripede ekte meldinger, som er en prosess som kan gjøres ufullstendig og vanligvis er.

17.12 Enkelt innlogging

Tre mekanismer, og lokale kontoer sammen med alle disse.

OpenID Connect (-oidc), en katalog over LDAP (-ldap), og SAML 2.0 (-saml). Hver er konfigurert fra Administrer → Innlogging og skrevet til filen flaggenavnet, så skjermen og filen er to visninger av ett og samme heller enn to steder å holde i skritt.

Lokale kontoer er alltid tilgjengelige og kan ikke deaktiveres. Det er med vilje: en lokal integrasjonsmotor hvis eneste måte å komme inn er en identitetsleverandør, blir utilgjengelig nettopp når identitetsleverandøren er utilgjengelig, og en klinisk grensesnitt er ikke et godt sted å lære det. Innloggings-skjermen forteller deg hvor mange lokale administratorer eksisterer før den oppmuntrer deg til å avhenge av noe annet.

17.12.1 Hva en gruppetilordning bestemmer

Alle tre kartlegger grupper fra katalogen til Perfuse-roller, og noen i grupper som matcher mer enn én får den mest privilegerte. Det er den eneste trygge retningen å løse det — alternativet er en person som mister tilgang de har rett til fordi de også er i en mindre gruppe.

Noen av de seks rollene kan tildeles: overvåke, viser, operatør, redaktør, admin og plattform.

En gruppe kan også begrenses til noen kanalgrupper, i den andre boksen i raden (channel_groups i filen). Når noen gruppe navngir en, setter hver pålogging personens kanalgrupper fra gruppene som ga deres rolle: noen i en gruppe som redigerer laboratoriets kanaler og i en annen som viser hver kanal er en redaktør av laboratoriets kanaler og ingenting annet. Den sterkeste rollen er aldri koblet til den bredeste rekkevidden, fordi ingen gruppe gir det. En gruppe med en tom boks gir hver kanal. Mens ingen gruppe navngir noen, lar pålogging kanalgrupper være som en administrator har satt dem i Brukere.

Når hver gruppe en person matcher navngir kanalgrupper, får hver kanalgruppe den sterkeste rollen blant gruppene som navngir den: med Lab-Interfaces (redaktør, laboratorium) og Clinical-IT (viser, laboratorium og adt), redigerer personen laboratoriets kanaler og viser adgangene, som om den var satt for hånd. Når en av deres grupper gir hver kanal, finnes det ingen liste å holde en rolle per gruppe, og regelen ovenfor gjelder.

roles:
  editor: [Lab-Interfaces]
  operator: [Night-Desk]
  viewer: [Clinical-IT]
  channel_groups:
    Lab-Interfaces: [lab, pathology]
    Night-Desk: [adt]

Det er OpenID Connect- og SAML-filen. Katalogens fil kartlegger hver gruppe til en rolle (roles: {Lab-Interfaces: editor}), og channel_groups sitter ved siden av roles der.

En mapping som ikke gir noen noen ting, blir avvist i stedet for å bli lagret. En konfigurasjon som autentiserer personer og nekter alle, ser ut som et ødelagt produkt fra utsiden: den runde turen fullføres og alle blir nektet uten at noen forklaring.

Opprettelse av konto ved første pålogging er avslått som standard. Med den avslått, må noen eksistere i Perfuse før de kan logge inn, så katalogen bestemmer hvem de er og Perfuse bestemmer hvem som er tillatt inn.

17.12.2 SAML, spesifikt

Delene som er verdt å vite før du konfigurerer det:

17.12.3 Hva hver leverandør sender

Gruppeattributtet er der pålogginger går galt, og de tre vanlige leverandørene navngir det forskjellig.

LeverandørVanligvis senderNotater
KeycloakgroupsTrenger en gruppe-medlemskaps-mapper lagt til i klienten.
Entra IDet krav-URI som ender /claims/groupsSender gruppe-objekt-id hvis ikke applikasjonen er konfigurert til å sende navn. Mappe id-ene eller endre leverandøren.
Oktahva som helst applikasjonen var konfigurert medVanligvis groups, med et filter som bestemmer hvilke som sendes.
ADFSet krav-URISignerer Responsen i stedet for Påstand, som Perfuse aksepterer.

En krav-URI kan angis ved sin endelige segment: å skrive groups finner http://schemas.microsoft.com/ws/2008/06/identity/claims/groups. Et navn som bare ender med ordet, matcher ikke — excluded_groups er ikke groups.

Gruppe-medlemskap som ankommer som en komma-separert verdi, behandles som ett enkelt gruppenavn og matcher ingenting. Dette er den riktige lesningen av standarden, og å splitte på komma ville bety at en gruppe som legitimt inneholder en, blir stille til to. Hvis dette er hva din leverandør sender, endre det der.

Test på påloggings-skjermen sjekker alt som kan sjekkes uten en person: innstillingene, sertifikatet og om en pålogging-forespørsel kan bygges. Den sier åpenbart at den ikke kan bevise at noen kan logge inn, fordi det trenger en ekte påstand om en ekte person og den eneste måten å få en påstand på, er å la dem prøve.

17.13 Kontoer som er etablert av identitetsleverandøren: SCIM

Med -scim (Innstillinger → Pålogging → Automatiske kontoer), oppretter en identitetsleverandør som Okta, Microsoft Entra ID eller Google Workspace Perfuse-kontoer selv på /scim/v2/Users, så en person som forlater organisasjonen mister tilgang når deres katalogkonto er deaktivert, ikke når noen husker. Leverandøren autentiserer med en API-nøkkel som inneholder admin-rollen, laget under Brukere → Maskin-kredensialer, sendt som en bærertoken.

aldri informert om at en konto er deaktivert når den ikke er det, fordi en tjenesteleverandør ikke gjentar hva den ble fortalt var vellykket.

en fjernet konto beholdes.

*viewer* (eller *read-only*) eller *monitor* gir denne rollen, så APP-Perfuse-Editor og Perfuse Operators fungerer som de er navngitt. Alt annet får -scim-default-role, viser med mindre det er satt til noe annet. Plattform kan aldri tildeles på denne måten.

ville overleve en deaktivering der.

resultater. Bulk-operasjoner, sortering og ETags støttes ikke.

17.14 Hva Perfuse ikke gjør

Det krypterer ikke databasen i ro. Bruk kryptering av filsystem eller volum.

Det håndterer ikke sine egne sertifikater eller fornyer dem. Peke på filer og håndtere disse filene med hva du allerede bruker.

SAML er verifisert mot to uavhengige leverandører, hver med en ekte nettleser-innlogging, en ekte påstand og en ekte sesjon: Keycloak 26 og Microsoft Entra. To saker betyr mer enn dobbelt så mye som en, fordi de to er uenige på en måte som viste seg å være bærende — Keycloak skriver sin påstand med navneromsprefikser og Entra skriver de samme elementene uten dem, og den ene feilen dette området har hatt var i prefikshåndtering.

Start med å lese leverandørens metadata. Innstillinger, deretter Innlogging, deretter SAML-fanen: gi metadata-URL eller lim inn dokumentet, og innloggingsadressen og signatursertifikatet fylles ut for deg. Hver SAML-leverandør publiserer en av disse — Okta, Entra, AWS IAM Identity Center, Keycloak, ADFS — og det er forskjellen på å konfigurere en leverandør og å transkribere en. Å gjøre det manuelt innebærer å finne sertifikatet inne i XML, fjerne linjeskiftene fra base64 og pakke det inn i PEM-overskrifter, der ett enkelt feilplassert mellomrom produserer en signaturfeil som ikke sier noe om formatering.

Hva som kommer tilbake, beskrives heller enn dumpes: hver sertifikats emne, utløpsdato og SHA-256-fingeravtrykk, så du kan sjekke det mot hva leverandørens egen konsoll viser. Et utløpt sertifikat kalles utløpt heller enn å bli latt som en dato å sammenligne med øye. Ingen blir lagret ved å lese — å bruke det på skjemaet er et separat klikk, fordi et dokument noen limte inn ikke er en beslutning om hva som skal tillites.

En metadata-URL hentes over https bare, og adressen sjekkes mot samme politikk som styrer kanaldestinasjoner, så dette kan ikke brukes til å få serveren til å lese skyinstans-credensialer. Omdirigeringer følges ikke, fordi en tillatt adresse som omdirigerer til en blokkert en ville gå rett forbi denne sjekken.

Hvis du konfigurerer Entra, vil fem ting ikke matche hva eksemplene viser deg. Det sender ingen e-post-krav overhode. Dets NameID er en uigennomsiktig identifikator heller enn en adresse. Det sender ingen grupper-krav med mindre applikasjonen er eksplisitt konfigurert til å emitte en, så en rolle-mapping skrevet mot grupper nekter hver innlogging. Når grupper emitieres, er de objekt-GUID-er heller enn navn, med mindre din leier synkroniserer fra lokale Active Directory. Og dens kravnavn bor under schemas.microsoft.com/identity hvor de fleste dokumenter viser schemas.xmlsoap.org. Perfuse håndterer alle fem; de er listet fordi de fire første ellers vil se ut som feil i Perfuse når de er Entra som er Entra.

Denne distinksjonen er ikke teoretisk her. Den første ekte Keycloak-påstanden feilet fullstendig, fordi den kanoniske formen signaturen dekker ble beregnet med navneromsprefikser droppet. Ingen ekte identitetsleverandør kunne ha logget noen inn, og pakkenes egne fem kanoniserings-tester passerte gjennom hele — hver av dem signert og verifisert med samme kode, så de beviste bare at det var enig med seg selv. Hvis du er den første til å peke en annen leverandør mot dette, forvent å finne noe, og serverloggen vil navngi stadiet som feilet.

18 Operasjoner

18.1 Distribusjon

En binær og to stier: en mappe med kanal-filer og en databasefil. Det er ingen applikasjonsserver, ingen separat web-tverr og ingen meldingsformidler påkrevd.

perfuse serve -channels ./channels -db ./perfuse.db -addr 0.0.0.0:8443 \
  -tls-cert ./cert.pem -tls-key ./key.pem

Kjør det under hva som overvåker tjenester på verten — systemd, launchd, en container-runtime. Det forventer å bli restartet hvis det avslutter.

18.2 Hvor data kan gå (data-residens)

serve -residency (Innstillinger → Data → Hvor data kan gå) navngir skyregionene som denne serverens data kan sendes til eller leses fra: områder (eea, uk, ch) og region koder (eu-central-1, uksouth, europe-west2), komma-separert. eea er AWS-, Azure- og Google Cloud-regionene i Den europeiske økonomiske sone (Frankfurt, Irland, Paris, Stockholm, Milano, Spania; Nederland, Tyskland, Frankrike, Sverige, Norge, Italia, Polen, Spania; Belgia, Nederland, Tyskland, Italia, Frankrike, Finland, Spania, Polen), uk de i Storbritannia, ch de i Sveits.

Med det satt, nektes en kanal, når den lagres og når den lastes, hvis en konnektor navngir en region utenfor listen: en S3-, SQS- eller SNS-kilde eller destinasjons region (eller dens endpoint, når det er en AWS-hostnavn), eller enhver destinasjon hvis adresse er en AWS-hostnavn som bærer en region (sqs.us-east-1.amazonaws.com, en API Gateway-URL). Serveren nekter å starte med en spor-samler eller varsling-webhook i en annen region. En konnektor pekt på en vert som ikke navngir noen region (et sykehus eget system, MinIO på nettverket) dømmes ikke: posten om behandling på Data-skyttskjermbildet lister hver vert hver kanal sender til, for kontrolleren til å sjekke. Dashbordet og Data-skyttskjermbildet sier hvor data kan gå.

Vert i EU og Storbritannia. deploy/hosted inneholder OpenTofu (eller Terraform) for en vertserver per organisasjon i Frankfurt, Irland eller London: serveren, dens PostgreSQL-database og sikkerhetskopier, en sikkerhetskopibucket, logger og støttesessionsopptak, alt kryptert med en nøkkel i regionen, ingen replikeres til en annen region, støtte gjennom Session Manager bare, og Perfuse kjørt med -residency. Denne README-en sier hva den bygger, hva den ikke dekker, hva som er verifisert (valider, og planlagt mot en ekte konto; ikke ennå aplikert) og hva det koster til listepris i hver region.

18.3 Konfigurasjon som filer

Kanaler er filer, noe som betyr at de kan være i versjonskontroll, gjennomgås før distribusjon og sammenlignes etter en hendelse.

Filer leses på nytt uten omstart. En fil som ikke parseres rapporteres og den tidligere lastede versjonen fortsetter å kjøre, så en syntaksfeil kan ikke ta en fungerende strøm av luften.

En kanal redigert i nettgrensesnittet skrives tilbake til sin fil. Hvis disse filene er i versjonskontroll, forvent commits fra konfigurasjonsendringer gjort gjennom grensesnittet, og rediger ikke en fil mens noen andre har den åpen i byggeren.

18.4 Sikkerhetskopiering

To ting å sikkerhetskopiere, og de har forskjellige egenskaper.

Kanalmappen er liten, endrer sjelden og er det du trenger for å gjenoppbygge tjenesten. Sikkerhetskopier den som konfigurasjon; versjonskontroll er vanligvis tilstrekkelig.

Databasen inneholder meldinger, brukere og revisjonslogg. Den er stor, endrer konstant og inneholder kliniske data — så den må sikkerhetskopieres som kliniske data, med den retensjon og kryptering det innebærer. Å miste den stopper ikke tjenesten, men den mister evnen til å undersøke noe som allerede har skjedd og historikken som rytme-læreren er avhengig av.

18.5 Omstartsvaner

Ved omstart, lastes kanaler og kilder begynner å lytte. Køede leveranser gjenopptas.

Det viktige å forstå er hva som skjer med arbeid i gjennomføring. Under standard on_delivery bekreftelse, blir et melding som ikke har blitt bekreftet enda, ikke bekreftet, så avsenderen vil sende det igjen — som er det riktige resultatet. Under on_receipt, er et melding som ble bekreftet, men ikke levert enda, i køen, og fortsetter; hvis køen er deaktivert, går det tapt. Se meldingsflyt.

18.6 Oppgradering

Erstatt binærfilen og restart. Databasens skjema migreres fremover automatisk ved start.

Migrasjoner er bare fremover. Det finnes ingen nedgradering, så en tilbakeføring til en tidligere binærfil etter at skjemaet har flyttet, trenger den tidligere databasen. Ta en kopi før oppgradering — dette er den eneste operative forsiktighetsforanstaltningen som er verdt å være disiplinert om.

18.7 Overvåking

Varsling fra innen Perfuse er dekket i varsling og er hva som vil fortelle deg at en feed har stoppet.

Utenfra, overvåk prosessen, disken databasen er på, og om nettgrensesnittet svarer. Databasen vokser og en full disk stopper meldingsopptak, som er en feilmodus uten noen annen advarsel.

18.7.1 SNMP

For overvåkingsverktøy som snakker SNMP (Nagios, Zabbix, PRTG, SolarWinds, LibreNMS), kjører Perfuse en skrivebeskyttet SNMPv2c-agent og sender en felle når en varsling utløses eller løses. Sett den under Innstillinger → Overvåking → SNMP, eller med flagg:

perfuse serve -snmp-listen :161 -snmp-community 'long-random-community' -snmp-allow 10.0.5.0/24 \
  -snmp-traps nms.example.org,10.0.5.9:1162

klartekst, så det er aldri åpent for alle. Et samfunn under 6 tegn, eller public/private, stopper serveren ved oppstart.

BASE.1 (kanaler, kjører, ødelagte, mottatt, levert, feilet, køet) og en kanaltabell under BASE.2.1 (navn, kjører eller stoppet, mottatt, levert, feilet, køet, alderen til den eldste køede meldingen). Tallene er de samme som dashboarden og /metrics viser.

alvorlighetsgrad, kanal, destinasjon og sammenfatting. Aldri meldingsinnhold. En anerkjent varsling sender ingen felle.

bedriftsnummer. Last ned MIB på innstillingsiden (eller GET /api/snmp/mib) gir en MIB for basisen i bruk; det samme panelet sier om agenten svarer og hvor mange feller som har gått.

18.7.2 En oversikt over hver grensesnitt

-inventory interfaces.md (Innstillinger → Overvåking → Oversikt) skriver en Markdown-dokument som listar hver kanal - dens format, om den kjører, hva den mottar fra og hva den sender til - etterfulgt av hver kanals egen beskrivelse, og skriver den om hver -inventory-every (en dag som standard). Den er ment å committes ved siden av kanal-filene, eller overleveres til en revisor, og leses uten at applikasjonen kjører.

18.8 Kapasitet

Perfuses gjennomstrømnings tak har ikke blitt målt på ekte maskinvare under ekte trafikk, og denne håndboken vil ikke skrive ut et tall det ikke kan støtte.

Hva som kan sies: arkitekturen er én gorutine per tilkobling med per-destinasjonskøer, så gjennomstrømning skalerer med destinasjoner heller enn å bli serialisert gjennom én arbeider; meldingsopptak er en SQLite-skriving per melding, som gjør disken til den mest sannsynlige første begrensningen; og meldingslagret vokser lineært med trafikken, så retensjon er innstillingen som styrer langtids disken.

Hvis du størrelsesbestemmer dette for en stor strøm, måler du det med din egen trafikk ved hjelp av det genererte testkorpuset beskrevet i testing. Det er det ærlige svaret, og det er også et bedre svar enn et tall fra noen andres maskinvare.

18.9 Hvor denne installasjonen ble stående

Aktivitet bærer et panel, synlig for administratorer, som viser hva Perfuse har nektet å gjøre — gruppert etter melding, mest hyppig først — og hvor langt installasjonen har kommet mot en fungerende kanal.

Det eksisterer fordi hver annen påstand om hvorvidt denne programvaren er lett å bruke, kommer fra de som skrev den. En nektelse gjør ikke det: noen ønsket noe, serveren sa nei, og ingen av partene gjetting.

Trakten navngir steg som ikke har skjedd ennå, i stedet for å la tidsstempeler sammenlignes. Tilstanden som er verdt å se på er meldinger ankommer og ingen har blitt levert til en destinasjon — en kanal kan ta trafikk i uker og levere ingen av dem, og fra hver annen skjerm ser det ut som om det fungerer.

Ingenting noen skrev inn blir registrert. Tabellen inneholder forespørselsruten med identifikatorer erstattet med {id}, status og serverens egen setning. En valideringsmelding navngir et felt og en regel, som er den nyttige delen; verdien som brøt regelen er ofte pasientdata, og en tabell over disse ville være en større risiko enn friksjonen den målte.

To bevisste eksklusjoner. En 5xx er en feil i denne programvaren og blir allerede logget som en — å blande de to ville begrave tilfellene hvor noen ikke kunne finne ut hva de skulle skrive under tilfellene hvor ingenting de skrev ville ha hjulpet. Og en utløpt sesjon produserer en rekke 401-er som ikke sier noe om brukervennlighet og ville drukne hver funn som gjør.

Å lese rapporten trimmer også tabellen til de fem siste tusen radene. Nektelser er 4xx-responser, så den vokser sakte, og lesing er et naturlig øyeblikk å rydde opp: ingen timer og ingenting som kjører når ingen ser på.

GET /api/friction returnerer det samme for noen som heller vil lese det som JSON.

18.10 Logger

Perfuse logger til standardutgang, som er der en overordnet eller containerkjøretid vil samle det inn.

Meldingsnivådetaljer går til meldingslagret i stedet for loggen, med vilje. En logglinne per melding på en travel strøm er støy som skjuler linjene som teller, og lagret er søkbart på måter en loggfil ikke er.

Loggen inneholder det lagret ikke kan: oppstart og nedtagningslogg, konfigurasjonslastresultater, kanaltilstandsforandringer og feil som ikke kan tilskrives en bestemt melding.

18.11 Kjøring av to instanser

To eller flere servere kan kjøre som én klaster: når den som kjører en feed stopper, tar en annen over innen få sekunder, og avsenderens neste forsøk når den. De deler én PostgreSQL-database i stedet for at hver beholder en SQLite-fil, og enes mellom seg, gjennom den, om hvem som kjører hva.

perfuse serve -db 'postgres://perfuse:SECRET@db.hospital.internal/perfuse?sslmode=verify-full' \
  -cluster active-passive -node-name perfuse-01 -node-address https://perfuse-01.hospital.internal:8443 \
  -data /var/lib/perfuse

Start hver server på samme måte med sitt eget navn og adresse. Databasekontoen trenger å opprette tabeller og, en gang, citext-utvidelsen (eller en administrator kjører CREATE EXTENSION citext først). Hver server beholder sine egne filer i -data: sin logg, sin node-id og sine kopier av konfigurasjonen.

To måter å dele arbeidet på.

Det enkleste å forstå, og hva et sted med én travel server og en reserve ønsker.

til de andre; en som slutter seg til tar sin andel når kanaler blir ledige, én om gangen. Kanaler som ruter til hverandre (en kanaldestinasjon) kjører på én server og flytter sammen, fordi ruting skjer innenfor en server. En administrator kan flytte en kanal manuelt fra Overvåk → Flåte; den blir der den ble plassert så lenge serveren lever.

Hvem kjører hva, og ingen øyeblikk med to. Hver arbeidsenhet er en leie i database, fornyet hver femte del av -cluster-lease (15 s som standard). En server som ikke kan fornye den (den krasjet, dens nettverk feilet, database er utilgjengelig) stopper arbeidet selv én gang dens egen klokke sier leien er nesten ferdig, med en tredel av leien igjen. En annen server tar leien bare etter at dens egen klokke har sett leiens teller stå stille i en hel leie. Ingen klokke sammenlignes med en annen, så serverne og databaseklokke trenger ikke være enige; de trenger bare å kjøre i omtrent samme takt, som hver klokke gjør. Mellom den gamle innehaveren som stopper og den nye som starter er det et kort gap med ingen som lytter, som en avsender ser som en avvist tilkobling og prøver igjen; det er aldri et øyeblikk med to som lytter på én feed eller to arbeidere som tømmer én kø.

En server som lukker seg ned renlig, eller en administrator som velger Tilbake på lederen, overfører umiddelbart i stedet for etter leien.

Hva hver server deler. Meldinger, leveringskøen, kontoer og sesjoner, revisjonsloggen, FHIR-lagret, terminologitabellene og pasientregisteret er i databasen, så uansett hvilken server som kjører en kanal, finner den køen den siste forlot. Kanalfilene, innstillingsfilen, varslingsreglene, enkeltinnloggingsfilene, logoen, Direct-sertifikater og lagrede visninger beholdes like på hver server gjennom databasen: hver beholder sin egen kopi på sin egen disk, en endring på noen server (i konsollen, manuelt, ved en git pull) når de andre innen to sekunder, og en kanal endret på en annen server starter på nytt med sin nye fil. Samme fil endret på to servere samtidig beholder versjonen som nådde databasen først, og den andre ved siden av som NAME.conflict-SERVER. Innstillinger som bare gjelder ved omstart (meldingsdatabasen, portene konsollen lytter på) gjøres av hver server ved neste omstart, og loggen sier det. Navn på noe på én maskin som bare er på den serverens kommandolinje og utenfor den delte filen: sertifikatet og nøkkelen (-tls-cert, -tls-key), SNMP-lytteradressen og serverens navn i spor.

Start og stopp. Å starte eller stoppe en kanal på noen server gjelder for clusteret: serveren som kjører den starter eller stopper den innen én sekund, og svaret sier hvilken server det er.

Lastbalanseren foran. En feeds adresse må nå hvilken server som kjører den. Peke senderen mot en virtuell adresse (en lastbalanser, en flytende IP, et DNS-navn med en kort TTL) og la lastbalanseren sjekke /readyz?channel=NAME, som bare svarer 200 på serveren som kjører den kanalen, og 503 på de andre. For konsollen er /readyz 200 på hver live-server; /readyz?role=leader bare på lederen.

På en AWS Network Load Balancer, bruk en målgruppe per feed med en HTTPS-helsekontroll på /readyz?channel=NAME, et 5-sekunders intervall og en terskel på 2, og slå cross-zone lastbalansering på. Med den av, ser lastbalanserens node i en sone hvor ingen server kjører feeden bare usunne mål, sender til alle likevel, og en sender som ble resolved til den noden venter til feeden kommer tilbake til sin sone (95 sekunder i en test). Sett avregistreringsforsinkelsen til 0, siden en server som stopper å kjøre en feed ikke har noe å drene.

Hva som ble testet. To servere på PostgreSQL 16, en sender som strømmet 300 meldinger, sendte på nytt til svaret kom, og serveren som kjørte feeden ble drept med SIGKILL to ganger (først, så den andre etter den første kom tilbake). Hver bekreftet melding nådde mottakeren, i begge former prøvd: levert før bekreftelsen, og køet i den delte butikken mens mottakeren nektet (185 bekreftede meldinger ventet i køen ved dreping; overlevende leverte alle). Failover tok 3 til 4 sekunder på en 3-sekunders leie. En duplikat er mulig og ble sett én gang på 600: en melding den døende serveren leverte og ikke kunne bekrefte, som senderen sendte på nytt. Koordinatorens egne tester dekker en krasj, en server kuttes fra fra databasen mens den kjører på, step-down, spredning, flyttinger og delt konfigurasjon med konflikter. De kjøres i CI mot PostgreSQL med raske-detektor, med hele suiten.

Det samme ble så gjort på AWS: to Linux-servere (ARM) og en Windows Server 2022 i tre tilgjengelighetssoner, Amazon RDS PostgreSQL 16 over TLS med sertifikatet kontrollert (sslmode=verify-full), en intern Network Load Balancer foran, og sendere som sendte på nytt til svaret kom:

TestMeldingerBekreftet men taptDuplikaterLengst en sender ventet
Aktiv-pasiv, serveren som kjørte feeden drept to ganger (Linux, så Windows), mottaker nektet i mellom2 0000015 s
En Linux-leder kuttes fra databasen (brannmur), prosessen ble liggende3 0000116 s
En Windows-leder kuttes fra databasen3 0000020 s
Lederen drept mens en servers klokke gikk 2 minutter foran og en annens 90 sekunder bak2 0000018 s
Aktiv-aktiv, fire feeds over tre servere, en drept og brakt tilbake6 0000224 s

Med den standard 15-sekunders leieutløping, stoppet en server som var koblet fra databasen sin feed 10 sekunder etter sine siste fornyelse, og den neste serveren startet den 6 til 8 sekunder etter det: aldri begge på samme tid. De skjeve klokkeslettene endret ingenting, siden ingen klokke sammenlignes med en annen.

Ikke ennå. Et cluster tjener én organisasjon: -cluster med -multi-tenant er nektet. Lyttere flytter med sin kanal, så lastbalanseren er stedets å tilby.

En server på egen hånd fortsetter å fungere som den alltid har, på SQLite, uten noen cluster.

18.12 Mer enn en server

Et sted med to eksemplarer har et spørsmål ingen enkelt konsoll kan svare på: kjører alt? Mirth beregner for svaret. Dette er flåtevisningen.

Én eksemplar er nominert som stedet du ser. Den avhører de andre og viser hver kanal på hver server i én tabell, med en oppsummering over alle.

18.12.1 Legge til en peer

Innstillinger → Flåte, eller PUT /api/fleet/peers. En peer trenger et navn, en URL og en token utstedt av peeren selv.

Navnet er påkrevd og er ikke URLen, fordi en URL ikke er noe noen gjenkjenner klokken tre om natten.

Token må være opprettet på jevnbyrdige, under Brukere, og bør være viewer-omfattende. Å legge til en jevnbyrdig uten en er nektet, med disse instruksjonene, heller enn å bli akseptert og så feile stille på hver avhøring. Å lese en annen eksemplars helse er den minste privilegiet som finnes, og det er det eneste flåtevisningen trenger.

18.12.2 Kontroll av en peer, som er av

allow_control tillater å starte og stoppe jevnbyrdiges kanaler fra her. Den er av som standard, og hver bruk blir auditedert med navn.

De to privilegiene er bevisst separate. Å lese en annen servers helse er mindre; å stoppe dens kanaler under en transfusjon er ikke det, og det andre bør aldri ankomme stille festet til det første.

18.12.3 Hva rapporten sier

Hver server rapporterer det totale antallet kanaler, hvor mange som kjører, stoppet eller feilet, kødyp og alderen på den eldste ventende meldingen, hvor mange varslinger som utløses, og om den drener for nedstengning.

Sammenfattnings tellingene teller servere på tre måter: tilgjengelig, utilgjengelig og usikker. Den tredje dekker peers hvis helse ingen vet — ikke ennå avhørt, nektet token eller kjører en versjon som denne ikke kan lese. Den holdes adskilt fra utilgjengelig fordi "vi ekke kan si" ikke er "den er nede", og å kombinere de to sammen er hvordan en flåte-side begynner å lyve.

Av samme grunn har sammenfattningsrapporten kjentFra: hvor mange instanser kanal- og køfigurer faktisk ble lest fra. Tolv kanaler som kjører over en flåte betyr noe annet når to av fem servere ikke svarte, og totalen alene kan ikke si det.

En utilgjengelig peer sier hvorfor på en måte en operatør kan handle på. En nektet tilkobling rapporteres som verten er oppe med ingenting som lytter på den porten, som er et annet problem enn en vert som ikke svarer i det hele tatt.

18.12.4 Uravvik

Sammenfattningsrapporten rapporterer den største forskjellen mellom klokkeslettene på serverne i den. Verdt et eget tall: å korrelere en hendelse over to instanser hvis klokkeslett ikke er enige om fire minutter produserer en sekvens av hendelser som ikke skjedde.

18.12.5 Hva en peer lærer om deg

Tall og hastigheter. Rapporten en instans gir en annen inneholder ingen meldingsidentifikatorer, ingen kanal-nivådetalj og ingen pasientdata av noen art.

Det er det som forhindrer en flåte-oversikt fra å være en sentralisering av kliniske data: den aggregerte instansen lærer hvor mange kanaler som kjører og ingenting om hva som strømmet gjennom dem. Hvis du ønsker meldingene åpner du den serverens egen konsoll, hvor audit-loggen registrerer at du gjorde det.

18.12.6 En peer pekt på seg selv

Nektet. En instans som avhører sin egen adresse gjennom sin egen HTTP-stakk vises to ganger i sin egen flåte-oversikt og dobbeltteller hver kanal den har.

18.12.7 TLS på interne nettverk

insecure_skip_verify aksepterer en peers sertifikat uten å verifisere det. Den eksisterer fordi sykehus-infrastruktur kjører på private sertifikat-myndigheter, og å nekte å fungere i det hele tatt ville skyve folk over på vanlig HTTP, som er verre. Den er navngitt så den ikke kan forveksles med en god idé.

19 Kommandolinjen

Alt Perfuse gjør til et kjørende system er tilgjengelig fra webgrensesnittet, og det er bevisst: en funksjon som trenger en terminal behandles som en feil i stedet for en designvalg. Kommandoene her er for arbeidet som skjer *rundt* et kjørende system — før det eksisterer, mens du bestemmer om du skal stole på det, og når du trenger å overføre noe til noen andre.

Flere av dem berører ikke en server i det hele tatt. perfuse explain, perfuse profile, perfuse deident og perfuse translate leser filer og skriver filer, så de er nyttige på en bærbar datamaskin mot en eiendom som fortsatt kjører helt på noe annet.

Kjør noen kommando med -h for flagg. Dette kapitlet sier hva hver enkelt er *for*.

Flaggene som vises her er illustrative, ikke uttømmende. -h genereres fra koden og kan ikke bli forældet; en liste kopiert inn i prosa kan.

19.1 Kjører kanaler

19.1.1 perfuse serve

Kjører webgrensesnittet og API-et, og kjører som standard også kanalene. Dette er kommandoen en installasjon bruker.

Hver valgmulighet den tar, er listet i Serveralternativer, generert fra programmet. Den nekter å betjene vanlig HTTP til noe annet enn loopback med mindre du passerer -insecure. Dette er ikke konfigurerbar høflighet: klinisk trafikk og en sesjonskake over en ukryptert LAN-tilkobling er en rapporterbar hendelse, og flagget eksisterer så at å si ja er en beslutning noen har tatt, snarere enn en standard de har arvet. Se sikkerhet.

19.1.2 perfuse run

Kjører kanaler fra YAML uten webgrensesnitt og uten database. Nyttig i en container som skal gjøre akkurat én ting, og nyttig når du ønsker å se en kanals atferd uten at noe annet kjører.

19.1.3 perfuse check

Validerer kanaldefinisjoner og skriver ut hva de gjør, uten å kjøre dem. Den andre halvdelen er poenget: en kanal som lastes, er ikke nødvendigvis den kanalen du mente, og å lese en ren-engelsk sammenfatning av hva en fil vil gjøre, fanger en feil som validering ikke kan se.

Avslutter med en ikke-null verdi på en feil, så den hører hjemme i hva som helst sjekker konfigurasjonen din før den når en server. -quiet skriver ut ingenting ved suksess, for dette formålet.

-allow-metadata-egress tillater destinasjoner pekt på skyinstans-metadataadresser. Disse adressene inneholder maskinens egne legitimasjoner, så en kanal som kan overtale til å sende der, er en legitimasjonslekkasje; sjekken nekter dem med mindre du sier noe annet.

19.1.4 perfuse test

Kjører tester skrevet mot kanaldefinisjoner. En test sender en melding gjennom kanalenes faktiske filter, faktiske transformasjoner og faktiske skript, i den faktiske rekkefølgen, med bare nettverket erstattet — så hva som passerer her, er hva kanalen gjør.

Tester bor i *_test.yaml eller *.test.yaml ved siden av kanalene. Se testing.

19.2 Migrering fra en annen motor

Disse tre er de som skal kjøres først, før du bestemmer deg for noe. Se migrering.

19.2.1 perfuse explain

Lese Mirth, Open Integration Engine og BridgeLink-eksporter — en kanal, en kanalgruppe eller en hel serverbackup — og beskriver hva hver kanal gjør og hva som ville blokkere en migrering. Den endrer ingenting og trenger ingen Perfuse-installasjon, noe som gjør det til det billigste mulige første skrittet: peke det mot en eksport av din eiendom og lese hva som kommer tilbake.

-strict avslutter med en ikke-null verdi hvis noe er blokkert, så den kan kontrollere en pipeline. -json emitterer de samme funnene for en maskin.

19.2.2 perfuse translate

Konverterer Mirth, Open Integration Engine og BridgeLink-eksporter til Perfuse-kanalfiler: en kanal, en kanalgruppe, en kode-mal-eksport eller en hel serverbackup.

perfuse translate -o ./kanaler server-backup.xml

Kode-mal-biblioteker skrives til lib/ ved siden av kanalene, og hver kanal Mirth hadde en bibliotek aktivert for, inkluderer det. Se migrering.

Ingenting blir stille droppet. Hver del av en kanal er enten oversatt, båret over som et skript som kjører uendret, eller rapportert som trengende en menneskelig. Den tredje kategorien er den ærlige — en oversetter som produserte en ren-utseende fil for hver inndata, ville skjule de beslutningene du mest trenger å gjøre.

19.2.3 perfuse compare

Kjører samme trafikk gjennom to motorer og rapporterer hvor de er uenige, gruppert etter felt.

Dette er kommandoen som svarer på "hvorfor skal jeg stole på dette med pasientdata", og den svarer med bevis du har samlet inn, snarere enn et påstand gjort her. Det er det anbefalte siste steget før overgang, og det anbefalte første steget i enhver diskusjon om hvorvidt Perfuse er klar.

19.3 Forstå en feed

19.3.1 perfuse profil

Lese meldinger og rapportere hva som faktisk er i dem: hvilke felt alltid er fylt ut, hvilke aldri er, de faktiske verdiene for kodete felt, gjentakelses tellere og hvilke Z-segmenter som vises.

Verdier rapporteres bare for felt hvis verdier utgjør en liten kode sett, så en profil av ekte trafikk ikke blir en fil full av pasientdata.

Lagring av en profil og sammenligning mot den senere er hvordan du finner ut at en avsender har endret noe:

perfuse profil -lagre siste-måned.json korpus/ perfuse profil -mot siste-måned.json ny/

19.3.2 perfuse kontrakt

Omgjør utdata fra den tenkningen til noe som kan pålegges. En kontrakt sier hva en feed må se ut som, så den dagen den endres, blir du underrettet, snarere enn å finne ut uker senere fra en mottaker som kollapser — meldingene er fortsatt gyldige HL7 når et felt forsvinner, så ingenting annet legger merke til.

perfuse kontrakt fremme -o adt.kontrakt.yaml korpus/ perfuse kontrakt sjekk adt.kontrakt.yaml i-dag/

promote genererer en utgangspunkt, ikke et svar. Les den og slett mesteparten av den: hver linje registrerer om den ble målt eller bestemt, som er det som forteller deg hvilke linjer du skal beholde.

19.4 Produksjon av meldinger

19.4.1 perfuse generer

Produserer syntetiske HL7 v2-meldinger. Alt er oppfunnet — åpenbart fiktive navn, sekvensielle identifikatorer, oppdiktet adresser — så utdata er trygt å committe, sende og vedlegge til en billett.

Den kan sende rett til en kanal i stedet for å skrive en fil, som er den raskeste måten å bevise at en lytter fungerer:

perfuse generer -n 100 -send 127.0.0.1:6661

19.4.2 perfuse deidentifiser

Lese ekte meldinger og skrive en korpus som beholder deres struktur, deres koder og deres intervaller, og ingen av hva som identifiserer en pasient. Dette er forskjellen på å kunne sende noen en reprodusert og ikke.

Det er ikke samme verktøy som perfuse generate og forskjellen betyr noe. Genererte meldinger er oppfunnet og derfor trygge, men urealistiske; et de-identifisert korpus er *avledet fra virkelig trafikk*, så det reproduserer de underlige tingene som faktisk bryter grensesnitt.

To egenskaper verdt å forstå før du bruker det:

-keep-local-segments passerer Z-segmenter uendret og er usikkert. Z-segmenter er nettopp der steder legger navn, notater og fritekst, så å beholde dem ødelegger formålet med verktøyet. Det eksisterer fordi et strukturelt problem noen ganger er *i* et Z-segment, og da trenger du en korpus du ikke må dele.

19.5 Flytte meldinger for hånd

19.5.1 perfuse lytte

Aksepterer HL7 v2 over MLLP og bekrefter det. En mottaker som eksisterer så lenge du trenger det, for å bevise at en avsender kan nå denne maskinen overhodet.

19.5.2 perfuse send

Sender HL7 v2-meldinger over MLLP fra filer.

MLLP har ingen autentisering og ingen kryptering, hverken i Perfuse eller andre steder. Begge disse kommandoene er underlagt dette, og det samme gjelder hver MLLP-kilde og -destinasjon: tilgangen er begrenset på nettverksnivå eller den er ikke begrenset.

19.6 FHIR

19.6.1 perfuse fhir

Konverterer HL7 v2 til FHIR, validerer FHIR eller betjener det, avhengig av underkommandoen.

Valideringsunderkommandoen er nyttig på egen hånd: den vil fortelle deg om en ressurs noen sendte deg oppfyller US Core, som er profilen amerikanske regler er skrevet mot. Å kunne svare på det uten å adoptere en motor er poenget.

19.6.2 perfuse x12

Converts X12 (or other delimited EDI) to the XML Mirth Connect and Open Integration Engine write for it, and back: perfuse x12 xml FILE and perfuse x12 from-xml FILE, standard input when no file is given. The output is what OIE 4.6 writes, byte for byte, so it can be compared with what a Mirth server produced or fed to a system built against it. A channel does the same with x12.arrives_as: xml and a destination's x12_as: xml; see X12.

19.6.3 perfuse sof

Runs a SQL on FHIR ViewDefinition over FHIR files (the NDJSON of a bulk export, Bundles or JSON arrays; - for stdin) and writes the table: -view FILE (required), -format csv|ndjson|json|parquet (csv by default), -header=false, and -o FILE (required for Parquet). See SQL on FHIR views.

19.6.4 perfuse measure

Evaluere en kvalitetsmåling med FHIRPath-kriterier over FHIR-filer (NDJSON fra en bulk-eksport, Bundles eller JSON-arrays; - for stdin) og skriver MeasureReport. Flagger:

Se digitale kvalitetsmålinger.

19.6.5 FHIR-flagg på perfuse serve

FlagEffekt
-fhirTilby FHIR-endepunktet på /fhir. På som standard.
-fhir-versionUtgaven som tilbys. R4 som standard.
-fhir-read-onlyAvvis skrivinger.
-fhir-api-tokensMed SMART konfigurert, aksepter Perfuse API-tekster samt SMART-tekster (av som standard; også under Innstillinger → FHIR).
-fhir-bulk-exportAktiver $export. Av som standard.
-fhir-subscriptionsAktiver emneabonnementer: møte- og avtalevarslinger til endepunkter FHIR-klienter velger. Av som standard; krever R4 og et skrivbart endepunkt.
-fhir-subscriptions-allow-httpLa abonnementer levere til vanlig http. For en testmottaker, aldri for pasientdata på et nettverk.
-fhir-patient-directory-searchLa en token begrenset til en pasient søke i katalogen (praktikere, organisasjoner, steder), innenfor dens omfang. Av som standard.
-fhir-declaresGuider denne serveren erklærer i sin kapasitetsutvikling, komma-separert: en guides CapabilityStatement-adresse, eller Type=profile-adresse. En uttalelse for klienter og testsett; den endrer ingenting butikken aksepterer.

Butikken beholder dokumenter samt ressurser: et dokument, en samling eller en meldingsBundle PUT til /fhir/Bundle/{id} beholdes hel, lest tilbake med hver enkelt post i utgaven som tilbys, og funnet ved type, identifier, timestamp og composition. En transaksjon PUT der beholdes som en post og ikke anvendes; en POST til /fhir anvender en.

Svar er JSON med mindre klienten ber om XML (Accept: application/fhir+xml, eller _format=xml). Perfuse leser kun JSON: en body sendt som XML får 415. En dokument-Bundle som er POSTet til /fhir beholdes når denne serveren innehar, ved identifikator, pasienten og møtet dens Komposisjon navngir, og avvist med 422 ellers. En Binary lesing med Accept satt til sin egen innholdstype svarer med innholdet selv.

19.7 Oppsett og drift

19.7.1 perfuse init

Oppretter kataloglayouten, et eksempelkanal og en tjenestedefinasjon for operativsystemet det kjøres på. Ingen eksisterende elementer erstattes med mindre du passerer -force.

perfuse init -dir /opt/perfuse -service systemd

19.7.2 perfuse service

Registrerer Perfuse som en Windows-tjeneste, fjerner den eller rapporterer om den er installert og kjører. Kun Windows; på Linux er ekvivalenten enhetsfilen perfuse init kan skrive for deg. Se drift.

19.7.3 perfuse token

Utgir legitimasjon for maskiner i stedet for mennesker. En token utløper ikke og påvirkes ikke av noen som logger ut, som en server som henter fra nabo trenger og som en nettlesersesjon bevisst ikke er.

perfuse token create -db perfuse.db -label fleet-from-site-a -role viewer perfuse token list -db perfuse.db perfuse token revoke -db perfuse.db -label fleet-from-site-a

Kun hashen lagres, så en token vises bare én gang når den opprettes og kan ikke gjenopprettes senere. En stjålet database gir derfor ingen brukbar token. Gi en token den laveste rollen som gjør jobben: en flåtevisning trenger viewer, og ingenting som bare leser skal holde noe mer.

-fhir-groups riverside-attributed,riverside-north begrenser en token til disse FHIR-gruppene, for en leverandørs CMS-0057 Provider Access-eksport: på FHIR-endepunktet kan den lese disse gruppene og eksportere dem, og ingenting annet. Se CMS-0057 for betalere.

19.7.4 perfuse athena

Skriver ut Amazon Athena CREATE EXTERNAL TABLE for en S3-arkiv skrevet med format: ndjson, ved å bruke partisjonsprosjeksjon på dt=YYYY-MM-DD-delen av nøkkelen, så ingen crawler trenger å kjøre når dager legges til.

perfuse athena -bucket hospital-arkiv -destination arkiv

Skrevet ut i stedet for å kjøres, fordi opprettelse av en tabell krever Athena- og Glue-tilganger som dette programmet ikke bør ha.

19.7.5 perfuse sbom

Lister opp alt som er koblet til binærfilen, lest fra byggingen selv i stedet for fra go.mod — så den beskriver binærfilen foran deg og ikke hva noen en gang ba om.

-json emitterer CycloneDX og -spdx emitterer SPDX tag-verdi, som vanligvis er hva en innkjøps- eller sikkerhetsgjennomgang faktisk ber om. Browserkoden som er innbygget i binærfilen er inkludert, fordi en gjennomganger som sammenligner en binærfil mot råd må vite at den inneholder en React-applikasjon.

19.7.6 perfuse versjon

Skriver ut versjonen og commit-en det ble bygget fra. Verdt å legge i en billett: "den nåværende" er ikke en versjon, og to maskiner som ble installert en uke apart er ofte ikke kjører samme bygging.

20 Serveralternativer

Hvert alternativ perfuse serve tar, generert fra programmet selv, så denne listen kan ikke navngi et alternativ som ikke eksisterer eller utelate ett. De fleste er også en innstilling i nettgrensesnittet, navngitt i siste kolonne: en verdi som er lagret der seirer over flagget ved neste start, og flagget forblir måten å sette det fra en tjenestedefinisjon. Lytteradressen, databasen og kanal-katalogen forblir bare flagg, fordi de sier hvor serveren finner hva den ville redigere.

Hemmeligheter er aldri flagg. Et alternativ som trenger en passord eller en token navngir en miljøvariabel som holder det.

20.1 Alle alternativer

OptionTakesDefaultWhat it doesIn the console
-addrstring127.0.0.1:8080, or 127.0.0.1:8443 with -tls-certaddress to serve the interface on—
-alert-severitystringwarningminimum severity to send to the webhook: warning or criticalSettings › Alerts › Delivery: Only send alerts at least this serious
-alert-webhookstring—POST alerts to this URL as JSON. Works with Slack, Teams, Mattermost, Alertmanager or anything that accepts a webhook. The payload carries channel names, counts and thresholds; never message contentSettings › Alerts › Delivery: Send alerts to this address
-alertsstring—YAML file of alert rules. Default: alerts.yaml beside the database, written when the rules are first saved in the console; until then a conservative default set is used—
-allow-metadata-egresson/off—permit destinations pointed at cloud instance metadata addresses, which hold this machine's credentialsSettings › Security › What may leave: Allow destinations at cloud instance metadata addresses
-cds-clientsstring—the EHRs trusted to call the CDS services with signed JWTs (issuer and jwks_url)Settings › Payers › Prior authorization: EHRs trusted to call the CDS services
-channelsstring./channelsdirectory holding channel files—
-clusterstring—share the work with other servers on the same PostgreSQL -db: active-passive (one runs everything, another takes over when it stops) or active-active (channels spread over all)—
-cluster-leaseduration15show long a crashed server holds its work before another takes it over; renewed five times as often—
-crd-advisor-castring—a PEM file of certificate authorities to trust for -crd-advisor-url beside the system's (Vaglio's is its DATA/tls/ca.crt)Settings › Payers › Decision service: Certificate authorities to trust for the advice service
-crd-advisor-token-envstring—name of an environment variable holding a bearer token for -crd-advisor-url (the token itself is never a flag)Settings › Payers › Decision service: Environment variable holding the advice service's token
-crd-advisor-urlstring—with -crd-rules, ask the decision service at this URL (such as Vaglio's /api/pas/advise) what a prior authorization request for each order needing one would be told as the record stands, shown as one more CRD card; the prefetched record is POSTed to it. No answer, or any failure, leaves the cards as they are without itSettings › Payers › Decision service: Advice before submitting (CRD)
-crd-rulesstring—a Da Vinci CRD rules file: serve coverage requirements over CDS Hooks at /cds-servicesSettings › Payers › Prior authorization: Coverage rules file (Da Vinci CRD)
-dashboardsstring—a file mapping directory groups and roles to the dashboard each opens onSettings › Monitoring › Dashboards: Which dashboard each group opens on (file)
-datastring—directory for this server's own files (settings, alerts, sign-in configuration, the log): default beside -db when it is a file, the current directory when it is a PostgreSQL URL—
-davinci-versionstring2.2the Da Vinci CRD, DTR and PAS release answered when neither a request nor its client's registration says: 2.2 (CRD 2.2.1, DTR 2.2.0, PAS 2.2.1) or 2.1 (2.1.0)—
-dbstring./perfuse.dbdatabase for users, messages and stored resources: a file, or a postgres:// URL for servers that share one store (a cluster)—
-demo-accountstring—for a public demonstration server: username:password of a shared viewer account shown on the sign-in page—
-dicomweb-archivestring—keep imaging objects in this directory and serve them over DICOMweb (QIDO-RS, WADO-RS, WADO-URI, STOW-RS) at /dicomwebSettings › Data › Imaging archive: Keep images in this folder and serve them over DICOMweb
-dicomweb-corsstring—comma-separated browser origins, such as an OHIF viewer's, allowed to call /dicomwebSettings › Data › Imaging archive: Browser origins allowed to call it
-drain-forduration—after SIGTERM, report not-ready for this long before shutting down (for rolling deploys)Settings › Engine › Shutdown: Wait for in-flight messages on shutdown
-ecr-agencystring—play a public health agency for testing eCR: answer case reports at $process-message with a Reportability Response, using the agency YAML file given (name, phone, address, endpoint; optional rctc, reply)Settings › Public health › Case reporting: Act as a test public health agency
-ecr-responseson/off—accept eCR Reportability Responses at the FHIR endpoint's $process-message, storing each as DocumentReference/<id> derived from the eICR it answersSettings › Public health › Case reporting: Receive Reportability Responses
-engineon/offtruerun the channel engine in this process, so the interface can start, stop and monitor channels—
-epa-payer-idstring—this payer's identifier on the prescribing network, the From of every RTPB and ePA response (default: the formulary's payer id)Settings › Payers › Drug formulary: Payer ID on the prescribing network
-epa-reply-channelstring—route ePA decisions made after the request was answered (a reviewer's, an appeal's) to this channel, which delivers them to the prescriber's networkSettings › Payers › Drug formulary: Channel that sends later ePA decisions
-fhiron/offtrueserve a FHIR endpoint at /fhirSettings › FHIR › The FHIR server: Serve a FHIR endpoint at /fhir
-fhir-api-tokenson/off—with SMART configured, accept Perfuse API tokens on the FHIR endpoint as well (unscoped; the console's FHIR settings can switch it)Settings › FHIR › Access: Accept Perfuse API tokens beside SMART tokens
-fhir-bulk-exporton/off—enable $export, which produces a file holding every record the FHIR endpoint servesSettings › FHIR › Bulk data: Bulk Data export ($export)
-fhir-declaresstring—guides this FHIR server declares in its capability statement, comma-separated: a CapabilityStatement address, or Type=profile addressSettings › FHIR › Capability statement: Guides this server declares
-fhir-max-resourcesint—for a public server: refuse new FHIR resources once this many are held (0: no limit)Settings › FHIR › Access: Most resources held
-fhir-member-match-without-consenton/off—let $member-match answer without an active Consent; the Payer-to-Payer API is opt-in, so only for testingSettings › Payers › CMS-0057-F: Answer $member-match without the member's consent
-fhir-openon/off—serve the FHIR endpoint with no authentication at all, exposing every stored recordSettings › FHIR › Access: Let anyone read the FHIR endpoint without signing in
-fhir-patient-directory-searchon/off—let a token limited to one patient search the directory (practitioners, organisations, locations) within its scopesSettings › FHIR › Access: Let a patient's app search the directory
-fhir-payer-apison/off—enable the CMS-0057 payer operations: $member-match (Payer-to-Payer) and Group $davinci-data-export (Provider Access); the Group exports also need -fhir-bulk-exportSettings › Payers › CMS-0057-F: The CMS-0057-F payer APIs
-fhir-read-onlyon/off—refuse writes to the FHIR endpointSettings › FHIR › Access: Refuse writes to the FHIR endpoint
-fhir-subscriptionson/off—enable topic-based subscriptions, which send encounter and appointment notifications to URLs FHIR clients chooseSettings › FHIR › Notifications: FHIR subscriptions (encounter and appointment notifications)
-fhir-subscriptions-allow-httpon/off—let subscriptions deliver to plain-http endpoints; for a test receiver, never for patient data on a networkSettings › FHIR › Notifications: Allow subscriptions to notify plain-HTTP addresses
-fhir-versionstring4.0.1FHIR release to serve: R4, R4B or R5Settings › FHIR › The FHIR server: FHIR version clients see
-fhir-writes-per-minuteint—for a public server: writes one client address may make to the FHIR endpoint a minute (0: no limit)Settings › FHIR › Access: Writes a minute from one client
-fleet-labelstring—how this instance names itself in a fleet view (default: hostname)Settings › Fleet › This server: Name for this server
-formularystring—publish this drug formulary over the Da Vinci US Drug Formulary API at /formulary/fhir and answer NCPDP Real-Time Prescription Benefit and SCRIPT electronic prior authorization from itSettings › Payers › Drug formulary: Drug formulary file
-icd11-client-idstring—a WHO ICD API client: ICD-11 codes not imported are looked up thereSettings › Data › Code systems: WHO ICD API client ID
-icd11-client-secretstring—the WHO ICD API client's secretSettings › Data › Code systems: WHO ICD API client secret
-icd11-releasestring2025-01the ICD-11 MMS release the WHO ICD API is asked aboutSettings › Data › Code systems: ICD-11 release to ask for
-icd11-urlstring—the ICD API's address when it is not the WHO's: the WHO's ICD-API container on your network needs no clientSettings › Data › Code systems: ICD API address
-index-identityon/offtrueindex patient identifiers from message contents so a message can be found by MRN, name or accession in any format; has no effect when -store-payloads is offSettings › Data › What is kept: Index patient identifiers
-insecureon/off—serve over plain HTTP on a non-loopback address (not recommended)—
-inventorystring—write a Markdown inventory of every interface to this file, and keep it currentSettings › Monitoring › Inventory: Write an interface inventory to
-inventory-everyduration24h0m0show often to rewrite the interface inventorySettings › Monitoring › Inventory: Rewrite the inventory every
-json-logson/off—emit structured JSON logsSettings › Monitoring › Logging: Write logs as JSON
-ldapstring—YAML file configuring directory (LDAP) sign-in (default: ldap.yaml beside the database, once saved in the console)—
-log-filestring—append the log, and the first administrator's one-time password, to this file (mode 0600) instead of the console. A Windows service has no console, so there it defaults to perfuse.log beside the database—
-mcpon/off—serve the Model Context Protocol at /mcp, so AI agents with an API token can read status, messages, the queue, alerts and the FHIR store with that token's own accessSettings › Security › AI agents (MCP): Let AI agents connect over MCP
-measure-reporterstringPerfusethe reporting organisation's name on MeasureReports from $evaluate-measure when the request names no reporter—
-metrics-openon/off—serve /metrics to anybody who can reach the port. Only safe where that port is genuinely private: metric labels name your channels, and on a multi-tenant server they name every tenant'sSettings › Security › Metrics: Serve /metrics without a token
-metrics-tokenstring—credential the Prometheus scrape endpoint requires. Give the scraper the same value in bearer_token_file. Without this, only a signed-in operator can read /metricsSettings › Security › Metrics: Token a metrics scraper presents
-mpion/off—keep a patient index (master patient index) in mpi.db beside the database: patient records from every system linked into one enterprise identifier per person, fed by mpi destinations and the PIX v3 identity feed, answering Patient/$match, PIXm, PIX v3 (/pixv3) and PDQ v3 (/pdqv3)Settings › Data › Patient index: Keep a patient index
-multi-tenanton/off—keep each tenant's channels in their own subdirectory of -channels, so one server can run integration for several organisations without them being able to see each other—
-node-addressstring—this server's console URL as the other servers and a load balancer reach it—
-node-namestring—this server's name in the cluster (default: an id kept in -data)—
-oidcstring—YAML file configuring OpenID Connect sign-in (default: oidc.yaml beside the database, once saved in the console)—
-pason/off—serve Da Vinci PAS 2.2.1 and 2.1.0 (Claim/$submit, $inquire, $decide) on the FHIR endpoint; decisions come from -crd-rules, and what no rule decides is pended for a reviewer. With -fhir-subscriptions, the PAS topic delivers each pended request's resultSettings › Payers › Prior authorization: Da Vinci PAS prior authorization server
-pas-278-castring—a PEM file of certificate authorities to trust for the UM system beside the system'sSettings › Payers › Utilization management link: Certificate authorities to trust for the UM system
-pas-278-certstring—a PEM client certificate for X.509 mutual TLS with the UM system (CORE's authentication)Settings › Payers › Utilization management link: Client certificate file
-pas-278-core-receiverstring—the CORE envelope's ReceiverID, as the UM system's connectivity guide gives it (default: -pas-278-receiver)Settings › Payers › Utilization management link: CORE envelope ReceiverID
-pas-278-core-rule-versionstring—what to write in the CORE envelope's CORERuleVersion when the UM system's guide asks for something other than the version itself (CMS esMD's sample says v2.2.0)Settings › Payers › Utilization management link: CORERuleVersion written in the envelope
-pas-278-core-senderstring—the CORE envelope's SenderID, as the UM system's connectivity guide gives it (default: -pas-278-sender)Settings › Payers › Utilization management link: CORE envelope SenderID
-pas-278-core-versionstring2.2.0the CAQH CORE Connectivity Rule the UM system runs, for core-soap and core-mime: 2.2.0 (payload in the envelope) or C4.0.0 (payload as an MTOM attachment; SOAP only)Settings › Payers › Utilization management link: CAQH CORE Connectivity Rule
-pas-278-keystring—the private key (PEM) for -pas-278-certSettings › Payers › Utilization management link: Client certificate key file
-pas-278-oauth-client-idstring—the OAuth client ID for -pas-278-oauth-token-urlSettings › Payers › Utilization management link: OAuth client ID
-pas-278-oauth-scopestring—the scope asked for with the OAuth token, when the UM system wants oneSettings › Payers › Utilization management link: OAuth scope
-pas-278-oauth-secret-envstring—name of an environment variable holding the OAuth client secret (the secret itself is never a flag)Settings › Payers › Utilization management link: Environment variable holding the OAuth client secret
-pas-278-oauth-token-urlstring—an OAuth 2.0 token endpoint: a token got with the client-credentials grant is sent as a bearer token (CORE vC4.0.0's authorization)Settings › Payers › Utilization management link: OAuth token endpoint
-pas-278-password-envstring—name of an environment variable holding the password for -pas-278-user (the password itself is never a flag)Settings › Payers › Utilization management link: Environment variable holding the password
-pas-278-payer-idstring—the UMO's payer ID (NM1*X3) when the request's insurer carries no identifierSettings › Payers › Utilization management link: Payer ID for the 278s
-pas-278-productionon/off—mark the 278s sent as production (ISA15 P) rather than testSettings › Payers › Utilization management link: Mark the 278s as production
-pas-278-receiverstring—ISA08/GS03 receiver ID on the 278s sent to the UM systemSettings › Payers › Utilization management link: Receiver ID on the 278s
-pas-278-senderstringPERFUSEISA06/GS02 sender ID on the 278s sent to the UM systemSettings › Payers › Utilization management link: Sender ID on the 278s
-pas-278-sftpstring—host:port of the UM system's SFTP server, for -pas-278-transport sftpSettings › Payers › Utilization management link: SFTP server
-pas-278-sftp-everyduration1m0show often the SFTP inbound folder is readSettings › Payers › Utilization management link: Read the SFTP inbound folder every
-pas-278-sftp-inboundstring—the SFTP folder the UM system's 278 responses, 999s and TA1s are collected fromSettings › Payers › Utilization management link: SFTP inbound folder
-pas-278-sftp-keystring—an OpenSSH private key file for the SFTP user, instead of a passwordSettings › Payers › Utilization management link: SFTP key file
-pas-278-sftp-known-hostsstring—an OpenSSH known_hosts file holding the SFTP server's key; required, so requests never go to whoever answersSettings › Payers › Utilization management link: SFTP known_hosts file
-pas-278-sftp-outboundstring—the SFTP folder the 278 requests (and the 999s for the answers) are put inSettings › Payers › Utilization management link: SFTP outbound folder
-pas-278-sftp-password-envstring—name of an environment variable holding the SFTP password (the password itself is never a flag)Settings › Payers › Utilization management link: Environment variable holding the SFTP password
-pas-278-sftp-userstring—the SFTP user nameSettings › Payers › Utilization management link: SFTP user
-pas-278-token-envstring—name of an environment variable holding a bearer token for the UM system (the token itself is never a flag)Settings › Payers › Utilization management link: Environment variable holding the token
-pas-278-transportstringx12how the 278s reach the UM system: x12 (POSTed as application/edi-x12), core-soap (a CAQH CORE SOAP envelope), core-mime (CAQH CORE HTTP MIME multipart), or sftp (batch files over -pas-278-sftp, answers collected from its inbound folder)Settings › Payers › Utilization management link: How the 278s travel
-pas-278-urlstring—forward every PAS request to the payer's utilization management system as an X12 278 request sent to this URL (by -pas-278-transport), and answer with its 278 response; later 278 responses go to Claim/$decide-278Settings › Payers › Utilization management link: Send PAS requests on to the UM system at
-pas-278-userstring—user name for the UM system: CORE's UserName (WS-Security UsernameToken in SOAP), or HTTP Basic for x12Settings › Payers › Utilization management link: User name
-pas-decider-castring—a PEM file of certificate authorities to trust for -pas-decider-url beside the system's, such as the payer's own authority or the decision service's (Vaglio's is its DATA/tls/ca.crt)Settings › Payers › Decision service: Certificate authorities to trust for the decision service
-pas-decider-token-envstring—name of an environment variable holding a bearer token for -pas-decider-url (the token itself is never a flag)Settings › Payers › Decision service: Environment variable holding the decision service's token
-pas-decider-urlstring—ask the decision service at this URL (such as Vaglio) to decide each PAS item on the request's clinical evidence, when -crd-rules leave it to a reviewer; the PAS request Bundle is POSTed to it. Cannot be combined with -pas-278-urlSettings › Payers › Decision service: Decision service URL
-passkey-allowed-modelsstring—comma-separated authenticator AAGUIDs that may enrol; requires -passkey-attestation-roots—
-passkey-attestation-rootsstring—a PEM file of authenticator vendor certificates; passkey attestation is verified against these—
-passkey-domainstring—the bare domain passkeys are registered for, such as perfuse.example.org. No scheme, no port, no path. Setting it turns passkeys on; leaving it empty leaves them offSettings › Sign-in › Passkeys: Domain passkeys are bound to
-passkey-namestringPerfusethe name an authenticator shows a person when they register a passkeySettings › Sign-in › Passkeys: Name shown on the device
-passkey-originsstring—comma-separated origins the console is reached at, with scheme and port: https://perfuse.example.org. Defaults to https:// plus the domainSettings › Sign-in › Passkeys: Other origins passkeys are accepted from
-peersstring—YAML file listing other Perfuse instances to show in a fleet viewSettings › Fleet › Fleet: Other Perfuse servers to show (file)
-public-urlstring—the https address patients' phones and other organisations reach this server at, for the SMART Health Links it hosts (default: the listen address)Settings › FHIR › The FHIR server: Address others reach this server at
-rctcstring—eCR trigger codes for the case report preview: a FHIR ValueSet or Bundle of them, such as the eRSDSettings › Public health › Case reporting: Trigger codes file (RCTC or eRSD)
-residencystring—cloud regions this server's data may go to or come from: areas (eea, uk, ch) and region codes (eu-central-1), comma-separated; channels with connectors elsewhere are refusedSettings › Data › Data protection: Where data may go (cloud regions)
-retention-daysint30how long to keep recorded messages; 0 keeps them for ever, which will eventually fill the diskSettings › Data › How long it is kept: Delete records after
-samlstring—YAML file configuring SAML 2.0 sign-in (default: saml.yaml beside the database, once saved in the console)—
-scimon/off—accept SCIM 2.0 provisioning from an identity provider at /scim/v2. Okta, Entra ID and Google Workspace use it to create accounts and, more importantly, to disable them when somebody leavesSettings › Sign-in › Automatic accounts: Let the identity provider manage accounts
-scim-default-rolestringviewerrole for an account the identity provider does not describe. Defaults downward on purpose: an account whose role could not be determined should be able to read and nothing else—
-settingsstring—settings file the web interface may edit (default: perfuse-settings.yaml beside the database)—
-shl-allow-httpon/off—let a received SMART Health Link point at plain HTTP; for testing onlySettings › Public health › Health links: Allow SMART Health Links over plain HTTP
-signing-certstring—certificate for signing documents (defaults to -tls-cert)Settings › Security › Document signing: Certificate for signing documents
-signing-keystring—key for signing documents (defaults to -tls-key)Settings › Security › Document signing: Key for signing documents
-smart-audiencestring—the audience a SMART token must be issued for, normally the FHIR base URLSettings › SMART › Authorization: Audience tokens must name
-smart-authorizestring—the authorization endpoint to advertise to SMART appsSettings › SMART › Authorization: Authorization endpoint
-smart-backend-serviceson/off—advertise that the SMART authorization server issues backend-services (client_credentials, signed JWT) tokensSettings › SMART › Built-in server: Backend Services (system-to-system tokens)
-smart-clientsstring—run Perfuse's own SMART authorization server at /auth for the apps registered in this YAML fileSettings › SMART › Built-in server: Registered apps file (turns on the built-in server)
-smart-issuerstring—accept SMART on FHIR access tokens from this authorization serverSettings › SMART › Authorization: Accept SMART access tokens from this authorization server
-smart-jwksstring—where to fetch the SMART issuer's signing keys, when not from its published metadata (split DNS, a private address)Settings › SMART › Authorization: Key set file
-smart-jwks-uristring—the authorization server's public key set URL, advertised to SMART apps (needed to claim OpenID Connect sign-in)Settings › SMART › Authorization: Key set address
-smart-keystringsmart-signing.keythe built-in authorization server's RSA signing key (PEM, mode 0600), created if missingSettings › SMART › Built-in server: Signing key file
-smart-oidcstring—with -smart-users, let people sign in at this OpenID Connect provider (YAML: issuer, client_id, client_secret_file or client_secret_env, label); each is linked by oidc_subjectSettings › SMART › Built-in server: Sign people in through the OpenID Connect provider
-smart-tokenstring—the token endpoint to advertise to SMART appsSettings › SMART › Authorization: Token endpoint
-smart-usersstring—with -smart-clients, the people who may sign in to authorize apps (YAML: username, password_hash, fhir_user)Settings › SMART › Built-in server: People who sign in to authorize apps (file)
-snmp-allowstring—comma-separated networks or addresses the SNMP agent answers, such as 10.0.5.0/24; required with -snmp-listenSettings › Monitoring › SNMP: Networks that may ask
-snmp-base-oidstring1.3.6.1.4.1.8072.9999.9999.16, Net-SNMP's experimental spacewhere Perfuse's values sit, under your enterprise numberSettings › Monitoring › SNMP: Base OID
-snmp-communitystring—the SNMPv2c community (a password sent in clear: at least 6 characters, not public or private)Settings › Monitoring › SNMP: SNMP community
-snmp-contactstring—sysContact the SNMP agent reportsSettings › Monitoring › SNMP: Contact (sysContact)
-snmp-listenstring—answer SNMPv2c GET/GETNEXT/GETBULK on this UDP address, such as :161 (off when empty). Read-only: channel states, counts and queue depthsSettings › Monitoring › SNMP: Answer SNMP on this address
-snmp-locationstring—sysLocation the SNMP agent reportsSettings › Monitoring › SNMP: Location (sysLocation)
-snmp-trapsstring—comma-separated managers (host or host:port, default port 162) that receive an SNMPv2 trap when an alert fires or resolvesSettings › Monitoring › SNMP: Send traps to
-store-messageson/offtruerecord every message handled, which is what makes the message browser workSettings › Data › What is kept: Keep a record of each message
-store-payloadson/offtruestore message contents as well as their outcomes; turn this off where PHI must not be held at restSettings › Data › What is kept: Keep message contents
-tls-certstring—TLS certificate fileSettings › Security › Encryption: TLS certificate file
-tls-keystring—TLS private key fileSettings › Security › Encryption: TLS private key file
-trace-endpointstring—OTLP/HTTP base URL to export message traces to, for example http://localhost:4318Settings › Monitoring › Tracing: Send traces to
-trace-instancestring—name for this instance in traces; defaults to the hostname, which is what distinguishes replicasSettings › Monitoring › Tracing: This instance's name in traces
-trace-samplefloat1fraction of traces to record, 0 to 1—
-tsa-urlstring—RFC 3161 time-stamping authority for DSDR signatures on claims attachmentsSettings › Security › Document signing: Time-stamping authority
-vpnstring—partner VPN tunnels to report on the Connections dashboard (YAML: AWS Site-to-Site VPN, Azure VPN Gateway or strongSwan, and both sides' settings); see examples/vpn.yamlSettings › Monitoring › Connections: VPN tunnels to watch (file)
-watch-accesson/offtruewatch traffic and reads of patient data for what a breach looks like (bursts, night traffic, new destinations, bulk reads) and raise alerts—
-xdsstring—keep clinical documents here as an IHE XDS.b registry and repository with this repository uniqueId (an OID), answering ITI-41, ITI-42, ITI-18 and ITI-43 at /xds/repository and /xds/registrySettings › Data › Document sharing (IHE XDS): Keep documents here as an XDS registry and repository
-xds-home-communitystring—this community's home community id (urn:oid:...), so /xca/gateway answers XCA ITI-38 and ITI-39 for itSettings › Data › Document sharing (IHE XDS): Home community id, for XCA

21 Kanalkreferanse

Hver nøkkel som kan dukke opp på toppnivå i en kanalfil. Disse hentes fra kilde, så dette kapitlet kan ikke beskrive en valgmulighet som ikke finnes eller utelate en som gjør det.

21.1 Kanal

Kanal er en konfigurert meldingsflyt: et sted hvor meldinger ankommer, et valgfritt filter og ett eller flere steder de går.

Definert som Channel i internal/config.

NøkkelTypeObligatoriskStandard
nametekstja—
descriptiontekstnei—
grouptekstnei—
attachmentsVedlegg (en blokk, utelat for å ikke inkludere)nei—
delimitedAvdelt (en blokk, utelat for å ikke inkludere)nei—
tablesliste over tekstnei—
contractContractRef (en blokk, utelat for å ikke inkludere)nei—
enabledtrue eller false (en blokk, utelat for å ikke inkludere)nei—
dataTypeDataTypeneihl7
hl7v3HL7v3Options (en blokk, utelat for å ikke inkludere)nei—
x12X12Options (en blokk, utelat for å ikke inkludere)nei—
ncpdpNCPDPOptions (en blokk, utelat for å ikke inkludere)nei—
edifactEDIFACTOptions (en blokk, utelat for å ikke inkludere)nei—
scriptScriptOptions (en blokk, utelat for å ikke inkludere)nei—
dicomDICOMOptions (en blokk, utelat for å ikke inkludere)nei—
sourceSourceja—
filtertekstnei—
transformationsliste over transform.Stepnei—
scriptsScripts (en blokk, utelat for å ikke inkludere)nei—
shadowShadow (en blokk, utelat for å ikke inkludere)nei—
destinationsliste over Destinationja—

21.1.1 navn

Navn identifiserer kanalen i logger og målinger.

Obligatorisk og unik.

21.1.2 gruppe

Gruppe er hva denne kanalen er en del av, for å organisere en liste som har vokst for lang til å lese.

Kosmetisk ved fem kanaler og strukturell ved to hundre: en steds kanaler deles av systemet de snakker til, eller av teamet som eier dem, og en flat liste av to hundre navn er ubrukelig uansett hvor god resten av grensesnittet er.

En vanlig streng i stedet for en gruppeobjekt med sin egen fil, fordi en gruppe ikke har noen atferd. Øyeblikket det får en fil tilegner det innstillinger, og innstillinger på en gruppe betyr at en kanals atferd avhenger av noe som ikke er skrevet i kanalen - som er egenskapen som gjør Mirth-konfigurasjon hard å forstå.

21.1.3 vedlegg

Vedlegg flytter store nyttelaster ut av meldingen og setter dem tilbake før levering.

Valgfritt per kanal: en strøm av rene ADT-meldinger har ingenting å trekke ut og bør ikke betale for maskineriet.

21.1.4 avgrenset

Avgrenset konfigurerer en avgrenset kanal.

Kun meningsfull når datatypen er avgrenset.

21.1.5 tabeller

Tabellnavn filer av felles kartleggingstabeller en transformasjon kan referere til ved navn.

Felles fordi domenetaksen i stor grad er å gjenskape en kartlegging noen allerede har gjort: en steds kjønnkoder og pasientklasser blir oversatt likt i hver kanal som berører dem, og en tabell inni en kanal er en tabell bare den kanalen kan bruke.

21.1.6 aktivert

Aktivert standarder til true.

En deaktivert kanal er lastet og valideres, men ikke startet, så en fil som midlertidig er av er likevel sjekket av CI.

21.1.7 datatypen

Datatypen er formatet på meldingene denne kanalen mottar.

Standard er hl7, så hver kanal skrevet før denne eksisterte fortsetter å fungere.

21.1.8 x12

X12 inneholder innstillingene som bare betyr noe på en X12-kanal.

Å sette det på noen andre typer nektes heller enn ignoreres.

21.1.9 skript

Skript konfigurerer en NCPDP SCRIPT-kanal.

Dets steg bor her heller enn i toppnivåets transformasjoner for samme årsak som hver andre ikke-v2-format gjør: steptypene varierer per format, så en nøkkel ville bety forskjellige ting avhengig av datatypen.

21.1.10 dicom

Bilde konfigurerer en DICOM-kanals navngitte transformasjonssteg.

Navngitt Bilde heller enn DICOM fordi Kilde og Destinasjon allerede har et DICOM-felt og tre felt med samme navn på forskjellige nivåer er hvordan noen setter feil felt. YAML-nøkkelen er dicom, som er hva en person som skriver filen forventer, og Go-navnet er det som stopper en feil på kallstedet.

21.1.11 filter

Filter er et uttrykk som må være gyldig for at en melding skal videreformidles.

En melding som ikke matcher blir likevel bekreftet: avsenderen gjorde ingenting galt, vi er bare ikke interessert.

21.1.12 transformasjoner

Transformasjoner er deklarative endringer som gjøres på aksepterte meldinger, i rekkefølge, før noen skript kjøres.

Dette er laget som skal bære den vanlige arbeidet: hvert steg valideres når filen lastes, vises i en diff og kan gjennomgås av noen som ikke leser JavaScript.

21.1.13 skript

Skript inneholder JavaScript for tilfellene de deklarative stegene ikke kan uttrykke, og er hva en Mirth-kanals egne skript dropper uendret inn i.

En kanal med et skript er merket som slik i grensesnittet, fordi dens atferd ikke kan fastslås ved å lese konfigurasjonen.

21.1.14 skygge

Skygge kjører en kandidatversjon av denne kanalen ved siden av og rapporterer hvor de forskjeller.

Ingenting den gjør kan nå en mottaker.

22 Kildehenvisning

Hver måte en kanal kan motta meldinger, og hver nøkkel hver enkelt aksepterer. En kanal har nøyaktig én kilde.

22.1 AMQP Kilde

AMQP Kilde mottar fra en kø eller abonnement.

En melding aksepteres bare etter at kanalen har behandlet den. En som ikke kunne behandles, utløses som en feilaktig levering, så brokeren redelerer den og - på Service Bus, forbi køens maksimum leveringsantall - dørkbrev den.

Definert som AMQPSource i internal/config.

NøkkelTypeObligatoriskStandard
prefetchheltallnei10
reconnectvarighet, som 30s eller 5mnei5s

22.1.1 prefetch

Prefetch er hvor mange meldinger brokeren kan sende i forveien.

Standard er 10. De behandles likevel én om gangen, i rekkefølge.

22.1.2 reconnect

Reconnect er ventetiden etter en tapt tilkobling.

Defaults to 5s.

22.2 AS2 Kilde

AS2 Kilde mottar AS2 (RFC 4130): EDI postet over HTTP, signert og kryptert med S/MIME, besvart med en kvittering (en MDN) som bærer en digest av hva som ankom.

Nyttelasten er hva kanalen behandler; X12 og EDIFACT er de vanlige.

Definert som AS2Source i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
pathtekstnei—
tlstlsconf.Settings (en blokk, utelat for å la være)nei—
idtekstja—
cert_filetekstja—
key_filetekstja—
partnersliste over AS2Partnerja—
max_message_sizeheltallnei—
duplicate_windowvarighet, som 30s eller 5mnei—

22.2.1 path

Path er URL-stien partnere poster til.

Default /as2.

22.2.2 tls

TLS betjener HTTPS.

De fleste partnere krever det i deres avtale, i tillegg til S/MIME.

22.2.3 id

ID er vår AS2-identifikator, som partnere sender i AS2-To.

En melding til noen andre avvises.

22.2.4 partnere

Partnere er de som kan sende her.

En melding fra noen andre blir avvist.

22.2.5 duplikat_window

DuplicateWindow er hvor lenge en partners Message-ID huskes, så en melding som sendes igjen (partnern fikk aldri vår kvittering og prøvde igjen) blir besvart med en kvittering og ikke videreformidlet to ganger (RFC 4130 seksjon 7.5).

Default 30 days.

22.3 Azure Blob Kilde

AzureBlobSource henter blobs fra en container-prefiks.

Definert som AzureBlobSource i internal/config.

NøkkelTypeObligatoriskStandard
prefixtekstja—
suffixtekstnei—
after_readtekstnei—
move_totekstneiprosessert/
error_prefixtekstneifeil/
poll_intervalvarighet, som 30s eller 5mnei30s
max_object_sizeheltallnei16 MiB
framedtrue eller falsenei—

22.3.1 flytt_til

FlyttTil er hvor en behandlet blob flyttes.

Standard er prosessert/.

22.3.2 feil_prefiks

FeilPrefiks er hvor en blob som ikke kan behandles flyttes, så den ikke blokkerer resten.

Standard er feil/.

22.3.3 avhøringsintervall

Avhøringsintervall mellom listinger.

Defaults to 30s.

22.3.4 maks_objektstørrelse

MaksObjektStørrelse avviser en større blob, som blir liggende der den er.

Standard er 16 MiB.

22.4 Meglertype Kilde

BrokerSource leser meldinger fra en meldingsmegler.

Mirths JMS-leser, nådd over STOMP fordi JMS er en Java-API og ikke et protokoll. Se internal/stomp for hvorfor STOMP og ikke OpenWire.

Definert som BrokerSource i internal/config.

NøkkelTypeObligatoriskStandard
addrtekstja—
destinationtekstja—
logintekstnei—
passcodetekstnei—
hosttekstneiadressens host
selectortekstnei—
subscription_idtekstneikanalnavn
heartbeatvarighet, som 30s eller 5mneitretti sekunder
reconnectvarighet, som 30s eller 5mneifem sekunder
timeoutvarighet, som 30s eller 5mneitretti sekunder
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—

22.4.1 adresse

Addr er vertens host og port.

Påkrevd. 61613 er den vanlige STOMP-porten.

22.4.2 mottaker

Mottaker er køen eller temaet som leses fra.

Required.

Mellomleddene staver disse forskjellig - /queue/navn på ActiveMQ, et bart navn på RabbitMQ - så det sendes gjennom uendret i stedet for å bli sammensatt her. Å gjette ville bety å arbeide mot ett mellomledd og stille lese ingenting på et annet.

22.4.3 logg inn

Logg inn og passord autentiserer.

De fleste mellomleddene avviser en anonym tilkobling.

22.4.4 passord

Logg inn og passord autentiserer.

De fleste mellomleddene avviser en anonym tilkobling.

22.4.5 vert

Vert er den virtuelle verten.

Standard er adressens vert.

22.4.6 velger

Velger filtrerer meldinger på mellomleddet.

En JMS-velger, sendt gjennom i stedet for å bli tolket. Filtrering på mellomleddet i stedet for her betyr at meldingene denne kanalen ikke ønsker, aldri krysser nettverket - som på en delt kø er forskjellen på å lese hundre meldinger om dagen og hundre tusen.

22.4.7 abonnements_id

AbonnementsID navngir abonnementet.

Standard er kanalnavnet.

Navngitt i stedet for generert, fordi et varig abonnement identifiseres av det: et generert ville opprette et nytt abonnement ved hver omstart og la de gamle samle opp meldinger ingen leser.

22.4.8 hjerteslag

Hjerteslag holder tilkoblingen i live.

Standard er tretti sekunder.

På som standard her, i motsetning til klientens egen standard, fordi en kilde holder en tilkobling åpen i uker. Uten hjerteslag ser en tilkobling gjennom en brannmur som stille har droppet ruten ut perfekt sunn fra denne enden, og meldingene stopper bare, uten at noe logges.

22.4.9 reconnect

Gjenkobling er hvor lenge å vente før gjenkobling etter en feil.

Standard er fem sekunder.

22.4.10 tidsavbrudd

Tidsavbruddsgrenser for tilkobling.

Standard er tretti sekunder.

22.5 DICOM-spørringskilde

DICOMQuerySource spør en arkiv med C-FIND og sender en melding per ny studie.

Mirth har ingen tilsvarende connector. Dets DICOM-støtte er en lytter og en sender - den kan motta bilder som sendes til den og sende dem videre, og det er alt. Å spørre et arkiv hva det inneholder har vært forespurt på deres forum siden 2015.

Hva som gjør det verdt å ha er ikke spørringen, det er automatiseringen: en forhåndshenting som kjører klokken tre om morgenen, en avstemming som legger merke til at arkivet mangler en studie som RIS sier eksisterer, en arbeidsliste bygget fra hva som faktisk ble skannet i stedet for hva som ble bestilt. Disse er jobber som steder i dag gjør med et planlagt skript utenfor motoren, noe som betyr at de er usynlige for den - ingen gjenprøvninger, ingen varsling, ingen meldingslogg.

Definert som DICOMQuerySource i internal/config.

NøkkelTypeObligatoriskStandard
addresstekstja—
called_aetekstja—
calling_aetekstnei—
leveltekstneiSTUDY
patient_roottrue eller falsenei—
matchmapping av tekst til tekstnei—
returnliste over tekstnei—
intervalvarighet, som 30s eller 5mja—
windowvarighet, som 30s eller 5mnei—
overlapvarighet, som 30s eller 5mneien time
limitheltallnei500
timeoutvarighet, som 30s eller 5mneito minutter
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—
emit_on_first_polltrue eller falseneifalse

22.5.1 adresse

Adresse er arkivets vert og port.

Required.

Navngitt for å matche DICOM-destinasjonen i stedet for forkortet. De to var "adresse" og "addr" en ettermiddag, noe som er den type inkonsistens noen som skriver en kanal-fil for hånd får feil en gang og deretter mistenker hele formatet over.

22.5.2 called_ae

CalledAE er arkivets AE-tittel.

Obligatorisk i praksis: de fleste arkiver avviser en assosiasjon adressert til noe annet, og den avvisningen leser som et driftsavbrudd i stedet for som en konfigurasjonsfeil.

22.5.3 calling_ae

CallingAE er AE-tittelen Perfuse presenterer.

Arkiver bruker den ofte for tilgangskontroll.

22.5.4 nivå

Nivå er spørringsnivået: PASIENT, STUDIE, SERIE eller BILDE.

Standard er STUDIE.

STUDIE er standard fordi det er hva nesten alle nyttige spørringer ønsker, og fordi alternativene overrasker folk: BILDE-nivå mot en stor CT returnerer en respons per skive, som er hundrevis per studie.

22.5.5 match

Match er spørringstastene.

En verdi filtrerer; en tom verdi ber om feltet skal returneres.

Nøklene er navngitt i stedet for nummerert - "PatientID" ikke "0010,0020" - fordi en kanal-fil leses av mennesker, og en tag-nummer i en konfigurasjonsfil er en oppslag hver lesere må utføre.

22.5.6 returner

Return-felt er felter som skal returneres uten filtrering på dem.

Separat fra Match med en tom verdi, selv om de kodar identisk, fordi intensjonen er forskjellig og en leser kan se hvilke nøkler som begrenser søket og hvilke som samles inn.

22.5.7 intervall

Intervall er hvor ofte polling skal utføres.

Required.

22.5.8 vindu

Vindu er hvor langt tilbake hver polling ser, som et studie-datoområde.

Null deaktiverer dato-filtrering helt.

Et vindu er det som holder dette begrenset. Uten ett, spør hver polling arkivet om alt det har holdt noen gang og kaster så bort hva det har sett før - noe som fungerer på et testarkiv og er usosialt mot et virkelig arkiv som holder millioner av studier.

22.5.9 overlapp

Overlapp gjentar spørringen så langt inn i allerede polla perioden.

Standard er en time.

Nødvendig snarere enn forsiktig. Et studie kan registreres med gårsdagens dato, vår klokke og arkivets trenger ikke å være enige, og en poll-grense som samsvarende med en ankomst mister den. Overlapp-spørringen gjentar, og allerede sett-sjekken stopper duplikatet - så kostnaden av overlapping er en litt større spørring og kostnaden av ikke å overlappe er et stille misset studie.

22.5.10 begrensning

Begrensning begrenser antall treff akseptert fra en polling.

Defaults to 500.

En begrensning snarere enn ingen begrensning fordi en feilskrevet match-nøkkel gjør dette til "gi meg alt", og det første symptomet på det mot et virkelig arkiv er arkivets administrator som spør hvem som banker på det.

22.5.11 tidsavbrudd

Tidsbegrensning begrenser en polling.

Standard er to minutter.

22.5.12 emit_on_first_poll

EmitOnFirstPoll sender meldinger for alt det første pollinget finner.

Standard er false.

False betyr noe. Å peke dette mot et arkiv som allerede holder en million studier og få det til å sende en melding for hver er ikke en nyttig første kjøring, og det er den type feil som merkes nedstrøms snarere enn her. Første polling registrerer hva som finnes og sender ingen melding; andre polling og utover rapporterer hva som er nytt.

22.6 DICOM-kilde

DICOM-kilden mottar bildeobjekter som en C-STORE-tjenesteklasse-tilbyder.

Hva et sykehus peker en modalitet eller et PACS mot. Mirth kaller dette DICOM-lytteren og det gjør C-STORE bare, så dette er likhet snarere enn en undermengde.

Definert som DICOMSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
ae_titletekstnei—
allowed_calling_aeliste over tekstnei—
sop_classesliste over tekstnei—
transfer_syntaxesliste over tekstnei—
max_object_bytesheltallnei—
idle_timeoutvarighet, som 30s eller 5mnei—
tlstlsconf.Settings (en blokk, utelat for å ikke bruke)nei—

22.6.1 lytter

Lytt er adressen som betjenes på.

Obligatorisk. 104 er den registrerte DICOM-porten; 11112 er den vanlige alternativet der binding av en privilegert port ikke er mulig.

22.6.2 ae_title

AETitle er hva denne endepunktet kaller seg selv.

Sterkt anbefalt i stedet for obligatorisk, og advart om når fraværende. En steds eneste tilgangskontroll på et DICOM-endepunkt er ofte AE-tittelen, så et endepunkt som aksepterer alle titler aksepterer alt som kan nå det.

22.6.3 allowed_calling_ae

AllowedCallingAE lister AE-tittlene som er tillatt å koble til.

Tomt aksepterer alle kallere.

Dette er tilgangskontrollen DICOM faktisk har. En PACS er vanligvis konfigurert til å akseptere en navngitt kalltittel og avvise alt annet, og denne enden hadde ingen ekvivalent: den kalte tittelen ble sjekket - som er navnet kalleren ringer, så hvem som helst kan sende det riktig - mens hvem som ringte ble logget og ellers ignorert.

Tomt aksepterer fortsatt alt, fordi en modalitet ingen har listet er den normale tilstanden for en første installasjon og å nekte som standard ville bryte hver enkelt distribusjon på dag én. Den advarer i stedet, og advarselen navngir tittelen som har koblet til så noen kan fylle denne inn fra hva som faktisk ankom.

22.6.4 sop_classes

SOPClasses begrenser hvilke typer objekter som aksepteres.

Tomt aksepterer alle.

Tomt er en rimelig standard her fordi denne motoren videreformidler objekter i stedet for å tolke dem, så å nekte en ukjent klasse ville nekte gyldige bilder uten noen fordel.

22.6.5 transfer_syntaxes

TransferSyntaxes begrenser kodningene som aksepteres, i preferanseorden.

Tomt aksepterer de ukomprimerte tre.

22.6.6 max_object_bytes

MaxObjectBytes begrenser ett mottatt objekt.

Null anvender en standard.

22.6.7 idle_timeout

IdleTimeout lukker en assosiasjon som har gått stille.

Null betyr aldri, som vanligvis er riktig - en modalitet holder en assosiasjon åpen mellom studier.

22.6.8 tls

TLS krypterer innkommende assosiasjoner og kan kreve en klient sertifikat.

Verdt å si rett ut: Mirth trenger sin betalte SSL Manager-utvidelse for dette, og community-forkene kan ikke leveres med det i det hele tatt. DICOM inneholder pasientnavn i metadata, så dette er ett av stedene hvor å være en omskrivning heller enn en fork er en reel fordel heller enn en stilistisk en.

22.7 DICO Mweb Kilde

DICOMwebSource aksepterer STOW-RS-forespørsler.

Definert som DICOMwebSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
pathtekstnei/dicom-web
tokentekstnei—
usernametekstnei—
passwordtekstnei—
max_object_bytesheltallnei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—

22.7.1 lytter

Lytt er adressen som betjenes på.

Required.

22.7.2 path

Sti er tjenestens rot.

Objekter aksepteres på Sti/studier og Sti/studier/{uid}. Standard er /dicom-web, som er hva Orthanc og dcm4chee bruker, så en avsender konfigurert for noen av dem trenger bare å endre verten.

22.7.3 token

Token, når det er satt, er påkrevd som en bærertoken.

Brukernavn og passord krever HTTP-basisk autentisering.

22.7.4 brukernavn

Token, når det er satt, er påkrevd som en bærertoken.

Brukernavn og passord krever HTTP-basisk autentisering.

22.7.5 passord

Token, når det er satt, er påkrevd som en bærertoken.

Brukernavn og passord krever HTTP-basisk autentisering.

22.8 Database Kilde

DatabaseSource leser rader fra en database og omdanner hver enkelt til en melding.

Dette er hvordan en stor del av hospitalgrensesnitt faktisk starter. Et avdelingssystem har ingen HL7-kapasitet, så noen skriver rader inn i en midlertidig tabell og grensesnittsmotoren poller den. Det er ikke glamorøst, og det er overalt.

Det er også den vanligste måten en Mirth-kanal blokkerer, og årsaken er nesten alltid av samme form: en rad som ikke kan prosesseres, leses, feiler og leses igjen, for alltid, fordi ingenting markerte den. Kanalen ser levende ut. Køen ser tom ut. Ingen bevegelse, og hver melding bak den dårlige raden venter på en rad som aldri vil lykkes.

Det meste av designet her handler om det.

Definert som DatabaseSource i internal/config.

NøkkelTypeObligatoriskStandard
drivertekstja—
dsntekstja—
querytekstja—
after_querytekstnei—
key_columntekstnei—
templatetekstnei—
columntekstnei—
poll_intervalvarighet, som 30s eller 5mnei—
batch_sizeheltallnei100
max_attemptsheltallnei3
query_timeoutvarighet, som 30s eller 5mnei30s

22.8.1 sjåfør

Sjåfør navngir databasen.

See SupportedDrivers.

22.8.2 dsn

DSN er tilkoblingsstrengen.

Foretræk et miljøvariabelreferanse over en bokstav, fordi dette vanligvis inneholder en passord og kanaler er ment å være i git.

22.8.3 spørring

Spørring velger radene som venter på å bli sendt.

Required.

Den må være en SELECT. En avstemming som stille utfører skriver vil kjøre på en plan med ingen rekord av hva den endret.

22.8.4 etter_spørring

EtterSpørring markerer en rad som prosessert, og kjører med radens nøkkel bundet til den.

Strongly recommended.

Uten dette, gjentar hver avstemming hver rad spørringen fortsatt matcher, så spørringen selv må ekskludere prosesserte rader på en annen måte. Hvis ingen av dem er sann, sender kanalen de samme radene for alltid, hvilket er en duplikatstorm i stedet for en blokkering og er kanskje verre.

22.8.5 nøkkelkolonne

Nøkkelkolonne identifiserer en rad for EtterSpørring, karantene og duplikatfjerning.

Kreves når EtterSpørring er satt.

22.8.6 mal

Mal bygger en melding fra en rad.

Enten dette eller Kolonne er påkrevd.

Kolonner referanser bruker ${kolonne_navn}. Manglende kolonner er en feil ved lasting i stedet for en tom streng i en klinisk melding.

22.8.7 batch_størrelse

BatchStørrelse begrenser radene tatt per avstemming.

Defaults to 100.

Begrenset fordi en ubegrenset første avstemming mot en tabell noen har fylt i et år ville lese hele den inn i minne og deretter sende hele den, hvilket er hvordan en migrering flomer en live mottaker.

22.8.8 maks_forsøk

MaksForsøk er hvor mange ganger en enkelt rad kan feile før den karanteres og avstemmingen fortsetter.

Defaults to 3.

Dette er innstillingen som forhindrer blokkeringen. Å gjenta for alltid er ikke motstandskraft; det er en dårlig rad som stopper en sykehusfeed.

22.8.9 spørring_tidsbegrensning

SpørringTidsbegrensning begrenser en enkelt avstemming.

Defaults to 30s.

22.9 Direkte kilde

DirekteKilde mottar Direkte e-post som HISP leverer: en SMTP-lytter for denne adressens e-post.

Hver melding dekrypteres, dens signatur sjekkes mot ankrene og dens signer mot Fra, og dens innhold videreformidles: en XDM-pakkes dokumenter, ellers hver vedlegg, ellers teksten.

Definert som DirectSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstnei—
tls_certtekstnei—
tls_keytekstnei—
max_bytesheltallnei—
smtp_hosttekstnei—
usernametekstnei—
passwordtekstnei—
imapDirectIMAP (en blokk, utelat for å ikke inkludere)nei—
xdrDirectXDR (en blokk, utelat for å ikke inkludere)nei—

22.9.1 smtp_host

SMTPHost, Username og Password er HISP's innsendingsserver, brukt til å sende en "prosesserings"-leveringsbekreftelse (MDN) til avsenderen når et melding har blitt tatt imot.

Uten dette, sendes ingen bekreftelse.

22.9.2 brukernavn

SMTPHost, Username og Password er HISP's innsendingsserver, brukt til å sende en "prosesserings"-leveringsbekreftelse (MDN) til avsenderen når et melding har blitt tatt imot.

Uten dette, sendes ingen bekreftelse.

22.9.3 passord

SMTPHost, Username og Password er HISP's innsendingsserver, brukt til å sende en "prosesserings"-leveringsbekreftelse (MDN) til avsenderen når et melding har blitt tatt imot.

Uten dette, sendes ingen bekreftelse.

22.10 E-post kilde

EmailSource leser e-post fra en postkasse og omdanner vedlegg, tekst eller hele meldinger til meldinger.

Definert som EmailSource i internal/config.

NøkkelTypeObligatoriskStandard
protocoltekstnei—
hosttekstja—
portheltallnei—
securitytekstnei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—
usernametekstja—
passwordtekstnei—
oauthEmailOAuth (en blokk, utelat for å ikke inkludere)nei—
mailboxtekstnei—
taketekstnei—
attachment_namesliste av tekstnei—
allowed_sendersliste av tekstnei—
after_readtekstnei—
move_totekstnei—
error_foldertekstnei—
poll_intervalvarighet, som 30s eller 5mnei—
max_message_sizeheltallnei—

22.10.1 passord

Passord kan være ${ENV}; for Gmail, et app-passord.

Ignoreres med oauth.

22.10.2 attachment_names

AttachmentNames begrenser hvilke vedlegg som tas, etter filnavnmønster (*.hl7).

Tomt tar alle vedlegg.

22.10.3 allowed_senders

AllowedSenders begrenser hvis e-post som leses: adresser og domener.

Fra-hodet kan forfalskes, så dette holder ulykker og uønsket e-post ute, ikke en angriper.

22.10.4 flytt_til

MoveTo er mappen håndtert e-post flyttes til; Prosessert som standard.

Opprettes når den mangler.

22.11 FTP-kilde

FTPSource samler inn filer fra en FTP- eller FTPS-server.

Hvorfor FTP fortsatt er her

Det er tredve år siden det anbefalte erstatningen og mange sykehusystemer exporterer fortsatt til det: enheter hvis firmware aldri vil bli oppdatert, regnskapsystemer hvis leverandør tar betalt for en endring. Å nekte å snakke det gjør ikke disse systemene forsvinne, det betyr at integrasjonsmotoren ikke kan brukes.

FTPS er standard. Det er samme protokollen med TLS, de fleste overlevende servere støtter det, og det er en mye enklere samtale med et sikkerhetsteam enn vanlig FTP.

Definert som FTPSource i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja—
usertekstnei—
passwordtekstnei—
securityftpconn.Securityneieksplisitt
insecure_skip_verifytrue eller falsenei—
roottekstnei—
timeoutvarighet, som 30s eller 5mneitretti sekunder

22.11.1 vert

Verten er serveren, med en valgfri port.

Port 21 antas.

22.11.2 bruker

Bruker og passord autentiserer.

Begge kan utelates for en anonym server.

Anonym FTP er fortsatt hvordan noen offentlige referansekilder publiseres, så en tom bruker er en gyldig konfigurasjon snarere enn en oversikt og avvises ikke. På en server som forventer legitimasjon, å utelate dem produserer en innloggingsfeil ved oppkoblingstid, som rapporteres mot kanalen snarere enn å gjentas stille.

22.11.3 passord

Bruker og passord autentiserer.

Begge kan utelates for en anonym server.

Anonym FTP er fortsatt hvordan noen offentlige referansekilder publiseres, så en tom bruker er en gyldig konfigurasjon snarere enn en oversikt og avvises ikke. På en server som forventer legitimasjon, å utelate dem produserer en innloggingsfeil ved oppkoblingstid, som rapporteres mot kanalen snarere enn å gjentas stille.

22.11.4 sikkerhet

Sikkerhet er eksplisitt, implisitt eller ingen.

Standard er eksplisitt, som er FTPS forhandlet med AUTH TLS på den vanlige porten. "ingen" er vanlig FTP og må spesifiseres ved navn.

22.11.5 rot

Rot er katalogen som hver sti er relativ til, og hva innhold er pålagt.

Serveren har ingen forestilling om det: en FTP-server vil gjerne akseptere ../.. som en sti. Så dette er hva stopper en flytt til fra å skrive hvor som helst kontoen kan nå.

22.11.6 tidsavbrudd

Tidsbegrensning begrenser én operasjon, ikke hele avhøringen.

Standard er tretti sekunder.

Per operasjon fordi en avhøring som lister en katalog og henter tyve filer gjør tyve-en operasjoner, og en enkelt budsjettert for alle ville avbryte en fullstendig sunn filoverføring.

22.12 Fil kilde

FileSource leser filer fra en katalog denne serveren kan se.

Koble til en nettsted prøver først

En analytiker skriver resultater til en mappe. Et regnskapsystem slipper en batch om natten. Radiologi eksporterer rapporter til en katalog noen monterte for år siden. Ingen av det involverer en protokoll, og en integreringsmotor som ikke kan lese en mappe feiler sin evaluering på den første ettermiddagen.

Definert som FileSource i internal/config.

NøkkelTypeObligatoriskStandard
roottekstja—
follow_symlinkstrue eller falsenei—

22.12.1 rot

Rot begrenser hver sti denne kilden berører.

Required.

Separat fra Dir så at move_to og error_dir kan være relative og likevel være innholdt. Gitt bare Dir, ville en error_dir på "../failed" være utenfor alt kilden hadde fått, og å nekte det ville være arbitrært fordi det ikke ville være noe å nekte det mot.

22.13 GCS kilde

GCSSource plukker opp objekter fra en bucket-prefiks, som s3 og azure_blob-kildene gjør.

Definert som GCSSource i internal/config.

NøkkelTypeObligatoriskStandard
prefixtekstja—
suffixtekstnei—
after_readtekstnei—
move_totekstneiprosessert/
error_prefixtekstneifeil/
poll_intervalvarighet, som 30s eller 5mnei30s
max_object_sizeheltallnei16 MiB
framedtrue eller falsenei—

22.13.1 flytt_til

MoveTo er hvor et behandlet objekt havner når after_read er flytt.

Standard er prosessert/.

22.13.2 feil_prefiks

ErrorPrefix er hvor et objekt som ikke kunne behandles havner.

Standard er feil/.

22.13.3 avhøringsintervall

PollInterval er hvor ofte prefikset listes.

Defaults to 30s.

22.13.4 maks_objektstørrelse

MaxObjectSize lar større objekter være hvor de er.

Standard er 16 MiB.

22.14 HTTP-kilde

HTTP-kilden aksepterer meldinger over HTTP.

En lytter i stedet for en poller: noe poster en melding og får en bekreftelse tilbake, som er hvordan den moderne halvdelen av sykehuset integrerer når MLLP ikke er tilgjengelig for det.

Definert som HTTPSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
pathtekstnei"/"
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—
tokentekstnei—
max_message_sizeheltallnei—
read_timeoutvarighet, som 30s eller 5mnei—
ackAcknei—

22.14.1 lytter

Lytt er adressen som betjenes på.

Required.

22.14.2 path

Sti er URL-stien for å akseptere meldinger på.

Defaults to "/".

22.14.3 token

Token, når det er satt, er påkrevd i en Authorization: Bearer-header.

Det finnes ingen standard og ingen anonym modus-omskifter: en HTTP-endepunkt på et sykehusnettverk med ingen autentisering i det hele tatt er en beslutning som må være synlig i filen, så å la dette være tomt rapporteres som en advarsel ved lasting.

22.14.4 maks_meldingsstørrelse

MaksMeldingsStørrelse begrenser en innkommende kropp.

Null anvender en standard.

22.15 IBMMQ-kilde

IBMMQ-kilden leser en kø.

Definert som IBMMQSource i internal/config.

NøkkelTypeObligatoriskStandard
poll_intervalvarighet, som 30s eller 5mnei2s

22.15.1 avhøringsintervall

PollInterval er ventetiden når køen er tom, eller etter en melding som ikke kunne behandles.

Defaults to 2s.

22.16 JavaScript-kilde

JavaScript-kilden konfigurerer en kilde som kjører et skript på en timer og mater de returnerte meldingene inn i kanalen.

Dette er Mirth "JavaScript-leser"-ekvivalenten.

Skriptet kjører i en goja-VM med samme sandkasse som transformer-skript: msg er ikke tilgjengelig (det er ingen innkommende melding enda), men globalMap, configurationMap, logger og DateUtil er til stede. Skriptet må returnere en streng (en melding) eller en array av strenger (mange). Å returnere ingenting eller en tom array betyr at polling produserte ingen meldinger, som er normalt.

Definert som JavaScriptSource i internal/config.

NøkkelTypeObligatoriskStandard
scripttekstja—
poll_intervalvarighet, som 30s eller 5mnei—
timeoutvarighet, som 30s eller 5mnei—

22.16.1 avhøringsintervall

PollInterval er hvor ofte skriptet kjøres.

Null betyr 5 sekunder.

22.16.2 tidsavbrudd

Timeout begrenser en enkelt skriptkjøring.

Null betyr 30 sekunder.

22.17 Kafka Kilde

KafkaKilde leser meldinger fra et Kafka-tema.

Definert som KafkaSource i internal/config.

NøkkelTypeObligatoriskStandard
brokersliste av tekstja—
topicsliste av tekstja—
grouptekstja—
from_beginningtrue eller falsenei—
commit_after_deliverytrue eller false (en blokk, utelat for å ikke inkludere)nei—
max_message_sizeheltallneikanalens grense
session_timeoutvarighet, som 30s eller 5mneiførtifem sekunder
timeoutvarighet, som 30s eller 5mneitretti sekunder
saslKafkaSASL (en blokk, utelat for å ikke inkludere)nei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—

22.17.1 brokers

Brokers er listen over oppstartstjenere.

Required.

En liste heller enn en enkelt adresse, fordi en enkelt oppstartstjener er en enkelt feilpunkt for oppstart: clusteren overlever å miste den, og denne kanalen ville ikke.

22.17.2 topics

Temaser er temaene som skal leses.

Minst en er påkrevd.

22.17.3 gruppe

Gruppe er forbrukergruppen.

Required.

Navngitt heller enn generert, og påkrevd heller enn standard, fordi det er hva som husker hvor langt denne kanalen har lest. En generert gruppe ville starte fra begynnelsen - eller fra slutten, og miste alt - på hver omstart, og den ville etterlate den gamle gruppen som holder kommittede offset ingen leser. Å kreve det gjør at personen navngir det som må være det samme over omstarter.

22.17.4 from_beginning

FromBeginning leser temaet fra starten når gruppen ikke har noen kommittet offset.

Av som standard, så en ny kanal pekt på et tema med to års historikk ikke spiller av to års pasienthendelser i et live-system på dagen den slås på. Den første personen som treffer det ville gjøre det i produksjon, fordi det er der temaet med historikken er.

22.17.5 commit_after_delivery

CommitAfterDelivery committer offset kun når meldingen har blitt behandlet.

På som standard, og grunnen er hele forskjellen på å miste en melding og å se den to ganger. Å committere på lesing betyr at en kræsj mellom committen og leveringen mister meldingen stille, og ingenting noen steder registrerer at den eksisterte. Å committere etter betyr at en kræsj i samme vindu leverer den på nytt, som er synlig og som HL7-mottakere er bygget for å tåle - en duplikat A08 er en plage og en manglende laboratorie-resultat er en pasientsikkerhetshendelse.

22.17.6 maks_meldingsstørrelse

MaxMessageSize begrenser en enkelt post.

Standarder til kanalens grense.

22.17.7 session_timeout

SessionTimeout angir hvor lenge gruppekoordinatoren venter før den antar at denne forbrukeren er borte og retildeler dens partisjoner.

Standard er førtifem sekunder.

22.17.8 tidsavbrudd

Tidsbegrensninger for å koble til og metadataforespørsler.

Standard er tretti sekunder.

22.18 MQTT Kilde

MQTTSource abonnerer på et emnefilter.

Definert som MQTTSource i internal/config.

NøkkelTypeObligatoriskStandard
topictekstja—
reconnectvarighet, for eksempel 30s eller 5mnei5s

22.18.1 reconnect

Gjenkoble er ventetiden etter en tapt tilkobling eller etter en melding som ikke kunne håndteres.

Defaults to 5s.

22.19 Pub Sub Kilde

PubSubSource henter fra en Pub/Sub-abonnement.

Definert som PubSubSource i internal/config.

NøkkelTypeObligatoriskStandard
subscriptiontekstja—
max_messagesheltallnei10
reconnectvarighet, for eksempel 30s eller 5mnei5s

22.19.1 maks_meldinger

MaxMeldinger er hvor mange som hentes på en gang.

De håndteres likevel en etter en, i rekkefølge. Standard er 10.

22.19.2 reconnect

Gjenkoble er ventetiden etter en feil.

Defaults to 5s.

22.20 S3 Kilde

S3Source plukker opp objekter fra en bucket.

Definert som S3Source i internal/config.

NøkkelTypeObligatoriskStandard
buckettekstja—
path_styletrue eller falsenei—
prefixtekstnei—
suffixtekstnei—
after_readtekstnei—
move_totekstneiprosessert/
error_prefixtekstneifeil/
poll_intervalvarighet, som 30s eller 5mnei30s
max_object_sizeheltallnei16 MiB
framedtrue eller falsenei—

22.20.1 prefiks

Prefiks begrenser hvilke objekter som leses, f.eks. innkommende/.

Tomme lesinger hele bucketen, som avvies med etter_lesing: flytt med mindre flytt_til er utenfor den - ellers ville flyttede objekter bli lest igjen.

22.20.2 etter_lesing

AfterRead flyttes (standard) eller sletter.

Det finnes ingen lagring: en bucket har ingen fil en poller kan huske å ha sett over en omstart, så å låte objektene være betyr å lese dem alle på nytt hver gang Perfuse starter.

22.20.3 flytt_til

MoveTo er prefikset et behandlet objekt flyttes til.

Standard er prosessert/.

22.20.4 feil_prefiks

ErrorPrefix er hvor et objekt som ikke kunne behandles flyttes, så én feil fil ikke blokkerer resten.

Standard er feil/.

22.20.5 avhøringsintervall

Avhøringsintervall mellom listinger.

Defaults to 30s.

22.20.6 maks_objektstørrelse

MaxObjectSize avviser alt som er større.

Standard er 16 MiB.

22.20.7 rammet

Framed leser flere MLLP-rammede meldinger fra ett objekt.

Ellers er et objekt én melding.

22.21 SFTP-kilde

SFTPSource samler meldinger fra en mappe på en SFTP-tjener.

Ekstremt vanlig og sjelden diskutert. Et laboratorium eller et radiologisystem skriver en fil hver få minutter, en SFTP-tjener holder den, og noe må komme og hente den. Halvparten av feedene beskrevet som "vi sender deg HL7" er dette.

Delen som er verdt å bry seg om er ikke overføringen. Det er at en fil som skrives til og en fil som er ferdig skrevet til ser identiske ut over SFTP, så en poll som er bare litt for ivrig samler en halv melding. Dette produserer en avkortet, men ofte parsbar HL7-melding, som er det verste utfallet tilgjengelig: den aksepteres, bekreftes, lagres og leveres, og den manglende halvdelen nevnes aldri igjen.

Definert som SFTPSource i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja22
usertekstja—
passwordtekstnei—
key_filetekstnei—
key_passphrasetekstnei—
known_hosts_filetekstnei—
insecure_skip_host_key_checktrue eller falsenei—
dirtekstja—
patterntekstneialt
poll_intervalvarighet, som 30s eller 5mnei—
after_readtekstnei—
move_totekstnei—
error_dirtekstnei—
stable_forvarighet, som 30s eller 5mnei5s
framedtrue eller falsenei—
max_file_sizeheltallnei64MB
timeoutvarighet, som 30s eller 5mnei60s

22.21.1 vert

Verten er serveren, med en valgfri port.

Defaults to 22.

22.21.2 passord

Passord autentiserer med et passord.

Prefer KeyFile.

22.21.3 key_file

KeyFile er en privat nøkkel.

Det bedre valget, og det sykehusets sikkerhetsteam ber om.

22.21.4 known_hosts_file

KnownHostsFile verifiserer tjenerens identitet.

Obligatorisk med mindre InsecureSkipHostKeyCheck er satt. Uten det er det ingen måte å skille den ekte tjeneren fra noe som svarer på den adressen, og legitimasjonen overføres før noen merker det.

22.21.5 insecure_skip_host_key_check

InsecureSkipHostKeyCheck aksepterer alle hostnøkler.

Eksisterer fordi å avvise rett ut sender folk til en shell-skript med StrictHostKeyChecking=no, som er dårligere på alle måter, inkludert overvåkbarhet. Den advarer høyt og er aldri standard.

22.21.6 mønster

Mønster velger filer etter glob.

Standard er alt.

22.21.7 flytt_til

MoveTo er den fjernkatalogen filene flyttes til etter lesing.

Kreves når AfterRead er "flytt".

22.21.8 stabil_for

StabilFor er hvor lenge en fils størrelse og endringsdato må være uendret før den leses.

Defaults to 5s.

Dette er innstillingen som forhindrer at halve meldingen samles inn. Null betyr lesing av hva som helst som er der, noe som fungerer helt til en fil er stor nok eller et nettverk langsomt nok til at skriving tar lengre tid enn en avhøring.

22.21.9 rammet

Framed sier at filen inneholder MLLP-rammede meldinger.

Når false, deles filen på MSH-grenser.

22.21.10 maks_filstørrelse

MaksFilstørrelse avviser en fil større enn denne mengden bytes.

Standard er 64MB.

22.21.11 tidsavbrudd

Tidsavbrudd begrenser en enkelt tilkobling.

Defaults to 60s.

22.22 SMB kilde

SMBKilde samler inn filer fra en Windows-fildeling.

Definert som SMBSource i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja—
sharetekstja—
usertekstnei—
passwordtekstnei—
domaintekstnei—
roottekstnei—
timeoutvarighet, som 30s eller 5mneitretti sekunder

22.22.1 vert

Verten er serveren, med en valgfri port.

Port 445 antas.

22.22.2 delt

Delt er delt navn kun: "data" i \\\server\data.

En sti her avvises i stedet for å kuttes.

22.22.3 bruker

Bruker og Passord er Windows-kontoen.

Kreves i praksis.

En delt som er tilgjengelig uten noen legitimasjon i det hele tatt er sjelden nok på et domene at en tom bruker her sannsynligvis er en feil enn en gjest-delt - men den er akseptert, fordi å avvise den ville blokkere den ene ordningen hvor det er riktig. Hvor kontoen tilhører et domene, sett Domene også: å autentisere en domenekonto uten det feiler på en måte som ligner et feil passord.

22.22.4 passord

Bruker og Passord er Windows-kontoen.

Kreves i praksis.

En delt som er tilgjengelig uten noen legitimasjon i det hele tatt er sjelden nok på et domene at en tom bruker her sannsynligvis er en feil enn en gjest-delt - men den er akseptert, fordi å avvise den ville blokkere den ene ordningen hvor det er riktig. Hvor kontoen tilhører et domene, sett Domene også: å autentisere en domenekonto uten det feiler på en måte som ligner et feil passord.

22.22.5 domene

Domene er Windows-domene eller arbeidsgruppe.

Tomt er vanligvis riktig for en lokal konto.

22.22.6 tidsavbrudd

Tidsavbrudd begrenser én operasjon.

Standard er tretti sekunder.

Verdt å øke på en ressurs som nås over en nettverkskobling. En SMB-operasjon mot en fjern server er langsommere enn samme operasjon lokalt, så mye at en standardinnstilling tilpasset et lokalt nettverk produserer tidsavbrudd som ser ut som om ressursen er utilgjengelig.

22.23 SOAP-kilde

SOAP-kilde aksepterer meldinger innkapslet i en SOAP-omslag.

Motstykket til SOAP-destinasjon, og den mindre vanlige retningen: de fleste sykehusintegrasjoner har Perfuse som kaller en tjeneste i stedet for å være en. Den eksisterer fordi Mirths Web Service Listener gjør det, og et sted hvor sendesystemet bare snakker SOAP ikke kan migrere uten det.

Bevisst ikke et generelt rammeverk for webbtjenester. Den aksepterer en omslag, tar meldingen ut av den og svarer med en omslag. Det finnes ingen WS-Security, ingen MTOM, ingen WS-Addressing og ingen genererte bindings - samme utelatelser som destinasjonen, av samme grunn: en halvimplementasjon av WS-Security er verre enn ingen.

Definert som SOAPSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
profiletekstnei—
pathtekstnei"/"
versiontekstnei1
elementtekstnei—
base64true eller falsenei—
response_elementtekstnei"AckResponse"
response_namespacetekstnei—
wsdltekstnei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—
tokentekstnei—
usernametekstnei—
passwordtekstnei—
max_message_sizeheltallnei—
read_timeoutvarighet, som 30s eller 5mnei—
ackAcknei—
fault_on_naktrue eller falsenei—

22.23.1 lytter

Lytt er adressen som betjenes på.

Required.

22.23.2 profil

Profilnavn angir en standardtjeneste denne endepunktet implementerer.

Tomt aksepterer enhver omslag som konfigurasjonen under angir.

"cdc-iis" svarer som et immunisasjonsregister gjør, på CDC-grensesnittet (urn:cdc:iisb:2011): connectivityTest blir gjentatt, submitSingleMessage's hl7Message er meldingen og kanalens bekreftelse går tilbake i retur, WSDL blir betjent på ?wsdl, og brukernavn og passord, når de er angitt, blir sjekket mot de i body-en (der WSDL plasserer dem) i stedet for mot HTTP-autentisering. For et registerts test-dobbeltgjenger, eller for et sted som mottar innsendinger på samme måte som registre gjør.

22.23.3 path

Sti er URL-stien for å akseptere omslag på.

Defaults to "/".

22.23.4 versjon

Versjon er SOAP-versjonen som skal svares i, "1.1" eller "1.2".

Defaults to 1.1.

Forespørsler aksepteres i begge versjoner uansett, fordi en avsender som får dette feil er vanlig og å avvise det lærer ingen noe. Innstillingen kontrollerer svaret, der å få det feil betyr at avsenderen ikke kan lese svaret.

22.23.5 element

Elementnavn angir elementet inne i SOAP-Body som inneholder meldingen.

Tomt betyr hele body-teksten.

Navngitt i stedet for å gjette, fordi en body kan bære flere elementer - en melding sammen med en avsenders identifikator og en tidsstempel - og å ta hele body-en ville gi motoren en XML-fragment der den forventet HL7.

22.23.6 base64

Base64 dekoderer elementets innhold før det behandles som en melding.

Vanlig i virkelige tjenester, fordi HL7 inneholder vekslinger og avsendere som ikke tenkte på det ender opp med XML som mangler dem. Hvis innholdet dekodes som base64, men ikke var ment å være det, er resultatet ikke en melding og motoren sier det - som er hvorfor dette er eksplisitt i stedet for å lukkes.

22.23.7 svar_element

ResponseElement navner elementet som omgir bekreftelsen i svaret.

Standard er "AckResponse".

22.23.8 wsdl

WSDL er en fil som betjenes på lytterstien med ?wsdl.

Tomt betyr at ingen betjenes.

En fil heller enn noe generert. En generert WSDL ville beskrive hva denne endpointen aksepterer, som nesten aldri er det systemet som sender var bygget mot - og en WSDL som er nesten riktig koster mer tid enn ingen WSDL i det hele tatt, fordi den ser autoritativ ut.

22.23.9 brukernavn

Brukernavn og Passord, når de er satt, krever HTTP-basert autentisering.

Tilbudt sammen med en token fordi SOAP-kallere overveldende forventer basisk autentisering, og en nettside hvis sendesystem ikke kan endres, trenger valget det allerede har.

22.23.10 passord

Brukernavn og Passord, når de er satt, krever HTTP-basert autentisering.

Tilbudt sammen med en token fordi SOAP-kallere overveldende forventer basisk autentisering, og en nettside hvis sendesystem ikke kan endres, trenger valget det allerede har.

22.23.11 maks_meldingsstørrelse

MaksMeldingsStørrelse begrenser en innkommende kropp.

Null anvender en standard.

22.23.12 feil_på_nak

FaultOnNak svarer på en negativ bekreftelse med en SOAP-feil i stedet for et normalt svar som bærer NAK.

Av ved standard, som er riktig standard og verdt å forklare. HL7 har allerede en måte å si "Jeg mottok dette og avviste det", og det er en NAK - en vellykket utveksling som rapporterer et avvist melding. Å omdanne det samme til en transportfeil forteller avsenderen at dens forespørsel var ugyldig, noe den ikke var, og mange klienter responderer med å prøve på nytt for evig.

Den eksisterer fordi noen kallere bare ser på HTTP-statusen og ellers ville behandle en avvisning som suksess.

22.24 SQS-kilde

SQSSource leser fra en SQS-kø.

En melding slettes bare etter at kanalen har behandlet den - levert, eller filtrert, eller feilet på en måte kanalen registrerer. Inntil da forblir den i køen, usynlig for visibility_timeout, og kommer tilbake hvis Perfuse stopper. Så en melding går aldri tapt; prisen er at en kan ankomme to ganger, noe SQS selv allerede tillater.

Definert som SQSSource i internal/config.

NøkkelTypeObligatoriskStandard
queue_urltekstja—
wait_secondshelt tallnei20: en tom kø kostar en forespørsel hver tyvende sekund
max_messageshelt tallnei10
visibility_timeoutvarighet, som 30s eller 5mneikøens egen innstilling

22.24.1 synlighetstid

VisibilityTimeout er hvor lenge en mottatt melding forblir skjult mens den behandles.

Standard er køens egen innstilling.

22.25 Seriel kilde

SerialSource leser meldinger fra en serieport.

Hvorfor en seriekonnektor i 2026

Fordi utstyret fortsatt er der. En blodgassanalyser kjøpt i 2009 med en fungerende sensor og en 25-pins kontakter, en sengemonitor, en vekt i en dialyseenhet, en eldre anestesimaskin. Ingen av dem vil noen gang få en Ethernet-port, flere av dem koster seks sifre, og alternativet til å lese dem er at noen skriver inn resultater i en skjema.

Mirth har en seriekobling. Perfuse hadde ingenting, og en nettside med en av disse hadde ingen rute innoverhodet.

Ramming deles med TCP-koblingen

Rammingene er de samme uansett hvor byte kommer fra: en analyzer som snakker STX/ETX over en socket snakker STX/ETX over en kabel. Så denne gjenbruker TCP-rammingsblokken i stedet for å definere sin egen, noe som også betyr at en enhet flyttet fra en seriekabel til en serie-til-Ethernet-adapter beholder sin rammingkonfigurasjon.

Hva er forskjellig om en seriekobling

Det finnes ingen kobling. En socket forteller deg når peeren gikk bort; en kabel gjør ikke det. En frakoblet kabel, en enhet slått av og en enhet med ingenting å si er ikke å skille - alle tre er stillhet. Det er derfor quiet_after eksisterer: uten noe å si «denne linjen har vært stille i lengre tid enn den burde være», ser en død feed ut akkurat som en stille natt.

Definert som SerialSource i internal/config.

NøkkelTypeObligatoriskStandard
porttekstja—
baudheltallja—
data_bitsheltallnei8
paritytekstneinone
stop_bitstekstnei1
flow_controltekstneinone
max_message_sizeheltallnei—
quiet_aftervarighet, som 30s eller 5mnei—
replytekstnei—
reply_texttekstnei—
reopen_aftervarighet, som 30s eller 5mnei—

22.25.1 baud

Baud er hastigheten.

Obligatorisk, fordi å gjette produserer bytes i stedet for en feil.

En feil baudhastighet feiler ikke. Den leverer plausibelt utseende skrald: rammebytes dukker opp tilfeldig, og en lenient parser aksepterer noe av det. Det er med vilje ingen standard.

22.25.2 parity

Paritet er none, odd, even, mark eller space.

Standard er none.

22.25.3 stop_bits

StopBits er 1, 1,5 eller 2, skrevet som «1», «1,5» eller «2».

Defaults to 1.

22.25.4 flow_control

FlowControl er none, hardware eller software.

Standard er none.

Verdt å sette korrekt i stedet for å la det stå. Med forventet hardware flow control og ikke konfigurert, stopper en enhet å sende midtveis i en lang melding og resultatet er en forkortet melding i stedet for en feil.

22.25.5 quiet_after

QuietAfter logger en advarsel når ingenting har blitt mottatt i så lenge.

Den eneste måten å merke en død seriekobling på. En frakoblet kabel og en stille natt er den samme stillheten, så noen må si hvor lenge er for lenge for denne enheten.

22.25.6 reopen_after

ReopenAfter er hvor lenge å vente før å gjenåpne en port som feilet.

En USB-seriekobling frakoblet og tilkoblet igjen kommer tilbake som samme enhetssti, men en annen kernelhåndtering, så den gamle returnerer feil for alltid. Gjenåpning er den eneste gjenopprettingen, og å gjøre det i en tett løkke fyller loggen.

22.26 Kilde

Kilde er der en kanal mottar meldinger.

Definert som Source i internal/config.

NøkkelTypeObligatoriskStandard
typeSourceTypeja—
listentekstja—
max_message_sizeheltallnei—
idle_timeoutvarighet, som 30s eller 5mnei—
max_connectionsheltallnei—
tlstlsconf.Settings (en blokk, utelat hvis den ikke skal brukes)nei—
httpHTTPSource (en blokk, utelat hvis den ikke skal brukes)nei—
soapSOAPSource (en blokk, utelat hvis den ikke skal brukes)nei—
dicomwebDICOMwebSource (en blokk, utelat hvis den ikke skal brukes)nei—
directDirectSource (en blokk, utelat hvis den ikke skal brukes)nei—
dicomDICOMSource (en blokk, utelat hvis den ikke skal brukes)nei—
fileFileSource (en blokk, utelat hvis den ikke skal brukes)nei—
tcpTCPSource (en blokk, utelat hvis den ikke skal brukes)nei—
ftpFTPSource (en blokk, utelat hvis den ikke skal brukes)nei—
smbSMBSource (en blokk, utelat hvis den ikke skal brukes)nei—
webdavWebDAVSource (en blokk, utelat hvis den ikke skal brukes)nei—
serialSerialSource (en blokk, utelat hvis den ikke skal brukes)nei—
dicom_queryDICOMQuerySource (en blokk, utelat hvis den ikke skal brukes)nei—
brokerBrokerSource (en blokk, utelat hvis den ikke skal brukes)nei—
kafkaKafkaSource (en blokk, utelat hvis den ikke skal brukes)nei—
sqsSQSSource (en blokk, utelat hvis den ikke skal brukes)nei—
s3S3Source (en blokk, utelat hvis den ikke skal brukes)nei—
amqpAMQPSource (en blokk, utelat hvis den ikke skal brukes)nei—
azure_blobAzureBlobSource (en blokk, utelat hvis den ikke skal brukes)nei—
emailEmailSource (en blokk, utelat hvis den ikke skal brukes)nei—
as2AS2Source (en blokk, utelat hvis den ikke skal brukes)nei—
pgpPGPReceive (en blokk, utelat hvis den ikke skal brukes)nei—
mqttMQTTSource (en blokk, utelat hvis den ikke skal brukes)nei—
ibm_mqIBMMQSource (en blokk, utelat hvis den ikke skal brukes)nei—
pubsubPubSubSource (en blokk, utelat hvis den ikke skal brukes)nei—
gcsGCSSource (en blokk, utelat hvis den ikke skal brukes)nei—
databaseDatabaseSource (en blokk, utelat hvis den ikke skal brukes)nei—
sftpSFTPSource (en blokk, utelat hvis den ikke skal brukes)nei—
javascriptJavaScriptSource (en blokk, utelat hvis den ikke skal brukes)nei—
ackAcknei—

22.26.1 type

Type er transporten.

Kun mllp er implementert.

22.26.2 maks_meldingsstørrelse

MaxMessageSize setter en grense for en innkommende melding.

Null bruker transportens standardverdi.

22.26.3 idle_timeout

IdleTimeout lukker en forbindelse som har vært stille i denne tiden.

Null betyr aldri, noe som vanligvis er riktig: et sykehusfeed holder en forbindelse åpen i måneder og går stille over natten.

22.26.4 max_connections

MaxConnections setter en grense for samtidige forbindelser.

Null betyr ubegrenset.

22.27 TCP-kilde

TCP-kilden lytter på en socket for meldinger som ikke nødvendigvis er HL7.

Hvorfor dette er separat fra en mllp-kilde

MLLP er én ramme og Perfuse har alltid snakket det. Mye utstyr gjør ikke det: et laboratoriumsanalyseapparat, en vekt, en sengemonitor, et eldre fakturasystem. Hver av dem har sin egen konvensjon, og Mirths TCP-connector dekker alle disse, så et sted med en socketfeed som ikke var HL7 kunne ikke bruke Perfuse i det hele tatt.

Definert som TCPSource i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
max_message_sizeheltallnei—
idle_timeoutvarighet, som 30s eller 5mnei—
max_connectionsheltallnei—
replytekstnei—
reply_texttekstnei—
tlstlsconf.Settings (en blokk, utelat hvis den ikke skal brukes)nei—

22.27.1 idle_timeout

IdleTimeout lukker en forbindelse som har vært stille i denne tiden.

Null betyr aldri, noe som vanligvis er riktig: en enhetsfeed holder en forbindelse åpen i måneder og går stille over natten.

22.27.2 max_connections

MaxConnections setter en grense for samtidige forbindelser.

Null betyr ubegrenset.

22.27.3 reply

Svar er hva som skal sendes tilbake etter hver melding: ingenting, ack eller en fast streng.

De fleste råfeed forventer ingenting. Noen forventer en enkelt ACK-bayt. En enhet som forventer et svar og ikke får det, gjentar vanligvis den samme meldingen for alltid, så dette er verdt å være eksplisitt om.

22.28 Web DAV-kilde

WebDAVSource samler filer fra en WebDAV-samling.

Hvor dette dukker opp: dokumenthåndteringssystemer, SharePoint, Nextcloud og leverandørportaler som eksponerer en droppe-mappe over HTTPS fordi det er den eneste utgående porten deres kunderes brannmur tillater.

Definert som WebDAVSource i internal/config.

NøkkelTypeObligatoriskStandard
urltekstja—
usertekstnei—
passwordtekstnei—
insecure_skip_verifytrue eller falsenei—
timeoutvarighet, som 30s eller 5mneiseksti sekunder

22.28.1 bruker

Bruker og Passord autentiserer med HTTP-basisk autentisering.

Basisautentisering sender passordet i en header som bare er beskyttet av TLS, så disse hører sammen med en https-URL. Over http er de lesbar av alt på veien, og ingen advarsel fra serveren vil fortelle deg det.

22.28.2 passord

Bruker og Passord autentiserer med HTTP-basisk autentisering.

Basisautentisering sender passordet i en header som bare er beskyttet av TLS, så disse hører sammen med en https-URL. Over http er de lesbar av alt på veien, og ingen advarsel fra serveren vil fortelle deg det.

22.28.3 tidsavbrudd

Timeout begrenser én forespørsel.

Standard er seksti sekunder.

Lenger enn FTP- og SMB-standarder med vilje. En WebDAV-samlingliste er en enkelt PROPFIND som serveren kan bruke lang tid på å samle inn for en stor mappe, og det finnes ingen delvis resultat å falte tilbake på.

23 Destinasjonsreferanse

Hver måte en kanal kan sende meldinger, og hver nøkkel hver enkelt aksepterer. En kanal kan ha flere destinasjoner, og de er uavhengige: en feil hindrer ikke de andre.

23.1 AMQP-destinasjon

AMQPDestination sender til en kø eller et emne, og rapporterer suksess bare én gang brokeren har akseptert meldingen.

Definert som AMQPDestination i internal/config.

NøkkelTypeObligatoriskStandard
content_typetekstneikanalens data type

23.1.1 innholdstype

Innholdstype sendes med hver melding.

Standard er kanalens datatype.

23.2 AS2-destinasjon

AS2Destination sender hver melding som AS2: signert med vår nøkkel, kryptert til partnerens sertifikat, postet til partnerens URL og, som standard, levert bare én gang partnerens signerte kvittering navngir samme digest.

Definert som AS2Destination i internal/config.

NøkkelTypeObligatoriskStandard
urltekstja—
fromtekstja—
totekstja—
cert_filetekstnei—
key_filetekstnei—
partner_cert_filetekstnei—
unsignedtrue eller falsenei—
unencryptedtrue eller falsenei—
compresstrue eller falsenei—
receipttekstnei—
unsigned_receipttrue eller falsenei—
receipt_urltekstnei—
content_typetekstnei—
file_nametekstnei—
subjecttekstnei—
usernametekstnei—
passwordtekstnei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—

23.2.1 kompres

Kompres komprimerer nyttelasten (zlib, RFC 5402) før signing og kryptering.

Hver AS2-mottaker som annonserer versjon 1.1 eller senere leser det; spør partneren før du slår det på.

23.2.2 unsigned_receipt

UnsignedReceipt ber om en kvittering som ikke er signert.

Av: en signert kvittering blir bedt om, og en usignert kvittering avvist.

23.2.3 innholdstype

ContentType er MIME-typen til payloaden.

Standard er kanalens datatyppe: application/edi-x12, application/edifact, application/hl7-v2, ellers application/octet-stream.

23.3 Azure Blob Destinasjon

AzureBlobDestination skriver hver melding som en blokk-blob.

Definert som AzureBlobDestination i internal/config.

NøkkelTypeObligatoriskStandard
blobtekstnei${date}/${channel}/${control_id}
tiertekstnei—
content_typetekstnei—

23.3.1 blob

Blob navngir hver blob, med S3-destinasjonens placeholders.

Standard er ${date}/${channel}/${control_id}.hl7.

23.3.2 tier

Tier er Hot, Cool, Cold eller Arkiv.

Arkiv er offline: å lese en blob tilbake innebærer å gjenopprette den, som tar timer.

23.4 Meldingsformidler Destinasjon

BrokerDestination publiserer meldinger til en meldingsformidler.

Mirths JMS-Writer.

Definert som BrokerDestination i internal/config.

NøkkelTypeObligatoriskStandard
addrtekstja—
destinationtekstja—
logintekstnei—
passcodetekstnei—
hosttekstneiadressens vert
content_typetekstneitext/plain for HL7
headersmapping av tekst til tekstnei—
persistenttrue eller false (en blokk, utelat for å la det stå)neitrue
timeoutvarighet, som 30s eller 5mnei—
tlstlsconf.Settings (en blokk, utelat for å la det stå)nei—

23.4.1 adresse

Addr er vertens host og port.

Required.

23.4.2 mottaker

Destinasjon er køen eller emnet som publiseres til.

Required.

23.4.3 logg inn

Logg inn og passord autentiserer.

De fleste mellomleddene avviser en anonym tilkobling.

23.4.4 passord

Logg inn og passord autentiserer.

De fleste mellomleddene avviser en anonym tilkobling.

23.4.5 vert

Vert er den virtuelle verten.

Standard er adressens vert.

Verdt å sette eksplisitt på en meldingsformidler som har flere virtuelle vertsnavn, hvor standarden lander publiseringen på hvilket som helst som svarer til serverens eget navn - en kø som eksisterer, aksepterer meldingen og leses av ingen.

23.4.6 innholdstype

Innholdstype sendes med hver melding.

Standard er text/plain for HL7.

23.4.7 headers

Headere sendes med hver melding.

Konfigurasjon bare, aldri meldingsinnhold. En header hentet fra et felt ville plassere en pasientidentifikator i brokermetadata som logges, indekseres og er synlig for alle andre applikasjoner på køen.

23.4.8 varig

Varig ber brokeren om å overleve en omstart.

Standard er true.

True fordi en ikke-varig melding går tapt når brokeren restartes, og det er ikke et rimelig standard for kliniske data. False eksisterer for en virkelig midlertidig strøm - en overvåkingspuls - og må velges.

23.5 CDA Destinasjon

CDADestinasjon konfigurerer en cda-destinasjon: den konverterer det kliniske dokumentet som er inne i et HL7 v2-melding, og skriver eller posterer resultatet.

Dette eksisterer fordi et dokument nesten aldri ankommer på egen hånd. Det ankommer base64-kodet inne i en MDM^T02, og hver motor som behandler meldingen som en gjennomsiktig blob lar dokumentet forbli ulest. Å eie begge ender av det er poenget.

Definert som CDADestination i internal/config.

NøkkelTypeObligatoriskStandard
urltekstnei—
dirtekstnei—
writetekstnei—
versiontekstneiR5
identifier_systemsmapping av tekst til tekstnei—
require_agreementtrue eller falsenei—
on_no_documenttekstnei—
headersmapping av tekst til tekstnei—
bearer_tokentekstnei—

23.5.1 url

URL er en FHIR-server som poster den konverterte pakken til.

La det være tomt for å skrive til Dir i stedet. En av de to er obligatorisk.

23.5.2 dir

Dir skriver utdata til filer i stedet for å poste det.

Nyttig for en landingssone en annen prosess plukker opp, og for å se hva konvertering produserer før det pekes mot en live-server.

23.5.3 skriv

Skriv velger hva som skrives eller postes:

fhir den konverterte transaksjonsbunten (standard) dokumenter det opprinnelige dokumentets byte, uendret både begge, med dokumentet ved siden av bunten overfør en PACIO-overgang av omsorgsovergangssammendrag: ett FHIR R4-dokumentbunt for stedet pasienten går til neste (et sykehjem, en rehabiliteringsenhet, hjemmepleie), postet til url/Bundle eller skrevet til dir

"dokument" er verdt å ha på egen hånd: en sted som ønsker sine CDAs på disk for en registreringsgruppe trenger ikke FHIR-konverteringen i det hele tatt.

23.5.4 identifikasjonssystemer

Identifikasjonssystemer mapper en OID-rot fra dokumentet til en URI, så en MRN blir navngitt.

En CDA identifiserer personer med OID og FHIR med URI, og ingenting kan avlede en fra den andre.

23.5.5 krever_avtale

KreverAvtale nekter et dokument hvis fortelling og kodet innhold motsier hverandre.

Av på standard, og med vilje. Kontrollen er verdifull, men det er en vurdering om et dokument noen andre har laget, og en kanal som stille droppe sanne kliniske dokumenter fordi en senders C-CDA-genererator er sløv, er verre enn en som sender dem videre med en advarsel. En nettsted som har sett på sine egne funn og bestemt seg for at de ønsker porten, kan aktivere den.

23.5.6 on_no_document

OnNoDocument bestemmer hva som skjer når meldingen ikke inneholder noen klinisk dokument:

hopp over lever ingen ting og rapporter suksess (standard) feil behandle det som en leveringsfeil

Standard er hopp over, fordi en kanal som bærer en blandet ADT- og MDM-matning ellers ville feile hver adgang. En kanal dedikert til dokumenter bør sette feil, siden en dokumentmelding uten dokument i det er et reelt problem hos avsenderen.

23.5.7 bearer_token

BearerToken sendes som en Authorization-header.

Foretrekk en miljøvariabelreferanse over en bokstav i en fil som går inn i git.

23.6 Kanaldestinasjon

Kanaldestinasjon ruter til en annen kanal på samme server.

Definert som ChannelDestination i internal/config.

NøkkelTypeObligatoriskStandard
nametekstja—

23.7 DICOM-destinasjon

DICOMDestination sender bildeobjekter som en C-STORE-tjenesteklassebruker.

Mirth kaller dette DICOM-avsenderen.

Definert som DICOMDestination i internal/config.

NøkkelTypeObligatoriskStandard
addresstekstja—
called_aetekstnei—
calling_aetekstnei—
transfer_syntaxesliste over tekstnei—
timeoutvarighet, som 30s eller 5mnei—
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—

23.7.1 adresse

Adresse er den fjerne verten og porten.

Required.

23.7.2 called_ae

KaltAE er hva den fjerne kalles, og RingendeAE hva denne enden kalles.

Begge måtte. Nettsteder konfigurerer en PACS til å akseptere en bestemt ringende tittel og avvise alt annet, så en mismatch er den vanligste årsaken til at en første tilkobling feiler - og feilen ser ut som et nettverksproblem.

23.7.3 calling_ae

KaltAE er hva den fjerne kalles, og RingendeAE hva denne enden kalles.

Begge måtte. Nettsteder konfigurerer en PACS til å akseptere en bestemt ringende tittel og avvise alt annet, så en mismatch er den vanligste årsaken til at en første tilkobling feiler - og feilen ser ut som et nettverksproblem.

23.7.4 transfer_syntaxes

OverføringsSyntax begrenser hva som tilbys, i preferanseorden.

Tomt tilbyr objektets egen kodning og deretter implisitt VR liten endian som en reserve.

23.7.5 tidsavbrudd

Tidsbegrensning begrenser en enkelt lagringsoperasjon.

Null anvender en standard.

23.8 DICO Mweb-destinasjon

DICOMwebDestination lagrer hvert objekt med STOW-RS.

Definert som DICOMwebDestination i internal/config.

NøkkelTypeObligatoriskStandard
urltekstja—
tokentekstnei—
usernametekstnei—
passwordtekstnei—
headersmapping av tekst til tekstnei—
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—
timeoutvarighet, som 30s eller 5mnei—

23.9 Database-destinasjon

DatabaseDestination skriver hver melding til en database.

Definert som DatabaseDestination i internal/config.

NøkkelTypeObligatoriskStandard
drivertekstja—
dsntekstja—
statementtekstja—
paramsliste av tekstnei—
timeoutvarighet, som 30s eller 5mnei30s
max_open_connsheltallnei4

23.9.1 sjåfør

Sjåfør navngir databasen.

See SupportedDrivers.

23.9.2 uttrykk

Uttrykket kjøres én gang per melding, med Params bundet til det i rekkefølge.

Pladholdere er driverens egne: $1 for postgres, ? for mysql og sqlite, @p1 for sqlserver. Perfuse omskriver dem ikke, fordi et omformingssjikt som fikk en pladholder feil ville binde en pasients navn til feil kolonne og resultatet ville se ut som gyldig data.

23.9.3 params

Params er HL7-paths eller ${...}-uttrykk, bundet til uttrykket i rekkefølge.

Verdier er alltid bundet som parametre og aldri interpolert inn i SQL. Det handler ikke bare om injeksjon: O'Brien er et vanlig navn, og en sammenføyet spørring bryter på apostrofen.

23.9.4 tidsavbrudd

Timeout begrenser én enkelt uttalelse.

Defaults to 30s.

23.9.5 max_open_conns

MaxOpenConns begrenser bassenget.

Defaults to 4.

23.10 Destinasjon

Destinasjon er ett sted en kanal sender meldinger.

Definert som Destination i internal/config.

NøkkelTypeObligatoriskStandard
nametekstja—
typeDestinationTypeja—
enabledtrue eller false (en blokk, utelat hvis den ikke skal være med)nei—
filtertekstnei—
addresstekstnei—
dirtekstnei—
file_nametekstnei—
temp_suffixtekstnei"
appendtrue eller falsenei—
retain_hoursheltallnei—
tlstlsconf.Settings (en blokk, utelat hvis den ikke skal være med)nei—
fhirFHIRDestination (en blokk, utelat hvis den ikke skal være med)nei—
cdaCDADestination (en blokk, utelat hvis den ikke skal være med)nei—
httpHTTPDestination (en blokk, utelat hvis den ikke skal være med)nei—
databaseDatabaseDestination (en blokk, utelat hvis den ikke skal være med)nei—
sftpSFTPDestination (en blokk, utelat hvis den ikke skal være med)nei—
tcpTCPDest (en blokk, utelat hvis den ikke skal være med)nei—
smtpSMTPDestination (en blokk, utelat hvis den ikke skal være med)nei—
channelChannelDestination (en blokk, utelat hvis den ikke skal være med)nei—
s3S3Destination (en blokk, utelat hvis den ikke skal være med)nei—
ftpFTPDestination (en blokk, utelat hvis den ikke skal være med)nei—
documentDocumentDestination (en blokk, utelat hvis den ikke skal være med)nei—
soapSOAPDestination (en blokk, utelat hvis den ikke skal være med)nei—
dicomwebDICOMwebDestination (en blokk, utelat hvis den ikke skal være med)nei—
xdsXDSDestination (en blokk, utelat hvis den ikke skal være med)nei—
directDirectDestination (en blokk, utelat hvis den ikke skal være med)nei—
as2AS2Destination (en blokk, utelat hvis den ikke skal være med)nei—
mpiMPIDestination (en blokk, utelat hvis den ikke skal være med)nei—
tefcaTEFCADestination (en blokk, utelat hvis den ikke skal være med)nei—
pasPASDestination (en blokk, utelat hvis den ikke skal være med)nei—
x12_astekstnei—
dicomDICOMDestination (en blokk, utelat hvis den ikke skal være med)nei—
javascriptJavaScriptDestination (en blokk, utelat hvis den ikke skal være med)nei—
brokerBrokerDestination (en blokk, utelat hvis den ikke skal være med)nei—
kafkaKafkaDestination (en blokk, utelat hvis den ikke skal være med)nei—
sqsSQSDestination (en blokk, utelat hvis den ikke skal være med)nei—
snsSNSDestination (en blokk, utelat hvis den ikke skal være med)nei—
amqpAMQPDestination (en blokk, utelat hvis den ikke skal være med)nei—
azure_blobAzureBlobDestination (en blokk, utelat hvis den ikke skal være med)nei—
mqttMQTTDestination (en blokk, utelat hvis den ikke skal være med)nei—
ibm_mqIBMMQDestination (en blokk, utelat hvis den ikke skal være med)nei—
pubsubPubSubDestination (en blokk, utelat hvis den ikke skal være med)nei—
gcsGCSDestination (en blokk, utelat hvis den ikke skal være med)nei—
elrELRDestination (en blokk, utelat hvis den ikke skal være med)nei—
pgpPGPSend (en blokk, utelat hvis den ikke skal være med)nei—
response_transformertekstnei—
timeoutvarighet, for eksempel 30s eller 5mnei—
retryRetrynei—
queueQueueConfig (en blokk, utelat hvis den ikke skal være med)nei—

23.10.1 navn

Navn identifiserer destinasjonen i logger og målinger.

Kreves innenfor en kanal.

23.10.2 file_name

Filnavn, for en fildestinasjon, oppretter én fil per melding (${timestamp}, ${date}, ${control_id}, ${message_type}, ${destination}).

Tom holder standarden: én fil per dag og meldingstype, lagt til.

23.10.3 temp_suffix

TempSuffix er navnet en per-meldingsfil har mens den skrives, fjernet ved en omdøping når den er fullført, så hva som enn samler inn filene, leser aldri halvparten av en.

Standard er ".part".

23.10.4 retain_hours

RetainHours sletter filer i Dir eldre enn dette.

Null holder dem for alltid.

23.10.5 x12_as

X12As er xml for en destinasjon på en X12-kanal som mottar interchange som Mirth Connect og Open Integration Engine skriver for X12, for en mottaker bygget mot hva Mirth sendte det.

Tom eller x12 sender X12.

23.10.6 elr

ELR gjør denne til en offentlig helse laboratorierapportering destinasjon: hver laboratorie resultat (ORU^R01) omformes til en ELR 2.5.1-melding som bare holder de bestillingene med et rapporterbar resultat, og det er det som leveres; en melding med ingenting rapporterbar sendes ikke i det hele tatt.

Gjelder for destinasjoner som leverer en HL7 v2-melding slik den er (mllp, http, fil, sftp og resten), på en HL7-kanal.

23.10.7 response_transformer

ResponseTransformer inspekterer hva mottakeren sa tilbake og kan markere leveringen feilet.

Den eksisterer fordi "kom denne frem" ofte ikke er et spørsmål transporten kan svare på: en MLLP-mottaker returnerer en applikasjonsbekreftelse hvis betydning er i dens tekst, og en HTTP-mottaker returnerer 200 med en feildokument. I begge tilfeller lyktes transporten og meldingen kom ikke frem.

Kun meningsfullt på en destinasjon som mottar en svart. På en som ikke kan, avvises det ved lasting i stedet for å la det aldri kjøre.

23.10.8 queue

Køen gjør leveringen holdbar: et melding som ikke kan leveres nå, lagres på disk og forsøkes på nytt til den kan leveres.

Av ved default.

23.11 Direkte Destinasjon

DirectDestination sender hver melding som Direct: signert med denne adressen, kryptert til hver mottakers sertifikat, og sendt til HISP via SMTP.

Definert som DirectDestination i internal/config.

NøkkelTypeObligatoriskStandard
toliste av tekstja—
subjecttekstnei—
texttekstnei—
attach_nametekstnei—
xdmtrue eller falsenei—
xdm_source_idtekstnei—
recipient_certs_dirtekstnei—
dnstekstnei—
ldaptekstnei—
smtp_hosttekstja—
usernametekstnei—
passwordtekstnei—
request_mdntrue eller falsenei—
timeoutvarighet, som 30s eller 5mnei—

23.11.1 til

Til er mottakernes Direct-adresser.

Feltreferanser er erstattet, så en mottaker kan komme fra meldingen.

23.11.2 mottaker_sertifikat_mappe

MottakerSertifikatMappe inneholder mottakernes sertifikater (PEM, en fil per adresse eller domene, adresse.pem eller domene.pem) funnet på forhånd; tom leses serverens Direct-adressbok (Direct-skjermen).

Mottakere som ikke er der, søkes opp i DNS (CERT-poster). Direct sender ikke til en mottaker hvis sertifikat ikke kan finnes.

23.11.3 ldap

LDAP er katalogen der en mottakers sertifikat søkes opp når DNS ikke har noen (host:port, port 389): den andre måten Direct-sertifikatoppdagelsesguiden tillater.

Tomt finner mottakerdomenets katalog ved hjelp av DNS SRV-post (_ldap._tcp), som guiden sier; «av» spør aldri en katalog.

23.12 Dokument Destinasjon

DocumentDestination rendre hver melding til et dokument.

Definert som DocumentDestination i internal/config.

NøkkelTypeObligatoriskStandard
dirtekstja—
formatDokumentformatneipdf
templatetekstja—
titletekstnei—
file_nametekstnei—
font_sizetallnei10
landscapetrue eller falsenei—
temp_suffixtekstnei"
timeoutvarighet, som 30s eller 5mnei30s

23.12.1 format

Format er pdf eller tekst.

Standard er pdf.

23.12.2 mal

Mal er dokumentkroppen, med ${PID-5.1} stil referanser til meldingsstier.

Obligatorisk. Det finnes ingen fornuftig standard: et dokument uten mal ville være enten den rå meldingen, som ingen ønsker å printe, eller tomt.

23.12.3 tekststørrelse

Tekststørrelse i punkter.

Standard er 10, som passer 80 tegn over A4.

23.12.4 temp_suffix

MidlertidigSuffix legges til mens det skrives og fjernes ved en omdøping.

Standard er ".part".

Samme hensyn som ethvert annet fildestinasjon, og det betyr mer her: en print-watcher som plukker opp en halv-skrevet PDF produserer en side med ingenting, og ingen undersøker en blank side.

23.12.5 tidsavbrudd

Tidsavbrudd avgrenser én skriving.

Defaults to 30s.

23.13 ECR-destinasjon

ECR-destinasjon konfigurerer elektronisk saksmelding.

Definert som ECRDestination i internal/config.

NøkkelTypeObligatoriskStandard
rctctekstnei—
sourcetekstja—
facilityECRFacilityja—

23.13.1 rctc

RCTC er en FHIR-VerdiSett, eller en samling av dem, som for eksempel eRSD, som inneholder utløsende koder.

Uten det bruker Perfuse en kort innbygd eksempel, som er for testing: byråer forventer RCTC.

23.14 ELR-destinasjon

ELR-destinasjon konfigurerer elektronisk laboratorierapportering.

Definert som ELRDestination i internal/config.

NøkkelTypeObligatoriskStandard
configtekstja—
rctctekstnei—

23.14.1 konfig

Konfigurasjon er ELR-filen perfuse elr -config leser: den sender og mottar applikasjonene og fasilitetene etter OID, behandlingsmodus og hva som fyller hullene en laboratoriefeed lar (bestillingsfasilitet, utførende laboratorium, tildelingsmyndigheter).

En relativ sti leses fra kanalens filkatalog.

23.14.2 rctc

RCTC er en FHIR-VerdiSett, eller en samling av dem, som for eksempel eRSD, som inneholder utløsende koder.

Uten det bruker Perfuse en kort innbygd eksempel, som er for testing: byråer forventer RCTC. Relativt til kanal-filen, som konfigurasjon.

23.15 FHIR-destinasjon

FHIR-destinasjon konfigurerer konvertering til FHIR og levering til en FHIR-tjener.

Definert som FHIRDestination i internal/config.

KeyTypeRequiredDefault
urltextyes—
versiontextnoR5
timezonetextno—
default_identifier_systemtextno—
identifier_systemsmapping of text to textno—
claim_us_coretrue or falseno—
validate_before_sendtrue or false (a block, omit to leave off)notrue: sending a resource a server will reject wastes a retry budget and hides the real problem behind a transport error
reject_on_warningtrue or falseno—
headersmapping of text to textno—
bearer_tokentextno—
authFHIRAuth (a block, omit to leave off)no—
ecrECRDestination (a block, omit to leave off)no—
bundle_scripttextno—

23.15.1 url

URL er basis-URL-en til FHIR-tjeneren, for eksempel "https://fhir.eksempel.org/fhir".

Samlingen sendes direkte til den.

23.15.2 versjon

Versjon er FHIR-utgaven som skal produseres: R4, R4B eller R5. Standard er R5, den siste publiserte utgaven.

En distribusjon som kommuniserer med et EHR ønsker nesten alltid R4 og bør si det, fordi stille nedgradering ville skjule et virkelig interoperabilitetsvalg.

23.15.3 tidssone

Tidssone brukes på HL7 v2-tidspunkter som ikke har noen offset. v2 tillater en lokal tid uten offset, mens FHIR ikke gjør det, så noe må supplere en.

Når den ikke er satt, brukes offseten avsenderen satte på MSH-7, siden v2 antar at en lokal tid uten offset er avsenders lokal tid; et melding hvis MSH-7 ikke har noen offset, faller tilbake til UTC.

23.15.4 standard_identifikasjonssystem

StandardIdentifikasjonSystem navngir identifikatorer hvis utstedende myndighet ikke har noen konfigurert URI.

Uten et system er en MRN tvetydig mellom fasiliteter.

23.15.5 krav_us_kjerne

ClaimUSCore legger til US Core 9.0.0-profilen til hver ressurs som er produsert og som har blitt sjekket mot den og som er konform.

En ressurs som ikke møter kravene, sendes uten kravet, med en notis som forklarer hvorfor.

23.15.6 valider_før_sending

ValiderFørSending nekter å sende en samling som ikke består valideringen.

Standard er true: å sende en ressurs som en server vil avvise, ødelegger en nyttig budsjett og skjuler det virkelige problemet bak en transportfeil.

23.15.7 avvis_på_advarsel

AvvisPåAdvarsel nekter også på advarsler, som en manglende US Core-identifikator.

Av er standard, fordi en advarsel er en vurdering om profil-konformitet snarere enn om gyldighet.

23.15.8 bearer_token

BearerToken sendes som en Authorization-header.

Foretræk en miljøvariabel-referanse, 4NAME4, over en bokstavelig verdi i en fil som går inn i git.

23.15.9 ecr

ECR gjør dette til en offentlig helse-rapportering-destinasjon.

Hver melding sjekkes for utløsende koder; en som har noen, sendes som en eCR 2.1 eICR, innkapslet i en eCR-melding, til url's $process-message, og en uten noen, sendes ikke i det hele tatt.

23.15.10 pakkeskript

BundleScript er JavaScript som kjøres på hver konvertert Bundle før den valideres og sendes: bundle er Bundle som et objekt, redigert på stedet.

Dette er hvordan et sted legger til hva deres egne systemer vet og v2-meldingen ikke sier - organisasjonens IKNR eller ODS-kode, en nasjonal profils kontakt nivå - uten at konverteren gjetter det. Et skript som kaster feil, feiler meldingen, som enhver annen transformerer gjør. Ikke kjørt for saksrapporter (ecr).

23.16 FTP-destinasjon

FTPDestinasjon laster opp en fil per melding.

Definert som FTPDestination i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja21
usertekstnei—
passwordtekstnei—
securityFTPSecurityneieksplisitt i stedet for ingen
insecure_skip_verifytrue eller falsenei—
allow_clear_passwordtrue eller falsenei—
dirtekstja—
file_nametekstnei—
temp_suffixtekstnei"
framedtrue eller falsenei—
timeoutvarighet, som 30s eller 5mnei60s

23.16.1 vert

Verten er serveren, med en valgfri port.

Standard er 21, eller 990 for implisitt TLS.

23.16.2 bruker

Bruker og passord autentiserer.

En tom bruker betyr anonym.

23.16.3 passord

Bruker og passord autentiserer.

En tom bruker betyr anonym.

23.16.4 sikkerhet

Sikkerhet velger TLS: eksplisitt, implisitt eller ingen.

Standard er eksplisitt fremfor ingen, fordi standarden for vanlig FTP ville gjøre det usikre valget det stille, og et sted som virkelig ikke har TLS, bør skrive det ned.

23.16.5 insecure_skip_verify

InsecureSkipVerify aksepterer alle sertifikater.

Trengs oftere enn noen ville ønske: disse serverne har ofte et selvsignert sertifikat generert for år siden som ingen kan utstedde på nytt. Navngitt separat så valget er bevisst og synlig i filen, fremfor skjult inni en "sikkerhet: avslappet"-modus.

23.16.6 allow_clear_password

AllowClearPassword tillater en passord over vanlig FTP.

Avvist som standard, fordi det sender en legitimasjon over nettverket i klartekst på hver enkelt levering. Noen analysatorer har virkelig ingen TLS, så det må være mulig - men det må skrives ned, så det er en beslutning noen har tatt, fremfor en standard de har arvet. Navnet er bevisst ubehagelig å skrive.

23.16.7 temp_suffix

TempSuffix legges til mens filen skrives og fjernes ved en omdøping når den er fullført.

Standard er ".part".

Den som samler inn disse filene er vanligvis en planlagt jobb som tar hva den finner, og uten omdøpingen tar den til slutt halvparten av meldingen.

23.16.8 tidsavbrudd

Tidsbegrensning begrenser én overføring.

Defaults to 60s.

23.17 GCS Destinasjon

GCSDestinasjon skriver hver melding som et objekt.

Definert som GCSDestination i internal/config.

NøkkelTypeObligatoriskStandard
objecttekstnei${date}/${channel}/${control_id}
storage_classtekstnei—
content_typetekstnei—

23.17.1 objekt

Objekt er objektets navn, med samme placeholder som en s3-nøkkel.

Standard er ${date}/${channel}/${control_id}.hl7.

23.18 HTTP Destinasjon

HTTPDestinasjon posterer meldinger til en HTTP-endepunkt.

Det vanligste ting en Mirth-kanal gjør som Perfuse ikke kunne, og det vanligste hindringen oversetteren rapporterer. De fleste bruksområdene er uglamorøse: post meldingen til en intern API, post den til en webside som omgir et legacy-system, post den til noe noen skrev på en ettermiddag.

Definert som HTTPDestination i internal/config.

KeyTypeRequiredDefault
urltextyes—
methodtextno—
content_typetextno—
headersmapping of text to textno—
bearer_tokentextno—
usernametextno—
passwordtextno—
tlstlsconf.Settings (a block, omit to leave off)no—
success_statuslist of whole numbernoany 2xx
fail_on_bodylist of textno—
follow_redirectstrue or falseno—

23.18.1 url

URL er hvor meldingen skal postes.

Required.

23.18.2 metode

Metode standarder til POST.

PUT er tillatt for en endpoint som ønsker det.

GET og DELETE er avvist: dette sender en meldingskropp, og en transport som stille og rolig droppet meldingen på grunn av en metodevalg ville være en meget stille måte å miste data på.

23.18.3 innholdstype

ContentType standarder til application/hl7-v2+er7, som er den registrerte typen for en pipe-delt HL7 v2-melding.

Mange endepunkter ønsker text/plain i stedet.

23.18.4 bearer_token

BearerToken sendes som en Authorization-header.

Foretrekk en miljøvariabelreferanse over en bokstav i en fil som går inn i git.

23.18.5 success_status

SuccessStatus lister opp statuskodene som teller som levert.

Standarder til alle 2xx.

Konfigurerbart fordi endepunkter er uenige om hva som utgjør suksess: noen svarer 200 med en feil i kroppen, og noen svarer 202 for en kø de har akseptert meldingen inn i.

23.18.6 fail_on_body

FailOnBody behandler en respons som inneholder noen av disse strengene som en feil, uavhengig av statuskode.

Dette eksisterer fordi et endepunkt som svarer 200 med "ERROR: patient ikke funnet" i kroppen er vanlig, og å behandle det som levert betyr at meldingen er borte og ingen vet.

23.18.7 follow_redirects

FollowRedirects tillater at forespørselen kan bli omdirigert.

Av ved standard: en omdirigering på en skrivning ville poste klinisk data et sted konfigurasjonen aldri har navngitt.

23.19 IBMMQ Destinasjon

IBMMQDestinasjon legger hver melding på en kø.

Definert som IBMMQDestination i internal/config.

NøkkelTypeObligatoriskStandard
non_persistenttrue eller falsenei—

23.19.1 non_persistent

NonPersistent sender meldinger som ikke overlever en køleder-restart.

Av ved default.

23.20 Java Script Destinasjon

JavaScriptDestinasjon kjører et skript i stedet for å sende noe sted.

Mirths JavaScript Writer, og det brukes langt mer enn dens posisjon i en funksjonsliste antyder. Det er flukthullet: når et sted trenger å snakke med noe ingen connector dekker, eller anvende logikk ingen transformasjon uttrykker, skriver de en JavaScript Writer. En migrering som ikke kan kjøre disse kan ikke flytte kanalene som har dem, hvilket i en moden Mirth-installasjon er en stor brøkdel.

Bevisst ikke en generell skriptvert. Skriptet får meldingen og de samme hjelpere en transformerer får; hva det ikke får er en måte å nå filsystemet eller nettverket, fordi det er hva de andre destinasjonene er for, og et skript som åpner sin egen socket er usynlig for hver omgang, kø og måling i motoren.

Definert som JavaScriptDestination i internal/config.

NøkkelTypeObligatoriskStandard
scripttekstja—
timeoutvarighet, som 30s eller 5mnei—
success_on_undefinedtrue eller false (en blokk, utelat for å ikke inkludere)neitrue

23.20.1 skript

Skript er koden som skal kjøres.

Required.

23.20.2 tidsavbrudd

Timeout begrenser én eksekvering.

Null anvender en standard.

Begrenset fordi et destinasjonsskript er på leveringsstien: en uendelig løkke i ett holder ikke bare feil en melding, men holder også køen bak det.

23.20.3 success_on_undefined

SuccessOnUndefined behandler et skript som returnerer ingenting som en suksess.

Standard er true.

True er standardverdien og verdt å forklare. Mirths JavaScript-forfattere gjør overvelende sitt arbeid og returnerer ingenting, så å kreve en eksplisitt retur ville bryte alle på import. Å sette det til false er for en nettside som ønsker at et skript skal være eksplisitt om hvorvidt det fungerte.

23.21 Kafka-destinasjon

Kafka-destinasjon publiserer meldinger til et Kafka-tema.

Definert som KafkaDestination i internal/config.

KeyTypeRequiredDefault
brokerslist of textyes—
topictextyes—
keytextno—
ackstextnoall
compressiontextnosnappy
headersmapping of text to textno—
timeoutduration, such as 30s or 5mnothirty seconds
saslKafkaSASL (a block, omit to leave off)no—
tlstlsconf.Settings (a block, omit to leave off)no—

23.21.1 brokers

Brokers er listen over oppstartstjenere.

Required.

23.21.2 tema

Tema er hvor meldingen skal publiseres.

Required.

23.21.3 nøkkel

Nøkkel er en mal for postnøkkelen, som bestemmer partisjonen.

Dette er feltet som gjør Kafka trygt for en klinisk strøm, og det er verdt å være presis om hvorfor. Kafka garanterer rekkefølge innen en partisjon og ingen andre steder. Poster med samme nøkkel havner alltid i samme partisjon, så nøkling på pasientidentifikatoren holder pasientens hendelser i rekkefølge mens andre pasienter kan gå parallelt.

Uten en nøkkel er det ingen slik garanti. Målt mot en ekte broker, tretti unøklerte poster gikk til én partisjon i stedet for å sprede seg: klienten holder en batch sammen og velger en ny partisjon mellom batcher. Så rekkefølgen holder ved en tilfeldighet og bryter på en grense ingen kan se, som er verre enn å bryte konsekvent - en A03-utskrivning les før A01-inntak, ujevn, under belastning.

En HL7-sti, evaluert mot den avgående meldingen: PID-3.1 nøklar etter pasient.

23.21.4 acks

Acks er hvor mange brokere må bekrefte en skrivning: "all", "leader" eller "none".

Standard er all, som er den eneste innstillingen som overlever en brokerfeil mellom skrivning og replikasjon. "none" er ild og glede og vil miste meldinger; det eksisterer fordi noen flytter ikke-klinisk telemetri kan legitimt ønske det, og å nekte det helt ville bety at de skrev sin egen produsent i stedet.

23.21.5 kompresjon

Kompresjon er "ingen", "gzip", "snappy", "lz4" eller "zstd".

Standard er snappy.

På som standard fordi HL7 er høyt komprimerbar tekst og ledningen er vanligvis begrensningen. Snappy i stedet for zstd som standard: det er billigst i CPU, og en connector på leveringsstien bør ikke være det som metter en kjerne.

23.21.6 headers

Headerne er rekordhoder som settes.

Verdiene er maler som evalueres per melding.

23.21.7 tidsavbrudd

Tidsavbrudd avgrenser en publisering.

Standard er tretti sekunder.

23.22 MPI Destinasjon

MPIDestinasjon registrerer hver meldings pasient i denne serverens pasientindeks: en HL7 v2 PID (en A40-merge mergerer), eller en FHIR-pasient på en rå kanal.

Indeksen bestemmer hvilke poster som er samme person; se Pasientindeks-skjermen.

Definert som MPIDestination i internal/config.

NøkkelTypeObligatoriskStandard
authoritiesmapping av tekst til tekstnei—
id_typetekstnei—
ssn_systemtekstnei—
no_mergetrue eller falsenei—

23.22.1 myndigheter

Myndigheter kartlegger en tildelingsmyndighets navnerom (PID-3.4.1) til dets identifikasjonssystem, for sendere som ikke gir noen universell identifikator.

Ukartlagte blir urn:perfuse:aa:<navnerom>.

23.22.2 id_type

IDType er identifikasjonstypen (PID-3.5) til postens eget nummer.

Default MR.

23.22.3 ssn_system

SSNSystem navngir PID-19 som en identifikator.

Default http://hl7.org/fhir/sid/us-ssn.

23.23 MQTT Destinasjon

MQTTDestinasjon publiserer til et emne.

Definert som MQTTDestination i internal/config.

NøkkelTypeObligatoriskStandard
topictekstja—
retaintrue eller falsenei—

23.23.1 tema

Emne som publiseres til.

Den kan ikke inneholde jokertegn.

23.24 PAS Destinasjon

PASDestinasjon sender hver melding, en Da Vinci PAS forespørsel Bundle, til en betalers Claim/$submit, for en leverandør hvis systemer bygger forespørselen (et EHR, DTR) og trenger den sendt, beslutningen registrert og svaret videreformidlet.

Definert som PASDestination i internal/config.

NøkkelTypeObligatoriskStandard
payertekstja—
bearer_tokentekstnei—
authFHIRAuth (en blokk, utelat hvis den ikke skal være med)nei—
results_totekstnei—

23.24.1 bearer_token

BearerToken er en statisk token, ${ENV} tillatt.

Autentisering er OAuth-klientautentisering i stedet, eller Azure, som en FHIR-destinasjons.

23.24.2 autentisering

BearerToken er en statisk token, ${ENV} tillatt.

Autentisering er OAuth-klientautentisering i stedet, eller Azure, som en FHIR-destinasjons.

23.25 Pub Sub Destinasjon

PubSubDestinasjon publiserer til et Pub/Sub-emne.

Definert som PubSubDestination i internal/config.

NøkkelTypeObligatoriskStandard
topictekstja—
order_bytekstnei—

23.26 S3 Destinasjon

S3Destinasjon skriver hver melding som et objekt.

Definert som S3Destination i internal/config.

KeyTypeRequiredDefault
buckettextyes—
regiontextyes—
keytextnoa date-partitioned path plus the control id
access_key_idtextno—
secret_access_keytextno—
session_tokentextno—
endpointtextno—
path_styletrue or falseno—
server_side_encryptiontextno—
content_typetextnoapplication/hl7-v2 for HL7 and text/plain otherwise
framedtrue or falseno—
timeoutduration, such as 30s or 5mno60s
storage_classtextno—
formattextno—

23.26.1 nøkkel

Nøkkelmalene objektets nøkkel, ved å bruke samme ${date}, ${timestamp}, ${control_id}, ${message_type} og ${channel} placeholder som fil- og SFTP-destinasjoner.

Standard er en dato-partisjonert sti pluss kontroll-id.

Dato-partisjonering som standard fordi alternativet - hver objekt i én flat prefix - gjør en bucket som er langsom å liste og umulig å livssykle etter alder, og ingen oppdager det før det er fire millioner objekter i den.

23.26.2 access_key_id

AccessKeyID og SecretAccessKey autentiserer.

Enten kan navngi en miljøvariabel istedenfor å holde verdien, ved å bruke formen ${NAME}.

23.26.3 secret_access_key

AccessKeyID og SecretAccessKey autentiserer.

Enten kan navngi en miljøvariabel istedenfor å holde verdien, ved å bruke formen ${NAME}.

23.26.4 path_style

PathStyle adresserer bucketen som en sti istedenfor et subdomene.

De fleste S3-kompatible lagre trenger dette.

23.26.5 innholdstype

ContentType merker objektet.

Standard er application/hl7-v2 for HL7 og text/plain ellers.

23.26.6 tidsavbrudd

Timeout begrenser én opplasting.

Defaults to 60s.

23.26.7 storage_class

StorageClass er S3-lagringklassen hver objekt skrives med: STANDARD_IA, INTELLIGENT_TIERING, GLACIER_IR, GLACIER, DEEP_ARCHIVE og så videre.

Dette er hvordan et arkiv går rett til Glacier - S3 har ingen separat Glacier-API å ringe.

23.26.8 format

Format er hl7 (standard: hver objekt er meldingen) eller ndjson: hver objekt er én JSON-linje med meldingen og feltene verdt å spørre, under dato-partisjonerte nøkler, så Amazon Athena kan spørre arkivet.

Se Perfuse Athena.

23.27 SFTP Destinasjon

SFTPDestinasjon skriver hver melding til en fil på en SFTP-tjener.

Definert som SFTPDestination i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja22
usertekstja—
passwordtekstnei—
key_filetekstnei—
key_passphrasetekstnei—
known_hosts_filetekstnei—
insecure_skip_host_key_checktrue eller falsenei—
dirtekstja—
file_nametekstneiet tidspunkt pluss kontroll-ID
temp_suffixtekstnei"
framedtrue eller falsenei—
appendtrue eller falsenei—
timeoutvarighet, som 30s eller 5mnei60s

23.27.1 vert

Verten er serveren, med en valgfri port.

Defaults to 22.

23.27.2 passord

Passord autentiserer med et passord.

Prefer KeyFile.

23.27.3 file_name

Filnavn maler navnet.

Standard er et tidspunkt pluss kontroll-ID.

23.27.4 temp_suffix

TempSuffix legges til mens en fil skrives, og fjernes ved omnavning når den er fullført.

Standard er ".part".

Samme hensynsomhet denne koblingen trenger på vei inn. Hvem som samler inn disse filene har samme problem, og en omnavning i en mappe er atomisk på hver server verdt å bruke.

23.27.5 tidsavbrudd

Tidsavbrudd begrenser en enkelt tilkobling.

Defaults to 60s.

23.28 SMTP Destinasjon

SMTPDestinasjon konfigurerer levering via e-post.

Definert som SMTPDestination i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja—
fromtekstja—
toliste av tekstja—
ccliste av tekstnei—
bccliste av tekstnei—
subjecttekstnei—
bodytekstnei—
attachtrue eller falsenei—
attach_nametekstneikontroll-ID med en
usernametekstnei—
passwordtekstnei—
starttlstrue eller false (en blokk, utelat for å la det være av)nei—
insecure_skip_verifytrue eller falsenei—
timeoutvarighet, som 30s eller 5mnei—

23.28.1 vert

Host er e-postserveren, med en valgfri port.

Port 587 antas, som er innsending med STARTTLS - porten en moderne server forventer en klient på. Port 25 er server-til-server og er vanligvis enten blokkert eller uautentisert.

23.28.2 fra

Fra er avsenderskapet.

Obligatorisk, fordi en melding uten avsender blir diskret kastet av mye e-post-infrastruktur, noe som gjør det til den hardest mulige feilen å diagnostisere.

23.28.3 til

Til, CC og BCC er mottakere.

Minst en Til er obligatorisk.

23.28.4 cc

Til, CC og BCC er mottakere.

Minst en Til er obligatorisk.

23.28.5 bcc

Til, CC og BCC er mottakere.

Minst en Til er obligatorisk.

23.28.6 body

Body er meldingsteksten.

Feltreferanser er erstattet, som i Emne. Når det er tomt er meldingen selv kroppen.

23.28.7 attach_name

AttachName navngir vedlegget.

Standard er kontroll-ID med en .hl7-suffiks.

23.28.8 brukernavn

Brukernavn og Passord autentiserer til serveren.

Enten begge eller ingen.

23.28.9 passord

Brukernavn og Passord autentiserer til serveren.

Enten begge eller ingen.

23.28.10 starttls

StartTLS oppgraderer tilkoblingen før autentisering.

Den er aktivert som standard, og å slå den av med et brukernavn satt, blir avvist i stedet for å bli tillatt: å sende en passord over en ukryptert tilkobling, er ikke en kompromiss som er verdt å tilby.

23.28.11 insecure_skip_verify

InsecureSkipVerify aksepterer alle sertifikater.

Navngitt entydig fordi det er hva den gjør.

23.29 SNS-destinasjon

SNSDestination publiserer hver melding til et SNS-tema.

Definert som SNSDestination i internal/config.

KeyTypeRequiredDefault
topic_arntextyes—
subjecttextno—
group_bytextno—

23.29.1 emne

Emne sendes med e-postabonnementer.

Valgfritt; ${message_type} og ${control_id} fylles inn.

23.30 SOAP-destinasjon

SOAPDestination poster en SOAP-forespørsel per melding.

Definert som SOAPDestination i internal/config.

KeyTypeRequiredDefault
urltextyes—
profiletextno—
facility_idtextno—
warnings_are_errorstrue or falseno—
actiontextno—
versiontextno1
bodytextyes—
headertextno—
headersmapping of text to textno—
usernametextno—
passwordtextno—
tlstlsconf.Settings (a block, omit to leave off)no—
fault_is_successlist of textno—
timeoutduration, such as 30s or 5mno30s

23.30.1 profil

Profilnavn er en standardtjeneste hvis konvolutt Perfuse bygger selv.

Tomt er et vanlig SOAP-anrop med brødteksten skrevet i denne filen.

"cdc-iis" er CDCs immunisasjonsregistergrensesnitt (urn:cdc:iisb:2011), som hver US-delstatregister bruker: meldingen går i submitSingleMessage, brukernavn og passord går i brødteksten som WSDL sier (ikke som HTTP-autentisering), SOAP 1.2 som standard, og registerets HL7-bekreftelse avgjør om meldingen ble levert. Et register svarer en avvist skyting med HTTP 200 og en AR inni, så uten dette leses en avvisning som en suksess.

23.30.2 fasilitets_id

FasilitetsID er cdc-iis fasilitetsID, registerets identifikator for den sendende organisasjonen.

Valgfritt i WSDL; noen registre krever det.

23.30.3 advarsler_er_feil

AdvarslerErFeil, for cdc-iis, behandler en AE-bekreftelse som bare inneholder advarsler som en feil.

Av som standard: registre sender AE for "akseptert med advarsler", og ERR-alvorlighetsgraden sier om noe gikk tapt.

23.30.4 handling

Handling er SOAPAction.

Krevs av de fleste 1.1-tjenestene.

23.30.5 body

Body er XML som går inn i konvolutten, med ${PID-5.1}-liknende referanser til meldingsstier.

Påkrevd, med mindre et profil bygger den. Det finnes ingen nyttig standard: elementnavnene kommer fra tjenestens eget skjema og ingen motor kan gjette dem.

23.30.6 header

Header er XML for konvoluttens Header-element.

Utelatt helt når den er tom, fordi noen tjenester avviser en tom en.

23.30.7 feil_er_suksess

FeilErSuksess lister feilkoder som teller som levert.

Trengs oftere enn det burde være. En tjeneste som svarer på en ny sending med "allerede sendt" forteller deg at meldingen ankom, og uten dette må et sted skrive en respons-transformator for å si det - eller verre, ser en kø gjenta seg for evig mot en mottaker som allerede har meldingen.

23.30.8 tidsavbrudd

Tidsavbrudd begrenser ett opprop.

Defaults to 30s.

23.31 SQS Destinasjon

SQSDestinasjon sender hver melding til en SQS-kø.

Definert som SQSDestination i internal/config.

NøkkelTypePåkrevdStandard
queue_urltekstja—
group_bytekstnei—

23.31.1 queue_url

QueueURL navngir køen.

En som ender med .fifo er en FIFO-kø, og er gruppert og deduplisert.

23.32 TCP Dest

TCPDest sender meldinger til en socket med konfigurerbar ramming.

Definert som TCPDest i internal/config.

NøkkelTypePåkrevdStandard
addresstekstja—
max_message_sizeheltallnei—
timeoutvarighet, som 30s eller 5mnei—
expect_replytrue eller falsenei—
keep_alivetrue eller falsenei—
tlstlsconf.Settings (en blokk, utelat for å la det være av)nei—

23.32.1 expect_reply

ExpectReply venter på bytes tilbake før det rapporterer suksess.

Av ved default, og verdt å vurdere. Med denne funksjonen deaktivert, betyr "levert" at byte nådde operativsystemets sendebuffer, som en peer som krasjet et øyeblikk senere aldri leste. Med denne funksjonen aktivert, vil en peer som aldri svarer føre til at hver melding utløper.

23.32.2 keep_alive

KeepAlive holder en forbindelse åpen over flere meldinger, i stedet for å oppkalle per melding.

De fleste enhetsendepunkter forventer dette; noen avviser en andre melding på samme forbindelse. Deaktivert ved default fordi en forbindelse per melding er det atferd som fungerer overalt, til en kostnad av en håndtrykk hver gang.

23.33 TEFCA Destinasjon

TEFCADestinasjon ber TEFCA-fasilitert FHIR-partner om meldingers pasientopptak.

Hvem denne serveren er på nettverket, sertifikatet og partneren er serverinnstillinger (Innstillinger, TEFCA), fordi de tilhører organisasjonen og dens avtale med en QHIN. Hva en kanal bestemmer er når å spørre og hvorfor: formålet med bruk er en del av kanalen, ikke av hvem som er logget inn, så hver forespørsel en feed gjør angir samme grunn og audit-spor kan leses mot den.

Definert som TEFCADestination i internal/config.

NøkkelTypeObligatoriskStandard
purposetekstja—
results_totekstnei—

23.33.1 formål

Formål er formålet med bruk: behandling, betaling, drift, folkehelse eller individuell tilgang.

Det må være en av deltakerne erklærer.

23.33.2 resultater_til

ResultaterTil navngir en kanal i denne serveren som mottar hver Bundle-partneren returnerer, som en melding på egen hånd.

Tom holder Bundle som denne destinasjonens svar bare, for en respons-transformator å lese.

23.34 XDS Destinasjon

XDSDestinasjon publiserer hver klinisk dokument til et IHE XDS.b-dokumentarkiv med ITI-41 Provide and Register.

Metadaten leses fra CDA-dokumentet (pasient, tittel, type, tid, forfatter, konfidensialitet, språk) og fullføres fra disse innstillingene, som sier hva dokumentet ikke kan: hvem som sender det, hva slags fasilitet og praksis det kommer fra, og hvilken av pasientens identifikatorer som er affinitetsdomenet.

Definert som XDSDestination i internal/config.

NøkkelTypeObligatoriskStandard
urltekstja—
source_idtekstja—
patient_domaintekstnei—
facility_typeXDSCodeja—
practice_settingXDSCodeja—
classXDSCode (en blokk, utelat for å ikke inkludere)nei—
content_typeXDSCode (en blokk, utelat for å ikke inkludere)nei—
tokentekstnei—
usernametekstnei—
passwordtekstnei—
headersmapping av tekst til tekstnei—
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—
timeoutvarighet, som 30s eller 5mnei—
direct_fromtekstnei—
direct_toliste av tekstnei—

23.34.1 patient_domain

PatientDomain er affinitetsdomenets tildelingsmyndighets OID: pasientidentifikatoren med denne roten er den som er registrert.

Uten dette sender en dokument hvis pasient har en identifikator denne identifikatoren, og en med flere identifikatorer avvises.

23.34.2 token

Token eller Brukernavn/Passord autentiserer; Headers legges til hver forespørsel.

De fleste affinitetsdomener bruker gjensidig TLS (tls) i stedet.

23.34.3 brukernavn

Token eller Brukernavn/Passord autentiserer; Headers legges til hver forespørsel.

De fleste affinitetsdomener bruker gjensidig TLS (tls) i stedet.

23.34.4 passord

Token eller Brukernavn/Passord autentiserer; Headers legges til hver forespørsel.

De fleste affinitetsdomener bruker gjensidig TLS (tls) i stedet.

23.34.5 headers

Token eller Brukernavn/Passord autentiserer; Headers legges til hver forespørsel.

De fleste affinitetsdomener bruker gjensidig TLS (tls) i stedet.

23.34.6 tls

Token eller Brukernavn/Passord autentiserer; Headers legges til hver forespørsel.

De fleste affinitetsdomener bruker gjensidig TLS (tls) i stedet.

23.34.7 direkte_fra

DirectFrom og DirectTo gjør XDR til Directs transport: en Direct-adresseblokk som navngir denne senders Direct-adresse og mottakerens, og mottakerne i innsendelsens mål.

En HISP som tar XDR leverer det som Direct-e-post eller til mottakerens egen XDR-endepunkt.

23.34.8 direkte_til

DirectFrom og DirectTo gjør XDR til Directs transport: en Direct-adresseblokk som navngir denne senders Direct-adresse og mottakerens, og mottakerne i innsendelsens mål.

En HISP som tar XDR leverer det som Direct-e-post eller til mottakerens egen XDR-endepunkt.

24 Formatreferanse

Alternativer som styrer hvordan meldinger tolkes og skrives, for formatene som trenger mer enn et navn.

24.1 Vedlegg

Vedlegg konfigurerer flytting av store nyttelaster ut av en melding.

En melding som bærer en skannet rapport eller en PDF er vanlig i dokumentflyter, og nyttelasten er vanligvis hundredvis av ganger større enn meldingen rundt den. Ved å la den være inline betyr det at lagringsplassen vokser i takt med dokumentene heller enn trafikken, en melding i kø for fem destinasjoner kopieres fem ganger, og grensesnittet strømmer megabyte for å vise noen en pasientnavn.

Mirth kaller disse vedleggsbehandlerne. Dette er ekvivalent, og det er valgfritt per kanal fordi en strøm av vanlige ADT-meldinger ikke har noe å trekke ut og bør ikke betale for maskineriet.

Definert som Attachments i internal/config.

NøkkelTypeObligatoriskStandard
extractliste over attach.Regelja—
reassembletrue eller false (en blokk, utelat for å la det være av)neitrue

24.1.1 reassemble

Reassemble setter nyttelaster tilbake før levering.

Standard er true.

Standard er på fordi en mottaker som forventer en dokument må få en dokument; en melding som inneholder en bokstavelig token ville bli arkivert som en rapport og ingen ville finne ut før noen åpnet rekorden.

Å slå det av er for det tilfelle hvor formålet med kanalen er å fjerne dokumenter - videreformidling av metadata til et system som ikke har bruk for bildet, hvor sending ville være et spørsmål om personvern snarere enn båndbredde.

24.2 Avgrenset

Avgrenset konfigurerer en avgrenset kanal.

Mirths avgrenset datatyppe: CSV, tab-separert og den lange halen av formater som en laboratorieanalyser eller en byråtjeneste emitterer.

Definert som Delimited i internal/config.

NøkkelTypeObligatoriskStandard
delimitertekstnei—
quotetekstneien dobbeltnøkkel
commenttekstnei—
has_headersann eller usannnei—
columnsliste av tekstnei—
trim_spacesann eller usannnei—
relaxedsann eller usannnei—
splitsann eller usann (en blokk, utelat for å ikke inkludere)neisann
keep_blank_linessann eller usannnei—
filtertekstnei—
transformationsliste av steps.Stegnei—

24.2.1 avgrenser

Avgrenser skiller kolonner, som et tegn eller et navn.

Et navn er akseptert fordi en tabulator ikke kan skrives inn i en YAML-fil uten å være tvetydig, og en konfigurasjonsfil som inneholder usynlige tegn er uleselig for den som åpner den neste.

24.2.2 anførsel

Anførsel omgir verdier som inneholder avgrenseren.

Standard er en dobbelt anførsel; «ingen» deaktiverer den.

24.2.3 deler

Deler gjør hver rad til sin egen melding.

Standard er true.

Dette er beslutningen som former en avgrenset kanal og fortjener å bli sagt høyt. En fil med fem tusen resultater er enten en melding eller fem tusen. En melding betyr en bekreftelse, en post i nettleseren og en feil som tar hele filen med seg. Fem tusen betyr at hver rad filtreres, transformeres, leveres og gjentas på egen hånd, og en enkelt feil rad stopper ikke resten.

Delering er standard fordi per-radhåndtering er hva nesten hver enkelt sted ønsker, og fordi alternativet oppdages sent: en kanal som så fin ut i testing med en tre-raders fil feiler en hel natts overføring over en enkelt feilaktig linje.

24.2.4 behold_blanke_linjer

BeholdBlankeLinjer stopper blanke linjer fra å bli hoppet over.

Hopping er standard, fordi hver fil slutter med en ny linje og en post med tomme felt er ikke en post. Dette eksisterer for det sjeldne formatet hvor en blank linje er meningsfull.

24.2.5 filter

Filter bestemmer hvilke meldinger fortsetter, skrevet mot kolonnenavn.

Her i stedet for på kanalen fordi kanal-nivå-filter kompilerer HL7-stier. To innstillinger med navn filter ville være forvirrende, men en innstilling som betyr forskjellige ting avhengig av dataType er verre: en avgrenset kanal som stille kompilerte sitt filter som HL7 ville ikke matche noe og slippe alt, som er feilen som topp-nivå-nektelse eksisterer for å forhindre.

24.2.6 transformasjoner

Transformasjoner er de deklarative stegene, som adresserer kolonner i stedet for HL7-felt.

Separat fra kanalens transformasjoner av samme grunn som Filter, og det er ordningen X12 og NCPDP allerede bruker.

24.3 HL7v3-Alternativer

HL7v3Alternativer er innstillingene som bare gjelder for en HL7 v3-kanal.

Definert som HL7v3Options i internal/config.

NøkkelTypeObligatoriskStandard
filtertekstnei—
acknowledgetrue eller false (en blokk, utelat for å ikke inkludere)nei—
sender_devicetekstnei—
sender_oidtekstnei—
transformationsliste over hl7v3.Stepnei—

24.3.1 filter

Filter ekskluderer meldinger ved å bruke v3-paths.

Dets eget felt i stedet for kanalens vanlige filter, fordi de to er forskjellige språk mot forskjellige meldingsmodeller. Å dele feltet ville bety at et v2-filter stille ville aldri matche på en v3-kanal, eller at et v3-filter ville feile ved å parse som v2 - og det siste er bare bedre fordi det feiler høyt.

En kanal som setter begge blir avvist ved lasting, siden en av dem ville måtte ignoreres og det finnes ingen ærlig måte å velge på.

24.3.2 bekrefte

Bekrefte sender en MCCI_IN000002UV01-bekreftelse tilbake.

På som standard, i motsetning til X12. En v3-interaksjon over en synkron transport forventer en bekreftelse - den sendende applikasjonen venter vanligvis på en - og en avsender som mottar ingenting vil vanligvis prøve igjen, noe som er hvordan en pasient blir registrert tre ganger.

En peker så at "ikke satt" og "satt til false" er forskjellige: standarden er på, og noen som slår det av burde ha sagt det.

24.3.3 sender_enhet

SenderEnhet er enhetsidentifikatoren vi legger i en bekreftelse.

Kreves når bekreftelse. En v3-bekreftelse navngir enheten det kommer fra, og en mottaker som ikke gjenkjenner vår kan kaste det away - noe som ser ut akkurat som ikke å sende en.

24.3.4 transformasjoner

Transformasjoner endrer innholdet i et v3-dokument.

Dets eget felt i stedet for kanalens vanlige transformasjoner, av samme grunn som filteret er: de er forskjellige vokabular mot forskjellige meldingsmodeller. V2-trinnene adresserer segmenter og felt, som et v3-dokument ikke har, så å dele feltet ville bety at et trinn som stille ikke gjorde noe.

Trinnnavnene matcher v2-navnene hvor betydningen matcher, så noen som har skrevet en kanal kan skrive den andre. Hva som er forskjellig er hva v3 trenger og v2 ikke kan uttrykke - hovedsakelig at fjerning av en verdi har tre forskjellige betydninger, så klar, nullflavor og fjern er tre trinn i stedet for ett.

24.4 TCP-ramming

TCP-ramming er hvordan meldingsgrenser finnes på en rå sokkel.

Delt av TCP-kilden og TCP-destinasjonen, og av serien kilde, fordi rammene er de samme uansett hvor byte kommer fra. Et laboratorieanalyseapparat som snakker STX/ETX over en sokkel snakker STX/ETX over en seriekabel også.

Definert som TCPFraming i internal/config.

NøkkelTypeObligatoriskStandard
framingtekstja—
delimitertekstnei—
start_blocktekstnei—
keep_delimitertrue eller falsenei—
record_lengthheltallnei—
trim_paddingtrue eller false (en blokk, utelat for å ikke fjerne)nei—
length_bytesheltallnei—
big_endiantrue eller falsenei—
length_includes_headertrue eller falsenei—

24.4.1 ramming

Rammning er mllp, avgrenset, fast, lengde eller hel.

Kreves, uten standard. Å lese en strøm med feil rammning produserer meldinger som ser plausibelt ut i stedet for en feil, så å gjette er verre enn å spørre.

24.4.2 start_blokk

StartBlokk begynner valgfritt en melding.

Bytes før det kastes away som støy fra en delvis tilkobling.

24.4.3 behold_at-skille

KeepDelimiter inkluderer separator i meldingen.

Av ved default: det er ramming, ikke innhold.

24.4.4 trim_padding

TrimPadding fjerner trailing mellomrom og NUL fra en fast post.

På ved default.

24.5 X12-alternativer

X12-alternativer er innstillingene som bare gjelder for en X12-kanal.

Definert som X12Options i internal/config.

NøkkelTypeObligatoriskStandard
envelopeEnvelopePolicyneikreves
splitsann eller usannnei—
acknowledgetekstnei—
ack_sender_idtekstnei—
ack_sender_qualifiertekstnei—
arrives_astekstnei—
transformationsliste av x12.Stegnei—

24.5.1 envelope

Envelope sier hva som skal gjøres når de selvdeklarerte tellingene ikke stemmer overens med hva som er til stede.

Standardverdien er kreve.

24.5.2 deler

Split sender en melding per transaksjonssett i stedet for en per fil.

Av ved default. En enkelt 837 kan inneholde hundredvis av krav, så å aktivere dette multipliserer alt nedstrøms - meldings teller, bekreftelser, rader, varslingstrøskler - og det bør være en beslutning noen har tatt heller enn en standard de har arvet.

24.5.3 bekrefte

Acknowledge sier hvilken bekreftelse som skal sendes tilbake: 999, 997, ta1 eller ingen.

Hvilken en er en egenskap ved handelspartnerforholdet heller enn meldingen, så den må konfigureres. En 999 erstatter en 997 for HIPAA-transaksjoner, men mange partnere - eldre betalingsforbindelser spesielt - er satt opp til å forvente en 997 og vil behandle en 999 som en ukjent fil. Å sende feil bekreftelse er verre enn å ikke sende noen, fordi det svarer på et spørsmål ingen har stilt og lar det virkelige åpne.

Tomt betyr ingen, som er standardverdien: en partner som ikke forventer en bekreftelse og mottar en, kan behandle den som en usøkt interchange.

24.5.4 ack_sender_id

AckSenderID og AckSenderQualifier er våre egne interchange-identifikatorer, som blir ISA06 og ISA05 i enhver bekreftelse.

Obligatorisk når Acknowledge er satt, og avvist ved lasting ellers. Disse må være verdiene handelspartneren har konfigurert for oss, og det finnes ingen måte å gjette dem på: en interchange hvis ISA06-partneren ikke gjenkjenner, blir kastet før noen leser den, så en feil verdi produserer stillhet som ser ut som om ingenting blir sendt - og noen bruker en uke på å lete feil.

24.5.5 ack_sender_qualifier

AckSenderID og AckSenderQualifier er våre egne interchange-identifikatorer, som blir ISA06 og ISA05 i enhver bekreftelse.

Obligatorisk når Acknowledge er satt, og avvist ved lasting ellers. Disse må være verdiene handelspartneren har konfigurert for oss, og det finnes ingen måte å gjette dem på: en interchange hvis ISA06-partneren ikke gjenkjenner, blir kastet før noen leser den, så en feil verdi produserer stillhet som ser ut som om ingenting blir sendt - og noen bruker en uke på å lete feil.

24.5.6 ankommer_som

AnkommerSom er xml når kildeleverandøren leverer interchange som XML som Mirth Connect og Open Integration Engine skriver for X12 (en X12Transaction-rot, elementer med navn CLM.05.1), eller et system bygget mot en av dem sender det.

Det konverteres tilbake til X12 før noe annet skjer. Tomt eller x12 er X12.

24.5.7 transformasjoner

Transformasjoner er deklarative endringer som blir aplikert på aksepterte interchanges.

Separat fra kanal-nivå-transformasjoner for samme årsak som v3-ene: disse addreserer HL7-felt gjennom en parser som leser segment-felt-komponent-underkomponent, og X12 har ingen underkomponent, behandler gjentatte segmenter som ordinære heller enn unntak, og skrives CLM01 av de som konfigurerer det. En delt parser måtte akseptere begge notasjonene og ville da være tvetydig i begge.

Stegnavnene er de samme som HL7- og v3-stegene bruker, så hva en forfatter allerede har lært, bærer over.

25 Atferdsreferanse

Kvittering, køing, gjentakelse, polling, skripting og skyggeinnstillinger. Disse gjelder uavhengig av hvilken transport en kanal bruker.

25.1 AMQP-tilkobling

AMQP-tilkobling er hvor og som hvem man skal koble til.

Definert som AMQPConnection i internal/config.

NøkkelTypeObligatoriskStandard
addrtekstja—
addresstekstja—
usernametekstnei—
passwordtekstnei—
hostnametekstneivertsnavn for addr
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—
timeoutvarighet, som 30s eller 5mnei30s

25.1.1 brukernavn

Brukernavn og passord autentiserer med SASL PLAIN; begge tomme betyr ANONYMOUS.

For Service Bus, navn på politikken og nøkkel.

25.1.2 passord

Brukernavn og passord autentiserer med SASL PLAIN; begge tomme betyr ANONYMOUS.

For Service Bus, navn på politikken og nøkkel.

25.1.3 vertsnavn

Vertsnavn sendes til megleren, som Service Bus ruter på.

Standard er vertsnavn for addr.

25.1.4 tls

TLS krypterer tilkoblingen.

Obligatorisk for Service Bus og Event Hubs.

25.1.5 tidsavbrudd

Tidsbegrensning for tilkobling og hver venting på megleren.

Defaults to 30s.

25.2 AS2-partner

AS2Partner er en handelspartner som en AS2-kilde aksepterer meldinger fra.

Definert som AS2Partner i internal/config.

NøkkelTypeObligatoriskStandard
idtekstja—
cert_filetekstja—
allow_unsignedtrue eller falsenei—
allow_unencryptedtrue eller falsenei—

25.2.1 certifikatfil

Certifikatfil er partnerens sertifikat (PEM), for dens signaturer.

Ofte selvsignert: AS2-partnere utveksler sertifikater direkte i stedet for gjennom en myndighet.

25.2.2 tillat_unsigned

TillatUnsigned og TillatUenkryptert aksepterer en melding fra denne partneren som ikke er signert, eller ikke kryptert.

Av: en slik melding avvises med en kvittering som sier hvorfor.

25.2.3 tillat_uenkryptert

TillatUnsigned og TillatUenkryptert aksepterer en melding fra denne partneren som ikke er signert, eller ikke kryptert.

Av: en slik melding avvises med en kvittering som sier hvorfor.

25.3 AWS-tilgang

AWS-tilgang er hvordan en connector når AWS: regionen det signerer for, nøklene og et valgfritt endpoint-override.

Legitimasjonsdata kan være bokstavelig eller ${ENV_VAR}-referanser, som er hvordan de bør leveres. Det finnes ingen instans-metadata-creditialkjedee, med vilje: se internal/awsv4.

Definert som AWSAccess i internal/config.

NøkkelTypeObligatoriskStandard
regiontekstja—
access_key_idtekstnei—
secret_access_keytekstnei—
session_tokentekstnei—
endpointtekstnei—

25.3.1 secret_access_key

SecretAccessKey er den hemmelige, bokstavelig eller ${AWS_SECRET_ACCESS_KEY}.

Foretræk referansen: denne filen går inn i versjonskontroll.

25.3.2 session_token

SessionToken er kun for midlertidige kreditorer.

De utløper, og connector stopper å fungere når de gjør.

25.4 Ack

Ack konfigurerer ack-kjennelse.

Definert som Ack i internal/config.

NøkkelTypeObligatoriskStandard
whenAckWhennei—
applicationtekstnei—
facilitytekstnei—
include_trigger_eventtrue eller falsenei—

25.4.1 include_trigger_event

IncludeTriggerEvent sender ACK^A01 i stedet for ACK.

Noen mottakere krever det og andre avviser det, så det er eksplisitt.

25.5 Azure Blob-tilgang

AzureBlobAccess er konto, container og kreditor.

Definert som AzureBlobAccess i internal/config.

NøkkelTypeObligatoriskStandard
accounttekstja—
containertekstja—
keytekstnei—
sastekstnei—
endpointtekstnei—

25.5.1 nøkkel

Nøkkel er konto-nøkkel eller ${AZURE_STORAGE_KEY}.

Sett det eller sas.

25.5.2 sas

SAS er en delt tilgangs-signatur-spørringsstreng eller en ${...}-referanse.

Foretrukket: den kan begrenses til denne containeren.

25.6 Kontraktref

ContractRef peker en kanal mot sin kontrakt.

Definert som ContractRef i internal/config.

NøkkelTypeObligatoriskStandard
filetekstja—
check_everytekstnei15 minutter
overheltallnei500

25.6.1 sjekk_hver

CheckEvery er hvor ofte man skal sjekke på nytt, som en varighet.

Standard er 15 minutter.

Effektivt begrenset til varslingsevalueringintervallet, som er 30 sekunder som standard, fordi sjekken kjører fra denne løkken i stedet for en egen timer - så en kontrakt som ber om 3 sekunder får 30 sekunder. Dette er med vilje: en timer er enklere å forstå enn to, og det holder en kontraktresultat i tritt med den lesningen det er koblet til. Verdt å vite før noen setter en kort interval og konkluderer med at det er feil.

Ikke per melding. Å bygge en profil innebærer å lese nylig trafikk, og å gjøre det på hver melding ville gjøre en kanals gjennomstrømming avhengig av hvor mye historikk det har - som er en type ytelsesegenskap som bare viser seg i produksjon, seks måneder inn.

25.6.2 over

Over er hvor mange nylige meldinger som skal profileres.

Defaults to 500.

Et tell i stedet for et tidsvindu, fordi en stille kanal og en travel kanal trenger samme mengde bevis for å rettferdiggjøre en rate, og et tidsvindu gir dem veldig forskjellige mengder.

25.7 DICOM-alternativer

DICOMOptions konfigurerer en bildekanal.

Hvorfor trinnene er navngitt i stedet for stier

Hver annen format får en sti-skriver. DICOM har med vilje ikke det, og grunnen er pikseldata: et objekt er binært, en generell tag-skriver kan sette noen tag til noen bytes, og en feil der produserer ikke en avvist melding - det produserer et bilde som åpner og er feil.

Så de fire ting stedene faktisk trenger er navngitte handlinger med begrensede effekter: de-identifisere, omskrive en AE-tittel, fjerne private tagger, sette institusjonen. Hver vet hvilke tagger det berører, og ingen kan nå pikseldata.

Hvorfor denne blokkken eksisterer nå

internal/dicom har hatt steps.go og transform.go i en stund - de fire handlingene, dicom.Apply, og tester. Ingen refererte til dem. Fem hundre linjer uten noen kaller, som køens egen seksjon 7 navner: en implementering uten kaller er ikke å skille fra en funksjon som ikke eksisterer. Denne blokkken og motor-kallet er koblingen, ikke funksjonen.

Definert som DICOMOptions i internal/config.

NøkkelTypeObligatoriskStandard
transformationsliste over dicom.Stepnei—

25.8 Direkte adresse

DirectAddress er en direkte adresse denne serveren har: dens sertifikat og nøkkel, og de ankrene det stoler på.

Samme blokk brukes til å sende (signere som denne adressen) og motta (dekryptere for den).

Definert som DirectAddress i internal/config.

NøkkelTypeObligatoriskStandard
addresstekstja—
cert_filetekstja—
key_filetekstja—
anchors_filetekstja—

25.8.1 certifikatfil

CertFile og KeyFile er adressens sertifikat (PEM, med kjede etter) og privat nøkkel (PEM).

HISP eller dens registreringsmyndighet utsteder dem; de er adressens identitet.

25.8.2 key_file

CertFile og KeyFile er adressens sertifikat (PEM, med kjede etter) og privat nøkkel (PEM).

HISP eller dens registreringsmyndighet utsteder dem; de er adressens identitet.

25.8.3 anchors_file

AnchorsFile er tillitsankrene (PEM): sertifiseringssystemene som denne adressen stoler på, slik som DirectTrust-pakken.

En melding signert med noe annet avvises.

25.9 Direkte IMAP

Direkte IMAP er HISP-postboksen som en Direkte kilde leser.

Definert som DirectIMAP i internal/config.

NøkkelTypeObligatoriskStandard
hosttekstja—
portheltallnei—
securitytekstnei—
usernametekstja—
passwordtekstnei—
mailboxtekstnei—
after_readtekstnei—
move_totekstnei—
error_foldertekstnei—
poll_intervalvarighet, som 30s eller 5mnei—
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—

25.9.1 flytt_til

MoveTo er mappen meldinger flyttes til; Prosessert som standard.

Opprettes når den mangler.

25.9.2 tls

TLS tilliter en CA-fil (eller HISP-egen sertifikat) og navngir serveren forventet i den, for en HISP hvis IMAP-sertifikat ikke er fra en offentlig myndighet.

Sertifikatet blir alltid verifisert.

25.10 Direkte XDR

Direkte XDR er endepunktet som en Direkte kilde tar XDR fra.

Definert som DirectXDR i internal/config.

NøkkelTypeObligatoriskStandard
listentekstja—
tls_certtekstnei—
tls_keytekstnei—
client_ca_filetekstnei—

25.11 ECR-fasilitet

ECRFasilitet er organisasjonen som sender saksrapporter.

Definert som ECRFacility i internal/config.

NøkkelTypeObligatoriskStandard
nametekstja—
npitekstnei—
phonetekstja—
linetekstnei—
citytekstja—
statetekstja—
postal_codetekstnei—

25.12 EDIFACT-alternativer

EDIFACT-alternativene er innstillingene som bare gjelder for en EDIFACT-kanal.

Definert som EDIFACTOptions i internal/config.

NøkkelTypeObligatoriskStandard
envelopetekstnei—
splittrue eller falsenei—
acknowledgetekstnei—

25.12.1 bekrefte

Bekreftelse svarer en avsender som poster over HTTP med en CONTRL i svaret: akseptert (handling 7) når interchange ble lest og levert, avvist (4) ellers.

Default none.

25.13 E-post O Auth

EmailOAuth logger inn med OAuth 2.0 (SASL XOAUTH2), som Microsoft 365 og Gmail krever i stedet for passord.

Definert som EmailOAuth i internal/config.

NøkkelTypeObligatoriskStandard
providertekstja—
tenanttekstnei—
token_urltekstnei—
client_idtekstja—
client_secrettekstnei—
refresh_tokentekstnei—
scopetekstnei—

25.13.1 klient_hemmelighet

ClientSecret kan være ${ENV}.

Uten oppfrisk_token velger den Microsofts app-bare klient-credens-grant.

25.13.2 oppfrisk_token

OppfriskToken kan være ${ENV}: en postkasse en person har gitt samtykke til.

Kreves for Gmail.

25.14 FHIR Autentisering

FHIRAuth er måten en FHIR-destinasjon autentiserer til en vertsfhir-tjeneste.

Tre forhåndsinnstillinger, fordi vertstjenestene er der en bærertoken limt inn i en fil slutter å fungere innen time.

Tokenene hentes når de trengs og gjenbrukes til en minutt før de utløper.

Definert som FHIRAuth i internal/config.

NøkkelTypeObligatoriskStandard
typetekstja—
regiontekstnei—
access_key_idtekstnei—
secret_access_keytekstnei—
session_tokentekstnei—
tenant_idtekstnei—
token_urltekstnei—
client_idtekstnei—
client_secrettekstnei—
scopetekstnei—

25.14.1 region

Region er AWS-regionen.

Leses fra en HealthLake-URL når den ikke er gitt.

25.14.2 token_url

TokenURL er OAuth-token-endepunktet for client_credentials.

For azure er det avledet fra leietakeren.

25.14.3 client_id

ClientID og ClientSecret identifiserer programmet.

Hemmeligheten kan være en ${ENV}-referanse, som er hvordan den bør gis.

25.14.4 klient_hemmelighet

ClientID og ClientSecret identifiserer programmet.

Hemmeligheten kan være en ${ENV}-referanse, som er hvordan den bør gis.

25.14.5 scope

Omfang er forespurt med tokenet.

For azure er standardverdien FHIR-tjenestens URL fulgt av /.default, som er dens publikum.

25.15 Filavstemming

FilePoll er den delen av en fil-samlerkilde som ikke har noe å gjøre med transporten.

Delt av lokale, FTP, SMB og WebDAV-kilder, og av SFTP. Hver enkelt av disse innstillingene eksisterer på grunn av en måte filer går galt snarere enn en måte transportene forskjeller, som er hvorfor de hører sammen: et sted som har funnet ut den riktige stable_for for sin analyserer bør ikke måtte finne det ut igjen når analysereren flytter til en andel.

Definert som FilePoll i internal/config.

NøkkelTypeObligatoriskStandard
dirtekstja—
patterntekstnei—
poll_intervalvarighet, slik som 30s eller 5mnei—
after_readtekstnei—
move_totekstnei—
error_dirtekstnei—
stable_forvarighet, slik som 30s eller 5mnei—
max_file_sizeheltallnei—
framedsann eller usannnei—
rawsann eller usannnei—
batch_sizeheltallnei—
sort_bytekstneinavn

25.15.1 mønster

Mønster velger filer etter glob.

Tomt betyr hver fil.

25.15.2 feil_mappe

ErrorDir er hvor en fil som ikke kunne prosesseres havner.

Separat fra MoveTo med vilje. En mappe som bare inneholder feil er en noen kan overvåke, og å blande feil inn i arkivet betyr at den eneste måten å finne dem er å lese hver enkelt fil.

25.15.3 rå

Raw behandler hele filen som ett enkelt meldingsobjekt uavhengig av innhold.

Innstillingen som gjør denne koblingen nyttig for noe annet enn HL7. Uten den vil en CSV-batch, en X12-kravfil eller en PDF bli delt på linjer som begynner med MSH og produsere ingenting, og feilen sier at filen ikke er HL7 - sant, men ikke poenget, siden filen aldri var ment å være.

25.15.4 batch_størrelse

BatchSize avgrenser hvor mange filer en enkelt polling kan lese.

Null betyr ingen begrensning.

Eksisterer for den første polling etter en nedtid. En mappe som inneholder førti tusen filer som har akkumulert seg over natten, vil ellers bli lest i ett løp, hvilket holder poll-løkken oppe så lenge det tar og gjør kanalen se ut som om den henger.

25.15.5 sorter_etter

SortBy ordner filene innen en polling: navn, modifisert eller ingen.

Standard er navn. Orden er viktigere enn det ser ut: en ADT-strøm hvor A08-oppdateringer ankommer før A01-innlegging produserer pasienter som ikke eksisterer ennå. Mappe-liste-orden er arbitrær på de fleste filsystemer, så å la den forbli usortert betyr at rekkefølgen endres mellom pollinger uten noen synlig grunn.

25.16 GCP-tilgang

GCPAccess er hvordan man autentiserer til Google Cloud.

Definert som GCPAccess i internal/config.

NøkkelTypeObligatoriskStandard
projecttekstnei—
credentials_filetekstnei—
endpointtekstnei—

25.16.1 credentials_fil

CredentialsFile er en JSON-nøkkel for en tjenekonto.

Tomt bruker tjenekontoen som er koblet til VM, GKE-pod eller Cloud Run-tjenesten Perfuse kjører på (metadata-serveren), med mindre Endpoint navngir en emulator.

25.17 GCS-tilgang

GCSAccess er en Cloud Storage-bucket.

Definert som GCSAccess i internal/config.

NøkkelTypeObligatoriskStandard
buckettekstja—

25.18 IBMMQ-tilkobling

IBMMQConnection er en kø som nås gjennom kølederens meldings-REST-API.

Definert som IBMMQConnection i internal/config.

NøkkelTypeObligatoriskStandard
urltekstja—
queue_managertekstja—
queuetekstja—
usernametekstnei—
passwordtekstnei—
tlstlsconf.Innstillinger (en blokk, utelat for å ikke inkludere)nei—
api_versiontekstnei—
timeoutvarighet, som 30s eller 5mnei30s

25.18.1 brukernavn

Brukernavn og passord er en mqweb-bruker med MQWebUser-rolle; passordet kan være ${ENV}.

La begge felt stå tomme når en klient-sertifikat (tls.cert_file) autentiserer.

25.18.2 passord

Brukernavn og passord er en mqweb-bruker med MQWebUser-rolle; passordet kan være ${ENV}.

La begge felt stå tomme når en klient-sertifikat (tls.cert_file) autentiserer.

25.18.3 tidsavbrudd

Tidsbegrensning begrenser hver forespørsel.

Defaults to 30s.

25.19 Kafka SASL

KafkaSASL autentiserer til en Kafka-kluster.

Definert som KafkaSASL i internal/config.

NøkkelTypeObligatoriskStandard
mechanismtekstja—
usernametekstja—
passwordtekstja—

25.19.1 mekanisme

Mekanisme er "plain", "scram-sha-256" eller "scram-sha-512".

PLAIN sender passordet leselig over ledningen, så det hører sammen med TLS. SCRAM gjør ikke det, og det er derfor verdt å navngi forskjellen her i stedet for å behandle de tre som utskiftbare.

25.19.2 passord

Passord er SASL-passordet.

Støtter ${ENV}-referanser som alle andre hemmeligheter her, så en kluster-credential trenger ikke å skrives inn i kanal-filen.

25.20 MQTT-tilkobling

MQTTConnection er hvordan man når en MQTT 3.1.1-meldingsformidler: Mosquitto, EMQX, HiveMQ, AWS IoT Core, Azure Event Grid.

Definert som MQTTConnection i internal/config.

NøkkelTypeObligatoriskStandard
addrtekstja—
client_idtekstnei—
usernametekstnei—
passwordtekstnei—
tlstlsconf.Settings (en blokk, utelat for å ikke inkludere)nei—
qosheltall (en blokk, utelat for å ikke inkludere)nei—
timeoutvarighet, slik som 30s eller 5mnei30s

25.20.1 client_id

Klient-ID navngir sesjonen.

En kilde beholder meldingene sine over gjenkoblinger bare under et fast klient-id; det standarder til perfuse-<kanal>.

25.20.2 brukernavn

Brukernavn og passord autentiserer; begge kan være tomme.

Passordet kan være ${ENV}.

25.20.3 passord

Brukernavn og passord autentiserer; begge kan være tomme.

Passordet kan være ${ENV}.

25.20.4 tidsavbrudd

Tidsbegrensning for tilkobling og hver venting på megleren.

Defaults to 30s.

25.21 NCPDP-alternativer

NCPDPOptions er innstillingene som bare gjelder for en apotek-krav-kanal.

Definert som NCPDPOptions i internal/config.

NøkkelTypeObligatoriskStandard
transformationsliste over ncpdp.Stepnei—

25.21.1 transformasjoner

Transformasjoner er deklarative endringer som gjøres på hver overføring før levering.

Samme vokabular som alle andre formater - sett, kopier, nullstill, kart, erstatt, trim, case, hver med en valgfri betingelse - fordi steg-motoren i internal/steps er generisk. Hva som forskjeller er notasjonen: en sti skrives D1 eller 07-D7, ved hjelp av standardens egne to-tekst- feltidentifikatorer.

25.22 PGP Motta

PGPReceive åpner hva en kilde mottar med OpenPGP: dekryptert med vår hemmelige nøkkel, og dens signatur sjekkes mot sendernes offentlige nøkler.

Definert som PGPReceive i internal/config.

NøkkelTypeObligatoriskStandard
decrypt_withtekstnei—
passphrasetekstnei—
verify_withliste over tekstnei—
require_signaturesann eller usannnei—
allow_unencryptedsann eller usannnei—
pass_plainsann eller usannnei—

25.22.1 dekrypter_med

DekrypterMed er vår hemmelige nøkkel-fil.

Obligatorisk med mindre tillat_uenkryptert er på og meldinger bare er signert.

25.22.2 passord

Passord åpner DekrypterMed når den er beskyttet.

Foretrekk et miljøvariabel-referanse, ${NAME}.

25.22.3 verifiser_med

VerifiserMed er sendernes offentlige nøkkel-filer.

En signatur fra noen av dem sjekkes og registreres.

25.22.4 pass_uten_kryptering

PassUtenKryptering lar en melding som ikke er PGP i det hele tatt gå ubendret gjennom, for en mappe som mottar begge.

Av: en slik melding avvises, så en sender som glemte å kryptere blir informert.

25.23 PGP Send

PGPSend beskytter hva en destinasjon leverer med OpenPGP: kryptert til mottakerens offentlige nøkkel, signert med vår, eller begge.

Betalere, clearinghus og statlige etater tar ofte filer over SFTP bare på denne måten.

Definert som PGPSend i internal/config.

NøkkelTypeObligatoriskStandard
encrypt_toliste med tekstnei—
sign_withtekstnei—
passphrasetekstnei—
armortrue eller falsenei—
no_compresstrue eller falsenei—
file_nametekstnei—

25.23.1 krypter_til

EncryptTo er mottakernes offentlige nøkkel filer (armert eller binær).

Meldingen kan leses av noen av dem. Tom: meldingen er bare signert.

25.23.2 signer_med

SignerMed er vår hemmelige nøkkel fil, for å signere hver melding.

Tom: bare kryptert.

25.23.3 passord

Passord åpner SignerMed når den er beskyttet.

Foretrekk et miljøvariabel-referanse, ${NAME}.

25.24 Køkonfigurasjon

Køkonfigurasjon aktiverer varig køing for en destinasjon.

Uten det, mister en destinasjon som er nede i to minutter alt som sendes under de to minuttene: nye forsøk skjer i minne og når de tar slutt, blir meldingen registrert som feilet og borte. Med det, er meldingen på disk og beholder sin plass til mottakeren kommer tilbake.

Det er av som standard, som er et bevisst valg snarere enn forsiktighet. En kø endrer hva en bekreftelse betyr og det endrer rekkefølgen under en nedetid, og begge deler er ting en operatør bør velge bevisst snarere enn å oppdage.

Definert som QueueConfig i internal/config.

NøkkelTypeObligatoriskStandard
enabledsann eller usannnei—
max_attemptsheltallnei—
backoffvarighet, som 30s eller 5mnei—
max_backoffvarighet, som 30s eller 5mnei—
max_depthheltallnei—
retain_hoursheltallnei—

25.24.1 maks_forsøk

MaksForsøk er hvor mange ganger køen prøver før den markerer en melding som feilet og går videre til den neste.

Null betyr fortsett uendelig, som er legitimt for en kanal som ikke må miste noe, men bør velges snarere enn arvet.

25.24.2 maks_tilbakehold

MaksTilbakehold begrenser den økende forsinkelsen.

Standarden er en minutt snarere enn noe større fordi en mottaker som kommer tilbake etter en kortvarig nedetid bør finnes raskt: en time-langt tak begrenser en to-minutters feil til en time med baklog.

25.24.3 maks_dybde

MaksDybde nekter nye meldinger når så mange venter, så en mottaker som har vært nede i en uke kan ikke fylle disken.

Null betyr ingen begrensning.

Når grensen er nådd, feiler meldingen snarere enn køes, og avsenderen blir fortalt det — som er det ærlige svaret, fordi vi ikke lenger lover å levere den.

25.24.4 retain_hours

BeholdTimer er hvor lenge levert og forlatt materiale beholdes før de slettes.

De beholdes så noen som ser på en baklog kan se det skje, og så en forlatt melding kan finnes senere.

25.25 Ny forsøk

Ny forsøk kontrollerer levering på nytt etter en feil.

Definert som Retry i internal/config.

NøkkelTypeObligatoriskStandard
attemptsheltallnei—
backoffvarighet, som 30s eller 5mnei—
max_backoffvarighet, som 30s eller 5mnei—

25.25.1 forsøk

Forsøk er det totale antallet forsøk, inkludert det første.

Null betyr standard.

25.25.2 backoff

Backoff er ventetiden før det andre forsøket.

Den dobles hver gang, opp til MaxBackoff.

25.26 Skriptalternativer

ScriptOptions konfigurerer en NCPDP SCRIPT-kanal.

Hvorfor SCRIPT får en blokk når dens filter er top-nivå

Kanalfilteret for hver datatype er top-nivå filternøkkel, fordi internal/expr er generisk over meldingstypen: en nøkkel, kompilert mot hvilken som helst tre eller krav kanalene bærer. Trinn kan ikke ordnes på den måten. Et v2-trinn adresserer et segment og et felt, et X12-trinn adresserer et fast breddeelement, og typene er forskjellige, så en yaml-nøkkel måtte holde hvilken som helst datatypen impliserte - som er et felt som betyr forskjellige ting avhengig av et annet felt, og feilmodusen er et trinn som stille gjør ingenting.

Så dette følger hl7v3, x12, ncpdp og avgrenset: trinnene bor i formatets egen blokk, og top-nivå transformasjonsnøkkelen avvies på en SCRIPT-kanal i stedet for å aksepteres og ignoreres.

Definert som ScriptOptions i internal/config.

NøkkelTypeObligatoriskStandard
transformationsliste over hl7v3.Stepnei—

25.26.1 transformasjoner

Transformasjoner er deklarative trinn, som adresserer resepten som en XML-tre.

hl7v3.Step i stedet for en type på egen hånd, og det er ikke dovenskap. En resept og et v3-dokument er begge XML, sti-grammatikken er den samme, og internal/eprescribe allerede låner hl7v3.Path for sitt filter med en kommentar som sier det - v3 og CDA bruker allerede det, og en tredje kopi ville være en tredje sett med svar på hva //a/b[2]@c betyr.

Trinnene som bærer v3-kun betydning avvies ved lasting i stedet for å være stille tilgjengelig. nullflavor er den ene: den skriver v3-attributt som angir hvorfor en verdi er fraværende, som en resept ikke har noen ekvivalent av, og et trinn som skrev det ville produsere et dokument mottakeren ikke forstår.

25.27 Skript

Skripter inneholder JavaScript som er koblet til en kanal.

Definert som Scripts i internal/config.

NøkkelTypeObligatoriskStandard
filtertekstnei—
transformertekstnei—
preprocessortekstnei—
deploytekstnei—
undeploytekstnei—
postprocessortekstnei—
languagetekstnei—
timeoutvarighet, som 30s eller 5mnei—
includeliste over tekstnei—
file_rootsliste over tekstnei—
allowliste over tekstnei—

25.27.1 filter

Filter kjører etter uttrykksfilteret, hvis det finnes, og må returnere en boolsk verdi.

En Mirth filter-skript faller uendret inn her.

25.27.2 transformer

Transformer kjører etter de deklarative trinnene og kan modifisere meldingen.

En Mirth transformer-skript faller uendret inn her.

25.27.3 forhåndsprocessor

Forhåndsprocessoren kjører før meldingen parses, leser teksten som "melding" og returnerer teksten til å parse.

En Mirth-forhåndsprocessor fungerer uendret her.

Dette er det eneste stedet hvor en melding som ikke kan parses kan repareres. Steder bruker det for en vill karakter fra en seriegatevei, en segmentavslutter som ankom som en linjeskift, eller en leverandør som fyller en felt med noe ulovlig for dens posisjon. Uten det, avviser Perfuse trafikk som Mirth aksepterer i dag.

25.27.4 distribuer

Distribuer kjører en gang når kanalen starter, før den aksepterer noe.

Dette er hvor steder varmer en oppslagshvelv eller sjekker at noe de avhenger av er tilgjengelig. Det kjører før kilden binder, så et distribuer-skript som feiler stopper kanalen fra å starte i stedet for å la den akseptere meldinger den ikke kan håndtere.

25.27.5 avdistribuer

Avdistribuer kjører en gang når kanalen stopper.

Etter at kilden har stoppet å akseptere og etter at meldinger underveis er ferdige, så det ser en kanal som er genuint inaktiv. Dets feil kan ikke stoppe en stopp: en kanal som ikke kunne stenges fordi en rengjøringsskript kastet ville være verre enn en som logget og lukket.

25.27.6 etterbehandler

Etterbehandler kjører etter at meldingen har blitt håndtert og kan ikke endre den.

Meldingen og hva som skjedde med den er synlige, så det kan varsle, telle eller registrere. Det kan ikke endre hva som ble sendt: ved tidspunktet det kjører har sendingen skjedd, og et skript som syntes å endre en levert melding ville lyve om det.

25.27.7 språk

Språk er hvilket skriptspråk disse skriptene er skrevet i: javascript eller lua.

Hvorfor en innstilling for hele blokket i stedet for en per skript

En kanals skripter deler kanalkartet og connector-kartet, og de leses sammen av den som vedlikeholder dem. Et filter i Lua ved siden av en transformer i JavaScript ville bety to språk i en gjennomgang, som deler tilstand gjennom et kart hvis verdier måtte bety det samme i begge. Steder som ønsker det kan dele kanalen.

Hvorfor standarden er javascript

Hvert skript skrevet før denne innstillingen eksisterte er JavaScript og sier ingenting om sitt språk. Å gjøre lua til standard ville stille reinterpret alle dem; å kreve feltet ville nekte dem. Ingen av delene er akseptable for en innstilling lagt til senere.

25.27.8 tidsavbrudd

Tidsavbrudd begrenser hvert skript.

Null betyr fem sekunder.

Det er med vilje ingen måte å deaktivere det på. Mirth tillater en transformer å løkke for alltid, som stopper kanalen, og et grensesnitt som stopper å akseptere innlegg på grunn av en skrivefeil er ikke noe å tilby som en valgmulighet.

25.27.9 inkluder

Inkluder navngir filer av delt skrikkilde som gjøres tilgjengelig for hvert skript på denne kanalen, i hvilket som helst språk skripter.språk navngir.

Dette er Mirths kode-mal. En plass med førti kanaler har vanligvis ett bibliotek hver kanal kaller, og uten det betyr en migrering å kopiere det biblioteket inn i førti filer - førti steder å fikse neste gang det endres.

Stier er relative til kanal-filen, så en bibliotek ved siden av kanalene reiser med dem. Det er en liste fordi alternativet er en enorm fil, og biblioteker tenderer å dele seg etter emne.

Fila må være på kanalens språk. Dette var JavaScript-kun i en periode, og ikke på grunn av nekt: en Lua-kanal leste fila, nektet en manglende en, og deretter installerte kjøretiden ingen av den, så hver kall til biblioteket feilet på den første meldingen med en nil global - den eksakte feilen nektelsen ovenfor eksisterer for å unngå.

25.27.10 file_roots

FileRoots er katalogene FileUtil kan lese og skrive.

Kreves når "file" er tillatt. Å gi filtilgang uten å navngi kataloger betydde tidligere hele filsystemet: et skript kunne lese Perfuses egen database, som inneholder passord-hasher, LDAP-tjenekonto-passord og OIDC-klient-hemmelighet. Å opprette en kanal krever bare redigeringsrollen, så eskaleringen ble fullført øyeblikket en administrator startet den.

25.27.11 allow

Allow gir skriptet muligheter som ellers ville bli nektet: "file", "database", "route".

Mirth gir alle disse til hvert skript; å kreve at de må navngis betyr at en transformer ikke kan stille og lese filsystemet etter en kopier-og-lim-inn.

25.28 Skygge

Shadow kjører en kandidatversjon av en kanal ved siden av den live en og rapporterer hvor de forskjeller.

Dette er svaret på spørsmålet som gjør grensesnittsarbeid skremmende: hvordan vet du at en endring er trygg? Ikke ved å lese den. En transformasjon er et program som opererer på meldinger hvis variasjon ingen har katalogisert, og tilfelle som bryter er alltid det ingen tenkte på - pasienten med to identifikatorer, resultatet med et tomt enhetsfelt, A08 som ankommer før A01.

En kanaltest beviser tilfellene noen tenkte på. Shadow-modus beviser tilfellene som faktisk ankommer, mot ekte trafikk, før endringen bærer noen av dem.

To egenskaper gjør det trygt, og begge er strukturelle fremfor konfigurerbare:

Definert som Shadow i internal/config.

NøkkelTypeKrevesStandard
channeltekstja—
sampletallnei1
compareliste av tekstnei—
ignoreliste av tekstnei—
max_differencesheltallnei100
timeoutvarighet, som 30s eller 5mnei5s

25.28.1 channel

Kanal er stien til kandidat-kanal-filen.

En separat fil fremfor en inline-blokk, med vilje: kandidaten er ment å bli den live kanalen, så den bør være artefaktet som blir gjennomgått, committet og promotert, ikke et fragment som må trekkes ut.

25.28.2 sample

Sample er brøkdelen av meldinger som skal skygges, fra 0 til 1. Standard er 1.

Verdt å senke bare på en travel kanal, og verdt å forstå før det gjøres: sampling reduserer kostnad og reduserer tillit i samme proporsjon, og meldingen som ville ha vist forskjellen er den uvanlige en.

25.28.3 compare

Compare begrenser sammenligningen til disse feltstier.

Tom sammenligning sammenligner alt.

25.28.4 ignore

Ignorerer ekskluderer feltveier fra sammenligningen.

Nødvendig i praksis, fordi en kanal som stamper en tidsstempel eller en sekvensnummer forskjeller på hvert enkelt melding og ville rapportere en forskjellsrate på 100% mens den forteller deg ingenting.

25.28.5 max_forskjeller

MaxForskjeller avgrenser hvor mange forskjellige meldinger som behandles for inspeksjon.

Defaults to 100.

25.28.6 tidsavbrudd

Tidsavbrudd avgrenser en skyggekjørning.

Defaults to 5s.

Separat fra kanalen egen tidsavbrudd, og kortere. En kandidat med en løpsk skript må ikke akkumulere gorutiner bak live-trafikken.

25.29 XDS-kode

XDS-kode er en kodet verdi i destinasjonsinnstillinger: kode, kodingskjema (en OID) og visning.

Definert som XDSCode i internal/config.

NøkkelTypeObligatoriskStandard
codetekstja—
schemetekstja—
displaytekstnei—

26 Hvordan hver komponent fungerer

Perfuse er bygget av små pakker, hver med ett arbeid. Dette kapitlet er hver enkelt pakkes egen beskrivelse av hva den gjør og hvorfor den er bygget på den måten, tatt fra kildekoden. Hvor en beslutning har en grunn som ikke er åpenbar, er grunnen her i stedet for i en commit-melding som ingen vil finne.

26.1 fhir

Pakken fhir implementerer FHIR-resurser, serialisering og validering.

Versjonshåndtering er den første designbeslutningen, fordi "FHIR" alene ikke identifiserer en wireformat. R5 er den siste publiserte utgaven og er standarden her. R4 er hva den installerte basen og US-reguleringen faktisk forbruker, så det er fullt støttet i stedet for å behandles som legacy. R6 er i ballot på skrivetidspunktet og er med vilje ikke implementert: å levere en gjett på en upublisert spesifikasjon ville være verre enn å ikke støtte den.

Resourcemodellen er R5-formet. Hvor R4 forskjeller, blir forskjellen brukt ved serialisering i stedet for å holde to parallelle sett med strukturer, som er hvordan en kodebase ender opp med to subtilt divergerende definisjoner av Pasient.

Source: github.com/biodream-llc/perfuse/fhir

26.2 hoved

Kommandoen xmlordergen skriver elementrekkefølgen FHIR XML trenger, fra en core-pakkes StructureDefinitions.

go run ./fhir/xmlordergen hl7.fhir.r4.core-4.0.1.tgz | gzip -9 -n > fhir/xmlorder_r4.txt.gz

JSON-objekter kan holde medlemmene sine i vilkårlig rekkefølge; XML kan ikke: hvert element må komme i rekkefølgen det er definert. Hver utgangslinje er en sti og dens barn i den rekkefølgen, hver barn med hvordan å finne sine egne barn: "@Path" (et element definert inline, en ryggrad), "#Path" (det samme som et annet element), eller dens typer.

Source: github.com/biodream-llc/perfuse/fhir/xmlordergen

26.3 hl7

Pakken hl7 leser HL7-versjon 2-meldinger.

Den har ingen avhengigheter utenfor standardbiblioteket, og en test påtvinger det. Den gjør ingen nettverks-I/O, skriver ingen filer og starter ingen gorutiner, så det er trygt å bruke fra hvor som helst.

Reading a message

msg, err := hl7.Parse(raw) hvis err != nil { return err } mrn := msg.MustGet("PID-3.1") navn := msg.MustGet("PID-5.1") msgType, event, _ := msg.Type() // "ADT", "A01"

Stier er notasjonen mennesker allerede bruker når de snakker om HL7: segment, felt, deretter valgfri komponent og subkomponent, som i PID-5.1 eller OBX-5.2.3. Gjentakelser adresseres med kvadratparenteser, som i PID-3[2].1.

Get returnerer en feil for en sti den ikke kan parse; MustGet returnerer den tomme strengen i stedet. Begge er trygge på fraværende segmenter og felt, fordi en ekte strøm er full av begge og en parser som panikker på manglende data er nytteløs for jobben. Fravær er ikke en feil — en melding som enkelt ikke bærer PID-8 gir "" i stedet for en feil.

Fraværende og tom

HL7 skille mellom et felt som ikke ble sendt fra ett som ble sendt med vilje tomt, og klinisk kan disse bety forskjellige ting - "ingen allergier registrert" er ikke "ingen kjente allergier". Value.Exists rapporterer forskjellen der kallerne trenger det, mens String flatt både til "" for det vanlige tilfelle.

Kopiering og den ene måten å få dette galt

Parse kopierer inndataene sine, så det returnerte Message-forbeholdet forblir gyldig uansett hvordan kalleren gjenbruker bufferten. Det koster omtrent 3% og en allokering per melding.

WithZeroCopy hopper over kopiingen og beholder en referanse til kallerens skjæring i stedet. Det er raskere, og det gjør Message-forbeholdet usikkert å bruke etter at skjæringen er skrevet på nytt. Å lese inn i en gjenbrukt buffert er den normale, effektive måten å lese fra et nettverk i Go, så fellen fanger forsiktige kode, og symptomet er stille feil feltverdier i stedet for en feil - en pasients data under en annen pasients navn. Bruk det for inndata som er uforanderlig eller overlever Message-forbeholdet, og ikke ellers.

Acknowledgements

AckFor bygger en ACK eller NAK for en melding, inkludert for en som feilet under parsing, som er det tilfelle som betyr mest: en avsender trenger en svart selv om det som ble sendt ikke var en melding. Se AckOptions.

Hva dette pakket ikke gjør

Det skriver eller modifiserer ikke meldinger. Det har ingen forestilling om meldingsstruktur utover segmenter, så det vil ikke fortelle deg at en PV1 tilhører en bestemt besøksgruppe. Det validerer ikke mot en versjons tabeller. Disse er bevisste utelatelser snarere enn oversights: dette er en indexer for ekte trafikk, som ofte ikke er standard-konform og likevel må rutes.

Source: github.com/biodream-llc/perfuse/hl7

26.4 admit

Pakke admit begrenser hvor mye arbeid som er i gang på en gang.

Motoren spawner en goroutine per destinasjon per melding. Goroutineer er billige; hva de holder er ikke. Hver utgående levering holder en socket på den fjerne enden og en filbeskrivelse her, og den holder dem for hele gjentakelsesbudsjettet - med standardverdiene, fem forsøk på en tretti sekunders tidsavbrudd pluss femten sekunders tilbakehold, så nesten tre minutter. Et få hundre sendere mot en mottaker som har gått stille er derfor et få hundre beskrivelser holdt i minutter, og prosessen går tom.

Å gå tom er feilen som er verdt å forebygge, fordi den ikke kommer til overflaten der den skjedde. Den kommer til overflaten som "for mange åpne filer" et sted som ikke er relatert: databasen kan ikke åpne sin journal, grensesnittet stopper å akseptere, en logg kan ikke skrives. Motoren ser ut til å være ødelagt på tre steder på en gang og årsaken er et partnersystem som stoppet å svare.

To begrensninger, og den andre betyr mer enn den første:

En total, så prosessen forblir innenfor sin beskrivelsesbudsjett.

En begrensning per destinasjon, så en mottaker ikke kan forbruke totalen. Uten det kan en enkelt hengt partner ta ned alle andre kanaler, som er verre enn å ikke ha noen begrensning i det hele tatt: blast-radien vokser fra en kanal til alle kanaler.

Source: github.com/biodream-llc/perfuse/internal/admit

26.5 alerts

Pakke alerts ser på målinger og sier når noe er galt.

Poenget er at ingen bør behøve å se på dashbordet. "Feilte transaksjoner forblir køet uten omfattende undersøkelse" er en dokumentert operasjonell feil i denne klassen av programvare, og årsaken er alltid den samme: informasjonen var på en skjerm ingen var foran klokken fire om morgenen.

Tre beslutninger former det.

En advarsel må klare seg selv. En notifikasjon som utløser og aldri løser trener folk til å ignorere notifikasjoner. Hver regel her er evaluert mot nåværende tilstand, så en mottaker som kommer tilbake lukker advarselen den åpnet.

Advarsler er debounced av varighet, ikke av telling. "Feilfrekvens over 5% nå" utløser på en enkelt uheldig melding under en stille time. "Over 5% i to minutter" gjør det ikke. Hver regel bærer en Varighet og ingenting utløser før betingelsen har holdt så lenge.

Hva som sendes inneholder ingen pasientdata. En advarsel bærer en kanalnavn, en destinasjonsnavn, et nummer og en terskel. Disse kommer fra konfigurasjon og fra telling. En webhook går til en chat-rom, en chat-rom har en scrollback, og en scrollback er ikke et sted hvor en pasientidentifikator bør ende opp.

Source: github.com/biodream-llc/perfuse/internal/alerts

26.6 amqp

Pakke amqp er en AMQP 1.0-klient: en kobling, en sesjon, sende- og mottakelinker, avgjort etter mottakeren sier det.

AMQP 1.0 er hva Azure Service Bus og Event Hubs snakker, hva RabbitMQ 4 snakker naturlig, og hva ActiveMQ og Artemis snakker ved siden av STOMP. Skrevet her for årsaken STOMP-klienten og AWS-signeren er: en fullstendig klientbibliotek ville være mesteparten av binærs avhengighetsliste for fire performativer som betyr noe.

Hva det gjør: SASL PLAIN eller ANONYMOUS (Service Bus tar en delt tilgangsnøkkelnavn og nøkkel som PLAIN), TLS, åpne/begynne/vedlegge, kredittbasert flyt, en overføring delt i rammeverk når den overstiger peerens maksimum ramme-størrelse, og disposisjoner - akseptert, frigjort, avvist. Avsenderen venter på brokerens disposisjon før det rapporterer suksess, så "sendt" betyr at brokeren tok vare på det. Tomme rammeverk holder koblingen i live innen peerens idle-tidsavbrudd, som Service Bus pålegger.

Hva det ikke gjør: transaksjoner, flere sesjoner, link-gjenoppretting og meldingsannoteringer utover å lese dem.

Source: github.com/biodream-llc/perfuse/internal/amqp

26.7 analyser

Pakken analyze omgjør en parslet Mirth-kanal til noe en menneske kan handle på: en ren beskrivelse av hva kanalen gjør, og en ærlig liste over hva som ikke vil overleve en migrering.

Designregelen her er at en funn må være spesifikk nok til å handle på. "Denne kanalen bruker JavaScript" er ikke et funn. "Destinasjon 1 kaller java.util.Date, som ikke har noen ekvivalent utenfor JVM" er.

Source: github.com/biodream-llc/perfuse/internal/analyze

26.8 api

Pakken api betjener HTTP-grensesnittet som brukes av web-grensesnittet.

Den viktige designbegrensningen: kanaler leses fra og skrives til filer på disk. API-et er en redigerer for disse filene, ikke et annet lagringsystem som skjer at eksporterer YAML. En kanal opprettet i nettleseren og en skrevet for hånd er samme artifact, som er hva som gjør "eksporter til deling" trivialt og holder git som historikk.

Source: github.com/biodream-llc/perfuse/internal/api

26.9 as2

Pakken as2 er Applicability Statement 2 (RFC 4130): EDI over HTTP, signert og kryptert med S/MIME, med en signert kvittering (en MDN) som navngir en digest av hva som ankom.

Payers og handelspartnere bruker det for X12 og EDIFACT.

S/MIME er internal/cms, samme kode som Direct-meldinger bruker. Hva som er her er AS2s eget: sine header, meldingsintegritetskontrollen (MIC) og kvitteringen.

Source: github.com/biodream-llc/perfuse/internal/as2

26.10 attach

Pakken attach flytter store nyttelaster ut av en melding og setter dem tilbake.

En HL7-melding som bærer en skannet rapport eller en PDF er vanlig i dokumentflyter, og nyttelasten er vanligvis hundredvis av ganger større enn meldingen rundt den. Å lagre den inline betyr at meldingslagret vokser i takt med dokumentene snarere enn trafikken, en melding i kø for fem destinasjoner kopieres fem ganger, og grensesnittet må strømme megabyte for å vise noen en pasientnavn.

Så nyttelasten trekkes ut, lagres én gang etter innhold, og erstattes i meldingen med en token. Mirth kaller disse vedleggshåndterere og det er en dokumentert migreringsfunksjon, som er hvorfor tokenformatet her er designet for å være gjenkjennelig snarere enn smart.

Hva denne pakken ikke bestemmer

Den gjør ingen lagring og ingen I/O. Uttrekk produserer den om skrevne meldingen og nyttelastene; et Lag noen andre steder bestemmer hvor de går. Denne separasjonen er hva som gjør uttrekksprøvingen testbar uten en database, og det er også hva som lar samme logikk kjøre i WASM-lekeplassen hvor det ikke finnes noen database i det hele tatt.

Source: github.com/biodream-llc/perfuse/internal/attach

26.11 authlimit

Pakken authlimit begrenser feilede autentiseringsforsøk etter kildeadresse.

Den eksisterer fordi to lyttere trengte samme ting og en av dem hadde ingenting. FHIR-serveren fikk en begrenser når den fikk autentisering; konsoll-innloggingen hadde ingen i det hele tatt, og en måling viste tyve passordgjettinger per sekund mot administrator-kontoen uten noen forsinkelse og uten lås.

Bevisst ikke en generell hastighetsbegrenser. Den begrenser feil, ikke forespørsler: en travel legitim klient påvirkes aldri, og det eneste som akkumuleres er å være feil.

Source: github.com/biodream-llc/perfuse/internal/authlimit

26.12 awsmsg

Pakken awsmsg snakker til Amazon SQS og SNS med standardbiblioteket og den delte Signature Version 4-signer.

Samme argument som s3put: AWS SDK ville doble størrelsen på materialet for fire API-kall. SQS bruker sin JSON-protokoll (AWS JSON 1.0, X-Amz-Target AmazonSQS.<Action>), som AWS dokumenterer som den gjeldende; SNS bruker sin spørringsprotokoll, som er den eneste den har. Begge fungerer mot LocalStack og VPC-endepunkter via en endepunkts-override.

Source: github.com/biodream-llc/perfuse/internal/awsmsg

26.13 awsv4

Pakken awsv4 signerer forespørsler til AWS med Signature Version 4, ved hjelp av bare standardbiblioteket.

Den begynte inne i s3put. SQS, SNS og lesing fra S3 trenger samme signatur med et annet servicenavn og med en spørringsstreng, og en andre kopi av signaturkoden ville være en andre plass for den ene feilen som teller - en signaturfeil leser nøyaktig som feil legitimasjon. Så den bor her, sjekket mot AWS' publiserte testvektorer, og hver AWS-tilkobling bruker den.

Legitimasjoneringsdata er statiske nøkler eller standardmiljøvariabler. Det er med vilje ingen instans-metadata legitimasjonskjede: det betyr IMDS-oppkall, caching og oppdatering, som er der en liten implementering slutter å være liten, og Perfuse nekter metadata-adresser som mål som standard uansett.

Source: github.com/biodream-llc/perfuse/internal/awsv4

26.14 azblob

Pakken azblob leser og skriver Azure Blob Storage med standardbiblioteket: Shared Key eller SAS-autorisering over vanlige HTTP-oppkall.

Samme begrunnelse som s3put: Azure SDK er stort og operasjonene en integreringsmotor trenger er fem - put, get, liste, slette og angi tilgangsnivå. Shared Key-signering er spesifisert nøyaktig ("Autoriser med Shared Key", Azure Storage REST), og Azurite, Microsofts emulator, sjekker det på samme måte som tjenesten gjør.

Source: github.com/biodream-llc/perfuse/internal/azblob

26.15 merkevare

Pakken merkevare lagrer en kundes logo og produktnavn så en installasjon kan presentere seg selv som deres eget produkt i stedet for som Perfuse.

Hvorfor logoen ikke er en innstilling

Alt annet en operatør kan endre er en skalar i innstillingsfilen. En logo er noen hundre kilobyte binærdata, og å plassere den der ville bety base64 i en YAML-fil som en person er ment å kunne lese og redigere for hånd. Den bor ved siden av den filen i stedet, og bare dens tilstedeværelse er synlig gjennom innstillingsgrensesnittet.

Den delen som betyr noe: et lastet opp bilde er upålitelig innmat

En logo lastes opp av en administrator og deretter serveres til hver nettleser som laster konsollen, inkludert på innloggingsiden før noen har autentisert. Det gjør den til den mest distribuerte delen av angriper-levert innhold i produktet, så den behandles deretter:

Source: github.com/biodream-llc/perfuse/internal/branding

26.16 cda

Pakken cda leser kliniske dokumenter.

Designet starter fra hvordan disse dokumentene faktisk reiser, som ikke er som filer. En utskrivningsoppsummering forlater en EHR inni en HL7 v2 MDM^T02-melding, med hele dokumentet base64-kodet i OBX-5 og beskrevet av en TXA-segment. Det er tusenvis av meldinger per dag på et midtstort sykehus, og det er hvorfor denne pakken sitter ved siden av en HL7 v2-parser i stedet for i et dokumentverktøy: v2-delen er allerede her, så pipeline fra "en melding ankom" til "en FHIR DocumentReference eksisterer" er kort.

Tre ting er med vilje innenfor omfang og en er med vilje utenfor.

Innenfor omfang: lese et dokument og si hva det inneholder på enkle termer; sjekke at den menneskeleselige fortellingen og de kodete innføringene stemmer overens; og konvertere til FHIR. Fortellingssjekken er den uvanlige. Hver C-CDA-seksjon bærer samme informasjon to ganger, en gang som tekst for en kliniker og en gang som koder for en maskin, og de skal stemme overens. I praksis gjør de det ofte ikke, og ingenting sjekker det - ikke sertifiseringsverktøyene, ikke motorene. Når teksten sier at en pasient er allergisk mot penicillin og den kodete innføringen sier noe annet, handler en av de to lesere på feil informasjon. Det er en pasientsikkerhetsfeil som er mekanisk påviselig, så den påvises her.

Utenfor omfang: generere konform C-CDA. Å skrive en betyr å tilfredsstille flere hundre malregler og en Schematron, og å produsere dokumenter som er 95% riktige ville feile sertifisering på måter som er elendige å feilsøke. Lese, sjekke og konvertere er mesteparten av verdien for en brøkdel av risikoen.

Source: github.com/biodream-llc/perfuse/internal/cda

26.17 channeltest

Pakken channeltest kjører tester mot en kanaldefinisjon.

En kanal er et program. Den filterer, omskriver og ruter kliniske meldinger, og den redigeres under press av personer som ikke kan prøve den mot produksjon. Fraværet av en måte å teste en er den eneste største grunn til at grensesnittsarbeid er skremmende, og "Jeg endret transformereren og ingenting så ut til å være forskjellig i meldingsvisningen" er ikke en test.

Den sentrale beslutningen er at en test kjører meldingen gjennom den virkelige transformasjonsveien — samme filter, samme deklarative trinn, samme skriptmotor, i samme rekkefølge — med bare transporten erstattet. En test som øvde en gjenimplementering ville passere mens kanalen feilet, som er verre enn å ikke ha noen test i det hele tatt fordi det aktivt mislede.

Source: github.com/biodream-llc/perfuse/internal/channeltest

26.18 chanscope

Pakken chanscope snevrer lesinger og skrivinger på en kontekst til noen kanaler.

Det beror på konteksten heller enn å være en parameter for hver forespørsel, fordi det finnes dusinvis av forespørsler over meldingslagret og leveringskøen, og grensen er en egenskap ved hvem som spør, ikke ved spørsmålet. API-en setter den én gang per forespørsel for en person begrenset til noen kanalgrupper; hver telling, liste, diagram, søk og kø-aksjon er deretter enig med de andre, så ingen blir fortalt en total på førti feil og vist fire.

Source: github.com/biodream-llc/perfuse/internal/chanscope

26.19 klaster

Pakken klaster lar flere Perfuse-tjenere dele én PostgreSQL-lagring og bestemme, mellom dem, hvem kjører hva.

Problemet det løser

Én tjenere er én feilpunkt: når den stopper, stopper hver grensesnitt. To tjenere på én database løser det bare hvis de aldri begge kjører samme kanal, fordi to MLLP-lyttere på én kanal tar på seg avsenderen, to kø-arbeidere leverer samme melding to ganger, og to DICOM-avhørere rapporterer samme studie.

How

En leieavtale er en rad som navngir hvem holder noe, med en teller som innehaveren flytter på ved hver fornyelse, hver få sekunder. Ingen klokke sammenlignes med en annen: en innehaver som ikke kan fornye (krasjet, kuttet fra database) stopper hva leieavtalen dekker en gang dens egen klokke sier at leieavtalen er nesten ferdig, og en annen tjenere tar det bare etter at dens egen klokke har sett telleren stå stille i hele leieavtalen. Hver måler et intervall på sin egen klokke, så tjenernes klokker og databaseklokken trenger ikke være enige; de trenger bare å gå omtrent like fort. En klokke som hopper (en virtuell maskin resynkroniserer, en administrator setter klokken) endrer ingenting: den første versjonen brukte databaseklokken for utløp, og en test fant en database hvis klokke hoppet tretten sekunder over og håndtert hver leieavtale til en ny tjenere mens de gamle fortsatt kjørte dem.

Mellom innehaveren stopper og den neste starter, er det en kort lukke hvor ingen kjører, som kostar en avsender noen sekunder med avviste tilkoblinger, og aldri et øyeblikk med to.

Two modes:

Hver leieavtale har en epoke, talt opp hver gang innehaveren endres, som navngir et innehav i historien.

Source: github.com/biodream-llc/perfuse/internal/cluster

26.20 cms

Pakken cms er Cryptographic Message Syntax (RFC 5652) som S/MIME og Direct sikker meldingsutveksling bruker: SignedData (signer en melding, verifiser en og si hvem signerte den) og EnvelopedData (krypter en melding til mottakerens sertifikater, dekrypter en med vår nøkkel).

Bare det som Direct Applicability Statement og dens implementeringsveiledning krever: RSA med SHA-256 (SHA-1 akseptert for lesing bare, siden eldre HISPs fortsatt sender det), RSA-nøkkeltransport med PKCS#1 v1.5 eller OAEP, og AES-128 eller AES-256 i CBC-modus. Kryptografien er standardbibliotekets; denne pakken er ASN.1 rundt det.

Source: github.com/biodream-llc/perfuse/internal/cms

26.21 cms0057

Pakken cms0057 holder betaler-siden av CMS Interoperability og Prior Authorization sluttrapport (CMS-0057-F) som handler om data heller enn transport: avgjortede krav som CARIN Blue Button ExplanationOfBenefit-resurser, prioriseringsgodkjenninger som Da Vinci PDex ExplanationOfBenefit-resurser, HRex-medlemssammenligning for Payer-to-Payer-API, medlemslisten bak Provider Access-API og prioriseringsmålinger en betaler må publisere hver år.

FHIR-endepunktene som betjener disse, ligger i fhirserver; denne pakken bestemmer hva som kommer i dem.

Legemidler er utenfor scope overalt, slik de er i regelens prioriseringsbestemmelser: ingen apotek ExplanationOfBenefit, ingen formular, ingen NCPDP.

Source: github.com/biodream-llc/perfuse/internal/cms0057

26.22 kodesett

Pakken kodesett holder kartleggingstabeller som overlever kanalen som først trengte en.

Domænetaksen er i stor grad å gjenopprette en kartlegging noen allerede har gjort. En steds seksjonskoder, pasientklasser, ordrestatus og fasilitetsidentifikatorer oversettes på samme måte i hver kanal som berører dem, og i dag er hver av disse oversettelsene en separat tabel inni en separat kanal. Førti kanaler betyr førti kopier og førti steder å fikse neste gang mottaker-systemet endres.

Så en tabel blir et navngitt objekt referert til ved navn. Så mye er åpenbart og det er den mindre halvdelen av verdien.

Den halvdelen ingen bygger

Den større halvdelen er proveniens. Det meste som gjør et grensesnitt vanskelig å vedlikeholde, er ikke kartleggingen - det er at ingen vet *hvorfor*. «Vi fjerner ledende nuller fordi laboratoriets MRN-kolonne er numerisk» er kunnskap som finnes i én persons hode og forlater bygningen når de pensjonerer, og kartleggingen som gjenstår, blir noe ingen våger å endre og ingen våger å slette.

Så hver tabel registrerer hvem bestemte og når, hver post kan registrere sin egen grunn, og begge overlever inn i filen som går inn i versjonskontroll. En kartlegging med en grunn kan diskuteres. En kartlegging uten en, blir overtro.

Hvorfor filen er separat fra kanalen

Fordi det er delt. En tabell inni en kanal er en tabell som bare den kanalen kan bruke, og det er problemet. En delt tabell trenger sin egen historikk: "hvem endret kjønnskartleggingen, og når" er et spørsmål om tabellen, ikke om hvilken kanal som skjedde å redigere den dagen.

Source: github.com/biodream-llc/perfuse/internal/codeset

26.23 etterlevelse

Pakken etterlevelse implementerer CMS ADT-hendelsesvarslingsarbeidsflyten som kreves av 42 CFR 482.24(d) fra og med mai 2021.

Sykehus må elektronisk varsle en pasients etablerte behandlere — primærhelsetjeneste, spesialister, etterbehandlingsinstitusjoner — når pasienten innlegges, utskrives eller overføres. Reguleringen eksisterer fordi pasienter faller gjennom språket under overgangene: en fastlege som ikke vet om en utskrivning kan ikke planlegge oppfølgingen som forhindrer en gjeninnleggelse.

Denne pakken gir maskineriet til: - Spore hvilke behandlere som er etablert for hver pasient. - Rute ADT-hendelser til riktige behandlere med riktig prioritet. - Registrere hver varsel som sendes, med leveringsstatus, for CMS-undersøkelsesauditorer. - Generere etterlevelsesrapporter som viser varselshastigheter og feil.

Trådsikkerhet er påkrevd overalt fordi ADT-meldinger ankommer samtidig fra flere kanaler og varslingspipelinen kjører parallelt.

Source: github.com/biodream-llc/perfuse/internal/compliance

26.24 konfig

Pakken config laster inn kanaldefinisjoner fra filer.

Konfigurasjonen bor i filer heller enn en database, som er hovedforskjellen mellom Perfuse og Mirth. Mirth holder kanaler i sin egen database, som er hvorfor versjonskontroll er et separat produkt, hvorfor fremme en kanal fra test til produksjon er vanskelig, og hvorfor ingen kan svare "hva endret sist tirsdag" uten en støtteanrop. Filer gir git, diffs, gjennomgang, CI og miljøfremme uten ekstra maskineri.

Validering er bevisst streng og skjer ved lasting: ukjente felt er en feil, filteruttrykk kompiles, adresser sjekkes. En kanal som ikke kan forstås må nekte å starte heller enn å kjøre på en måte ingen mente.

Source: github.com/biodream-llc/perfuse/internal/config

26.25 kontrakt

Pakken kontrakt omdanner hva en feed ser ut som til hva en feed må se ut som.

En profil besvarer "hva mottar jeg". Det er nyttig en gang. Det dyre problemet er dagen det endres: en leverandøroppgradering dropper et felt, en ny kode dukker opp, en segment begynner å gjenta. Ingen av disse er en feil - meldingene er fortsatt gyldige HL7 og hver motor i verden aksepterer dem - så ingenting legger merke til det før en mottaker faller over, vanligvis uker senere, og etterforskningen starter fra feil ende.

En kontrakt er profilen skrevet ned som en forventning og deretter sjekket. Det er kontrakttesting, som er en løst ide i programvare generelt og nesten helt fraværende fra helsetjenesteeintegrering.

Hvorfor enheten er en rate og ikke en melding

Den åpenbare designet er å sjekke hver melding og klage når en feiler. Det produserer et system ingen kan bruke. Reelle feeds inneholder en proporsjon av genuint rare meldinger - en testmelding fra leverandøren, en pasient uten registrert kjønn, en manuell innføring - og varsling på hver enkelt en trener folk til å ignorere varslingene, på det punktet funksjonen er verre enn ingenting fordi den har forbrukt oppmerksomheten den trengte.

Så en forventning handler om en proporsjon over et vindu: "PID-3 er fylt ut i minst 99% av meldingene". En enkelt rar melding utløser aldri. Fem prosent av meldingene som mister deres medisinske rekordnummer gjør.

En kontrakt beskriver hva ankommer, ikke hva forlater

Dette er skillet folk får feil først, inkludert meg selv mens integrasjonstesting. Perfuse lagrer meldingen slik den ankom - det er bevisst, fordi den lagrede meldingen er bevis for hva en avsender sendte - så en kontrakt sjekkes mot den inngående feeden og ikke mot utgangen av kanalens transformasjoner.

Det er riktig standard med stor margin: det som endrer uten varsel er sendesystemet, og poenget med en kontrakt er å merke. Men det betyr en forventning skrevet om en kartlagt verdi ("etter kartlegging, bare labkodene skal forbli") vil feile umiddelbart og forvirrende, fordi kodene den navngir aldri dukker opp i trafikken som profileres. Alt om hva som forlater hører hjemme i en kanaltest, som kjører de virkelige transformasjonene.

Hvorfor en overtredelse navngir toleransen den brøt

"PID-3 feilet" forteller noen ingenting. "PID-3 var fylt ut i 94,2% av de siste 500 meldingene; kontrakten krever 99%" forteller dem hvor dårlig det er, hvor sikre de kan være, og om det er verdt å vekke noen. Tallene er meldingen.

Source: github.com/biodream-llc/perfuse/internal/contract

26.26 crd

Pakken crd er en Da Vinci-dekningskravoppdagelses-tjeneste (CRD 2.2.1): forsikringsgiverens side av CDS Hooks-samtalen som forteller en kliniker, mens ordren fortsatt er en utkast, om den er dekket, om den trenger forhåndsgodkjenning, og hva dokumentasjon forsikringsgiveren vil ønske.

CMS-0057's forhåndsgodkjenning-API er i praksis tre Da Vinci-veiledere sammen: CRD for å si hva som kreves, DTR for å samle det inn, PAS for å sende det inn. Perfuse hadde PAS. Dette er den første av de to andre; DTR's $questionnaire-pakke er på FHIR-endepunktet.

Beslutningene om dekning kommer fra en regelfil, fordi de er forsikrers politikken og endres uten programvareutgivelser: en kode (eller en liste over koder) og hva som gjelder for den - dekket eller ikke, om forhåndsgodkjenning er nødvendig eller ikke, dokumentasjon og DTR-spørreskjemaet som samler den inn. En ordre som ikke matcher noen regel, returneres som "betinget" og "usikkert", som er hva CRD sier å returnere når tjenesten ikke kan bestemme - aldri en gjett på at den er dekket.

Svarene følger veiledningen: et systemAction som oppdaterer hver ordre med dekning-informasjonsutvidelsen, som EHR lagrer på ordren og senere sender med forhåndsgodkjenningen; og et kort per ordre, så en kliniker ser det.

Source: github.com/biodream-llc/perfuse/internal/crd

26.27 dashboards

Pakken dashboards definerer dashboards som Perfuse leverer for hver type person som ser på dem, og hvordan en person får en: ved sin rolle, ved en directory-gruppe som dashboards-filen kartlegger, eller ved visningen de har lagret.

Dashboards består av fliser, og fliser viser kun aggregater - tellinger, hastigheter, tider, stater. Ingen viser en melding, en pasient eller en identifikator, så en dashboard kan gis til en avdelingsleder eller plasseres på en veggskjerm uten å utvide hvem som ser pasientdata. En flis som trenger data som Perfuse ikke ennå registrerer, er ikke fabrikkert: dashboarden lister den under Planlagt.

Full fleksibilitet er Grafanas jobb, ikke denne pakken. Hver flis som har en metrikk bak den, eksporterer som en Grafana-panell over Perfuses /metrics, så et sted som ønsker mer enn lett konfigurasjon tar dashboarden der.

Source: github.com/biodream-llc/perfuse/internal/dashboards

26.28 davinci

Pakke davinci angir hvilken utgave av Da Vinci-prioriteringsveiledningene (CRD, DTR, PAS) en klient snakker.

Perfuse svarer i to: 2.2 (CRD 2.2.1, DTR 2.2.0, PAS 2.2.1), den nyeste, og 2.1 (CRD, DTR og PAS 2.1.0), utgaven CMS-0057-Fs anbefalte listepeker på en gang 2.0.1-utgavene av US Core 3.1.1-basis utløp. De to forskjeller i former en klient leser ved navn - DTRs $questionnaire-package-parametere (PackageBundle i 2.1, packagebundle i 2.2), PASs $inquire-svar (en Bundle i 2.1, en Parameters av dem i 2.2), utvidelser som bare finnes i en av dem - så ett svar kan ikke betjene begge, og serveren må vite hvilken den snakker med.

Det fortelles, mest spesifik først: ved forespørselen selv (CRDs davinci-crd.requestedVersion; versjonen på en profil som inndata hevder, profil|2.1.0), så ved klientens registrering (davinci_version på en SMART eller CDS-klient), så ved serverens egen innstilling (serve -davinci-version), som standard er satt til den nyeste.

Source: github.com/biodream-llc/perfuse/internal/davinci

26.29 dbtime

Pakken dbtime formaterer tidsstempeler så at sortering av dem som tekst sorterer dem som tid.

Hver butikk i Perfuse lagrer tidsstempeler som TEKST i SQLite og pålitelser på strengsammenligning for sortering og for områdespørringer: ORDER BY mottatt_at DESC, WHERE utløper_at < ?, WHERE på >= ?. Dette er en rimelig design - det holder en database som noen kan lese med sqlite3-skallet - men det fungerer bare hvis tekstformen er fast bredde.

time.RFC3339Nano er ikke. Dokumentasjonen sier at den fjerner trailing nuller fra sekundfeltet, så samme klokke produserer strenger av forskjellig lengde:

20:56:33.12345Z <- 123450 mikrosekunder, trailing null fjernet 20:56:33.123456Z <- 123456 mikrosekunder

Sammenlignet som tekst, er den første *større*, fordi etter den felles prefikset "12345" har den 'Z' hvor den andre har '6', og 'Z' sorterer over hver enkelt siffer. Så den tidligere øyeblikket sorterer senere. Omtrent en av ti sammenhengende par er berørt, som er hvorfor det presenterte som en intermittent testfeil i stedet for som en åpenbart ødelagt funksjon.

Hva det faktisk brøt: revisjonsloggen og meldingsvisningen begge sorterer etter en tidsstempel og kan derfor liste innførsler fra samme sekund i feil rekkefølge. En revisjonslogg er et samsvarsdokument og en meldingsvisning er hvordan noen rekonstruerer hva skjedde, så i begge tilfeller er rekkefølgen poenget.

Layout nedenfor bruker .000000000 i stedet for .999999999. Begge skriver nanosekunder; forskjellen er at nuller er signifikante i den første og droppet i den andre.

Source: github.com/biodream-llc/perfuse/internal/dbtime

26.30 avgrenset

Pakken delimited parserer poster som er adskilt og delt av konfigurerte tegn.

Dette er Mirths Delimited data type: CSV, tab-separert, pipe-separert, fast-kolonne-filer og den lange halen av formater som et laboratoriumsanalyse- eller byråtjeneste emitterer fordi noen skrev det i 1994 og det fungerer.

Bevisst ikke en generell CSV-bibliotek. Hva som betyr her er hva en helsestrøm gjør som en velformet CSV ikke gjør: en header-rad som kan være til stede eller ikke, en trailing tom linje som ikke må bli en tom post, kolonner referert ved navn så en transformasjon ikke bryter når en leverandør setter inn en, og evnen til å behandle en hel fil som en melding eller hver rad som sin egen.

Den siste av disse er beslutningen som former alt annet. En fil med fem tusen resultater er enten en melding eller fem tusen, og de to er ikke utvekslelige: en melding betyr en bekreftelse og en feil for hele filen, og fem tusen betyr at hver rad kan filtreres, transformeres og prøves på nytt.

Source: github.com/biodream-llc/perfuse/internal/delimited

26.31 dicom

Pakken dicom leser DICOM-datasett.

DICOM er hvor radiologien bor, og et sykehus-integrasjonsmotor som ikke kan snakke det, er stengt ute av bildediagnostikk helt. Mirth har en DICOM-lytter og avsender, så dette er en migrasjonsblokkerer for ethvert sted som gjør modalitetsarbeid.

Omfang, uttalt åpent

Denne pakken parserer datasett: filmetainformasjonen, elementene, overføringsyntaxen og verdiene som betyr for ruting og identifikasjon. Den dekoder ikke pikseldata, og den vil aldri gjøre det så langt som denne pakken angår - en integrasjonsmotor flytter bilder, den viser dem ikke, og en dekoder er en stor mengde format-spesifikt arbeid hvis eneste formål her ville være å gjøre den binære større.

Lesing av metadata uten å berøre piksler er også hva som gjør det raskt på trafikken som betyr: en bryst-CT er hundrevis av megabyte piksler bak to kilobyte informasjon som noen routerer på.

Hvorfor verdirepresentasjonene behandles eksplisitt

Et DICOM-element inneholder en to-bokstavers verdirepresentasjon som sier hvordan verdien skal leses, og reglene varierer per VR på måter som ikke kan gjettes: noen har en to-bokstavers lengde og noen fire, noen er justert med et mellomrom og noen med en null, og numeriske strenger kan inneholde flere verdier separert med skråstrek. Å få en feil produserer ikke en feil, men en plausibel feilverdi - et pasientnavn lest fra midten av en dato, eller en studieidentifikator feil av en byte.

Source: github.com/biodream-llc/perfuse/internal/dicom

26.32 dicomweb

Pakken dicomweb snakker DICOMweb (DICOM PS3.18): QIDO-RS for å søke, WADO-RS og WADO-URI for å hente, STOW-RS for å lagre, over HTTP.

Dette er hvordan visningsverktøy, AI-tjenester og skytarkiver nå når bildene: OHIF, Google Cloud Healthcare, Azure Health Data Services, AWS HealthImaging, Orthancs og dcm4chees DICOMweb-grensesnitt. En integreringsmotor som bare snakker nettverksprotokollen fra 1993 (DIMSE: C-STORE, C-FIND) kan mata en PACS, men ikke en nettleser.

Pakken har fire deler: en datasettleser som går gjennom hele objektet, inkludert sekvenser, og vet hvor pikseldaten er uten å laste den; DICOM JSON-modellen (PS3.18 F.2); multipart/related, som er hvordan DICOMweb flytter flere objekter i en forespørsel; og et arkiv med en indeks, som er hva QIDO og WADO svarer fra.

Source: github.com/biodream-llc/perfuse/internal/dicomweb

26.33 direkte

Pakken direkte er Direct-sikker meldingsutveksling som et kantsystem: en melding til en Direct-adresse er signert med denne adressens sertifikat og kryptert til mottakerens, som S/MIME, og sendt til en HISP via SMTP; en melding mottatt fra HISP (via SMTP eller samlet over IMAP) er dekryptert og dens signatur sjekkes mot tillitsankrene før noe leser den.

Den følger Direct Project Applicability Statement for Secure Health Transport 1.2 og XDM-spesifikasjonen (IHE ITI TF-1 Annex 15) for dokumenter med metadata. Den er ikke en HISP: HISP-akkrediteringen, sertifikatpolitikken og katalogen forblir med HISP.

Source: github.com/biodream-llc/perfuse/internal/direct

26.34 legemiddel

Pakken legemiddel håndterer kodeene og mengdene som identifiserer et legemiddel.

Splittet ut fra apotekstandardene som bærer dem, fordi samme legemiddelkode dukker opp i en NCPDP-krav, en SCRIPT-resept, en HL7 RXE-segment og en FHIR MedicationRequest, og en konvertering som bor i en av disse stedene er en konvertering de andre tre gjør uten.

Source: github.com/biodream-llc/perfuse/internal/drug

26.35 dsdr

Pakken dsdr signerer og verifiserer CDA-dokumenter som beskrevet i HL7 Implementation Guide for CDA Release 2: Digital Signatures and Delegation of Rights, Release 1 (oktober 2014) - den elektroniske signaturstandarden HIPAA adopterer for kravvedlegg i CMS-0053-F, 45 CFR 162.2002(e), med overholdelse fra 26. mai 2028.

Hva guiden ber om, og hvor det gjøres her:

Hvor guiden er stille, er valgene gjort navngitt: den gir ikke et navrom for sine egne elementer (digitalSignature, authorizedSigner, SignaturePurpose), så de plasseres i urn:hl7-org:sdtc; og formålet er også uttalt som en XAdES CommitmentTypeIndication med ASTM OID, som XAdES-verktøy leser og guidens eget element de ikke gjør.

Delegering av rettigheter (en deponert signer med en SAML-påstand) produseres ikke; en signatur som bærer en rapporteres som slik.

Source: github.com/biodream-llc/perfuse/internal/dsdr

26.36 e4x

Pakken e4x gjør Mirth Connects JavaScript kjører uendret.

Mirth-skript er skrevet for Rhino, som implementerer E4X: XML er en innfødt type med sin egen syntaks. Motoren her er goja, som ikke gjør det, og gapet er ikke bare et runtime-problem. Tre deler av E4X er *syntaks*, så gojas parser avviser filen rett før noen objektmotor kunne hjelpe:

for hver (var seg i msg..OBX) { } // for-each, og etterkommeroperatoren var z = <ZZZ><ZZZ.1>verdi</ZZZ.1></ZZZ>; // en XML-literal var id = node.@root; // en attributthendelse

Denne filen omskriver disse til vanlig ECMAScript som goja parser, og lar semantikken være i runtime-objektet i xml.go. Alt annet om E4X - egenskapsaksess via elementnavn, indeksering av gjentakelser, tildeling, toString - er allerede gyldig JavaScript-syntaks og trenger ingen omskriving.

Omskrivingen gjøres med en ekte lexer i stedet for regulære uttrykk, fordi alternativet korrumperte arbeidende skript. Et mønster for etterkommeroperatoren finner en inne i "http://example.org", et mønster for XML-literaler finner en i "a < b && c > d", og et skript som stille endrer mening er mye verre enn et som nekter å laste.

Source: github.com/biodream-llc/perfuse/internal/e4x

26.37 edifact

Pakken edifact leser og skriver UN/EDIFACT-utvekslinger (ISO 9735): UNA-tjenestestrengadvice, UNB/UNZ-utvekslingsomslag, valgfrie UNG/UNE-funksjonsgrupper og UNH/UNT-meldinger, med frigjørings tegn og, for syntaksversjon 4, gjentakelsesskilletegnet.

Den sjekker omslagets tellinger og referanser, adresserer dataelementer for filtre, splitter en utveksling inn i en per melding, og bygger en CONTRL bekreftelse.

Den leser enhver meldingstype (ORDERS, INVOIC, IFTSTA, MEDRPT ...); den har ikke katalogene som sier hvilke segmenter en meldingstype kan inneholde, så den sjekker struktur, ikke innhold.

Source: github.com/biodream-llc/perfuse/internal/edifact

26.38 utgang

Pakken utgang bestemmer om denne motoren kan koble seg ut til en adresse.

Den eksisterer fordi en destinasjon kan peke hvor som helst, og en kombinasjon gjør det til en måte å lese det interne nettverket på: en SOAP-destinasjon med en respons-transformator returnerer mottakerens svar til et skript, så en redaktør kan lage en kanal som henter en intern URL og skriver innholdet inn i en logg eller en melding.

Vist frem i stedet for teoretisert: en SOAP-destinasjon rettet mot en lokal HTTP-tjener plasserte tjenerens respons-innhold i en kanallogglinje.

Det proportionale svaret er ikke å forby utgående forbindelser - å levere meldinger til konfigurerte endepunkter er hele formålet med programvaren, og en redaktør er ment å konfigurere dem. Det er å nekte de spesifikke adressene som aldri er en meldingsdestinasjon og alltid er en kreditorlagring.

Source: github.com/biodream-llc/perfuse/internal/egress

26.39 motor

Pakken motor kjører konfigurerte kanaler.

En kanal er en kilde, et filter og en samling destinasjoner. Kjøretidens jobb er å være ærlig om hva som skjedde med hver melding: en bekreftelse bør bety hva konfigurasjonen sier det betyr, en melding som er filtrert ut bør være å skille fra en som ble levert, og en melding som ikke kunne leveres noen sted må ikke rapporteres som akseptert.

Source: github.com/biodream-llc/perfuse/internal/engine

26.40 epa

Pakken epa er NCPDP SCRIPT elektronisk forhåndsgodkjenning, betalerens side: PAInitiationRequest, PARequest, PAAppealRequest og PACancelRequest inn, og deres svar ut.

CMS-0062-P foreslår at berørte betalere støtter det fra 1. oktober 2027, og Medicare Part D krever allerede det. En forespørsel avgjøres på samme måte som hver forhåndsgodkjenning på denne serveren: den blir en Da Vinci PAS-forespørsel (en krav, medikamentforespørsel og prescriberens svar som et QuestionnaireResponse) og går til samme regelsett, avgjørelsestjeneste og gjennomgangskø.

NCPDPs skjemaer er lisensiert. Elementnavn og rekkefølge her følger det offentlige Surescripts ePA-kompendium og dets eksempler; to elementer det offentlige materialet aldri viser (årsaken inne i Closed og inne i Denied) følger SCRIPT-mønsteret brukt andre steder og er navngitt i manualen så en betaler kan sjekke dem mot sin egen kopi av skjemaet.

Source: github.com/biodream-llc/perfuse/internal/epa

26.41 eprescribe

Pakken eprescribe leser og skriver NCPDP SCRIPT, standarden for resepter som reiser.

Navngitt etter hva den gjør i stedet for etter standarden, fordi intern/script allerede er JavaScript-motoren og to pakker kalt script i ett tre er en feil som venter på å skje på en importlinje.

SCRIPT er XML, i motsetning til telekommunikasjonsstandarden som bærer den resulterende kravet. En prescriber sender en NEWRX til en apotek; apoteket sender tilbake RXFILL for å si hva som skjedde, REFREQ for å be om en påfylling, eller RXCHG for å be om en endring. Hver enkelt av disse er en melding her.

Hvor faren er

To felt i en resept er farlige når de misforstås i stedet for når de mangler.

Erstatninger er det første. En null betyr at erstatning er tillatt og en en betyr at det skal utstedes som skrevet. Det leser bakover til noen som forventer en flagg hvor en betyr ja, og å få det galt utsteder en generisk hvor prescriberen krevde merkevaren - eller nekte en erstatning som var tillatt, som er samme feil som koster pasienten penger i stedet.

Påfyllingsantall er det andre. En schedule II-resept kan ikke påfyldes i det hele tatt, og et system som bærer et påfyllingsantall over fra en ikke-kontrollert mal produserer en gyldig utseende resept som et apotek må nekte.

Hva som ikke er verifisert

Meldingsstrukturen følger de offentliggjorte SCRIPT-elementnavn. Ingen melding fra denne pakken har blitt sendt gjennom et virkelig rutingnettverk som Surescripts, og sertifisering av en er en kommersiell prosess i stedet for en teknisk en. Denne parser og bygger formatet; den hevder ikke sertifisering.

Source: github.com/biodream-llc/perfuse/internal/eprescribe

26.42 ekvivalent

Pakken equiv beviser at to motorer er enige, eller sier nøyaktig hvor de ikke er.

Dette er svaret på det eneste spørsmålet som faktisk blokkerer en migrering. Et grensesnittteam nekter ikke en ny motor fordi den mangler funksjoner; de nekter fordi de ikke kan være sikre på at den vil gjøre det samme med trafikken de allerede har, og å være feil betyr at laboratorieresultater ikke når leger. Ingen mengde funksjonsammenligning besvarer det. Bevis gjør det.

Den tiltenkte bruken er en parallell kjøring. Begge motorer mottar de samme produksjonsmeldingene; den sittende motor fortsetter å levere og Perfuse leverer til ingen, som er hva skyggekanaler allerede er. Etter to uker sammenlignes utdata her, og samtalen endres fra "stol på dette" til "her er de tre meldingene av fire hundre tusen hvor vi forskjell, og hvorfor".

Gruppering er hele funksjonen

En naiv sammenligning av 400 000 meldinger produserer 400 000 funn og lukkes ubesvart. Nesten alle virkelige forskjeller har én årsak: et datoformat, en fasilitetskode, ett transformasjonssteg som ingen tok med over. Så forskjeller grupperes etter årsak - stien i meldingen og typen forskjell - og rapporteres én gang med en telling. 3000 forskjeller fra én årsak er ett funn, ikke 3000. Den enkelte avgjørelsen er hva som gjør rapporten lesbar, og en lesbar rapport er forskjellen mellom en migrering som fortsetter og en som stopper.

Verdier holdes tilbake som standard

Reell trafikk er pasientdata, så en sammenligningsrapport er et sted hvor PHI kan lekke inn i en billett, en e-post eller en skrå. Som standard rapporterer denne stier, typer og tellinger - aldri verdier. Det er nok til å finne årsaken: "MSH-7 forskjeller i 3000 av 3000 meldinger" forteller en analytiker at det er datoformatet uten å vise en dato.

Verdier kan aktiveres bevisst, fordi noen gang noen må se en, og å late som om det ikke er tilfelle ville bare skyve dem til et verre verktøy. Det er en eksplisitt valg og rapporten sier på sin egen overflate at den inneholder meldingsinnhold.

Source: github.com/biodream-llc/perfuse/internal/equiv

26.43 expr

HL7 v2-bindingen.

Dette er logikken som tidligere bodde i eval.go. Det er uendret i oppførsel - bevisst, fordi v2-filtret er hva hver HL7-kanal kjører og poenget med den generiske grammatikken var å legge til formater, ikke å endre denne.

Source: github.com/biodream-llc/perfuse/internal/expr

26.44 fdlimit

Pakken fdlimit finner ut hvor mange filbeskrivere denne prosessen kan åpne, og øker grensen hvis det kan.

Dette eksisterer på grunn av formen på feilen det forhindrer. Hver innkommende forbindelse er en beskrivelse, og hver utgående levering i flyt er det også. En mottaker som har stoppet å svare holder en beskrivelse for hele gjentakelsesbudsjettet - med standardene, fem forsøk på en tretti sekunders tidsavbrudd plus femten sekunders tilbakehold, så nesten tre minutter. Et par hundre forbindelser mot en hengt mottaker er derfor et par hundre beskrivelser holdt i minutter.

Å gå tom for det produserer ikke en pent feil på stedet som gikk tom. Det produserer "for mange åpne filer" et helt annet sted: databasen kan ikke åpne sin journal, webgrensesnittet stopper å akseptere, en loggfil kan ikke skrives. Motoren ser ut til å ha brutt i tre ubeslektede steder på én gang, og den virkelige årsaken er et partnersystem som gikk stille. Det er støtteopppringen denne pakken eksisterer for å unngå.

To ting skjer ved oppstart. Den myke grensen økes til den harde grensen, som vanligvis fjerner problemet helt - den myke standarden er ofte noen hundre mens den harde grensen er titusener. Deretter rapporteres hva som er tilgjengelig, så motoren kan begrense sin egen samtidighet inne i den i stedet for å oppdage den ved å treffe den.

Source: github.com/biodream-llc/perfuse/internal/fdlimit

26.45 fhirpath

Pakken fhirpath evaluerer FHIRPath (HL7 FHIRPath N1, 2.0.0) over FHIR-resurser holdt som avkodede JSON.

Den har ingen FHIR-modell: et elements type er kjent når FHIR JSON sier det (et valg elements suffiks, som valueQuantity, en ressurs resourceType) eller antydet fra JSON-verdien ellers. Det dekker hva SQL på FHIR-visninger og CQL-frie kvalitetsmål trenger; navigasjon som avhenger av modellen (en primitivs egen type når det ikke er et valg) besvares fra verdens form.

Source: github.com/biodream-llc/perfuse/internal/fhirpath

26.46 fhirserver

Pakken fhirserver implementerer en FHIR REST-tjener.

Dette eksisterer fordi den nyttige enden av en v2-til-FHIR-mapper er et sted å plassere resultatet. Å kunne konvertere en melding er en demo; å kunne konvertere den, lagre den og deretter finne pasienten igjen ved identifikator er et produkt.

Det er en ekte FHIR-tjener i de delene som betyr noe for det: en kapasitetsuttalelse, opprette, lese, oppdatere, slette, søke på parameterne folk faktisk bruker, og transaksjonsbunter som brukes atomisk. Det er ikke en fullstendig FHIR-tjener — ingen historikk, ingen lenket søk, ingen _inkluder — og det sier det i sin egen kapasitetsuttalelse i stedet for å la en klient oppdage hullene.

Source: github.com/biodream-llc/perfuse/internal/fhirserver

26.47 formulary

Pakken formulary er en betalers legemiddelformular: hvilke legemidler hver plan dekker, på hvilken nivå og med hvilke begrensninger (forhåndsgodkjenning, stegterapi, mengdebegrensninger), og hva medlemmet betaler.

En fil er den eneste kilden til alt som besvarer et spørsmål om et legemiddel: Da Vinci US Drug Formulary API (publisert fra det som FHIR), NCPDP Real-Time Prescription Benefit svar og NCPDP SCRIPT elektronisk forhåndsgodkjenning (om et legemiddel trenger det, og hvilke spørsmål å stille). En formular som bodde i tre steder ville besvare det samme spørsmålet på tre måter.

Source: github.com/biodream-llc/perfuse/internal/formulary

26.48 ramming

Pakke ramming leser og skriver meldinger på en byte-strøm som ikke er MLLP.

Hvorfor dette eksisterer separat fra mllp

MLLP er en ramming: 0x0B før, 0x1C 0x0D etter. Det er hva HL7 v2 bruker over TCP og Perfuse har alltid snakket det.

Mye utstyr gjør ikke det. En laboratorieanalyser, en vekt, en sengemonitor, et eldre regningssystem - hver tenderer til å ha sin egen konvensjon, og konvensjonene er alle enkle variasjoner på de samme tre ideene: en avgrenser et sted, en fast rekordlengde eller en lengde skrevet foran payloaden.

Mirths TCP-connector dekker dette og Perfuse hadde ingenting, så et sted med en socket-matning som ikke var HL7 kunne ikke bruke det i det hele tatt.

Feilen denne pakken er skrevet for å unngå

Lesing fra en strøm og gjetting hvor en melding slutter er hele problemet. Gjett for kort og en melding blir kuttet i to; gjett for langt og to meldinger ankommer som en. Begge produserer utdata som ofte ser plausibelt ut, hvilket er verre enn en feil, så hver modus her er eksplisitt om hva som avslutter en melding og ingen av dem faller tilbake til en annen.

En melding med ingen ramming i det hele tatt er en gyldig konfigurasjon - noen enheter åpner en tilkobling, sender en melding og lukker - men den kan ikke kombineres med noe annet og kan ikke brukes på en tilkobling som forblir åpen, så den er navngitt og valideres i stedet for å behandles som en standard.

Source: github.com/biodream-llc/perfuse/internal/framing

26.49 ftpconn

Pakke ftpconn laster opp filer over FTP og FTPS ved å bruke bare standardbiblioteket.

FTP er gammel, pratisk og ikke en god protokoll. Det er også fortsatt hvordan et stort antall hospitalsystemer aksepterer filer, vanligvis fordi den fjerne enden er en laboratorieanalyser eller en byråtjeneste hvis programvare ikke har blitt berørt siden det fungerte. Å nekte å støtte det gjør ikke disse systemene moderne; det gjør Perfuse ubrukelig på disse stedene.

Implementert her i stedet for å bli tatt som en avhengighet av samme grunn som S3: den åtte-avhengighets liste over materiale er et reelt argument med hvem som gjennomgår programvare før et sykehus installerer det. FTPs kontrollkanal er tekstbasert over TCP, så dette er noen hundre linjer med nett og crypto/tls.

Hva som støttes og hva som nektet

Passiv modus bare. Aktiv modus krever at serveren åpner en tilkobling tilbake til klienten, hvilket hver sykehusbrannmur bygget dette århundret blokkerer, og å tilby det ville bety at folk konfigurerer det og deretter feilsøker en brannmur.

Eksplisitt FTPS (AUTH TLS) støttes og er standard når TLS blir bedt om. Implicit FTPS på port 990 støttes også fordi noen analysatorer bare snakker det.

Vanlig FTP støttes og advarer. Den sender passordet i klartekst, og et sted som må bruke det bør bli fortalt en gang i stedet for å bli latt til å finne ut fra en pakkefangst.

Source: github.com/biodream-llc/perfuse/internal/ftpconn

26.50 gcp

Pakke gcp snakker med Google Cloud Pub/Sub og Cloud Storage over deres REST-APIer, med Googles OAuth 2.0 gjort her: en tjenekonto-nøkkel signerer en JWT (RS256, crypto/rsa) som byttes mot en tilgangstoken, eller, på Google Cloud selv, metadata-serveren deler en ut.

Ingen Google SDK.

Emulatorer (Pub/Sub-emulator, fake-gcs-server) tar ingen legitimasjon: sett Endpoint og la legitimasjonen være tom.

Source: github.com/biodream-llc/perfuse/internal/gcp

26.51 generate

Pakke generate lager syntetiske HL7 v2-meldinger.

To bruksområder. Noen som prøver Perfuse trenger trafikk å se på, og en kanaltest trenger en fiksering som er realistisk nok til å øve det som testes. En generator er en betalt utvidelse i Mirth, som forteller deg at folk ønsker en.

Alt her er oppfunnet. Navnene kommer fra en fast liste over åpenbart fiktive navn, identifikatorene er sekvensielle innenfor en kjøring, og adressene er laget. Det er ikke en fraskrivelse, det er designet: en generator som produserte plausibelt utseende ekte navn ville til slutt sette ett i en testfiksering, en feilrapport og deretter et repository.

Realismen brukes der det måtte for testing, og ingen andre steder. Tidsstempeler har offset, gjentakende felt gjentar faktisk, et navn har noen ganger et mellomnavn og noen ganger ikke, og omtrent en melding av tolv er bevisst vanskelig: et manglende valgfritt felt, en uvanlig men lovlige separator, en tom komponent. Å mate en kanal med kun perfekt formede meldinger forteller deg svært lite.

Source: github.com/biodream-llc/perfuse/internal/generate

26.52 hl7dict

Pakken hl7dict navngir feltene i HL7 v2-segmenter.

Dette eksisterer for ett formål: en meldingsviser som kan fortelle deg at PID-5.1 er pasientens etternavn, i stedet for å la deg telle hakker. Alle som har feilsøkt en grensesnitt har gjort den tellingen for hånd, og det er den vanligste årsaken til feil som setter en verdi i feil felt.

Det er ikke hele standarden. HL7 v2 har hundrevis av segmenter og tusenvis av felt, og de som er her er de som vises i ADT-, ORU-, ORM- og SIU-trafikk. Et ukjent felt rapporteres som ukjent i stedet for å gjettes.

Source: github.com/biodream-llc/perfuse/internal/hl7dict

26.53 hl7v3

Pakken hl7v3 leser HL7-versjon 3-meldinger.

Versjon 3 er en annen ting enn versjon 2 med samme navn. Versjon 2 er en pipe-delt strøm av segmenter hvor mening er posisjonell; versjon 3 er XML generert fra en referanseinformasjonsmodell, hvor mening bæres av elementnavn og en liten samling datatyper som gjentar seg overalt. Nesten ingenting overføres mellom de to utover det kliniske vokabularet.

I praksis ankommer v3 i en av to former. Enten er det et CDA-dokument, som er v3-avledet og håndtert av cda-pakken, eller det er en IHE-transaksjon - PIX og PDQ v3 i særdeleshet, som er hvordan mange sykehus løser pasientidentifikatorer mellom systemer. Denne pakken målretter den siste.

Hvorfor datatypene kommer først

Det eneste mest konsekvensfulle med v3 er at et element kan være til stede og uttrykkelig null, med en angitt årsak. En fødselsdato som bærer nullFlavor="ASKU" betyr at pasienten ble spurt og nektet å svare. En som bærer nullFlavor="NAV" betyr at verdien eksisterer, men er ikke tilgjengelig for øyeblikket, så å spørre igjen senere kan fungere. En som bare er fraværende betyr at ingen har registrert noe i det hele tatt.

Å kollapse disse til en tom streng er feilen denne pakken er ordnet for å forhindre. Det er ikke en kosmetisk tap: et nedstrømsystem som mottar en tom fødselsdato hvor kilde sa "pasient nektet" vil vanligvis behandle det som manglende data som skal jagtes, og en demografisk sammenstilling som skulle vært latt uavklart blir løst av en menneskelig gjetning. Så hver datatyper her skjelner mellom fraværende, null-med-årsak og til stede.

Source: github.com/biodream-llc/perfuse/internal/hl7v3

26.54 hl7xml

Pakken hl7xml konverterer HL7 v2-meldinger til og fra XML-formen Mirth Connect bruker, og tilbake til ER7-koding.

Formen er ikke et designvalg. Mirths skript er skrevet mot utgangen av sin egen ER7-til-XML-serielliserer, så de inneholder uttrykk som

msg['PID']['PID.5']['PID.5.1'].toString()

og løftet om at et eksisterende skript kjører uendret er bare oppfylt hvis treet det går har nøyaktig samme elementnavn, innkapsling og gjentakelsesatferd. Hver avgjørelse nedenfor er derfor "hva gjør Mirth", ikke "hva ville være pentere".

De to som betyr mest:

Hvert felt er innkapslet i nummererte komponentelementer selv når feltet bare har én komponent, så PID-5 med verdien "Doe" fremdeles produserer <PID.5><PID.5.1>Doe</PID.5.1></PID.5>. Skriptene indexerer rett til .1 konstant og et tre som plasserer tekst på felt-elementet ville bryte nesten alle.

MSH beholder standard HL7-felt numre, hvor MSH-1 er feltseparator og MSH-9 er meldingstype. Parseren i internal/hl7 indexerer MSH med en offset fordi separator okkuperer en posisjon ingen delimiter deler, og den offset stopper her: et skript som sier MSH.9 betyr meldingstypen.

Source: github.com/biodream-llc/perfuse/internal/hl7xml

26.55 ibmmq

Pakken ibmmq sender til og leser fra IBM MQ-køer gjennom kølederens meldings-REST-API (mqweb), som IBM MQ 9.1.5 og senere leverer på hver plattform, inkludert z/OS.

Det trenger ingen MQ-klientbibliotek: den native MQI-protokollen er IBMs og udokumentert, og REST-API er den støttede måten å nå MQ uten en. (IBM MQ snakker også AMQP 1.0 på en AMQP-kanal; Perfuses amqp-connector dekker den ruten.)

Lese er minst en gang: den første meldingen blir bladet gjennom, overført til kalleren og fjernet ved dens meldings-ID bare én gang kalleren har håndtert den. En melding som ikke kunne håndteres blir på køen, først i rekken.

Source: github.com/biodream-llc/perfuse/internal/ibmmq

26.56 identitet

Finn en melding etter hva du vet om den, uansett format den ankom i.

Eksisterende innholdsøk matcher metadata, tilbyr en delstrengsammenligning mot payloaden og kan evaluere et filteruttrykk - men uttrykket evalueres kun mot HL7 v2, og hvert uttrykk krever kunnskap om stien. Så å finne en pasients trafikk betød å vite at identiteten bor på PID-3 i en HL7 v2-inntak, på Patient.identifier i en FHIR-ressurs, på (0010,0020) i en DICOM-forekomst og på NM109 i en NM1*IL-løkke i en 837-krav. Fire formater, fire vokabularer, og under en hendelse kan meldingen som jaktes på være i noen av dem.

Denne pakken kartlegger et lite sett med konsepter - hvem meldingen er om, hvilket besøk, hvilket studie, hvilket krav - til der hver format holder dem, så et søk kan være for "MRN 12345" i stedet for en sti. Konseptene er med vilje få: disse er tingene folk faktisk har i hånden når de trenger å finne en melding, som et nummer fra en telefon eller et navn fra en klage.

Hvorfor uttrekk skjer én gang, på rekordtid

Alternativet er å parsere payload på spørringstid, som er hva uttrykksøket gjør. Det fungerer og det er ærlig om å være en begrenset skanning, men det kan ikke svare "hver melding om denne pasienten på fire kanaler og to måneder" uten å lese hver rad. Ut trekking én gang til en indekserbar tabell gjør det til et indeksoppslag.

Dette er en personvern eskalering, og det er valgfritt

Pasientnavn og identifikatorer sitter for tiden inne i en tåkete payload-kolonne. Indeksering gjør dem spørbare, som er poenget, og gjør dem også tellbare, som er en reell endring i eksponering: en database som bare kunne være grep kan nå bli bedt om "list opp hver pasient". Det er en beslutning for stedet, ikke for denne pakken, så uttrekk er skrudd på og hver søkning gjennom det er registrert i PHI-revisjonsloggen.

Source: github.com/biodream-llc/perfuse/internal/identity

26.57 iis

Pakke iis snakker transporten hver US-immuniseringsregister deler: CDCs IIS-SOAP-webservice.

I 2011 valgte en ekspertpanelet innkalt av CDC og American Immunization Registry Association én SOAP-grensesnitt for å sende HL7 v2-meldinger til immuniseringsinformasjonssystemer, og registrene tok det til seg. WSDL-en er liten - to operasjoner, connectivityTest og submitSingleMessage - og HL7-meldingen (en VXU for å rapportere et skudd, en QBP^Q11 for å spørre om en pasients historie) reiser som escapet tekst inne i SOAP-kroppen. Svaret kommer tilbake på samme måte: en ACK, eller en RSP^K11 som bærer historien og prognosen.

Det generiske SOAP-målet kunne være konfigurert til å gjøre dette, men hver sted måtte skrive samme konvolutt, få navnerommet riktig, sette legitimasjonen i kroppen i stedet for i HTTP-autentisering, og så lese HL7-bekreftelsen ut av svaret for å lære om registret beholdt rekorden. Et register svarer en avvist skudd med HTTP 200 og en AR; å behandle 200 som suksess er hvordan immuniseringer stille feiler å bli rapportert. Så denne pakken gjør CDC-konvolutten, og dømmer bekreftelsen, én gang.

Hva det ikke gjør: WSDLs brukernavn og passord er registrets applikasjonslegitimasjoner og sendes som WSDL sier, i kroppen. Gjensidig TLS, hvor et register krever det, er målets TLS-innstillinger som for noen HTTPS-oppringer. Ingen ting her er spesifikt for én stat; hvor stater forskjeller (fasilitets-ID påkrevd eller ikke, SOAP 1.1 akseptert eller ikke, advarsler sendt som AE) målets innstillinger sier så.

Source: github.com/biodream-llc/perfuse/internal/iis

26.58 kafka

Kafka, som en klient i stedet for å erstatte.

Et helsevesen som har en hendelsesryggrad har en Kafka-en, og systemene bygget i løpet av det siste tiåret publiserer til det i stedet for til en JMS-megler. Så denne koblingen eksisterer for å gjøre Perfuse den helserelaterte kanten av noen andres hendelsesplattform: den leser kliniske meldinger av emner og publiserer dem på emner, og den gjør med vilje ikke prøver å være en strømmeprosesseringsplattform. Vindu, sammenføyninger, strømprosesserings- og skjemaregister er Kafkas økosystem og forblir der.

Hvorfor en avhengighet, når STOMP og MLLP ble skrevet for hånd

Den fastsatte regelen i dette repository er at en avhengighet må kjøpe kapabilitet i stedet for bekvemmelighet, og må være ren Go så én statisk binærfil fortsatt krysskompilerer til hver mål. franz-go er ren Go og bærer ingen cgo, som ble sjekket mot alle seks mål.

Kafkas protokoll er ikke STOMPs. STOMP er et tekstprotokoll som passer i noen få hundre linjer. Kafka er et versjonert binært protokoll over omtrent sytti forespørselstyper, og den delen som betyr mest her - forbrukergrupper - er et distribuert koordineringsprotokoll med join, sync, heartbeat og offset-commit-faser og en rebalancedans mellom dem. Å få det subtilt galt produserer ikke en åpenbar feil: det produserer en partisjon ingen leser, eller to forbrukere som leser samme en. I en klinisk kanal er det en manglende laboratorieresultat og en duplisert ordre. Det er kapabilitet, og det er ikke verdt å hånd-rulle for å spare en avhengighet.

Source: github.com/biodream-llc/perfuse/internal/kafka

26.59 ldap

Pakke ldap snakker nok LDAP til å autentisere en person og lese deres grupper.

Sykehusene kjører Active Directory nesten universelt, og AD snakker LDAP. OpenID Connect er det bedre svaret der det er tilgjengelig - se internal/oidc, og notatet der om at Mirth ikke har enkelt innlogging til noen pris - men en integreringsmotor sitter ofte på et isolert VLAN der en nettleser ikke kan nå en identitetsleverandør i det hele tatt. Det er dette som er til.

Hand-rolled BER i stedet for en avhengighet, av samme grunn som DICOM og STOMP: kodingen er liten, og hva som ankommer denne sokkelen bestemmer om noen kommer inn i et system som flytter pasientdata.

encoding/asn1 i standardbiblioteket er ikke brukbar her. Den måler DER og avviser kontekstspesifikke tagger og implisitt tagging som LDAP bruker gjennom hele, så delene som betyr noe ville likevel måtte rulleres for hånd.

Source: github.com/biodream-llc/perfuse/internal/ldap

26.60 postkasse

Pakken postkasse leser e-post fra IMAP4rev1 (RFC 3501) og POP3 (RFC 1939) servere, logger inn med en passord eller med OAuth 2.0 (SASL XOAUTH2, som Microsoft 365 og Gmail krever), og tar meldinger fra hverandre (RFC 5322 og MIME) så et vedlegg eller tekstkroppen kan bli en melding på en kanal.

Kun det en innbundet strøm trenger: velg en postkasse, finn ubeskjedne e-post, hent hele, så flytt, merk eller slett den. Standardbibliotek kun; TLS er crypto/tls.

Source: github.com/biodream-llc/perfuse/internal/mailbox

26.61 mapper

Pakken mapper foreslår felttilordninger mellom systemer med konfidenspoeng.

Dette er en regelbasert intelligent tilordningsmotor. Ingen LLM, ingen nettanrop, ingen eksterne avhengigheter. Den kjører offline i samme binær og sender aldri pasientdata noen sted.

Motoren kombinerer flere signaler - fuzzy strengematching på feltnavn, helseidentifikator mønstergjenkjenning, kode systemoppføring og historisk akseptdata - til ett enkelt konfidenspoeng per forslag. Når konfidensen er under en konfigurerbar terskel, avstår mapperen fra å gjette feil, fordi en feil tilordning i helsevesenet kan sende data til feil felt og det er en pasientsikkerhetsfeil.

Avstasjon er hoveddesignbeslutningen. Et system som alltid produserer et svar trener brukerne til å slutte å sjekke, og den ene gangen det er feil, legger ingen merke til det før en laboratorie-resultat havner i en notatfelt. Et system som sier "Jeg vet ikke" tvinger en menneskelig beslutning nettopp når mennesket er nødvendig.

Source: github.com/biodream-llc/perfuse/internal/mapper

26.62 måle

Pakken måle vurderer FHIR Mål (digitale kvalitetsmål) hvis befolkningskriterier er FHIRPath, og skriver resultatet som en FHIR Melding: sammenfatning, individuell eller subjektliste, med stratifiseringer og en proporsjonspoeng.

Hver kriterium vurderes en gang per pasient, med fokus på en Bundle av pasientens journal (deres kompartment) og disse variablene: %subject (Pasienten), %periodStart og %periodEnd (målingsperioden, som DateTimes) og %"Målingsperiode" (samme som en Periode). Kriterier i CQL avvises med grunn: Perfuse har ingen CQL-motor.

Source: github.com/biodream-llc/perfuse/internal/measure

26.63 metrikker

Pakken metrikker samler hva motoren gjør og holder nok historikk til å tegne det.

En grensesnittsmotor overvåkes, ikke bare kjørt. Når en avdeling sier at resultater sluttet å ankomme for tyve minutter siden, er spørsmålet hva som endret seg for tyve minutter siden, og det kan ikke besvares av nåværende tellere alene. Så dette holder serier i stedet for totaler, i minne, med en fast oppløsning.

Tre beslutninger former det.

Latens holdes som en histogram i stedet for en gjennomsnitt. En gjennomsnittlig leveringstid er nesten ubrukelig i dette domenet: tallet som betyr noe er om de sakteste få prosentene av meldinger er så langsomme at de bryter en omgangstid, og en gjennomsnitt skjuler nettopp det. Bucketer er eksponentielle og faste ved byggetid, så å registrere en varighet er en sammenligning og en økning uten allokering.

Serier er begrensede ringbuffer, størrelse når samleren lages. Ingen vokser uten begrensning, fordi en grensesnittsmotor kjører i måneder om gangen og et metrikksystem som trenger omstart er verre enn ingen.

Kardinalitet er kapslet. En labelverdi hentet fra meldingsdata - en sendende applikasjon, for eksempel - kan ta tusenvis av verdier hvis noen miskonfigurerer en strøm, og ubegrensede labeler er standardmåten overvåking tar ned det det overvåker. Forbi kapselen, verdier kollapser til en "annen" bucket og kapselen rapporteres selv.

Source: github.com/biodream-llc/perfuse/internal/metrics

26.64 mirth

Java-analyse for importerte Mirth-kanaler.

Hvorfor dette eksisterer

Mirth kjører Rhino på JVM, så en Mirth-skript kan ringe til noen Java på classpath, inkludert Mirths egne serverklasser. Perfuse kjører goja og har ingen Java-runtime. Den avviser disse anropene med en feil som navngir klassen - men den avvisningen skjer når skriptet kjøres, som for en kilde-connector betyr når den første virkelige meldingen ankommer.

Så en migrering brukte å gå: importen lykkes stille, kanalen deployes, og den første meldingen fra ledningen feiler. En migrering som ser ren ut og bryter på første trafikk er verre enn en som avviser ved døren, fordi personen som gjorde det allerede har fortalt kollegene sine at det fungerte.

Dette finner disse funksjonskallene ved importtid og sier hva som skal gjøres med hver enkelt.

Hvorfor fire uttalelser og ikke to

"Bruker Java" er ett stykke informasjon og det feilaktige, fordi Java en ekte Mirth-kanal bruker faller inn i grupper med helt forskjellige mengder arbeid koblet til. Omtrent halvparten av hva steder faktisk skriver er SimpleDateFormat og HashMap, som JavaScript håndterer nativt. Noen av det er Mirths dokumenterte skript-API, som Perfuse allerede implementerer under samme navn. En liten del ønsker å starte og stoppe kanaler, som Perfuse kan gjøre over sin REST-API, men ikke eksponerer til skript. Og noen av det er en leverandør-jar som aldri kommer til å kjøre her.

Rapportering av disse som ett tall sier ingenting til en migrator om hvorvidt deres ettermiddag eller deres kvartal er på spill.

Source: github.com/biodream-llc/perfuse/internal/mirth

26.65 mirthlive

Pakken mirthlive finner kjørende Mirth-familie-motorer som interoperabilitetstestene snakker til.

Mirth Connect sluttet å være åpen kildekode ved 4.6 (mars 2025). Stedene som forlater det går til en av tre steder: Mirth 4.5.2, den siste åpne utgaven, som de fortsetter å kjøre; Open Integration Engine, Eclipse-værten fork; eller BridgeLink, Innovars fork, som nummerer sine utgaver etter år (26.9.0). En kanal Perfuse eksporterer må lastes inn i alle disse, og en kanal noen av dem eksporterer må importeres her, så hver live-test kjøres en gang per motor som svarer.

Motorene finnes ved å spørre, ikke konfigureres: ./scripts/interop-up.sh starter dem på faste porter, og en motor som ikke kjører rapporteres som hoppet over i stedet for å gå stille med.

Kun tester importerer denne. Den bor utenfor en _test.go-fil fordi to pakker deler den.

Source: github.com/biodream-llc/perfuse/internal/mirth/mirthlive

26.66 mpi

Pakken mpi er en master pasient-indeks: den tar pasientopplysninger fra hvert kildesystem (hvert identifisert ved sin tildelingsmyndighet og nummer), bestemmer hvilke tilhører samme person, og gir hver person en bedriftsidentifikator (EUID).

Visse sammenstillinger kobler på egen hånd; usikre koblinger venter i en gjennomgangskø for en person å bestemme; hver kobling, frakobling, sammenslåing og avgjørelse registreres med hvem som tok den.

Sammenstilling er deterministisk først (en identifikator fra et system stedet stoler på å være unikt per person, som en nasjonal identifikator eller en bedriftsnummer) og probabilistisk ellers: Fellegi-Sunter-vekt over navn, fødselsdato, kjønn, postkode, telefon og adresse, med Jaro-Winkler for navn. Den bestemmer ingenting klinisk: den sier hvilke opptegnelser er samme person, med dens grunner, for en person å bekrefte når den ikke er sikker.

Source: github.com/biodream-llc/perfuse/internal/mpi

26.67 mqtt

Pakken mqtt er en MQTT 3.1.1-klient: koble til (med TLS, brukernavn og passord, eller et klient-sertifikat), publiser på QoS 0 eller 1, abonnere, og bekrefte hver mottatt QoS 1-melding bare en gang kalleren sier den ble håndtert.

Skrevet mot OASIS MQTT 3.1.1-standarden i stedet for importert, som Perfuses andre wire-protokoller er. 3.1.1 er versjonen hver broker snakker: Mosquitto, EMQX, HiveMQ, VerneMQ, RabbitMQs MQTT-tillegg, IBM MQs telemetrikanal, AWS IoT Core og Azure Event Grid.

Levering: en melding mottatt på QoS 1 bekreftes (PUBACK) bare når Ack kalles. En kaller som ikke kan håndtere en melding lukker forbindelsen i stedet; med en varig sesjon (CleanSession false) sender brokeren den igjen, merket som en duplikat, når klienten gjenoppretter forbindelsen. MQTT 3.1.1 har ingen negativ bekreftelse, så dette er den eneste måten å be om en melding på nytt.

Source: github.com/biodream-llc/perfuse/internal/mqtt

26.68 msgstore

Finn en lagret melding etter hva noen vet om den.

Søket en person faktisk trenger er "her er et nummer fra en telefonoppringning, vis meg hver melding om det". Før dette betød det enten en undersøkingsmatch over nyttelaster, som er grep og langsomt, eller et filteruttrykk, som krever å vite at identitet bor på PID-3 i HL7 v2 og et helt annet sted i de andre tre formatene på samme server.

Identitet trekkes ut en gang når meldingen er registrert og indekseret, så dette er en oppslag i stedet for en skanning. Kostnaden betales på registreringsstien, en gang per melding, i stedet for på hver søkning.

Source: github.com/biodream-llc/perfuse/internal/msgstore

26.69 natid

Pakken natid kjenner nasjonale pasient- og personidentifikatorer for UK og Europa: deres formater, deres kontrollsiffer, identifikasjonssystemet hver lands FHIR-retningslinjer navngir dem med, og hvor mye av en som kan vises.

Den eksisterer for pasient-indeksen. En nasjonal nummer er det sterkeste bevis to opptegnelser er en person, og også det enkleste å gjøre feil: en tast trykket to ganger gir et nummer som tilhører en annen person, og en kilde sender NHS-nummeret under et OID mens en annen sender det under sin FHIR-URL. Så hver identifikator indeksen lagrer går gjennom her: dens kontrollsiffer testes (et feilaktig kontrollsiffer brukes aldri til å koble), dens avstand fjernes, og dens system skrives på en måte.

Hva som verifiseres og hva som ikke er sagt per ordning. Algoritmene er offentlige; identifikasjonssystem-URIene er landets egne hvor en nasjonal FHIR-retningslinje navngir en (SystemVerified), og en dokumentert standard ellers, som et sted kan endre til sin nasjonale verdi under Innstillinger → Pasient-indeks. Ingenting her bestemmer noe klinisk.

Source: github.com/biodream-llc/perfuse/internal/natid

26.70 ncpdp

Skriving av et felt i en NCPDP-overføring.

Hvorfor en skriving avviser en tvetydig sti

Lesing returnerer hver verdi en sti adresserer, fordi et filter som spør om noen DUR-konflikt er en terapeutisk duplikasjon, skal se alle. En skriving kan ikke fungere på den måten. Hvis D7 adresserer produktkode for to krav i én overføring, har å sette D7 ingen enkelt betydning: å skrive begge ville endre en medikament som ingen spurte om, og å skrive den første ville stille og forlate den andre.

Så en skriving avviser en sti som adresserer mer enn ett felt, og feilen navngir den kvalifiserte formen som ville være ubestemt. Dette er samme begrunnelse som gir transformasjonsstegene ingen fjern-aksjon: hvor det ærlige svaret er at konfigurasjonen er tvetydig, å si det slår å velge ett.

Source: github.com/biodream-llc/perfuse/internal/ncpdp

26.71 oidc

Pakken oidc verifiserer OpenID Connect-identiteter.

Skrivet mot standardbiblioteket i stedet for en JWT-avhengighet. Autentisering er det eneste stedet hvor en uauditert avhengighet er minst akseptabel, signaturverifisering for algoritmene som betyr noe, er omtrent hundre linjer med crypto/rsa og crypto/ecdsa, og Perfuse har allerede nok at legge til mer trenger en grunn enn en vane.

Omfanget er bevisst smalt: verifisere at en identitetsleverandør har garantert for en person, og rapportere hva det sa om dem. Alt annet - hva de kan gjøre, hvor lenge sesjonen varer - forblir med Perfuse, fordi en identitetsleverandør vet hvem noen er og ikke hva de har lov til å gjøre i en grensesnittsmotor.

Source: github.com/biodream-llc/perfuse/internal/oidc

26.72 parity

Pakken parity sammenligner hva Perfuse produserer mot hva motoren som erstattes produserte.

Hvorfor dette eksisterer

Perfuse kan importere en Mirth-kanal og kan spore hva den ville gjøre med en melding. Ingen av disse svarene på spørsmålet noen faktisk har før de flytter en live-strøm, som er: vil dette produsere samme utgang som det som har gått i seks år?

Ingen mengde designkvalitet svarer på det. Det eneste ærlige svaret er bevis, og bevisene må komme fra den gamle motorens egen utgang på stedets egen trafikk.

Hvorfor par må leveres

Dette kan ikke nå inn i Mirth, og å påstå motsatt ville være den verste typen funksjon. Hva det tar er par: en melding som den ankom, og meldingen den gamle motoren produserte fra den. Begge er i Mirths egen meldingslagring og kan eksporteres fra dens meldingsvisning, som er en ting en administrator allerede vet hvordan å gjøre.

Denne begrensningen er uttalt i stedet for skjult. Et verktøy som hevdet å verifisere en migrering uten å se den gamle motorens utgang ville verifisere ingenting.

Hvorfor forskjeller er gruppert i stedet for listet

En kjøring over femti tusen meldinger som rapporterer fire tusen forskjeller har fortalt noen ingenting de kan handle på. Samme kjøring som rapporterer at PID-8 forskjeller i hver melding fordi den gamle motoren kartet M til Male, har fortalt dem eksakt én ting å bestemme om.

Så funn er gruppert etter felt, med en telling, et eksempel og de distinkte verdi-parene sett. Én beslutning per funn er den enheten noen kan jobbe gjennom.

Source: github.com/biodream-llc/perfuse/internal/parity

26.73 pas278

Pakken pas278 kartlegger mellom Da Vinci-prioritering og X12 278-transaksjonen.

Hvorfor dette eksisterer

CMS-0057-F krever at betalere eksponerer en FHIR-prioriterings-API fra 1. januar 2027. Den erstatter ikke X12 278, og den var aldri ment å gjøre det: en betalers utnyttelsesledelsessystem bestemmer autorisasjoner og snakker 278. Så en betaler som møter regelen oversetter FHIR til 278 og tilbake, og en leverandør som sender 278 i dag vil sende FHIR i morgen til samme betalere som fortsatt aksepterer begge.

Den oversettelsen er det som er verdt å eie. En motor som holder begge modellene og ikke kan konvertere mellom dem, lar den hardeste delen av arbeidet - og delen hvor feilene er dyre - til den som integrerer den.

Reglene denne pakken følger, uttalt i stedet for antydet

Skrivet ned for samme grunn v2fhir skriver sine egne ned: kartlegging er hvor interoperabilitetsprosjekter feiler, og feilene er stille.

Source: github.com/biodream-llc/perfuse/internal/pas278

26.74 pdf

Pakken pdf skriver enkle tekstdokumenter, kun ved hjelp av standardbiblioteket.

Mirths dokument-skriver renderer HTML til PDF, som trenger en layout-motor. Dette er ikke det samme. Dette produserer et enkelt, paginert tekst-dokument med et monospacet font, og det eksisterer fordi det faktiske kravet på nesten alle steder som bruker denne koblingen er "legg denne rapporten på en delt mappe så noen kan skrive ut den" - en utskrivbar sammenfatting, en resultatrappport, en daglig avstemming. Disse er tekst.

Å avvise funksjonen helt ville etterlate en Tier 2-migreringshindre på plass. Å trekke inn en HTML-renderingsmotor ville koste mer enn hele resten av binærfilen og bringe en CVE-strøm med det, som ville omgjøre argumentet for varebeskrivelsen. Så: tekst, ærlig beskrevet som tekst, og et sted som virkelig trenger typesatt utgang er bedre betjent av en fildestinasjon og et verktøy bygget for det.

Hvorfor skrive en PDF på alle måter i stedet for en tekstfil

Fordi mottakeren vanligvis er en person med en skriver og en Windows-delt mappe, og en .txt-fil skrevet ut fra en delt mappe mister sin paginering, marger og ofte linjeavslutninger. En PDF skriver ut det samme overalt, som er hele grunnen til at noen spurte om en.

Source: github.com/biodream-llc/perfuse/internal/pdf

26.75 pgp

Pakken pgp krypterer, signerer, dekrypterer og verifiserer OpenPGP-meldinger (RFC 9580, og RFC 4880 for eldre peers), for betalere, clearinghus og statlige etater som utveksler filer over SFTP eller e-post under PGP.

Kryptografien er github.com/ProtonMail/go-crypto, den vedlikeholdte grenen av golang.org/x/crypto/openpgp; ingenting her implementerer en primitiv. Denne pakken laster bare nøkler og bestemmer hva en melding må bære.

Source: github.com/biodream-llc/perfuse/internal/pgp

26.76 pixv3

Pakken pixv3 er HL7-versjon 3-ansiktet til pasientregisteret: IHE-pasientidentifikator og pasientdemografiprofiler som de fleste sykehus utenfor FHIR-verdenen fremdeles snakker.

Svarene kommer fra samme pasientregister som PIXm, PDQm, Patient/$match og indeks-skjermen, så en post som er matet inn i v3 blir funnet over FHIR og omvendt. Meldingene er skrevet for hånd, i skjematype-orden, på grunn av at hl7v3.Ack gir.

Source: github.com/biodream-llc/perfuse/internal/pixv3

26.77 priorauth

Pakken priorauth implementerer leverandør-siden av prior-autorisasjonsarbeidsflyten som kreves av CMS-0057. Den sender prior-autorisasjonsforespørsler til betalers FHIR-APIer, sporer svar, og konverterer mellom interne typer og FHIR-resurser.

Source: github.com/biodream-llc/perfuse/internal/priorauth

26.78 privacy

Pakken privacy besvarer en datasubjekts forespørsler under GDPR og UK GDPR: finn alt denne serveren holder om en person, gi det til dem (Artikkel 15 og 20), slett det (Artikkel 17), og behold hva en juridisk hold dekker.

Den når hver sted Perfuse holder pasientdata: meldingslagret (gjennom dens identitetsindeks), leveringskøen, FHIR-lagret (personens Pasient-resurser og alt som refererer til dem, med deres historie), lagrede prior-autorisasjonsforespørsler, og pasientindeksen, hvis lenker utvider en identifikator til alle personens numre. Hva den ikke kan nå, navngir den: sporinger sendt til en samler, revisjonsloggen (holdt, som rekorden av hvem gjorde hva), og sikkerhetskopier, som holder hva som ble slettet til de utløper - så hver sletting skrives til en regnskapsbok, som saltede hasjer av identifikatorene i stedet for identifikatorene, og kan brukes på nytt til en gjenopprettet kopi.

Den bestemmer ingenting på noen persons vegne. Om en forespørsel må innvilges, og om en unntak gjelder, er kontrollørens avgjørelse; sletting trenger en annen administrators godkjenning, og en juridisk hold nektar det åpenbart.

Source: github.com/biodream-llc/perfuse/internal/privacy

26.79 publichealth

Pakken publichealth implementerer toveiskommunikasjon av offentlig helse-rapportering: elektronisk sak-rapportering (eCR), elektronisk laboratorierapportering (ELR) og immunisering-registreringsforespørsler.

Hvert sykehus er lovmessig pålagt å rapportere visse tilstander — tuberkulose, meslinger, hepatitt, COVID-19, kjønnssykdommer, matbåren sykdom — til statlige og lokale helsemyndigheter. Rapporteringen skjer gjennom tre distinkte grensesnitt:

Pakken er toveiskommunikasjon: den rapporterer utover (ELR, eCR, VXU) og spør tilbake (VXQ/VXR). Alle operasjoner er sanntidsbasert i stedet for nattlige batch.

Trådsikkerhet: SubmissionLog er trygg for samtidig bruk. Byggerfunksjonene er rene og trygge å ringe fra en hvilken som helst gorutine.

Source: github.com/biodream-llc/perfuse/internal/publichealth

26.80 published

Pakken published holder vaktene for Perfuses importable pakker, på ett sted.

hl7 var den første pakken som ble publisert og bærer sin egen kopi av disse sjekken. fhir og pas ble publisert så en beslutningstjeneste som Vaglio leser FHIR- og PAS-forespørsler med nøyaktig den koden Perfuse bruker, i stedet for en kopi som glir: fire lesere av X12-handlingskodene i dette repository en gang var uenige, og en leste en avvisning som en godkjenning. Vaktene holdes her i stedet for å bli kopiert inn i hver pakke, av samme grunn.

Source: github.com/biodream-llc/perfuse/internal/published

26.81 queue

Pakken queue er en varig, per-destinasjons leveringskø

Uten det, mister en destinasjon som er nede i to minutter alt som sendes i løpet av disse to minuttene: nye forsøk skjer i minnet, og når de tar slutt, blir meldingen registrert som feil og slettet. Med det, blir meldingen lagret på disk og beholder sin plass til destinasjonen kommer tilbake.

To designbeslutninger former alt annet.

Rekkefølgen blir bevart per destinasjon, og det betyr at en køet destinasjon stopper å ta den raske veien. HL7 er en strøm av hendelser om de samme pasientene: en A01 innlegger, en A03 utskriver. Hvis en feil A01 havner i køen mens den neste A03 leveres direkte, ser mottaker-systemet en utskrivning for en pasient det aldri har innlagt. Så når noe havner i kø for en destinasjon, køer alt for den destinasjonen bak det til køen tømmes. Det koster gjennomstrømming under en nedtid og det er ikke valgfritt, fordi alternativet er stille klinisk nonsens. Det er også det spesifikke som går galt i andre motorer når noen slår på samtidige køtråder for å få en backlog til å tømme raskere.

En køet melding er en akseptert melding. Avsenderen blir fortalt AA, fordi byteene er på disk og fsyncet før bekreftelsen sendes ut. Å si AE ville gjøre en riktig fungerende lagre-og-videreformidle-kø se ut som en feil og invitere avsenderen til å sende på nytt det vi allerede har.

Source: github.com/biodream-llc/perfuse/internal/queue

26.82 opphold

Pakkeopphold sier hvor denne serverens data kan gå: skyregionene en nettsted tillater (EEA, Storbritannia, Sveits eller regioner navngitt en og en), og om en connectors region er en av dem.

Perfuse sjekker hva den kan vite. En AWS-connector navngir sin region (S3, SQS, SNS), og en AWS-hostnavn bærer en (sqs.eu-west-2.amazonaws.com); disse sjekkes når en kanal lagres og lastes, så en kanal ikke kan sende pasientdata til en bucket i Virginia fra en server hvis data må forbli i Frankfurt. En vanlig hostnavn (et sykehus eget system, en samarbeidspartners MLLP-lytter) sier ingenting om hvor det er, og blir ikke dømt her: posten med prosessering lister opp hver vert en kanal sender til, for kontrolleren å sjekke.

Source: github.com/biodream-llc/perfuse/internal/residency

26.83 rtpb

Pakke rtpb besvarer NCPDP Real-Time Prescription Benefit-forsøk fra en formular: hva en medisin vil koste denne medlemmen på denne apoteket, om det trenger en forhåndsgodkjenning eller en steg først, og hvilke alternativer koster mindre.

CMS-0062-P foreslår RTPB for berørte betalere fra 1. oktober 2027. XML-en er NCPDP RTPB v13 (PBv13). NCPDPs skjema er lisensiert, så elementnavn og rekkefølge følger de offentlige Surescripts RTPB-eksemplene og NCPDPs offentlige RTPB-Implementeringsanbefalinger (dekning begrensning-koder og dekning status hver kartlegger til); et svar blir ikke sjekket mot XSD her, og en nettverksgodkjenning er der det skjer.

Source: github.com/biodream-llc/perfuse/internal/rtpb

26.84 s3put

Pakke s3put skriver objekter til S3 ved å bruke bare standardbiblioteket.

Den åpenbare måten å snakke med S3 er AWS SDK, og SDK-en er enorm. Dette prosjektet selger en statisk binær med åtte direkte avhengigheter og en vareliste som passer på en skjerm - det er et reelt argument med personen som gjennomgår programvare før et sykehus installerer det, og å bytte det mot en connector ville være en dårlig handel.

Hva S3 faktisk trenger er en HTTP PUT og en signatur. Signaturversjon 4 er fullstendig spesifisert, det er deterministisk, og AWS publiserer testvektorer for det. Så det er implementert her: omtrent to hundre linjer mot crypto/hmac og net/http, uten noen ny avhengighet og ingenting å fikse når SDK-en har en rådgiver.

Hva dette med vilje ikke gjør

Ingen multipart-opplasting, ingen nye forsøk på egen hånd, ingen kredenskjede utover statiske nøkler og standardmiljøvariabler. En HL7-melding er kilobytes, så multipart løser et problem dette ikke har; motoren forsøker allerede; og en instans-rolle-kredenskjede ville bety IMDS-oppringer, caching og oppdateringslogikk, som er der en liten implementering stopper å være liten. Hvis noen trenger disse, er den ærlige svaret en fildestinasjon og en synkronisering-verktøy, ikke en halvbygget SDK.

Det fungerer med alt som snakker S3-API-en - MinIO, Ceph, Wasabi, Backblaze - fordi det bare er signert HTTP. Det er en sideeffekt verdt å ha, siden et sykehus-objektbutikk ofte ikke er AWS.

Source: github.com/biodream-llc/perfuse/internal/s3put

26.85 saml

Eksklusiv XML-kanonisering (exc-c14n) per https://www.w3.org/TR/xml-exc-c14n/

Dette er den byte-exakte kanoniske formen som en XML-signatur signerer. Å få det galt betyr at gyldige signaturer ser ut som ugyldige og - verre - en implementering som får det mest rett vil gå gjennom testing mot sine egne signaturer mens den avviser ekte IdP-svar.

Reglene som betyr for SAML: - Navneromserklæringer renderes bare hvis synlig brukt av elementet eller dets attributter. - Arvede navnerom som et element bruker, men ikke erklærer, renderes som om de var erklært på det elementet. - Attributter sorteres: navneromserklæringer først (sortert etter prefiks), så andre attributter (sortert etter utvidet navn: navnerom-URI så lokalnavn). - Tomme elementer bruker start-tag/slutt-tag, aldri selv-lukkende. - Tekstnoder utskrives uendret; CDATA erstattes av innholdet med enhets-escaping. - Prosess-instruksjoner og kommentarer utenfor dokument-elementet ekskluderes.

Source: github.com/biodream-llc/perfuse/internal/saml

26.86 scim

Pakke scim implementerer SCIM 2.0, protokollen identitetsleverandører bruker til å etablere kontoer.

Okta, Entra ID, Google Workspace og OneLogin alle snakker det. En administrator legger til noen i en gruppe i identitetsleverandøren, og innen en minutt dukker en konto opp her med riktig rolle. De fjerner dem, og kontoen forsvinner.

Avmelding er punktet

Tilordning er en praktisk løsning. Avmelding er grunnen til at dette er verdt å bygge, og det er halvdelen som går galt.

Når noen forlater en organisasjon, er identitetsleverandøren systemet som vet det først - vanligvis fordi HR avslutter dem og leverandøren drives fra HR-registreringen. Den forteller deretter alle tilkoblede applikasjoner om å deaktivere kontoen. Hvis dette kallet feiler, eller lykkes uten å faktisk fjerne tilgangen, beholder en tidligere ansatt arbeidstilgang til en klinisk integrasjonsmotor og ingen finner ut av det, fordi ingenting overvåker noe som ikke skjedde.

Så de delene av denne pakken som betyr mest er de som gjør avmelding virkelig:

Hvorfor det er en separat pakke

SCIMs former er ikke Perfuses. Den har sin egen feilformat, sin egen listeomslag, sitt eget patchspråk og sine egne meninger om attributtstore. Å holde oversettelsen på ett sted betyr at håndtererne kan være om hva som skjer med en konto, snarere enn om JSON.

Source: github.com/biodream-llc/perfuse/internal/scim

26.87 skript

Pakkeskript kjører Mirth Connect JavaScript.

Målet er at en kanals skript flyttes over uten å berøres. Dette er en kompatibilitetsøvelse, ikke en designøvelse, så formen på alt her er diktert av hva Mirth eksponerer: msg og tmp som E4X-trær, seks kart med Javas Map-metoder, $-familien av oppslagfunksjoner, logger og en håndfull utility-objekter hvis metodenavn og datoformatstrenger er Javas.

Tre beslutninger er våre snarere enn Mirths, og hver er en bevisst avvik:

Et skript kjører med en frist og avbrytes når den passerer. Mirth vil la et skript løpe for alltid, hvilket tar kanalen med det; et grensesnitt som stopper å akseptere innlegg på grunn av en skrivefeil i en transformer, er ikke akseptabelt, så det er alltid en tidsbegrensning.

Java-samarbeid avvises med en feil som navngir klassen, snarere enn å returnere undefined. Et skript som når inn i Packages.java.sql, kan ikke gjøres til å fungere her, og det nyttige resultatet er en melding som sier nettopp det på linjen der det skjer, ikke en NullPointerException tre linjer senere.

Fil- og databaseaksess er avslått med mindre en kanal slår dem på. Mirth gir begge til hvert skript som standard. En transformer som kan lese hver fil prosessen kan lese, er en rimelig ting å ønske og en urimelig standard.

Source: github.com/biodream-llc/perfuse/internal/script

26.88 innstillinger

Pakkeinnstillinger er den enkle beskrivelsen av alt om en Perfuse-server som en operatør kan endre.

Hvorfor dette eksisterer

Før denne pakken, var omtrent tretti ting kommandolinjeflagg og ingenting annet. Å endre hvor lenge meldinger ble lagret, betød å redigere en tjenestedefinisjon og restarte, hvilket på et sykehus betyr en endringsbillett - så i praksis endret ingen dem, og en standard valgt på den første ettermiddagen ble innstillingen for alltid.

Hvorfor ett register snarere enn en skjema

Den åpenbare måten å bygge en innstillings-side er å skrive skjemaet. Dette produserer to beskrivelser av hver innstilling - en i serveren som validerer den og en i grensesnittet som renderer den - og de drifter. Driften er stille: et felt serveren sluttet å akseptere, har fortsatt en kontroll, så noen setter det, ser det lagret, og det gjør ingenting.

Så en innstilling erklæres én gang, her, med alt som trengs for å både sjekke den og tegne den: hva slags verdi det er, hvilken kontroll som passer den, hvilken gruppe den tilhører, hva den betyr, og om å endre den får effekt nå. Grensesnittet ber om den beskrivelsen og renderer hva den fortelles. Å legge til en innstilling er én post i denne pakken og ingen grensesnittsarbeid i det hele tatt.

TestEverySettingIsFullyDescribed påtvinger de delene en menneske må levere, fordi en innstilling uten hjelpe-tekst er en innstilling noen gjetter på.

Hvorfor en fil snarere enn en database

Innstillinger bor i en YAML-fil grensesnittet redigerer på plass, på samme måte som kanaler og varslingregler allerede fungerer. Tre grunner, i rekkefølge av vekt: et sykehus' endringskontroll ønsker konfigurasjon som kan diffes og legges i versjonskontroll; en operatør med maskinen, men ikke applikasjonen, kan lese en fil og kan ikke lese en database; og gjenoppretting av igår's innstillinger bør ikke kreve at applikasjonen fungerer.

Hvorfor flagg bare sådde det

Filen vinner når den eksisterer, og flaggene forsyner de innledende innholdene. Alternativet - flagg alltid vinner - ville gjøre grensesnittet til en løgner, siden noe som helst som noen gang ble overført på en kommandolinje kunne redigeres og lagres og stille ignoreres.

Et flagg som er uenig med filen rapporteres ved oppstart, og navngir begge verdier, fordi ellers forblir flagget i tjenestedefinasjonen i årevis og den neste personen som leser det tror det.

Source: github.com/biodream-llc/perfuse/internal/settings

26.89 sftpconn

Pakken sftpconn åpner SFTP-tilkoblinger.

Splittet ut fra tilkoblinger fordi den interessante delen er autentisering og vertsnøkkelverifisering, og begge er identiske uavhengig av om en kanal samler inn filer eller skriver dem. To kopier ville gli fra hverandre, og den halvdelen som gli fra ville være den halvdelen som sluttet å verifisere.

Source: github.com/biodream-llc/perfuse/internal/sftpconn

26.90 skygge

Pakken shadow sammenligner en kandidatkanal mot den live kanalen.

Selv sammenligningen er den enkle delen. Hele verdien ligger i to garantier, og begge er tvunget av konstruksjon i stedet for konfigurasjon:

Noe mindre enn det og skyggemodus blir en måte å bryte produksjon mens man prøver å unngå å bryte produksjon.

Source: github.com/biodream-llc/perfuse/internal/shadow

26.91 shl

Pakken shl implementerer SMART Health Links og SMART Health Cards: QR-kodene CMS's "Kill the Clipboard" ber leverandører om å akseptere ved innmelding, og å levere tilbake med besøksrekorden.

En SMART Health Link (SMART Health Links STU 1) er shlink:/ fulgt av base64url JSON: en manifest-URL, en 256-bits nøkkel og valgfritt et utløpsdato, en etikett og flagg (P passord, L langvarig, U en enkelt fil via GET). Mottakeren poster til manifest-URLen og får tilbake filer, hver en JWE kryptert med den nøkkelen - alg dir, enc A256GCM, valgfritt DEFLATE-komprimert - som inneholder FHIR JSON, SMART Health Cards eller en SMART-tilgangstoken. Serveren som vert filene ser aldri nøkkelen: den reiser bare i lenken, som er pasientens.

En SMART Health Card (SMART Health Cards Framework 1.4) er en signert FHIR-pakke: en kompakt JWS, ES256, med en DEFLATE-komprimert nyttelast som navngir utstederen, hvis offentlige nøkkel er på <iss>/.well-known/jwks.json. Den reiser som en numerisk shc:/ QR-kode eller en .smart-health-card-fil.

Kun standardbiblioteket: crypto/aes, crypto/cipher, crypto/ecdsa og compress/flate dekker alt, og et JOSE-bibliotek ville bringe en mye større overflate for to algoritmer.

Source: github.com/biodream-llc/perfuse/internal/shl

26.92 smartauth

Pakken smartauth er en SMART App Launch-autentiseringstjeneste: den utsteder tilgangstokene som Perfuses FHIR-endepunkt aksepterer.

Skrevet mot standardbiblioteket, som intern/oidc, som verifiserer hva denne signerer. Tokenene er JWT-er signert RS256, den ene algoritmen hver SMART-klient og spesifikasjonens ID-token-regler kan stole på.

Source: github.com/biodream-llc/perfuse/internal/smartauth

26.93 snmp

Pakken snmp er en liten, kun-lesbar SNMPv2c-agent: GET, GETNEXT og GETBULK over UDP mot en tabell med verdier som calleren fyller inn, og SNMPv2-feller.

Meldinger er BER (X.690) kodet her; ingenting i det er kryptografi (v2c's fellesskapsstreng er en vanlig tekst-passord, som er hvorfor agenten bare svarer nettverkene den er fortalt å)

Source: github.com/biodream-llc/perfuse/internal/snmp

26.94 soap

Pakken soap sender SOAP-forespørsler og leser SOAP-feil, ved å bruke bare standardbiblioteket.

SOAP er en del seremoni rundt en HTTP-POST, og det er fortsatt hvordan mye sykehus-mellomvare aksepterer data - pasientadministrasjonssystemer, dokumentarkiver, regionale rekordservice, alt som er spesifisert i tiåret da dette var svaret. Mirth har en Web Service-tilkobling, så dette er en Tier 2-migreringshinder i stedet for en fin-å-ha.

Hvorfor ikke en generert klient

Den vanlige tilnærmingen er å ta en WSDL og generere Go-typer fra den. Det er det riktige svaret for en applikasjon som snakker til en kjent tjeneste, og det feil svaret her: en integrasjonsmotors destinasjon konfigureres av noen som redigerer en kanal, ikke gjenkompilert, så konvolutten må samles på kjøretid fra en mal som de kan se og endre. Det betyr også at det ikke finnes noen kodegenereringssteg og ingenting å regenerere når den fjerne enden publiserer en ny WSDL.

Hva dette med vilje ikke gjør

Ingen WSDL-parsing, ingen WS-Sikkerhet, ingen MTOM, ingen WS-Addressing. Disse er hver en egen spesifikasjon, og å påstå å støtte en av dem mens man får en detalj feil er verre enn å ikke tilby det - en signatur som nesten verifiseres er ikke å skille fra et angrep i den andre enden. WS-Sikkerhet er spesielt et område der en halvimplementering ville kunne gjøre skade.

Hva som er her: SOAP 1.1 og 1.2-omslag, en mal for innhold, SOAPAction-hodet og feiloppsporing som leser feilstrengen i stedet for å rapportere "500".

Source: github.com/biodream-llc/perfuse/internal/soap

26.95 sof

Pakken sof kjører SQL på FHIR v2 ViewDefinitions: en visning omdanner hver FHIR-ressurs av en type til rader med navngitte kolonner, ved hjelp av FHIRPath, så FHIR-data kan leses som tabeller av SQL-motorer, regneark og kvalitetsmål.

Den følger ViewDefinition's prosesseralgoritme (kolonne, velg, forEach, forEachOrNull, gjenta, unionAll, hvor, konstanter, %rowIndex, getResourceKey og getReferenceKey) og sjekkes mot de offisielle sql-on-fhir-testfikseringene.

Source: github.com/biodream-llc/perfuse/internal/sof

26.96 sqldb

Pakken sqldb åpner databaseforbindelser for databasekilden og -destinasjonen.

Driverne er registrert her og ingen andre steder, så det finnes bare ett sted som bestemmer hva Perfuse kan koble til.

Source: github.com/biodream-llc/perfuse/internal/sqldb

26.97 sqlitedb

Pakken sqlitedb åpner SQLite på måten en server trenger: en forbindelse for skriving og flere for lesing.

Grunden er en feilmodus som bare viser seg en gang en distribusjon har vært i drift en stund. SQLite i WAL-modus lar lesere kjøre sammen med en skriver, men Go's forbindelsespulje sitter over SQLite, så en pulje på en serialiserer alt uavhengig av hva databasen ville tillate. En meldingsbrowser-søk som skanner payload-kolonnen holder derfor den eneste forbindelsen, og hver ankomende melding venter bak den.

Målt på denne maskinen, tar en skriving 104µs når lagret er inaktivt og 2,6ms mens en søk skanner fire tusen meldinger: tjuefem ganger langsommere. Dette skalerer med tabellen, så ved noen hundre tusen lagrede meldinger blir en rapport til flere sekunders leveringstid, og en skriving er på bekreftelsesveien. Avsenderen ser en tidsavbrudd, sender på nytt, og noen tilbringer en morgen med å lete etter et problem i nettverket.

Å splitte puljene koster ingenting og fjerner interaksjonen: rapporter får sine egne forbindelser, og skriveren beholder en for seg selv fordi SQLite tillater bare en skriver uansett.

Source: github.com/biodream-llc/perfuse/internal/sqlitedb

26.98 steg

Declarative transformasjonssteg, for enhver meldingsformat.

Hvorfor dette er delt

Stegvokabularet - sett, kopier, klar, kart, erstatt, trim, tilfelle, hver med en beskrivelse og en valgfri betingelse - har ingenting å gjøre med noen bestemt format. Bare tre ting forskjeller mellom formatene: hvordan en sti skrives, hvordan en verdi leses, og hvordan den skrives tilbake.

Dette er samme konklusjon som filtergrammatikken nådde i internal/expr, og av samme grunn. X12 hadde en stegmotor og NCPDP trengte en; å kopiere den ville ha produsert en annen firehundre-linjers motor å holde i takt for hånd, og deretter en tredje for avgrenset. Atferden som er verdt å ha er subtil nok at en kopi ikke ville holde den - grunnen til at resultatet leses på nytt etter hver skriving, for eksempel, tok en ekte feil å oppdage.

Hva et format tilbyr

En aksessor: en stikompilerer, en betingelseskompilerer og en valgfri veto på steg det ikke kan ære. Ingenting annet.

Source: github.com/biodream-llc/perfuse/internal/steps

26.99 stomp

Pakken stomp snakker STOMP 1.2 til en meldingsformidler.

Dette er hva "JMS-støtte" må bety i et program som ikke er Java. JMS er en API heller enn en protokoll, så det finnes ingenting å implementere: hva en nettsted faktisk trenger er at Perfuse snakker med formidleren som sitter bak deres JMS-applikasjoner.

STOMP heller enn OpenWire, og begrunnelsen er verdt å nedtegne fordi det åpenbare svaret er feil. OpenWire er ActiveMQ's native protokoll og en binær serialisering av JMS-kommandoer - ukers arbeid, spesifikt for en formidlerfamilie, og udokumentert bortsett fra ved dens implementering. ActiveMQ auto-detekterer STOMP, AMQP og MQTT på samme port det betjener OpenWire på, så en tekstprotokoll når samme formidlere. STOMP dekker ActiveMQ Classic, Artemis og RabbitMQ; AMQP 1.0 ville legge til Azure Service Bus og IBM MQ, og er det fornuftige neste valget heller enn OpenWire.

Skrevet mot standardbiblioteket. En formidlerklient er ikke stedet for en avhengighet hvis feilmodi er noen andre å forklare, og rammen her er liten nok at å eie den koster mindre enn å lese deres issue-tracker.

Source: github.com/biodream-llc/perfuse/internal/stomp

26.100 lagre

Pakke lagre holder data som er genuint tilstandsfuld: brukere, sesjoner og en audit-sporing.

Kanaler er med vilje ikke her. De bor i filer, fordi det er det som gir git, diffs, kodegjennomgang og miljøfremming gratis. Å plassere kanaler i en database er beslutningen som tvinger hver enkelt av disse å kjøpes separat, og det er grunnen til at et tredjepartsprodukt eksisterer kun for å shuttle Mirth-kanaler mellom sin database og en git-repository.

Så splitningen er: konfigurasjon i filer, identitet og historikk i SQLite.

Source: github.com/biodream-llc/perfuse/internal/store

26.101 tefca

Pakke tefca implementerer delene av TEFCA-deltagelse som ikke krever en QHIN-tilkobling.

Hva er reelt

Formål-med-validering, konfigurasjonsvalidering og audit-sporingen - inkludert dens persistens, dens spørringsgrensesnitt og dens forpliktelse til å registrere mislykkede forsøk samt vellykkede. Den siste delen er ikke en teknisitet: en rekke mislykkede leveranser til en mottaker er hvordan en feilkonfigurert partner viser seg, og en rekke mislykkede spørringer for forskjellige pasienter er hvordan sondering viser seg.

Hva som ikke er

Nettverket. Det finnes ingen QHIN-transport i denne byggingen, så ingen utveksling skjer, og hver utvekslingsfunksjon nektar med ErrExchangeNotImplemented i stedet for å returnere suksess.

Denne distinksjonen ble ikke alltid tegnet, og måten det gikk galt er verdt å holde. Alle fire utvekslingsfunksjoner validerer tidligere sine inndata, gjorde ingen nettverksanrop og returnerte suksess; Levering returnerte en akseptert respons med en sporingsidentifikator bygget fra klokken. Audit-laget registrerte hver som en fullført utveksling - i loggen som finnes for å bevise hva som ble utvekslet når noen spør måneder senere. Fire tester hevdet at oppførsel og passerte.

Hva fullføring krever

Onboarding med et kvalifisert helseinformasjonsnettverk, gjensidig autentisert TLS med sertifikater utstedt gjennom denne prosessen, og enten IHE-profilene Felles Avtale startet med eller Facilitert FHIR som definert av Sequoia-prosjektets standardprosedyre, effektiv 8. mars 2026. Ingen del kan skrives spekulativt: det testes mot et reelt QHIN eller det testes ikke, og en utestet utvekslingsimplementering er samme feil som ingen implementering med et bedre forkledning.

Source: github.com/biodream-llc/perfuse/internal/tefca

26.102 leietaker

Pakke leietaker gir identitet og isolasjonsregler for flerleietaker-drift.

En HIE, en clearinghouse eller en managed service-leverandør kjører en motor på vegne av mange organisasjoner. Mirth kan ikke gjøre dette - en instans betjener en organisasjon, og en MSP ender opp med å kjøre femti JVM-er og femti databaser.

Hva en leietaker eier

Dens kanaler, som en filkatalog. Dens brukere. Dens meldinger, kø, audit-sporing og FHIR-resurser. Dens måleikker. Ingen deler annet enn prosessen, lytterportene den ble tildelt, og plattformadministratorer.

Isolasjon er strukturell, ikke husket

Den farlige feilen her er ikke en krasj. Det er leietaker A som ser leietaker B's meldinger, som er en rapporterbar brudd i stedet for en feil. En design hvor hver spørring tar en leietaker_id-parameter feiler første gang noen skriver en spørring og glemmer en, og den spørringen ser perfekt ut i gjennomgang.

Så leietakeren er ikke en parameter. Data-tilgang går gjennom en håndtering som allerede bærer den, og det finnes ingen måte å nå tabellene uten en. Glemming er ikke tilgjengelig.

Source: github.com/biodream-llc/perfuse/internal/tenant

26.103 terminologi

Pakke terminologi holder publiserte kode-systemer (LOINC, SNOMED CT, RxNorm, ICD-10-CM, CPT og lokale) for å se opp koder, og verdier-mapping-tabellene som ikke hadde, for noen å kartlegge.

Kode-systemene importeres fra filene deres forlag distribuerer. Flere er lisensiert (LOINC trenger en gratis konto, SNOMED CT en affiliate-lisens, RxNorm en UMLS-lisens, CPT en AMA-lisens), så ingen leveres med Perfuse: en administrator som har lisensen laster opp filen, og Perfuse registrerer hvem importerte den og når.

Source: github.com/biodream-llc/perfuse/internal/terminology

26.104 tlsconf

Pakken tlsconf bygger TLS-konfigurasjon fra filer og beskriver sertifikater.

Dette er den gratis ekvivalenten til en utvidelse Mirth nå tar betalt for. Det meste av verdien ligger ikke i krypteringen, som er noen få linjer, men i den delen som forhindrer at noen deployer noe de tror er sikker og ikke er: å nekte å hoppe over verifisering stille, å insistere på at en klient-sertifikat faktisk sjekkes når en blir bedt om det, og å si tydelig når et sertifikat er på vei til å utløpe.

Et utløpt sertifikat på en grensesnittsmatning er en ekte sykehusfeil, og det skjer fordi ingen ble informert. Den beskrivende delen av denne pakken eksisterer av denne grunn.

Source: github.com/biodream-llc/perfuse/internal/tlsconf

26.105 tomirth

Pakken tomirth skriver en Perfuse-kanal ut som Mirth-kanal-XML.

Hvorfor denne eksisterer. Innvendingen mot å adoptere en ny integrasjonsmotor er sjelden "er den noen god". Det er "hva hvis vi har feil og blir sittende fast", og det billigste svaret på det er å kunne gå tilbake ut. Perfuse har lest Mirth-kanaler siden begynnelsen; til nå kunne den ikke skrive en ut, noe som gjorde forsikringen ensrettet og derfor ikke så mye av en forsikring.

Hvordan den unngår fellen som gjorde det første forsøket nytteløst. Mirths XML er XStreams utdata, og XStream leser klassen og versjonsattributtene som instruksjoner: et element det ikke kjenner igjen, blir droppet uten et ord, og en kanal det ikke kan sette sammen, blir lagret med beskrivelsen erstattet av "Denne kanalen er ugyldig. Verifiser alle nødvendige utvidelser er lastet korrekt" og dens mål blir droppet. Ingen del av svaret nevner elementet som feilet. En eksportør som komponerer egenskapsblokker fra en lesing av formatet, feiler derfor på den måten som er dyrt å diagnostisere, noe som skjedde: dette repository hadde en eksportør med ni gjennomføringstester hvis utdata Mirth kastet vekk, fordi hver test sammenlignet det mot vår egen parser i stedet for en server.

Så ingen av egenskapsblokkene komponeres her. scripts/mirth-dump-connector-templates.sh har Mirths egen ObjectXMLSerializer serialisere standardverdiene for hver connector-egensklasse, og disse dokumentene er commitet under templates/. Denne pakken erstatter verdier i dem, og mirth.SetRawProperty nektar enhver sti som malen ikke allerede inneholder - så en feil er en feil som navngir stien, i øyeblikket eksporten skjer, i stedet for en kanal som forsvinner ved import.

Hva den ikke vil gjøre. En transport med ingen Mirth-ekvivalent blir nektet ved navn i stedet for å bli approksimert. En eksport som stille ble omgjort til en S3-mål til en fil-forfatter ville være verre enn ingen eksport i det hele tatt, fordi kanalen ville importere renlig og levere til feil sted.

Source: github.com/biodream-llc/perfuse/internal/tomirth

26.106 trace

Pakken trace produserer distribuerte spor for meldinger som flytter gjennom en kanal, og eksporterer dem over OTLP/HTTP med JSON-koding.

Hvorfor denne eksisterer i stedet for OpenTelemetry SDK: SDK-en pluss en OTLP-eksportør trekker inn omtrent seksti moduler og legger til like mye til binærfilen som hele resten av programmet. Hva som faktisk trengs her, er smalt - W3C-spor-kontekst-propagasjon, en spann-modell, head-sampling og en batchet HTTP-POST - og OTLP/JSON er en dokumentert stabil koding som kan produseres med standardbiblioteket alene. Samme handel som å velge lib/pq over pgx: ta det lille når bare en del av det store er ønsket.

Konsekvensen som er verdt å nevne: det finnes ingen auto-instrumentering og ingen leverandørspesifik eksportør. Spannene er de denne programmet skaper med vilje, og de går til enhver OTLP-endepunkt - en samler, Jaeger, Grafana Tempo, Honeycomb, Datadog's OTLP-inngang.

Egenskapen som betyr mer enn spannene

En melding ankommer ofte med en traceparent-header fra systemet som sendte den, og forlater mot et system som vil registrere en av sine egne. Å fortsette dette sporet i stedet for å starte et nytt er det som gjør en enkelt visning av "EHR sendte dette, motoren transformerte det, registret avviste det" mulig i det hele tatt. Grensesnittsproblemer er nesten alltid rapportert som "vi sendte det og ingenting skjedde", og det spørsmålet er uansvarlig uten en identifikator som overlever hoppet.

Sporing må aldri påvirke levering

Hver operasjon her er best-effort. Spannene droppes når bufferen er full, eksportfeil blir telt og aldri gjentatt inn i meldingsbanen, og ingen kall blokkerer på nettverket. Et droppet spann er en ubehagelighet. En melding forsinket eller tapt fordi sporing-bakenden var langsom, er en klinisk hendelse, så handelen er aldri i tvil.

Source: github.com/biodream-llc/perfuse/internal/trace

26.107 transform

Pakken transform anvender deklarative endringer på en melding.

Dette er laget som skal bære den vanlige arbeidet, med skripting holdt som en merket flukthatch. Forskjellen er ikke stilistisk. Et steg deklarert i YAML kan bli valideret før det kjøres, vist i en diff, gjennomgått av noen som ikke leser JavaScript, og rapportert på; et skript kan bare bli kjørt og håpet om. Det meste av hva Mirth-transformatorer faktisk gjør, er kjedelig - kopier et felt, padde en identifikator, kartlegge en kode gjennom en tabell, klargjøre noe som ikke skal forlate bygningen - og alt det hører hjemme her.

Hvert steg navngir målet eksplisitt og hvert steg er reversibelt i den forstand at det sier hva det gjorde, fordi den dyreste feilen i et grensesnitt er en transformasjon ingen visste skjedde.

Source: github.com/biodream-llc/perfuse/internal/transform

26.108 translate

Pakken translate konverterer en Mirth-kanal til en Perfuse-kanaldefinisjon.

perfuse explain rapporterer hva som blokkerer en migrering. Dette gjør mesteparten av migreringen, som er et annet og mye større krav, så det er med vilje konservativt om hva det vil hevde.

Tre regler former hele ting.

Ingenting blir tiet droppet. Hver del av kildekanalen blir enten oversatt, båret over uendret som et skript eller rapportert som nødvendig for en menneskelig. En oversetter som stille utelater en steg ville produsere en kanal som starter, kjører og mister data — det verste mulige resultat og grunnen til at mennesker misliker migreringverktøy.

Declarativ der det er sikkert, skript der det ikke er. En Mapper-steg som kopierer et felt blir en deklarativ steg, fordi det er lesbar og kontrollerbar. En JavaScript-steg blir et skript, fordi Perfuse kjører Mirths JavaScript uendret og om skriver det til noe som ser likt ut, er nettopp der en oversetter ville introdusere en forskjell ingen legger merke til.

Utdata er ment å leses. Den bærer kommentarer som forklarer hva som kom fra hvor, og hva som ble igjen for en person. En migrering blir gjennomgått av noen som må godkjenne den, og en uannotert vegg av YAML kan ikke gjennomgås.

Source: github.com/biodream-llc/perfuse/internal/translate

26.109 udap

Pakken udap implementerer klienthalvdelen av HL7-sikkerhet for skalerbar registrering, autentisering og autorisering — spesifikasjonen TEFCA's Facilitated FHIR-utveksling hviler på.

UDAP er en offentlig nøkkelinfrastruktur boltet på OAuth 2.0. En tillitskommunité utsteder X.509-sertifikater til sine medlemmer; et medlem beviser hvem det er ved å signere JWT-er med den private nøkkelen og vedlegge sertifikatkjeden i JWT-hodet. Det erstatter den delte klienthemmeligheten i vanlig OAuth, som ikke skalerer til tusenvis av organisasjoner som aldri har møtt hverandre.

Hvorfor denne pakken eksisterer overhodet. TEFCA-utveksling kan ikke fullstendig verifiseres uten en ekte QHIN: å melde seg inn krever onboarding og utstedte sertifikater, og kan ikke fakes. Men sikkerhetsprofilen under det er en offentlig HL7-implementeringsveileder med offentlige referanseservere, og en av dem svarer på åpen internett. Så den delen som kan verifiseres, verifiseres her, og den delen som ikke kan, avvises ved grensen i stedet for å gjettes på.

Forskjellen betyr noe på grunn av hva som skjedde med SAML i dette repository: tusen linjer med tester passerte, fem av dem spesifikt om signaturkanonisering, mens ingen ekte identitetsleverandør kunne autentisere noen. Begge halvdelene var blitt skrevet her og var enige med hverandre. Lektien tatt fra det er at en sikkerhetsimplementering ikke er verdt noe før noe noen andre har skrevet har akseptert eller avvist det.

Spesifikasjonsreferanser: - HL7 UDAP-sikkerhet STU 1: http://hl7.org/fhir/us/udap-security/STU1/ - TEFCA SOP Facilitated FHIR-implementering v2.0, effektiv 8. mars 2026

Source: github.com/biodream-llc/perfuse/internal/udap

Pakken umlink transporterer X12 278er til et utnytterstyringssystem for en betaler, og returnerer svaret, på de måtene disse systemene nås i praksis: X12 i body-en til en HTTPS-POST; CAQH COREs SOAP-omslag (Tilkoblingsregel vC2.2.0, den som de fleste betalere og CMS kjører, og vC4.0.0); CAQH COREs HTTP MIME-multipart-omslag (vC2.2.0); og batch-filer over SFTP.

Skrevet fra CAQHs offentliggjorte tilkoblingsregler (vC2.2.0 og vC4.0.0), deres XML-skjema og WSDL, og CMSs esMD X12N 278 Companion Guide. Den er ikke CORE-sertifisert: sertifisering gjøres av CAQHs autoriserte testleverandører.

De sanntidskoblingene returnerer svaret UM-systemet ga, som kan være et 278-svar eller, når det ikke kunne lese forespørselen, et 999 eller TA1: ringende leser hvilket. Batch-koblingen returnerer ErrAnswerLater så snart filen er levert, og Poll samler inn hva som kommer tilbake.

Source: github.com/biodream-llc/perfuse/internal/umlink

26.111 v2fhir

Pakken v2fhir kartlegger HL7 v2-meldinger til FHIR-resurser.

Kartlegging er der inter-operabilitetsprosjekter faktisk feiler, så reglene denne pakken følger, er uttalt i stedet for antydet:

Source: github.com/biodream-llc/perfuse/internal/v2fhir

26.112 vcs

Pakken vcs leser kanalens filhistorikk fra git.

Kanalhistorikk er en betalt utvidelse andre steder, og det er en betalt utvidelse fordi disse motorene holder kanaler i en database, så å spore endringer betyr å bygge en endringssporsystem. Perfuse holder kanaler i filer, så historikken allerede eksisterer og har gjort det siden den første commit. Denne pakken må bare lese den.

Den skaller ut til git i stedet for å innebygge en git-bibliotek. Biblioteket ville legge til en stor avhengighet til en binær som selger punkt har fire, og det ville kjøpe ingenting: en distribusjon som holder kanaler under versjonskontroll har git installert, og en som ikke får en tydelig «ikke en git-repository» i stedet for en subtilt forskjellig implementering av det samme.

Source: github.com/biodream-llc/perfuse/internal/vcs

26.113 vfs

Pakken vfs er den lille mengden filoperasjoner en polling-connector trenger.

Hvorfor et grensesnitt i stedet for fire connectorer

Perfuse samler filer fra en lokal disk, en SFTP-server, en FTP-server, en Windows-del og en WebDAV-server. Overføringen forskjeller i hver enkelt tilfelle. Alt som faktisk bestemmer om meldinger overlever, gjør ikke:

Skrives én gang per transport, ville disse reglene være subtant forskjellige fem ganger, og forskjellene ville bare dukke opp som meldinger som forsvant på ett sted. Så de skrives én gang, her, over det minste grensesnittet som støtter dem.

Hva som er med vilje ikke her

Ingen skriving, utover hva kasting trenger. Å sende filer er et annet problem med andre feilmodi - en delvis skrevet fil på den andre siden, som eksisterende sendere håndterer ved å skrive til et midlertidig navn og omdøpe. Å foldet begge retninger inn i ett grensesnitt ville gjøre hver av dem vanskeligere å forstå.

Ingen rekursjon. En avhenter som går ned i underkataloger samler arkivkatalogen den nettopp flyttet en fil inn i.

Source: github.com/biodream-llc/perfuse/internal/vfs

26.114 vpn

Pakken vpn rapporterer tilstanden på sted-til-sted-VPN-tunneler partnertrafikken kjører over - AWS Site-to-Site VPN, Azure VPN Gateway-tilkoblinger og strongSwan - og holder hver partners tilkoblingsside: beggesiders tunnelinnstillinger, og om de er enige.

En tunnel som er nede ser, fra et grensesnittsmotor, nøyaktig ut som en partner hvis motor er stoppet: tilkoblinger utløper. Å si "tunnelen er nede" isteden er forskjellen på å ringe nettverks-teamet og å ringe partneren.

Kun lese. Ingen ting her endrer en tunnel, og ingen forhåndsdelte nøkkel leses, lagres eller vises noen gang.

Source: github.com/biodream-llc/perfuse/internal/vpn

26.115 web

Pakken web betjener den bygde frontenden fra innenfor binærfilen.

Aktivene er innlemmet i stedet for å sendes sammen med, så distribusjonen forblir én fil. Det er samme grunn til at motoren unngår cgo: en operatør bør kunne kopiere en binærfil til en server og kjøre den, uten JVM, uten installer og uten aktivmappe som kommer ut av fase med den kjørte filen.

Byggeutdata er commitet så go build fungerer på et uttak uten Node installert. Bygg det igjen med make web.

Source: github.com/biodream-llc/perfuse/internal/web

26.116 webauthn

Pakken webauthn verifiserer passnøkler.

En passnøkkel er et nøkkelpar som autentifikatoren holder - Touch ID, Windows Hello, en YubiKey, en telefon - hvor den private halvdelen aldri forlater enheten. Å logge inn betyr at serveren sender en tilfeldig utfordring, autentifikatoren signerer den etter å ha kontrollert at brukeren er til stede, og serveren verifiserer signatur mot den offentlige nøkkelen den lagret under registrering.

Egenskapen som betyr noe er ikke at det er praktisk. Det er at det ikke finnes noe å fiske. En passord kan skrives inn på en overbevisende kopi av en innloggings-side; en passnøkkel-signatur er bundet til opphavet den ble laget for, så kopien får en signatur dens server ikke kan bruke. For en integrasjonsmotor som holder et sykehus' grensesnitt, er det forskjellen verdt å ha.

Hva denne implementeringen nekter å gjøre

Spesifikasjonen er tillatende på steder hvor å være tillatende er hvordan implementeringer blir ødelagt. Denne er det ikke:

Source: github.com/biodream-llc/perfuse/internal/webauthn

26.117 winservice

Pakken winservice kjører Perfuse som en Windows-tjeneste.

Denne filen er den andre halvdelen. Den eksisterer så cmd/perfuse kan ringe inn i denne pakken uten å omringe hver enkelt ringingssted med en byggetegn: underkommandoen er alltid kompilert, og på Linux eller macOS forklarer den at tjenester er en Windows-ide i stedet for å feile å eksistere.

Å nekte med en tydelig setning er bedre enn å skjule underkommandoen. Noen som følger Windows-instruksjoner på feil maskin får fortalt hva som faktisk skjer, og det samme for deres plattform.

Source: github.com/biodream-llc/perfuse/internal/winservice

26.118 x12

Lese og skrive verdier på en sti.

Hvorfor dette er separat fra Path

path.go bestemmer hva en path-uttrykkning betyr. Denne filen løser en mot en faktisk utveksling. Holdes separat fordi parsingsreglene er verdt å lese uten bytebehandling, og fordi parseren brukes av konfigurasjonsvalidereren, som ikke har noen melding å løse mot.

Hvorfor en skrivning gjør om-parsing i stedet for å redigere bytes på plass

Segment.elements er subslices av Segment.raw, og Message.segs indexerer inn i Message.raw. Redigering av en verdi på plass endrer lengden på alt etter det, så alle disse slices må justeres, og noen som ble glømt ville lese riktig til den ene meldingen hvor det ikke gjorde det.

Så en skrivning bygger om segmentet, bygger om utvekslingen og parser den igjen. Det koster en parsing per endret melding og kjøper garantien for at en Message returnert fra her er nøyaktig det samme som parsing av dens egne bytes produserer. Det finnes ingen tilstand hvor indexer og bytes er uenige, fordi den tilstanden er urepresentativ.

Source: github.com/biodream-llc/perfuse/internal/x12

26.119 x12xml

Pakken x12xml konverterer X12 (og andre avgrensede EDI) til og fra XML som Mirth Connect og Open Integration Engine skriver for det, og tilbake.

Hvorfor denne XML og ikke en av våre egne

Formålet med en XML-form av X12 er systemene som allerede bruker en av dem. En nettsted som flytter fra Mirth har mottakere bygget mot hva Mirths EDI/X12-datatype emitterer, skript som går gjennom msg['CLM']['CLM.05']['CLM.05.1'], og oppstrømsmotorer som sender X12 som denne XML. En renere form av vår egen ville tjene ingen av dem. Så denne skriver nøyaktig hva Open Integration Engine 4.6 skriver, og leser nøyaktig hva den leser, og testene sammenligner de to byte for byte mot OIEs egen serializer.

En tidligere versjon av denne pakken oppfant sin egen form (en X12Interchange-rot, elementer med navn CLM05) og sa at den matchet Mirths. Den gjorde det ikke; den hadde aldri blitt sammenlignet med Mirth, og ingenting i Perfuse brukte den.

The format

Rotten er X12Transaction når meldingen starter med en ISA-segment og EDIMessage ellers, med de tre avgrenserne som attributter (segmentDelimiter, elementDelimiter, subelementDelimiter). Hvert segment er et element med navn etter dets identifikator. Hvert dataelement er SEG.NN, nummerert fra 01 (ISA.01, CLM.05), og holder sine komponenter som SEG.NN.1, SEG.NN.2 og så videre: alltid minst SEG.NN.1 for et element med en verdi, ingen for et tomt ett.

Avgrenserne leses fra ISA når det finnes en: elementseparatoren fra posisjon 3, komponentseparatoren fra posisjon 104 og segmentterminatoren fra posisjon 105, med en linjeskift etter den teller som en del av den. Ellers er de ~ * og :. Repetisjonsseparatoren (ISA11) tolkes ikke, som er OIEs atferd også: et gjentatt element holder sin ^ inne i en verdi.

Dette er en gjenimplementering av atferden, skrevet fra å observere OIEs utdata og fra dets dokumenterte format; ingen kode fra Mirth er i det.

Source: github.com/biodream-llc/perfuse/internal/x12xml

26.120 xds

Pakken xds er IHE cross-enterprise dokument-deling: en XDS.b-dokumentregister og -lager (ITI-41 Provide and Register, ITI-18 Registry Stored Query, ITI-43 Retrieve Document Set), en XCA Responding Gateway over samme lager (ITI-38, ITI-39), og klient-siden av hver, så en kanal kan publisere et dokument til en annen organisasjons lager og konsollen kan spørre en register eller en samfunn.

Metadaten er ebXML Registry 3.0 (ebRIM), som XDS.b definerer det i IHE ITI TF-3 kapittel 4. Det er modellert her som Go-structs hvis XML-tagger bærer navnespaces, så en melding leses på samme måte uansett hvilke prefikser avsenderen valgte, og skrives navnespaces-korrekt.

Source: github.com/biodream-llc/perfuse/internal/xds

26.121 xmldsig

Pakken xmldsig implementerer XML Digital Signatures og XAdES-profilen av dem.

Hvorfor dette er skrevet i stedet for lånt

En signert klinisk dokument er en juridisk gjenstand. Det hevder at en navngitt person, på en navngitt tid, tok ansvar for en spesifikk sett med bytes. Å få det galt i begge retninger er alvorlig: en signatur som ikke kan verifiseres gjør et gyldig dokument se forfalsket ut, og en verifiserer som er for generøs aksepterer et dokument noen endret.

Kanonisering er hele problemet

XML har mange byte-sekvenser som betyr det samme. Attributtorden er ikke signifikant, navnespaces-prefikser kan omdøpes, tomme elementer kan skrives på to måter, og whitespace inni en tagg er fritt. En signatur er over bytes, så før hashing av noe må begge ender enes om nøyaktig én byte-sekvens for et gitt dokument. Den enigheten er kanonisering, og det er hvor implementeringer går galt, fordi hver feil produserer en signatur som verifiserer mot egen utgang og feiler mot alle andres.

Så denne filen er kanoniseringen, på egen hånd, med egne tester. Ingen ting om signing vises her.

Eksklusiv i stedet for inklusiv, som standard

Inklusiv kanonisering trekker inn hver navnespaces-erklæring som er i omfang, inkludert de som signerte elementet aldri bruker. Det gjør en signatur bryte når dokumentet senere er innlemmet i noe som erklærer en ubeslektet navnespace på en stamfar, som er nøyaktig hva som skjer når en CDA settes inn i en SOAP-enveloppe eller en IHE-metadata-omslag. Eksklusiv kanonisering inkluderer bare de erklæringene elementet faktisk bruker, og er hva dokument-utvekslingsprofiler spesifiserer av denne grunn.

Source: github.com/biodream-llc/perfuse/internal/xmldsig

26.122 xtree

Pakken xtree er et mutable XML-tre.

Tre svært forskjellige funksjoner må modifisere XML: HL7-transformasjoner, som Mirth modellerer som XML fordi det er det skriptene opererer på; kliniske dokumenter, som er XML på naturlig vis; og deklarative transformasjonssteg. De deler dette ett treet i stedet for at hver vokser sin egen, fordi alternativet er tre modeller som ikke er enige om hva et tomt element betyr.

Designmålet er trofasthet til E4X-semantikk, siden Mirth-skript er E4X og hele poenget med å kjøre dem uendret er at de oppfører seg på samme måte. Dette driver to beslutninger som ellers ville se merkelige ut: en node beholder en peker til sin forelder, fordi E4X eksponerer parent(), og barn er ordenet med duplikater tillatt, fordi en HL7-felt-repetisjon er bokstavelig talt et gjentatt element og skriptene indekserer i dem etter posisjon.

Source: github.com/biodream-llc/perfuse/internal/xtree

26.123 pakke pas

Pakken pas leser Da Vinci Prior Authorization Support (PAS)-forespørsler Bundles.

Det er leseren Perfuse sin egen PAS-tjener bruker, publisert så at hva som enn beslutter en forhåndsgodkjenning - en betalers regler, et utnyttelsesstyringssystem, en beslutningstjeneste som Vaglio - leser en forespørsel med samme kode, og så samme svar om hva en forespørsel inneholder. To lesere av ett meldingsformat er to meninger om det.

Den har ingen avhengigheter utenfor standardbiblioteket. En forespørsel beholdes som avkodet JSON (map[string]any) i stedet for som typede ressurser, fordi en PAS-Bundle bærer hva som helst støtteressurser leverandøren valgte å sende, og en leser som droppet hva den ikke modellerte ville skjule bevis fra beslutningen.

req, problems := pas.Les(bundle, false) hvis len(problems) > 0 { // nekt: forespørselen kan ikke besvares korrekt } for _, svc := range req.Tjenester() { // svc.Koder, svc.Element, og req.Løs for alt elementet refererer til }

Source: github.com/biodream-llc/perfuse/pas

27 Indeks over konfigurasjonsnøkler

Hver nøkkel i alfabetisk rekkefølge, med blokkene den kan opptre i. En nøkkel som opptrer i flere blokker betyr det samme i hver enkelt; hvor den ikke gjør det, er blokkene dokumentert separat og forskjellen er uttalt der.

27.1 Alle nøkler

KeyAppears in
access_key_idAWS Access, FHIR Auth, S3 Destination
accountAzure Blob Access
ackHTTP Source, SOAP Source, Source
ack_sender_idX12 Options
ack_sender_qualifierX12 Options
acknowledgeEDIFACT Options, HL7v3 Options, X12 Options
acksKafka Destination
actionSOAP Destination
addrAMQP Connection, Broker Destination, Broker Source, MQTT Connection
addressAMQP Connection, DICOM Destination, DICOM Query Source, Destination, Direct Address, TCP Dest
ae_titleDICOM Source
after_queryDatabase Source
after_readAzure Blob Source, Direct IMAP, Email Source, File Poll, GCS Source, S3 Source, SFTP Source
allowScripts
allow_clear_passwordFTP Destination
allow_unencryptedAS2 Partner, PGP Receive
allow_unsignedAS2 Partner
allowed_calling_aeDICOM Source
allowed_sendersEmail Source
amqpDestination, Source
anchors_fileDirect Address
api_versionIBMMQ Connection
appendDestination, SFTP Destination
applicationAck
armorPGP Send
arrives_asX12 Options
as2Destination, Source
attachSMTP Destination
attach_nameDirect Destination, SMTP Destination
attachment_namesEmail Source
attachmentsChannel
attemptsRetry
authFHIR Destination, PAS Destination
authoritiesMPI Destination
azure_blobDestination, Source
backoffQueue Config, Retry
base64SOAP Source
batch_sizeDatabase Source, File Poll
baudSerial Source
bccSMTP Destination
bearer_tokenCDA Destination, FHIR Destination, HTTP Destination, PAS Destination
big_endianTCP Framing
blobAzure Blob Destination
bodySMTP Destination, SOAP Destination
brokerDestination, Source
brokersKafka Destination, Kafka Source
bucketGCS Access, S3 Destination, S3 Source
bundle_scriptFHIR Destination
called_aeDICOM Destination, DICOM Query Source
calling_aeDICOM Destination, DICOM Query Source
ccSMTP Destination
cdaDestination
cert_fileAS2 Destination, AS2 Partner, AS2 Source, Direct Address
channelDestination, Shadow
check_everyContract Ref
cityECR Facility
claim_us_coreFHIR Destination
classXDS Destination
client_ca_fileDirect XDR
client_idEmail O Auth, FHIR Auth, MQTT Connection
client_secretEmail O Auth, FHIR Auth
codeXDS Code
columnDatabase Source
columnsDelimited
commentDelimited
commit_after_deliveryKafka Source
compareShadow
compressAS2 Destination
compressionKafka Destination
configELR Destination
containerAzure Blob Access
content_typeAMQP Destination, AS2 Destination, Azure Blob Destination, Broker Destination, GCS Destination, HTTP Destination, S3 Destination, XDS Destination
contractChannel
credentials_fileGCP Access
dataTypeChannel
data_bitsSerial Source
databaseDestination, Source
decrypt_withPGP Receive
default_identifier_systemFHIR Destination
delimitedChannel
delimiterDelimited, TCP Framing
deployScripts
descriptionChannel
destinationBroker Destination, Broker Source
destinationsChannel
dicomChannel, Destination, Source
dicom_querySource
dicomwebDestination, Source
dirCDA Destination, Destination, Document Destination, FTP Destination, File Poll, SFTP Destination, SFTP Source
directDestination, Source
direct_fromXDS Destination
direct_toXDS Destination
displayXDS Code
dnsDirect Destination
documentDestination
domainSMB Source
driverDatabase Destination, Database Source
dsnDatabase Destination, Database Source
duplicate_windowAS2 Source
ecrFHIR Destination
edifactChannel
elementSOAP Source
elrDestination
emailSource
emit_on_first_pollDICOM Query Source
enabledChannel, Destination, Queue Config
encrypt_toPGP Send
endpointAWS Access, Azure Blob Access, GCP Access, S3 Destination
envelopeEDIFACT Options, X12 Options
error_dirFile Poll, SFTP Source
error_folderDirect IMAP, Email Source
error_prefixAzure Blob Source, GCS Source, S3 Source
expect_replyTCP Dest
extractAttachments
facilityAck, ECR Destination
facility_idSOAP Destination
facility_typeXDS Destination
fail_on_bodyHTTP Destination
fault_is_successSOAP Destination
fault_on_nakSOAP Source
fhirDestination
fileContract Ref, Source
file_nameAS2 Destination, Destination, Document Destination, FTP Destination, PGP Send, SFTP Destination
file_rootsScripts
filterChannel, Delimited, Destination, HL7v3 Options, Scripts
flow_controlSerial Source
follow_redirectsHTTP Destination
follow_symlinksFile Source
font_sizeDocument Destination
formatDocument Destination, S3 Destination
framedAzure Blob Source, FTP Destination, File Poll, GCS Source, S3 Destination, S3 Source, SFTP Destination, SFTP Source
framingTCP Framing
fromAS2 Destination, SMTP Destination
from_beginningKafka Source
ftpDestination, Source
gcsDestination, Source
groupChannel, Kafka Source
group_bySNS Destination, SQS Destination
has_headerDelimited
headerSOAP Destination
headersBroker Destination, CDA Destination, DICO Mweb Destination, FHIR Destination, HTTP Destination, Kafka Destination, SOAP Destination, XDS Destination
heartbeatBroker Source
hl7v3Channel
hostBroker Destination, Broker Source, Direct IMAP, Email Source, FTP Destination, FTP Source, SFTP Destination, SFTP Source, SMB Source, SMTP Destination
hostnameAMQP Connection
httpDestination, Source
ibm_mqDestination, Source
idAS2 Partner, AS2 Source
id_typeMPI Destination
identifier_systemsCDA Destination, FHIR Destination
idle_timeoutDICOM Source, Source, TCP Source
ignoreShadow
imapDirect Source
includeScripts
include_trigger_eventAck
insecure_skip_host_key_checkSFTP Destination, SFTP Source
insecure_skip_verifyFTP Destination, FTP Source, SMTP Destination, Web DAV Source
intervalDICOM Query Source
javascriptDestination, Source
kafkaDestination, Source
keep_aliveTCP Dest
keep_blank_linesDelimited
keep_delimiterTCP Framing
keyAzure Blob Access, Kafka Destination, S3 Destination
key_columnDatabase Source
key_fileAS2 Destination, AS2 Source, Direct Address, SFTP Destination, SFTP Source
key_passphraseSFTP Destination, SFTP Source
known_hosts_fileSFTP Destination, SFTP Source
landscapeDocument Destination
languageScripts
ldapDirect Destination
length_bytesTCP Framing
length_includes_headerTCP Framing
levelDICOM Query Source
limitDICOM Query Source
lineECR Facility
listenAS2 Source, DICO Mweb Source, DICOM Source, Direct Source, Direct XDR, HTTP Source, SOAP Source, Source, TCP Source
loginBroker Destination, Broker Source
mailboxDirect IMAP, Email Source
matchDICOM Query Source
max_attemptsDatabase Source, Queue Config
max_backoffQueue Config, Retry
max_bytesDirect Source
max_connectionsSource, TCP Source
max_depthQueue Config
max_differencesShadow
max_file_sizeFile Poll, SFTP Source
max_message_sizeAS2 Source, Email Source, HTTP Source, Kafka Source, SOAP Source, Serial Source, Source, TCP Dest, TCP Source
max_messagesPub Sub Source, SQS Source
max_object_bytesDICO Mweb Source, DICOM Source
max_object_sizeAzure Blob Source, GCS Source, S3 Source
max_open_connsDatabase Destination
mechanismKafka SASL
methodHTTP Destination
move_toAzure Blob Source, Direct IMAP, Email Source, File Poll, GCS Source, S3 Source, SFTP Source
mpiDestination
mqttDestination, Source
nameChannel, Channel Destination, Destination, ECR Facility
ncpdpChannel
no_compressPGP Send
no_mergeMPI Destination
non_persistentIBMMQ Destination
npiECR Facility
oauthEmail Source
objectGCS Destination
on_no_documentCDA Destination
order_byPub Sub Destination
overContract Ref
overlapDICOM Query Source
paramsDatabase Destination
paritySerial Source
partner_cert_fileAS2 Destination
partnersAS2 Source
pasDestination
pass_plainPGP Receive
passcodeBroker Destination, Broker Source
passphrasePGP Receive, PGP Send
passwordAMQP Connection, AS2 Destination, DICO Mweb Destination, DICO Mweb Source, Direct Destination, Direct IMAP, Direct Source, Email Source, FTP Destination, FTP Source, HTTP Destination, IBMMQ Connection, Kafka SASL, MQTT Connection, SFTP Destination, SFTP Source, SMB Source, SMTP Destination, SOAP Destination, SOAP Source, Web DAV Source, XDS Destination
pathAS2 Source, DICO Mweb Source, HTTP Source, SOAP Source
path_styleS3 Destination, S3 Source
patient_domainXDS Destination
patient_rootDICOM Query Source
patternFile Poll, SFTP Source
payerPAS Destination
persistentBroker Destination
pgpDestination, Source
phoneECR Facility
poll_intervalAzure Blob Source, Database Source, Direct IMAP, Email Source, File Poll, GCS Source, IBMMQ Source, Java Script Source, S3 Source, SFTP Source
portDirect IMAP, Email Source, Serial Source
postal_codeECR Facility
postprocessorScripts
practice_settingXDS Destination
prefetchAMQP Source
prefixAzure Blob Source, GCS Source, S3 Source
preprocessorScripts
profileSOAP Destination, SOAP Source
projectGCP Access
protocolEmail Source
providerEmail O Auth
pubsubDestination, Source
purposeTEFCA Destination
qosMQTT Connection
queryDatabase Source
query_timeoutDatabase Source
queueDestination, IBMMQ Connection
queue_managerIBMMQ Connection
queue_urlSQS Destination, SQS Source
quiet_afterSerial Source
quoteDelimited
rawFile Poll
rctcECR Destination, ELR Destination
read_timeoutHTTP Source, SOAP Source
reassembleAttachments
receiptAS2 Destination
receipt_urlAS2 Destination
recipient_certs_dirDirect Destination
reconnectAMQP Source, Broker Source, MQTT Source, Pub Sub Source
record_lengthTCP Framing
refresh_tokenEmail O Auth
regionAWS Access, FHIR Auth, S3 Destination
reject_on_warningFHIR Destination
relaxedDelimited
reopen_afterSerial Source
replySerial Source, TCP Source
reply_textSerial Source, TCP Source
request_mdnDirect Destination
require_agreementCDA Destination
require_signaturePGP Receive
response_elementSOAP Source
response_namespaceSOAP Source
response_transformerDestination
results_toPAS Destination, TEFCA Destination
retainMQTT Destination
retain_hoursDestination, Queue Config
retryDestination
returnDICOM Query Source
rootFTP Source, File Source, SMB Source
s3Destination, Source
sampleShadow
sasAzure Blob Access
saslKafka Destination, Kafka Source
schemeXDS Code
scopeEmail O Auth, FHIR Auth
scriptChannel, Java Script Destination, Java Script Source
scriptsChannel
secret_access_keyAWS Access, FHIR Auth, S3 Destination
securityDirect IMAP, Email Source, FTP Destination, FTP Source
selectorBroker Source
sender_deviceHL7v3 Options
sender_oidHL7v3 Options
serialSource
server_side_encryptionS3 Destination
session_timeoutKafka Source
session_tokenAWS Access, FHIR Auth, S3 Destination
sftpDestination, Source
shadowChannel
shareSMB Source
sign_withPGP Send
smbSource
smtpDestination
smtp_hostDirect Destination, Direct Source
snsDestination
soapDestination, Source
sop_classesDICOM Source
sort_byFile Poll
sourceChannel, ECR Destination
source_idXDS Destination
splitDelimited, EDIFACT Options, X12 Options
sqsDestination, Source
ssn_systemMPI Destination
stable_forFile Poll, SFTP Source
start_blockTCP Framing
starttlsSMTP Destination
stateECR Facility
statementDatabase Destination
stop_bitsSerial Source
storage_classGCS Destination, S3 Destination
subjectAS2 Destination, Direct Destination, SMTP Destination, SNS Destination
subscriptionPub Sub Source
subscription_idBroker Source
success_on_undefinedJava Script Destination
success_statusHTTP Destination
suffixAzure Blob Source, GCS Source, S3 Source
tablesChannel
takeEmail Source
tcpDestination, Source
tefcaDestination
temp_suffixDestination, Document Destination, FTP Destination, SFTP Destination
templateDatabase Source, Document Destination
tenantEmail O Auth
tenant_idFHIR Auth
textDirect Destination
tierAzure Blob Destination
timeoutAMQP Connection, Broker Destination, Broker Source, DICO Mweb Destination, DICOM Destination, DICOM Query Source, Database Destination, Destination, Direct Destination, Document Destination, FTP Destination, FTP Source, IBMMQ Connection, Java Script Destination, Java Script Source, Kafka Destination, Kafka Source, MQTT Connection, S3 Destination, SFTP Destination, SFTP Source, SMB Source, SMTP Destination, SOAP Destination, Scripts, Shadow, TCP Dest, Web DAV Source, XDS Destination
timezoneFHIR Destination
titleDocument Destination
tlsAMQP Connection, AS2 Destination, AS2 Source, Broker Destination, Broker Source, DICO Mweb Destination, DICO Mweb Source, DICOM Destination, DICOM Query Source, DICOM Source, Destination, Direct IMAP, Email Source, HTTP Destination, HTTP Source, IBMMQ Connection, Kafka Destination, Kafka Source, MQTT Connection, SOAP Destination, SOAP Source, Source, TCP Dest, TCP Source, XDS Destination
tls_certDirect Source, Direct XDR
tls_keyDirect Source, Direct XDR
toAS2 Destination, Direct Destination, SMTP Destination
tokenDICO Mweb Destination, DICO Mweb Source, HTTP Source, SOAP Source, XDS Destination
token_urlEmail O Auth, FHIR Auth
topicKafka Destination, MQTT Destination, MQTT Source, Pub Sub Destination
topic_arnSNS Destination
topicsKafka Source
transfer_syntaxesDICOM Destination, DICOM Source
transformationsChannel, DICOM Options, Delimited, HL7v3 Options, NCPDP Options, Script Options, X12 Options
transformerScripts
trim_paddingTCP Framing
trim_spaceDelimited
typeDestination, FHIR Auth, Source
undeployScripts
unencryptedAS2 Destination
unsignedAS2 Destination
unsigned_receiptAS2 Destination
urlAS2 Destination, CDA Destination, DICO Mweb Destination, FHIR Destination, HTTP Destination, IBMMQ Connection, SOAP Destination, Web DAV Source, XDS Destination
userFTP Destination, FTP Source, SFTP Destination, SFTP Source, SMB Source, Web DAV Source
usernameAMQP Connection, AS2 Destination, DICO Mweb Destination, DICO Mweb Source, Direct Destination, Direct IMAP, Direct Source, Email Source, HTTP Destination, IBMMQ Connection, Kafka SASL, MQTT Connection, SMTP Destination, SOAP Destination, SOAP Source, XDS Destination
validate_before_sendFHIR Destination
verify_withPGP Receive
versionCDA Destination, FHIR Destination, SOAP Destination, SOAP Source
visibility_timeoutSQS Source
wait_secondsSQS Source
warnings_are_errorsSOAP Destination
webdavSource
whenAck
windowDICOM Query Source
writeCDA Destination
wsdlSOAP Source
x12Channel
x12_asDestination
xdmDirect Destination
xdm_source_idDirect Destination
xdrDirect Source
xdsDestination