UNPKG

ng-smart-on-fhir

Version:

[![SRDC](https://www.srdc.com.tr/wp-content/uploads/2014/12/srdc-wp.png)](https://srdc.com.tr/en)

1 lines 74 kB
{"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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"}