ng-smart-on-fhir
Version:
[](https://srdc.com.tr/en)
1 lines • 74 kB
Source Map (JSON)
{"version":3,"file":"ng-smart-on-fhir.mjs","sources":["../../../projects/smart-on-fhir/src/lib/services/smart-auth.service.ts","../../../projects/smart-on-fhir/src/lib/services/smart-on-fhir.service.ts","../../../projects/smart-on-fhir/src/lib/components/qr-reader/qr-reader.component.ts","../../../projects/smart-on-fhir/src/lib/components/qr-reader/qr-reader.component.html","../../../projects/smart-on-fhir/src/lib/components/login/login.component.ts","../../../projects/smart-on-fhir/src/lib/components/login/login.component.html","../../../projects/smart-on-fhir/src/lib/components/launch/launch.component.ts","../../../projects/smart-on-fhir/src/lib/components/launch/launch.component.html","../../../projects/smart-on-fhir/src/lib/components/callback/callback.component.ts","../../../projects/smart-on-fhir/src/lib/components/callback/callback.component.html","../../../projects/smart-on-fhir/src/lib/pipes/camel-case-spaced.pipe.ts","../../../projects/smart-on-fhir/src/lib/services/shl.service.ts","../../../projects/smart-on-fhir/src/lib/components/shc-shl-handler/shc-shl-handler.component.ts","../../../projects/smart-on-fhir/src/lib/smart-on-fhir.module.ts","../../../projects/smart-on-fhir/src/lib/routes/guard/redirect-to-login-guard.ts","../../../projects/smart-on-fhir/src/lib/routes/smart-handler-routes.ts","../../../projects/smart-on-fhir/src/public-api.ts","../../../projects/smart-on-fhir/src/ng-smart-on-fhir.ts"],"sourcesContent":["import {Inject, Injectable} from '@angular/core';\r\nimport {LoginClientConfig} from \"../model/login-client.config\";\r\nimport {LaunchClientConfig} from \"../model/launch-client.config\";\r\nimport {SmartOnFhirConfig} from \"../model/smart-on-fhir.config\";\r\nimport Client from \"fhirclient/lib/Client\";\r\nimport * as FHIR from \"fhirclient\";\r\nimport {firstValueFrom, Subject} from \"rxjs\";\r\n\r\n/**\r\n * SMART Authentication Service\r\n * Handles authentication/authorization using the fhirclient library (or offline via SHC/SHL), and stores the state\r\n */\r\n@Injectable()\r\nexport class SmartAuthService {\r\n\r\n // selected login method\r\n private method: 'offline'|'login'|'launch' = 'offline';\r\n // selected client\r\n private selectedClient: LoginClientConfig|LaunchClientConfig|undefined = undefined;\r\n // auth enabled (not public)\r\n private enabled = true;\r\n // authenticated user\r\n private user: fhir4.Practitioner|undefined;\r\n // selected/authenticated patient\r\n private patient: fhir4.Patient|undefined;\r\n\r\n private SAVED_SESSION_KEY: string = 'SMART_APPS_SESSION';\r\n private client$ = new Subject<Client|undefined>()\r\n private clientPromise = firstValueFrom(this.client$)\r\n private LAUNCHED_URL = 'SMART_APPS_LAUNCHED_URL';\r\n\r\n constructor(@Inject('sofConfig') public config: SmartOnFhirConfig = {}) {\r\n }\r\n\r\n isLoggedIn() {\r\n return !!this.patient || ((<LoginClientConfig>this.selectedClient)?.scope?.includes('launch/patient') ? false : !!this.user);\r\n }\r\n\r\n /**\r\n * Login\r\n * @param config - selected client's config\r\n * @param patient - selected patient, if applicable\r\n */\r\n login(config: LoginClientConfig, patient?: fhir4.Patient) {\r\n this.method = 'login'\r\n this.selectedClient = config\r\n this.enabled = !config.isPublic\r\n this.patient = patient;\r\n this.saveSession()\r\n if (!config.isPublic) {\r\n FHIR.oauth2.authorize({\r\n iss: config.iss,\r\n redirectUri: config.redirectUri,\r\n clientId: config.clientId,\r\n scope: config.scope,\r\n noRedirect: true\r\n }).then(redirectUrl => {\r\n const [url, params] = (<string>redirectUrl).split('?')\r\n let queryParams = params.split('&')\r\n if (config.aud) {\r\n queryParams = queryParams.filter(param => !param.startsWith('aud='))\r\n queryParams.push('aud=' + config.aud)\r\n }\r\n if (config.promptLogin) {\r\n queryParams.push('prompt=login')\r\n }\r\n window.location.href = [url, queryParams.join('&')].join('?')\r\n }, console.error)\r\n } else if(patient) {\r\n this.client$.next(FHIR.client(config.iss))\r\n }\r\n }\r\n\r\n // get public client without authentication\r\n publicClient(iss: string) {\r\n return FHIR.client(iss);\r\n }\r\n\r\n // launch with selected issuer\r\n launch(iss: string, launch: string, clientConfig?: LaunchClientConfig) {\r\n const clientId = this.config.clientId || (this.config.clientIds && this.config.clientIds[iss])\r\n this.method = 'launch'\r\n this.selectedClient = clientConfig\r\n this.enabled = true\r\n this.saveSession({\r\n [this.LAUNCHED_URL]: window.location.href\r\n })\r\n FHIR.oauth2.authorize({\r\n clientId, iss, launch,\r\n redirectUri: this.config.redirectUrl\r\n })\r\n }\r\n\r\n // start auth flow\r\n async start(): Promise<any> {\r\n const sessionContext = this.restoreSession()\r\n if (sessionContext?.method === 'offline') {\r\n this.offline(sessionContext.patient, sessionContext.shc || [])\r\n } else if ((<LoginClientConfig>sessionContext?.selectedClient)?.isPublic) {\r\n this.client$.next(this.publicClient((<LoginClientConfig>sessionContext?.selectedClient).iss))\r\n } else {\r\n await FHIR.oauth2.ready().then(async client => {\r\n this.checkPatientInToken(client)\r\n this.user = <fhir4.Practitioner|undefined>(await client.user.read().catch(() => undefined))\r\n this.patient = await client.patient.read().catch(() => undefined)\r\n this.client$.next(client);\r\n })\r\n }\r\n return sessionContext;\r\n }\r\n\r\n // offline mode with SHCs\r\n offline(patient: fhir4.Patient, shc: string[]) {\r\n this.patient = patient;\r\n this.user = undefined;\r\n this.method = 'offline';\r\n this.selectedClient = undefined;\r\n this.client$.next(undefined)\r\n this.saveSession({shc});\r\n }\r\n\r\n // store session in the session storage\r\n saveSession(params?: Object) {\r\n sessionStorage.setItem(this.SAVED_SESSION_KEY, JSON.stringify({\r\n patient: this.patient,\r\n user: this.user,\r\n method: this.method,\r\n selectedClient: this.selectedClient,\r\n enabled: this.enabled,\r\n ...(params || {})\r\n }))\r\n }\r\n\r\n // restore session from the local storage\r\n restoreSession() {\r\n const saved = sessionStorage.getItem(this.SAVED_SESSION_KEY);\r\n if (saved) {\r\n const { patient, user, method, selectedClient, enabled, ...rest } = JSON.parse(saved);\r\n this.patient = patient;\r\n this.user = user;\r\n this.method = method;\r\n this.selectedClient = selectedClient;\r\n this.enabled = enabled;\r\n return { patient, user, method, selectedClient, enabled, ...rest };\r\n }\r\n return null;\r\n }\r\n\r\n // if the patient is not received properly from the response, but exists in the token, add it to the response\r\n private checkPatientInToken(client: Client) {\r\n const sessionId = sessionStorage['SMART_KEY'] && JSON.parse(sessionStorage['SMART_KEY'])\r\n if (sessionId && sessionStorage[sessionId]) {\r\n const session = JSON.parse(sessionStorage[sessionId])\r\n const token = session.tokenResponse?.access_token\r\n const id_token = session.tokenResponse?.id_token\r\n const parsed = JSON.parse(atob(token.split('.')[1]))\r\n let changed = false;\r\n if (!client.user?.id && id_token) {\r\n const parts = id_token.split('.')\r\n const parsedIdToken = JSON.parse(atob(parts[1]))\r\n parsedIdToken.fhirUser = 'Practitioner/' + parsedIdToken.sub;\r\n session.tokenResponse.id_token = [parts[0], btoa(JSON.stringify(parsedIdToken)), parts[2]].join('.');\r\n changed = true;\r\n }\r\n if (!client.getPatientId() && parsed.patient) {\r\n session.tokenResponse.patient = parsed.patient\r\n changed = true;\r\n }\r\n if (changed) {\r\n sessionStorage[sessionId] = JSON.stringify(session)\r\n window.location.reload()\r\n }\r\n }\r\n }\r\n\r\n getClient() {\r\n return this.clientPromise;\r\n }\r\n\r\n logout() {\r\n this.clearSession();\r\n this.getClient().then(client => {\r\n const loginClient = this.config?.loginClients?.find(lc => lc.iss === client?.state.serverUrl);\r\n if ((<any>loginClient)?.logoutUri) {\r\n window.location.href = (<any>loginClient).logoutUri\r\n } else {\r\n window.location.href = window.location.href.split('#')[0].replace(/shc$/, 'login')\r\n }\r\n }, err => window.location.reload())\r\n }\r\n\r\n private clearSession() {\r\n sessionStorage.clear()\r\n this.method = 'offline';\r\n this.patient = this.user = undefined;\r\n this.selectedClient = undefined;\r\n this.enabled = true;\r\n }\r\n\r\n async getPatient() {\r\n if (this.patient) return this.patient;\r\n await this.getClient();\r\n return this.patient;\r\n }\r\n}\r\n","import {Inject, Injectable} from '@angular/core';\r\nimport Client from \"fhirclient/lib/Client\";\r\nimport {SmartAuthService} from \"./smart-auth.service\";\r\nimport {SmartOnFhirConfig} from \"../model/smart-on-fhir.config\";\r\n\r\n/**\r\n * Authenticated FHIR client\r\n */\r\n@Injectable()\r\nexport class SmartOnFhirService {\r\n\r\n // imported local resources from SHCs\r\n private importedSHCards: { label?: string, shc: string[], bundle: fhir4.Bundle }[] = [];\r\n private _importedResources: { [rtype: string]: fhir4.Resource[] } = {};\r\n get importedResources() {\r\n return this._importedResources;\r\n }\r\n\r\n constructor(@Inject('sofConfig') public config: SmartOnFhirConfig = {}, private auth: SmartAuthService) {\r\n }\r\n\r\n getClient() {\r\n return this.auth.getClient();\r\n }\r\n\r\n private async ready<T>(callback: (client: Client) => Promise<T>): Promise<T> {\r\n const client = await this.getClient()\r\n return client ? callback(client) : Promise.reject()\r\n }\r\n\r\n getPatient() {\r\n return this.auth.getPatient()\r\n }\r\n\r\n // FHIR Search\r\n search<T>(resourceType: string, ...params: any[]): Promise<fhir4.Bundle<T>> {\r\n return this.ready<fhir4.Bundle<T>>(client => client.request({\r\n url: this.constructQueryURL(resourceType, params)\r\n }))\r\n }\r\n\r\n // FHIR Create (POST/PUT)\r\n create<T>(resource: T, id?: string): Promise<T> {\r\n return this.ready<T>(client => {\r\n if (id) {\r\n const _resource = { ...resource, id: id }\r\n return client.update<T>(<any>resource);\r\n } else {\r\n const _resource: any = {...resource};\r\n delete _resource.id;\r\n return client.create<T>(_resource);\r\n }\r\n })\r\n }\r\n\r\n // FHIR Operation\r\n operation<T>(options: {\r\n operationName: string,\r\n resourceType?: string,\r\n resourceId?: string,\r\n params?: fhir4.Parameters\r\n queryParams?: { [key: string]: string|number }[],\r\n }) {\r\n const opUrl = (options.resourceType ? options.resourceType + (options.resourceId ? '/' + options.resourceId : '') + '/' : '')\r\n + '$' + options.operationName;\r\n return this.ready<T>(client => client.request({\r\n method: 'POST',\r\n url: opUrl + (options.queryParams?.length ? this.constructQueryURL('', options.queryParams) : ''),\r\n body: JSON.stringify(options.params || {})\r\n }));\r\n }\r\n\r\n // FHIR Request\r\n request<T>(url: string): Promise<fhir4.Bundle<T>> {\r\n if (url.length >= 2048) {\r\n return this.ready<fhir4.Bundle<T>>(client => client.request({\r\n method: 'POST',\r\n url: '',\r\n body: JSON.stringify({\r\n resourceType: 'Bundle',\r\n type: 'batch',\r\n entry: [{\r\n request: {\r\n url,\r\n method: 'GET'\r\n }\r\n }]\r\n })\r\n })).then(bundle => <fhir4.Bundle<T>>bundle.entry?.at(0)?.resource);\r\n }\r\n return this.ready<fhir4.Bundle<T>>(client => client.request({\r\n url: url + (url.includes('Observation') ? '&_count=999' : '')\r\n }))\r\n }\r\n\r\n logout() {\r\n this.auth.logout()\r\n }\r\n\r\n // Construct FHIR API url from the given query\r\n private constructQueryURL(resourceType: string, params?: { [key: string]: string|number }[]) {\r\n return resourceType + '?' + (params?.map(_params =>\r\n Object.keys(_params).map(key => key + '=' + _params[key]).join('&')\r\n ).filter(_ => _).join('&') || '');\r\n }\r\n\r\n // Import data from SHC\r\n importSHCData(param: { label?: string, shc: string[], bundle: fhir4.Bundle }) {\r\n const {bundle, shc} = param;\r\n this.importedSHCards.push(param)\r\n this._importedResources = this.importedSHCards.map(shc =>\r\n shc.bundle.entry?.map(entry => entry.resource) || []).flat()\r\n .reduce((o: any, r: fhir4.Resource|undefined) => {\r\n if (!r) { return; }\r\n if (!o[r.resourceType]) { o[r.resourceType] = [] }\r\n o[r.resourceType].push(r);\r\n return o;\r\n }, {})\r\n const patient = bundle.entry?.find(entry => entry.resource?.resourceType === 'Patient')?.resource;\r\n this.auth.offline(<fhir4.Patient>patient, shc);\r\n }\r\n\r\n // Return all imported resources from SHC\r\n getAllImportedResources() {\r\n return Object.values(this.importedResources).flat();\r\n }\r\n}\r\n","import { Component, ElementRef, OnInit, ViewChild, OnDestroy } from '@angular/core';\r\nimport jsQR, {QRCode} from 'jsqr';\r\nimport {Router} from \"@angular/router\";\r\n\r\n/**\r\n * QR reader & parser component\r\n */\r\n@Component({\r\n selector: 'sof-qr-reader',\r\n templateUrl: './qr-reader.component.html',\r\n styleUrls: ['./qr-reader.component.scss']\r\n})\r\nexport class QrReaderComponent implements OnInit, OnDestroy {\r\n @ViewChild('video', { static: true }) videoElement!: ElementRef<HTMLVideoElement>;\r\n @ViewChild('canvas', { static: true }) canvasElement!: ElementRef<HTMLCanvasElement>;\r\n @ViewChild('fileCanvas', { static: true }) fileCanvasElement!: ElementRef<HTMLCanvasElement>;\r\n\r\n videoStream!: MediaStream;\r\n scanning: boolean = false;\r\n qrResult: string | null = null;\r\n error: string|undefined;\r\n\r\n constructor(private router: Router) {\r\n }\r\n\r\n ngOnInit(): void {\r\n (<any>window)['jsqr'] = jsQR;\r\n this.startCamera();\r\n }\r\n async startCamera() {\r\n try {\r\n this.videoStream = await navigator.mediaDevices.getUserMedia({ video: { facingMode: 'environment' } });\r\n const video = this.videoElement.nativeElement;\r\n video.srcObject = this.videoStream;\r\n\r\n video.onloadedmetadata = () => {\r\n video.play();\r\n this.scanning = true;\r\n this.scanQRCode();\r\n };\r\n } catch (error) {\r\n console.error('Error accessing camera:', error);\r\n }\r\n }\r\n\r\n scanQRCode() {\r\n if (!this.scanning) return;\r\n\r\n const video = this.videoElement.nativeElement;\r\n const canvas = this.canvasElement.nativeElement;\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (!ctx) return;\r\n\r\n const scan = () => {\r\n if (!this.scanning) return;\r\n\r\n // Ensure video dimensions are available\r\n if (video.videoWidth === 0 || video.videoHeight === 0) {\r\n requestAnimationFrame(scan);\r\n return;\r\n }\r\n\r\n canvas.width = video.videoWidth;\r\n canvas.height = video.videoHeight;\r\n\r\n ctx.drawImage(video, 0, 0, canvas.width, canvas.height);\r\n const imageData = ctx.getImageData(0, 0, canvas.width, canvas.height);\r\n const code = jsQR(imageData.data, imageData.width, imageData.height);\r\n\r\n if (code) {\r\n this.checkCode(code)\r\n } else {\r\n requestAnimationFrame(scan);\r\n }\r\n };\r\n\r\n scan();\r\n }\r\n\r\n scanFile(event: Event) {\r\n const input = event.target as HTMLInputElement;\r\n if (input.files && input.files[0]) {\r\n const file = input.files[0];\r\n const reader = new FileReader();\r\n\r\n reader.onload = (e) => {\r\n const img = new Image();\r\n img.src = e.target?.result as string;\r\n img.onload = () => {\r\n const canvas = this.fileCanvasElement.nativeElement;\r\n const ctx = canvas.getContext('2d');\r\n\r\n if (ctx) {\r\n canvas.width = img.width;\r\n canvas.height = img.height;\r\n ctx.drawImage(img, 0, 0, img.width, img.height);\r\n\r\n const imageData = ctx.getImageData(0, 0, img.width, img.height);\r\n const code = jsQR(imageData.data, imageData.width, imageData.height);\r\n\r\n if (code) {\r\n this.checkCode(code)\r\n } else {\r\n this.error = 'The file does not contain a valid QR.'\r\n }\r\n }\r\n };\r\n };\r\n\r\n reader.readAsDataURL(file);\r\n }\r\n }\r\n\r\n stopCamera() {\r\n if (this.videoStream) {\r\n this.videoStream.getTracks().forEach(track => track.stop());\r\n }\r\n this.scanning = false;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.stopCamera();\r\n }\r\n\r\n private checkCode(code: QRCode) {\r\n this.qrResult = code.data;\r\n if (!(this.qrResult.startsWith('shc:/') || this.qrResult.startsWith('shlink:/'))) {\r\n this.error = 'QR doesn\\' contain a SMART Health Card or Link';\r\n } else {\r\n this.router.navigate([!this.qrResult.startsWith('shc:/') ? '/shc' : '/shl'], { fragment: this.qrResult })\r\n this.stopCamera();\r\n }\r\n }\r\n}\r\n","<div class=\"scanner-container\">\r\n <h2>QR Scanner</h2>\r\n\r\n <!-- Live Camera Scanner -->\r\n <video #video class=\"qr-video\"></video>\r\n <canvas #canvas class=\"qr-canvas\"></canvas>\r\n\r\n <hr>\r\n\r\n <!-- File Upload Scanner -->\r\n <input type=\"file\" accept=\"image/*\" (change)=\"scanFile($event)\">\r\n <canvas #fileCanvas class=\"qr-file-canvas\"></canvas>\r\n\r\n @if (qrResult) {\r\n <p>Scanned QR Code: {{ qrResult }}</p>\r\n }\r\n</div>\r\n","import {Component, Inject} from '@angular/core';\r\nimport {LoginClientConfig} from \"../../model/login-client.config\";\r\nimport {SmartOnFhirConfig} from \"../../model/smart-on-fhir.config\";\r\nimport {SmartAuthService} from \"../../services/smart-auth.service\";\r\nimport {SmartOnFhirService} from \"../../services/smart-on-fhir.service\";\r\nimport {Router} from \"@angular/router\";\r\nimport Client from \"fhirclient/lib/Client\";\r\n\r\n@Component({\r\n selector: 'sof-login',\r\n templateUrl: './login.component.html',\r\n styleUrl: './login.component.scss'\r\n})\r\nexport class LoginComponent {\r\n\r\n // for Smart Health Card QR scanner\r\n scanning: boolean = false;\r\n\r\n // patient selection for public clients\r\n patientSelection: boolean = false;\r\n patientsLoading: boolean = false;\r\n selectedClient: LoginClientConfig|undefined;\r\n patients: fhir4.Patient[] = [];\r\n total: number = 0;\r\n page: number = 1;\r\n private _patientQuery: string = '';\r\n private client: Client|undefined;\r\n get patientQuery(): string { return this._patientQuery; }\r\n set patientQuery(value: string) {\r\n this._patientQuery = value;\r\n this.searchPatients();\r\n }\r\n hasPreviousPage(): boolean { return this.page > 1 }\r\n hasNextPage(): boolean { return this.page < (this.total / 10) }\r\n\r\n constructor(@Inject('sofConfig') public config: SmartOnFhirConfig, private auth: SmartAuthService,\r\n private sof: SmartOnFhirService, private router: Router) {\r\n }\r\n\r\n async login(config: LoginClientConfig) {\r\n if (config.isPublic) {\r\n this.client = this.auth.publicClient(config.iss)\r\n this.searchPatients()\r\n this.patientSelection = true;\r\n this.selectedClient = config;\r\n } else {\r\n this.auth.login(config)\r\n }\r\n }\r\n\r\n /**\r\n * Public client patient selection\r\n * @param patient\r\n */\r\n selectPatient(patient: fhir4.Patient) {\r\n if (this.selectedClient) {\r\n this.auth.login(this.selectedClient, patient)\r\n this.router.navigate(['/'])\r\n }\r\n }\r\n\r\n // public client patient search methods\r\n next() { this.page += 1; this.searchPatients(); }\r\n prev() {\r\n this.page = this.page > 1 ? this.page - 1 : 1;\r\n this.searchPatients();\r\n }\r\n async searchPatients() {\r\n this.patientsLoading = true;\r\n let query = 'Patient?_count=10&_page=' + this.page;\r\n if (this.patientQuery?.trim()) { query += '&' + this.patientQuery.trim().split(' ').map(name => 'name:contains=' + name).join('&') }\r\n const bundle = await this.client?.request<fhir4.Bundle<fhir4.Patient>>(query)\r\n if (bundle) {\r\n this.patients = <fhir4.Patient[]>bundle.entry?.map(entry => entry.resource)\r\n .filter(res => !!res) || []\r\n this.total = bundle.total || 0;\r\n if ((this.page - 1) * 10 > this.total) {\r\n this.page = 1\r\n }\r\n } else {\r\n this.patients = []\r\n this.total = 0;\r\n this.page = 1;\r\n }\r\n this.patientsLoading = false;\r\n }\r\n}\r\n","<div class=\"sof-height-100vh\">\r\n @if (config.logo || config.title) {\r\n <div class=\"logo-n-title\">\r\n @if (config.logo) {\r\n <img [src]=\"config.logo\" class=\"logo\">\r\n }\r\n @if (config.title) {\r\n <div class=\"title sof-text-light\" [style.width]=\"config.title.length / 2 + 'em'\">{{ config.title }}</div>\r\n }\r\n </div>\r\n }\r\n <div class=\"login-container sof-primary-background sof-login-background\">\r\n <div class=\"sof-shadow sof-no-border sof-card sof-width-25 sof-margin-auto\">\r\n <div class=\"sof-card-header sof-login-card-header\"><h4>Login via...</h4></div>\r\n <div class=\"sof-card-body sof-text-center sof-light-background\">\r\n @if (!scanning && !patientSelection) {\r\n <!-- <h4>Login With:</h4>-->\r\n @for (client of config?.loginClients; track $index) {\r\n @if (client.image) {\r\n <a (click)=\"login(client)\" style=\"cursor:pointer;\" class=\"sof-login-client-w-image image\">\r\n <img [src]=\"client.image\">\r\n </a>\r\n } @else {\r\n <button class=\"sof-button sof-text-bold\" [class.sof-button-light]=\"!client.background\" [class.sof-text-dark]=\"!client.color\"\r\n [ngStyle]=\"{background: client.background}\" (click)=\"login(client)\">\r\n <div class=\"text-content\" [ngStyle]=\"{color: client.color}\">{{client.label}}</div>\r\n </button>\r\n }\r\n }\r\n @for (client of config?.launchClients; track $index) {\r\n @if (client.image) {\r\n <a [href]=\"client.url\" class=\"image sof-button sof-button-light\" style=\"cursor:pointer;\">\r\n <img [src]=\"client.image\">\r\n </a>\r\n }\r\n }\r\n @for (client of config?.launchClients; track $index) {\r\n @if (!client.image) {\r\n <a class=\"sof-button sof-button-secondary sof-button-login sof-text-bold\" [href]=\"client.url\">{{client.label}}</a>\r\n }\r\n }\r\n @if (config?.shcLoginEnabled) {\r\n <!-- <span class=\"mt-5\">or</span>-->\r\n <a class=\"sof-button sof-button-secondary\" (click)=\"scanning = true\">\r\n <i class=\"sof-icon sof-icon-qr-code\"></i> SMART Health Card\r\n </a>\r\n }\r\n } @else if (scanning) {\r\n <sof-qr-reader #reader></sof-qr-reader>\r\n @if (reader.error) {\r\n <div class=\"sof-alert sof-alert-danger\">\r\n {{ reader.error }}\r\n </div>\r\n }\r\n <button class=\"sof-button sof-button-danger\" (click)=\"scanning = false\">Cancel</button>\r\n } @else if (patientSelection) {\r\n <div class=\"sof-width-100\" style=\"max-height: 50vh; overflow-y: auto\">\r\n <table class=\"sof-table\">\r\n <tbody>\r\n <tr>\r\n <td>\r\n <button class=\"sof-button sof-button-danger sof-mr-1\" (click)=\"patientSelection = false\">Cancel</button>\r\n <button class=\"sof-button sof-button-primary sof-mr-1\" [class.disabled]=\"!hasPreviousPage()\" (click)=\"prev()\"><i class=\"sof-icon sof-icon-caret-left\"></i></button>\r\n <input class=\"sof-form-control\" style=\"display: inline-block; width: auto\" placeholder=\"Search\" [(ngModel)]=\"patientQuery\">\r\n <button class=\"sof-button sof-button-primary sof-ml-1\" [class.disabled]=\"!hasNextPage()\" (click)=\"next()\"><i class=\"sof-icon sof-icon-caret-right\"></i></button>\r\n </td>\r\n </tr>\r\n @if(patientsLoading) {\r\n <tr><td>\r\n <div class=\"sof-spinner\" role=\"status\">\r\n <span class=\"sof-hidden\">Loading...</span>\r\n </div>\r\n </td></tr>\r\n } @else {\r\n @for (patient of patients; track patient.id) {\r\n <tr style=\"cursor: pointer\" (click)=\"selectPatient(patient)\"><td>{{patient.name?.at(0)?.given}} {{patient.name?.at(0)?.family}}</td></tr>\r\n }\r\n <tr><td class=\"sof-text-bold sof-text-gray\" style=\"font-size: .75em\">{{(page - 1) * patients.length}} - {{page * patients.length}}/{{total}}</td></tr>\r\n }\r\n </tbody>\r\n </table>\r\n </div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n","import {Component, Inject} from '@angular/core';\r\nimport {ActivatedRoute} from \"@angular/router\";\r\n\r\nimport {SmartOnFhirConfig} from \"../../model/smart-on-fhir.config\";\r\nimport {SmartAuthService} from \"../../services/smart-auth.service\";\r\n\r\n@Component({\r\n selector: 'sof-launch',\r\n templateUrl: './launch.component.html',\r\n styleUrl: './launch.component.css'\r\n})\r\nexport class LaunchComponent {\r\n constructor(@Inject('sofConfig') private config: SmartOnFhirConfig,private route: ActivatedRoute, private auth: SmartAuthService) {\r\n // Handle the query parameters to be used in the Smart App Launch flow\r\n this.route.queryParams.subscribe(params => {\r\n const iss = decodeURIComponent(params['iss'])\r\n const launch = params['launch']\r\n // start launch flow\r\n this.auth.launch(iss, launch)\r\n })\r\n }\r\n}\r\n","<div class=\"w-100 h-100 position-fixed bg-light\" style=\"line-height: 100vh; text-align: center\">\r\n <span class=\"spinner-border spinner-border-sm\" aria-hidden=\"true\"></span> Processing Authorization...\r\n</div>\r\n","import {Component, OnInit} from '@angular/core';\r\nimport {ActivatedRoute, Router} from \"@angular/router\";\r\nimport {SmartAuthService} from \"../../services/smart-auth.service\";\r\n\r\n@Component({\r\n selector: 'sof-callback',\r\n templateUrl: './callback.component.html',\r\n styleUrl: './callback.component.css'\r\n})\r\nexport class CallbackComponent implements OnInit {\r\n /**\r\n * Error message to display if authentication failed\r\n */\r\n error?: string;\r\n\r\n constructor(private router: Router, private route: ActivatedRoute, private auth: SmartAuthService) {\r\n }\r\n\r\n ngOnInit() {\r\n // Subscribe to route data to decide redirection URL after successful authentication\r\n this.route.data.subscribe(data => {\r\n // Call authentication service to handle code/token exchange\r\n this.auth.start().then(() => {\r\n // redirect to specified page after the token is successfully retrieved\r\n this.router.navigate([data['redirectTo']])\r\n }, (error) => {\r\n // set error message if failed\r\n this.error = error?.message || error?.toString() || 'Unknown error occurred.'\r\n })\r\n })\r\n }\r\n}\r\n","<div class=\"sof-width-100 sof-height-100 sof-light-background\" style=\"position: fixed; line-height: 100vh; text-align: center\">\r\n @if (!error) {\r\n <span class=\"sof-spinner\" style=\"vertical-align: middle\" aria-hidden=\"true\"></span> Processing Authorization...\r\n } @else {\r\n <div style=\"display: inline-block; line-height: 2em\">\r\n <i class=\"sof-text-danger sof-icon sof-icon-exclamation\" style=\"font-size: 2em\"></i>\r\n <p>{{error}}asdsadasdasd</p>\r\n </div>\r\n }\r\n</div>\r\n","import {Pipe, PipeTransform} from \"@angular/core\";\r\n\r\n@Pipe({\r\n name: 'camelCaseSpaced'\r\n})\r\nexport class CamelCaseSpacedPipe implements PipeTransform {\r\n transform(value: string): any {\r\n return value.replaceAll(/([A-Z])([A-Z])([a-z])|([a-z])([A-Z])/g, '$1$4 $2$3$5')\r\n }\r\n}\r\n","import {Injectable} from '@angular/core';\r\nimport {HttpClient} from \"@angular/common/http\";\r\nimport {firstValueFrom} from \"rxjs\";\r\nimport * as jose from 'jose';\r\nimport * as pako from 'pako';\r\n\r\n/**\r\n * SMART Health Link Service\r\n * Executes the requests, parses and validates SMART Health Links as defined in the HL7 documentations\r\n */\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class ShlService {\r\n\r\n get emptyBundle(): fhir4.Bundle {\r\n return {\r\n resourceType: 'Bundle',\r\n type: 'document',\r\n entry: []\r\n }\r\n }\r\n\r\n constructor(private http: HttpClient) {\r\n }\r\n\r\n async handleShl(shl: string) {\r\n if (shl.startsWith('shlink:/')) { shl = shl.slice('shlink:/'.length) }\r\n const metadata: { url: string, label?: string, flag?: string, key: string } = JSON.parse(atob(shl))\r\n if (!metadata.url) {\r\n throw new Error('URL is missing in SMART Health Link')\r\n }\r\n let payload;\r\n if (metadata.flag?.includes('U')) {\r\n payload = await firstValueFrom(this.http.get(metadata.url + '?recipient=' + window.location.origin))\r\n .then((data: any) => data.files.filter((file: any) => file.contentType === 'application/smart-health-card' && file.embedded).map((file: any) => file.embedded))\r\n } else {\r\n let passcode;\r\n if (metadata.flag?.includes('P')) {\r\n passcode = prompt('Enter the passcode for SMART Health Link')\r\n }\r\n payload = await firstValueFrom(this.http.post(metadata.url, {\r\n recipient: window.location.origin,\r\n passcode\r\n })).then((data: any) => data.files.filter((file: any) => file.contentType === 'application/smart-health-card' && file.embedded).map((file: any) => file.embedded))\r\n }\r\n if (!payload) { throw new Error('Cannot get SMART Health Link content.') }\r\n const shcs = await this.decryptSHLPayloadAndGetSHCs(payload, metadata.key)\r\n const bundles = await Promise.all(shcs.map(shc => this.getSingleBundle(shc)))\r\n return {\r\n label: metadata.label,\r\n shc: shcs,\r\n verified: await Promise.all(shcs.map(_shc => this.verifyShc(_shc))).then(results => results.every(value => value)),\r\n bundle: <fhir4.Bundle>Object.assign(this.emptyBundle, {\r\n entry: bundles.filter(_ => _).map(bundle => bundle.entry).reduce((arr, entries) => arr.concat(entries), [])\r\n })\r\n };\r\n }\r\n\r\n private async decryptSHLPayloadAndGetSHCs(payload: string[], key: string) {\r\n const SHCs: string[] = []\r\n for (const encrypted of payload) {\r\n const data = await jose.compactDecrypt(encrypted, jose.base64url.decode(key))\r\n SHCs.push(...JSON.parse(new TextDecoder().decode(data.plaintext)).verifiableCredential)\r\n }\r\n return SHCs;\r\n }\r\n\r\n async handleShc(shc: string) {\r\n if (shc.startsWith('shc:/')) { shc = shc.slice('shc:/'.length) }\r\n return {\r\n shc: [shc],\r\n bundle: await this.getSingleBundle(shc),\r\n verified: await this.verifyShc(shc)\r\n };\r\n }\r\n\r\n async getSingleBundle(shc: string) {\r\n return await this.parseShc(shc).then(data => data.vc.credentialSubject.fhirBundle)\r\n }\r\n\r\n private async parseShc(shc: string): Promise<any> {\r\n try {\r\n const [h, p, s] = shc.split('.').map((part) => this.base64UrlToBytes(part));\r\n return JSON.parse(this.inflate(p));\r\n } catch (error) {\r\n console.error('Error parsing SMART Health Card:', error);\r\n throw error;\r\n }\r\n }\r\n\r\n private async verifyShc(shc: string): Promise<boolean> {\r\n try {\r\n await jose.compactVerify(shc, jose.createLocalJWKSet(await this.fetchJWKs(shc)));\r\n return true;\r\n } catch (err) {\r\n return false;\r\n }\r\n }\r\n\r\n private async fetchJWKs(shc: string): Promise<jose.JSONWebKeySet> {\r\n try {\r\n const card = JSON.parse(this.inflate(this.base64UrlToBytes(shc.split('.')[1])));\r\n const issuer = card.iss;\r\n const jwksUrl = `${issuer.replace(/\\/$/, '')}/.well-known/jwks`;\r\n\r\n const jwksResponse = await firstValueFrom(this.http.get<jose.JSONWebKeySet>(jwksUrl));\r\n return jwksResponse;\r\n } catch (error) {\r\n console.error('Error fetching JWKs:', error);\r\n throw new Error('Unable to fetch JWKs for signature verification');\r\n }\r\n }\r\n\r\n private inflate(data: Uint8Array): string {\r\n try {\r\n const decompressed = pako.inflateRaw(data, { to: 'string' });\r\n return decompressed;\r\n } catch (error) {\r\n console.error('Error inflating data:', error);\r\n throw new Error('Failed to inflate data');\r\n }\r\n }\r\n\r\n private base64UrlToBytes(base64Url: string): Uint8Array {\r\n const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/');\r\n const binaryString = atob(base64);\r\n return new Uint8Array([...binaryString].map((char) => char.charCodeAt(0)));\r\n }\r\n\r\n\r\n}\r\n","import {Component, OnInit} from '@angular/core';\r\nimport {ActivatedRoute} from \"@angular/router\";\r\nimport {ShlService} from \"../../services/shl.service\";\r\nimport * as jose from 'jose';\r\nimport {SmartOnFhirService} from \"../../services/smart-on-fhir.service\";\r\nimport {SmartAuthService} from \"../../services/smart-auth.service\";\r\n\r\n/**\r\n * Component for searching and validating Smart Health Cards or Smart Health Links\r\n */\r\n@Component({\r\n selector: 'sof-shc-shl-handler',\r\n template: `\r\n <div class=\"container\">\r\n @if (invalidSignature) {\r\n <div class=\"sof-alert sof-alert-danger\">\r\n Issuer verification failed for the Smart Health Card!\r\n </div>\r\n <button class=\"sof-button sof-button-danger\" (click)=\"logout()\"><i class=\"sof-icon sof-icon-caret-left\"></i> Back</button>\r\n <button class=\"sof-button sof-button-warning sof-ml-1 sof-mt-1\" (click)=\"invalidSignature = false\"><i class=\"sof-icon sof-icon-exclamation\"></i> Ignore and Continue</button>\r\n } @else {\r\n <table class=\"sof-table\" id=\"shc-content\">\r\n <tbody>\r\n <tr>\r\n <td><b>Patient</b></td>\r\n <td>{{ patientName }}</td>\r\n </tr>\r\n <tr>\r\n <td><b>Age</b></td>\r\n <td>{{ patientAge }}</td>\r\n </tr>\r\n <tr>\r\n <td><b>Gender</b></td>\r\n <td>{{ patient?.gender }}</td>\r\n </tr>\r\n @for (resources of sof.importedResources | keyvalue; track resources.key) {\r\n <tr>\r\n <td><b>{{resources.key | camelCaseSpaced}}</b></td>\r\n <td><span class=\"sof-badge sof-primary-background sof-text-light\">{{resources.value?.length}}</span></td>\r\n </tr>\r\n }\r\n <tr>\r\n <td colspan=\"2\" class=\"text-end\">\r\n <button class=\"sof-button sof-button-primary\" routerLink=\"/\">Continue <i class=\"sof-icon sof-icon-caret-right\"></i></button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n }\r\n </div>\r\n <style>\r\n #shc-content td:first-child {\r\n width: 25em;\r\n max-width: 100%;\r\n }\r\n </style>\r\n `\r\n})\r\n\r\nexport class ShcShlHandlerComponent implements OnInit {\r\n _window = window;\r\n\r\n invalidSignature: boolean = false;\r\n\r\n patient: fhir4.Patient|undefined;\r\n\r\n get patientName() {\r\n return this.patient?.name?.map(name => (name.given?.join(' ') || '') + ' ' + name.family).join(', ')\r\n }\r\n\r\n get patientAge() {\r\n if (this.patient?.birthDate) {\r\n return Math.ceil((Date.now() - new Date(this.patient.birthDate).getTime()) / (1000 * 3600 * 24 * 365))\r\n } else {\r\n return '';\r\n }\r\n }\r\n\r\n constructor(private route: ActivatedRoute, private auth: SmartAuthService, private shl: ShlService, public sof: SmartOnFhirService) {\r\n this.auth.getPatient().then(patient => this.patient = patient);\r\n route.fragment.subscribe(async fragment => {\r\n try {\r\n if (fragment?.startsWith('shlink:/')) {\r\n this.sof.importSHCData(await this.shl.handleShl(fragment))\r\n } else if (fragment?.startsWith('shc:/')) {\r\n this.sof.importSHCData(await this.shl.handleShc(fragment))\r\n } else {\r\n console.log(fragment)\r\n }\r\n } catch (error) {\r\n if (error instanceof jose.errors.JWSSignatureVerificationFailed) {\r\n this.invalidSignature = true;\r\n }\r\n }\r\n })\r\n }\r\n\r\n ngOnInit() {\r\n }\r\n\r\n logout() {\r\n this.sof.logout();\r\n }\r\n}\r\n","import {ModuleWithProviders, NgModule} from '@angular/core';\r\nimport {SmartOnFhirService} from \"./services/smart-on-fhir.service\";\r\nimport {LoginComponent} from \"./components/login/login.component\";\r\nimport {LaunchComponent} from \"./components/launch/launch.component\";\r\nimport {CallbackComponent} from \"./components/callback/callback.component\";\r\nimport {AsyncPipe, KeyValuePipe, NgStyle} from \"@angular/common\";\r\nimport {QrReaderComponent} from \"./components/qr-reader/qr-reader.component\";\r\nimport {CamelCaseSpacedPipe} from \"./pipes/camel-case-spaced.pipe\";\r\nimport {ShcShlHandlerComponent} from \"./components/shc-shl-handler/shc-shl-handler.component\";\r\nimport {RouterModule} from \"@angular/router\";\r\nimport {SmartOnFhirConfig} from \"./model/smart-on-fhir.config\";\r\nimport {SmartAuthService} from \"./services/smart-auth.service\";\r\nimport {FormsModule} from \"@angular/forms\";\r\n\r\n@NgModule({\r\n imports: [\r\n NgStyle, KeyValuePipe, RouterModule, AsyncPipe, FormsModule\r\n ],\r\n exports: [],\r\n declarations: [LoginComponent, LaunchComponent, CallbackComponent, QrReaderComponent, CamelCaseSpacedPipe, ShcShlHandlerComponent],\r\n providers: [SmartOnFhirService, SmartAuthService],\r\n})\r\nexport class SmartOnFhirModule {\r\n static forRoot(config: SmartOnFhirConfig): ModuleWithProviders<SmartOnFhirModule> {\r\n return {\r\n ngModule: SmartOnFhirModule,\r\n providers: [SmartOnFhirService, {provide: 'sofConfig', useValue: config}, SmartAuthService]\r\n }\r\n }\r\n}\r\n","import {CanActivateFn, Router} from \"@angular/router\";\r\nimport {inject} from \"@angular/core\";\r\nimport {SmartAuthService} from \"../../services/smart-auth.service\";\r\nimport {SmartOnFhirService} from \"../../services/smart-on-fhir.service\";\r\nimport {ShlService} from \"../../services/shl.service\";\r\n\r\nexport const redirectUnauthorizedToLogin: CanActivateFn = async function (route, state) {\r\n const router = inject(Router);\r\n const auth = inject(SmartAuthService);\r\n const sof = inject(SmartOnFhirService);\r\n const shl = inject(ShlService)\r\n if (auth.isLoggedIn()) { return true; }\r\n try {\r\n const context = auth.restoreSession()\r\n if (context?.shc) {\r\n await Promise.all(context.shc.map(async (shc: string) => sof.importSHCData(await shl.handleShc(shc))))\r\n }\r\n await auth.start();\r\n return auth.isLoggedIn();\r\n } catch (err) {}\r\n if (auth.isLoggedIn()) { return true; }\r\n await router.navigate(['/login'])\r\n return false;\r\n}\r\n","import {Routes} from \"@angular/router\";\r\nimport {CallbackComponent} from \"../components/callback/callback.component\";\r\nimport {LaunchComponent} from \"../components/launch/launch.component\";\r\nimport {LoginComponent} from \"../components/login/login.component\";\r\nimport {ShcShlHandlerComponent} from \"../components/shc-shl-handler/shc-shl-handler.component\";\r\nimport {redirectUnauthorizedToLogin} from \"./guard/redirect-to-login-guard\";\r\n\r\n/**\r\n * Routes wrapper to add required components to execute Smart App Launch and Login flows\r\n * @param routes - Other application routes\r\n * @param redirectTo - Redirection after login\r\n * @param method - Allowed authentication flows: launch/client(login)/both\r\n * @param redirectToLoginIfUnauthorized - If true, adds auth guards to the application components\r\n * @param enableShc - If true, offline mode is allowed using Smart Health Cards\r\n */\r\nexport const withSmartHandlerRoutes: (routes: Routes, redirectTo: string, method: 'launch' | 'client' | 'both', redirectToLoginIfUnauthorized: boolean, enableShc?: boolean) => Routes =\r\n (routes: Routes, redirectTo: string, method: 'launch' | 'client' | 'both', redirectToLoginIfUnauthorized: boolean, enableShc?: boolean) => {\r\n const smartRoutes: Routes = [{\r\n path: 'callback',\r\n component: CallbackComponent,\r\n data: {redirectTo}\r\n }];\r\n if (method !== 'client') {\r\n smartRoutes.push({\r\n path: 'launch',\r\n component: LaunchComponent\r\n })\r\n }\r\n if (method !== 'launch') {\r\n smartRoutes.push({\r\n path: 'login',\r\n component: LoginComponent\r\n })\r\n }\r\n if (enableShc) {\r\n smartRoutes.push({\r\n path: 'shl',\r\n component: ShcShlHandlerComponent\r\n }, {\r\n path: 'shc',\r\n component: ShcShlHandlerComponent\r\n })\r\n }\r\n return [\r\n ...routes.map(route => {\r\n if (redirectToLoginIfUnauthorized) {\r\n route.canActivate = (route.canActivate || []).concat([redirectUnauthorizedToLogin]);\r\n }\r\n return route\r\n }),\r\n ...smartRoutes\r\n ]\r\n }\r\n","/*\r\n * Public API Surface of ng-smart-on-fhir\r\n */\r\n\r\nexport {LoginClientConfig} from \"./lib/model/login-client.config\";\r\nexport {LaunchClientConfig} from \"./lib/model/launch-client.config\";\r\nexport {SmartOnFhirConfig} from \"./lib/model/smart-on-fhir.config\";\r\nexport * from './lib/services/smart-on-fhir.service';\r\nexport * from './lib/services/smart-auth.service';\r\nexport * from './lib/smart-on-fhir.module';\r\nexport * from './lib/routes/smart-handler-routes';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.SmartAuthService","i2.SmartOnFhirService","i3","i6.QrReaderComponent","i2.SmartAuthService","i1","i3.ShlService","i4.SmartOnFhirService","i5","i6.CamelCaseSpacedPipe"],"mappings":"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"}