Anvendere af NAP SDK er primært gæstesystemudviklere, derfor er denne guide målrettet disse.


Nap-typescript-sdk

Nap-typescript-sdk udstiller en række metoder og interfaces som vil blive beskrevet i følgende:

NAP interface

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.

NAPMessage

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

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

NAPEventTypeFunktionelle beskrivelse
SessionOpenStart en trusted session hvor brugerens SAMLassertion overføres
SessionCloseHvis en bruger ønskes lukkes ud. Alt state skal slettes på web-applikationen
PatientOpenDen brugervalgte patient journal.
PatientCloseDen brugervalgte patient journal lukkes.
SessionErrorHvis 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;

Utility funktioner

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.


Fhir-Value-getter

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);


Fhir-Value-Setter

import {NAPMessageNAPEventCatalogueFHIRValueSetter} 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',
},
],
},
},
],
},
}

Nap-angular-sdk

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.

Nap-react-sdk

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