Anvendere af NAP sdk er primært gæstesystemudviklere, derfor er denne guide målrettet disse.
Nap-typescript-sdk eksporterer 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$: Besked stream af NapMessages fra værtssystemet. Udstillet som en rxjs Observable.
toHost$: Send en NapMessage til hosten. Denne er udstillet som et rxjs subject kan skubbe beskeder til med next().
errors$: SDK error stream. Udstillet som en rxjs Observable.
subscribe: Subscriber til NAPMessages fra værtsystemet. Ækvivalent med `fromHost$` bare uden observable.
unsubscribe: Unsubscribe af NAPMessages værtssystemet.
send: Send NAPMessage - equavialent to `toHost$`, just without using 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;
}
Eventkatalog 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 mapping funktioner, 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);
Da nap-angular-sdk er en angular specifik wrapper af 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 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