Formålet med dette dokument er at beskrive hvordan et udviklingsmiljø, til videreudvikling af NAP SDK, skal sættes op, kodens struktur, samt hvordan koden bygges, deployes og testes.
Dette dokument er en del af den samlede dokumentation for NAP SDK.
Dokumentet er udformet, så det i videst muligt omfang opfylder sit formål uafhængigt af de øvrige dokumenter.
Ønskes mere information omkring arkitektur og design findes dette på NAP SDK - Design og Arkitektur beskrivelse.
Ønsker mere information omkring installationsvejledning til anvender kan findes på NAP SDK - Installationsvejledning.
Ønskes mere information omkring guide til anvendelse findes dette på NAP SDK - Guide til anvendere.
Installer dependecies ved at køre `npm install --registry https://nexus.nspop.dk/nexus/repository/nsp-npm/`
Kør "npm run build" for at bygge projektet. Dette giver et output i dist/ folderen.
For at køre unit tests med Karma kør "npm run test". Det generere en coverage rapport i coverage/ mappen.
For at bygge SDK til CI køre "npm run ci:build". Jenkins filen beskriver jenkins pipelinen.
Der kan laves snapshots og release-candidates fra jenkins.
Kør "npm run lint" for linting.
For at generere dokumentation til koden, kør "npm run doc". Dokumentation ligger i docs/ mappen.
NAPMessage er meget inspireret af FHIR / FHIRcast (https://fhircast.org/specification/Feb2020Ballot/), og er udgangspunktet i NAPMessage datastrukturen og grundlaget for de events der er implementeret i eventkataloget version 1. Eventkataloget fungerer som versionering af NAP events.
Et anvenderprojekt definerer hvilken version af eventkataloget den implementerer. Dette fungerer som en kontrakt således, at et givent værtssytem ved et givent projekt kan håndtere en række events.
Skal der implementeres nye events kræver det nyt release af nap-typescript-sdk'et.
En NAP bridge er et simpelt interface med en send-funktion og en callback handle.
interface NAPHostBridge { setCallback: (handler: { handle: (message: string) => void }) => void; send: (message: string) => void; } |
Et værtssystem skal ligge en sådan bridge på window.NAP.
Et eksempel på hvordan bridgen injectes i nap-java-host:
package dk.sds.nap.integrations; import java.io.IOException; import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import dk.sds.nap.scenes.WebPane; import netscape.javascript.JSObject; public class EmbeddedJavascriptIntegration extends AbstractBaseIntegration implements Integration { private static ObjectMapper objectMapper = new ObjectMapper(); public NAPBridge bridge = new NAPBridge(); public EmbeddedJavascriptIntegration(final WebPane webPane) { webPane.addInterface("NAP", bridge); } @Override public void send(NAPEvent event) { System.out.println("napevent send: " + event.getType()); System.out.println("payload: " + event.getPayload()); final String eventRawJSONString; try { eventRawJSONString = objectMapper.writeValueAsString(event); this.bridge.bridge.call("handle", eventRawJSONString); } catch (JsonProcessingException jsonProcessingException) { System.out.println(this.getClass().getName()+ " " + jsonProcessingException); } } public class NAPBridge { private JSObject bridge; public void send(String rawEventString) { try { System.out.println(this.getClass().getName() + " send(): " + rawEventString); NAPEvent event = objectMapper.readValue(rawEventString, NAPEvent.class); notifyListeners(event); } catch (IOException ioException) { System.out.println(this.getClass().getName() + " " + ioException); } } public void setCallback(JSObject bridge) { System.out.println(this.getClass().getName() + " setCallBack(): " + bridge); this.bridge = bridge; } } } |
Når "nap-typescript-sdk" kalder "createNAP()", bruger den referencen til denne bridge. Håndtaget til sendMessage() bruges til at initialisere en toHost kanal (fra det indlejrede system til værtssystemet). Håndtaget for setCallback bruges for at opsætte en fromHost kanal (fra værtssytemet til det indlejrede system)
Der er defineret et fhir-value-getter namespace med hjælpe funktioner til mappe NAPMessages til de værdier, som egentlig er interessante.
Mapping funktioner | |
Funktionsnavn | Beskrivelse |
---|---|
getSessionValue() | Trækker SAMLassertion ud af et SessionOpenEvent |
getPationInfo() | Trækker familyName, givenName og ssNo ud af et PatientOpenEvent |
Der er defineret et fhir-value-setter namespace, som indeholder enums af typiske værdier, der skal sættes i NAPMessages.
Mapping funktioner | |
Type | Beskrivelse |
---|---|
FHIRResourceType | Resource typen for event ('Patient' | 'Basic') |
FHIRSystem | System identifier ('nap') |
FHIRIdentifierSystem | System identifier til cpr, errorMessage og errorDescription |
Indeholder 3 "projekter".
SDK'et udstiller en service, som sørger for at kalde createNAP() fra nap-typescript-sdket og dermed initialisere kontekstbroen.
Efterfølgende subscribes der på de forskellige messagestreams, og deres emits bliver håndteret i forhold til Angulars change detection zone.
Udfra dette generer den nye observables generes nye observables
|
Effekten for anvenderen bliver, at broen initialiseres som en singleton og at Angular opfanger beskeder sendt over broen og opdaterer UI på baggrund af disse værdier.
Installer dependencies ved at køre npm install --registry https://nexus.nspop.dk/nexus/repository/nsp-npm/
For at starte en web pack dev server kør "npm run start:dev". Dette vil starte test implementering på (projects/test) http://localhost:4300/.
Jenkins filen beskriver jenkins pipelinen.
Der kan laves snapshots og release-candidates fra jenkins.
Kør "npm run build" for at bygge projektet. Dette giver et output i dist/ folderen. Brug "npm run build-prod" for et produktionsbyg.
Kør `npm run lint` for linting.
For at generere dokumentation til koden, kør "npm run doc". Dokumentation ligger i docs/ mappen.
Indeholder 2 "projekter".
SDK'et sørger for at kalde createNAP() fra nap-typescript-sdket og dermed initialisere kontekstbroen.
Efterfølgende subscribes der på de forskellige messagestreams, hvor deres emits håndteres i React.state.
De forskellige subscriptions håndtag håndteres i react.useCallback
Dette pakkes ind en NAP-Context, som injectes til alle child elementer heraf.
interface Context { latestIncomming: NAPMessage | null; latestError: NAPError | null; postMessage: (message: NAPMessage) => void; subscribe: (subscriber: NAPHostSubscriber) => void; unsubscribe: (subscriber: NAPHostSubscriber) => void; } |
Installer dependecies ved at køre npm install --registry https://nexus.nspop.dk/nexus/repository/nsp-npm/
Kør "npm run build" for at bygge projektet. Dette giver et output i dist/ folderen. Brug "npm run build-prod" for et produktionsbyg.
Jenkins filen beskriver jenkins pipelinen.
Der kan laves snapshots og release-candidates fra jenkins.
Kør "npm run start" for at bygge sdk'et. Dette giver et output i dist/ folderen. Derefter navigere ind i example/ folderen og køre "npm run start". Derefter vil en dev server med live deployment af både eksempel-projektet og SDK'et køre på http://localhost:3000/.
Kør "npm run lint" for linting.
For at generere dokumentation til koden, kør "npm run doc". Dokumentation ligger i docs/ mappen.