Anvendere af NAP SDK er primært gæstesystemudviklere, derfor er denne guide målrettet disse.
Nap-typescript-sdk udstiller en række metoder og interfaces som vil blive beskrevet i følgende:
En wrapper af kontekstbroen.
export interface NAP { fromHost$: Observable<NAPMessage>; toHost$: Subject<NAPMessage>; errors$: Observable<NAPError>; subscribe: (subscriber: NAPHostSubscriber) => void; unsubscribe: (subscriber: NAPHostSubscriber) => void; send: (message: NAPMessage) => void; } |
fromHost$: Beskeder af NAPMessages fra værtssystemet. Udstillet som en Observable.
toHost$: Send en NAPMessage til hosten. Denne er udstillet som et subject, som man kan skubbe beskeder til med next().
errors$: SDK fejl, udstillet som en Observable.
subscribe: Subscriber til NAPMessages fra værtsystemet. Det fungere på samme måde som med `fromHost$`, bare uden brug af observables.
unsubscribe: Unsubscribe af NAPMessages fra værtssystemet.
send: Send en NAPMessage - Det fungere på samme måde som to `toHost$`, bare uden brug af observables.
Består af følgende felter, som er meget inspireret af FHIR / FHIRcast (https://fhircast.org/specification/Feb2020Ballot/),
export interface NAPMessage {
date: string;
id: string;
event: NAPEvent;
}
Eventkataloget definerer de events der kan sendes over NAP i en given version.
Dette eventkatalog lægger sig også op af FHIR / FHIRcast, hvilket betyder at eventet har følgende struktur:
export interface NAPEvent {
type: NAPEventType;
context?: FHIR.Context[];
}
Eventkatalog version 1 | |
NAPEventType | Funktionelle beskrivelse |
---|---|
SessionOpen | Start en trusted session hvor brugerens SAMLassertion overføres |
SessionClose | Hvis en bruger ønskes lukkes ud. Alt state skal slettes på web-applikationen |
PatientOpen | Den brugervalgte patient journal. |
PatientClose | Den brugervalgte patient journal lukkes. |
SessionError | Hvis der sker en uventet fejl i gæstesystemet skal dette sendes til værtssystemet og vice versa. |
Følgende er et eksempel på at anvende eventkatalog version 1:
import { NAPEventCatalogue } from 'nap-typescript-sdk';
const sessionCloseEvent = NAPEventCatalogue.v1.SessionClose;
Nap-typescript-sdk indeholder derudover en række utility funktioner, som kan være brugbare til at hente værdier eller undgå stavefejl, når der skal laves NAPMessages.
Følgende er et eksempel på anvendelse af en mapping funktion, der henter SAMLassertion ud af en napMessage.
import { FHIRValueGetter, NAPMessage, NAPPatientInfo } from 'nap-typescript-sdk';
const sessionToken = FHIRValueGetter.getSessionValue(napMessage);
const patientData: NAPPatientInfo = FHIRValueGetter.getSessionValue(napMessage);
import {NAPMessage, NAPEventCatalogue, FHIRValueSetter} from 'nap-typescript-sdk';
import { v4 as UUID } from 'uuid';
export const napMessageSessionError: NAPMessage = {
date: new Date().toISOString(),
id: UUID(),
event: {
type: NAPEventCatalogue.v1.SessionError,
context: [
{
resource: {
resourceType: FHIRValueSetter.FHIRResourceType.Basic,
code: {
coding: [
{
code: NAPEventCatalogue.v1.SessionError,
system: FHIRValueSetter.FHIRSystem.NAP,
},
],
},
identifier: [
{
system: FHIRValueSetter.FHIRIdentifierSystem.NAPErrorMessage,
value: 'This is my error message',
},
{
system: FHIRValueSetter.FHIRIdentifierSystem.NAPErrorDescription,
value: 'This is a longer description of the error message',
},
],
},
},
],
},
}
Da nap-angular-sdk er en angular specifik wrapper af broen, som initialiseres i nap-typescript-sdk, har den en peer dependency til nap-typescript-sdk. Et eksempel for implementing af nap-angular-sdk til at få SAMLassertion kunne se således ud :
import { NapAngularService } from 'nap-angular-sdk';
import { filterEvents, NAPEventCatalogue, NAPMessage } from 'nap-typescript-sdk';
import { v4 as UUID } from 'uuid';
import { NapAngularService } from 'nap-angular-sdk';
import { filterEvents, NAPEventCatalogue, NAPMessage } from 'nap-typescript-sdk';
import { shareReplay } from 'rxjs/operators';
import { v4 as UUID } from 'uuid';
export class MyComponent {
public session$: Observable<NAPMessage | undefined> =
this.napSDK.incomming$.pipe(
filterEvents([NAPEventCatalogue.v1.SessionOpen, NAPEventCatalogue.v1.SessionClose]),
);
constructor(private napSK: NapAngularService) {
const napMsg: NAPMessage = {
date: new Date().toISOString(),
id: UUID(),
event: { type: NAPEventCatalogue.v1.SessionOpen },
};
// Ask for the SAMLassertion in host
this.napSDK.sendMessage(napMsg);
}
}
Fuld implementation af eventkataloget ses i nap-reference-web her Mangler link til kode.
Da nap-react-sdk er en react specifik wrapper af broen, som initialiseres i nap-typescript-sdk, har den en peer dependency til nap-typescript-sdket. Et eksempel for implementing af nap-react-sdk til at vise og sende beskeder kunne se således ud:
import { NapContextProvider, NAPEventType, useNap } from 'nap-react-sdk';
import React from 'react';
import { v4 as UUID } from 'uuid';
const IncommingMessageComponent: React.FC = () => {
const napContext = useNap()
const samlSession = napContext.latestIncomming.event.eventType === NAPEventCatalogue.v1.SessionOpen ? napContext.lastestIncomming as : undefined;
return <div> {JSON.stringify(samlSession)}</div>
}
const PostMessageComponent: React.FC = () => {
const napContext = useNap()
return (
<button
onClick={() => {
napContext.postMessage({
date: new Date().toString(),
id: UUID(),
event: { type: NAPEventType.SessionOpen }
})
}}
>
Send message
</button>
)
}
const App = () => {
return (
<>
<NapContextProvider>
<IncommingMessageComponent></IncommingMessageComponent>
<PostMessageComponent></PostMessageComponent>
</NapContextProvider>
</>
)
}
export default App